Skip to content

Commit 29aa365

Browse files
committed
Fix.
1 parent bb87a92 commit 29aa365

File tree

2 files changed

+90
-95
lines changed

2 files changed

+90
-95
lines changed

sqlite3/libc/libc.wat

Lines changed: 82 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -142,38 +142,42 @@
142142
(local $3 i32)
143143
(local $4 i32)
144144
(local $5 i32)
145-
(local $6 i32)
145+
(local $6 v128)
146146
(local $7 v128)
147-
(local $8 v128)
148-
(local $scratch i32)
149-
(block $block
150-
(br_if $block
151-
(i32.eqz
152-
(local.get $2)
147+
(block $block2
148+
(block $block
149+
(br_if $block
150+
(i32.eqz
151+
(local.get $2)
152+
)
153153
)
154-
)
155-
(local.set $4
156-
(i32.and
157-
(local.get $0)
158-
(i32.const 15)
154+
(local.set $3
155+
(i32.and
156+
(local.get $0)
157+
(i32.const 15)
158+
)
159+
)
160+
(local.set $4
161+
(i32.sub
162+
(local.get $2)
163+
(i32.const 1)
164+
)
159165
)
160-
)
161-
(block $block2
162166
(block $block1
163167
(br_if $block1
164168
(i32.eqz
165169
(v128.any_true
166-
(local.tee $7
170+
(local.tee $6
167171
(i8x16.eq
168172
(v128.load
169-
(local.tee $3
173+
(local.tee $2
170174
(i32.and
171175
(local.get $0)
172176
(i32.const -16)
173177
)
174178
)
175179
)
176-
(local.tee $8
180+
(local.tee $7
177181
(i8x16.splat
178182
(local.get $1)
179183
)
@@ -188,123 +192,109 @@
188192
(local.tee $5
189193
(i32.and
190194
(i8x16.bitmask
191-
(local.get $7)
195+
(local.get $6)
192196
)
193197
(i32.shl
194198
(i32.const -1)
195-
(local.get $4)
199+
(local.get $3)
196200
)
197201
)
198202
)
199203
)
200204
)
201205
(local.set $1
202-
(local.get $2)
206+
(local.get $4)
203207
)
204208
(br $block2)
205209
)
206210
(br_if $block
207-
(i32.lt_u
208-
(local.get $2)
211+
(i32.gt_u
209212
(local.tee $1
210213
(i32.sub
211-
(local.get $2)
212-
(local.tee $3
213-
(i32.sub
214-
(i32.const 16)
215-
(local.get $4)
216-
)
214+
(i32.add
215+
(local.get $3)
216+
(local.get $4)
217217
)
218+
(i32.const 16)
218219
)
219220
)
221+
(local.get $4)
220222
)
221223
)
222-
(br_if $block
223-
(i32.eqz
224-
(local.get $1)
225-
)
226-
)
227-
(local.set $3
224+
(local.set $2
228225
(i32.add
229-
(local.get $0)
230-
(local.get $3)
226+
(i32.sub
227+
(local.get $0)
228+
(local.get $3)
229+
)
230+
(i32.const 16)
231231
)
232232
)
233-
(block $block3
234-
(loop $label
235-
(br_if $block3
236-
(v128.any_true
237-
(local.tee $7
238-
(i8x16.eq
239-
(v128.load
240-
(local.get $3)
241-
)
242-
(local.get $8)
233+
(loop $label
234+
(if
235+
(v128.any_true
236+
(local.tee $6
237+
(i8x16.eq
238+
(v128.load
239+
(local.get $2)
243240
)
241+
(local.get $7)
244242
)
245243
)
246244
)
247-
(br_if $block
248-
(i32.gt_u
249-
(local.tee $0
250-
(i32.sub
251-
(local.get $1)
252-
(i32.const 16)
253-
)
245+
(then
246+
(local.set $5
247+
(i8x16.bitmask
248+
(local.get $6)
254249
)
255-
(local.get $1)
256250
)
257-
)
258-
(local.set $3
259-
(i32.add
260-
(local.get $3)
261-
(i32.const 16)
251+
(local.set $3
252+
(i32.const 0)
262253
)
254+
(br $block2)
263255
)
264-
(br_if $label
265-
(i32.eqz
266-
(block (result i32)
267-
(local.set $scratch
268-
(i32.eq
269-
(local.get $1)
270-
(i32.const 16)
271-
)
272-
)
273-
(local.set $1
274-
(local.get $0)
275-
)
276-
(local.get $scratch)
256+
)
257+
(local.set $2
258+
(i32.add
259+
(local.get $2)
260+
(i32.const 16)
261+
)
262+
)
263+
(br_if $label
264+
(i32.ge_u
265+
(local.get $1)
266+
(local.tee $1
267+
(i32.sub
268+
(local.get $1)
269+
(i32.const 16)
277270
)
278271
)
279272
)
280273
)
281-
(br $block)
282274
)
283-
(local.set $5
284-
(i8x16.bitmask
285-
(local.get $7)
275+
)
276+
(return
277+
(i32.const 0)
278+
)
279+
)
280+
(select
281+
(i32.add
282+
(local.get $2)
283+
(local.tee $0
284+
(i32.ctz
285+
(local.get $5)
286286
)
287287
)
288288
)
289-
(local.set $6
290-
(select
291-
(i32.add
292-
(local.get $3)
293-
(local.tee $0
294-
(i32.ctz
295-
(local.get $5)
296-
)
297-
)
298-
)
299-
(i32.const 0)
300-
(i32.lt_u
301-
(local.get $0)
302-
(local.get $1)
303-
)
289+
(i32.const 0)
290+
(i32.le_u
291+
(local.get $0)
292+
(i32.add
293+
(local.get $1)
294+
(local.get $3)
304295
)
305296
)
306297
)
307-
(local.get $6)
308298
)
309299
(func $strlen (param $0 i32) (result i32)
310300
(local $1 i32)

sqlite3/libc/string.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,22 @@ int memcmp(const void *v1, const void *v2, size_t n) {
7171

7272
__attribute__((weak))
7373
void *memchr(const void *v, int c, size_t n) {
74+
if (n-- == 0) {
75+
return NULL;
76+
}
77+
7478
uintptr_t align = (uintptr_t)v % sizeof(v128_t);
7579
const v128_t *w = (void *)(v - align);
7680
const v128_t wc = wasm_i8x16_splat(c);
7781

78-
while (n) {
82+
while (true) {
7983
const v128_t cmp = wasm_i8x16_eq(*w, wc);
8084
if (wasm_v128_any_true(cmp)) {
8185
int mask = wasm_i8x16_bitmask(cmp) >> align << align;
8286
__builtin_assume(mask || align);
8387
if (mask) {
8488
size_t ctz = __builtin_ctz(mask);
85-
return ctz < n ? (void *)w + ctz : NULL;
89+
return ctz <= n + align ? (void *)w + ctz : NULL;
8690
}
8791
}
8892
if (__builtin_sub_overflow(n, sizeof(v128_t) - align, &n)) {
@@ -91,7 +95,6 @@ void *memchr(const void *v, int c, size_t n) {
9195
align = 0;
9296
w++;
9397
}
94-
return NULL;
9598
}
9699

97100
__attribute__((weak))
@@ -244,6 +247,7 @@ size_t strspn(const char *s, const char *c) {
244247
volatile v128_t *w = (void *)byteset;
245248
#pragma unroll
246249
for (size_t i = sizeof(byteset) / sizeof(v128_t); i--;) w[i] = (v128_t){};
250+
247251
while (*c && (byteset[*(uint8_t *)c] = 1)) c++;
248252
#pragma unroll 4
249253
while (byteset[*(uint8_t *)s]) s++;
@@ -263,6 +267,7 @@ size_t strcspn(const char *s, const char *c) {
263267
volatile v128_t *w = (void *)byteset;
264268
#pragma unroll
265269
for (size_t i = sizeof(byteset) / sizeof(v128_t); i--;) w[i] = (v128_t){};
270+
266271
while ((byteset[*(uint8_t *)c] = 1) && *c) c++;
267272
#pragma unroll 4
268273
while (!byteset[*(uint8_t *)s]) s++;

0 commit comments

Comments
 (0)