^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "sysdep.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ENTRY(strlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /* Check if the start addr is aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) mov r3, r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) andi r1, r0, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) movi r2, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) movi r0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) bnez r1, .L_start_not_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) LABLE_ALIGN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .L_start_addr_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* Check if all the bytes in the word are not zero. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ldw r1, (r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) ldw r1, (r3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ldw r1, (r3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ldw r1, (r3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) ldw r1, (r3, 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldw r1, (r3, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ldw r1, (r3, 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ldw r1, (r3, 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) tstnbz r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) bf .L_string_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) addi r0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) addi r3, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) br .L_start_addr_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .L_string_tail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) # ifdef __CSKYBE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) xtrb0 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) xtrb1 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) xtrb2 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) # else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) xtrb3 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) xtrb2 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) xtrb1 r3, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) bez r3, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) # endif /* !__CSKYBE__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .L_return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .L_start_not_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) sub r2, r2, r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .L_start_not_aligned_loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ldb r1, (r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) PRE_BNEZAD (r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) addi r3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) bez r1, .L_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) addi r0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) BNEZAD (r2, .L_start_not_aligned_loop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) br .L_start_addr_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ENDPROC(strlen)