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