0001
0002
0003
0004
0005
0006 #include <linux/linkage.h>
0007
0008 ENTRY_CFI(memcpy)
0009 or r3,r0,r1
0010 asl_s r3,r3,30
0011 mov_s r5,r0
0012 brls.d r2,r3,.Lcopy_bytewise
0013 sub.f r3,r2,1
0014 ld_s r12,[r1,0]
0015 asr.f lp_count,r3,3
0016 bbit0.d r3,2,.Lnox4
0017 bmsk_s r2,r2,1
0018 st.ab r12,[r5,4]
0019 ld.a r12,[r1,4]
0020 .Lnox4:
0021 lppnz .Lendloop
0022 ld_s r3,[r1,4]
0023 st.ab r12,[r5,4]
0024 ld.a r12,[r1,8]
0025 st.ab r3,[r5,4]
0026 .Lendloop:
0027 breq r2,0,.Last_store
0028 ld r3,[r5,0]
0029 #ifdef __LITTLE_ENDIAN__
0030 add3 r2,-1,r2
0031 ; uses long immediate
0032 xor_s r12,r12,r3
0033 bmsk r12,r12,r2
0034 xor_s r12,r12,r3
0035 #else
0036 sub3 r2,31,r2
0037 ; uses long immediate
0038 xor_s r3,r3,r12
0039 bmsk r3,r3,r2
0040 xor_s r12,r12,r3
0041 #endif
0042 .Last_store:
0043 j_s.d [blink]
0044 st r12,[r5,0]
0045
0046 .balign 4
0047 .Lcopy_bytewise:
0048 jcs [blink]
0049 ldb_s r12,[r1,0]
0050 lsr.f lp_count,r3
0051 bhs_s .Lnox1
0052 stb.ab r12,[r5,1]
0053 ldb.a r12,[r1,1]
0054 .Lnox1:
0055 lppnz .Lendbloop
0056 ldb_s r3,[r1,1]
0057 stb.ab r12,[r5,1]
0058 ldb.a r12,[r1,2]
0059 stb.ab r3,[r5,1]
0060 .Lendbloop:
0061 j_s.d [blink]
0062 stb r12,[r5,0]
0063 END_CFI(memcpy)