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