xref: /OK3568_Linux_fs/u-boot/arch/arc/lib/memcmp.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__
8*4882a593Smuzhiyun#define WORD2 r2
9*4882a593Smuzhiyun#define SHIFT r3
10*4882a593Smuzhiyun#else /* __BIG_ENDIAN__ */
11*4882a593Smuzhiyun#define WORD2 r3
12*4882a593Smuzhiyun#define SHIFT r2
13*4882a593Smuzhiyun#endif /* _ENDIAN__ */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun.global memcmp
16*4882a593Smuzhiyun.align 4
17*4882a593Smuzhiyunmemcmp:
18*4882a593Smuzhiyun	or	%r12, %r0, %r1
19*4882a593Smuzhiyun	asl_s	%r12, %r12, 30
20*4882a593Smuzhiyun	sub	%r3, %r2, 1
21*4882a593Smuzhiyun	brls	%r2, %r12, .Lbytewise
22*4882a593Smuzhiyun	ld	%r4, [%r0, 0]
23*4882a593Smuzhiyun	ld	%r5, [%r1, 0]
24*4882a593Smuzhiyun	lsr.f	%lp_count, %r3, 3
25*4882a593Smuzhiyun	lpne	.Loop_end
26*4882a593Smuzhiyun	ld_s	WORD2, [%r0, 4]
27*4882a593Smuzhiyun	ld_s	%r12, [%r1, 4]
28*4882a593Smuzhiyun	brne	%r4, %r5, .Leven
29*4882a593Smuzhiyun	ld.a	%r4, [%r0, 8]
30*4882a593Smuzhiyun	ld.a	%r5, [%r1, 8]
31*4882a593Smuzhiyun	brne	WORD2, %r12, .Lodd
32*4882a593Smuzhiyun	nop
33*4882a593Smuzhiyun.Loop_end:
34*4882a593Smuzhiyun	asl_s	SHIFT, SHIFT, 3
35*4882a593Smuzhiyun	bhs_s	.Last_cmp
36*4882a593Smuzhiyun	brne	%r4, %r5, .Leven
37*4882a593Smuzhiyun	ld	%r4, [%r0, 4]
38*4882a593Smuzhiyun	ld	%r5, [%r1, 4]
39*4882a593Smuzhiyun#ifdef __LITTLE_ENDIAN__
40*4882a593Smuzhiyun	nop_s
41*4882a593Smuzhiyun	/* one more load latency cycle */
42*4882a593Smuzhiyun.Last_cmp:
43*4882a593Smuzhiyun	xor	%r0, %r4, %r5
44*4882a593Smuzhiyun	bset	%r0, %r0, SHIFT
45*4882a593Smuzhiyun	sub_s	%r1, %r0, 1
46*4882a593Smuzhiyun	bic_s	%r1, %r1, %r0
47*4882a593Smuzhiyun	norm	%r1, %r1
48*4882a593Smuzhiyun	b.d	.Leven_cmp
49*4882a593Smuzhiyun	and	%r1, %r1, 24
50*4882a593Smuzhiyun.Leven:
51*4882a593Smuzhiyun	xor	%r0, %r4, %r5
52*4882a593Smuzhiyun	sub_s	%r1, %r0, 1
53*4882a593Smuzhiyun	bic_s	%r1, %r1, %r0
54*4882a593Smuzhiyun	norm	%r1, %r1
55*4882a593Smuzhiyun	/* slow track insn */
56*4882a593Smuzhiyun	and	%r1, %r1, 24
57*4882a593Smuzhiyun.Leven_cmp:
58*4882a593Smuzhiyun	asl	%r2, %r4, %r1
59*4882a593Smuzhiyun	asl	%r12, %r5, %r1
60*4882a593Smuzhiyun	lsr_s	%r2, %r2, 1
61*4882a593Smuzhiyun	lsr_s	%r12, %r12, 1
62*4882a593Smuzhiyun	j_s.d	[%blink]
63*4882a593Smuzhiyun	sub	%r0, %r2, %r12
64*4882a593Smuzhiyun	.balign	4
65*4882a593Smuzhiyun.Lodd:
66*4882a593Smuzhiyun	xor	%r0, WORD2, %r12
67*4882a593Smuzhiyun	sub_s	%r1, %r0, 1
68*4882a593Smuzhiyun	bic_s	%r1, %r1, %r0
69*4882a593Smuzhiyun	norm	%r1, %r1
70*4882a593Smuzhiyun	/* slow track insn */
71*4882a593Smuzhiyun	and	%r1, %r1, 24
72*4882a593Smuzhiyun	asl_s	%r2, %r2, %r1
73*4882a593Smuzhiyun	asl_s	%r12, %r12, %r1
74*4882a593Smuzhiyun	lsr_s	%r2, %r2, 1
75*4882a593Smuzhiyun	lsr_s	%r12, %r12, 1
76*4882a593Smuzhiyun	j_s.d	[%blink]
77*4882a593Smuzhiyun	sub	%r0, %r2, %r12
78*4882a593Smuzhiyun#else /* __BIG_ENDIAN__ */
79*4882a593Smuzhiyun.Last_cmp:
80*4882a593Smuzhiyun	neg_s	SHIFT, SHIFT
81*4882a593Smuzhiyun	lsr	%r4, %r4, SHIFT
82*4882a593Smuzhiyun	lsr	%r5, %r5, SHIFT
83*4882a593Smuzhiyun	/* slow track insn */
84*4882a593Smuzhiyun.Leven:
85*4882a593Smuzhiyun	sub.f	%r0, %r4, %r5
86*4882a593Smuzhiyun	mov.ne	%r0, 1
87*4882a593Smuzhiyun	j_s.d	[%blink]
88*4882a593Smuzhiyun	bset.cs	%r0, %r0, 31
89*4882a593Smuzhiyun.Lodd:
90*4882a593Smuzhiyun	cmp_s	WORD2, %r12
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun	mov_s	%r0, 1
93*4882a593Smuzhiyun	j_s.d	[%blink]
94*4882a593Smuzhiyun	bset.cs	%r0, %r0, 31
95*4882a593Smuzhiyun#endif /* _ENDIAN__ */
96*4882a593Smuzhiyun	.balign	4
97*4882a593Smuzhiyun.Lbytewise:
98*4882a593Smuzhiyun	breq	%r2, 0, .Lnil
99*4882a593Smuzhiyun	ldb	%r4, [%r0, 0]
100*4882a593Smuzhiyun	ldb	%r5, [%r1, 0]
101*4882a593Smuzhiyun	lsr.f	%lp_count, %r3
102*4882a593Smuzhiyun	lpne	.Lbyte_end
103*4882a593Smuzhiyun	ldb_s	%r3, [%r0, 1]
104*4882a593Smuzhiyun	ldb	%r12, [%r1, 1]
105*4882a593Smuzhiyun	brne	%r4, %r5, .Lbyte_even
106*4882a593Smuzhiyun	ldb.a	%r4, [%r0, 2]
107*4882a593Smuzhiyun	ldb.a	%r5, [%r1, 2]
108*4882a593Smuzhiyun	brne	%r3, %r12, .Lbyte_odd
109*4882a593Smuzhiyun	nop
110*4882a593Smuzhiyun.Lbyte_end:
111*4882a593Smuzhiyun	bcc	.Lbyte_even
112*4882a593Smuzhiyun	brne	%r4, %r5, .Lbyte_even
113*4882a593Smuzhiyun	ldb_s	%r3, [%r0, 1]
114*4882a593Smuzhiyun	ldb_s	%r12, [%r1, 1]
115*4882a593Smuzhiyun.Lbyte_odd:
116*4882a593Smuzhiyun	j_s.d	[%blink]
117*4882a593Smuzhiyun	sub	%r0, %r3, %r12
118*4882a593Smuzhiyun.Lbyte_even:
119*4882a593Smuzhiyun	j_s.d	[%blink]
120*4882a593Smuzhiyun	sub	%r0, %r4, %r5
121*4882a593Smuzhiyun.Lnil:
122*4882a593Smuzhiyun	j_s.d	[%blink]
123*4882a593Smuzhiyun	mov	%r0, 0
124