#include "arm_arch.h"
.arch armv8-a
.section .rodata
.align 5
.Lpoly:
.quad 0xffffffffffffffff,0xffffffff00000000,0xffffffffffffffff,0xfffffffeffffffff
.Lord:
.quad 0x53bbf40939d54123,0x7203df6b21c6052b,0xffffffffffffffff,0xfffffffeffffffff
.Lpoly_div_2:
.quad 0x8000000000000000,0xffffffff80000000,0xffffffffffffffff,0x7fffffff7fffffff
.Lord_div_2:
.quad 0xa9ddfa049ceaa092,0xb901efb590e30295,0xffffffffffffffff,0x7fffffff7fffffff
.text
.globl bn_rshift1
.type bn_rshift1,%function
.align 5
bn_rshift1:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x0]
ldp x9,x10,[x0,#16]
extr x7,x8,x7,#1
extr x8,x9,x8,#1
extr x9,x10,x9,#1
lsr x10,x10,#1
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size bn_rshift1,.-bn_rshift1
.globl bn_sub
.type bn_sub,%function
.align 5
bn_sub:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
subs x7,x7,x11
sbcs x8,x8,x12
sbcs x9,x9,x13
sbc x10,x10,x14
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size bn_sub,.-bn_sub
.globl ecp_sm2p256_div_by_2
.type ecp_sm2p256_div_by_2,%function
.align 5
ecp_sm2p256_div_by_2:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
mov x3,x7
extr x7,x8,x7,#1
extr x8,x9,x8,#1
extr x9,x10,x9,#1
lsr x10,x10,#1
adrp x2,.Lpoly_div_2
add x2,x2,#:lo12:.Lpoly_div_2
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
tst x3,#1
csel x11,xzr,x11,eq
csel x12,xzr,x12,eq
csel x13,xzr,x13,eq
csel x14,xzr,x14,eq
adds x7,x7,x11
adcs x8,x8,x12
adcs x9,x9,x13
adc x10,x10,x14
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_div_by_2,.-ecp_sm2p256_div_by_2
.globl ecp_sm2p256_div_by_2_mod_ord
.type ecp_sm2p256_div_by_2_mod_ord,%function
.align 5
ecp_sm2p256_div_by_2_mod_ord:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
mov x3,x7
extr x7,x8,x7,#1
extr x8,x9,x8,#1
extr x9,x10,x9,#1
lsr x10,x10,#1
adrp x2,.Lord_div_2
add x2,x2,#:lo12:.Lord_div_2
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
tst x3,#1
csel x11,xzr,x11,eq
csel x12,xzr,x12,eq
csel x13,xzr,x13,eq
csel x14,xzr,x14,eq
adds x7,x7,x11
adcs x8,x8,x12
adcs x9,x9,x13
adc x10,x10,x14
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_div_by_2_mod_ord,.-ecp_sm2p256_div_by_2_mod_ord
.globl ecp_sm2p256_mul_by_3
.type ecp_sm2p256_mul_by_3,%function
.align 5
ecp_sm2p256_mul_by_3:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
adds x7,x7,x7
adcs x8,x8,x8
adcs x9,x9,x9
adcs x10,x10,x10
adcs x15,xzr,xzr
mov x3,x7
mov x4,x8
mov x5,x9
mov x6,x10
adrp x2,.Lpoly
add x2,x2,#:lo12:.Lpoly
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
subs x7,x7,x11
sbcs x8,x8,x12
sbcs x9,x9,x13
sbcs x10,x10,x14
sbcs x15,x15,xzr
csel x7,x7,x3,cs
csel x8,x8,x4,cs
csel x9,x9,x5,cs
csel x10,x10,x6,cs
eor x15,x15,x15
ldp x11,x12,[x1]
ldp x13,x14,[x1,#16]
adds x7,x7,x11
adcs x8,x8,x12
adcs x9,x9,x13
adcs x10,x10,x14
adcs x15,xzr,xzr
mov x3,x7
mov x4,x8
mov x5,x9
mov x6,x10
adrp x2,.Lpoly
add x2,x2,#:lo12:.Lpoly
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
subs x7,x7,x11
sbcs x8,x8,x12
sbcs x9,x9,x13
sbcs x10,x10,x14
sbcs x15,x15,xzr
csel x7,x7,x3,cs
csel x8,x8,x4,cs
csel x9,x9,x5,cs
csel x10,x10,x6,cs
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_mul_by_3,.-ecp_sm2p256_mul_by_3
.globl ecp_sm2p256_add
.type ecp_sm2p256_add,%function
.align 5
ecp_sm2p256_add:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
adds x7,x7,x11
adcs x8,x8,x12
adcs x9,x9,x13
adcs x10,x10,x14
adc x15,xzr,xzr
adrp x2,.Lpoly
add x2,x2,#:lo12:.Lpoly
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
mov x3,x7
mov x4,x8
mov x5,x9
mov x6,x10
subs x3,x3,x11
sbcs x4,x4,x12
sbcs x5,x5,x13
sbcs x6,x6,x14
sbcs x15,x15,xzr
csel x7,x7,x3,cc
csel x8,x8,x4,cc
csel x9,x9,x5,cc
csel x10,x10,x6,cc
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_add,.-ecp_sm2p256_add
.globl ecp_sm2p256_sub
.type ecp_sm2p256_sub,%function
.align 5
ecp_sm2p256_sub:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
subs x7,x7,x11
sbcs x8,x8,x12
sbcs x9,x9,x13
sbcs x10,x10,x14
sbc x15,xzr,xzr
adrp x2,.Lpoly
add x2,x2,#:lo12:.Lpoly
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
mov x3,x7
mov x4,x8
mov x5,x9
mov x6,x10
adds x3,x3,x11
adcs x4,x4,x12
adcs x5,x5,x13
adcs x6,x6,x14
tst x15,x15
csel x7,x7,x3,eq
csel x8,x8,x4,eq
csel x9,x9,x5,eq
csel x10,x10,x6,eq
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_sub,.-ecp_sm2p256_sub
.globl ecp_sm2p256_sub_mod_ord
.type ecp_sm2p256_sub_mod_ord,%function
.align 5
ecp_sm2p256_sub_mod_ord:
AARCH64_VALID_CALL_TARGET
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
subs x7,x7,x11
sbcs x8,x8,x12
sbcs x9,x9,x13
sbcs x10,x10,x14
sbc x15,xzr,xzr
adrp x2,.Lord
add x2,x2,#:lo12:.Lord
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
mov x3,x7
mov x4,x8
mov x5,x9
mov x6,x10
adds x3,x3,x11
adcs x4,x4,x12
adcs x5,x5,x13
adcs x6,x6,x14
tst x15,x15
csel x7,x7,x3,eq
csel x8,x8,x4,eq
csel x9,x9,x5,eq
csel x10,x10,x6,eq
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ret
.size ecp_sm2p256_sub_mod_ord,.-ecp_sm2p256_sub_mod_ord
.macro RDC
adds x5,x13,x14
adcs x4,xzr,xzr
adds x5,x5,x14
adcs x4,x4,xzr
adds x6,x11,x5
adcs x15,x4,xzr
adds x6,x6,x12
adcs x15,x15,xzr
adds x7,x7,x6
adcs x8,x8,x15
adcs x9,x9,x5
adcs x10,x10,x14
adcs x3,xzr,xzr
adds x10,x10,x4
adcs x3,x3,xzr
stp x7,x8,[sp,#32]
stp x9,x10,[sp,#48]
mov x4,#0xffffffff
mov x7,x11
mov x8,x12
mov x9,x13
mov x10,x14
and x7,x7,x4
and x8,x8,x4
and x9,x9,x4
and x10,x10,x4
lsr x11,x11,#32
lsr x12,x12,#32
lsr x13,x13,#32
lsr x14,x14,#32
add x4,x10,x9
add x5,x14,x13
add x6,x7,x11
add x15,x10,x8
add x14,x14,x12
add x9,x5,x4
add x8,x8,x9
add x8,x8,x9
add x8,x8,x6
add x8,x8,x12
add x9,x9,x13
add x9,x9,x12
add x9,x9,x7
add x6,x6,x10
add x6,x6,x13
add x11,x11,x5
add x12,x12,x11
add x12,x12,x5
add x4,x4,x15
lsl x7,x4,#32
extr x4,x9,x4,#32
extr x9,x15,x9,#32
extr x15,x8,x15,#32
lsr x8,x8,#32
adds x12,x12,x7
adcs x4,x4,xzr
adcs x11,x11,x9
adcs x14,x14,x15
adcs x3,x3,x8
ldp x7,x8,[sp,#32]
ldp x9,x10,[sp,#48]
adds x7,x7,x12
adcs x8,x8,x4
adcs x9,x9,x11
adcs x10,x10,x14
adcs x3,x3,xzr
subs x8,x8,x6
sbcs x9,x9,xzr
sbcs x10,x10,xzr
sbcs x3,x3,xzr
lsl x4,x3,#32
subs x5,x4,x3
adds x7,x7,x3
adcs x8,x8,x5
adcs x9,x9,xzr
adcs x10,x10,x4
mov x11,x7
mov x12,x8
mov x13,x9
mov x14,x10
adrp x3,.Lpoly
add x3,x3,#:lo12:.Lpoly
ldp x4,x5,[x3]
ldp x6,x15,[x3,#16]
adcs x16,xzr,xzr
subs x7,x7,x4
sbcs x8,x8,x5
sbcs x9,x9,x6
sbcs x10,x10,x15
sbcs x16,x16,xzr
csel x7,x7,x11,cs
csel x8,x8,x12,cs
csel x9,x9,x13,cs
csel x10,x10,x14,cs
.endm
.globl ecp_sm2p256_mul
.type ecp_sm2p256_mul,%function
.align 5
ecp_sm2p256_mul:
AARCH64_SIGN_LINK_REGISTER
stp x29,x30,[sp,#-80]!
add x29,sp,#0
stp x16,x17,[sp,#16]
stp x19,x20,[sp,#64]
ldp x7,x8,[x1]
ldp x9,x10,[x1,#16]
ldp x11,x12,[x2]
ldp x13,x14,[x2,#16]
mul x16,x7,x11
umulh x5,x7,x11
mul x3,x8,x11
umulh x4,x8,x11
adds x5,x5,x3
adcs x6,x4,xzr
mul x3,x7,x12
umulh x4,x7,x12
adds x5,x5,x3
adcs x6,x6,x4
adcs x15,xzr,xzr
mul x3,x9,x11
umulh x4,x9,x11
adds x6,x6,x3
adcs x15,x15,x4
mul x3,x8,x12
umulh x4,x8,x12
adds x6,x6,x3
adcs x15,x15,x4
adcs x17,xzr,xzr
mul x3,x7,x13
umulh x4,x7,x13
adds x6,x6,x3
adcs x15,x15,x4
adcs x17,x17,xzr
mul x3,x10,x11
umulh x4,x10,x11
adds x15,x15,x3
adcs x17,x17,x4
adcs x19,xzr,xzr
mul x3,x9,x12
umulh x4,x9,x12
adds x15,x15,x3
adcs x17,x17,x4
adcs x19,x19,xzr
mul x3,x8,x13
umulh x4,x8,x13
adds x15,x15,x3
adcs x17,x17,x4
adcs x19,x19,xzr
mul x3,x7,x14
umulh x4,x7,x14
adds x15,x15,x3
adcs x17,x17,x4
adcs x19,x19,xzr
mul x3,x10,x12
umulh x4,x10,x12
adds x17,x17,x3
adcs x19,x19,x4
adcs x20,xzr,xzr
mul x3,x9,x13
umulh x4,x9,x13
adds x17,x17,x3
adcs x19,x19,x4
adcs x20,x20,xzr
mul x3,x8,x14
umulh x4,x8,x14
adds x11,x17,x3
adcs x19,x19,x4
adcs x20,x20,xzr
mul x3,x10,x13
umulh x4,x10,x13
adds x19,x19,x3
adcs x20,x20,x4
adcs x17,xzr,xzr
mul x3,x9,x14
umulh x4,x9,x14
adds x12,x19,x3
adcs x20,x20,x4
adcs x17,x17,xzr
mul x3,x10,x14
umulh x4,x10,x14
adds x13,x20,x3
adcs x14,x17,x4
mov x7,x16
mov x8,x5
mov x9,x6
mov x10,x15
RDC
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ldp x16,x17,[sp,#16]
ldp x19,x20,[sp,#64]
ldp x29,x30,[sp],#80
AARCH64_VALIDATE_LINK_REGISTER
ret
.size ecp_sm2p256_mul,.-ecp_sm2p256_mul
.globl ecp_sm2p256_sqr
.type ecp_sm2p256_sqr,%function
.align 5
ecp_sm2p256_sqr:
AARCH64_SIGN_LINK_REGISTER
stp x29,x30,[sp,#-80]!
add x29,sp,#0
stp x16,x17,[sp,#16]
stp x19,x20,[sp,#64]
ldp x11,x12,[x1]
ldp x13,x14,[x1,#16]
mul x8,x11,x12
umulh x9,x11,x12
mul x3,x13,x11
umulh x10,x13,x11
adds x9,x9,x3
adcs x10,x10,xzr
mul x3,x14,x11
umulh x4,x14,x11
adds x10,x10,x3
adcs x7,x4,xzr
mul x3,x13,x12
umulh x4,x13,x12
adds x10,x10,x3
adcs x7,x7,x4
adcs x5,xzr,xzr
mul x3,x14,x12
umulh x4,x14,x12
adds x7,x7,x3
adcs x5,x5,x4
mul x3,x14,x13
umulh x4,x14,x13
adds x5,x5,x3
adcs x6,x4,xzr
adds x8,x8,x8
adcs x9,x9,x9
adcs x10,x10,x10
adcs x7,x7,x7
adcs x5,x5,x5
adcs x6,x6,x6
adcs x15,xzr,xzr
mul x16,x11,x11
umulh x17,x11,x11
mul x11,x12,x12
umulh x12,x12,x12
mul x3,x13,x13
umulh x4,x13,x13
mul x19,x14,x14
umulh x20,x14,x14
adds x8,x8,x17
adcs x9,x9,x11
adcs x10,x10,x12
adcs x7,x7,x3
adcs x5,x5,x4
adcs x6,x6,x19
adcs x15,x15,x20
mov x11,x7
mov x7,x16
mov x12,x5
mov x13,x6
mov x14,x15
RDC
stp x7,x8,[x0]
stp x9,x10,[x0,#16]
ldp x16,x17,[sp,#16]
ldp x19,x20,[sp,#64]
ldp x29,x30,[sp],#80
AARCH64_VALIDATE_LINK_REGISTER
ret
.size ecp_sm2p256_sqr,.-ecp_sm2p256_sqr