#include <machine/asm.h>
#include <machine/param.h>
.weak strncmp
.set strncmp, __strncmp
.text
ENTRY(__strncmp)
bic x8, x0, #0xf and x9, x0, #0xf bic x10, x1, #0xf and x11, x1, #0xf
subs x2, x2, #1
b.lo .Lempty
mov x13, #-1 mov x16, #0xf
add x3, x0, #16 add x4, x1, #16
eor x3, x3, x0
eor x4, x4, x1 orr x3, x3, x4 cmp x2,#16
b.lo .Llt16
tbz w3, #PAGE_SHIFT, .Lbegin
ldr q0, [x8] ldr q1, [x10]
lsl x14, x9, #2
lsl x15, x11, #2
lsl x3, x13, x14 lsl x4, x13, x15
cmeq v5.16b, v0.16b, #0
cmeq v6.16b, v1.16b, #0
shrn v5.8b, v5.8h, #4
shrn v6.8b, v6.8h, #4
fmov x5, d5
fmov x6, d6
adrp x14, shift_data
add x14, x14, :lo12:shift_data
tst x5, x3
b.eq 0f
ldr q4, [x14, x9] tbl v0.16b, {v0.16b}, v4.16b
b 1f
.p2align 4
0:
ldr q0, [x0] 1:
tst x6, x4
b.eq 0f
ldr q4, [x14, x11]
tbl v4.16b, {v1.16b}, v4.16b
b 1f
.p2align 4
.Lbegin:
ldr q0, [x0] 0:
ldr q4, [x1]
1:
cmeq v2.16b, v0.16b, #0 cmeq v4.16b, v0.16b, v4.16b
orn v2.16b, v2.16b, v4.16b
shrn v2.8b, v2.8h, #4
fmov x5, d2
cbnz x5, .Lhead_mismatch
ldr q2, [x8, #16] ldr q3, [x10, #16]