12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
- #include <linux/linkage.h>
- ENTRY_CFI(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]
- END_CFI(memcpy)
|