xref: /OK3568_Linux_fs/kernel/arch/arc/lib/strcmp-archs.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun#include <linux/linkage.h>
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunENTRY_CFI(strcmp)
9*4882a593Smuzhiyun	or	r2, r0, r1
10*4882a593Smuzhiyun	bmsk_s	r2, r2, 1
11*4882a593Smuzhiyun	brne	r2, 0, @.Lcharloop
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun;;; s1 and s2 are word aligned
14*4882a593Smuzhiyun	ld.ab	r2, [r0, 4]
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun	mov_s	r12, 0x01010101
17*4882a593Smuzhiyun	ror	r11, r12
18*4882a593Smuzhiyun	.align  4
19*4882a593Smuzhiyun.LwordLoop:
20*4882a593Smuzhiyun	ld.ab	r3, [r1, 4]
21*4882a593Smuzhiyun	;; Detect NULL char in str1
22*4882a593Smuzhiyun	sub	r4, r2, r12
23*4882a593Smuzhiyun	ld.ab	r5, [r0, 4]
24*4882a593Smuzhiyun	bic	r4, r4, r2
25*4882a593Smuzhiyun	and	r4, r4, r11
26*4882a593Smuzhiyun	brne.d.nt	r4, 0, .LfoundNULL
27*4882a593Smuzhiyun	;; Check if the read locations are the same
28*4882a593Smuzhiyun	cmp	r2, r3
29*4882a593Smuzhiyun	beq.d	.LwordLoop
30*4882a593Smuzhiyun	mov.eq	r2, r5
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	;; A match is found, spot it out
33*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__
34*4882a593Smuzhiyun	swape	r3, r3
35*4882a593Smuzhiyun	mov_s	r0, 1
36*4882a593Smuzhiyun	swape	r2, r2
37*4882a593Smuzhiyun#else
38*4882a593Smuzhiyun	mov_s	r0, 1
39*4882a593Smuzhiyun#endif
40*4882a593Smuzhiyun	cmp_s	r2, r3
41*4882a593Smuzhiyun	j_s.d	[blink]
42*4882a593Smuzhiyun	bset.lo	r0, r0, 31
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	.align 4
45*4882a593Smuzhiyun.LfoundNULL:
46*4882a593Smuzhiyun#ifdef __BIG_ENDIAN__
47*4882a593Smuzhiyun	swape	r4, r4
48*4882a593Smuzhiyun	swape	r2, r2
49*4882a593Smuzhiyun	swape	r3, r3
50*4882a593Smuzhiyun#endif
51*4882a593Smuzhiyun	;; Find null byte
52*4882a593Smuzhiyun	ffs	r0, r4
53*4882a593Smuzhiyun	bmsk	r2, r2, r0
54*4882a593Smuzhiyun	bmsk	r3, r3, r0
55*4882a593Smuzhiyun	swape	r2, r2
56*4882a593Smuzhiyun	swape	r3, r3
57*4882a593Smuzhiyun	;; make the return value
58*4882a593Smuzhiyun	sub.f	r0, r2, r3
59*4882a593Smuzhiyun	mov.hi	r0, 1
60*4882a593Smuzhiyun	j_s.d	[blink]
61*4882a593Smuzhiyun	bset.lo	r0, r0, 31
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	.align 4
64*4882a593Smuzhiyun.Lcharloop:
65*4882a593Smuzhiyun	ldb.ab	r2, [r0, 1]
66*4882a593Smuzhiyun	ldb.ab	r3, [r1, 1]
67*4882a593Smuzhiyun	nop
68*4882a593Smuzhiyun	breq	r2, 0, .Lcmpend
69*4882a593Smuzhiyun	breq	r2, r3, .Lcharloop
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun	.align 4
72*4882a593Smuzhiyun.Lcmpend:
73*4882a593Smuzhiyun	j_s.d	[blink]
74*4882a593Smuzhiyun	sub	r0, r2, r3
75*4882a593SmuzhiyunEND_CFI(strcmp)
76