#![allow(non_upper_case_globals, unused_macros, unused_imports)]
use crate::low::macros::*;
macro_rules! NUMSIZE {
() => {
"72"
};
}
macro_rules! input_z {
() => {
"rdi"
};
}
macro_rules! input_x {
() => {
"rsi"
};
}
macro_rules! x_1 { () => { Q!(input_x!() "+ 0") } }
macro_rules! y_1 { () => { Q!(input_x!() "+ " NUMSIZE!()) } }
macro_rules! z_1 { () => { Q!(input_x!() "+ (2 * " NUMSIZE!() ")") } }
macro_rules! x_3 { () => { Q!(input_z!() "+ 0") } }
macro_rules! y_3 { () => { Q!(input_z!() "+ " NUMSIZE!()) } }
macro_rules! z_3 { () => { Q!(input_z!() "+ (2 * " NUMSIZE!() ")") } }
macro_rules! z2 { () => { Q!("rsp + (" NUMSIZE!() "* 0)") } }
macro_rules! y2 { () => { Q!("rsp + (" NUMSIZE!() "* 1)") } }
macro_rules! x2p { () => { Q!("rsp + (" NUMSIZE!() "* 2)") } }
macro_rules! xy2 { () => { Q!("rsp + (" NUMSIZE!() "* 3)") } }
macro_rules! y4 { () => { Q!("rsp + (" NUMSIZE!() "* 4)") } }
macro_rules! t2 { () => { Q!("rsp + (" NUMSIZE!() "* 4)") } }
macro_rules! dx2 { () => { Q!("rsp + (" NUMSIZE!() "* 5)") } }
macro_rules! t1 { () => { Q!("rsp + (" NUMSIZE!() "* 5)") } }
macro_rules! d { () => { Q!("rsp + (" NUMSIZE!() "* 6)") } }
macro_rules! x4p { () => { Q!("rsp + (" NUMSIZE!() "* 6)") } }
macro_rules! tmp { () => { Q!("rsp + (" NUMSIZE!() "* 7)") } }
macro_rules! NSPACE {
() => {
"576"
};
}
macro_rules! mul_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "];\n"
"mov [rsp + 504], rax;\n"
"mov r9, rdx;\n"
"xor r10, r10;\n"
"xor r11, r11;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, r11;\n"
"mov [rsp + 512], r9;\n"
"xor r12, r12;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, r12;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov [rsp + 520], r10;\n"
"xor r13, r13;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, r13;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov [rsp + 528], r11;\n"
"xor r14, r14;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, r14;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov [rsp + 536], r12;\n"
"xor r15, r15;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, r15;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov [rsp + 544], r13;\n"
"xor r8, r8;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, r8;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov [rsp + 552], r14;\n"
"xor r9, r9;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, r9;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov [rsp + 560], r15;\n"
"xor r10, r10;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, r10;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov [rsp + 568], r8;\n"
"xor r11, r11;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, r11;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"xor r12, r12;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, r12;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"xor r13, r13;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, r13;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"xor r14, r14;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, r14;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"xor r15, r15;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, r15;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"xor r8, r8;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, r8;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"imul rax, [" $P2 "+ 0x40];\n"
"add rax, r8;\n"
"mov r8, [rsp + 568];\n"
"mov rdx, r8;\n"
"and rdx, 0x1ff;\n"
"shrd r8, r9, 0x9;\n"
"shrd r9, r10, 0x9;\n"
"shrd r10, r11, 0x9;\n"
"shrd r11, r12, 0x9;\n"
"shrd r12, r13, 0x9;\n"
"shrd r13, r14, 0x9;\n"
"shrd r14, r15, 0x9;\n"
"shrd r15, rax, 0x9;\n"
"shr rax, 0x9;\n"
"add rdx, rax;\n"
"stc;\n"
"adc r8, [rsp + 504];\n"
"adc r9, [rsp + 512];\n"
"adc r10, [rsp + 520];\n"
"adc r11, [rsp + 528];\n"
"adc r12, [rsp + 536];\n"
"adc r13, [rsp + 544];\n"
"adc r14, [rsp + 552];\n"
"adc r15, [rsp + 560];\n"
"adc rdx, 0xfffffffffffffe00;\n"
"cmc;\n"
"sbb r8, 0x0;\n"
"mov [" $P0 "], r8;\n"
"sbb r9, 0x0;\n"
"mov [" $P0 "+ 0x8], r9;\n"
"sbb r10, 0x0;\n"
"mov [" $P0 "+ 0x10], r10;\n"
"sbb r11, 0x0;\n"
"mov [" $P0 "+ 0x18], r11;\n"
"sbb r12, 0x0;\n"
"mov [" $P0 "+ 0x20], r12;\n"
"sbb r13, 0x0;\n"
"mov [" $P0 "+ 0x28], r13;\n"
"sbb r14, 0x0;\n"
"mov [" $P0 "+ 0x30], r14;\n"
"sbb r15, 0x0;\n"
"mov [" $P0 "+ 0x38], r15;\n"
"sbb rdx, 0x0;\n"
"and rdx, 0x1ff;\n"
"mov [" $P0 "+ 0x40], rdx"
)}
}
macro_rules! sqr_p521 {
($P0:expr, $P1:expr) => { Q!(
"mov rax, [" $P1 "];\n"
"mul rax;\n"
"mov [rsp + 504], rax;\n"
"mov r9, rdx;\n"
"xor r10, r10;\n"
"xor r11, r11;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x8];\n"
"add rax, rax;\n"
"adc rdx, rdx;\n"
"adc r11, 0x0;\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov [rsp + 512], r9;\n"
"xor r12, r12;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul rax;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x10];\n"
"add rax, rax;\n"
"adc rdx, rdx;\n"
"adc r12, 0x0;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov [rsp + 520], r10;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x18];\n"
"xor r13, r13;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x10];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r13, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r13, r13;\n"
"add r11, rbx;\n"
"adc r12, rcx;\n"
"adc r13, 0x0;\n"
"mov [rsp + 528], r11;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x20];\n"
"xor r14, r14;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x18];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r14, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r14, r14;\n"
"add r12, rbx;\n"
"adc r13, rcx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul rax;\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov [rsp + 536], r12;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x28];\n"
"xor r15, r15;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x20];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x18];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r15, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r15, r15;\n"
"add r13, rbx;\n"
"adc r14, rcx;\n"
"adc r15, 0x0;\n"
"mov [rsp + 544], r13;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"xor r8, r8;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x28];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x20];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r8, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r8, r8;\n"
"add r14, rbx;\n"
"adc r15, rcx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul rax;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov [rsp + 552], r14;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"xor r9, r9;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x28];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P1 "+ 0x20];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r9, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r9, r9;\n"
"add r15, rbx;\n"
"adc r8, rcx;\n"
"adc r9, 0x0;\n"
"mov [rsp + 560], r15;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r10, r10;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P1 "+ 0x28];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r10, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r10, r10;\n"
"add r8, rbx;\n"
"adc r9, rcx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul rax;\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov [rsp + 568], r8;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r11, r11;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P1 "+ 0x28];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r11, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r11, r11;\n"
"add r9, rbx;\n"
"adc r10, rcx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r12, r12;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r12, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r12, r12;\n"
"add r10, rbx;\n"
"adc r11, rcx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul rax;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r13, r13;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P1 "+ 0x30];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r13, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r13, r13;\n"
"add r11, rbx;\n"
"adc r12, rcx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r14, r14;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r14, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r14, r14;\n"
"add r12, rbx;\n"
"adc r13, rcx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul rax;\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"xor r15, r15;\n"
"mov rbx, rax;\n"
"mov rcx, rdx;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P1 "+ 0x38];\n"
"add rbx, rax;\n"
"adc rcx, rdx;\n"
"adc r15, 0x0;\n"
"add rbx, rbx;\n"
"adc rcx, rcx;\n"
"adc r15, r15;\n"
"add r13, rbx;\n"
"adc r14, rcx;\n"
"adc r15, 0x0;\n"
"xor r8, r8;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul rax;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"add rax, rax;\n"
"adc rdx, rdx;\n"
"adc r8, 0x0;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P1 "+ 0x40];\n"
"add rax, rax;\n"
"adc rdx, rdx;\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"imul rax, rax;\n"
"add rax, r8;\n"
"mov r8, [rsp + 568];\n"
"mov rdx, r8;\n"
"and rdx, 0x1ff;\n"
"shrd r8, r9, 0x9;\n"
"shrd r9, r10, 0x9;\n"
"shrd r10, r11, 0x9;\n"
"shrd r11, r12, 0x9;\n"
"shrd r12, r13, 0x9;\n"
"shrd r13, r14, 0x9;\n"
"shrd r14, r15, 0x9;\n"
"shrd r15, rax, 0x9;\n"
"shr rax, 0x9;\n"
"add rdx, rax;\n"
"stc;\n"
"adc r8, [rsp + 504];\n"
"adc r9, [rsp + 512];\n"
"adc r10, [rsp + 520];\n"
"adc r11, [rsp + 528];\n"
"adc r12, [rsp + 536];\n"
"adc r13, [rsp + 544];\n"
"adc r14, [rsp + 552];\n"
"adc r15, [rsp + 560];\n"
"adc rdx, 0xfffffffffffffe00;\n"
"cmc;\n"
"sbb r8, 0x0;\n"
"mov [" $P0 "], r8;\n"
"sbb r9, 0x0;\n"
"mov [" $P0 "+ 0x8], r9;\n"
"sbb r10, 0x0;\n"
"mov [" $P0 "+ 0x10], r10;\n"
"sbb r11, 0x0;\n"
"mov [" $P0 "+ 0x18], r11;\n"
"sbb r12, 0x0;\n"
"mov [" $P0 "+ 0x20], r12;\n"
"sbb r13, 0x0;\n"
"mov [" $P0 "+ 0x28], r13;\n"
"sbb r14, 0x0;\n"
"mov [" $P0 "+ 0x30], r14;\n"
"sbb r15, 0x0;\n"
"mov [" $P0 "+ 0x38], r15;\n"
"sbb rdx, 0x0;\n"
"and rdx, 0x1ff;\n"
"mov [" $P0 "+ 0x40], rdx;\n"
)}
}
macro_rules! add_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"stc;\n"
"mov rax, [" $P1 "];\n"
"adc rax, [" $P2 "];\n"
"mov rbx, [" $P1 "+ 0x8];\n"
"adc rbx, [" $P2 "+ 0x8];\n"
"mov r8, [" $P1 "+ 0x10];\n"
"adc r8, [" $P2 "+ 0x10];\n"
"mov r9, [" $P1 "+ 0x18];\n"
"adc r9, [" $P2 "+ 0x18];\n"
"mov r10, [" $P1 "+ 0x20];\n"
"adc r10, [" $P2 "+ 0x20];\n"
"mov r11, [" $P1 "+ 0x28];\n"
"adc r11, [" $P2 "+ 0x28];\n"
"mov r12, [" $P1 "+ 0x30];\n"
"adc r12, [" $P2 "+ 0x30];\n"
"mov r13, [" $P1 "+ 0x38];\n"
"adc r13, [" $P2 "+ 0x38];\n"
"mov r14, [" $P1 "+ 0x40];\n"
"adc r14, [" $P2 "+ 0x40];\n"
"mov rdx, 0x200;\n"
"and rdx, r14;\n"
"cmp rdx, 0x200;\n"
"sbb rax, 0x0;\n"
"mov [" $P0 "], rax;\n"
"sbb rbx, 0x0;\n"
"mov [" $P0 "+ 0x8], rbx;\n"
"sbb r8, 0x0;\n"
"mov [" $P0 "+ 0x10], r8;\n"
"sbb r9, 0x0;\n"
"mov [" $P0 "+ 0x18], r9;\n"
"sbb r10, 0x0;\n"
"mov [" $P0 "+ 0x20], r10;\n"
"sbb r11, 0x0;\n"
"mov [" $P0 "+ 0x28], r11;\n"
"sbb r12, 0x0;\n"
"mov [" $P0 "+ 0x30], r12;\n"
"sbb r13, 0x0;\n"
"mov [" $P0 "+ 0x38], r13;\n"
"sbb r14, rdx;\n"
"mov [" $P0 "+ 0x40], r14"
)}
}
macro_rules! sub_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"mov rax, [" $P1 "];\n"
"sub rax, [" $P2 "];\n"
"mov rdx, [" $P1 "+ 0x8];\n"
"sbb rdx, [" $P2 "+ 0x8];\n"
"mov r8, [" $P1 "+ 0x10];\n"
"sbb r8, [" $P2 "+ 0x10];\n"
"mov r9, [" $P1 "+ 0x18];\n"
"sbb r9, [" $P2 "+ 0x18];\n"
"mov r10, [" $P1 "+ 0x20];\n"
"sbb r10, [" $P2 "+ 0x20];\n"
"mov r11, [" $P1 "+ 0x28];\n"
"sbb r11, [" $P2 "+ 0x28];\n"
"mov r12, [" $P1 "+ 0x30];\n"
"sbb r12, [" $P2 "+ 0x30];\n"
"mov r13, [" $P1 "+ 0x38];\n"
"sbb r13, [" $P2 "+ 0x38];\n"
"mov r14, [" $P1 "+ 0x40];\n"
"sbb r14, [" $P2 "+ 0x40];\n"
"sbb rax, 0x0;\n"
"mov [" $P0 "], rax;\n"
"sbb rdx, 0x0;\n"
"mov [" $P0 "+ 0x8], rdx;\n"
"sbb r8, 0x0;\n"
"mov [" $P0 "+ 0x10], r8;\n"
"sbb r9, 0x0;\n"
"mov [" $P0 "+ 0x18], r9;\n"
"sbb r10, 0x0;\n"
"mov [" $P0 "+ 0x20], r10;\n"
"sbb r11, 0x0;\n"
"mov [" $P0 "+ 0x28], r11;\n"
"sbb r12, 0x0;\n"
"mov [" $P0 "+ 0x30], r12;\n"
"sbb r13, 0x0;\n"
"mov [" $P0 "+ 0x38], r13;\n"
"sbb r14, 0x0;\n"
"and r14, 0x1ff;\n"
"mov [" $P0 "+ 0x40], r14"
)}
}
macro_rules! weakmul_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "];\n"
"mov [rsp + 504], rax;\n"
"mov r9, rdx;\n"
"xor r10, r10;\n"
"xor r11, r11;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, r11;\n"
"mov [rsp + 512], r9;\n"
"xor r12, r12;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, r12;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov [rsp + 520], r10;\n"
"xor r13, r13;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, r13;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov [rsp + 528], r11;\n"
"xor r14, r14;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, r14;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov [rsp + 536], r12;\n"
"xor r15, r15;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, r15;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov [rsp + 544], r13;\n"
"xor r8, r8;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, r8;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov [rsp + 552], r14;\n"
"xor r9, r9;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, r9;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"adc r9, 0x0;\n"
"mov [rsp + 560], r15;\n"
"xor r10, r10;\n"
"mov rax, [" $P1 "];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, r10;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "];\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"adc r10, 0x0;\n"
"mov [rsp + 568], r8;\n"
"xor r11, r11;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, r11;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x8];\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"adc r11, 0x0;\n"
"xor r12, r12;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, r12;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x10];\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"adc r12, 0x0;\n"
"xor r13, r13;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, r13;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x18];\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"adc r13, 0x0;\n"
"xor r14, r14;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, r14;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x20];\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"adc r14, 0x0;\n"
"xor r15, r15;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, r15;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x28];\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"adc r15, 0x0;\n"
"xor r8, r8;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, r8;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x30];\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"adc r8, 0x0;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul QWORD PTR [" $P2 "+ 0x40];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"mul QWORD PTR [" $P2 "+ 0x38];\n"
"add r15, rax;\n"
"adc r8, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"imul rax, [" $P2 "+ 0x40];\n"
"add rax, r8;\n"
"mov r8, [rsp + 568];\n"
"mov rdx, r8;\n"
"and rdx, 0x1ff;\n"
"shrd r8, r9, 0x9;\n"
"shrd r9, r10, 0x9;\n"
"shrd r10, r11, 0x9;\n"
"shrd r11, r12, 0x9;\n"
"shrd r12, r13, 0x9;\n"
"shrd r13, r14, 0x9;\n"
"shrd r14, r15, 0x9;\n"
"shrd r15, rax, 0x9;\n"
"shr rax, 0x9;\n"
"add rdx, rax;\n"
"add r8, [rsp + 504];\n"
"adc r9, [rsp + 512];\n"
"adc r10, [rsp + 520];\n"
"adc r11, [rsp + 528];\n"
"adc r12, [rsp + 536];\n"
"adc r13, [rsp + 544];\n"
"adc r14, [rsp + 552];\n"
"adc r15, [rsp + 560];\n"
"adc rdx, 0;\n"
"mov [" $P0 "], r8;\n"
"mov [" $P0 "+ 0x8], r9;\n"
"mov [" $P0 "+ 0x10], r10;\n"
"mov [" $P0 "+ 0x18], r11;\n"
"mov [" $P0 "+ 0x20], r12;\n"
"mov [" $P0 "+ 0x28], r13;\n"
"mov [" $P0 "+ 0x30], r14;\n"
"mov [" $P0 "+ 0x38], r15;\n"
"mov [" $P0 "+ 0x40], rdx"
)}
}
macro_rules! cmsub_p521 {
($P0:expr, $C:expr, $P1:expr, $D:expr, $P2:expr) => { Q!(
"mov rcx, " $D ";\n"
"mov rax, [" $P2 "];\n"
"not rax;\n"
"mul rcx;\n"
"mov r8, rax;\n"
"mov r9, rdx;\n"
"mov rax, [" $P2 "+ 8];\n"
"not rax;\n"
"mul rcx;\n"
"xor r10d, r10d;\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"mov rax, [" $P2 "+ 16];\n"
"not rax;\n"
"mul rcx;\n"
"xor r11d, r11d;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"mov rax, [" $P2 "+ 24];\n"
"not rax;\n"
"mul rcx;\n"
"xor r12d, r12d;\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"mov rax, [" $P2 "+ 32];\n"
"not rax;\n"
"mul rcx;\n"
"xor r13d, r13d;\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"mov rax, [" $P2 "+ 40];\n"
"not rax;\n"
"mul rcx;\n"
"xor r14d, r14d;\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"mov rax, [" $P2 "+ 48];\n"
"not rax;\n"
"mul rcx;\n"
"xor r15d, r15d;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"mov rax, [" $P2 "+ 56];\n"
"not rax;\n"
"mul rcx;\n"
"xor ebx, ebx;\n"
"add r15, rax;\n"
"adc rbx, rdx;\n"
"mov rax, [" $P2 "+ 64];\n"
"xor rax, 0x1FF;\n"
"imul rax, rcx;\n"
"add rbx, rax;\n"
"xor eax, eax;\n"
"mov ecx, " $C ";\n"
"mov rax, [" $P1 "];\n"
"mul rcx;\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r15, rax;\n"
"adc rbx, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"imul rax, rcx;\n"
"add rbx, rax;\n"
"mov rax, r9;\n"
"and rax, r10;\n"
"and rax, r11;\n"
"and rax, r12;\n"
"and rax, r13;\n"
"and rax, r14;\n"
"and rax, r15;\n"
"mov rdx, rbx;\n"
"shr rdx, 9;\n"
"or rbx, ~ 0x1FF;\n"
"lea rcx, [rdx + 1];\n"
"add rcx, r8;\n"
"mov ecx, 0;\n"
"adc rax, rcx;\n"
"mov rax, rbx;\n"
"adc rax, rcx;\n"
"adc r8, rdx;\n"
"mov [" $P0 "], r8;\n"
"adc r9, rcx;\n"
"mov [" $P0 "+ 8], r9;\n"
"adc r10, rcx;\n"
"mov [" $P0 "+ 16], r10;\n"
"adc r11, rcx;\n"
"mov [" $P0 "+ 24], r11;\n"
"adc r12, rcx;\n"
"mov [" $P0 "+ 32], r12;\n"
"adc r13, rcx;\n"
"mov [" $P0 "+ 40], r13;\n"
"adc r14, rcx;\n"
"mov [" $P0 "+ 48], r14;\n"
"adc r15, rcx;\n"
"mov [" $P0 "+ 56], r15;\n"
"adc rbx, rcx;\n"
"and rbx, 0x1FF;\n"
"mov [" $P0 "+ 64], rbx"
)}
}
macro_rules! cmsub38_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"mov rbx, [" $P2 "+ 64];\n"
"xor rbx, 0x1FF;\n"
"mov r15, [" $P2 "+ 56];\n"
"not r15;\n"
"shld rbx, r15, 3;\n"
"mov r14, [" $P2 "+ 48];\n"
"not r14;\n"
"shld r15, r14, 3;\n"
"mov r13, [" $P2 "+ 40];\n"
"not r13;\n"
"shld r14, r13, 3;\n"
"mov r12, [" $P2 "+ 32];\n"
"not r12;\n"
"shld r13, r12, 3;\n"
"mov r11, [" $P2 "+ 24];\n"
"not r11;\n"
"shld r12, r11, 3;\n"
"mov r10, [" $P2 "+ 16];\n"
"not r10;\n"
"shld r11, r10, 3;\n"
"mov r9, [" $P2 "+ 8];\n"
"not r9;\n"
"shld r10, r9, 3;\n"
"mov r8, [" $P2 "];\n"
"not r8;\n"
"shld r9, r8, 3;\n"
"shl r8, 3;\n"
"mov ecx, 3;\n"
"mov rax, [" $P1 "];\n"
"mul rcx;\n"
"add r8, rax;\n"
"adc r9, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x8];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r9, rax;\n"
"adc r10, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x10];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r10, rax;\n"
"adc r11, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x18];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r11, rax;\n"
"adc r12, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x20];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r12, rax;\n"
"adc r13, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x28];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r13, rax;\n"
"adc r14, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x30];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r14, rax;\n"
"adc r15, rdx;\n"
"sbb rbp, rbp;\n"
"mov rax, [" $P1 "+ 0x38];\n"
"mul rcx;\n"
"sub rdx, rbp;\n"
"add r15, rax;\n"
"adc rbx, rdx;\n"
"mov rax, [" $P1 "+ 0x40];\n"
"imul rax, rcx;\n"
"add rbx, rax;\n"
"mov rax, r9;\n"
"and rax, r10;\n"
"and rax, r11;\n"
"and rax, r12;\n"
"and rax, r13;\n"
"and rax, r14;\n"
"and rax, r15;\n"
"mov rdx, rbx;\n"
"shr rdx, 9;\n"
"or rbx, ~ 0x1FF;\n"
"lea rcx, [rdx + 1];\n"
"add rcx, r8;\n"
"mov ecx, 0;\n"
"adc rax, rcx;\n"
"mov rax, rbx;\n"
"adc rax, rcx;\n"
"adc r8, rdx;\n"
"mov [" $P0 "], r8;\n"
"adc r9, rcx;\n"
"mov [" $P0 "+ 8], r9;\n"
"adc r10, rcx;\n"
"mov [" $P0 "+ 16], r10;\n"
"adc r11, rcx;\n"
"mov [" $P0 "+ 24], r11;\n"
"adc r12, rcx;\n"
"mov [" $P0 "+ 32], r12;\n"
"adc r13, rcx;\n"
"mov [" $P0 "+ 40], r13;\n"
"adc r14, rcx;\n"
"mov [" $P0 "+ 48], r14;\n"
"adc r15, rcx;\n"
"mov [" $P0 "+ 56], r15;\n"
"adc rbx, rcx;\n"
"and rbx, 0x1FF;\n"
"mov [" $P0 "+ 64], rbx"
)}
}
macro_rules! cmsub41_p521 {
($P0:expr, $P1:expr, $P2:expr) => { Q!(
"mov rbx, [" $P1 "+ 64];\n"
"mov r15, [" $P1 "+ 56];\n"
"shld rbx, r15, 2;\n"
"mov r14, [" $P1 "+ 48];\n"
"shld r15, r14, 2;\n"
"mov r13, [" $P1 "+ 40];\n"
"shld r14, r13, 2;\n"
"mov r12, [" $P1 "+ 32];\n"
"shld r13, r12, 2;\n"
"mov r11, [" $P1 "+ 24];\n"
"shld r12, r11, 2;\n"
"mov r10, [" $P1 "+ 16];\n"
"shld r11, r10, 2;\n"
"mov r9, [" $P1 "+ 8];\n"
"shld r10, r9, 2;\n"
"mov r8, [" $P1 "];\n"
"shld r9, r8, 2;\n"
"shl r8, 2;\n"
"mov rcx, [" $P2 "+ 64];\n"
"xor rcx, 0x1FF;\n"
"mov rax, [" $P2 "];\n"
"not rax;\n"
"add r8, rax;\n"
"mov rax, [" $P2 "+ 8];\n"
"not rax;\n"
"adc r9, rax;\n"
"mov rax, [" $P2 "+ 16];\n"
"not rax;\n"
"adc r10, rax;\n"
"mov rax, [" $P2 "+ 24];\n"
"not rax;\n"
"adc r11, rax;\n"
"mov rax, [" $P2 "+ 32];\n"
"not rax;\n"
"adc r12, rax;\n"
"mov rax, [" $P2 "+ 40];\n"
"not rax;\n"
"adc r13, rax;\n"
"mov rax, [" $P2 "+ 48];\n"
"not rax;\n"
"adc r14, rax;\n"
"mov rax, [" $P2 "+ 56];\n"
"not rax;\n"
"adc r15, rax;\n"
"adc rbx, rcx;\n"
"mov rax, r9;\n"
"and rax, r10;\n"
"and rax, r11;\n"
"and rax, r12;\n"
"and rax, r13;\n"
"and rax, r14;\n"
"and rax, r15;\n"
"mov rdx, rbx;\n"
"shr rdx, 9;\n"
"or rbx, ~ 0x1FF;\n"
"lea rcx, [rdx + 1];\n"
"add rcx, r8;\n"
"mov ecx, 0;\n"
"adc rax, rcx;\n"
"mov rax, rbx;\n"
"adc rax, rcx;\n"
"adc r8, rdx;\n"
"mov [" $P0 "], r8;\n"
"adc r9, rcx;\n"
"mov [" $P0 "+ 8], r9;\n"
"adc r10, rcx;\n"
"mov [" $P0 "+ 16], r10;\n"
"adc r11, rcx;\n"
"mov [" $P0 "+ 24], r11;\n"
"adc r12, rcx;\n"
"mov [" $P0 "+ 32], r12;\n"
"adc r13, rcx;\n"
"mov [" $P0 "+ 40], r13;\n"
"adc r14, rcx;\n"
"mov [" $P0 "+ 48], r14;\n"
"adc r15, rcx;\n"
"mov [" $P0 "+ 56], r15;\n"
"adc rbx, rcx;\n"
"and rbx, 0x1FF;\n"
"mov [" $P0 "+ 64], rbx"
)}
}
pub(crate) fn p521_jdouble_alt(p3: &mut [u64; 27], p1: &[u64; 27]) {
unsafe {
core::arch::asm!(
Q!(" endbr64 " ),
Q!(" push " "rbx"),
Q!(" push " "rbp"),
Q!(" push " "r12"),
Q!(" push " "r13"),
Q!(" push " "r14"),
Q!(" push " "r15"),
Q!(" sub " "rsp, " NSPACE!()),
sqr_p521!(z2!(), z_1!()),
sqr_p521!(y2!(), y_1!()),
add_p521!(t1!(), x_1!(), z2!()),
sub_p521!(t2!(), x_1!(), z2!()),
mul_p521!(x2p!(), t1!(), t2!()),
add_p521!(t1!(), y_1!(), z_1!()),
sqr_p521!(x4p!(), x2p!()),
weakmul_p521!(xy2!(), x_1!(), y2!()),
sqr_p521!(t2!(), t1!()),
cmsub_p521!(d!(), "12", xy2!(), "9", x4p!()),
sub_p521!(t1!(), t2!(), z2!()),
sqr_p521!(y4!(), y2!()),
sub_p521!(z_3!(), t1!(), y2!()),
weakmul_p521!(dx2!(), d!(), x2p!()),
cmsub41_p521!(x_3!(), xy2!(), d!()),
cmsub38_p521!(y_3!(), dx2!(), y4!()),
Q!(" add " "rsp, " NSPACE!()),
Q!(" pop " "r15"),
Q!(" pop " "r14"),
Q!(" pop " "r13"),
Q!(" pop " "r12"),
Q!(" pop " "rbp"),
Q!(" pop " "rbx"),
inout("rdi") p3.as_mut_ptr() => _,
inout("rsi") p1.as_ptr() => _,
out("r10") _,
out("r11") _,
out("r12") _,
out("r13") _,
out("r14") _,
out("r15") _,
out("r8") _,
out("r9") _,
out("rax") _,
out("rcx") _,
out("rdx") _,
)
};
}