Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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     /* Check if the start addr is aligned.  */
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     /* Check if all the bytes in the word are not zero.  */
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 /* !__CSKYBE__ */
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)