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