// File: occivink[P]pyct/monocypher.cpp
// Function: chacha20_rounds(unsigned int*, unsigned int const*)
static void chacha20_rounds(u32 out[16], const u32 in[16])
{
    // The temporary variables make Chacha20 10% faster.
    u32 t0  = in[ 0];  u32 t1  = in[ 1];  u32 t2  = in[ 2];  u32 t3  = in[ 3];
    u32 t4  = in[ 4];  u32 t5  = in[ 5];  u32 t6  = in[ 6];  u32 t7  = in[ 7];
    u32 t8  = in[ 8];  u32 t9  = in[ 9];  u32 t10 = in[10];  u32 t11 = in[11];
    u32 t12 = in[12];  u32 t13 = in[13];  u32 t14 = in[14];  u32 t15 = in[15];

    FOR (i, 0, 10) { // 20 rounds, 2 rounds per loop.
        QUARTERROUND(t0, t4, t8 , t12); // column 0
        QUARTERROUND(t1, t5, t9 , t13); // column 1
        QUARTERROUND(t2, t6, t10, t14); // column 2
        QUARTERROUND(t3, t7, t11, t15); // column 3
        QUARTERROUND(t0, t5, t10, t15); // diagonal 0
        QUARTERROUND(t1, t6, t11, t12); // diagonal 1
        QUARTERROUND(t2, t7, t8 , t13); // diagonal 2
        QUARTERROUND(t3, t4, t9 , t14); // diagonal 3
    }
    out[ 0] = t0;   out[ 1] = t1;   out[ 2] = t2;   out[ 3] = t3;
    out[ 4] = t4;   out[ 5] = t5;   out[ 6] = t6;   out[ 7] = t7;
    out[ 8] = t8;   out[ 9] = t9;   out[10] = t10;  out[11] = t11;
    out[12] = t12;  out[13] = t13;  out[14] = t14;  out[15] = t15;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x14(%rbp)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0x1c(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, -0x2c(%rbp)
movq -0x10(%rbp), %rax
movl 0x1c(%rax), %eax
movl %eax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x34(%rbp)
movq -0x10(%rbp), %rax
movl 0x24(%rax), %eax
movl %eax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movl 0x28(%rax), %eax
movl %eax, -0x3c(%rbp)
movq -0x10(%rbp), %rax
movl 0x2c(%rax), %eax
movl %eax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movl 0x30(%rax), %eax
movl %eax, -0x44(%rbp)
movq -0x10(%rbp), %rax
movl 0x34(%rax), %eax
movl %eax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movl 0x38(%rax), %eax
movl %eax, -0x4c(%rbp)
movq -0x10(%rbp), %rax
movl 0x3c(%rax), %eax
movl %eax, -0x50(%rbp)
movq $0x0, -0x58(%rbp)
cmpq $0xa, -0x58(%rbp)
jae 0x3e43
movl -0x24(%rbp), %eax
addl -0x14(%rbp), %eax
movl %eax, -0x14(%rbp)
movl -0x44(%rbp), %edi
xorl -0x14(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x44(%rbp)
movl -0x44(%rbp), %eax
addl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movl -0x24(%rbp), %edi
xorl -0x34(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x24(%rbp)
movl -0x24(%rbp), %eax
addl -0x14(%rbp), %eax
movl %eax, -0x14(%rbp)
movl -0x44(%rbp), %edi
xorl -0x14(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x44(%rbp)
movl -0x44(%rbp), %eax
addl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movl -0x24(%rbp), %edi
xorl -0x34(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x24(%rbp)
movl -0x28(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x18(%rbp)
movl -0x48(%rbp), %edi
xorl -0x18(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x48(%rbp)
movl -0x48(%rbp), %eax
addl -0x38(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x28(%rbp), %edi
xorl -0x38(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x28(%rbp)
movl -0x28(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x18(%rbp)
movl -0x48(%rbp), %edi
xorl -0x18(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x48(%rbp)
movl -0x48(%rbp), %eax
addl -0x38(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x28(%rbp), %edi
xorl -0x38(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x28(%rbp)
movl -0x2c(%rbp), %eax
addl -0x1c(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x4c(%rbp), %edi
xorl -0x1c(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
addl -0x3c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x2c(%rbp), %edi
xorl -0x3c(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
addl -0x1c(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x4c(%rbp), %edi
xorl -0x1c(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
addl -0x3c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x2c(%rbp), %edi
xorl -0x3c(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x2c(%rbp)
movl -0x30(%rbp), %eax
addl -0x20(%rbp), %eax
movl %eax, -0x20(%rbp)
movl -0x50(%rbp), %edi
xorl -0x20(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x50(%rbp)
movl -0x50(%rbp), %eax
addl -0x40(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x30(%rbp), %edi
xorl -0x40(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x30(%rbp)
movl -0x30(%rbp), %eax
addl -0x20(%rbp), %eax
movl %eax, -0x20(%rbp)
movl -0x50(%rbp), %edi
xorl -0x20(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x50(%rbp)
movl -0x50(%rbp), %eax
addl -0x40(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x30(%rbp), %edi
xorl -0x40(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x30(%rbp)
movl -0x28(%rbp), %eax
addl -0x14(%rbp), %eax
movl %eax, -0x14(%rbp)
movl -0x50(%rbp), %edi
xorl -0x14(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x50(%rbp)
movl -0x50(%rbp), %eax
addl -0x3c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x28(%rbp), %edi
xorl -0x3c(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x28(%rbp)
movl -0x28(%rbp), %eax
addl -0x14(%rbp), %eax
movl %eax, -0x14(%rbp)
movl -0x50(%rbp), %edi
xorl -0x14(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x50(%rbp)
movl -0x50(%rbp), %eax
addl -0x3c(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x28(%rbp), %edi
xorl -0x3c(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x28(%rbp)
movl -0x2c(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x18(%rbp)
movl -0x44(%rbp), %edi
xorl -0x18(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x44(%rbp)
movl -0x44(%rbp), %eax
addl -0x40(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x2c(%rbp), %edi
xorl -0x40(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x18(%rbp)
movl -0x44(%rbp), %edi
xorl -0x18(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x44(%rbp)
movl -0x44(%rbp), %eax
addl -0x40(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x2c(%rbp), %edi
xorl -0x40(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x2c(%rbp)
movl -0x30(%rbp), %eax
addl -0x1c(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x48(%rbp), %edi
xorl -0x1c(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x48(%rbp)
movl -0x48(%rbp), %eax
addl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movl -0x30(%rbp), %edi
xorl -0x34(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x30(%rbp)
movl -0x30(%rbp), %eax
addl -0x1c(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x48(%rbp), %edi
xorl -0x1c(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x48(%rbp)
movl -0x48(%rbp), %eax
addl -0x34(%rbp), %eax
movl %eax, -0x34(%rbp)
movl -0x30(%rbp), %edi
xorl -0x34(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x30(%rbp)
movl -0x24(%rbp), %eax
addl -0x20(%rbp), %eax
movl %eax, -0x20(%rbp)
movl -0x4c(%rbp), %edi
xorl -0x20(%rbp), %edi
movl $0x10, %esi
callq 0x126b0
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
addl -0x38(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x24(%rbp), %edi
xorl -0x38(%rbp), %edi
movl $0xc, %esi
callq 0x126b0
movl %eax, -0x24(%rbp)
movl -0x24(%rbp), %eax
addl -0x20(%rbp), %eax
movl %eax, -0x20(%rbp)
movl -0x4c(%rbp), %edi
xorl -0x20(%rbp), %edi
movl $0x8, %esi
callq 0x126b0
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
addl -0x38(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x24(%rbp), %edi
xorl -0x38(%rbp), %edi
movl $0x7, %esi
callq 0x126b0
movl %eax, -0x24(%rbp)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x3aa7
movl -0x14(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, (%rax)
movl -0x18(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x4(%rax)
movl -0x1c(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
movl -0x20(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0xc(%rax)
movl -0x24(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x10(%rax)
movl -0x28(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x14(%rax)
movl -0x2c(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x18(%rax)
movl -0x30(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x1c(%rax)
movl -0x34(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x20(%rax)
movl -0x38(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x24(%rax)
movl -0x3c(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x28(%rax)
movl -0x40(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x2c(%rax)
movl -0x44(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x30(%rax)
movl -0x48(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x34(%rax)
movl -0x4c(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x38(%rax)
movl -0x50(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x3c(%rax)
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)