.weak strcspn
.set strcspn, __strcspn
.text
ENTRY(__strcspn)
stp x29, x30, [sp,
mov x29, sp
mov x15,
ldrb w4, [x1] // first character in the set
cbz w4, .Lstrlen
movi v0.16b,
ldrb w5, [x1,
cbz w5, .Lstrchr
sub sp, sp,
mov w3,
.p2align 4
0: add x9, sp, x3, lsl
stp xzr, xzr, [x9]
stp xzr, xzr, [x9,
subs w3, w3,
b.cs 0b
stp q0, q0, [sp,
stp q0, q0, [sp,
add x1, x1,
strb w15, [sp, x4] // register first chars in the set
strb w15, [sp, x5]
mov x4, x0 // stash a copy of src
.p2align 4
0: ldrb w5, [x1]
strb w15, [sp, x5]
cbz w5, 1f // end of set?
ldrb w5, [x1,
strb w15, [sp, x5]
cbz w5, 1f
add x1, x1,
b 0b
.p2align 4
1: ldrb w8, [x0]
ldrb w9, [sp, x8]
cbnz w9, 2f
ldrb w8, [x0,
ldrb w9, [sp, x8]
cbnz w9, 3f
ldrb w8, [x0,
ldrb w9, [sp, x8]
cbnz w9, 4f
ldrb w8, [x0,
ldrb w9, [sp, x8]
add x0, x0,
cbz w9, 1b
sub x0, x0,
4: sub x4, x4,
3: add x0, x0,
2: sub x0, x0, x4
mov sp, x29
ldp x29, x30, [sp],
ret
.p2align 4
.Lstrlen:
mov sp, x29
ldp x29, x30, [sp],
b strlen
.p2align 4
.Lstrchr:
stp x0, x1, [sp,
mov x1, x4
bl strchrnul
ldp x18, x17, [sp],
sub x0, x0, x18
ldp x29, x30, [sp],
ret
END(__strcspn)