]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc32/strchr.S
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / sparc / sparc32 / strchr.S
CommitLineData
ae6b8730
RH
1/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
2 For SPARC v7.
6d7e8eda 3 Copyright (C) 1996-2023 Free Software Foundation, Inc.
ae6b8730 4 This file is part of the GNU C Library.
ae6b8730
RH
5
6 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
ae6b8730
RH
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 14 Lesser General Public License for more details.
ae6b8730 15
41bdb6e2 16 You should have received a copy of the GNU Lesser General Public
59ba27a6 17 License along with the GNU C Library; if not, see
5a82c748 18 <https://www.gnu.org/licenses/>. */
ae6b8730
RH
19
20#include <sysdep.h>
21
22 /* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
23 to find out if any byte in xword could be zero. This is fast, but
24 also gives false alarm for any byte in range 0x81-0xff. It does
25 not matter for correctness, as if this test tells us there could
26 be some zero byte, we check it byte by byte, but if bytes with
27 high bits set are common in the strings, then this will give poor
28 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
29 will use one tick slower, but more precise test
30 ((xword - 0x01010101) & (~xword) & 0x80808080),
31 which does not give any false alarms (but if some bits are set,
32 one cannot assume from it which bytes are zero and which are not).
33 It is yet to be measured, what is the correct default for glibc
34 in these days for an average user.
35 */
36
37 .text
38 .align 4
043cee37
RM
39ENTRY(strchr)
40 andcc %o1, 0xff, %o1
41 be 12f
42 sll %o1, 8, %o2
43 andcc %o0, 3, %g0
44 or %o1, %o2, %o2
45 sethi %hi(0x80808080), %o4
46 sll %o2, 16, %o3
47 be 13f
48 or %o3, %o2, %g2
49
50 ldub [%o0], %g4
ae6b8730 51 cmp %g4, %o1
043cee37 52 be 11f
ae6b8730
RH
53 add %o0, 1, %o0
54 cmp %g4, 0
55 be 9f
56 andcc %o0, 3, %g0
57 be 4f
58 or %o4, %lo(0x80808080), %o3
59 ldub [%o0], %g4
60 cmp %g4, %o1
043cee37 61 be 11f
ae6b8730
RH
62 add %o0, 1, %o0
63 cmp %g4, 0
64 be 9f
65 andcc %o0, 3, %g0
66 be 5f
67 sethi %hi(0x01010101), %o5
68 ldub [%o0], %g4
69 cmp %g4, %o1
043cee37 70 be 11f
ae6b8730
RH
71 add %o0, 1, %o0
72 cmp %g4, 0
73 be 9f
74 or %o5, %lo(0x01010101), %o2
75 b 6f
76 ld [%o0], %g4
043cee37 7711: retl
ae6b8730
RH
78 sub %o0, 1, %o0
79
043cee37 8013: or %o4, %lo(0x80808080), %o3
ae6b8730
RH
814: sethi %hi(0x01010101), %o5
825: or %o5, %lo(0x01010101), %o2
837: ld [%o0], %g4
846: xor %g4, %g2, %g5
85 sub %g4, %o2, %o4
86#ifdef EIGHTBIT_NOT_RARE
62f29da7 87 sub %g5, %o2, %g6
ae6b8730 88 andn %o4, %g4, %o4
62f29da7 89 andn %g6, %g5, %g5
ae6b8730
RH
90#else
91 sub %g5, %o2, %g5
92#endif
9c84384c 93 or %g5, %o4, %o4
ae6b8730
RH
94 andcc %o4, %o3, %g0
95 be 7b
96 add %o0, 4, %o0
97
98 /* Check every byte. */
9c84384c 998: srl %g4, 24, %g5
ae6b8730
RH
1007: andcc %g5, 0xff, %g5
101 be 9f
102 cmp %g5, %o1
103 be 4f
104 srl %g4, 16, %g5
105 andcc %g5, 0xff, %g5
106 be 9f
107 cmp %g5, %o1
108 be 3f
109 srl %g4, 8, %g5
110 andcc %g5, 0xff, %g5
111 be 9f
112 cmp %g5, %o1
113 be 2f
114 andcc %g4, 0xff, %g5
115 be 9f
116 cmp %g5, %o1
117 bne,a 6b
118 ld [%o0], %g4
119 retl
120 sub %o0, 1, %o0
1212: retl
122 sub %o0, 2, %o0
1233: retl
124 sub %o0, 3, %o0
1254: retl
126 sub %o0, 4, %o0
1279: retl
128 clr %o0
129
13011: ldub [%o0], %o5
131 cmp %o5, 0
132 be 1f
133 add %o0, 1, %o0
134 andcc %o0, 3, %g0
135 be 4f
136 or %o4, %lo(0x80808080), %o3
137 ldub [%o0], %o5
138 cmp %o5, 0
139 be 1f
140 add %o0, 1, %o0
141 andcc %o0, 3, %g0
142 be 5f
143 sethi %hi(0x01010101), %o4
144 ldub [%o0], %o5
145 cmp %o5, 0
146 be 1f
147 add %o0, 1, %o0
148 b 6f
149 or %o4, %lo(0x01010101), %o2
1501: retl
151 sub %o0, 1, %o0
152
15312: andcc %o0, 3, %g0
154 bne 11b
155 sethi %hi(0x80808080), %o4
156 or %o4, %lo(0x80808080), %o3
1574: sethi %hi(0x01010101), %o4
1585: or %o4, %lo(0x01010101), %o2
1596: ld [%o0], %o5
1607: sub %o5, %o2, %o4
161#ifdef EIGHTBIT_NOT_RARE
162 andn %o4, %o5, %o4
163#endif
164 andcc %o4, %o3, %g0
165 be 6b
166 add %o0, 4, %o0
167
168 /* Check every byte. */
169 srl %o5, 24, %g5
170 andcc %g5, 0xff, %g0
171 be 8f
172 add %o0, -4, %o4
173 srl %o5, 16, %g5
174 andcc %g5, 0xff, %g0
175 be 8f
176 add %o4, 1, %o4
177 srl %o5, 8, %g5
178 andcc %g5, 0xff, %g0
179 be 8f
180 add %o4, 1, %o4
181 andcc %o5, 0xff, %g0
182 bne,a 7b
183 ld [%o0], %o5
184 add %o4, 1, %o4
1858: retl
186 mov %o4, %o0
187
18813: ldub [%o0], %g4
189 cmp %g4, %o1
190 add %o0, 1, %o0
191 be,a 1f
192 sub %o0, 1, %o5
193 cmp %g4, 0
194 be 9f
1951: andcc %o0, 3, %g0
196 be 4f
197 or %o4, %lo(0x80808080), %o3
198 ldub [%o0], %g4
199 cmp %g4, %o1
200 add %o0, 1, %o0
201 be,a 1f
202 sub %o0, 1, %o5
203 cmp %g4, 0
204 be 9f
2051: andcc %o0, 3, %g0
206 be 5f
207 sethi %hi(0x01010101), %o4
208 ldub [%o0], %g4
209 cmp %g4, %o1
210 add %o0, 1, %o0
211 be,a 1f
212 sub %o0, 1, %o5
213 cmp %g4, 0
214 be 9f
2151: or %o4, %lo(0x01010101), %o2
216 b 7f
217 ld [%o0], %g4
218END(strchr)
219
220ENTRY(strrchr)
221 andcc %o1, 0xff, %o1
222 clr %o5
223 be 12b
224 sll %o1, 8, %o2
225 andcc %o0, 3, %g0
226 or %o1, %o2, %o2
227 sethi %hi(0x80808080), %o4
228 sll %o2, 16, %o3
229 bne 13b
230 or %o3, %o2, %g2
231 or %o4, %lo(0x80808080), %o3
2324: sethi %hi(0x01010101), %o4
2335: or %o4, %lo(0x01010101), %o2
2346: ld [%o0], %g4
2357: xor %g4, %g2, %g5
236 sub %g4, %o2, %o4
237#ifdef EIGHTBIT_NOT_RARE
62f29da7 238 sub %g5, %o2, %g6
ae6b8730 239 andn %o4, %g4, %o4
62f29da7 240 andn %g6, %g5, %g5
ae6b8730
RH
241#else
242 sub %g5, %o2, %g5
243#endif
9c84384c 244 or %g5, %o4, %o4
ae6b8730
RH
245 andcc %o4, %o3, %g0
246 be 6b
247 add %o0, 4, %o0
248
249 /* Check every byte. */
9c84384c 2503: srl %g4, 24, %g5
ae6b8730
RH
2518: andcc %g5, 0xff, %g5
252 be 9f
253 cmp %g5, %o1
254 be,a 1f
255 sub %o0, 4, %o5
2561: srl %g4, 16, %g5
257 andcc %g5, 0xff, %g5
258 be 9f
259 cmp %g5, %o1
260 be,a 1f
261 sub %o0, 3, %o5
2621: srl %g4, 8, %g5
263 andcc %g5, 0xff, %g5
264 be 9f
265 cmp %g5, %o1
266 be,a 1f
267 sub %o0, 2, %o5
2681: andcc %g4, 0xff, %g5
269 be 9f
270 cmp %g5, %o1
271 be,a 1f
272 sub %o0, 1, %o5
2731: b 7b
274 ld [%o0], %g4
2759: retl
276 mov %o5, %o0
277END(strrchr)
278
1ab18a5b
UD
279weak_alias (strchr, index)
280weak_alias (strrchr, rindex)
85dd1003
UD
281libc_hidden_builtin_def (strchr)
282libc_hidden_builtin_def (strrchr)