#include <machine/asm.h>
.weak strchrnul
.set strchrnul, __strchrnul
ENTRY(__strchrnul)
andi a1, a1, 0xFF
li t0, 0x01010101
slli t1, t0, 32
or t0, t0, t1
slli t1, t0, 7
mul a1, a1, t0
andi t2, a0, 0b111
andi a0, a0, ~0b111
beqz t2, .Lloop
ld a2, (a0)
slli t2, t2, 3
neg t2, t2
srl t2, t0, t2
or a3, a2, t2
xor a2, a2, a1
or a2, a2, t2
not t3, a3
not t2, a2
sub a3, a3, t0
sub a2, a2, t0
and a3, a3, t3
and a2, a2, t2
and a3, a3, t1
and a2, a2, t1
or a2, a2, a3
addi a0, a0, 8
bnez a2, .Lfind_char
.Lloop:
ld a2, (a0)
xor a3, a2, a1
not t2, a2
not t3, a3
sub a2, a2, t0
sub a3, a3, t0
and a2, a2, t2
and a3, a3, t3
and a2, a2, t1
and a3, a3, t1
or a2, a2, a3
addi a0, a0, 8
beqz a2, .Lloop
.Lfind_char:
addi a0, a0, -8
neg t0, a2
and a2, a2, t0
li t0, 0x0001020304050607
srli a2, a2, 7
mul a2, a2, t0
srli a2, a2, 56
add a0, a0, a2
ret
END(__strchrnul)