0001
0002 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
0003
0004 #include <linux/linkage.h>
0005 #include "sysdep.h"
0006
0007 ENTRY(strlen)
0008
0009 mov r3, r0
0010 andi r1, r0, 3
0011 movi r2, 4
0012 movi r0, 0
0013 bnez r1, .L_start_not_aligned
0014
0015 LABLE_ALIGN
0016 .L_start_addr_aligned:
0017
0018 ldw r1, (r3)
0019 tstnbz r1
0020 bf .L_string_tail
0021
0022 ldw r1, (r3, 4)
0023 addi r0, 4
0024 tstnbz r1
0025 bf .L_string_tail
0026
0027 ldw r1, (r3, 8)
0028 addi r0, 4
0029 tstnbz r1
0030 bf .L_string_tail
0031
0032 ldw r1, (r3, 12)
0033 addi r0, 4
0034 tstnbz r1
0035 bf .L_string_tail
0036
0037 ldw r1, (r3, 16)
0038 addi r0, 4
0039 tstnbz r1
0040 bf .L_string_tail
0041
0042 ldw r1, (r3, 20)
0043 addi r0, 4
0044 tstnbz r1
0045 bf .L_string_tail
0046
0047 ldw r1, (r3, 24)
0048 addi r0, 4
0049 tstnbz r1
0050 bf .L_string_tail
0051
0052 ldw r1, (r3, 28)
0053 addi r0, 4
0054 tstnbz r1
0055 bf .L_string_tail
0056
0057 addi r0, 4
0058 addi r3, 32
0059 br .L_start_addr_aligned
0060
0061 .L_string_tail:
0062 # ifdef __CSKYBE__
0063 xtrb0 r3, r1
0064 bez r3, .L_return
0065 addi r0, 1
0066 xtrb1 r3, r1
0067 bez r3, .L_return
0068 addi r0, 1
0069 xtrb2 r3, r1
0070 bez r3, .L_return
0071 addi r0, 1
0072 # else
0073 xtrb3 r3, r1
0074 bez r3, .L_return
0075 addi r0, 1
0076 xtrb2 r3, r1
0077 bez r3, .L_return
0078 addi r0, 1
0079 xtrb1 r3, r1
0080 bez r3, .L_return
0081 addi r0, 1
0082 # endif
0083
0084 .L_return:
0085 rts
0086
0087 .L_start_not_aligned:
0088 sub r2, r2, r1
0089 .L_start_not_aligned_loop:
0090 ldb r1, (r3)
0091 PRE_BNEZAD (r2)
0092 addi r3, 1
0093 bez r1, .L_return
0094 addi r0, 1
0095 BNEZAD (r2, .L_start_not_aligned_loop)
0096 br .L_start_addr_aligned
0097 ENDPROC(strlen)