// File: /workspace/github_c_makefile_star2_O2/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 %rdx, %r15
movq %rsi, %r12
vmovups (%rdi), %ymm12
vmovups 0x20(%rdi), %ymm11
vmovdqu 0x40(%rdi), %ymm5
vmovdqu 0x60(%rdi), %ymm4
vmovdqu 0x80(%rdi), %ymm3
vmovdqu 0xa0(%rdi), %ymm2
movq %rdi, (%rsp)
vmovdqu 0xc0(%rdi), %ymm1
shrq $0x3, %rcx
subq %rsi, %rcx
leaq (,%rsi,8), %rbx
xorl %r13d, %r13d
leaq -0x9(%rsi), %rdi
movq 0x20e2c(%rip), %rdx     # 0x26ff8
leaq 0x1ae41(%rip), %r10     # 0x21014
movb $0x7, %r11b
vpmovzxbd 0x1ae31(%rip), %xmm13 # 0x21010
xorl %r14d, %r14d
movq %rcx, 0x10(%rsp)
movq %rdi, 0x8(%rsp)
movq (%rsp), %rbp
cmpq %rcx, %r14
jg 0x665a
leaq (%r15,%r13), %rsi
cmpq $0x10, %rdi
ja 0x6225
movslq (%r10,%rdi,4), %rax
addq %r10, %rax
jmpq *%rax
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vmovq 0x20(%r15,%r13), %xmm0
jmp 0x63fc
vmovups %ymm12, (%rbp)
vmovups %ymm11, 0x20(%rbp)
vmovdqu %ymm5, 0x40(%rbp)
vmovdqu %ymm4, 0x60(%rbp)
vmovdqu %ymm3, 0x80(%rbp)
vmovdqu %ymm2, 0xa0(%rbp)
vmovdqu %ymm1, 0xc0(%rbp)
movq %rbp, %rdi
xorl %edx, %edx
movq %rbx, %rcx
vzeroupper
callq 0x54f0
vpmovzxbd 0x1ada6(%rip), %xmm13 # 0x21010
movb $0x7, %r11b
leaq 0x1ada0(%rip), %r10     # 0x21014
movq 0x20d7d(%rip), %rdx     # 0x26ff8
movq 0x8(%rsp), %rdi
movq 0x10(%rsp), %rcx
vmovups (%rbp), %ymm12
vmovups 0x20(%rbp), %ymm11
vmovdqu 0x40(%rbp), %ymm5
vmovdqu 0x60(%rbp), %ymm4
vmovdqu 0x80(%rbp), %ymm3
vmovdqu 0xa0(%rbp), %ymm2
vmovdqu 0xc0(%rbp), %ymm1
jmp 0x6400
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vpxor 0x50(%r15,%r13), %ymm5, %ymm5
vpxor 0x78(%r15,%r13), %ymm4, %ymm4
vmovq 0xa0(%r15,%r13), %xmm0
vpxor %ymm3, %ymm0, %ymm3
kxnorw %k0, %k0, %k1
vpxor %xmm0, %xmm0, %xmm0
vpgatherdq (%rsi,%xmm13), %ymm0 {%k1}
jmp 0x63fc
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
kmovd %r11d, %k1
vmovdqu64 0x50(%r15,%r13), %ymm0 {%k1} {z}
vpxor %ymm5, %ymm0, %ymm5
vmovq 0x48(%r15,%r13), %xmm0
vmovq 0x20(%r15,%r13), %xmm6
vpunpcklqdq %xmm0, %xmm6, %xmm0 # xmm0 = xmm6[0],xmm0[0]
jmp 0x63fc
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vpxor 0x50(%r15,%r13), %ymm5, %ymm5
vpxor 0x78(%r15,%r13), %ymm4, %ymm4
vpxor 0xa0(%r15,%r13), %ymm3, %ymm3
kxnorw %k0, %k0, %k1
vpxor %xmm0, %xmm0, %xmm0
vpgatherdq (%rsi,%xmm13), %ymm0 {%k1}
vpxor %ymm2, %ymm0, %ymm2
vmovq 0xc0(%r15,%r13), %xmm0
vinserti128 $0x1, %xmm0, %ymm0, %ymm0
vpxor %ymm1, %ymm0, %ymm1
jmp 0x6400
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vpxor 0x50(%r15,%r13), %ymm5, %ymm5
vmovq 0x78(%r15,%r13), %xmm0
jmp 0x63d9
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vpxor 0x50(%r15,%r13), %ymm5, %ymm5
movb $0x3, %al
kmovd %eax, %k1
jmp 0x63ce
vxorps (%r15,%r13), %ymm12, %ymm12
vxorps 0x28(%r15,%r13), %ymm11, %ymm11
vpxor 0x50(%r15,%r13), %ymm5, %ymm5
kmovd %r11d, %k1
vmovdqu64 0x78(%r15,%r13), %ymm0 {%k1} {z}
vmovq 0x48(%r15,%r13), %xmm6
vmovq 0x20(%r15,%r13), %xmm7
vpxor %ymm4, %ymm0, %ymm4
vpunpcklqdq %xmm6, %xmm7, %xmm0 # xmm0 = xmm7[0],xmm6[0]
vmovq 0x70(%r15,%r13), %xmm6
vinserti128 $0x1, %xmm6, %ymm0, %ymm0
vpxor %ymm2, %ymm0, %ymm2
movq $0x300, %rax            # imm = 0x300
vpxor %ymm11, %ymm12, %ymm9
vpxor %ymm5, %ymm9, %ymm9
vpxor %ymm4, %ymm9, %ymm9
vpxor %ymm3, %ymm9, %ymm9
vpermq $0x93, %ymm9, %ymm8     # ymm8 = ymm9[3,0,1,2]
vpsrlq $0x3f, %ymm9, %ymm7
vpsllq $0x1, %ymm9, %ymm9
vperm2i128 $0x11, %ymm2, %ymm2, %ymm0 # ymm0 = ymm2[2,3,2,3]
vpxor %ymm0, %ymm2, %ymm0
vpunpckhqdq %ymm0, %ymm0, %ymm6 # ymm6 = ymm0[1,1,3,3]
vpxor %ymm6, %ymm0, %ymm6
vpxor %ymm1, %ymm6, %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, %ymm1, %ymm9
vpermq $0x39, %ymm6, %ymm6     # ymm6 = ymm6[1,2,3,0]
vpxor %ymm6, %ymm0, %ymm0
vpxor %ymm0, %ymm12, %ymm12
vpxor %ymm0, %ymm11, %ymm11
vpbroadcastq %xmm7, %ymm7
vpxor %ymm7, %ymm2, %ymm2
vpxor %ymm0, %ymm5, %ymm5
vpxor %ymm0, %ymm4, %ymm4
vpxor %ymm0, %ymm3, %ymm3
vmovdqa 0x211eb(%rip), %ymm6    # 0x27680
vmovdqa 0x211c3(%rip), %ymm1    # 0x27660
vmovdqa 0x2121b(%rip), %ymm7    # 0x276c0
vpsrlvq %ymm6, %ymm12, %ymm6
vpsllvq %ymm1, %ymm12, %ymm12
vmovdqa 0x211e9(%rip), %ymm1    # 0x276a0
vmovdqa 0x21241(%rip), %ymm0    # 0x27700
vpsrlvq %ymm7, %ymm11, %ymm7
vpsllvq %ymm1, %ymm11, %ymm11
vmovdqa 0x2120f(%rip), %ymm1    # 0x276e0
vmovdqa 0x21267(%rip), %ymm10   # 0x27740
vpsrlvq %ymm0, %ymm5, %ymm0
vpsllvq %ymm1, %ymm5, %ymm5
vpxor %ymm7, %ymm11, %ymm7
vpxor %ymm6, %ymm12, %ymm6
vpermq $0x1c, %ymm6, %ymm11    # ymm11 = ymm6[0,3,1,0]
vperm2i128 $0x11, %ymm6, %ymm6, %ymm6 # ymm6 = ymm6[2,3,2,3]
vpxor %ymm0, %ymm5, %ymm5
vpsrlvq %ymm10, %ymm4, %ymm0
vpermq $0x72, %ymm5, %ymm5     # ymm5 = ymm5[2,0,3,1]
vmovdqa 0x21212(%rip), %ymm10   # 0x27720
vpsllvq %ymm10, %ymm4, %ymm4
vpxor %ymm0, %ymm4, %ymm10
vpermq $0x87, %ymm10, %ymm4    # ymm4 = ymm10[3,1,0,2]
vmovdqa 0x2125b(%rip), %ymm0    # 0x27780
vpsrlvq %ymm0, %ymm3, %ymm1
vmovdqa 0x2122e(%rip), %ymm0    # 0x27760
vpsllvq %ymm0, %ymm3, %ymm3
vpxor %ymm1, %ymm3, %ymm0
vpermq $0xc9, %ymm0, %ymm12    # ymm12 = ymm0[1,2,0,3]
vpunpckhqdq %ymm0, %ymm0, %ymm0 # ymm0 = ymm0[1,1,3,3]
vmovdqa 0x21273(%rip), %ymm3    # 0x277c0
vpsrlvq %ymm3, %ymm2, %ymm1
vmovdqa 0x21246(%rip), %ymm3    # 0x277a0
vpsllvq %ymm3, %ymm2, %ymm2
vpxor %ymm1, %ymm2, %ymm3
vpsrlq $0x32, %ymm9, %ymm2
vpsllq $0xe, %ymm9, %ymm1
vperm2i128 $0x11, %ymm3, %ymm3, %ymm8 # ymm8 = ymm3[2,3,2,3]
vpxor %ymm2, %ymm1, %ymm9
vmovdqa %xmm3, %xmm1
vpunpckhqdq %ymm3, %ymm3, %ymm2 # ymm2 = ymm3[1,1,3,3]
vpbroadcastq %xmm9, %ymm9
vpbroadcastq %xmm1, %ymm1
vpermq $0xff, %ymm3, %ymm3     # ymm3 = ymm3[3,3,3,3]
vpblendd $0x30, %ymm3, %ymm4, %ymm3 # ymm3 = ymm4[0,1,2,3],ymm3[4,5],ymm4[6,7]
vpblendd $0x3, %ymm9, %ymm12, %ymm4 # ymm4 = ymm9[0,1],ymm12[2,3,4,5,6,7]
vpblendd $0xc0, %ymm1, %ymm11, %ymm11 # ymm11 = ymm11[0,1,2,3,4,5],ymm1[6,7]
vpermq $0x2d, %ymm7, %ymm1     # ymm1 = ymm7[1,3,2,0]
vpblendd $0xc, %ymm2, %ymm1, %ymm2 # ymm2 = ymm1[0,1],ymm2[2,3],ymm1[4,5,6,7]
vpermq $0xff, %ymm7, %ymm7     # ymm7 = ymm7[3,3,3,3]
vpandn %ymm5, %ymm2, %ymm9
subq $0x20, %rax
vpxor %ymm11, %ymm9, %ymm9
vpandn %ymm3, %ymm5, %ymm1
vpandn %ymm4, %ymm3, %ymm12
vpxor (%rdx,%rax), %ymm9, %ymm9
vpxor %ymm5, %ymm12, %ymm12
vpxor %ymm2, %ymm1, %ymm1
vpandn %ymm11, %ymm4, %ymm5
vpandn %ymm2, %ymm11, %ymm2
vpxor %ymm3, %ymm5, %ymm3
vpxor %ymm4, %ymm2, %ymm2
vpunpcklqdq %ymm1, %ymm9, %ymm5 # ymm5 = ymm9[0],ymm1[0],ymm9[2],ymm1[2]
vpunpckhqdq %ymm1, %ymm9, %ymm1 # ymm1 = ymm9[1],ymm1[1],ymm9[3],ymm1[3]
vpunpcklqdq %ymm3, %ymm12, %ymm9 # ymm9 = ymm12[0],ymm3[0],ymm12[2],ymm3[2]
vpunpckhqdq %ymm3, %ymm12, %ymm3 # ymm3 = ymm12[1],ymm3[1],ymm12[3],ymm3[3]
vperm2i128 $0x20, %ymm9, %ymm5, %ymm12 # ymm12 = ymm5[0,1],ymm9[0,1]
vperm2i128 $0x20, %ymm3, %ymm1, %ymm11 # ymm11 = ymm1[0,1],ymm3[0,1]
vperm2i128 $0x13, %ymm1, %ymm3, %ymm4 # ymm4 = ymm1[2,3],ymm3[2,3]
vperm2i128 $0x13, %ymm5, %ymm9, %ymm5 # ymm5 = ymm5[2,3],ymm9[2,3]
vpandn %ymm10, %ymm8, %ymm3
vpandn %ymm0, %ymm10, %ymm1
vpandn %ymm8, %ymm7, %ymm9
vpxor %ymm3, %ymm7, %ymm3
vpxor %ymm1, %ymm8, %ymm8
vpxor %ymm6, %ymm9, %ymm9
vpandn %ymm6, %ymm0, %ymm1
vpxor %ymm1, %ymm10, %ymm10
vpandn %ymm7, %ymm6, %ymm1
vpunpcklqdq %ymm3, %ymm9, %ymm9 # ymm9 = ymm9[0],ymm3[0],ymm9[2],ymm3[2]
vpunpcklqdq %ymm10, %ymm8, %ymm8 # ymm8 = ymm8[0],ymm10[0],ymm8[2],ymm10[2]
vperm2i128 $0x20, %ymm8, %ymm9, %ymm3 # ymm3 = ymm9[0,1],ymm8[0,1]
vpxor %ymm1, %ymm0, %ymm1
jne 0x6407
addq %r12, %r14
addq %rbx, %r13
jmp 0x61f0
movq (%rsp), %rax
vmovups %ymm12, (%rax)
vmovups %ymm11, 0x20(%rax)
vmovdqu %ymm5, 0x40(%rax)
vmovdqu %ymm4, 0x60(%rax)
vmovdqu %ymm3, 0x80(%rax)
vmovdqu %ymm2, 0xa0(%rax)
vmovdqu %ymm1, 0xc0(%rax)
movq %r13, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
vzeroupper
retq
nop