/* | |
* 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] |