^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) ENTRY_CFI(strlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) or r3,r0,7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ld r2,[r3,-7]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) ld.a r6,[r3,-3]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) mov r4,0x01010101
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ; uses long immediate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifdef __LITTLE_ENDIAN__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) asl_s r1,r0,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) btst_s r0,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) asl r7,r4,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ror r5,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) sub r1,r2,r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) bic_s r1,r1,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) mov.eq r7,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) sub r12,r6,r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) bic r12,r12,r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) or.eq r12,r12,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) and r12,r12,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) brne r12,0,.Learly_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #else /* BIG ENDIAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ror r5,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) btst_s r0,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) mov_s r1,31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) sub3 r7,r1,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) sub r1,r2,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) bic_s r1,r1,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) bmsk r1,r1,r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) sub r12,r6,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bic r12,r12,r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) bmsk.ne r12,r12,r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) or.eq r12,r12,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) and r12,r12,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) brne r12,0,.Learly_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #endif /* ENDIAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .Loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ld_s r2,[r3,4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ld.a r6,[r3,8]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ; stall for load result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) sub r1,r2,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) bic_s r1,r1,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) sub r12,r6,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bic r12,r12,r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) or r12,r12,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) and r12,r12,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) breq r12,0,.Loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .Lend:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) and.f r1,r1,r5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) sub.ne r3,r3,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) mov.eq r1,r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #ifdef __LITTLE_ENDIAN__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) sub_s r2,r1,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) bic_s r2,r2,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) norm r1,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sub_s r0,r0,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) lsr_s r1,r1,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) sub r0,r3,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) j_s.d [blink]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) sub r0,r0,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #else /* BIG ENDIAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) lsr_s r1,r1,7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) mov.eq r2,r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) bic_s r1,r1,r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) norm r1,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) sub r0,r3,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) lsr_s r1,r1,3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) j_s.d [blink]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) add r0,r0,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #endif /* ENDIAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .Learly_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) b.d .Lend
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) sub_s.ne r1,r1,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) END_CFI(strlen)