b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) |
| 4 | */ |
| 5 | |
| 6 | #include <linux/linkage.h> |
| 7 | |
| 8 | ENTRY_CFI(memcpy) |
| 9 | or r3,r0,r1 |
| 10 | asl_s r3,r3,30 |
| 11 | mov_s r5,r0 |
| 12 | brls.d r2,r3,.Lcopy_bytewise |
| 13 | sub.f r3,r2,1 |
| 14 | ld_s r12,[r1,0] |
| 15 | asr.f lp_count,r3,3 |
| 16 | bbit0.d r3,2,.Lnox4 |
| 17 | bmsk_s r2,r2,1 |
| 18 | st.ab r12,[r5,4] |
| 19 | ld.a r12,[r1,4] |
| 20 | .Lnox4: |
| 21 | lppnz .Lendloop |
| 22 | ld_s r3,[r1,4] |
| 23 | st.ab r12,[r5,4] |
| 24 | ld.a r12,[r1,8] |
| 25 | st.ab r3,[r5,4] |
| 26 | .Lendloop: |
| 27 | breq r2,0,.Last_store |
| 28 | ld r3,[r5,0] |
| 29 | #ifdef __LITTLE_ENDIAN__ |
| 30 | add3 r2,-1,r2 |
| 31 | ; uses long immediate |
| 32 | xor_s r12,r12,r3 |
| 33 | bmsk r12,r12,r2 |
| 34 | xor_s r12,r12,r3 |
| 35 | #else /* BIG ENDIAN */ |
| 36 | sub3 r2,31,r2 |
| 37 | ; uses long immediate |
| 38 | xor_s r3,r3,r12 |
| 39 | bmsk r3,r3,r2 |
| 40 | xor_s r12,r12,r3 |
| 41 | #endif /* ENDIAN */ |
| 42 | .Last_store: |
| 43 | j_s.d [blink] |
| 44 | st r12,[r5,0] |
| 45 | |
| 46 | .balign 4 |
| 47 | .Lcopy_bytewise: |
| 48 | jcs [blink] |
| 49 | ldb_s r12,[r1,0] |
| 50 | lsr.f lp_count,r3 |
| 51 | bhs_s .Lnox1 |
| 52 | stb.ab r12,[r5,1] |
| 53 | ldb.a r12,[r1,1] |
| 54 | .Lnox1: |
| 55 | lppnz .Lendbloop |
| 56 | ldb_s r3,[r1,1] |
| 57 | stb.ab r12,[r5,1] |
| 58 | ldb.a r12,[r1,2] |
| 59 | stb.ab r3,[r5,1] |
| 60 | .Lendbloop: |
| 61 | j_s.d [blink] |
| 62 | stb r12,[r5,0] |
| 63 | END_CFI(memcpy) |