// File: /workspace/github_c_makefile_star2_O1/mjosaarinen[P]brutus/crypto_aead/lunarkeyakv2/Haswell/KeccakP-1600-AVX2.cpp
// Function: KeccakF1600_FastLoop_Absorb
size_t KeccakF1600_FastLoop_Absorb(void *state, size_t laneCount, const UINT8 *data, size_t dataByteLen)
//**************************************************************************************************************
{
    KECCAK_PERMUTE_VARS
    const UINT64    *d;
    ptrdiff_t       di;

    KECCAK_LOAD

    for (di = 0; di <= (ptrdiff_t)(dataByteLen / sizeof(UINT64) - laneCount); di += laneCount)
    {
        d = (UINT64 *)data + di;

        switch (laneCount)
        {
        case 9:     //576
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            c4 = XOR(c4, MASKLOAD(d + 0*5 + 4, 1, 0, 0, 0));
            break;

        case 13:    //832
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, MASKLOAD(d + 2*5, 1, 1, 1, 0));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], 0, 0));
            break;

        case 16:    //1024
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, LOAD(d + 2*5));
            a3 = XOR(a3, MASKLOAD(d + 3*5, 1, 0, 0, 0));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], d[2*5 + 4], 0));
            break;

        case 17:    //1088
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, LOAD(d + 2*5));
            a3 = XOR(a3, MASKLOAD(d + 3*5, 1, 1, 0, 0));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], d[2*5 + 4], 0));
            break;

        case 18:    //1152
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, LOAD(d + 2*5));
            a3 = XOR(a3, MASKLOAD(d + 3*5, 1, 1, 1, 0));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], d[2*5 + 4], 0));
            break;

        case 21:    //1344
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, LOAD(d + 2*5));
            a3 = XOR(a3, LOAD(d + 3*5));
            a4 = XOR(a4, MASKLOAD(d + 4*5, 1, 0, 0, 0));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], d[2*5 + 4], d[3*5 + 4]));
            break;

        case 25:    //1600
            a0 = XOR(a0, LOAD(d + 0*5));
            a1 = XOR(a1, LOAD(d + 1*5));
            a2 = XOR(a2, LOAD(d + 2*5));
            a3 = XOR(a3, LOAD(d + 3*5));
            a4 = XOR(a4, LOAD(d + 4*5));
            c4 = XOR(c4, SET(d[0*5 + 4], d[1*5 + 4], d[2*5 + 4], d[3*5 + 4]));
            a44 = XOR(a44, LOAD0(d + 4*5 + 4));
            break;

        default:
            KECCAK_STORE

            KeccakP1600_AddBytes(state, (UINT8 *)d, 0, laneCount * sizeof(UINT64));

            KECCAK_LOAD
        } //switch (laneCount)

        KECCAK_PERMUTE(_)
    } //for (di
    
    KECCAK_STORE

    return di * sizeof(UINT64);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rcx, %r13
vmovups (%rdi), %ymm1
vmovups 0x20(%rdi), %ymm2
vmovdqu 0x40(%rdi), %ymm3
vmovdqu 0x60(%rdi), %ymm4
vmovdqu 0x80(%rdi), %ymm5
vmovdqu 0xa0(%rdi), %ymm11
movq %rdi, (%rsp)
vmovdqu 0xc0(%rdi), %ymm12
shrq $0x3, %r13
subq %rsi, %r13
js 0x6678
movq %rdx, %r12
movq %rsi, %r15
leaq (,%rsi,8), %rcx
xorl %r14d, %r14d
leaq -0x9(%rsi), %rdi
movq 0x21e10(%rip), %rdx     # 0x27ff8
leaq 0x1d025(%rip), %r9      # 0x23214
movb $0x7, %r10b
vpmovzxbd 0x1d015(%rip), %xmm13 # 0x23210
xorl %ebp, %ebp
movq %rsi, 0x10(%rsp)
movq %rdi, 0x8(%rsp)
movq (%rsp), %rbx
leaq (%r12,%r14), %rsi
cmpq $0x10, %rdi
ja 0x6237
movslq (%r9,%rdi,4), %rax
addq %r9, %rax
jmpq *%rax
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vmovq 0x20(%r12,%r14), %xmm0
jmp 0x640f
vmovups %ymm1, (%rbx)
vmovups %ymm2, 0x20(%rbx)
vmovdqu %ymm3, 0x40(%rbx)
vmovdqu %ymm4, 0x60(%rbx)
vmovdqu %ymm5, 0x80(%rbx)
vmovdqu %ymm11, 0xa0(%rbx)
vmovdqu %ymm12, 0xc0(%rbx)
movq %rbx, %rdi
xorl %edx, %edx
movq %rcx, %r15
vzeroupper
callq 0x54d0
vpmovzxbd 0x1cf95(%rip), %xmm13 # 0x23210
movb $0x7, %r10b
leaq 0x1cf8f(%rip), %r9      # 0x23214
movq 0x21d6c(%rip), %rdx     # 0x27ff8
movq 0x8(%rsp), %rdi
movq %r15, %rcx
movq 0x10(%rsp), %r15
vmovups (%rbx), %ymm1
vmovups 0x20(%rbx), %ymm2
vmovdqu 0x40(%rbx), %ymm3
vmovdqu 0x60(%rbx), %ymm4
vmovdqu 0x80(%rbx), %ymm5
vmovdqu 0xa0(%rbx), %ymm11
vmovdqu 0xc0(%rbx), %ymm12
jmp 0x6413
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vpxor 0x50(%r12,%r14), %ymm3, %ymm3
vpxor 0x78(%r12,%r14), %ymm4, %ymm4
vmovq 0xa0(%r12,%r14), %xmm0
vpxor %ymm5, %ymm0, %ymm5
vpxor %xmm0, %xmm0, %xmm0
kxnorw %k0, %k0, %k1
vpgatherdq (%rsi,%xmm13), %ymm0 {%k1}
jmp 0x640f
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
kmovd %r10d, %k1
vmovdqu64 0x50(%r12,%r14), %ymm0 {%k1} {z}
vpxor %ymm3, %ymm0, %ymm3
vmovq 0x48(%r12,%r14), %xmm0
vmovq 0x20(%r12,%r14), %xmm6
vpunpcklqdq %xmm0, %xmm6, %xmm0 # xmm0 = xmm6[0],xmm0[0]
jmp 0x640f
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vpxor 0x50(%r12,%r14), %ymm3, %ymm3
vpxor 0x78(%r12,%r14), %ymm4, %ymm4
vpxor 0xa0(%r12,%r14), %ymm5, %ymm5
vpxor %xmm0, %xmm0, %xmm0
kxnorw %k0, %k0, %k1
vpgatherdq (%rsi,%xmm13), %ymm0 {%k1}
vpxor %ymm0, %ymm11, %ymm11
vmovq 0xc0(%r12,%r14), %xmm0
vinserti128 $0x1, %xmm0, %ymm0, %ymm0
vpxor %ymm0, %ymm12, %ymm12
jmp 0x6413
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vpxor 0x50(%r12,%r14), %ymm3, %ymm3
vmovq 0x78(%r12,%r14), %xmm0
jmp 0x63ec
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vpxor 0x50(%r12,%r14), %ymm3, %ymm3
movb $0x3, %al
kmovd %eax, %k1
jmp 0x63e1
vxorps (%r12,%r14), %ymm1, %ymm1
vxorps 0x28(%r12,%r14), %ymm2, %ymm2
vpxor 0x50(%r12,%r14), %ymm3, %ymm3
kmovd %r10d, %k1
vmovdqu64 0x78(%r12,%r14), %ymm0 {%k1} {z}
vmovq 0x48(%r12,%r14), %xmm6
vmovq 0x20(%r12,%r14), %xmm7
vpxor %ymm4, %ymm0, %ymm4
vpunpcklqdq %xmm6, %xmm7, %xmm0 # xmm0 = xmm7[0],xmm6[0]
vmovq 0x70(%r12,%r14), %xmm6
vinserti128 $0x1, %xmm6, %ymm0, %ymm0
vpxor %ymm0, %ymm11, %ymm11
movq $0x300, %rax            # imm = 0x300
vpxor %ymm2, %ymm1, %ymm9
vpxor %ymm3, %ymm9, %ymm9
vpxor %ymm4, %ymm9, %ymm9
vpxor %ymm5, %ymm9, %ymm9
vpermq $0x93, %ymm9, %ymm8     # ymm8 = ymm9[3,0,1,2]
vpsrlq $0x3f, %ymm9, %ymm7
vpsllq $0x1, %ymm9, %ymm9
vperm2i128 $0x11, %ymm11, %ymm11, %ymm0 # ymm0 = ymm11[2,3,2,3]
vpxor %ymm0, %ymm11, %ymm0
vpunpckhqdq %ymm0, %ymm0, %ymm6 # ymm6 = ymm0[1,1,3,3]
vpxor %ymm6, %ymm0, %ymm6
vpxor %ymm6, %ymm12, %ymm6
vpxor %ymm7, %ymm9, %ymm7
vpblendd $0x3, %ymm6, %ymm8, %ymm0 # ymm0 = ymm6[0,1],ymm8[2,3,4,5,6,7]
vpsrlq $0x3f, %ymm6, %ymm9
vpsllq $0x1, %ymm6, %ymm6
vpxor %ymm6, %ymm9, %ymm6
vpblendd $0x3, %ymm6, %ymm7, %ymm6 # ymm6 = ymm6[0,1],ymm7[2,3,4,5,6,7]
vpxor %ymm7, %ymm8, %ymm7
vpxor %ymm7, %ymm12, %ymm9
vpermq $0x39, %ymm6, %ymm6     # ymm6 = ymm6[1,2,3,0]
vpxor %ymm6, %ymm0, %ymm0
vpxor %ymm0, %ymm1, %ymm1
vpxor %ymm0, %ymm2, %ymm2
vpbroadcastq %xmm7, %ymm7
vpxor %ymm7, %ymm11, %ymm11
vpxor %ymm0, %ymm3, %ymm3
vpxor %ymm0, %ymm4, %ymm4
vpxor %ymm0, %ymm5, %ymm5
vmovdqa 0x221b9(%rip), %ymm6    # 0x28660
vmovdqa 0x22191(%rip), %ymm12   # 0x28640
vmovdqa 0x221e9(%rip), %ymm7    # 0x286a0
vpsrlvq %ymm6, %ymm1, %ymm6
vpsllvq %ymm12, %ymm1, %ymm1
vmovdqa 0x221b7(%rip), %ymm12   # 0x28680
vmovdqa 0x2220f(%rip), %ymm0    # 0x286e0
vpsrlvq %ymm7, %ymm2, %ymm7
vpsllvq %ymm12, %ymm2, %ymm2
vmovdqa 0x221dd(%rip), %ymm12   # 0x286c0
vmovdqa 0x22235(%rip), %ymm10   # 0x28720
vpsrlvq %ymm0, %ymm3, %ymm0
vpsllvq %ymm12, %ymm3, %ymm3
vpxor %ymm7, %ymm2, %ymm7
vpxor %ymm6, %ymm1, %ymm6
vpermq $0x1c, %ymm6, %ymm2     # ymm2 = ymm6[0,3,1,0]
vperm2i128 $0x11, %ymm6, %ymm6, %ymm6 # ymm6 = ymm6[2,3,2,3]
vpxor %ymm0, %ymm3, %ymm3
vpsrlvq %ymm10, %ymm4, %ymm0
vpermq $0x72, %ymm3, %ymm3     # ymm3 = ymm3[2,0,3,1]
vmovdqa 0x221e0(%rip), %ymm10   # 0x28700
vpsllvq %ymm10, %ymm4, %ymm4
vpxor %ymm0, %ymm4, %ymm10
vpermq $0x87, %ymm10, %ymm4    # ymm4 = ymm10[3,1,0,2]
vmovdqa 0x22229(%rip), %ymm0    # 0x28760
vpsrlvq %ymm0, %ymm5, %ymm12
vmovdqa 0x221fc(%rip), %ymm0    # 0x28740
vpsllvq %ymm0, %ymm5, %ymm5
vpxor %ymm5, %ymm12, %ymm0
vpermq $0xc9, %ymm0, %ymm1     # ymm1 = ymm0[1,2,0,3]
vpunpckhqdq %ymm0, %ymm0, %ymm0 # ymm0 = ymm0[1,1,3,3]
vmovdqa 0x22241(%rip), %ymm5    # 0x287a0
vpsrlvq %ymm5, %ymm11, %ymm12
vmovdqa 0x22214(%rip), %ymm5    # 0x28780
vpsllvq %ymm5, %ymm11, %ymm11
vpxor %ymm12, %ymm11, %ymm5
vpsrlq $0x32, %ymm9, %ymm11
vpsllq $0xe, %ymm9, %ymm12
vperm2i128 $0x11, %ymm5, %ymm5, %ymm8 # ymm8 = ymm5[2,3,2,3]
vpxor %ymm11, %ymm12, %ymm9
vmovdqa %xmm5, %xmm12
vpunpckhqdq %ymm5, %ymm5, %ymm11 # ymm11 = ymm5[1,1,3,3]
vpbroadcastq %xmm9, %ymm9
vpbroadcastq %xmm12, %ymm12
vpermq $0xff, %ymm5, %ymm5     # ymm5 = ymm5[3,3,3,3]
vpblendd $0x30, %ymm5, %ymm4, %ymm5 # ymm5 = ymm4[0,1,2,3],ymm5[4,5],ymm4[6,7]
vpblendd $0x3, %ymm9, %ymm1, %ymm4 # ymm4 = ymm9[0,1],ymm1[2,3,4,5,6,7]
vpblendd $0xc0, %ymm12, %ymm2, %ymm2 # ymm2 = ymm2[0,1,2,3,4,5],ymm12[6,7]
vpermq $0x2d, %ymm7, %ymm12    # ymm12 = ymm7[1,3,2,0]
vpblendd $0xc, %ymm11, %ymm12, %ymm11 # ymm11 = ymm12[0,1],ymm11[2,3],ymm12[4,5,6,7]
vpermq $0xff, %ymm7, %ymm7     # ymm7 = ymm7[3,3,3,3]
vpandn %ymm3, %ymm11, %ymm9
subq $0x20, %rax
vpxor %ymm2, %ymm9, %ymm9
vpandn %ymm5, %ymm3, %ymm12
vpandn %ymm4, %ymm5, %ymm1
vpxor (%rdx,%rax), %ymm9, %ymm9
vpxor %ymm1, %ymm3, %ymm1
vpxor %ymm11, %ymm12, %ymm12
vpandn %ymm2, %ymm4, %ymm3
vpandn %ymm11, %ymm2, %ymm11
vpxor %ymm5, %ymm3, %ymm5
vpxor %ymm4, %ymm11, %ymm11
vpunpcklqdq %ymm12, %ymm9, %ymm3 # ymm3 = ymm9[0],ymm12[0],ymm9[2],ymm12[2]
vpunpckhqdq %ymm12, %ymm9, %ymm12 # ymm12 = ymm9[1],ymm12[1],ymm9[3],ymm12[3]
vpunpcklqdq %ymm5, %ymm1, %ymm9 # ymm9 = ymm1[0],ymm5[0],ymm1[2],ymm5[2]
vpunpckhqdq %ymm5, %ymm1, %ymm5 # ymm5 = ymm1[1],ymm5[1],ymm1[3],ymm5[3]
vperm2i128 $0x20, %ymm9, %ymm3, %ymm1 # ymm1 = ymm3[0,1],ymm9[0,1]
vperm2i128 $0x20, %ymm5, %ymm12, %ymm2 # ymm2 = ymm12[0,1],ymm5[0,1]
vperm2i128 $0x13, %ymm12, %ymm5, %ymm4 # ymm4 = ymm12[2,3],ymm5[2,3]
vperm2i128 $0x13, %ymm3, %ymm9, %ymm3 # ymm3 = ymm3[2,3],ymm9[2,3]
vpandn %ymm10, %ymm8, %ymm5
vpandn %ymm0, %ymm10, %ymm12
vpandn %ymm8, %ymm7, %ymm9
vpxor %ymm5, %ymm7, %ymm5
vpxor %ymm12, %ymm8, %ymm8
vpxor %ymm6, %ymm9, %ymm9
vpandn %ymm6, %ymm0, %ymm12
vpxor %ymm12, %ymm10, %ymm10
vpandn %ymm7, %ymm6, %ymm12
vpunpcklqdq %ymm5, %ymm9, %ymm9 # ymm9 = ymm9[0],ymm5[0],ymm9[2],ymm5[2]
vpunpcklqdq %ymm10, %ymm8, %ymm8 # ymm8 = ymm8[0],ymm10[0],ymm8[2],ymm10[2]
vperm2i128 $0x20, %ymm8, %ymm9, %ymm5 # ymm5 = ymm9[0,1],ymm8[0,1]
vpxor %ymm0, %ymm12, %ymm12
jne 0x641a
addq %r15, %rbp
addq %rcx, %r14
cmpq %r13, %rbp
jle 0x620b
jmp 0x667b
xorl %r14d, %r14d
movq (%rsp), %rax
vmovups %ymm1, (%rax)
vmovups %ymm2, 0x20(%rax)
vmovdqu %ymm3, 0x40(%rax)
vmovdqu %ymm4, 0x60(%rax)
vmovdqu %ymm5, 0x80(%rax)
vmovdqu %ymm11, 0xa0(%rax)
vmovdqu %ymm12, 0xc0(%rax)
movq %r14, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
vzeroupper
retq
nop