#![allow(non_upper_case_globals, unused_macros, unused_imports)]
use crate::low::macros::*;
pub(crate) fn sha3_keccak_f1600(a: &mut [u64; 25], rc: &[u64; 24]) {
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, 208"),
Q!(" not " "QWORD PTR [rdi + 0x08]"),
Q!(" not " "QWORD PTR [rdi + 0x10]"),
Q!(" not " "QWORD PTR [rdi + 0x40]"),
Q!(" not " "QWORD PTR [rdi + 0x60]"),
Q!(" not " "QWORD PTR [rdi + 0x88]"),
Q!(" not " "QWORD PTR [rdi + 0xa0]"),
Q!(" lea " "r15, [rsp]"),
Q!(" mov " "rax, QWORD PTR [rdi + 0xa0]"),
Q!(" mov " "rbx, QWORD PTR [rdi + 0xa8]"),
Q!(" mov " "rcx, QWORD PTR [rdi + 0xb0]"),
Q!(" mov " "rdx, QWORD PTR [rdi + 0xb8]"),
Q!(" mov " "rbp, QWORD PTR [rdi + 0xc0]"),
Q!(" mov " "r8, 0x0"),
Q!(Label!("Lsha3_keccak_f1600_loop", 2) ":"),
Q!(" mov " "QWORD PTR [rsp + 0xc8], r8"),
Q!(" mov " "r8, QWORD PTR [rdi]"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x30]"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x60]"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x90]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x10]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x18]"),
Q!(" xor " "rax, r8"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x08]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x38]"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x28]"),
Q!(" mov " "r12, rbp"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x20]"),
Q!(" xor " "rcx, r10"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x50]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x40]"),
Q!(" xor " "rbx, r9"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x48]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x88]"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x78]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x68]"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x58]"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x70]"),
Q!(" mov " "r13, rcx"),
Q!(" rol " "rcx, 1"),
Q!(" xor " "rcx, rax"),
Q!(" xor " "rdx, r11"),
Q!(" rol " "rax, 1"),
Q!(" xor " "rax, rdx"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x80]"),
Q!(" rol " "rdx, 1"),
Q!(" xor " "rdx, rbx"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x98]"),
Q!(" rol " "rbx, 1"),
Q!(" xor " "rbx, rbp"),
Q!(" rol " "rbp, 1"),
Q!(" xor " "rbp, r13"),
Q!(" xor " "r9, rcx"),
Q!(" xor " "r10, rdx"),
Q!(" rol " "r9, 0x2c"),
Q!(" xor " "r11, rbp"),
Q!(" xor " "r12, rax"),
Q!(" rol " "r10, 0x2b"),
Q!(" xor " "r8, rbx"),
Q!(" mov " "r13, r9"),
Q!(" rol " "r11, 0x15"),
Q!(" or " "r9, r10"),
Q!(" xor " "r9, r8"),
Q!(" rol " "r12, 0xe"),
Q!(" xor " "r9, QWORD PTR [rsi]"),
Q!(" mov " "r14, r12"),
Q!(" and " "r12, r11"),
Q!(" mov " "QWORD PTR [r15], r9"),
Q!(" xor " "r12, r10"),
Q!(" not " "r10"),
Q!(" mov " "QWORD PTR [r15 + 0x10], r12"),
Q!(" or " "r10, r11"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xb0]"),
Q!(" xor " "r10, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x08], r10"),
Q!(" and " "r13, r8"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x48]"),
Q!(" xor " "r13, r14"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x50]"),
Q!(" mov " "QWORD PTR [r15 + 0x20], r13"),
Q!(" or " "r14, r8"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x18]"),
Q!(" xor " "r14, r11"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x80]"),
Q!(" mov " "QWORD PTR [r15 + 0x18], r14"),
Q!(" xor " "r8, rbp"),
Q!(" xor " "r12, rdx"),
Q!(" rol " "r8, 0x1c"),
Q!(" xor " "r11, rcx"),
Q!(" xor " "r9, rax"),
Q!(" rol " "r12, 0x3d"),
Q!(" rol " "r11, 0x2d"),
Q!(" xor " "r10, rbx"),
Q!(" rol " "r9, 0x14"),
Q!(" mov " "r13, r8"),
Q!(" or " "r8, r12"),
Q!(" rol " "r10, 0x3"),
Q!(" xor " "r8, r11"),
Q!(" mov " "QWORD PTR [r15 + 0x40], r8"),
Q!(" mov " "r14, r9"),
Q!(" and " "r9, r13"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x08]"),
Q!(" xor " "r9, r12"),
Q!(" not " "r12"),
Q!(" mov " "QWORD PTR [r15 + 0x48], r9"),
Q!(" or " "r12, r11"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x38]"),
Q!(" xor " "r12, r10"),
Q!(" mov " "QWORD PTR [r15 + 0x38], r12"),
Q!(" and " "r11, r10"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xa0]"),
Q!(" xor " "r11, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x30], r11"),
Q!(" or " "r14, r10"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x68]"),
Q!(" xor " "r14, r13"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x98]"),
Q!(" mov " "QWORD PTR [r15 + 0x28], r14"),
Q!(" xor " "r10, rbp"),
Q!(" xor " "r11, rax"),
Q!(" rol " "r10, 0x19"),
Q!(" xor " "r9, rdx"),
Q!(" rol " "r11, 0x8"),
Q!(" xor " "r12, rbx"),
Q!(" rol " "r9, 0x6"),
Q!(" xor " "r8, rcx"),
Q!(" rol " "r12, 0x12"),
Q!(" mov " "r13, r10"),
Q!(" and " "r10, r11"),
Q!(" rol " "r8, 1"),
Q!(" not " "r11"),
Q!(" xor " "r10, r9"),
Q!(" mov " "QWORD PTR [r15 + 0x58], r10"),
Q!(" mov " "r14, r12"),
Q!(" and " "r12, r11"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x58]"),
Q!(" xor " "r12, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x60], r12"),
Q!(" or " "r13, r9"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xb8]"),
Q!(" xor " "r13, r8"),
Q!(" mov " "QWORD PTR [r15 + 0x50], r13"),
Q!(" and " "r9, r8"),
Q!(" xor " "r9, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x70], r9"),
Q!(" or " "r14, r8"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x28]"),
Q!(" xor " "r14, r11"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x88]"),
Q!(" mov " "QWORD PTR [r15 + 0x68], r14"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x20]"),
Q!(" xor " "r10, rcx"),
Q!(" xor " "r11, rdx"),
Q!(" rol " "r10, 0xa"),
Q!(" xor " "r9, rbx"),
Q!(" rol " "r11, 0xf"),
Q!(" xor " "r12, rbp"),
Q!(" rol " "r9, 0x24"),
Q!(" xor " "r8, rax"),
Q!(" rol " "r12, 0x38"),
Q!(" mov " "r13, r10"),
Q!(" or " "r10, r11"),
Q!(" rol " "r8, 0x1b"),
Q!(" not " "r11"),
Q!(" xor " "r10, r9"),
Q!(" mov " "QWORD PTR [r15 + 0x80], r10"),
Q!(" mov " "r14, r12"),
Q!(" or " "r12, r11"),
Q!(" xor " "r12, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x88], r12"),
Q!(" and " "r13, r9"),
Q!(" xor " "r13, r8"),
Q!(" mov " "QWORD PTR [r15 + 0x78], r13"),
Q!(" or " "r9, r8"),
Q!(" xor " "r9, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x98], r9"),
Q!(" and " "r8, r14"),
Q!(" xor " "r8, r11"),
Q!(" mov " "QWORD PTR [r15 + 0x90], r8"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x10]"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x40]"),
Q!(" rol " "rdx, 0x3e"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0xa8]"),
Q!(" rol " "rbp, 0x37"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x70]"),
Q!(" rol " "rcx, 0x2"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x78]"),
Q!(" xchg " "rdi, r15"),
Q!(" rol " "rax, 0x27"),
Q!(" rol " "rbx, 0x29"),
Q!(" mov " "r13, rdx"),
Q!(" and " "rdx, rbp"),
Q!(" not " "rbp"),
Q!(" xor " "rdx, rcx"),
Q!(" mov " "QWORD PTR [rdi + 0xc0], rdx"),
Q!(" mov " "r14, rax"),
Q!(" and " "rax, rbp"),
Q!(" xor " "rax, r13"),
Q!(" mov " "QWORD PTR [rdi + 0xa0], rax"),
Q!(" or " "r13, rcx"),
Q!(" xor " "r13, rbx"),
Q!(" mov " "QWORD PTR [rdi + 0xb8], r13"),
Q!(" and " "rcx, rbx"),
Q!(" xor " "rcx, r14"),
Q!(" mov " "QWORD PTR [rdi + 0xb0], rcx"),
Q!(" or " "rbx, r14"),
Q!(" xor " "rbx, rbp"),
Q!(" mov " "QWORD PTR [rdi + 0xa8], rbx"),
Q!(" mov " "rbp, rdx"),
Q!(" mov " "rdx, r13"),
Q!(" lea " "rsi, [rsi + 0x8]"),
Q!(" mov " "r8, QWORD PTR [rdi]"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x30]"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x60]"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x90]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x10]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x18]"),
Q!(" xor " "rax, r8"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x08]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x38]"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x28]"),
Q!(" mov " "r12, rbp"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x20]"),
Q!(" xor " "rcx, r10"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x50]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x40]"),
Q!(" xor " "rbx, r9"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x48]"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0x88]"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x78]"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x68]"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x58]"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x70]"),
Q!(" mov " "r13, rcx"),
Q!(" rol " "rcx, 1"),
Q!(" xor " "rcx, rax"),
Q!(" xor " "rdx, r11"),
Q!(" rol " "rax, 1"),
Q!(" xor " "rax, rdx"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x80]"),
Q!(" rol " "rdx, 1"),
Q!(" xor " "rdx, rbx"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x98]"),
Q!(" rol " "rbx, 1"),
Q!(" xor " "rbx, rbp"),
Q!(" rol " "rbp, 1"),
Q!(" xor " "rbp, r13"),
Q!(" xor " "r9, rcx"),
Q!(" xor " "r10, rdx"),
Q!(" rol " "r9, 0x2c"),
Q!(" xor " "r11, rbp"),
Q!(" xor " "r12, rax"),
Q!(" rol " "r10, 0x2b"),
Q!(" xor " "r8, rbx"),
Q!(" mov " "r13, r9"),
Q!(" rol " "r11, 0x15"),
Q!(" or " "r9, r10"),
Q!(" xor " "r9, r8"),
Q!(" rol " "r12, 0xe"),
Q!(" xor " "r9, QWORD PTR [rsi]"),
Q!(" mov " "r14, r12"),
Q!(" and " "r12, r11"),
Q!(" mov " "QWORD PTR [r15], r9"),
Q!(" xor " "r12, r10"),
Q!(" not " "r10"),
Q!(" mov " "QWORD PTR [r15 + 0x10], r12"),
Q!(" or " "r10, r11"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xb0]"),
Q!(" xor " "r10, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x08], r10"),
Q!(" and " "r13, r8"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x48]"),
Q!(" xor " "r13, r14"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x50]"),
Q!(" mov " "QWORD PTR [r15 + 0x20], r13"),
Q!(" or " "r14, r8"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x18]"),
Q!(" xor " "r14, r11"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x80]"),
Q!(" mov " "QWORD PTR [r15 + 0x18], r14"),
Q!(" xor " "r8, rbp"),
Q!(" xor " "r12, rdx"),
Q!(" rol " "r8, 0x1c"),
Q!(" xor " "r11, rcx"),
Q!(" xor " "r9, rax"),
Q!(" rol " "r12, 0x3d"),
Q!(" rol " "r11, 0x2d"),
Q!(" xor " "r10, rbx"),
Q!(" rol " "r9, 0x14"),
Q!(" mov " "r13, r8"),
Q!(" or " "r8, r12"),
Q!(" rol " "r10, 0x3"),
Q!(" xor " "r8, r11"),
Q!(" mov " "QWORD PTR [r15 + 0x40], r8"),
Q!(" mov " "r14, r9"),
Q!(" and " "r9, r13"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x08]"),
Q!(" xor " "r9, r12"),
Q!(" not " "r12"),
Q!(" mov " "QWORD PTR [r15 + 0x48], r9"),
Q!(" or " "r12, r11"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x38]"),
Q!(" xor " "r12, r10"),
Q!(" mov " "QWORD PTR [r15 + 0x38], r12"),
Q!(" and " "r11, r10"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xa0]"),
Q!(" xor " "r11, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x30], r11"),
Q!(" or " "r14, r10"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x68]"),
Q!(" xor " "r14, r13"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x98]"),
Q!(" mov " "QWORD PTR [r15 + 0x28], r14"),
Q!(" xor " "r10, rbp"),
Q!(" xor " "r11, rax"),
Q!(" rol " "r10, 0x19"),
Q!(" xor " "r9, rdx"),
Q!(" rol " "r11, 0x8"),
Q!(" xor " "r12, rbx"),
Q!(" rol " "r9, 0x6"),
Q!(" xor " "r8, rcx"),
Q!(" rol " "r12, 0x12"),
Q!(" mov " "r13, r10"),
Q!(" and " "r10, r11"),
Q!(" rol " "r8, 1"),
Q!(" not " "r11"),
Q!(" xor " "r10, r9"),
Q!(" mov " "QWORD PTR [r15 + 0x58], r10"),
Q!(" mov " "r14, r12"),
Q!(" and " "r12, r11"),
Q!(" mov " "r10, QWORD PTR [rdi + 0x58]"),
Q!(" xor " "r12, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x60], r12"),
Q!(" or " "r13, r9"),
Q!(" mov " "r12, QWORD PTR [rdi + 0xb8]"),
Q!(" xor " "r13, r8"),
Q!(" mov " "QWORD PTR [r15 + 0x50], r13"),
Q!(" and " "r9, r8"),
Q!(" xor " "r9, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x70], r9"),
Q!(" or " "r14, r8"),
Q!(" mov " "r9, QWORD PTR [rdi + 0x28]"),
Q!(" xor " "r14, r11"),
Q!(" mov " "r11, QWORD PTR [rdi + 0x88]"),
Q!(" mov " "QWORD PTR [r15 + 0x68], r14"),
Q!(" mov " "r8, QWORD PTR [rdi + 0x20]"),
Q!(" xor " "r10, rcx"),
Q!(" xor " "r11, rdx"),
Q!(" rol " "r10, 0xa"),
Q!(" xor " "r9, rbx"),
Q!(" rol " "r11, 0xf"),
Q!(" xor " "r12, rbp"),
Q!(" rol " "r9, 0x24"),
Q!(" xor " "r8, rax"),
Q!(" rol " "r12, 0x38"),
Q!(" mov " "r13, r10"),
Q!(" or " "r10, r11"),
Q!(" rol " "r8, 0x1b"),
Q!(" not " "r11"),
Q!(" xor " "r10, r9"),
Q!(" mov " "QWORD PTR [r15 + 0x80], r10"),
Q!(" mov " "r14, r12"),
Q!(" or " "r12, r11"),
Q!(" xor " "r12, r13"),
Q!(" mov " "QWORD PTR [r15 + 0x88], r12"),
Q!(" and " "r13, r9"),
Q!(" xor " "r13, r8"),
Q!(" mov " "QWORD PTR [r15 + 0x78], r13"),
Q!(" or " "r9, r8"),
Q!(" xor " "r9, r14"),
Q!(" mov " "QWORD PTR [r15 + 0x98], r9"),
Q!(" and " "r8, r14"),
Q!(" xor " "r8, r11"),
Q!(" mov " "QWORD PTR [r15 + 0x90], r8"),
Q!(" xor " "rdx, QWORD PTR [rdi + 0x10]"),
Q!(" xor " "rbp, QWORD PTR [rdi + 0x40]"),
Q!(" rol " "rdx, 0x3e"),
Q!(" xor " "rcx, QWORD PTR [rdi + 0xa8]"),
Q!(" rol " "rbp, 0x37"),
Q!(" xor " "rax, QWORD PTR [rdi + 0x70]"),
Q!(" rol " "rcx, 0x2"),
Q!(" xor " "rbx, QWORD PTR [rdi + 0x78]"),
Q!(" xchg " "rdi, r15"),
Q!(" rol " "rax, 0x27"),
Q!(" rol " "rbx, 0x29"),
Q!(" mov " "r13, rdx"),
Q!(" and " "rdx, rbp"),
Q!(" not " "rbp"),
Q!(" xor " "rdx, rcx"),
Q!(" mov " "QWORD PTR [rdi + 0xc0], rdx"),
Q!(" mov " "r14, rax"),
Q!(" and " "rax, rbp"),
Q!(" xor " "rax, r13"),
Q!(" mov " "QWORD PTR [rdi + 0xa0], rax"),
Q!(" or " "r13, rcx"),
Q!(" xor " "r13, rbx"),
Q!(" mov " "QWORD PTR [rdi + 0xb8], r13"),
Q!(" and " "rcx, rbx"),
Q!(" xor " "rcx, r14"),
Q!(" mov " "QWORD PTR [rdi + 0xb0], rcx"),
Q!(" or " "rbx, r14"),
Q!(" xor " "rbx, rbp"),
Q!(" mov " "QWORD PTR [rdi + 0xa8], rbx"),
Q!(" mov " "rbp, rdx"),
Q!(" mov " "rdx, r13"),
Q!(" lea " "rsi, [rsi + 0x8]"),
Q!(" mov " "r8, QWORD PTR [rsp + 0xc8]"),
Q!(" add " "r8, 0x2"),
Q!(" cmp " "r8, 24"),
Q!(" jne " Label!("Lsha3_keccak_f1600_loop", 2, Before)),
Q!(" lea " "rsi, [rsi -0xc0]"),
Q!(" not " "QWORD PTR [rdi + 0x08]"),
Q!(" not " "QWORD PTR [rdi + 0x10]"),
Q!(" not " "QWORD PTR [rdi + 0x40]"),
Q!(" not " "QWORD PTR [rdi + 0x60]"),
Q!(" not " "QWORD PTR [rdi + 0x88]"),
Q!(" not " "QWORD PTR [rdi + 0xa0]"),
Q!(" add " "rsp, 208"),
Q!(" pop " "r15"),
Q!(" pop " "r14"),
Q!(" pop " "r13"),
Q!(" pop " "r12"),
Q!(" pop " "rbp"),
Q!(" pop " "rbx"),
inout("rdi") a.as_mut_ptr() => _,
inout("rsi") rc.as_ptr() => _,
out("r10") _,
out("r11") _,
out("r12") _,
out("r13") _,
out("r14") _,
out("r15") _,
out("r8") _,
out("r9") _,
out("rax") _,
out("rcx") _,
out("rdx") _,
)
};
}