1
2
3
4
5
6
7
8
9#include <linux/linkage.h>
10#include <asm/assembler.h>
11
12
13
14
15
16
17#define L(label) .L
18
19#define REP8_01 0x0101010101010101
20#define REP8_7f 0x7f7f7f7f7f7f7f7f
21#define REP8_80 0x8080808080808080
22
23
24#define src1 x0
25#define src2 x1
26#define result x0
27
28
29#define data1 x2
30#define data1w w2
31#define data2 x3
32#define data2w w3
33#define has_nul x4
34#define diff x5
35#define syndrome x6
36#define tmp1 x7
37#define tmp2 x8
38#define tmp3 x9
39#define zeroones x10
40#define pos x11
41
42
43 .align 6
44SYM_FUNC_START_WEAK_PI(strcmp)
45 eor tmp1, src1, src2
46 mov zeroones,
47 tst tmp1,
48 b.ne L(misaligned8)
49 ands tmp1, src1,
50 b.ne L(mutual_align)
51
52
53
54L(loop_aligned):
55 ldr data1, [src1],
56 ldr data2, [src2],
57L(start_realigned):
58 sub tmp1, data1, zeroones
59 orr tmp2, data1,
60 eor diff, data1, data2
61 bic has_nul, tmp1, tmp2
62 orr syndrome, diff, has_nul
63 cbz syndrome, L(loop_aligned)
64
65
66L(end):
67#ifndef __AARCH64EB__
68 rev syndrome, syndrome
69 rev data1, data1
70
71
72
73
74 clz pos, syndrome
75 rev data2, data2
76 lsl data1, data1, pos
77 lsl data2, data2, pos
78
79
80 lsr data1, data1,
81 sub result, data1, data2, lsr
82 ret
83#else
84
85
86
87
88
89
90 cbnz has_nul, 1f
91 cmp data1, data2
92 cset result, ne
93 cneg result, result, lo
94 ret
951:
96
97 rev tmp3, data1
98 sub tmp1, tmp3, zeroones
99 orr tmp2, tmp3,
100 bic has_nul, tmp1, tmp2
101 rev has_nul, has_nul
102 orr syndrome, diff, has_nul
103 clz pos, syndrome
104
105
106
107
108 lsl data1, data1, pos
109 lsl data2, data2, pos
110
111
112 lsr data1, data1,
113 sub result, data1, data2, lsr
114 ret
115#endif
116
117L(mutual_align):
118
119
120
121 bic src1, src1,
122 bic src2, src2,
123 lsl tmp1, tmp1,
124 ldr data1, [src1],
125 neg tmp1, tmp1
126 ldr data2, [src2],
127 mov tmp2,
128#ifdef __AARCH64EB__
129
130 lsl tmp2, tmp2, tmp1
131#else
132
133 lsr tmp2, tmp2, tmp1
134#endif
135 orr data1, data1, tmp2
136 orr data2, data2, tmp2
137 b L(start_realigned)
138
139L(misaligned8):
140
141
142
143 tst src1,
144 b.eq L(loop_misaligned)
145L(do_misaligned):
146 ldrb data1w, [src1],
147 ldrb data2w, [src2],
148 cmp data1w,
149 ccmp data1w, data2w,
150 b.ne L(done)
151 tst src1,
152 b.ne L(do_misaligned)
153
154L(loop_misaligned):
155
156
157 and tmp1, src2,
158 eor tmp1, tmp1,
159 cbz tmp1, L(do_misaligned)
160 ldr data1, [src1],
161 ldr data2, [src2],
162
163 sub tmp1, data1, zeroones
164 orr tmp2, data1,
165 eor diff, data1, data2
166 bic has_nul, tmp1, tmp2
167 orr syndrome, diff, has_nul
168 cbz syndrome, L(loop_misaligned)
169 b L(end)
170
171L(done):
172 sub result, data1, data2
173 ret
174
175SYM_FUNC_END_PI(strcmp)
176EXPORT_SYMBOL_NOHWKASAN(strcmp)
177