xref: /openbmc/linux/arch/arc/lib/memcmp.S (revision 6d8e62c3)
1/*
2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/linkage.h>
10
11#ifdef __LITTLE_ENDIAN__
12#define WORD2 r2
13#define SHIFT r3
14#else /* BIG ENDIAN */
15#define WORD2 r3
16#define SHIFT r2
17#endif
18
19ENTRY(memcmp)
20	or	r12,r0,r1
21	asl_s	r12,r12,30
22	sub	r3,r2,1
23	brls	r2,r12,.Lbytewise
24	ld	r4,[r0,0]
25	ld	r5,[r1,0]
26	lsr.f	lp_count,r3,3
27	lpne	.Loop_end
28	ld_s	WORD2,[r0,4]
29	ld_s	r12,[r1,4]
30	brne	r4,r5,.Leven
31	ld.a	r4,[r0,8]
32	ld.a	r5,[r1,8]
33	brne	WORD2,r12,.Lodd
34.Loop_end:
35	asl_s	SHIFT,SHIFT,3
36	bhs_s	.Last_cmp
37	brne	r4,r5,.Leven
38	ld	r4,[r0,4]
39	ld	r5,[r1,4]
40#ifdef __LITTLE_ENDIAN__
41	nop_s
42	; one more load latency cycle
43.Last_cmp:
44	xor	r0,r4,r5
45	bset	r0,r0,SHIFT
46	sub_s	r1,r0,1
47	bic_s	r1,r1,r0
48	norm	r1,r1
49	b.d	.Leven_cmp
50	and	r1,r1,24
51.Leven:
52	xor	r0,r4,r5
53	sub_s	r1,r0,1
54	bic_s	r1,r1,r0
55	norm	r1,r1
56	; slow track insn
57	and	r1,r1,24
58.Leven_cmp:
59	asl	r2,r4,r1
60	asl	r12,r5,r1
61	lsr_s	r2,r2,1
62	lsr_s	r12,r12,1
63	j_s.d	[blink]
64	sub	r0,r2,r12
65	.balign	4
66.Lodd:
67	xor	r0,WORD2,r12
68	sub_s	r1,r0,1
69	bic_s	r1,r1,r0
70	norm	r1,r1
71	; slow track insn
72	and	r1,r1,24
73	asl_s	r2,r2,r1
74	asl_s	r12,r12,r1
75	lsr_s	r2,r2,1
76	lsr_s	r12,r12,1
77	j_s.d	[blink]
78	sub	r0,r2,r12
79#else /* BIG ENDIAN */
80.Last_cmp:
81	neg_s	SHIFT,SHIFT
82	lsr	r4,r4,SHIFT
83	lsr	r5,r5,SHIFT
84	; slow track insn
85.Leven:
86	sub.f	r0,r4,r5
87	mov.ne	r0,1
88	j_s.d	[blink]
89	bset.cs	r0,r0,31
90.Lodd:
91	cmp_s	WORD2,r12
92
93	mov_s	r0,1
94	j_s.d	[blink]
95	bset.cs	r0,r0,31
96#endif /* ENDIAN */
97	.balign	4
98.Lbytewise:
99	breq	r2,0,.Lnil
100	ldb	r4,[r0,0]
101	ldb	r5,[r1,0]
102	lsr.f	lp_count,r3
103	lpne	.Lbyte_end
104	ldb_s	r3,[r0,1]
105	ldb	r12,[r1,1]
106	brne	r4,r5,.Lbyte_even
107	ldb.a	r4,[r0,2]
108	ldb.a	r5,[r1,2]
109	brne	r3,r12,.Lbyte_odd
110.Lbyte_end:
111	bcc	.Lbyte_even
112	brne	r4,r5,.Lbyte_even
113	ldb_s	r3,[r0,1]
114	ldb_s	r12,[r1,1]
115.Lbyte_odd:
116	j_s.d	[blink]
117	sub	r0,r3,r12
118.Lbyte_even:
119	j_s.d	[blink]
120	sub	r0,r4,r5
121.Lnil:
122	j_s.d	[blink]
123	mov	r0,0
124END(memcmp)
125