.weak strspn
.set strspn, __strspn
.text
ENTRY(__strspn)
ldrb w4, [x1] // first character in set
cbz w4, .Lzero // empty set always returns 0
mov x15,
// set is only one character
ldrb w5, [x1,
cbz w5, .Lsingle
stp x29, x30, [sp,
mov x29, sp
sub sp, sp,
mov w3,
0: add x9, sp, x3, lsl
stp xzr, xzr, [x9]
stp xzr, xzr, [x9,
subs w3, w3,
b.cs 0b
strb w15, [sp, x4] // register first character in set
add x1, x1,
.p2align 4
0: ldrb w4, [x1] // next char in set
strb w15, [sp, x5] // register previous char
cbz w4, 1f // NUL encountered?
ldrb w5, [x1,
add x1, x1,
strb w15, [sp, x4]
cbnz w5, 0b
1: mov x5, x0 // stash a copy of src
.p2align 4
0: ldrb w8, [x0]
ldrb w9, [sp, x8]
cbz w9, 2f
ldrb w8, [x0,
ldrb w9, [sp, x8]
cbz w9, 3f
ldrb w8, [x0,
ldrb w9, [sp, x8]
cbz w9, 4f
ldrb w8, [x0,
add x0, x0,
ldrb w9, [sp, x8]
cbnz w9, 0b
sub x0, x0,
4: sub x5, x5,
3: add x0, x0,
2: sub x0, x0, x5
mov sp, x29
ldp x29, x30, [sp],
ret
.Lzero:
mov x0,
ret
.Lsingle:
ldrb w8, [x0, x5]
cmp w4, w8
b.ne 1f
add x5, x5,
ldrb w8, [x0, x5]
cmp w4, w8
b.ne 1f
add x5, x5,
ldrb w8, [x0, x5]
cmp w4, w8
b.ne 1f
add x5, x5,
ldrb w8, [x0, x5]
add x5, x5,
cmp w4, w8
b.eq .Lsingle
sub x5, x5,
1: mov x0, x5
ret
END(__strspn)