// File: /workspace/github_c_makefile_star2_O2/mjosaarinen[P]brutus/crypto_aead/lakekeyakv2/SandyBridge/KeccakP-1600-times2-SIMD128.c
// Function: KeccakP1600times2_ExtractAndAddLanesAll
void KeccakP1600times2_ExtractAndAddLanesAll(const void *states, const unsigned char *input, unsigned char *output, unsigned int laneCount, unsigned int laneOffset)
{
    const UINT64 *stateAsLanes = states;
    unsigned int i;
    const UINT64 *curInput0 = (UINT64 *)input;
    const UINT64 *curInput1 = (UINT64 *)(input+laneOffset*SnP_laneLengthInBytes);
    UINT64 *curOutput0 = (UINT64 *)output;
    UINT64 *curOutput1 = (UINT64 *)(output+laneOffset*SnP_laneLengthInBytes);

    #define ExtrXOR( argIndex ) curOutput0[argIndex] = curInput0[argIndex] ^ stateAsLanes[2*(argIndex)], curOutput1[argIndex] = curInput1[argIndex] ^ stateAsLanes[2*(argIndex)+1]

    if ( laneCount >= 17 )  {
        ExtrXOR( 0 );
        ExtrXOR( 1 );
        ExtrXOR( 2 );
        ExtrXOR( 3 );
        ExtrXOR( 4 );
        ExtrXOR( 5 );
        ExtrXOR( 6 );
        ExtrXOR( 7 );
        ExtrXOR( 8 );
        ExtrXOR( 9 );
        ExtrXOR( 10 );
        ExtrXOR( 11 );
        ExtrXOR( 12 );
        ExtrXOR( 13 );
        ExtrXOR( 14 );
        ExtrXOR( 15 );
        ExtrXOR( 16 );
        if ( laneCount >= 21 )  {
            ExtrXOR( 17 );
            ExtrXOR( 18 );
            ExtrXOR( 19 );
            ExtrXOR( 20 );
            for(i=21; i<laneCount; i++)
                ExtrXOR( i );
        }
        else {
            for(i=17; i<laneCount; i++)
                ExtrXOR( i );
        }
    }
    else {
        for(i=0; i<laneCount; i++)
            ExtrXOR( i );
    }
    #undef  ExtrXOR
}

// Assembly:
shll $0x3, %r8d
cmpl $0x10, %ecx
jbe 0x13727
movq (%rdi), %rax
xorq (%rsi), %rax
movq %rax, (%rdx)
movq 0x8(%rdi), %rax
xorq (%rsi,%r8), %rax
movq %rax, (%rdx,%r8)
movq 0x10(%rdi), %rax
xorq 0x8(%rsi), %rax
movq %rax, 0x8(%rdx)
movq 0x18(%rdi), %rax
xorq 0x8(%rsi,%r8), %rax
movq %rax, 0x8(%rdx,%r8)
movq 0x20(%rdi), %rax
xorq 0x10(%rsi), %rax
movq %rax, 0x10(%rdx)
movq 0x28(%rdi), %rax
xorq 0x10(%rsi,%r8), %rax
movq %rax, 0x10(%rdx,%r8)
movq 0x30(%rdi), %rax
xorq 0x18(%rsi), %rax
movq %rax, 0x18(%rdx)
movq 0x38(%rdi), %rax
xorq 0x18(%rsi,%r8), %rax
movq %rax, 0x18(%rdx,%r8)
movq 0x40(%rdi), %rax
xorq 0x20(%rsi), %rax
movq %rax, 0x20(%rdx)
movq 0x48(%rdi), %rax
xorq 0x20(%rsi,%r8), %rax
movq %rax, 0x20(%rdx,%r8)
movq 0x50(%rdi), %rax
xorq 0x28(%rsi), %rax
movq %rax, 0x28(%rdx)
movq 0x58(%rdi), %rax
xorq 0x28(%rsi,%r8), %rax
movq %rax, 0x28(%rdx,%r8)
movq 0x60(%rdi), %rax
xorq 0x30(%rsi), %rax
movq %rax, 0x30(%rdx)
movq 0x68(%rdi), %rax
xorq 0x30(%rsi,%r8), %rax
movq %rax, 0x30(%rdx,%r8)
movq 0x70(%rdi), %rax
xorq 0x38(%rsi), %rax
movq %rax, 0x38(%rdx)
movq 0x78(%rdi), %rax
xorq 0x38(%rsi,%r8), %rax
movq %rax, 0x38(%rdx,%r8)
movq 0x80(%rdi), %rax
xorq 0x40(%rsi), %rax
movq %rax, 0x40(%rdx)
movq 0x88(%rdi), %rax
xorq 0x40(%rsi,%r8), %rax
movq %rax, 0x40(%rdx,%r8)
movq 0x90(%rdi), %rax
xorq 0x48(%rsi), %rax
movq %rax, 0x48(%rdx)
movq 0x98(%rdi), %rax
xorq 0x48(%rsi,%r8), %rax
movq %rax, 0x48(%rdx,%r8)
movq 0xa0(%rdi), %rax
xorq 0x50(%rsi), %rax
movq %rax, 0x50(%rdx)
movq 0xa8(%rdi), %rax
xorq 0x50(%rsi,%r8), %rax
movq %rax, 0x50(%rdx,%r8)
movq 0xb0(%rdi), %rax
xorq 0x58(%rsi), %rax
movq %rax, 0x58(%rdx)
movq 0xb8(%rdi), %rax
xorq 0x58(%rsi,%r8), %rax
movq %rax, 0x58(%rdx,%r8)
movq 0xc0(%rdi), %rax
xorq 0x60(%rsi), %rax
movq %rax, 0x60(%rdx)
movq 0xc8(%rdi), %rax
xorq 0x60(%rsi,%r8), %rax
movq %rax, 0x60(%rdx,%r8)
movq 0xd0(%rdi), %rax
xorq 0x68(%rsi), %rax
movq %rax, 0x68(%rdx)
movq 0xd8(%rdi), %rax
xorq 0x68(%rsi,%r8), %rax
movq %rax, 0x68(%rdx,%r8)
movq 0xe0(%rdi), %rax
xorq 0x70(%rsi), %rax
movq %rax, 0x70(%rdx)
movq 0xe8(%rdi), %rax
xorq 0x70(%rsi,%r8), %rax
movq %rax, 0x70(%rdx,%r8)
movq 0xf0(%rdi), %rax
xorq 0x78(%rsi), %rax
movq %rax, 0x78(%rdx)
movq 0xf8(%rdi), %rax
xorq 0x78(%rsi,%r8), %rax
movq %rax, 0x78(%rdx,%r8)
movq 0x100(%rdi), %rax
xorq 0x80(%rsi), %rax
movq %rax, 0x80(%rdx)
movq 0x108(%rdi), %rax
xorq 0x80(%rsi,%r8), %rax
movq %rax, 0x80(%rdx,%r8)
cmpl $0x14, %ecx
jbe 0x13758
movq 0x110(%rdi), %rax
xorq 0x88(%rsi), %rax
movq %rax, 0x88(%rdx)
movq 0x118(%rdi), %r9
leaq (%rsi,%r8), %rax
addq $0xa8, %rax
xorq -0x20(%rax), %r9
addq %rdx, %r8
addq $0xa8, %r8
movq %r9, -0x20(%r8)
movq 0x120(%rdi), %r9
xorq 0x90(%rsi), %r9
movq %r9, 0x90(%rdx)
movq 0x128(%rdi), %r9
xorq -0x18(%rax), %r9
movq %r9, -0x18(%r8)
movq 0x130(%rdi), %r9
xorq 0x98(%rsi), %r9
movq %r9, 0x98(%rdx)
movq 0x138(%rdi), %r9
xorq -0x10(%rax), %r9
movq %r9, -0x10(%r8)
movq 0x140(%rdi), %r9
xorq 0xa0(%rsi), %r9
movq %r9, 0xa0(%rdx)
movq 0x148(%rdi), %r9
xorq -0x8(%rax), %r9
movq %r9, -0x8(%r8)
movl %ecx, %ecx
leaq -0x2a(,%rcx,2), %rcx
xorl %r9d, %r9d
cmpq %r9, %rcx
je 0x137ad
leal 0x2a(%r9), %r10d
movq (%rdi,%r10,8), %r10
xorq 0xa8(%rsi,%r9,4), %r10
movq %r10, 0xa8(%rdx,%r9,4)
leal 0x2b(%r9), %r10d
movq (%rdi,%r10,8), %r10
xorq (%rax,%r9,4), %r10
movq %r10, (%r8,%r9,4)
addq $0x2, %r9
jmp 0x136f0
movl %ecx, %eax
addq %rax, %rax
xorl %ecx, %ecx
cmpq %rcx, %rax
je 0x137ad
movq (%rdi,%rcx,8), %r9
xorq (%rsi), %r9
movq %r9, (%rdx)
movq 0x8(%rdi,%rcx,8), %r9
xorq (%rsi,%r8), %r9
movq %r9, (%rdx,%r8)
addq $0x2, %rcx
addq $0x8, %rsi
addq $0x8, %rdx
jmp 0x1372e
movl %ecx, %eax
leaq -0x88(,%rax,8), %rax
leaq (%rsi,%r8), %rcx
addq $0x88, %rcx
addq %rdx, %r8
addq $0x88, %r8
xorl %r9d, %r9d
cmpq %r9, %rax
je 0x137ad
movq 0x110(%rdi,%r9,2), %r10
xorq 0x88(%rsi,%r9), %r10
movq %r10, 0x88(%rdx,%r9)
movq 0x118(%rdi,%r9,2), %r10
xorq (%rcx,%r9), %r10
movq %r10, (%r8,%r9)
addq $0x8, %r9
jmp 0x1377a
retq