// File: /workspace/github_c_makefile_star2_O0/mjosaarinen[P]brutus/crypto_aead/lunarkeyakv2/Haswell/KeccakP-1600-AVX2.cpp
// Function: KeccakP1600_ExtractBytes
void KeccakP1600_ExtractBytes(const void *state, UINT8 *data, size_t offset, size_t length)
//*********************************************************************************
{
    keccak_state_t  &s = *(keccak_state_t *)state;
    UINT64  t[25];
    UINT64  *d = (!offset && (length >= sizeof(t))) ? (UINT64 *)data : t;
    UINT64  *c4 = (UINT64 *)&s.c4;

    if ((d == t) && (length > sizeof(t)))
        length = sizeof(t);

    STORE(d + 0*5, s.a0);
    STORE(d + 1*5, s.a1);
    STORE(d + 2*5, s.a2);
    STORE(d + 3*5, s.a3);
    STORE(d + 4*5, s.a4);

    d[0*5 + 4] = c4[0];
    d[1*5 + 4] = c4[1];
    d[2*5 + 4] = c4[2];
    d[3*5 + 4] = c4[3];
    d[4*5 + 4] = c4[4]; //s.a44[0]

    if (d == t)
        memcpy(data, (UINT8 *)t + offset, length);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
andq $-0x20, %rsp
subq $0x260, %rsp            # imm = 0x260
movq %rdi, 0x118(%rsp)
movq %rsi, 0x110(%rsp)
movq %rdx, 0x108(%rsp)
movq %rcx, 0x100(%rsp)
movq 0x118(%rsp), %rax
movq %rax, 0xf8(%rsp)
cmpq $0x0, 0x108(%rsp)
jne 0x6ac7
cmpq $0xc8, 0x100(%rsp)
jb 0x6ac7
movq 0x110(%rsp), %rax
movq %rax, 0x18(%rsp)
jmp 0x6ad1
leaq 0x30(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0xf8(%rsp), %rax
addq $0xa0, %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
leaq 0x30(%rsp), %rcx
cmpq %rcx, %rax
jne 0x6b17
cmpq $0xc8, 0x100(%rsp)
jbe 0x6b17
movq $0xc8, 0x100(%rsp)
movq 0x28(%rsp), %rax
movq 0xf8(%rsp), %rcx
vmovdqa (%rcx), %ymm0
movq %rax, 0x248(%rsp)
vmovdqa %ymm0, 0x220(%rsp)
vmovdqa 0x220(%rsp), %ymm0
movq 0x248(%rsp), %rax
vmovdqu %ymm0, (%rax)
movq 0x28(%rsp), %rax
addq $0x28, %rax
movq 0xf8(%rsp), %rcx
vmovdqa 0x20(%rcx), %ymm0
movq %rax, 0x218(%rsp)
vmovdqa %ymm0, 0x1e0(%rsp)
vmovdqa 0x1e0(%rsp), %ymm0
movq 0x218(%rsp), %rax
vmovdqu %ymm0, (%rax)
movq 0x28(%rsp), %rax
addq $0x50, %rax
movq 0xf8(%rsp), %rcx
vmovdqa 0x40(%rcx), %ymm0
movq %rax, 0x1d8(%rsp)
vmovdqa %ymm0, 0x1a0(%rsp)
vmovdqa 0x1a0(%rsp), %ymm0
movq 0x1d8(%rsp), %rax
vmovdqu %ymm0, (%rax)
movq 0x28(%rsp), %rax
addq $0x78, %rax
movq 0xf8(%rsp), %rcx
vmovdqa 0x60(%rcx), %ymm0
movq %rax, 0x198(%rsp)
vmovdqa %ymm0, 0x160(%rsp)
vmovdqa 0x160(%rsp), %ymm0
movq 0x198(%rsp), %rax
vmovdqu %ymm0, (%rax)
movq 0x28(%rsp), %rax
addq $0xa0, %rax
movq 0xf8(%rsp), %rcx
vmovdqa 0x80(%rcx), %ymm0
movq %rax, 0x158(%rsp)
vmovdqa %ymm0, 0x120(%rsp)
vmovdqa 0x120(%rsp), %ymm0
movq 0x158(%rsp), %rax
vmovdqu %ymm0, (%rax)
movq 0x20(%rsp), %rax
movq (%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x20(%rax)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x48(%rax)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x70(%rax)
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x98(%rax)
movq 0x20(%rsp), %rax
movq 0x20(%rax), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0xc0(%rax)
movq 0x28(%rsp), %rax
leaq 0x30(%rsp), %rcx
cmpq %rcx, %rax
jne 0x6cd6
movq 0x110(%rsp), %rdi
leaq 0x30(%rsp), %rsi
addq 0x108(%rsp), %rsi
movq 0x100(%rsp), %rdx
vzeroupper
callq 0x5590
movq %rbp, %rsp
popq %rbp
vzeroupper
retq
nop