#include "s2n_bignum_internal.h"
.intel_syntax noprefix
S2N_BN_SYM_VISIBILITY_DIRECTIVE(bignum_mul_6_12)
S2N_BN_SYM_PRIVACY_DIRECTIVE(bignum_mul_6_12)
.text
#define z rdi
#define x rsi
#define y rcx
#define zero rbp
#define zeroe ebp
.macro mulpadd arg1,arg2
mulx rbx, rax, [x+8*\arg2]
.if ((\arg1 + \arg2) % 6 == 0)
adcx r8, rax
adox r9, rbx
.elseif ((\arg1 + \arg2) % 6 == 1)
adcx r9, rax
adox r10, rbx
.elseif ((\arg1 + \arg2) % 6 == 2)
adcx r10, rax
adox r11, rbx
.elseif ((\arg1 + \arg2) % 6 == 3)
adcx r11, rax
adox r12, rbx
.elseif ((\arg1 + \arg2) % 6 == 4)
adcx r12, rax
adox r13, rbx
.elseif ((\arg1 + \arg2) % 6 == 5)
adcx r13, rax
adox r8, rbx
.endif
.endm
.macro addrow arg1
mov rdx, [y+8*\arg1]
xor zeroe, zeroe
mulpadd \arg1, 0
.if (\arg1 % 6 == 0)
mov [z+8*\arg1],r8
.elseif (\arg1 % 6 == 1)
mov [z+8*\arg1],r9
.elseif (\arg1 % 6 == 2)
mov [z+8*\arg1],r10
.elseif (\arg1 % 6 == 3)
mov [z+8*\arg1],r11
.elseif (\arg1 % 6 == 4)
mov [z+8*\arg1],r12
.elseif (\arg1 % 6 == 5)
mov [z+8*\arg1],r13
.endif
mulpadd \arg1, 1
mulpadd \arg1, 2
mulpadd \arg1, 3
mulpadd \arg1, 4
.if (\arg1 % 6 == 0)
mulx r8, rax, [x+40]
adcx r13, rax
adox r8, zero
adcx r8, zero
.elseif (\arg1 % 6 == 1)
mulx r9, rax, [x+40]
adcx r8, rax
adox r9, zero
adcx r9, zero
.elseif (\arg1 % 6 == 2)
mulx r10, rax, [x+40]
adcx r9, rax
adox r10, zero
adcx r10, zero
.elseif (\arg1 % 6 == 3)
mulx r11, rax, [x+40]
adcx r10, rax
adox r11, zero
adcx r11, zero
.elseif (\arg1 % 6 == 4)
mulx r12, rax, [x+40]
adcx r11, rax
adox r12, zero
adcx r12, zero
.elseif (\arg1 % 6 == 5)
mulx r13, rax, [x+40]
adcx r12, rax
adox r13, zero
adcx r13, zero
.endif
.endm
S2N_BN_SYMBOL(bignum_mul_6_12):
_CET_ENDBR
#if WINDOWS_ABI
push rdi
push rsi
mov rdi, rcx
mov rsi, rdx
mov rdx, r8
#endif
push rbp
push rbx
push r12
push r13
mov y, rdx
xor zeroe, zeroe
mov rdx, [y]
mulx r9, r8, [x]
mov [z], r8
mulx r10, rbx, [x+8]
adcx r9, rbx
mulx r11, rbx, [x+16]
adcx r10, rbx
mulx r12, rbx, [x+24]
adcx r11, rbx
mulx r13, rbx, [x+32]
adcx r12, rbx
mulx r8, rbx, [x+40]
adcx r13, rbx
adcx r8, zero
addrow 1
addrow 2
addrow 3
addrow 4
addrow 5
mov [z+48], r8
mov [z+56], r9
mov [z+64], r10
mov [z+72], r11
mov [z+80], r12
mov [z+88], r13
pop r13
pop r12
pop rbx
pop rbp
#if WINDOWS_ABI
pop rsi
pop rdi
#endif
ret
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif