0001
0002
0003
0004
0005
0006 #include <linux/linkage.h>
0007
0008 ENTRY_CFI(strlen)
0009 or r3,r0,7
0010 ld r2,[r3,-7]
0011 ld.a r6,[r3,-3]
0012 mov r4,0x01010101
0013 ; uses long immediate
0014 #ifdef __LITTLE_ENDIAN__
0015 asl_s r1,r0,3
0016 btst_s r0,2
0017 asl r7,r4,r1
0018 ror r5,r4
0019 sub r1,r2,r7
0020 bic_s r1,r1,r2
0021 mov.eq r7,r4
0022 sub r12,r6,r7
0023 bic r12,r12,r6
0024 or.eq r12,r12,r1
0025 and r12,r12,r5
0026 brne r12,0,.Learly_end
0027 #else
0028 ror r5,r4
0029 btst_s r0,2
0030 mov_s r1,31
0031 sub3 r7,r1,r0
0032 sub r1,r2,r4
0033 bic_s r1,r1,r2
0034 bmsk r1,r1,r7
0035 sub r12,r6,r4
0036 bic r12,r12,r6
0037 bmsk.ne r12,r12,r7
0038 or.eq r12,r12,r1
0039 and r12,r12,r5
0040 brne r12,0,.Learly_end
0041 #endif
0042
0043 .Loop:
0044 ld_s r2,[r3,4]
0045 ld.a r6,[r3,8]
0046 ; stall for load result
0047 sub r1,r2,r4
0048 bic_s r1,r1,r2
0049 sub r12,r6,r4
0050 bic r12,r12,r6
0051 or r12,r12,r1
0052 and r12,r12,r5
0053 breq r12,0,.Loop
0054 .Lend:
0055 and.f r1,r1,r5
0056 sub.ne r3,r3,4
0057 mov.eq r1,r12
0058 #ifdef __LITTLE_ENDIAN__
0059 sub_s r2,r1,1
0060 bic_s r2,r2,r1
0061 norm r1,r2
0062 sub_s r0,r0,3
0063 lsr_s r1,r1,3
0064 sub r0,r3,r0
0065 j_s.d [blink]
0066 sub r0,r0,r1
0067 #else
0068 lsr_s r1,r1,7
0069 mov.eq r2,r6
0070 bic_s r1,r1,r2
0071 norm r1,r1
0072 sub r0,r3,r0
0073 lsr_s r1,r1,3
0074 j_s.d [blink]
0075 add r0,r0,r1
0076 #endif
0077 .Learly_end:
0078 b.d .Lend
0079 sub_s.ne r1,r1,r1
0080 END_CFI(strlen)