forked from rrcarlosr/Jetpack
64 lines
1.2 KiB
ArmAsm
64 lines
1.2 KiB
ArmAsm
/*
|
|
* Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
.global memcpy
|
|
.align 4
|
|
memcpy:
|
|
or %r3, %r0, %r1
|
|
asl_s %r3, %r3, 30
|
|
mov_s %r5, %r0
|
|
brls.d %r2, %r3, .Lcopy_bytewise
|
|
sub.f %r3, %r2, 1
|
|
ld_s %r12, [%r1, 0]
|
|
asr.f %lp_count, %r3, 3
|
|
bbit0.d %r3, 2, .Lnox4
|
|
bmsk_s %r2, %r2, 1
|
|
st.ab %r12, [%r5, 4]
|
|
ld.a %r12, [%r1, 4]
|
|
.Lnox4:
|
|
lppnz .Lendloop
|
|
ld_s %r3, [%r1, 4]
|
|
st.ab %r12, [%r5, 4]
|
|
ld.a %r12, [%r1, 8]
|
|
st.ab %r3, [%r5, 4]
|
|
.Lendloop:
|
|
breq %r2, 0, .Last_store
|
|
ld %r3, [%r5, 0]
|
|
#ifdef __LITTLE_ENDIAN__
|
|
add3 %r2, -1, %r2
|
|
/* uses long immediate */
|
|
xor_s %r12, %r12, %r3
|
|
bmsk %r12, %r12, %r2
|
|
xor_s %r12, %r12, %r3
|
|
#else /* __BIG_ENDIAN__ */
|
|
sub3 %r2, 31, %r2
|
|
/* uses long immediate */
|
|
xor_s %r3, %r3, %r12
|
|
bmsk %r3, %r3, %r2
|
|
xor_s %r12, %r12, %r3
|
|
#endif /* _ENDIAN__ */
|
|
.Last_store:
|
|
j_s.d [%blink]
|
|
st %r12, [%r5, 0]
|
|
|
|
.balign 4
|
|
.Lcopy_bytewise:
|
|
jcs [%blink]
|
|
ldb_s %r12, [%r1, 0]
|
|
lsr.f %lp_count, %r3
|
|
bhs_s .Lnox1
|
|
stb.ab %r12, [%r5, 1]
|
|
ldb.a %r12, [%r1, 1]
|
|
.Lnox1:
|
|
lppnz .Lendbloop
|
|
ldb_s %r3, [%r1, 1]
|
|
stb.ab %r12, [%r5, 1]
|
|
ldb.a %r12, [%r1, 2]
|
|
stb.ab %r3, [%r5, 1]
|
|
.Lendbloop:
|
|
j_s.d [%blink]
|
|
stb %r12, [%r5, 0]
|