| ; This file is generated from a similarly-named Perl script in the BoringSSL |
| ; source tree. Do not edit by hand. |
| |
| %ifidn __OUTPUT_FORMAT__, win64 |
| default rel |
| %define XMMWORD |
| %define YMMWORD |
| %define ZMMWORD |
| %define _CET_ENDBR |
| |
| %ifdef BORINGSSL_PREFIX |
| %include "boringssl_prefix_symbols_internal_x86_64_win_asm.inc" |
| %endif |
| section .text code align=64 |
| |
| |
| ; The polynomial |
| section .rdata rdata align=8 |
| ALIGN 64 |
| p256_constants: |
| $L$poly: |
| DQ 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 |
| |
| $L$One: |
| DD 1,1,1,1,1,1,1,1 |
| $L$Two: |
| DD 2,2,2,2,2,2,2,2 |
| $L$Three: |
| DD 3,3,3,3,3,3,3,3 |
| $L$ONE_mont: |
| DQ 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe |
| |
| ; Constants for computations modulo ord(p256) |
| $L$ord: |
| DQ 0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000 |
| $L$ordK: |
| DQ 0xccd1c8aaee00bc4f |
| section .text code align=64 |
| |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_neg(uint64_t res[4], uint64_t a[4]); |
| global ecp_nistz256_neg |
| |
| ALIGN 32 |
| ecp_nistz256_neg: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_neg: |
| mov rdi,rcx |
| mov rsi,rdx |
| |
| |
| |
| _CET_ENDBR |
| push r12 |
| |
| push r13 |
| |
| $L$neg_body: |
| |
| xor r8,r8 |
| xor r9,r9 |
| xor r10,r10 |
| xor r11,r11 |
| xor r13,r13 |
| |
| sub r8,QWORD[rsi] |
| sbb r9,QWORD[8+rsi] |
| sbb r10,QWORD[16+rsi] |
| mov rax,r8 |
| sbb r11,QWORD[24+rsi] |
| lea rsi,[$L$poly] |
| mov rdx,r9 |
| sbb r13,0 |
| |
| add r8,QWORD[rsi] |
| mov rcx,r10 |
| adc r9,QWORD[8+rsi] |
| adc r10,QWORD[16+rsi] |
| mov r12,r11 |
| adc r11,QWORD[24+rsi] |
| test r13,r13 |
| |
| cmovz r8,rax |
| cmovz r9,rdx |
| mov QWORD[rdi],r8 |
| cmovz r10,rcx |
| mov QWORD[8+rdi],r9 |
| cmovz r11,r12 |
| mov QWORD[16+rdi],r10 |
| mov QWORD[24+rdi],r11 |
| |
| mov r13,QWORD[rsp] |
| |
| mov r12,QWORD[8+rsp] |
| |
| lea rsp,[16+rsp] |
| |
| $L$neg_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_neg: |
| ; ############################################################################### |
| ; void ecp_nistz256_ord_mul_mont( |
| ; uint64_t res[4], |
| ; uint64_t a[4], |
| ; uint64_t b[4]); |
| |
| global ecp_nistz256_ord_mul_mont_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_ord_mul_mont_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_ord_mul_mont_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$ord_mul_body: |
| |
| mov rax,QWORD[rdx] |
| mov rbx,rdx |
| lea r14,[$L$ord] |
| mov r15,QWORD[$L$ordK] |
| |
| ; ################################ * b[0] |
| mov rcx,rax |
| mul QWORD[rsi] |
| mov r8,rax |
| mov rax,rcx |
| mov r9,rdx |
| |
| mul QWORD[8+rsi] |
| add r9,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov r10,rdx |
| |
| mul QWORD[16+rsi] |
| add r10,rax |
| mov rax,rcx |
| adc rdx,0 |
| |
| mov r13,r8 |
| imul r8,r15 |
| |
| mov r11,rdx |
| mul QWORD[24+rsi] |
| add r11,rax |
| mov rax,r8 |
| adc rdx,0 |
| mov r12,rdx |
| |
| ; ################################ First reduction step |
| mul QWORD[r14] |
| mov rbp,r8 |
| add r13,rax ; guaranteed to be zero |
| mov rax,r8 |
| adc rdx,0 |
| mov rcx,rdx |
| |
| sub r10,r8 |
| sbb r8,0 ; can't borrow |
| |
| mul QWORD[8+r14] |
| add r9,rcx |
| adc rdx,0 |
| add r9,rax |
| mov rax,rbp |
| adc r10,rdx |
| mov rdx,rbp |
| adc r8,0 ; can't overflow |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r11,rax |
| mov rax,QWORD[8+rbx] |
| sbb rbp,rdx ; can't borrow |
| |
| add r11,r8 |
| adc r12,rbp |
| adc r13,0 |
| |
| ; ################################ * b[1] |
| mov rcx,rax |
| mul QWORD[rsi] |
| add r9,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[8+rsi] |
| add r10,rbp |
| adc rdx,0 |
| add r10,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[16+rsi] |
| add r11,rbp |
| adc rdx,0 |
| add r11,rax |
| mov rax,rcx |
| adc rdx,0 |
| |
| mov rcx,r9 |
| imul r9,r15 |
| |
| mov rbp,rdx |
| mul QWORD[24+rsi] |
| add r12,rbp |
| adc rdx,0 |
| xor r8,r8 |
| add r12,rax |
| mov rax,r9 |
| adc r13,rdx |
| adc r8,0 |
| |
| ; ################################ Second reduction step |
| mul QWORD[r14] |
| mov rbp,r9 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,r9 |
| adc rcx,rdx |
| |
| sub r11,r9 |
| sbb r9,0 ; can't borrow |
| |
| mul QWORD[8+r14] |
| add r10,rcx |
| adc rdx,0 |
| add r10,rax |
| mov rax,rbp |
| adc r11,rdx |
| mov rdx,rbp |
| adc r9,0 ; can't overflow |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r12,rax |
| mov rax,QWORD[16+rbx] |
| sbb rbp,rdx ; can't borrow |
| |
| add r12,r9 |
| adc r13,rbp |
| adc r8,0 |
| |
| ; ################################# * b[2] |
| mov rcx,rax |
| mul QWORD[rsi] |
| add r10,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[8+rsi] |
| add r11,rbp |
| adc rdx,0 |
| add r11,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[16+rsi] |
| add r12,rbp |
| adc rdx,0 |
| add r12,rax |
| mov rax,rcx |
| adc rdx,0 |
| |
| mov rcx,r10 |
| imul r10,r15 |
| |
| mov rbp,rdx |
| mul QWORD[24+rsi] |
| add r13,rbp |
| adc rdx,0 |
| xor r9,r9 |
| add r13,rax |
| mov rax,r10 |
| adc r8,rdx |
| adc r9,0 |
| |
| ; ################################ Third reduction step |
| mul QWORD[r14] |
| mov rbp,r10 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,r10 |
| adc rcx,rdx |
| |
| sub r12,r10 |
| sbb r10,0 ; can't borrow |
| |
| mul QWORD[8+r14] |
| add r11,rcx |
| adc rdx,0 |
| add r11,rax |
| mov rax,rbp |
| adc r12,rdx |
| mov rdx,rbp |
| adc r10,0 ; can't overflow |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r13,rax |
| mov rax,QWORD[24+rbx] |
| sbb rbp,rdx ; can't borrow |
| |
| add r13,r10 |
| adc r8,rbp |
| adc r9,0 |
| |
| ; ################################ * b[3] |
| mov rcx,rax |
| mul QWORD[rsi] |
| add r11,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[8+rsi] |
| add r12,rbp |
| adc rdx,0 |
| add r12,rax |
| mov rax,rcx |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul QWORD[16+rsi] |
| add r13,rbp |
| adc rdx,0 |
| add r13,rax |
| mov rax,rcx |
| adc rdx,0 |
| |
| mov rcx,r11 |
| imul r11,r15 |
| |
| mov rbp,rdx |
| mul QWORD[24+rsi] |
| add r8,rbp |
| adc rdx,0 |
| xor r10,r10 |
| add r8,rax |
| mov rax,r11 |
| adc r9,rdx |
| adc r10,0 |
| |
| ; ################################ Last reduction step |
| mul QWORD[r14] |
| mov rbp,r11 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,r11 |
| adc rcx,rdx |
| |
| sub r13,r11 |
| sbb r11,0 ; can't borrow |
| |
| mul QWORD[8+r14] |
| add r12,rcx |
| adc rdx,0 |
| add r12,rax |
| mov rax,rbp |
| adc r13,rdx |
| mov rdx,rbp |
| adc r11,0 ; can't overflow |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r8,rax |
| sbb rbp,rdx ; can't borrow |
| |
| add r8,r11 |
| adc r9,rbp |
| adc r10,0 |
| |
| ; ################################ Subtract ord |
| mov rsi,r12 |
| sub r12,QWORD[r14] |
| mov r11,r13 |
| sbb r13,QWORD[8+r14] |
| mov rcx,r8 |
| sbb r8,QWORD[16+r14] |
| mov rbp,r9 |
| sbb r9,QWORD[24+r14] |
| sbb r10,0 |
| |
| cmovc r12,rsi |
| cmovc r13,r11 |
| cmovc r8,rcx |
| cmovc r9,rbp |
| |
| mov QWORD[rdi],r12 |
| mov QWORD[8+rdi],r13 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$ord_mul_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_ord_mul_mont_nohw: |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_ord_sqr_mont( |
| ; uint64_t res[4], |
| ; uint64_t a[4], |
| ; uint64_t rep); |
| |
| global ecp_nistz256_ord_sqr_mont_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_ord_sqr_mont_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_ord_sqr_mont_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$ord_sqr_body: |
| |
| mov r8,QWORD[rsi] |
| mov rax,QWORD[8+rsi] |
| mov r14,QWORD[16+rsi] |
| mov r15,QWORD[24+rsi] |
| lea rsi,[$L$ord] ; pointer to modulus |
| mov rbx,rdx |
| jmp NEAR $L$oop_ord_sqr |
| |
| ALIGN 32 |
| $L$oop_ord_sqr: |
| ; ################################ a[1:] * a[0] |
| mov rbp,rax ; put aside a[1] |
| mul r8 ; a[1] * a[0] |
| mov r9,rax |
| movq xmm1,rbp ; offload a[1] |
| mov rax,r14 |
| mov r10,rdx |
| |
| mul r8 ; a[2] * a[0] |
| add r10,rax |
| mov rax,r15 |
| movq xmm2,r14 ; offload a[2] |
| adc rdx,0 |
| mov r11,rdx |
| |
| mul r8 ; a[3] * a[0] |
| add r11,rax |
| mov rax,r15 |
| movq xmm3,r15 ; offload a[3] |
| adc rdx,0 |
| mov r12,rdx |
| |
| ; ################################ a[3] * a[2] |
| mul r14 ; a[3] * a[2] |
| mov r13,rax |
| mov rax,r14 |
| mov r14,rdx |
| |
| ; ################################ a[2:] * a[1] |
| mul rbp ; a[2] * a[1] |
| add r11,rax |
| mov rax,r15 |
| adc rdx,0 |
| mov r15,rdx |
| |
| mul rbp ; a[3] * a[1] |
| add r12,rax |
| adc rdx,0 |
| |
| add r12,r15 |
| adc r13,rdx |
| adc r14,0 ; can't overflow |
| |
| ; ################################ *2 |
| xor r15,r15 |
| mov rax,r8 |
| add r9,r9 |
| adc r10,r10 |
| adc r11,r11 |
| adc r12,r12 |
| adc r13,r13 |
| adc r14,r14 |
| adc r15,0 |
| |
| ; ################################ Missing products |
| mul rax ; a[0] * a[0] |
| mov r8,rax |
| movq rax,xmm1 |
| mov rbp,rdx |
| |
| mul rax ; a[1] * a[1] |
| add r9,rbp |
| adc r10,rax |
| movq rax,xmm2 |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul rax ; a[2] * a[2] |
| add r11,rbp |
| adc r12,rax |
| movq rax,xmm3 |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mov rcx,r8 |
| imul r8,QWORD[32+rsi] ; *= .LordK |
| |
| mul rax ; a[3] * a[3] |
| add r13,rbp |
| adc r14,rax |
| mov rax,QWORD[rsi] ; modulus[0] |
| adc r15,rdx ; can't overflow |
| |
| ; ################################ First reduction step |
| mul r8 |
| mov rbp,r8 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,QWORD[8+rsi] ; modulus[1] |
| adc rcx,rdx |
| |
| sub r10,r8 |
| sbb rbp,0 ; can't borrow |
| |
| mul r8 |
| add r9,rcx |
| adc rdx,0 |
| add r9,rax |
| mov rax,r8 |
| adc r10,rdx |
| mov rdx,r8 |
| adc rbp,0 ; can't overflow |
| |
| mov rcx,r9 |
| imul r9,QWORD[32+rsi] ; *= .LordK |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r11,rax |
| mov rax,QWORD[rsi] |
| sbb r8,rdx ; can't borrow |
| |
| add r11,rbp |
| adc r8,0 ; can't overflow |
| |
| ; ################################ Second reduction step |
| mul r9 |
| mov rbp,r9 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,QWORD[8+rsi] |
| adc rcx,rdx |
| |
| sub r11,r9 |
| sbb rbp,0 ; can't borrow |
| |
| mul r9 |
| add r10,rcx |
| adc rdx,0 |
| add r10,rax |
| mov rax,r9 |
| adc r11,rdx |
| mov rdx,r9 |
| adc rbp,0 ; can't overflow |
| |
| mov rcx,r10 |
| imul r10,QWORD[32+rsi] ; *= .LordK |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r8,rax |
| mov rax,QWORD[rsi] |
| sbb r9,rdx ; can't borrow |
| |
| add r8,rbp |
| adc r9,0 ; can't overflow |
| |
| ; ################################ Third reduction step |
| mul r10 |
| mov rbp,r10 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,QWORD[8+rsi] |
| adc rcx,rdx |
| |
| sub r8,r10 |
| sbb rbp,0 ; can't borrow |
| |
| mul r10 |
| add r11,rcx |
| adc rdx,0 |
| add r11,rax |
| mov rax,r10 |
| adc r8,rdx |
| mov rdx,r10 |
| adc rbp,0 ; can't overflow |
| |
| mov rcx,r11 |
| imul r11,QWORD[32+rsi] ; *= .LordK |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r9,rax |
| mov rax,QWORD[rsi] |
| sbb r10,rdx ; can't borrow |
| |
| add r9,rbp |
| adc r10,0 ; can't overflow |
| |
| ; ################################ Last reduction step |
| mul r11 |
| mov rbp,r11 |
| add rcx,rax ; guaranteed to be zero |
| mov rax,QWORD[8+rsi] |
| adc rcx,rdx |
| |
| sub r9,r11 |
| sbb rbp,0 ; can't borrow |
| |
| mul r11 |
| add r8,rcx |
| adc rdx,0 |
| add r8,rax |
| mov rax,r11 |
| adc r9,rdx |
| mov rdx,r11 |
| adc rbp,0 ; can't overflow |
| |
| shl rax,32 |
| shr rdx,32 |
| sub r10,rax |
| sbb r11,rdx ; can't borrow |
| |
| add r10,rbp |
| adc r11,0 ; can't overflow |
| |
| ; ################################ Add bits [511:256] of the sqr result |
| xor rdx,rdx |
| add r8,r12 |
| adc r9,r13 |
| mov r12,r8 |
| adc r10,r14 |
| adc r11,r15 |
| mov rax,r9 |
| adc rdx,0 |
| |
| ; ################################ Compare to modulus |
| sub r8,QWORD[rsi] |
| mov r14,r10 |
| sbb r9,QWORD[8+rsi] |
| sbb r10,QWORD[16+rsi] |
| mov r15,r11 |
| sbb r11,QWORD[24+rsi] |
| sbb rdx,0 |
| |
| cmovc r8,r12 |
| cmovnc rax,r9 |
| cmovnc r14,r10 |
| cmovnc r15,r11 |
| |
| dec rbx |
| jnz NEAR $L$oop_ord_sqr |
| |
| mov QWORD[rdi],r8 |
| mov QWORD[8+rdi],rax |
| pxor xmm1,xmm1 |
| mov QWORD[16+rdi],r14 |
| pxor xmm2,xmm2 |
| mov QWORD[24+rdi],r15 |
| pxor xmm3,xmm3 |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$ord_sqr_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_ord_sqr_mont_nohw: |
| ; ############################################################################### |
| global ecp_nistz256_ord_mul_mont_adx |
| |
| ALIGN 32 |
| ecp_nistz256_ord_mul_mont_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_ord_mul_mont_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| $L$ecp_nistz256_ord_mul_mont_adx: |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$ord_mulx_body: |
| |
| mov rbx,rdx |
| mov rdx,QWORD[rdx] |
| mov r9,QWORD[rsi] |
| mov r10,QWORD[8+rsi] |
| mov r11,QWORD[16+rsi] |
| mov r12,QWORD[24+rsi] |
| lea rsi,[((-128))+rsi] ; control u-op density |
| lea r14,[(($L$ord-128))] |
| mov r15,QWORD[$L$ordK] |
| |
| ; ################################ Multiply by b[0] |
| mulx r9,r8,r9 |
| mulx r10,rcx,r10 |
| mulx r11,rbp,r11 |
| add r9,rcx |
| mulx r12,rcx,r12 |
| mov rdx,r8 |
| mulx rax,rdx,r15 |
| adc r10,rbp |
| adc r11,rcx |
| adc r12,0 |
| |
| ; ################################ reduction |
| xor r13,r13 ; %r13=0, cf=0, of=0 |
| mulx rbp,rcx,QWORD[((0+128))+r14] |
| adcx r8,rcx ; guaranteed to be zero |
| adox r9,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+r14] |
| adcx r9,rcx |
| adox r10,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+r14] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+r14] |
| mov rdx,QWORD[8+rbx] |
| adcx r11,rcx |
| adox r12,rbp |
| adcx r12,r8 |
| adox r13,r8 |
| adc r13,0 ; cf=0, of=0 |
| |
| ; ################################ Multiply by b[1] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r9,rcx |
| adox r10,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r9 |
| mulx rax,rdx,r15 |
| adcx r12,rcx |
| adox r13,rbp |
| |
| adcx r13,r8 |
| adox r8,r8 |
| adc r8,0 ; cf=0, of=0 |
| |
| ; ################################ reduction |
| mulx rbp,rcx,QWORD[((0+128))+r14] |
| adcx r9,rcx ; guaranteed to be zero |
| adox r10,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+r14] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+r14] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+r14] |
| mov rdx,QWORD[16+rbx] |
| adcx r12,rcx |
| adox r13,rbp |
| adcx r13,r9 |
| adox r8,r9 |
| adc r8,0 ; cf=0, of=0 |
| |
| ; ################################ Multiply by b[2] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r10 |
| mulx rax,rdx,r15 |
| adcx r13,rcx |
| adox r8,rbp |
| |
| adcx r8,r9 |
| adox r9,r9 |
| adc r9,0 ; cf=0, of=0 |
| |
| ; ################################ reduction |
| mulx rbp,rcx,QWORD[((0+128))+r14] |
| adcx r10,rcx ; guaranteed to be zero |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+r14] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+r14] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+r14] |
| mov rdx,QWORD[24+rbx] |
| adcx r13,rcx |
| adox r8,rbp |
| adcx r8,r10 |
| adox r9,r10 |
| adc r9,0 ; cf=0, of=0 |
| |
| ; ################################ Multiply by b[3] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r13,rcx |
| adox r8,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r11 |
| mulx rax,rdx,r15 |
| adcx r8,rcx |
| adox r9,rbp |
| |
| adcx r9,r10 |
| adox r10,r10 |
| adc r10,0 ; cf=0, of=0 |
| |
| ; ################################ reduction |
| mulx rbp,rcx,QWORD[((0+128))+r14] |
| adcx r11,rcx ; guaranteed to be zero |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+r14] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+r14] |
| adcx r13,rcx |
| adox r8,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+r14] |
| lea r14,[128+r14] |
| mov rbx,r12 |
| adcx r8,rcx |
| adox r9,rbp |
| mov rdx,r13 |
| adcx r9,r11 |
| adox r10,r11 |
| adc r10,0 |
| |
| ; ################################ |
| ; Branch-less conditional subtraction of P |
| mov rcx,r8 |
| sub r12,QWORD[r14] |
| sbb r13,QWORD[8+r14] |
| sbb r8,QWORD[16+r14] |
| mov rbp,r9 |
| sbb r9,QWORD[24+r14] |
| sbb r10,0 |
| |
| cmovc r12,rbx |
| cmovc r13,rdx |
| cmovc r8,rcx |
| cmovc r9,rbp |
| |
| mov QWORD[rdi],r12 |
| mov QWORD[8+rdi],r13 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$ord_mulx_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_ord_mul_mont_adx: |
| |
| global ecp_nistz256_ord_sqr_mont_adx |
| |
| ALIGN 32 |
| ecp_nistz256_ord_sqr_mont_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_ord_sqr_mont_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| $L$ecp_nistz256_ord_sqr_mont_adx: |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$ord_sqrx_body: |
| |
| mov rbx,rdx |
| mov rdx,QWORD[rsi] |
| mov r14,QWORD[8+rsi] |
| mov r15,QWORD[16+rsi] |
| mov r8,QWORD[24+rsi] |
| lea rsi,[$L$ord] |
| jmp NEAR $L$oop_ord_sqrx |
| |
| ALIGN 32 |
| $L$oop_ord_sqrx: |
| mulx r10,r9,r14 ; a[0]*a[1] |
| mulx r11,rcx,r15 ; a[0]*a[2] |
| mov rax,rdx ; offload a[0] |
| movq xmm1,r14 ; offload a[1] |
| mulx r12,rbp,r8 ; a[0]*a[3] |
| mov rdx,r14 |
| add r10,rcx |
| movq xmm2,r15 ; offload a[2] |
| adc r11,rbp |
| adc r12,0 |
| xor r13,r13 ; %r13=0,cf=0,of=0 |
| ; ################################ |
| mulx rbp,rcx,r15 ; a[1]*a[2] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,r8 ; a[1]*a[3] |
| mov rdx,r15 |
| adcx r12,rcx |
| adox r13,rbp |
| adc r13,0 |
| ; ################################ |
| mulx r14,rcx,r8 ; a[2]*a[3] |
| mov rdx,rax |
| movq xmm3,r8 ; offload a[3] |
| xor r15,r15 ; %r15=0,cf=0,of=0 |
| adcx r9,r9 ; acc1:6<<1 |
| adox r13,rcx |
| adcx r10,r10 |
| adox r14,r15 ; of=0 |
| |
| ; ################################ a[i]*a[i] |
| mulx rbp,r8,rdx |
| movq rdx,xmm1 |
| adcx r11,r11 |
| adox r9,rbp |
| adcx r12,r12 |
| mulx rax,rcx,rdx |
| movq rdx,xmm2 |
| adcx r13,r13 |
| adox r10,rcx |
| adcx r14,r14 |
| mulx rbp,rcx,rdx |
| DB 0x67 |
| movq rdx,xmm3 |
| adox r11,rax |
| adcx r15,r15 |
| adox r12,rcx |
| adox r13,rbp |
| mulx rax,rcx,rdx |
| adox r14,rcx |
| adox r15,rax |
| |
| ; ################################ reduction |
| mov rdx,r8 |
| mulx rcx,rdx,QWORD[32+rsi] |
| |
| xor rax,rax ; cf=0, of=0 |
| mulx rbp,rcx,QWORD[rsi] |
| adcx r8,rcx ; guaranteed to be zero |
| adox r9,rbp |
| mulx rbp,rcx,QWORD[8+rsi] |
| adcx r9,rcx |
| adox r10,rbp |
| mulx rbp,rcx,QWORD[16+rsi] |
| adcx r10,rcx |
| adox r11,rbp |
| mulx rbp,rcx,QWORD[24+rsi] |
| adcx r11,rcx |
| adox r8,rbp ; of=0 |
| adcx r8,rax ; cf=0 |
| |
| ; ################################ |
| mov rdx,r9 |
| mulx rcx,rdx,QWORD[32+rsi] |
| |
| mulx rbp,rcx,QWORD[rsi] |
| adox r9,rcx ; guaranteed to be zero |
| adcx r10,rbp |
| mulx rbp,rcx,QWORD[8+rsi] |
| adox r10,rcx |
| adcx r11,rbp |
| mulx rbp,rcx,QWORD[16+rsi] |
| adox r11,rcx |
| adcx r8,rbp |
| mulx rbp,rcx,QWORD[24+rsi] |
| adox r8,rcx |
| adcx r9,rbp ; cf=0 |
| adox r9,rax ; of=0 |
| |
| ; ################################ |
| mov rdx,r10 |
| mulx rcx,rdx,QWORD[32+rsi] |
| |
| mulx rbp,rcx,QWORD[rsi] |
| adcx r10,rcx ; guaranteed to be zero |
| adox r11,rbp |
| mulx rbp,rcx,QWORD[8+rsi] |
| adcx r11,rcx |
| adox r8,rbp |
| mulx rbp,rcx,QWORD[16+rsi] |
| adcx r8,rcx |
| adox r9,rbp |
| mulx rbp,rcx,QWORD[24+rsi] |
| adcx r9,rcx |
| adox r10,rbp ; of=0 |
| adcx r10,rax ; cf=0 |
| |
| ; ################################ |
| mov rdx,r11 |
| mulx rcx,rdx,QWORD[32+rsi] |
| |
| mulx rbp,rcx,QWORD[rsi] |
| adox r11,rcx ; guaranteed to be zero |
| adcx r8,rbp |
| mulx rbp,rcx,QWORD[8+rsi] |
| adox r8,rcx |
| adcx r9,rbp |
| mulx rbp,rcx,QWORD[16+rsi] |
| adox r9,rcx |
| adcx r10,rbp |
| mulx rbp,rcx,QWORD[24+rsi] |
| adox r10,rcx |
| adcx r11,rbp |
| adox r11,rax |
| |
| ; ################################ accumulate upper half |
| add r12,r8 ; add %r12, %r8 |
| adc r9,r13 |
| mov rdx,r12 |
| adc r10,r14 |
| adc r11,r15 |
| mov r14,r9 |
| adc rax,0 |
| |
| ; ################################ compare to modulus |
| sub r12,QWORD[rsi] |
| mov r15,r10 |
| sbb r9,QWORD[8+rsi] |
| sbb r10,QWORD[16+rsi] |
| mov r8,r11 |
| sbb r11,QWORD[24+rsi] |
| sbb rax,0 |
| |
| cmovnc rdx,r12 |
| cmovnc r14,r9 |
| cmovnc r15,r10 |
| cmovnc r8,r11 |
| |
| dec rbx |
| jnz NEAR $L$oop_ord_sqrx |
| |
| mov QWORD[rdi],rdx |
| mov QWORD[8+rdi],r14 |
| pxor xmm1,xmm1 |
| mov QWORD[16+rdi],r15 |
| pxor xmm2,xmm2 |
| mov QWORD[24+rdi],r8 |
| pxor xmm3,xmm3 |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$ord_sqrx_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_ord_sqr_mont_adx: |
| ; ############################################################################### |
| ; void ecp_nistz256_mul_mont( |
| ; uint64_t res[4], |
| ; uint64_t a[4], |
| ; uint64_t b[4]); |
| |
| global ecp_nistz256_mul_mont_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_mul_mont_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_mul_mont_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$mul_body: |
| mov rbx,rdx |
| mov rax,QWORD[rdx] |
| mov r9,QWORD[rsi] |
| mov r10,QWORD[8+rsi] |
| mov r11,QWORD[16+rsi] |
| mov r12,QWORD[24+rsi] |
| |
| call __ecp_nistz256_mul_montq |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$mul_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_mul_mont_nohw: |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_mul_montq: |
| |
| ; ####################################################################### |
| ; Multiply a by b[0] |
| mov rbp,rax |
| mul r9 |
| mov r14,QWORD[(($L$poly+8))] |
| mov r8,rax |
| mov rax,rbp |
| mov r9,rdx |
| |
| mul r10 |
| mov r15,QWORD[(($L$poly+24))] |
| add r9,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov r10,rdx |
| |
| mul r11 |
| add r10,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov r11,rdx |
| |
| mul r12 |
| add r11,rax |
| mov rax,r8 |
| adc rdx,0 |
| xor r13,r13 |
| mov r12,rdx |
| |
| ; ####################################################################### |
| ; First reduction step |
| ; Basically now we want to multiply acc[0] by p256, |
| ; and add the result to the acc. |
| ; Due to the special form of p256 we do some optimizations |
| ; |
| ; acc[0] x p256[0..1] = acc[0] x 2^96 - acc[0] |
| ; then we add acc[0] and get acc[0] x 2^96 |
| |
| mov rbp,r8 |
| shl r8,32 |
| mul r15 |
| shr rbp,32 |
| add r9,r8 ; +=acc[0]<<96 |
| adc r10,rbp |
| adc r11,rax |
| mov rax,QWORD[8+rbx] |
| adc r12,rdx |
| adc r13,0 |
| xor r8,r8 |
| |
| ; ####################################################################### |
| ; Multiply by b[1] |
| mov rbp,rax |
| mul QWORD[rsi] |
| add r9,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[8+rsi] |
| add r10,rcx |
| adc rdx,0 |
| add r10,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[16+rsi] |
| add r11,rcx |
| adc rdx,0 |
| add r11,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[24+rsi] |
| add r12,rcx |
| adc rdx,0 |
| add r12,rax |
| mov rax,r9 |
| adc r13,rdx |
| adc r8,0 |
| |
| ; ####################################################################### |
| ; Second reduction step |
| mov rbp,r9 |
| shl r9,32 |
| mul r15 |
| shr rbp,32 |
| add r10,r9 |
| adc r11,rbp |
| adc r12,rax |
| mov rax,QWORD[16+rbx] |
| adc r13,rdx |
| adc r8,0 |
| xor r9,r9 |
| |
| ; ####################################################################### |
| ; Multiply by b[2] |
| mov rbp,rax |
| mul QWORD[rsi] |
| add r10,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[8+rsi] |
| add r11,rcx |
| adc rdx,0 |
| add r11,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[16+rsi] |
| add r12,rcx |
| adc rdx,0 |
| add r12,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[24+rsi] |
| add r13,rcx |
| adc rdx,0 |
| add r13,rax |
| mov rax,r10 |
| adc r8,rdx |
| adc r9,0 |
| |
| ; ####################################################################### |
| ; Third reduction step |
| mov rbp,r10 |
| shl r10,32 |
| mul r15 |
| shr rbp,32 |
| add r11,r10 |
| adc r12,rbp |
| adc r13,rax |
| mov rax,QWORD[24+rbx] |
| adc r8,rdx |
| adc r9,0 |
| xor r10,r10 |
| |
| ; ####################################################################### |
| ; Multiply by b[3] |
| mov rbp,rax |
| mul QWORD[rsi] |
| add r11,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[8+rsi] |
| add r12,rcx |
| adc rdx,0 |
| add r12,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[16+rsi] |
| add r13,rcx |
| adc rdx,0 |
| add r13,rax |
| mov rax,rbp |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul QWORD[24+rsi] |
| add r8,rcx |
| adc rdx,0 |
| add r8,rax |
| mov rax,r11 |
| adc r9,rdx |
| adc r10,0 |
| |
| ; ####################################################################### |
| ; Final reduction step |
| mov rbp,r11 |
| shl r11,32 |
| mul r15 |
| shr rbp,32 |
| add r12,r11 |
| adc r13,rbp |
| mov rcx,r12 |
| adc r8,rax |
| adc r9,rdx |
| mov rbp,r13 |
| adc r10,0 |
| |
| ; ####################################################################### |
| ; Branch-less conditional subtraction of P |
| sub r12,-1 ; .Lpoly[0] |
| mov rbx,r8 |
| sbb r13,r14 ; .Lpoly[1] |
| sbb r8,0 ; .Lpoly[2] |
| mov rdx,r9 |
| sbb r9,r15 ; .Lpoly[3] |
| sbb r10,0 |
| |
| cmovc r12,rcx |
| cmovc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovc r8,rbx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,rdx |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_sqr_mont( |
| ; uint64_t res[4], |
| ; uint64_t a[4]); |
| |
| ; we optimize the square according to S.Gueron and V.Krasnov, |
| ; "Speeding up Big-Number Squaring" |
| global ecp_nistz256_sqr_mont_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_sqr_mont_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_sqr_mont_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$sqr_body: |
| mov rax,QWORD[rsi] |
| mov r14,QWORD[8+rsi] |
| mov r15,QWORD[16+rsi] |
| mov r8,QWORD[24+rsi] |
| |
| call __ecp_nistz256_sqr_montq |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$sqr_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_sqr_mont_nohw: |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_sqr_montq: |
| |
| mov r13,rax |
| mul r14 ; a[1]*a[0] |
| mov r9,rax |
| mov rax,r15 |
| mov r10,rdx |
| |
| mul r13 ; a[0]*a[2] |
| add r10,rax |
| mov rax,r8 |
| adc rdx,0 |
| mov r11,rdx |
| |
| mul r13 ; a[0]*a[3] |
| add r11,rax |
| mov rax,r15 |
| adc rdx,0 |
| mov r12,rdx |
| |
| ; ################################ |
| mul r14 ; a[1]*a[2] |
| add r11,rax |
| mov rax,r8 |
| adc rdx,0 |
| mov rbp,rdx |
| |
| mul r14 ; a[1]*a[3] |
| add r12,rax |
| mov rax,r8 |
| adc rdx,0 |
| add r12,rbp |
| mov r13,rdx |
| adc r13,0 |
| |
| ; ################################ |
| mul r15 ; a[2]*a[3] |
| xor r15,r15 |
| add r13,rax |
| mov rax,QWORD[rsi] |
| mov r14,rdx |
| adc r14,0 |
| |
| add r9,r9 ; acc1:6<<1 |
| adc r10,r10 |
| adc r11,r11 |
| adc r12,r12 |
| adc r13,r13 |
| adc r14,r14 |
| adc r15,0 |
| |
| mul rax |
| mov r8,rax |
| mov rax,QWORD[8+rsi] |
| mov rcx,rdx |
| |
| mul rax |
| add r9,rcx |
| adc r10,rax |
| mov rax,QWORD[16+rsi] |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul rax |
| add r11,rcx |
| adc r12,rax |
| mov rax,QWORD[24+rsi] |
| adc rdx,0 |
| mov rcx,rdx |
| |
| mul rax |
| add r13,rcx |
| adc r14,rax |
| mov rax,r8 |
| adc r15,rdx |
| |
| mov rsi,QWORD[(($L$poly+8))] |
| mov rbp,QWORD[(($L$poly+24))] |
| |
| ; ######################################### |
| ; Now the reduction |
| ; First iteration |
| mov rcx,r8 |
| shl r8,32 |
| mul rbp |
| shr rcx,32 |
| add r9,r8 ; +=acc[0]<<96 |
| adc r10,rcx |
| adc r11,rax |
| mov rax,r9 |
| adc rdx,0 |
| |
| ; ######################################### |
| ; Second iteration |
| mov rcx,r9 |
| shl r9,32 |
| mov r8,rdx |
| mul rbp |
| shr rcx,32 |
| add r10,r9 |
| adc r11,rcx |
| adc r8,rax |
| mov rax,r10 |
| adc rdx,0 |
| |
| ; ######################################### |
| ; Third iteration |
| mov rcx,r10 |
| shl r10,32 |
| mov r9,rdx |
| mul rbp |
| shr rcx,32 |
| add r11,r10 |
| adc r8,rcx |
| adc r9,rax |
| mov rax,r11 |
| adc rdx,0 |
| |
| ; ########################################## |
| ; Last iteration |
| mov rcx,r11 |
| shl r11,32 |
| mov r10,rdx |
| mul rbp |
| shr rcx,32 |
| add r8,r11 |
| adc r9,rcx |
| adc r10,rax |
| adc rdx,0 |
| xor r11,r11 |
| |
| ; ########################################### |
| ; Add the rest of the acc |
| add r12,r8 |
| adc r13,r9 |
| mov r8,r12 |
| adc r14,r10 |
| adc r15,rdx |
| mov r9,r13 |
| adc r11,0 |
| |
| sub r12,-1 ; .Lpoly[0] |
| mov r10,r14 |
| sbb r13,rsi ; .Lpoly[1] |
| sbb r14,0 ; .Lpoly[2] |
| mov rcx,r15 |
| sbb r15,rbp ; .Lpoly[3] |
| sbb r11,0 |
| |
| cmovc r12,r8 |
| cmovc r13,r9 |
| mov QWORD[rdi],r12 |
| cmovc r14,r10 |
| mov QWORD[8+rdi],r13 |
| cmovc r15,rcx |
| mov QWORD[16+rdi],r14 |
| mov QWORD[24+rdi],r15 |
| |
| ret |
| |
| |
| global ecp_nistz256_mul_mont_adx |
| |
| ALIGN 32 |
| ecp_nistz256_mul_mont_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_mul_mont_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$mulx_body: |
| mov rbx,rdx |
| mov rdx,QWORD[rdx] |
| mov r9,QWORD[rsi] |
| mov r10,QWORD[8+rsi] |
| mov r11,QWORD[16+rsi] |
| mov r12,QWORD[24+rsi] |
| lea rsi,[((-128))+rsi] ; control u-op density |
| |
| call __ecp_nistz256_mul_montx |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$mulx_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_mul_mont_adx: |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_mul_montx: |
| |
| ; ####################################################################### |
| ; Multiply by b[0] |
| mulx r9,r8,r9 |
| mulx r10,rcx,r10 |
| mov r14,32 |
| xor r13,r13 ; cf=0 |
| mulx r11,rbp,r11 |
| mov r15,QWORD[(($L$poly+24))] |
| adc r9,rcx |
| mulx r12,rcx,r12 |
| mov rdx,r8 |
| adc r10,rbp |
| shlx rbp,r8,r14 |
| adc r11,rcx |
| shrx rcx,r8,r14 |
| adc r12,0 |
| |
| ; ####################################################################### |
| ; First reduction step |
| add r9,rbp |
| adc r10,rcx |
| |
| mulx rbp,rcx,r15 |
| mov rdx,QWORD[8+rbx] |
| adc r11,rcx |
| adc r12,rbp |
| adc r13,0 |
| xor r8,r8 ; %r8=0,cf=0,of=0 |
| |
| ; ####################################################################### |
| ; Multiply by b[1] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r9,rcx |
| adox r10,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r9 |
| adcx r12,rcx |
| shlx rcx,r9,r14 |
| adox r13,rbp |
| shrx rbp,r9,r14 |
| |
| adcx r13,r8 |
| adox r8,r8 |
| adc r8,0 |
| |
| ; ####################################################################### |
| ; Second reduction step |
| add r10,rcx |
| adc r11,rbp |
| |
| mulx rbp,rcx,r15 |
| mov rdx,QWORD[16+rbx] |
| adc r12,rcx |
| adc r13,rbp |
| adc r8,0 |
| xor r9,r9 ; %r9=0,cf=0,of=0 |
| |
| ; ####################################################################### |
| ; Multiply by b[2] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r10,rcx |
| adox r11,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r10 |
| adcx r13,rcx |
| shlx rcx,r10,r14 |
| adox r8,rbp |
| shrx rbp,r10,r14 |
| |
| adcx r8,r9 |
| adox r9,r9 |
| adc r9,0 |
| |
| ; ####################################################################### |
| ; Third reduction step |
| add r11,rcx |
| adc r12,rbp |
| |
| mulx rbp,rcx,r15 |
| mov rdx,QWORD[24+rbx] |
| adc r13,rcx |
| adc r8,rbp |
| adc r9,0 |
| xor r10,r10 ; %r10=0,cf=0,of=0 |
| |
| ; ####################################################################### |
| ; Multiply by b[3] |
| mulx rbp,rcx,QWORD[((0+128))+rsi] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,QWORD[((8+128))+rsi] |
| adcx r12,rcx |
| adox r13,rbp |
| |
| mulx rbp,rcx,QWORD[((16+128))+rsi] |
| adcx r13,rcx |
| adox r8,rbp |
| |
| mulx rbp,rcx,QWORD[((24+128))+rsi] |
| mov rdx,r11 |
| adcx r8,rcx |
| shlx rcx,r11,r14 |
| adox r9,rbp |
| shrx rbp,r11,r14 |
| |
| adcx r9,r10 |
| adox r10,r10 |
| adc r10,0 |
| |
| ; ####################################################################### |
| ; Fourth reduction step |
| add r12,rcx |
| adc r13,rbp |
| |
| mulx rbp,rcx,r15 |
| mov rbx,r12 |
| mov r14,QWORD[(($L$poly+8))] |
| adc r8,rcx |
| mov rdx,r13 |
| adc r9,rbp |
| adc r10,0 |
| |
| ; ####################################################################### |
| ; Branch-less conditional subtraction of P |
| xor eax,eax |
| mov rcx,r8 |
| sbb r12,-1 ; .Lpoly[0] |
| sbb r13,r14 ; .Lpoly[1] |
| sbb r8,0 ; .Lpoly[2] |
| mov rbp,r9 |
| sbb r9,r15 ; .Lpoly[3] |
| sbb r10,0 |
| |
| cmovc r12,rbx |
| cmovc r13,rdx |
| mov QWORD[rdi],r12 |
| cmovc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,rbp |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| global ecp_nistz256_sqr_mont_adx |
| |
| ALIGN 32 |
| ecp_nistz256_sqr_mont_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_sqr_mont_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| $L$sqrx_body: |
| mov rdx,QWORD[rsi] |
| mov r14,QWORD[8+rsi] |
| mov r15,QWORD[16+rsi] |
| mov r8,QWORD[24+rsi] |
| lea rsi,[((-128))+rsi] ; control u-op density |
| |
| call __ecp_nistz256_sqr_montx |
| |
| mov r15,QWORD[rsp] |
| |
| mov r14,QWORD[8+rsp] |
| |
| mov r13,QWORD[16+rsp] |
| |
| mov r12,QWORD[24+rsp] |
| |
| mov rbx,QWORD[32+rsp] |
| |
| mov rbp,QWORD[40+rsp] |
| |
| lea rsp,[48+rsp] |
| |
| $L$sqrx_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_sqr_mont_adx: |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_sqr_montx: |
| |
| mulx r10,r9,r14 ; a[0]*a[1] |
| mulx r11,rcx,r15 ; a[0]*a[2] |
| xor eax,eax |
| adc r10,rcx |
| mulx r12,rbp,r8 ; a[0]*a[3] |
| mov rdx,r14 |
| adc r11,rbp |
| adc r12,0 |
| xor r13,r13 ; %r13=0,cf=0,of=0 |
| |
| ; ################################ |
| mulx rbp,rcx,r15 ; a[1]*a[2] |
| adcx r11,rcx |
| adox r12,rbp |
| |
| mulx rbp,rcx,r8 ; a[1]*a[3] |
| mov rdx,r15 |
| adcx r12,rcx |
| adox r13,rbp |
| adc r13,0 |
| |
| ; ################################ |
| mulx r14,rcx,r8 ; a[2]*a[3] |
| mov rdx,QWORD[((0+128))+rsi] |
| xor r15,r15 ; %r15=0,cf=0,of=0 |
| adcx r9,r9 ; acc1:6<<1 |
| adox r13,rcx |
| adcx r10,r10 |
| adox r14,r15 ; of=0 |
| |
| mulx rbp,r8,rdx |
| mov rdx,QWORD[((8+128))+rsi] |
| adcx r11,r11 |
| adox r9,rbp |
| adcx r12,r12 |
| mulx rax,rcx,rdx |
| mov rdx,QWORD[((16+128))+rsi] |
| adcx r13,r13 |
| adox r10,rcx |
| adcx r14,r14 |
| DB 0x67 |
| mulx rbp,rcx,rdx |
| mov rdx,QWORD[((24+128))+rsi] |
| adox r11,rax |
| adcx r15,r15 |
| adox r12,rcx |
| mov rsi,32 |
| adox r13,rbp |
| DB 0x67,0x67 |
| mulx rax,rcx,rdx |
| mov rdx,QWORD[(($L$poly+24))] |
| adox r14,rcx |
| shlx rcx,r8,rsi |
| adox r15,rax |
| shrx rax,r8,rsi |
| mov rbp,rdx |
| |
| ; reduction step 1 |
| add r9,rcx |
| adc r10,rax |
| |
| mulx r8,rcx,r8 |
| adc r11,rcx |
| shlx rcx,r9,rsi |
| adc r8,0 |
| shrx rax,r9,rsi |
| |
| ; reduction step 2 |
| add r10,rcx |
| adc r11,rax |
| |
| mulx r9,rcx,r9 |
| adc r8,rcx |
| shlx rcx,r10,rsi |
| adc r9,0 |
| shrx rax,r10,rsi |
| |
| ; reduction step 3 |
| add r11,rcx |
| adc r8,rax |
| |
| mulx r10,rcx,r10 |
| adc r9,rcx |
| shlx rcx,r11,rsi |
| adc r10,0 |
| shrx rax,r11,rsi |
| |
| ; reduction step 4 |
| add r8,rcx |
| adc r9,rax |
| |
| mulx r11,rcx,r11 |
| adc r10,rcx |
| adc r11,0 |
| |
| xor rdx,rdx |
| add r12,r8 ; accumulate upper half |
| mov rsi,QWORD[(($L$poly+8))] |
| adc r13,r9 |
| mov r8,r12 |
| adc r14,r10 |
| adc r15,r11 |
| mov r9,r13 |
| adc rdx,0 |
| |
| sub r12,-1 ; .Lpoly[0] |
| mov r10,r14 |
| sbb r13,rsi ; .Lpoly[1] |
| sbb r14,0 ; .Lpoly[2] |
| mov r11,r15 |
| sbb r15,rbp ; .Lpoly[3] |
| sbb rdx,0 |
| |
| cmovc r12,r8 |
| cmovc r13,r9 |
| mov QWORD[rdi],r12 |
| cmovc r14,r10 |
| mov QWORD[8+rdi],r13 |
| cmovc r15,r11 |
| mov QWORD[16+rdi],r14 |
| mov QWORD[24+rdi],r15 |
| |
| ret |
| |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_select_w5_nohw(uint64_t *val, uint64_t *in_t, int index); |
| global ecp_nistz256_select_w5_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_select_w5_nohw: |
| |
| _CET_ENDBR |
| lea rax,[((-136))+rsp] |
| $L$SEH_begin_ecp_nistz256_select_w5_nohw: |
| DB 0x48,0x8d,0x60,0xe0 ; lea -0x20(%rax), %rsp |
| DB 0x0f,0x29,0x70,0xe0 ; movaps %xmm6, -0x20(%rax) |
| DB 0x0f,0x29,0x78,0xf0 ; movaps %xmm7, -0x10(%rax) |
| DB 0x44,0x0f,0x29,0x00 ; movaps %xmm8, 0(%rax) |
| DB 0x44,0x0f,0x29,0x48,0x10 ; movaps %xmm9, 0x10(%rax) |
| DB 0x44,0x0f,0x29,0x50,0x20 ; movaps %xmm10, 0x20(%rax) |
| DB 0x44,0x0f,0x29,0x58,0x30 ; movaps %xmm11, 0x30(%rax) |
| DB 0x44,0x0f,0x29,0x60,0x40 ; movaps %xmm12, 0x40(%rax) |
| DB 0x44,0x0f,0x29,0x68,0x50 ; movaps %xmm13, 0x50(%rax) |
| DB 0x44,0x0f,0x29,0x70,0x60 ; movaps %xmm14, 0x60(%rax) |
| DB 0x44,0x0f,0x29,0x78,0x70 ; movaps %xmm15, 0x70(%rax) |
| movdqa xmm0,XMMWORD[$L$One] |
| movd xmm1,r8d |
| |
| pxor xmm2,xmm2 |
| pxor xmm3,xmm3 |
| pxor xmm4,xmm4 |
| pxor xmm5,xmm5 |
| pxor xmm6,xmm6 |
| pxor xmm7,xmm7 |
| |
| movdqa xmm8,xmm0 |
| pshufd xmm1,xmm1,0 |
| |
| mov rax,16 |
| $L$select_loop_sse_w5: |
| |
| movdqa xmm15,xmm8 |
| paddd xmm8,xmm0 |
| pcmpeqd xmm15,xmm1 |
| |
| movdqa xmm9,XMMWORD[rdx] |
| movdqa xmm10,XMMWORD[16+rdx] |
| movdqa xmm11,XMMWORD[32+rdx] |
| movdqa xmm12,XMMWORD[48+rdx] |
| movdqa xmm13,XMMWORD[64+rdx] |
| movdqa xmm14,XMMWORD[80+rdx] |
| lea rdx,[96+rdx] |
| |
| pand xmm9,xmm15 |
| pand xmm10,xmm15 |
| por xmm2,xmm9 |
| pand xmm11,xmm15 |
| por xmm3,xmm10 |
| pand xmm12,xmm15 |
| por xmm4,xmm11 |
| pand xmm13,xmm15 |
| por xmm5,xmm12 |
| pand xmm14,xmm15 |
| por xmm6,xmm13 |
| por xmm7,xmm14 |
| |
| dec rax |
| jnz NEAR $L$select_loop_sse_w5 |
| |
| movdqu XMMWORD[rcx],xmm2 |
| movdqu XMMWORD[16+rcx],xmm3 |
| movdqu XMMWORD[32+rcx],xmm4 |
| movdqu XMMWORD[48+rcx],xmm5 |
| movdqu XMMWORD[64+rcx],xmm6 |
| movdqu XMMWORD[80+rcx],xmm7 |
| movaps xmm6,XMMWORD[rsp] |
| movaps xmm7,XMMWORD[16+rsp] |
| movaps xmm8,XMMWORD[32+rsp] |
| movaps xmm9,XMMWORD[48+rsp] |
| movaps xmm10,XMMWORD[64+rsp] |
| movaps xmm11,XMMWORD[80+rsp] |
| movaps xmm12,XMMWORD[96+rsp] |
| movaps xmm13,XMMWORD[112+rsp] |
| movaps xmm14,XMMWORD[128+rsp] |
| movaps xmm15,XMMWORD[144+rsp] |
| lea rsp,[168+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_select_w5_nohw: |
| |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_select_w7_nohw(uint64_t *val, uint64_t *in_t, int index); |
| global ecp_nistz256_select_w7_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_select_w7_nohw: |
| |
| _CET_ENDBR |
| lea rax,[((-136))+rsp] |
| $L$SEH_begin_ecp_nistz256_select_w7_nohw: |
| DB 0x48,0x8d,0x60,0xe0 ; lea -0x20(%rax), %rsp |
| DB 0x0f,0x29,0x70,0xe0 ; movaps %xmm6, -0x20(%rax) |
| DB 0x0f,0x29,0x78,0xf0 ; movaps %xmm7, -0x10(%rax) |
| DB 0x44,0x0f,0x29,0x00 ; movaps %xmm8, 0(%rax) |
| DB 0x44,0x0f,0x29,0x48,0x10 ; movaps %xmm9, 0x10(%rax) |
| DB 0x44,0x0f,0x29,0x50,0x20 ; movaps %xmm10, 0x20(%rax) |
| DB 0x44,0x0f,0x29,0x58,0x30 ; movaps %xmm11, 0x30(%rax) |
| DB 0x44,0x0f,0x29,0x60,0x40 ; movaps %xmm12, 0x40(%rax) |
| DB 0x44,0x0f,0x29,0x68,0x50 ; movaps %xmm13, 0x50(%rax) |
| DB 0x44,0x0f,0x29,0x70,0x60 ; movaps %xmm14, 0x60(%rax) |
| DB 0x44,0x0f,0x29,0x78,0x70 ; movaps %xmm15, 0x70(%rax) |
| movdqa xmm8,XMMWORD[$L$One] |
| movd xmm1,r8d |
| |
| pxor xmm2,xmm2 |
| pxor xmm3,xmm3 |
| pxor xmm4,xmm4 |
| pxor xmm5,xmm5 |
| |
| movdqa xmm0,xmm8 |
| pshufd xmm1,xmm1,0 |
| mov rax,64 |
| |
| $L$select_loop_sse_w7: |
| movdqa xmm15,xmm8 |
| paddd xmm8,xmm0 |
| movdqa xmm9,XMMWORD[rdx] |
| movdqa xmm10,XMMWORD[16+rdx] |
| pcmpeqd xmm15,xmm1 |
| movdqa xmm11,XMMWORD[32+rdx] |
| movdqa xmm12,XMMWORD[48+rdx] |
| lea rdx,[64+rdx] |
| |
| pand xmm9,xmm15 |
| pand xmm10,xmm15 |
| por xmm2,xmm9 |
| pand xmm11,xmm15 |
| por xmm3,xmm10 |
| pand xmm12,xmm15 |
| por xmm4,xmm11 |
| prefetcht0 [255+rdx] |
| por xmm5,xmm12 |
| |
| dec rax |
| jnz NEAR $L$select_loop_sse_w7 |
| |
| movdqu XMMWORD[rcx],xmm2 |
| movdqu XMMWORD[16+rcx],xmm3 |
| movdqu XMMWORD[32+rcx],xmm4 |
| movdqu XMMWORD[48+rcx],xmm5 |
| movaps xmm6,XMMWORD[rsp] |
| movaps xmm7,XMMWORD[16+rsp] |
| movaps xmm8,XMMWORD[32+rsp] |
| movaps xmm9,XMMWORD[48+rsp] |
| movaps xmm10,XMMWORD[64+rsp] |
| movaps xmm11,XMMWORD[80+rsp] |
| movaps xmm12,XMMWORD[96+rsp] |
| movaps xmm13,XMMWORD[112+rsp] |
| movaps xmm14,XMMWORD[128+rsp] |
| movaps xmm15,XMMWORD[144+rsp] |
| lea rsp,[168+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_select_w7_nohw: |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_select_w5_avx2(uint64_t *val, uint64_t *in_t, int index); |
| global ecp_nistz256_select_w5_avx2 |
| |
| ALIGN 32 |
| ecp_nistz256_select_w5_avx2: |
| |
| _CET_ENDBR |
| vzeroupper |
| lea rax,[((-136))+rsp] |
| mov r11,rsp |
| $L$SEH_begin_ecp_nistz256_select_w5_avx2: |
| DB 0x48,0x8d,0x60,0xe0 ; lea -0x20(%rax), %rsp |
| DB 0xc5,0xf8,0x29,0x70,0xe0 ; vmovaps %xmm6, -0x20(%rax) |
| DB 0xc5,0xf8,0x29,0x78,0xf0 ; vmovaps %xmm7, -0x10(%rax) |
| DB 0xc5,0x78,0x29,0x40,0x00 ; vmovaps %xmm8, 8(%rax) |
| DB 0xc5,0x78,0x29,0x48,0x10 ; vmovaps %xmm9, 0x10(%rax) |
| DB 0xc5,0x78,0x29,0x50,0x20 ; vmovaps %xmm10, 0x20(%rax) |
| DB 0xc5,0x78,0x29,0x58,0x30 ; vmovaps %xmm11, 0x30(%rax) |
| DB 0xc5,0x78,0x29,0x60,0x40 ; vmovaps %xmm12, 0x40(%rax) |
| DB 0xc5,0x78,0x29,0x68,0x50 ; vmovaps %xmm13, 0x50(%rax) |
| DB 0xc5,0x78,0x29,0x70,0x60 ; vmovaps %xmm14, 0x60(%rax) |
| DB 0xc5,0x78,0x29,0x78,0x70 ; vmovaps %xmm15, 0x70(%rax) |
| vmovdqa ymm0,YMMWORD[$L$Two] |
| |
| vpxor ymm2,ymm2,ymm2 |
| vpxor ymm3,ymm3,ymm3 |
| vpxor ymm4,ymm4,ymm4 |
| |
| vmovdqa ymm5,YMMWORD[$L$One] |
| vmovdqa ymm10,YMMWORD[$L$Two] |
| |
| vmovd xmm1,r8d |
| vpermd ymm1,ymm2,ymm1 |
| |
| mov rax,8 |
| $L$select_loop_avx2_w5: |
| |
| vmovdqa ymm6,YMMWORD[rdx] |
| vmovdqa ymm7,YMMWORD[32+rdx] |
| vmovdqa ymm8,YMMWORD[64+rdx] |
| |
| vmovdqa ymm11,YMMWORD[96+rdx] |
| vmovdqa ymm12,YMMWORD[128+rdx] |
| vmovdqa ymm13,YMMWORD[160+rdx] |
| |
| vpcmpeqd ymm9,ymm5,ymm1 |
| vpcmpeqd ymm14,ymm10,ymm1 |
| |
| vpaddd ymm5,ymm5,ymm0 |
| vpaddd ymm10,ymm10,ymm0 |
| lea rdx,[192+rdx] |
| |
| vpand ymm6,ymm6,ymm9 |
| vpand ymm7,ymm7,ymm9 |
| vpand ymm8,ymm8,ymm9 |
| vpand ymm11,ymm11,ymm14 |
| vpand ymm12,ymm12,ymm14 |
| vpand ymm13,ymm13,ymm14 |
| |
| vpxor ymm2,ymm2,ymm6 |
| vpxor ymm3,ymm3,ymm7 |
| vpxor ymm4,ymm4,ymm8 |
| vpxor ymm2,ymm2,ymm11 |
| vpxor ymm3,ymm3,ymm12 |
| vpxor ymm4,ymm4,ymm13 |
| |
| dec rax |
| jnz NEAR $L$select_loop_avx2_w5 |
| |
| vmovdqu YMMWORD[rcx],ymm2 |
| vmovdqu YMMWORD[32+rcx],ymm3 |
| vmovdqu YMMWORD[64+rcx],ymm4 |
| vzeroupper |
| movaps xmm6,XMMWORD[rsp] |
| movaps xmm7,XMMWORD[16+rsp] |
| movaps xmm8,XMMWORD[32+rsp] |
| movaps xmm9,XMMWORD[48+rsp] |
| movaps xmm10,XMMWORD[64+rsp] |
| movaps xmm11,XMMWORD[80+rsp] |
| movaps xmm12,XMMWORD[96+rsp] |
| movaps xmm13,XMMWORD[112+rsp] |
| movaps xmm14,XMMWORD[128+rsp] |
| movaps xmm15,XMMWORD[144+rsp] |
| lea rsp,[r11] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_select_w5_avx2: |
| |
| |
| ; ############################################################################### |
| ; void ecp_nistz256_select_w7_avx2(uint64_t *val, uint64_t *in_t, int index); |
| global ecp_nistz256_select_w7_avx2 |
| |
| ALIGN 32 |
| ecp_nistz256_select_w7_avx2: |
| |
| _CET_ENDBR |
| vzeroupper |
| mov r11,rsp |
| lea rax,[((-136))+rsp] |
| $L$SEH_begin_ecp_nistz256_select_w7_avx2: |
| DB 0x48,0x8d,0x60,0xe0 ; lea -0x20(%rax), %rsp |
| DB 0xc5,0xf8,0x29,0x70,0xe0 ; vmovaps %xmm6, -0x20(%rax) |
| DB 0xc5,0xf8,0x29,0x78,0xf0 ; vmovaps %xmm7, -0x10(%rax) |
| DB 0xc5,0x78,0x29,0x40,0x00 ; vmovaps %xmm8, 8(%rax) |
| DB 0xc5,0x78,0x29,0x48,0x10 ; vmovaps %xmm9, 0x10(%rax) |
| DB 0xc5,0x78,0x29,0x50,0x20 ; vmovaps %xmm10, 0x20(%rax) |
| DB 0xc5,0x78,0x29,0x58,0x30 ; vmovaps %xmm11, 0x30(%rax) |
| DB 0xc5,0x78,0x29,0x60,0x40 ; vmovaps %xmm12, 0x40(%rax) |
| DB 0xc5,0x78,0x29,0x68,0x50 ; vmovaps %xmm13, 0x50(%rax) |
| DB 0xc5,0x78,0x29,0x70,0x60 ; vmovaps %xmm14, 0x60(%rax) |
| DB 0xc5,0x78,0x29,0x78,0x70 ; vmovaps %xmm15, 0x70(%rax) |
| vmovdqa ymm0,YMMWORD[$L$Three] |
| |
| vpxor ymm2,ymm2,ymm2 |
| vpxor ymm3,ymm3,ymm3 |
| |
| vmovdqa ymm4,YMMWORD[$L$One] |
| vmovdqa ymm8,YMMWORD[$L$Two] |
| vmovdqa ymm12,YMMWORD[$L$Three] |
| |
| vmovd xmm1,r8d |
| vpermd ymm1,ymm2,ymm1 |
| ; Skip index = 0, because it is implicitly the point at infinity |
| |
| mov rax,21 |
| $L$select_loop_avx2_w7: |
| |
| vmovdqa ymm5,YMMWORD[rdx] |
| vmovdqa ymm6,YMMWORD[32+rdx] |
| |
| vmovdqa ymm9,YMMWORD[64+rdx] |
| vmovdqa ymm10,YMMWORD[96+rdx] |
| |
| vmovdqa ymm13,YMMWORD[128+rdx] |
| vmovdqa ymm14,YMMWORD[160+rdx] |
| |
| vpcmpeqd ymm7,ymm4,ymm1 |
| vpcmpeqd ymm11,ymm8,ymm1 |
| vpcmpeqd ymm15,ymm12,ymm1 |
| |
| vpaddd ymm4,ymm4,ymm0 |
| vpaddd ymm8,ymm8,ymm0 |
| vpaddd ymm12,ymm12,ymm0 |
| lea rdx,[192+rdx] |
| |
| vpand ymm5,ymm5,ymm7 |
| vpand ymm6,ymm6,ymm7 |
| vpand ymm9,ymm9,ymm11 |
| vpand ymm10,ymm10,ymm11 |
| vpand ymm13,ymm13,ymm15 |
| vpand ymm14,ymm14,ymm15 |
| |
| vpxor ymm2,ymm2,ymm5 |
| vpxor ymm3,ymm3,ymm6 |
| vpxor ymm2,ymm2,ymm9 |
| vpxor ymm3,ymm3,ymm10 |
| vpxor ymm2,ymm2,ymm13 |
| vpxor ymm3,ymm3,ymm14 |
| |
| dec rax |
| jnz NEAR $L$select_loop_avx2_w7 |
| |
| |
| vmovdqa ymm5,YMMWORD[rdx] |
| vmovdqa ymm6,YMMWORD[32+rdx] |
| |
| vpcmpeqd ymm7,ymm4,ymm1 |
| |
| vpand ymm5,ymm5,ymm7 |
| vpand ymm6,ymm6,ymm7 |
| |
| vpxor ymm2,ymm2,ymm5 |
| vpxor ymm3,ymm3,ymm6 |
| |
| vmovdqu YMMWORD[rcx],ymm2 |
| vmovdqu YMMWORD[32+rcx],ymm3 |
| vzeroupper |
| movaps xmm6,XMMWORD[rsp] |
| movaps xmm7,XMMWORD[16+rsp] |
| movaps xmm8,XMMWORD[32+rsp] |
| movaps xmm9,XMMWORD[48+rsp] |
| movaps xmm10,XMMWORD[64+rsp] |
| movaps xmm11,XMMWORD[80+rsp] |
| movaps xmm12,XMMWORD[96+rsp] |
| movaps xmm13,XMMWORD[112+rsp] |
| movaps xmm14,XMMWORD[128+rsp] |
| movaps xmm15,XMMWORD[144+rsp] |
| lea rsp,[r11] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_select_w7_avx2: |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_add_toq: |
| |
| xor r11,r11 |
| add r12,QWORD[rbx] |
| adc r13,QWORD[8+rbx] |
| mov rax,r12 |
| adc r8,QWORD[16+rbx] |
| adc r9,QWORD[24+rbx] |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| cmovc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_sub_fromq: |
| |
| sub r12,QWORD[rbx] |
| sbb r13,QWORD[8+rbx] |
| mov rax,r12 |
| sbb r8,QWORD[16+rbx] |
| sbb r9,QWORD[24+rbx] |
| mov rbp,r13 |
| sbb r11,r11 |
| |
| add r12,-1 |
| mov rcx,r8 |
| adc r13,r14 |
| adc r8,0 |
| mov r10,r9 |
| adc r9,r15 |
| test r11,r11 |
| |
| cmovz r12,rax |
| cmovz r13,rbp |
| mov QWORD[rdi],r12 |
| cmovz r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovz r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_subq: |
| |
| sub rax,r12 |
| sbb rbp,r13 |
| mov r12,rax |
| sbb rcx,r8 |
| sbb r10,r9 |
| mov r13,rbp |
| sbb r11,r11 |
| |
| add rax,-1 |
| mov r8,rcx |
| adc rbp,r14 |
| adc rcx,0 |
| mov r9,r10 |
| adc r10,r15 |
| test r11,r11 |
| |
| cmovnz r12,rax |
| cmovnz r13,rbp |
| cmovnz r8,rcx |
| cmovnz r9,r10 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_mul_by_2q: |
| |
| xor r11,r11 |
| add r12,r12 ; a0:a3+a0:a3 |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| cmovc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| global ecp_nistz256_point_double_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_point_double_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_double_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*5+8 |
| |
| $L$point_doubleq_body: |
| |
| $L$point_double_shortcutq: |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi.x |
| mov rbx,rsi ; backup copy |
| movdqu xmm1,XMMWORD[16+rsi] |
| mov r12,QWORD[((32+0))+rsi] ; load in_y in "5-4-0-1" order |
| mov r13,QWORD[((32+8))+rsi] |
| mov r8,QWORD[((32+16))+rsi] |
| mov r9,QWORD[((32+24))+rsi] |
| mov r14,QWORD[(($L$poly+8))] |
| mov r15,QWORD[(($L$poly+24))] |
| movdqa XMMWORD[96+rsp],xmm0 |
| movdqa XMMWORD[(96+16)+rsp],xmm1 |
| lea r10,[32+rdi] |
| lea r11,[64+rdi] |
| movq xmm0,rdi |
| movq xmm1,r10 |
| movq xmm2,r11 |
| |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_by_2q ; p256_mul_by_2(S, in_y); |
| |
| mov rax,QWORD[((64+0))+rsi] |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| lea rsi,[((64-0))+rsi] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Zsqr, in_z); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((0+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| lea rdi,[rsp] |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(S, S); |
| |
| mov rax,QWORD[32+rbx] ; %rbx is still valid |
| mov r9,QWORD[((64+0))+rbx] |
| mov r10,QWORD[((64+8))+rbx] |
| mov r11,QWORD[((64+16))+rbx] |
| mov r12,QWORD[((64+24))+rbx] |
| lea rsi,[((64-0))+rbx] |
| lea rbx,[32+rbx] |
| movq rdi,xmm2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(res_z, in_z, in_y); |
| call __ecp_nistz256_mul_by_2q ; p256_mul_by_2(res_z, res_z); |
| |
| mov r12,QWORD[((96+0))+rsp] ; "5-4-0-1" order |
| mov r13,QWORD[((96+8))+rsp] |
| lea rbx,[64+rsp] |
| mov r8,QWORD[((96+16))+rsp] |
| mov r9,QWORD[((96+24))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_add_toq ; p256_add(M, in_x, Zsqr); |
| |
| mov r12,QWORD[((96+0))+rsp] ; "5-4-0-1" order |
| mov r13,QWORD[((96+8))+rsp] |
| lea rbx,[64+rsp] |
| mov r8,QWORD[((96+16))+rsp] |
| mov r9,QWORD[((96+24))+rsp] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_sub_fromq ; p256_sub(Zsqr, in_x, Zsqr); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((0+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| movq rdi,xmm1 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(res_y, S); |
| xor r9,r9 |
| mov rax,r12 |
| add r12,-1 |
| mov r10,r13 |
| adc r13,rsi |
| mov rcx,r14 |
| adc r14,0 |
| mov r8,r15 |
| adc r15,rbp |
| adc r9,0 |
| xor rsi,rsi ; borrow %rsi |
| test rax,1 |
| |
| cmovz r12,rax |
| cmovz r13,r10 |
| cmovz r14,rcx |
| cmovz r15,r8 |
| cmovz r9,rsi |
| |
| mov rax,r13 ; a0:a3>>1 |
| shr r12,1 |
| shl rax,63 |
| mov r10,r14 |
| shr r13,1 |
| or r12,rax |
| shl r10,63 |
| mov rcx,r15 |
| shr r14,1 |
| or r13,r10 |
| shl rcx,63 |
| mov QWORD[rdi],r12 |
| shr r15,1 |
| mov QWORD[8+rdi],r13 |
| shl r9,63 |
| or r14,rcx |
| or r15,r9 |
| mov QWORD[16+rdi],r14 |
| mov QWORD[24+rdi],r15 |
| mov rax,QWORD[64+rsp] |
| lea rbx,[64+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(M, M, Zsqr); |
| |
| lea rdi,[128+rsp] |
| call __ecp_nistz256_mul_by_2q |
| |
| lea rbx,[32+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_add_toq ; p256_mul_by_3(M, M); |
| |
| mov rax,QWORD[96+rsp] |
| lea rbx,[96+rsp] |
| mov r9,QWORD[((0+0))+rsp] |
| mov r10,QWORD[((8+0))+rsp] |
| lea rsi,[((0+0))+rsp] |
| mov r11,QWORD[((16+0))+rsp] |
| mov r12,QWORD[((24+0))+rsp] |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S, S, in_x); |
| |
| lea rdi,[128+rsp] |
| call __ecp_nistz256_mul_by_2q ; p256_mul_by_2(tmp0, S); |
| |
| mov rax,QWORD[((0+32))+rsp] |
| mov r14,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r15,QWORD[((16+32))+rsp] |
| mov r8,QWORD[((24+32))+rsp] |
| movq rdi,xmm0 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(res_x, M); |
| |
| lea rbx,[128+rsp] |
| mov r8,r14 ; harmonize sqr output and sub input |
| mov r9,r15 |
| mov r14,rsi |
| mov r15,rbp |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_x, res_x, tmp0); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov rbp,QWORD[((0+8))+rsp] |
| mov rcx,QWORD[((0+16))+rsp] |
| mov r10,QWORD[((0+24))+rsp] ; "4-5-0-1" order |
| lea rdi,[rsp] |
| call __ecp_nistz256_subq ; p256_sub(S, S, res_x); |
| |
| mov rax,QWORD[32+rsp] |
| lea rbx,[32+rsp] |
| mov r14,r12 ; harmonize sub output and mul input |
| xor ecx,ecx |
| mov QWORD[((0+0))+rsp],r12 ; have to save:-( |
| mov r10,r13 |
| mov QWORD[((0+8))+rsp],r13 |
| cmovz r11,r8 |
| mov QWORD[((0+16))+rsp],r8 |
| lea rsi,[((0-0))+rsp] |
| cmovz r12,r9 |
| mov QWORD[((0+24))+rsp],r9 |
| mov r9,r14 |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S, S, M); |
| |
| movq rbx,xmm1 |
| movq rdi,xmm1 |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_y, S, res_y); |
| |
| lea rsi,[((160+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$point_doubleq_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_double_nohw: |
| global ecp_nistz256_point_add_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_point_add_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_add_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*18+8 |
| |
| $L$point_addq_body: |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| movdqu xmm3,XMMWORD[48+rsi] |
| movdqu xmm4,XMMWORD[64+rsi] |
| movdqu xmm5,XMMWORD[80+rsi] |
| mov rbx,rsi ; reassign |
| mov rsi,rdx ; reassign |
| movdqa XMMWORD[384+rsp],xmm0 |
| movdqa XMMWORD[(384+16)+rsp],xmm1 |
| movdqa XMMWORD[416+rsp],xmm2 |
| movdqa XMMWORD[(416+16)+rsp],xmm3 |
| movdqa XMMWORD[448+rsp],xmm4 |
| movdqa XMMWORD[(448+16)+rsp],xmm5 |
| por xmm5,xmm4 |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rbx |
| pshufd xmm3,xmm5,0xb1 |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| por xmm5,xmm3 |
| movdqu xmm3,XMMWORD[48+rsi] |
| mov rax,QWORD[((64+0))+rsi] ; load original in2_z |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| movdqa XMMWORD[480+rsp],xmm0 |
| pshufd xmm4,xmm5,0x1e |
| movdqa XMMWORD[(480+16)+rsp],xmm1 |
| movdqu xmm0,XMMWORD[64+rsi] ; in2_z again |
| movdqu xmm1,XMMWORD[80+rsi] |
| movdqa XMMWORD[512+rsp],xmm2 |
| movdqa XMMWORD[(512+16)+rsp],xmm3 |
| por xmm5,xmm4 |
| pxor xmm4,xmm4 |
| por xmm1,xmm0 |
| movq xmm0,rdi ; save %rdi |
| |
| lea rsi,[((64-0))+rsi] ; %rsi is still valid |
| mov QWORD[((544+0))+rsp],rax ; make in2_z copy |
| mov QWORD[((544+8))+rsp],r14 |
| mov QWORD[((544+16))+rsp],r15 |
| mov QWORD[((544+24))+rsp],r8 |
| lea rdi,[96+rsp] ; Z2^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Z2sqr, in2_z); |
| |
| pcmpeqd xmm5,xmm4 |
| pshufd xmm4,xmm1,0xb1 |
| por xmm4,xmm1 |
| pshufd xmm5,xmm5,0 ; in1infty |
| pshufd xmm3,xmm4,0x1e |
| por xmm4,xmm3 |
| pxor xmm3,xmm3 |
| pcmpeqd xmm4,xmm3 |
| pshufd xmm4,xmm4,0 ; in2infty |
| mov rax,QWORD[((64+0))+rbx] ; load original in1_z |
| mov r14,QWORD[((64+8))+rbx] |
| mov r15,QWORD[((64+16))+rbx] |
| mov r8,QWORD[((64+24))+rbx] |
| movq xmm1,rbx |
| |
| lea rsi,[((64-0))+rbx] |
| lea rdi,[32+rsp] ; Z1^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Z1sqr, in1_z); |
| |
| mov rax,QWORD[544+rsp] |
| lea rbx,[544+rsp] |
| mov r9,QWORD[((0+96))+rsp] |
| mov r10,QWORD[((8+96))+rsp] |
| lea rsi,[((0+96))+rsp] |
| mov r11,QWORD[((16+96))+rsp] |
| mov r12,QWORD[((24+96))+rsp] |
| lea rdi,[224+rsp] ; S1 = Z2^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S1, Z2sqr, in2_z); |
| |
| mov rax,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[256+rsp] ; S2 = Z1^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, Z1sqr, in1_z); |
| |
| mov rax,QWORD[416+rsp] |
| lea rbx,[416+rsp] |
| mov r9,QWORD[((0+224))+rsp] |
| mov r10,QWORD[((8+224))+rsp] |
| lea rsi,[((0+224))+rsp] |
| mov r11,QWORD[((16+224))+rsp] |
| mov r12,QWORD[((24+224))+rsp] |
| lea rdi,[224+rsp] ; S1 = Y1*Z2^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S1, S1, in1_y); |
| |
| mov rax,QWORD[512+rsp] |
| lea rbx,[512+rsp] |
| mov r9,QWORD[((0+256))+rsp] |
| mov r10,QWORD[((8+256))+rsp] |
| lea rsi,[((0+256))+rsp] |
| mov r11,QWORD[((16+256))+rsp] |
| mov r12,QWORD[((24+256))+rsp] |
| lea rdi,[256+rsp] ; S2 = Y2*Z1^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, S2, in2_y); |
| |
| lea rbx,[224+rsp] |
| lea rdi,[64+rsp] ; R = S2 - S1 |
| call __ecp_nistz256_sub_fromq ; p256_sub(R, S2, S1); |
| |
| or r12,r13 ; see if result is zero |
| movdqa xmm2,xmm4 |
| or r12,r8 |
| or r12,r9 |
| por xmm2,xmm5 ; in1infty || in2infty |
| movq xmm3,r12 |
| |
| mov rax,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+96))+rsp] |
| mov r10,QWORD[((8+96))+rsp] |
| lea rsi,[((0+96))+rsp] |
| mov r11,QWORD[((16+96))+rsp] |
| mov r12,QWORD[((24+96))+rsp] |
| lea rdi,[160+rsp] ; U1 = X1*Z2^2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(U1, in1_x, Z2sqr); |
| |
| mov rax,QWORD[480+rsp] |
| lea rbx,[480+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[192+rsp] ; U2 = X2*Z1^2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(U2, in2_x, Z1sqr); |
| |
| lea rbx,[160+rsp] |
| lea rdi,[rsp] ; H = U2 - U1 |
| call __ecp_nistz256_sub_fromq ; p256_sub(H, U2, U1); |
| |
| or r12,r13 ; see if result is zero |
| or r12,r8 |
| or r12,r9 ; !is_equal(U1, U2) |
| |
| movq r8,xmm2 |
| movq r9,xmm3 |
| or r12,r8 |
| DB 0x3e ; predict taken |
| jnz NEAR $L$add_proceedq ; !is_equal(U1, U2) || in1infty || in2infty |
| |
| ; We now know A = B or A = -B and neither is infinity. Compare the |
| ; y-coordinates via S1 and S2. |
| test r9,r9 |
| jz NEAR $L$add_doubleq ; is_equal(S1, S2) |
| |
| ; A = -B, so the result is infinity. |
| ; |
| ; TODO(davidben): Does .Ladd_proceed handle this case? It seems to, in |
| ; which case we should eliminate this special-case and simplify the |
| ; timing analysis. |
| movq rdi,xmm0 ; restore %rdi |
| pxor xmm0,xmm0 |
| movdqu XMMWORD[rdi],xmm0 |
| movdqu XMMWORD[16+rdi],xmm0 |
| movdqu XMMWORD[32+rdi],xmm0 |
| movdqu XMMWORD[48+rdi],xmm0 |
| movdqu XMMWORD[64+rdi],xmm0 |
| movdqu XMMWORD[80+rdi],xmm0 |
| jmp NEAR $L$add_doneq |
| |
| ALIGN 32 |
| $L$add_doubleq: |
| movq rsi,xmm1 ; restore %rsi |
| movq rdi,xmm0 ; restore %rdi |
| add rsp,416 ; difference in frame sizes |
| |
| jmp NEAR $L$point_double_shortcutq |
| |
| |
| ALIGN 32 |
| $L$add_proceedq: |
| mov rax,QWORD[((0+64))+rsp] |
| mov r14,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r15,QWORD[((16+64))+rsp] |
| mov r8,QWORD[((24+64))+rsp] |
| lea rdi,[96+rsp] ; R^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Rsqr, R); |
| |
| mov rax,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+0))+rsp] |
| mov r10,QWORD[((8+0))+rsp] |
| lea rsi,[((0+0))+rsp] |
| mov r11,QWORD[((16+0))+rsp] |
| mov r12,QWORD[((24+0))+rsp] |
| lea rdi,[352+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(res_z, H, in1_z); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((0+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| lea rdi,[32+rsp] ; H^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Hsqr, H); |
| |
| mov rax,QWORD[544+rsp] |
| lea rbx,[544+rsp] |
| mov r9,QWORD[((0+352))+rsp] |
| mov r10,QWORD[((8+352))+rsp] |
| lea rsi,[((0+352))+rsp] |
| mov r11,QWORD[((16+352))+rsp] |
| mov r12,QWORD[((24+352))+rsp] |
| lea rdi,[352+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(res_z, res_z, in2_z); |
| |
| mov rax,QWORD[rsp] |
| lea rbx,[rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[128+rsp] ; H^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(Hcub, Hsqr, H); |
| |
| mov rax,QWORD[160+rsp] |
| lea rbx,[160+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[192+rsp] ; U1*H^2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(U2, U1, Hsqr); |
| ; lea 192(%rsp), %rsi |
| ; lea 32(%rsp), %rdi # 2*U1*H^2 |
| ; call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); |
| |
| xor r11,r11 |
| add r12,r12 ; a0:a3+a0:a3 |
| lea rsi,[96+rsp] |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| mov rax,QWORD[rsi] |
| cmovc r13,rbp |
| mov rbp,QWORD[8+rsi] |
| cmovc r8,rcx |
| mov rcx,QWORD[16+rsi] |
| cmovc r9,r10 |
| mov r10,QWORD[24+rsi] |
| |
| call __ecp_nistz256_subq ; p256_sub(res_x, Rsqr, Hsqr); |
| |
| lea rbx,[128+rsp] |
| lea rdi,[288+rsp] |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_x, res_x, Hcub); |
| |
| mov rax,QWORD[((192+0))+rsp] |
| mov rbp,QWORD[((192+8))+rsp] |
| mov rcx,QWORD[((192+16))+rsp] |
| mov r10,QWORD[((192+24))+rsp] |
| lea rdi,[320+rsp] |
| |
| call __ecp_nistz256_subq ; p256_sub(res_y, U2, res_x); |
| |
| mov QWORD[rdi],r12 ; save the result, as |
| mov QWORD[8+rdi],r13 ; __ecp_nistz256_sub doesn't |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| mov rax,QWORD[128+rsp] |
| lea rbx,[128+rsp] |
| mov r9,QWORD[((0+224))+rsp] |
| mov r10,QWORD[((8+224))+rsp] |
| lea rsi,[((0+224))+rsp] |
| mov r11,QWORD[((16+224))+rsp] |
| mov r12,QWORD[((24+224))+rsp] |
| lea rdi,[256+rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, S1, Hcub); |
| |
| mov rax,QWORD[320+rsp] |
| lea rbx,[320+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[320+rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(res_y, R, res_y); |
| |
| lea rbx,[256+rsp] |
| lea rdi,[320+rsp] |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_y, res_y, S2); |
| |
| movq rdi,xmm0 ; restore %rdi |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_z, in2_z, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[352+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((352+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[544+rsp] |
| pand xmm3,XMMWORD[((544+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_z, in1_z, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[448+rsp] |
| pand xmm3,XMMWORD[((448+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[64+rdi],xmm2 |
| movdqu XMMWORD[80+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_x, in2_x, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[288+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((288+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[480+rsp] |
| pand xmm3,XMMWORD[((480+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_x, in1_x, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[384+rsp] |
| pand xmm3,XMMWORD[((384+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[rdi],xmm2 |
| movdqu XMMWORD[16+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_y, in2_y, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[320+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((320+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[512+rsp] |
| pand xmm3,XMMWORD[((512+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_y, in1_y, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[416+rsp] |
| pand xmm3,XMMWORD[((416+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[32+rdi],xmm2 |
| movdqu XMMWORD[48+rdi],xmm3 |
| |
| $L$add_doneq: |
| lea rsi,[((576+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$point_addq_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_add_nohw: |
| global ecp_nistz256_point_add_affine_nohw |
| |
| ALIGN 32 |
| ecp_nistz256_point_add_affine_nohw: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_add_affine_nohw: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*15+8 |
| |
| $L$add_affineq_body: |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi |
| mov rbx,rdx ; reassign |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| movdqu xmm3,XMMWORD[48+rsi] |
| movdqu xmm4,XMMWORD[64+rsi] |
| movdqu xmm5,XMMWORD[80+rsi] |
| mov rax,QWORD[((64+0))+rsi] ; load original in1_z |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| movdqa XMMWORD[320+rsp],xmm0 |
| movdqa XMMWORD[(320+16)+rsp],xmm1 |
| movdqa XMMWORD[352+rsp],xmm2 |
| movdqa XMMWORD[(352+16)+rsp],xmm3 |
| movdqa XMMWORD[384+rsp],xmm4 |
| movdqa XMMWORD[(384+16)+rsp],xmm5 |
| por xmm5,xmm4 |
| |
| movdqu xmm0,XMMWORD[rbx] ; copy *(P256_POINT_AFFINE *)%rbx |
| pshufd xmm3,xmm5,0xb1 |
| movdqu xmm1,XMMWORD[16+rbx] |
| movdqu xmm2,XMMWORD[32+rbx] |
| por xmm5,xmm3 |
| movdqu xmm3,XMMWORD[48+rbx] |
| movdqa XMMWORD[416+rsp],xmm0 |
| pshufd xmm4,xmm5,0x1e |
| movdqa XMMWORD[(416+16)+rsp],xmm1 |
| por xmm1,xmm0 |
| movq xmm0,rdi ; save %rdi |
| movdqa XMMWORD[448+rsp],xmm2 |
| movdqa XMMWORD[(448+16)+rsp],xmm3 |
| por xmm3,xmm2 |
| por xmm5,xmm4 |
| pxor xmm4,xmm4 |
| por xmm3,xmm1 |
| |
| lea rsi,[((64-0))+rsi] ; %rsi is still valid |
| lea rdi,[32+rsp] ; Z1^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Z1sqr, in1_z); |
| |
| pcmpeqd xmm5,xmm4 |
| pshufd xmm4,xmm3,0xb1 |
| mov rax,QWORD[rbx] ; %rbx is still valid |
| ; lea 0x00(%rbx), %rbx |
| mov r9,r12 ; harmonize sqr output and mul input |
| por xmm4,xmm3 |
| pshufd xmm5,xmm5,0 ; in1infty |
| pshufd xmm3,xmm4,0x1e |
| mov r10,r13 |
| por xmm4,xmm3 |
| pxor xmm3,xmm3 |
| mov r11,r14 |
| pcmpeqd xmm4,xmm3 |
| pshufd xmm4,xmm4,0 ; in2infty |
| |
| lea rsi,[((32-0))+rsp] |
| mov r12,r15 |
| lea rdi,[rsp] ; U2 = X2*Z1^2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(U2, Z1sqr, in2_x); |
| |
| lea rbx,[320+rsp] |
| lea rdi,[64+rsp] ; H = U2 - U1 |
| call __ecp_nistz256_sub_fromq ; p256_sub(H, U2, in1_x); |
| |
| mov rax,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] ; S2 = Z1^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, Z1sqr, in1_z); |
| |
| mov rax,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[288+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(res_z, H, in1_z); |
| |
| mov rax,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((0+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] ; S2 = Y2*Z1^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, S2, in2_y); |
| |
| lea rbx,[352+rsp] |
| lea rdi,[96+rsp] ; R = S2 - S1 |
| call __ecp_nistz256_sub_fromq ; p256_sub(R, S2, in1_y); |
| |
| mov rax,QWORD[((0+64))+rsp] |
| mov r14,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r15,QWORD[((16+64))+rsp] |
| mov r8,QWORD[((24+64))+rsp] |
| lea rdi,[128+rsp] ; H^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Hsqr, H); |
| |
| mov rax,QWORD[((0+96))+rsp] |
| mov r14,QWORD[((8+96))+rsp] |
| lea rsi,[((0+96))+rsp] |
| mov r15,QWORD[((16+96))+rsp] |
| mov r8,QWORD[((24+96))+rsp] |
| lea rdi,[192+rsp] ; R^2 |
| call __ecp_nistz256_sqr_montq ; p256_sqr_mont(Rsqr, R); |
| |
| mov rax,QWORD[128+rsp] |
| lea rbx,[128+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[160+rsp] ; H^3 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(Hcub, Hsqr, H); |
| |
| mov rax,QWORD[320+rsp] |
| lea rbx,[320+rsp] |
| mov r9,QWORD[((0+128))+rsp] |
| mov r10,QWORD[((8+128))+rsp] |
| lea rsi,[((0+128))+rsp] |
| mov r11,QWORD[((16+128))+rsp] |
| mov r12,QWORD[((24+128))+rsp] |
| lea rdi,[rsp] ; U1*H^2 |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(U2, in1_x, Hsqr); |
| ; lea 0(%rsp), %rsi |
| ; lea 128(%rsp), %rdi # 2*U1*H^2 |
| ; call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); |
| |
| xor r11,r11 |
| add r12,r12 ; a0:a3+a0:a3 |
| lea rsi,[192+rsp] |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| mov rax,QWORD[rsi] |
| cmovc r13,rbp |
| mov rbp,QWORD[8+rsi] |
| cmovc r8,rcx |
| mov rcx,QWORD[16+rsi] |
| cmovc r9,r10 |
| mov r10,QWORD[24+rsi] |
| |
| call __ecp_nistz256_subq ; p256_sub(res_x, Rsqr, Hsqr); |
| |
| lea rbx,[160+rsp] |
| lea rdi,[224+rsp] |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_x, res_x, Hcub); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov rbp,QWORD[((0+8))+rsp] |
| mov rcx,QWORD[((0+16))+rsp] |
| mov r10,QWORD[((0+24))+rsp] |
| lea rdi,[64+rsp] |
| |
| call __ecp_nistz256_subq ; p256_sub(H, U2, res_x); |
| |
| mov QWORD[rdi],r12 ; save the result, as |
| mov QWORD[8+rdi],r13 ; __ecp_nistz256_sub doesn't |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| mov rax,QWORD[352+rsp] |
| lea rbx,[352+rsp] |
| mov r9,QWORD[((0+160))+rsp] |
| mov r10,QWORD[((8+160))+rsp] |
| lea rsi,[((0+160))+rsp] |
| mov r11,QWORD[((16+160))+rsp] |
| mov r12,QWORD[((24+160))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(S2, Hcub, in1_y); |
| |
| mov rax,QWORD[96+rsp] |
| lea rbx,[96+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((0+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_mul_montq ; p256_mul_mont(H, H, R); |
| |
| lea rbx,[32+rsp] |
| lea rdi,[256+rsp] |
| call __ecp_nistz256_sub_fromq ; p256_sub(res_y, H, S2); |
| |
| movq rdi,xmm0 ; restore %rdi |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_z, ONE, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[288+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((288+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[$L$ONE_mont] |
| pand xmm3,XMMWORD[(($L$ONE_mont+16))] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_z, in1_z, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[384+rsp] |
| pand xmm3,XMMWORD[((384+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[64+rdi],xmm2 |
| movdqu XMMWORD[80+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_x, in2_x, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[224+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((224+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[416+rsp] |
| pand xmm3,XMMWORD[((416+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_x, in1_x, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[320+rsp] |
| pand xmm3,XMMWORD[((320+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[rdi],xmm2 |
| movdqu XMMWORD[16+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_y, in2_y, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[256+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((256+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[448+rsp] |
| pand xmm3,XMMWORD[((448+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_y, in1_y, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[352+rsp] |
| pand xmm3,XMMWORD[((352+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[32+rdi],xmm2 |
| movdqu XMMWORD[48+rdi],xmm3 |
| |
| lea rsi,[((480+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$add_affineq_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_add_affine_nohw: |
| |
| ALIGN 32 |
| __ecp_nistz256_add_tox: |
| |
| xor r11,r11 |
| adc r12,QWORD[rbx] |
| adc r13,QWORD[8+rbx] |
| mov rax,r12 |
| adc r8,QWORD[16+rbx] |
| adc r9,QWORD[24+rbx] |
| mov rbp,r13 |
| adc r11,0 |
| |
| xor r10,r10 |
| sbb r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| cmovc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_sub_fromx: |
| |
| xor r11,r11 |
| sbb r12,QWORD[rbx] |
| sbb r13,QWORD[8+rbx] |
| mov rax,r12 |
| sbb r8,QWORD[16+rbx] |
| sbb r9,QWORD[24+rbx] |
| mov rbp,r13 |
| sbb r11,0 |
| |
| xor r10,r10 |
| adc r12,-1 |
| mov rcx,r8 |
| adc r13,r14 |
| adc r8,0 |
| mov r10,r9 |
| adc r9,r15 |
| |
| bt r11,0 |
| cmovnc r12,rax |
| cmovnc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovnc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovnc r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_subx: |
| |
| xor r11,r11 |
| sbb rax,r12 |
| sbb rbp,r13 |
| mov r12,rax |
| sbb rcx,r8 |
| sbb r10,r9 |
| mov r13,rbp |
| sbb r11,0 |
| |
| xor r9,r9 |
| adc rax,-1 |
| mov r8,rcx |
| adc rbp,r14 |
| adc rcx,0 |
| mov r9,r10 |
| adc r10,r15 |
| |
| bt r11,0 |
| cmovc r12,rax |
| cmovc r13,rbp |
| cmovc r8,rcx |
| cmovc r9,r10 |
| |
| ret |
| |
| |
| |
| |
| ALIGN 32 |
| __ecp_nistz256_mul_by_2x: |
| |
| xor r11,r11 |
| adc r12,r12 ; a0:a3+a0:a3 |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| xor r10,r10 |
| sbb r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| cmovc r13,rbp |
| mov QWORD[rdi],r12 |
| cmovc r8,rcx |
| mov QWORD[8+rdi],r13 |
| cmovc r9,r10 |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| |
| ret |
| |
| |
| global ecp_nistz256_point_double_adx |
| |
| ALIGN 32 |
| ecp_nistz256_point_double_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_double_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*5+8 |
| |
| $L$point_doublex_body: |
| |
| $L$point_double_shortcutx: |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi.x |
| mov rbx,rsi ; backup copy |
| movdqu xmm1,XMMWORD[16+rsi] |
| mov r12,QWORD[((32+0))+rsi] ; load in_y in "5-4-0-1" order |
| mov r13,QWORD[((32+8))+rsi] |
| mov r8,QWORD[((32+16))+rsi] |
| mov r9,QWORD[((32+24))+rsi] |
| mov r14,QWORD[(($L$poly+8))] |
| mov r15,QWORD[(($L$poly+24))] |
| movdqa XMMWORD[96+rsp],xmm0 |
| movdqa XMMWORD[(96+16)+rsp],xmm1 |
| lea r10,[32+rdi] |
| lea r11,[64+rdi] |
| movq xmm0,rdi |
| movq xmm1,r10 |
| movq xmm2,r11 |
| |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_by_2x ; p256_mul_by_2(S, in_y); |
| |
| mov rdx,QWORD[((64+0))+rsi] |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| lea rsi,[((64-128))+rsi] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Zsqr, in_z); |
| |
| mov rdx,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((-128+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| lea rdi,[rsp] |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(S, S); |
| |
| mov rdx,QWORD[32+rbx] ; %rbx is still valid |
| mov r9,QWORD[((64+0))+rbx] |
| mov r10,QWORD[((64+8))+rbx] |
| mov r11,QWORD[((64+16))+rbx] |
| mov r12,QWORD[((64+24))+rbx] |
| lea rsi,[((64-128))+rbx] |
| lea rbx,[32+rbx] |
| movq rdi,xmm2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(res_z, in_z, in_y); |
| call __ecp_nistz256_mul_by_2x ; p256_mul_by_2(res_z, res_z); |
| |
| mov r12,QWORD[((96+0))+rsp] ; "5-4-0-1" order |
| mov r13,QWORD[((96+8))+rsp] |
| lea rbx,[64+rsp] |
| mov r8,QWORD[((96+16))+rsp] |
| mov r9,QWORD[((96+24))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_add_tox ; p256_add(M, in_x, Zsqr); |
| |
| mov r12,QWORD[((96+0))+rsp] ; "5-4-0-1" order |
| mov r13,QWORD[((96+8))+rsp] |
| lea rbx,[64+rsp] |
| mov r8,QWORD[((96+16))+rsp] |
| mov r9,QWORD[((96+24))+rsp] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_sub_fromx ; p256_sub(Zsqr, in_x, Zsqr); |
| |
| mov rdx,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((-128+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| movq rdi,xmm1 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(res_y, S); |
| xor r9,r9 |
| mov rax,r12 |
| add r12,-1 |
| mov r10,r13 |
| adc r13,rsi |
| mov rcx,r14 |
| adc r14,0 |
| mov r8,r15 |
| adc r15,rbp |
| adc r9,0 |
| xor rsi,rsi ; borrow %rsi |
| test rax,1 |
| |
| cmovz r12,rax |
| cmovz r13,r10 |
| cmovz r14,rcx |
| cmovz r15,r8 |
| cmovz r9,rsi |
| |
| mov rax,r13 ; a0:a3>>1 |
| shr r12,1 |
| shl rax,63 |
| mov r10,r14 |
| shr r13,1 |
| or r12,rax |
| shl r10,63 |
| mov rcx,r15 |
| shr r14,1 |
| or r13,r10 |
| shl rcx,63 |
| mov QWORD[rdi],r12 |
| shr r15,1 |
| mov QWORD[8+rdi],r13 |
| shl r9,63 |
| or r14,rcx |
| or r15,r9 |
| mov QWORD[16+rdi],r14 |
| mov QWORD[24+rdi],r15 |
| mov rdx,QWORD[64+rsp] |
| lea rbx,[64+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(M, M, Zsqr); |
| |
| lea rdi,[128+rsp] |
| call __ecp_nistz256_mul_by_2x |
| |
| lea rbx,[32+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_add_tox ; p256_mul_by_3(M, M); |
| |
| mov rdx,QWORD[96+rsp] |
| lea rbx,[96+rsp] |
| mov r9,QWORD[((0+0))+rsp] |
| mov r10,QWORD[((8+0))+rsp] |
| lea rsi,[((-128+0))+rsp] |
| mov r11,QWORD[((16+0))+rsp] |
| mov r12,QWORD[((24+0))+rsp] |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S, S, in_x); |
| |
| lea rdi,[128+rsp] |
| call __ecp_nistz256_mul_by_2x ; p256_mul_by_2(tmp0, S); |
| |
| mov rdx,QWORD[((0+32))+rsp] |
| mov r14,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r15,QWORD[((16+32))+rsp] |
| mov r8,QWORD[((24+32))+rsp] |
| movq rdi,xmm0 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(res_x, M); |
| |
| lea rbx,[128+rsp] |
| mov r8,r14 ; harmonize sqr output and sub input |
| mov r9,r15 |
| mov r14,rsi |
| mov r15,rbp |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_x, res_x, tmp0); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov rbp,QWORD[((0+8))+rsp] |
| mov rcx,QWORD[((0+16))+rsp] |
| mov r10,QWORD[((0+24))+rsp] ; "4-5-0-1" order |
| lea rdi,[rsp] |
| call __ecp_nistz256_subx ; p256_sub(S, S, res_x); |
| |
| mov rdx,QWORD[32+rsp] |
| lea rbx,[32+rsp] |
| mov r14,r12 ; harmonize sub output and mul input |
| xor ecx,ecx |
| mov QWORD[((0+0))+rsp],r12 ; have to save:-( |
| mov r10,r13 |
| mov QWORD[((0+8))+rsp],r13 |
| cmovz r11,r8 |
| mov QWORD[((0+16))+rsp],r8 |
| lea rsi,[((0-128))+rsp] |
| cmovz r12,r9 |
| mov QWORD[((0+24))+rsp],r9 |
| mov r9,r14 |
| lea rdi,[rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S, S, M); |
| |
| movq rbx,xmm1 |
| movq rdi,xmm1 |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_y, S, res_y); |
| |
| lea rsi,[((160+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$point_doublex_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_double_adx: |
| global ecp_nistz256_point_add_adx |
| |
| ALIGN 32 |
| ecp_nistz256_point_add_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_add_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*18+8 |
| |
| $L$point_addx_body: |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| movdqu xmm3,XMMWORD[48+rsi] |
| movdqu xmm4,XMMWORD[64+rsi] |
| movdqu xmm5,XMMWORD[80+rsi] |
| mov rbx,rsi ; reassign |
| mov rsi,rdx ; reassign |
| movdqa XMMWORD[384+rsp],xmm0 |
| movdqa XMMWORD[(384+16)+rsp],xmm1 |
| movdqa XMMWORD[416+rsp],xmm2 |
| movdqa XMMWORD[(416+16)+rsp],xmm3 |
| movdqa XMMWORD[448+rsp],xmm4 |
| movdqa XMMWORD[(448+16)+rsp],xmm5 |
| por xmm5,xmm4 |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rbx |
| pshufd xmm3,xmm5,0xb1 |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| por xmm5,xmm3 |
| movdqu xmm3,XMMWORD[48+rsi] |
| mov rdx,QWORD[((64+0))+rsi] ; load original in2_z |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| movdqa XMMWORD[480+rsp],xmm0 |
| pshufd xmm4,xmm5,0x1e |
| movdqa XMMWORD[(480+16)+rsp],xmm1 |
| movdqu xmm0,XMMWORD[64+rsi] ; in2_z again |
| movdqu xmm1,XMMWORD[80+rsi] |
| movdqa XMMWORD[512+rsp],xmm2 |
| movdqa XMMWORD[(512+16)+rsp],xmm3 |
| por xmm5,xmm4 |
| pxor xmm4,xmm4 |
| por xmm1,xmm0 |
| movq xmm0,rdi ; save %rdi |
| |
| lea rsi,[((64-128))+rsi] ; %rsi is still valid |
| mov QWORD[((544+0))+rsp],rdx ; make in2_z copy |
| mov QWORD[((544+8))+rsp],r14 |
| mov QWORD[((544+16))+rsp],r15 |
| mov QWORD[((544+24))+rsp],r8 |
| lea rdi,[96+rsp] ; Z2^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Z2sqr, in2_z); |
| |
| pcmpeqd xmm5,xmm4 |
| pshufd xmm4,xmm1,0xb1 |
| por xmm4,xmm1 |
| pshufd xmm5,xmm5,0 ; in1infty |
| pshufd xmm3,xmm4,0x1e |
| por xmm4,xmm3 |
| pxor xmm3,xmm3 |
| pcmpeqd xmm4,xmm3 |
| pshufd xmm4,xmm4,0 ; in2infty |
| mov rdx,QWORD[((64+0))+rbx] ; load original in1_z |
| mov r14,QWORD[((64+8))+rbx] |
| mov r15,QWORD[((64+16))+rbx] |
| mov r8,QWORD[((64+24))+rbx] |
| movq xmm1,rbx |
| |
| lea rsi,[((64-128))+rbx] |
| lea rdi,[32+rsp] ; Z1^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Z1sqr, in1_z); |
| |
| mov rdx,QWORD[544+rsp] |
| lea rbx,[544+rsp] |
| mov r9,QWORD[((0+96))+rsp] |
| mov r10,QWORD[((8+96))+rsp] |
| lea rsi,[((-128+96))+rsp] |
| mov r11,QWORD[((16+96))+rsp] |
| mov r12,QWORD[((24+96))+rsp] |
| lea rdi,[224+rsp] ; S1 = Z2^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S1, Z2sqr, in2_z); |
| |
| mov rdx,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[256+rsp] ; S2 = Z1^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, Z1sqr, in1_z); |
| |
| mov rdx,QWORD[416+rsp] |
| lea rbx,[416+rsp] |
| mov r9,QWORD[((0+224))+rsp] |
| mov r10,QWORD[((8+224))+rsp] |
| lea rsi,[((-128+224))+rsp] |
| mov r11,QWORD[((16+224))+rsp] |
| mov r12,QWORD[((24+224))+rsp] |
| lea rdi,[224+rsp] ; S1 = Y1*Z2^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S1, S1, in1_y); |
| |
| mov rdx,QWORD[512+rsp] |
| lea rbx,[512+rsp] |
| mov r9,QWORD[((0+256))+rsp] |
| mov r10,QWORD[((8+256))+rsp] |
| lea rsi,[((-128+256))+rsp] |
| mov r11,QWORD[((16+256))+rsp] |
| mov r12,QWORD[((24+256))+rsp] |
| lea rdi,[256+rsp] ; S2 = Y2*Z1^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, S2, in2_y); |
| |
| lea rbx,[224+rsp] |
| lea rdi,[64+rsp] ; R = S2 - S1 |
| call __ecp_nistz256_sub_fromx ; p256_sub(R, S2, S1); |
| |
| or r12,r13 ; see if result is zero |
| movdqa xmm2,xmm4 |
| or r12,r8 |
| or r12,r9 |
| por xmm2,xmm5 ; in1infty || in2infty |
| movq xmm3,r12 |
| |
| mov rdx,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+96))+rsp] |
| mov r10,QWORD[((8+96))+rsp] |
| lea rsi,[((-128+96))+rsp] |
| mov r11,QWORD[((16+96))+rsp] |
| mov r12,QWORD[((24+96))+rsp] |
| lea rdi,[160+rsp] ; U1 = X1*Z2^2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(U1, in1_x, Z2sqr); |
| |
| mov rdx,QWORD[480+rsp] |
| lea rbx,[480+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[192+rsp] ; U2 = X2*Z1^2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(U2, in2_x, Z1sqr); |
| |
| lea rbx,[160+rsp] |
| lea rdi,[rsp] ; H = U2 - U1 |
| call __ecp_nistz256_sub_fromx ; p256_sub(H, U2, U1); |
| |
| or r12,r13 ; see if result is zero |
| or r12,r8 |
| or r12,r9 ; !is_equal(U1, U2) |
| |
| movq r8,xmm2 |
| movq r9,xmm3 |
| or r12,r8 |
| DB 0x3e ; predict taken |
| jnz NEAR $L$add_proceedx ; !is_equal(U1, U2) || in1infty || in2infty |
| |
| ; We now know A = B or A = -B and neither is infinity. Compare the |
| ; y-coordinates via S1 and S2. |
| test r9,r9 |
| jz NEAR $L$add_doublex ; is_equal(S1, S2) |
| |
| ; A = -B, so the result is infinity. |
| ; |
| ; TODO(davidben): Does .Ladd_proceed handle this case? It seems to, in |
| ; which case we should eliminate this special-case and simplify the |
| ; timing analysis. |
| movq rdi,xmm0 ; restore %rdi |
| pxor xmm0,xmm0 |
| movdqu XMMWORD[rdi],xmm0 |
| movdqu XMMWORD[16+rdi],xmm0 |
| movdqu XMMWORD[32+rdi],xmm0 |
| movdqu XMMWORD[48+rdi],xmm0 |
| movdqu XMMWORD[64+rdi],xmm0 |
| movdqu XMMWORD[80+rdi],xmm0 |
| jmp NEAR $L$add_donex |
| |
| ALIGN 32 |
| $L$add_doublex: |
| movq rsi,xmm1 ; restore %rsi |
| movq rdi,xmm0 ; restore %rdi |
| add rsp,416 ; difference in frame sizes |
| |
| jmp NEAR $L$point_double_shortcutx |
| |
| |
| ALIGN 32 |
| $L$add_proceedx: |
| mov rdx,QWORD[((0+64))+rsp] |
| mov r14,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r15,QWORD[((16+64))+rsp] |
| mov r8,QWORD[((24+64))+rsp] |
| lea rdi,[96+rsp] ; R^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Rsqr, R); |
| |
| mov rdx,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+0))+rsp] |
| mov r10,QWORD[((8+0))+rsp] |
| lea rsi,[((-128+0))+rsp] |
| mov r11,QWORD[((16+0))+rsp] |
| mov r12,QWORD[((24+0))+rsp] |
| lea rdi,[352+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(res_z, H, in1_z); |
| |
| mov rdx,QWORD[((0+0))+rsp] |
| mov r14,QWORD[((8+0))+rsp] |
| lea rsi,[((-128+0))+rsp] |
| mov r15,QWORD[((16+0))+rsp] |
| mov r8,QWORD[((24+0))+rsp] |
| lea rdi,[32+rsp] ; H^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Hsqr, H); |
| |
| mov rdx,QWORD[544+rsp] |
| lea rbx,[544+rsp] |
| mov r9,QWORD[((0+352))+rsp] |
| mov r10,QWORD[((8+352))+rsp] |
| lea rsi,[((-128+352))+rsp] |
| mov r11,QWORD[((16+352))+rsp] |
| mov r12,QWORD[((24+352))+rsp] |
| lea rdi,[352+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(res_z, res_z, in2_z); |
| |
| mov rdx,QWORD[rsp] |
| lea rbx,[rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[128+rsp] ; H^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(Hcub, Hsqr, H); |
| |
| mov rdx,QWORD[160+rsp] |
| lea rbx,[160+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[192+rsp] ; U1*H^2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(U2, U1, Hsqr); |
| ; lea 192(%rsp), %rsi |
| ; lea 32(%rsp), %rdi # 2*U1*H^2 |
| ; call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); |
| |
| xor r11,r11 |
| add r12,r12 ; a0:a3+a0:a3 |
| lea rsi,[96+rsp] |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| mov rax,QWORD[rsi] |
| cmovc r13,rbp |
| mov rbp,QWORD[8+rsi] |
| cmovc r8,rcx |
| mov rcx,QWORD[16+rsi] |
| cmovc r9,r10 |
| mov r10,QWORD[24+rsi] |
| |
| call __ecp_nistz256_subx ; p256_sub(res_x, Rsqr, Hsqr); |
| |
| lea rbx,[128+rsp] |
| lea rdi,[288+rsp] |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_x, res_x, Hcub); |
| |
| mov rax,QWORD[((192+0))+rsp] |
| mov rbp,QWORD[((192+8))+rsp] |
| mov rcx,QWORD[((192+16))+rsp] |
| mov r10,QWORD[((192+24))+rsp] |
| lea rdi,[320+rsp] |
| |
| call __ecp_nistz256_subx ; p256_sub(res_y, U2, res_x); |
| |
| mov QWORD[rdi],r12 ; save the result, as |
| mov QWORD[8+rdi],r13 ; __ecp_nistz256_sub doesn't |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| mov rdx,QWORD[128+rsp] |
| lea rbx,[128+rsp] |
| mov r9,QWORD[((0+224))+rsp] |
| mov r10,QWORD[((8+224))+rsp] |
| lea rsi,[((-128+224))+rsp] |
| mov r11,QWORD[((16+224))+rsp] |
| mov r12,QWORD[((24+224))+rsp] |
| lea rdi,[256+rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, S1, Hcub); |
| |
| mov rdx,QWORD[320+rsp] |
| lea rbx,[320+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[320+rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(res_y, R, res_y); |
| |
| lea rbx,[256+rsp] |
| lea rdi,[320+rsp] |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_y, res_y, S2); |
| |
| movq rdi,xmm0 ; restore %rdi |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_z, in2_z, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[352+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((352+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[544+rsp] |
| pand xmm3,XMMWORD[((544+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_z, in1_z, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[448+rsp] |
| pand xmm3,XMMWORD[((448+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[64+rdi],xmm2 |
| movdqu XMMWORD[80+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_x, in2_x, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[288+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((288+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[480+rsp] |
| pand xmm3,XMMWORD[((480+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_x, in1_x, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[384+rsp] |
| pand xmm3,XMMWORD[((384+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[rdi],xmm2 |
| movdqu XMMWORD[16+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_y, in2_y, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[320+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((320+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[512+rsp] |
| pand xmm3,XMMWORD[((512+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_y, in1_y, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[416+rsp] |
| pand xmm3,XMMWORD[((416+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[32+rdi],xmm2 |
| movdqu XMMWORD[48+rdi],xmm3 |
| |
| $L$add_donex: |
| lea rsi,[((576+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$point_addx_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_add_adx: |
| global ecp_nistz256_point_add_affine_adx |
| |
| ALIGN 32 |
| ecp_nistz256_point_add_affine_adx: |
| mov QWORD[8+rsp],rdi ;WIN64 prologue |
| mov QWORD[16+rsp],rsi |
| mov rax,rsp |
| $L$SEH_begin_ecp_nistz256_point_add_affine_adx: |
| mov rdi,rcx |
| mov rsi,rdx |
| mov rdx,r8 |
| |
| |
| |
| _CET_ENDBR |
| push rbp |
| |
| push rbx |
| |
| push r12 |
| |
| push r13 |
| |
| push r14 |
| |
| push r15 |
| |
| sub rsp,32*15+8 |
| |
| $L$add_affinex_body: |
| |
| movdqu xmm0,XMMWORD[rsi] ; copy *(P256_POINT *)%rsi |
| mov rbx,rdx ; reassign |
| movdqu xmm1,XMMWORD[16+rsi] |
| movdqu xmm2,XMMWORD[32+rsi] |
| movdqu xmm3,XMMWORD[48+rsi] |
| movdqu xmm4,XMMWORD[64+rsi] |
| movdqu xmm5,XMMWORD[80+rsi] |
| mov rdx,QWORD[((64+0))+rsi] ; load original in1_z |
| mov r14,QWORD[((64+8))+rsi] |
| mov r15,QWORD[((64+16))+rsi] |
| mov r8,QWORD[((64+24))+rsi] |
| movdqa XMMWORD[320+rsp],xmm0 |
| movdqa XMMWORD[(320+16)+rsp],xmm1 |
| movdqa XMMWORD[352+rsp],xmm2 |
| movdqa XMMWORD[(352+16)+rsp],xmm3 |
| movdqa XMMWORD[384+rsp],xmm4 |
| movdqa XMMWORD[(384+16)+rsp],xmm5 |
| por xmm5,xmm4 |
| |
| movdqu xmm0,XMMWORD[rbx] ; copy *(P256_POINT_AFFINE *)%rbx |
| pshufd xmm3,xmm5,0xb1 |
| movdqu xmm1,XMMWORD[16+rbx] |
| movdqu xmm2,XMMWORD[32+rbx] |
| por xmm5,xmm3 |
| movdqu xmm3,XMMWORD[48+rbx] |
| movdqa XMMWORD[416+rsp],xmm0 |
| pshufd xmm4,xmm5,0x1e |
| movdqa XMMWORD[(416+16)+rsp],xmm1 |
| por xmm1,xmm0 |
| movq xmm0,rdi ; save %rdi |
| movdqa XMMWORD[448+rsp],xmm2 |
| movdqa XMMWORD[(448+16)+rsp],xmm3 |
| por xmm3,xmm2 |
| por xmm5,xmm4 |
| pxor xmm4,xmm4 |
| por xmm3,xmm1 |
| |
| lea rsi,[((64-128))+rsi] ; %rsi is still valid |
| lea rdi,[32+rsp] ; Z1^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Z1sqr, in1_z); |
| |
| pcmpeqd xmm5,xmm4 |
| pshufd xmm4,xmm3,0xb1 |
| mov rdx,QWORD[rbx] ; %rbx is still valid |
| ; lea 0x00(%rbx), %rbx |
| mov r9,r12 ; harmonize sqr output and mul input |
| por xmm4,xmm3 |
| pshufd xmm5,xmm5,0 ; in1infty |
| pshufd xmm3,xmm4,0x1e |
| mov r10,r13 |
| por xmm4,xmm3 |
| pxor xmm3,xmm3 |
| mov r11,r14 |
| pcmpeqd xmm4,xmm3 |
| pshufd xmm4,xmm4,0 ; in2infty |
| |
| lea rsi,[((32-128))+rsp] |
| mov r12,r15 |
| lea rdi,[rsp] ; U2 = X2*Z1^2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(U2, Z1sqr, in2_x); |
| |
| lea rbx,[320+rsp] |
| lea rdi,[64+rsp] ; H = U2 - U1 |
| call __ecp_nistz256_sub_fromx ; p256_sub(H, U2, in1_x); |
| |
| mov rdx,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] ; S2 = Z1^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, Z1sqr, in1_z); |
| |
| mov rdx,QWORD[384+rsp] |
| lea rbx,[384+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[288+rsp] ; Z3 = H*Z1*Z2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(res_z, H, in1_z); |
| |
| mov rdx,QWORD[448+rsp] |
| lea rbx,[448+rsp] |
| mov r9,QWORD[((0+32))+rsp] |
| mov r10,QWORD[((8+32))+rsp] |
| lea rsi,[((-128+32))+rsp] |
| mov r11,QWORD[((16+32))+rsp] |
| mov r12,QWORD[((24+32))+rsp] |
| lea rdi,[32+rsp] ; S2 = Y2*Z1^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, S2, in2_y); |
| |
| lea rbx,[352+rsp] |
| lea rdi,[96+rsp] ; R = S2 - S1 |
| call __ecp_nistz256_sub_fromx ; p256_sub(R, S2, in1_y); |
| |
| mov rdx,QWORD[((0+64))+rsp] |
| mov r14,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r15,QWORD[((16+64))+rsp] |
| mov r8,QWORD[((24+64))+rsp] |
| lea rdi,[128+rsp] ; H^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Hsqr, H); |
| |
| mov rdx,QWORD[((0+96))+rsp] |
| mov r14,QWORD[((8+96))+rsp] |
| lea rsi,[((-128+96))+rsp] |
| mov r15,QWORD[((16+96))+rsp] |
| mov r8,QWORD[((24+96))+rsp] |
| lea rdi,[192+rsp] ; R^2 |
| call __ecp_nistz256_sqr_montx ; p256_sqr_mont(Rsqr, R); |
| |
| mov rdx,QWORD[128+rsp] |
| lea rbx,[128+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[160+rsp] ; H^3 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(Hcub, Hsqr, H); |
| |
| mov rdx,QWORD[320+rsp] |
| lea rbx,[320+rsp] |
| mov r9,QWORD[((0+128))+rsp] |
| mov r10,QWORD[((8+128))+rsp] |
| lea rsi,[((-128+128))+rsp] |
| mov r11,QWORD[((16+128))+rsp] |
| mov r12,QWORD[((24+128))+rsp] |
| lea rdi,[rsp] ; U1*H^2 |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(U2, in1_x, Hsqr); |
| ; lea 0(%rsp), %rsi |
| ; lea 128(%rsp), %rdi # 2*U1*H^2 |
| ; call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); |
| |
| xor r11,r11 |
| add r12,r12 ; a0:a3+a0:a3 |
| lea rsi,[192+rsp] |
| adc r13,r13 |
| mov rax,r12 |
| adc r8,r8 |
| adc r9,r9 |
| mov rbp,r13 |
| adc r11,0 |
| |
| sub r12,-1 |
| mov rcx,r8 |
| sbb r13,r14 |
| sbb r8,0 |
| mov r10,r9 |
| sbb r9,r15 |
| sbb r11,0 |
| |
| cmovc r12,rax |
| mov rax,QWORD[rsi] |
| cmovc r13,rbp |
| mov rbp,QWORD[8+rsi] |
| cmovc r8,rcx |
| mov rcx,QWORD[16+rsi] |
| cmovc r9,r10 |
| mov r10,QWORD[24+rsi] |
| |
| call __ecp_nistz256_subx ; p256_sub(res_x, Rsqr, Hsqr); |
| |
| lea rbx,[160+rsp] |
| lea rdi,[224+rsp] |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_x, res_x, Hcub); |
| |
| mov rax,QWORD[((0+0))+rsp] |
| mov rbp,QWORD[((0+8))+rsp] |
| mov rcx,QWORD[((0+16))+rsp] |
| mov r10,QWORD[((0+24))+rsp] |
| lea rdi,[64+rsp] |
| |
| call __ecp_nistz256_subx ; p256_sub(H, U2, res_x); |
| |
| mov QWORD[rdi],r12 ; save the result, as |
| mov QWORD[8+rdi],r13 ; __ecp_nistz256_sub doesn't |
| mov QWORD[16+rdi],r8 |
| mov QWORD[24+rdi],r9 |
| mov rdx,QWORD[352+rsp] |
| lea rbx,[352+rsp] |
| mov r9,QWORD[((0+160))+rsp] |
| mov r10,QWORD[((8+160))+rsp] |
| lea rsi,[((-128+160))+rsp] |
| mov r11,QWORD[((16+160))+rsp] |
| mov r12,QWORD[((24+160))+rsp] |
| lea rdi,[32+rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(S2, Hcub, in1_y); |
| |
| mov rdx,QWORD[96+rsp] |
| lea rbx,[96+rsp] |
| mov r9,QWORD[((0+64))+rsp] |
| mov r10,QWORD[((8+64))+rsp] |
| lea rsi,[((-128+64))+rsp] |
| mov r11,QWORD[((16+64))+rsp] |
| mov r12,QWORD[((24+64))+rsp] |
| lea rdi,[64+rsp] |
| call __ecp_nistz256_mul_montx ; p256_mul_mont(H, H, R); |
| |
| lea rbx,[32+rsp] |
| lea rdi,[256+rsp] |
| call __ecp_nistz256_sub_fromx ; p256_sub(res_y, H, S2); |
| |
| movq rdi,xmm0 ; restore %rdi |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_z, ONE, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[288+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((288+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[$L$ONE_mont] |
| pand xmm3,XMMWORD[(($L$ONE_mont+16))] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_z, in1_z, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[384+rsp] |
| pand xmm3,XMMWORD[((384+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[64+rdi],xmm2 |
| movdqu XMMWORD[80+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_x, in2_x, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[224+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((224+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[416+rsp] |
| pand xmm3,XMMWORD[((416+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_x, in1_x, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[320+rsp] |
| pand xmm3,XMMWORD[((320+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[rdi],xmm2 |
| movdqu XMMWORD[16+rdi],xmm3 |
| |
| movdqa xmm0,xmm5 ; copy_conditional(res_y, in2_y, in1infty); |
| movdqa xmm1,xmm5 |
| pandn xmm0,XMMWORD[256+rsp] |
| movdqa xmm2,xmm5 |
| pandn xmm1,XMMWORD[((256+16))+rsp] |
| movdqa xmm3,xmm5 |
| pand xmm2,XMMWORD[448+rsp] |
| pand xmm3,XMMWORD[((448+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| |
| movdqa xmm0,xmm4 ; copy_conditional(res_y, in1_y, in2infty); |
| movdqa xmm1,xmm4 |
| pandn xmm0,xmm2 |
| movdqa xmm2,xmm4 |
| pandn xmm1,xmm3 |
| movdqa xmm3,xmm4 |
| pand xmm2,XMMWORD[352+rsp] |
| pand xmm3,XMMWORD[((352+16))+rsp] |
| por xmm2,xmm0 |
| por xmm3,xmm1 |
| movdqu XMMWORD[32+rdi],xmm2 |
| movdqu XMMWORD[48+rdi],xmm3 |
| |
| lea rsi,[((480+56))+rsp] |
| |
| mov r15,QWORD[((-48))+rsi] |
| |
| mov r14,QWORD[((-40))+rsi] |
| |
| mov r13,QWORD[((-32))+rsi] |
| |
| mov r12,QWORD[((-24))+rsi] |
| |
| mov rbx,QWORD[((-16))+rsi] |
| |
| mov rbp,QWORD[((-8))+rsi] |
| |
| lea rsp,[rsi] |
| |
| $L$add_affinex_epilogue: |
| mov rdi,QWORD[8+rsp] ;WIN64 epilogue |
| mov rsi,QWORD[16+rsp] |
| ret |
| |
| $L$SEH_end_ecp_nistz256_point_add_affine_adx: |
| EXTERN __imp_RtlVirtualUnwind |
| |
| |
| ALIGN 16 |
| short_handler: |
| push rsi |
| push rdi |
| push rbx |
| push rbp |
| push r12 |
| push r13 |
| push r14 |
| push r15 |
| pushfq |
| sub rsp,64 |
| |
| mov rax,QWORD[120+r8] ; pull context->Rax |
| mov rbx,QWORD[248+r8] ; pull context->Rip |
| |
| mov rsi,QWORD[8+r9] ; disp->ImageBase |
| mov r11,QWORD[56+r9] ; disp->HandlerData |
| |
| mov r10d,DWORD[r11] ; HandlerData[0] |
| lea r10,[r10*1+rsi] ; end of prologue label |
| cmp rbx,r10 ; context->Rip<end of prologue label |
| jb NEAR $L$common_seh_tail |
| |
| mov rax,QWORD[152+r8] ; pull context->Rsp |
| |
| mov r10d,DWORD[4+r11] ; HandlerData[1] |
| lea r10,[r10*1+rsi] ; epilogue label |
| cmp rbx,r10 ; context->Rip>=epilogue label |
| jae NEAR $L$common_seh_tail |
| |
| lea rax,[16+rax] |
| |
| mov r12,QWORD[((-8))+rax] |
| mov r13,QWORD[((-16))+rax] |
| mov QWORD[216+r8],r12 ; restore context->R12 |
| mov QWORD[224+r8],r13 ; restore context->R13 |
| |
| jmp NEAR $L$common_seh_tail |
| |
| |
| |
| ALIGN 16 |
| full_handler: |
| push rsi |
| push rdi |
| push rbx |
| push rbp |
| push r12 |
| push r13 |
| push r14 |
| push r15 |
| pushfq |
| sub rsp,64 |
| |
| mov rax,QWORD[120+r8] ; pull context->Rax |
| mov rbx,QWORD[248+r8] ; pull context->Rip |
| |
| mov rsi,QWORD[8+r9] ; disp->ImageBase |
| mov r11,QWORD[56+r9] ; disp->HandlerData |
| |
| mov r10d,DWORD[r11] ; HandlerData[0] |
| lea r10,[r10*1+rsi] ; end of prologue label |
| cmp rbx,r10 ; context->Rip<end of prologue label |
| jb NEAR $L$common_seh_tail |
| |
| mov rax,QWORD[152+r8] ; pull context->Rsp |
| |
| mov r10d,DWORD[4+r11] ; HandlerData[1] |
| lea r10,[r10*1+rsi] ; epilogue label |
| cmp rbx,r10 ; context->Rip>=epilogue label |
| jae NEAR $L$common_seh_tail |
| |
| mov r10d,DWORD[8+r11] ; HandlerData[2] |
| lea rax,[r10*1+rax] |
| |
| mov rbp,QWORD[((-8))+rax] |
| mov rbx,QWORD[((-16))+rax] |
| mov r12,QWORD[((-24))+rax] |
| mov r13,QWORD[((-32))+rax] |
| mov r14,QWORD[((-40))+rax] |
| mov r15,QWORD[((-48))+rax] |
| mov QWORD[144+r8],rbx ; restore context->Rbx |
| mov QWORD[160+r8],rbp ; restore context->Rbp |
| mov QWORD[216+r8],r12 ; restore context->R12 |
| mov QWORD[224+r8],r13 ; restore context->R13 |
| mov QWORD[232+r8],r14 ; restore context->R14 |
| mov QWORD[240+r8],r15 ; restore context->R15 |
| |
| $L$common_seh_tail: |
| mov rdi,QWORD[8+rax] |
| mov rsi,QWORD[16+rax] |
| mov QWORD[152+r8],rax ; restore context->Rsp |
| mov QWORD[168+r8],rsi ; restore context->Rsi |
| mov QWORD[176+r8],rdi ; restore context->Rdi |
| |
| mov rdi,QWORD[40+r9] ; disp->ContextRecord |
| mov rsi,r8 ; context |
| mov ecx,154 ; sizeof(CONTEXT) |
| DD 0xa548f3fc ; cld; rep movsq |
| |
| mov rsi,r9 |
| xor rcx,rcx ; arg1, UNW_FLAG_NHANDLER |
| mov rdx,QWORD[8+rsi] ; arg2, disp->ImageBase |
| mov r8,QWORD[rsi] ; arg3, disp->ControlPc |
| mov r9,QWORD[16+rsi] ; arg4, disp->FunctionEntry |
| mov r10,QWORD[40+rsi] ; disp->ContextRecord |
| lea r11,[56+rsi] ; &disp->HandlerData |
| lea r12,[24+rsi] ; &disp->EstablisherFrame |
| mov QWORD[32+rsp],r10 ; arg5 |
| mov QWORD[40+rsp],r11 ; arg6 |
| mov QWORD[48+rsp],r12 ; arg7 |
| mov QWORD[56+rsp],rcx ; arg8, (NULL) |
| call QWORD[__imp_RtlVirtualUnwind] |
| |
| mov eax,1 ; ExceptionContinueSearch |
| add rsp,64 |
| popfq |
| pop r15 |
| pop r14 |
| pop r13 |
| pop r12 |
| pop rbp |
| pop rbx |
| pop rdi |
| pop rsi |
| ret |
| |
| |
| section .pdata rdata align=4 |
| ALIGN 4 |
| DD $L$SEH_begin_ecp_nistz256_neg wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_neg wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_neg wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_ord_mul_mont_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_ord_mul_mont_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_ord_mul_mont_nohw wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_ord_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_ord_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_ord_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_ord_mul_mont_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_ord_mul_mont_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_ord_mul_mont_adx wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_ord_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_ord_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_ord_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_mul_mont_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_mul_mont_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_mul_mont_nohw wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_sqr_mont_nohw wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_mul_mont_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_mul_mont_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_mul_mont_adx wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_sqr_mont_adx wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_select_w5_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_select_w5_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_select_wX_nohw wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_select_w7_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_select_w7_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_select_wX_nohw wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_select_w5_avx2 wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_select_w5_avx2 wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_select_wX_avx2 wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_select_w7_avx2 wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_select_w7_avx2 wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_select_wX_avx2 wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_point_double_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_double_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_double_nohw wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_point_add_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_add_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_add_nohw wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_point_add_affine_nohw wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_add_affine_nohw wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_add_affine_nohw wrt ..imagebase |
| DD $L$SEH_begin_ecp_nistz256_point_double_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_double_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_double_adx wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_point_add_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_add_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_add_adx wrt ..imagebase |
| |
| DD $L$SEH_begin_ecp_nistz256_point_add_affine_adx wrt ..imagebase |
| DD $L$SEH_end_ecp_nistz256_point_add_affine_adx wrt ..imagebase |
| DD $L$SEH_info_ecp_nistz256_point_add_affine_adx wrt ..imagebase |
| |
| section .xdata rdata align=8 |
| ALIGN 8 |
| $L$SEH_info_ecp_nistz256_neg: |
| DB 9,0,0,0 |
| DD short_handler wrt ..imagebase |
| DD $L$neg_body wrt ..imagebase,$L$neg_epilogue wrt ..imagebase ; HandlerData[] |
| $L$SEH_info_ecp_nistz256_ord_mul_mont_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$ord_mul_body wrt ..imagebase,$L$ord_mul_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_ord_sqr_mont_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$ord_sqr_body wrt ..imagebase,$L$ord_sqr_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_ord_mul_mont_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$ord_mulx_body wrt ..imagebase,$L$ord_mulx_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_ord_sqr_mont_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$ord_sqrx_body wrt ..imagebase,$L$ord_sqrx_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_mul_mont_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_sqr_mont_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$sqr_body wrt ..imagebase,$L$sqr_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_mul_mont_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$mulx_body wrt ..imagebase,$L$mulx_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_sqr_mont_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$sqrx_body wrt ..imagebase,$L$sqrx_epilogue wrt ..imagebase ; HandlerData[] |
| DD 48,0 |
| $L$SEH_info_ecp_nistz256_select_wX_nohw: |
| DB 0x01,0x33,0x16,0x00 |
| DB 0x33,0xf8,0x09,0x00 ; movaps 0x90(rsp),xmm15 |
| DB 0x2e,0xe8,0x08,0x00 ; movaps 0x80(rsp),xmm14 |
| DB 0x29,0xd8,0x07,0x00 ; movaps 0x70(rsp),xmm13 |
| DB 0x24,0xc8,0x06,0x00 ; movaps 0x60(rsp),xmm12 |
| DB 0x1f,0xb8,0x05,0x00 ; movaps 0x50(rsp),xmm11 |
| DB 0x1a,0xa8,0x04,0x00 ; movaps 0x40(rsp),xmm10 |
| DB 0x15,0x98,0x03,0x00 ; movaps 0x30(rsp),xmm9 |
| DB 0x10,0x88,0x02,0x00 ; movaps 0x20(rsp),xmm8 |
| DB 0x0c,0x78,0x01,0x00 ; movaps 0x10(rsp),xmm7 |
| DB 0x08,0x68,0x00,0x00 ; movaps 0x00(rsp),xmm6 |
| DB 0x04,0x01,0x15,0x00 ; sub rsp,0xa8 |
| ALIGN 8 |
| $L$SEH_info_ecp_nistz256_select_wX_avx2: |
| DB 0x01,0x36,0x17,0x0b |
| DB 0x36,0xf8,0x09,0x00 ; vmovaps 0x90(rsp),xmm15 |
| DB 0x31,0xe8,0x08,0x00 ; vmovaps 0x80(rsp),xmm14 |
| DB 0x2c,0xd8,0x07,0x00 ; vmovaps 0x70(rsp),xmm13 |
| DB 0x27,0xc8,0x06,0x00 ; vmovaps 0x60(rsp),xmm12 |
| DB 0x22,0xb8,0x05,0x00 ; vmovaps 0x50(rsp),xmm11 |
| DB 0x1d,0xa8,0x04,0x00 ; vmovaps 0x40(rsp),xmm10 |
| DB 0x18,0x98,0x03,0x00 ; vmovaps 0x30(rsp),xmm9 |
| DB 0x13,0x88,0x02,0x00 ; vmovaps 0x20(rsp),xmm8 |
| DB 0x0e,0x78,0x01,0x00 ; vmovaps 0x10(rsp),xmm7 |
| DB 0x09,0x68,0x00,0x00 ; vmovaps 0x00(rsp),xmm6 |
| DB 0x04,0x01,0x15,0x00 ; sub rsp,0xa8 |
| DB 0x00,0xb3,0x00,0x00 ; set_frame r11 |
| ALIGN 8 |
| $L$SEH_info_ecp_nistz256_point_double_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$point_doubleq_body wrt ..imagebase,$L$point_doubleq_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*5+56,0 |
| $L$SEH_info_ecp_nistz256_point_add_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$point_addq_body wrt ..imagebase,$L$point_addq_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*18+56,0 |
| $L$SEH_info_ecp_nistz256_point_add_affine_nohw: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$add_affineq_body wrt ..imagebase,$L$add_affineq_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*15+56,0 |
| ALIGN 8 |
| $L$SEH_info_ecp_nistz256_point_double_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$point_doublex_body wrt ..imagebase,$L$point_doublex_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*5+56,0 |
| $L$SEH_info_ecp_nistz256_point_add_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$point_addx_body wrt ..imagebase,$L$point_addx_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*18+56,0 |
| $L$SEH_info_ecp_nistz256_point_add_affine_adx: |
| DB 9,0,0,0 |
| DD full_handler wrt ..imagebase |
| DD $L$add_affinex_body wrt ..imagebase,$L$add_affinex_epilogue wrt ..imagebase ; HandlerData[] |
| DD 32*15+56,0 |
| %else |
| ; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738 |
| ret |
| %endif |