#include <machine/asm.h>
ENTRY(timingsafe_memcmp)
cmp x2, #16
bhi .Lgt16
cmp x2, #8
bhi .L0916
cmp x2, #4
bhi .L0508
cmp x2, #2
bhi .L0304
cbnz x2, .L0102
mov w0, #0
ret
.L0102: ldrb w3, [x0]
ldrb w4, [x1]
sub x2, x2, #1
ldrb w5, [x0, x2]
ldrb w6, [x1, x2]
bfi w5, w3, #8, #8
bfi w6, w4, #8, #8
sub w0, w5, w6
ret
.L0304: ldrh w3, [x0]
ldrh w4, [x1]
sub x2, x2, #2
ldrh w5, [x0, x2]
ldrh w6, [x1, x2]
bfi w3, w5, #16, #16
bfi w4, w6, #16, #16
rev w3, w3
rev w4, w4
cmp w3, w4
csetm w0, lo
csinc w0, w0, wzr, ls
ret
.L0508: ldr w3, [x0]
ldr w4, [x1]
sub x2, x2, #4
ldr w5, [x0, x2]
ldr w6, [x1, x2]
bfi x3, x5, #32, #32
bfi x4, x6, #32, #32
rev x3, x3
rev x4, x4
cmp x3, x4
csetm w0, lo
csinc w0, w0, wzr, ls
ret
.L0916: ldr x3, [x0]
ldr x4, [x1]
sub x2, x2, #8
ldr x5, [x0, x2]
ldr x6, [x1, x2]
cmp x3, x4
csel x3, x3, x5, ne
csel x4, x4, x6, ne
rev x3, x3
rev x4, x4
cmp x3, x4
csetm w0, lo
csinc w0, w0, wzr, ls
ret
.Lgt16: ldp x3, x4, [x0], #16
ldp x5, x6, [x1], #16
cmp x3, x5
csel x3, x3, x4, ne
csel x5, x5, x6, ne
subs x2, x2, #32
bls .Ltail
0: ldp x4, x7, [x0], #16
ldp x6, x8, [x1], #16
cmp x4, x6
csel x4, x4, x7, ne
csel x6, x6, x8, ne
cmp x3, x5
csel x3, x3, x4, ne
csel x5, x5, x6, ne
subs x2, x2, #16
bhi 0b
.Ltail: add x0, x0, x2
add x1, x1, x2
ldp x4, x7, [x0]
ldp x6, x8, [x1]
cmp x4, x6
csel x4, x4, x7, ne
csel x6, x6, x8, ne
cmp x3, x5
csel x3, x3, x4, ne
csel x5, x5, x6, ne
rev x3, x3
rev x5, x5
cmp x3, x5
csetm w0, lo
csinc w0, w0, wzr, ls
ret
END(timingsafe_memcmp)