Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
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 /* BIG ENDIAN */
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 /* ENDIAN */
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 /* BIG ENDIAN */
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 /* ENDIAN */
0077 .Learly_end:
0078     b.d .Lend
0079     sub_s.ne r1,r1,r1
0080 END_CFI(strlen)