// File: /workspace/github_c_makefile_star2_O2/mjosaarinen[P]brutus/crypto_aead/aezv4/aesni/encrypt.c
// Function: pass_one
block pass_one(aez_ctx_t *ctx, block *src, unsigned bytes, block *dst) {
    block o0, o1, o2, o3, o4, o5, o6, o7, offset, tmp, sum=zero;
    block I=ctx->I[0], L=ctx->L, J=ctx->J[0];
    block Ifordoubling = double_block(bswap16(ctx->I[2]));  /* I8 */
    offset = bswap16(Ifordoubling);
    while (bytes >= 16*16) {
        o0 = offset;
        o1 = vxor(o0,ctx->I[0]);
        o2 = vxor(o0,ctx->I[1]);
        o3 = vxor(o1,ctx->I[1]);
        o4 = vxor(o0,ctx->I[2]);
        o5 = vxor(o1,ctx->I[2]);
        o6 = vxor(o2,ctx->I[2]);
        o7 = vxor(o3,ctx->I[2]);
        offset = bswap16(Ifordoubling = double_block(Ifordoubling));
        store(dst+ 0, aes4(vxor(load(src + 1),o0), J, I, L, load(src+ 0)));
        store(dst+ 2, aes4(vxor(load(src + 3),o1), J, I, L, load(src+ 2)));
        store(dst+ 4, aes4(vxor(load(src + 5),o2), J, I, L, load(src+ 4)));
        store(dst+ 6, aes4(vxor(load(src + 7),o3), J, I, L, load(src+ 6)));
        store(dst+ 8, aes4(vxor(load(src + 9),o4), J, I, L, load(src+ 8)));
        store(dst+10, aes4(vxor(load(src +11),o5), J, I, L, load(src+10)));
        store(dst+12, aes4(vxor(load(src +13),o6), J, I, L, load(src+12)));
        store(dst+14, aes4(vxor(load(src +15),o7), J, I, L, load(src+14)));
        tmp=aes4(load(dst+ 0),J,I,L,load(src+ 1));store(dst+ 1,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 2),J,I,L,load(src+ 3));store(dst+ 3,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 4),J,I,L,load(src+ 5));store(dst+ 5,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 6),J,I,L,load(src+ 7));store(dst+ 7,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 8),J,I,L,load(src+ 9));store(dst+ 9,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+10),J,I,L,load(src+11));store(dst+11,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+12),J,I,L,load(src+13));store(dst+13,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+14),J,I,L,load(src+15));store(dst+15,tmp);sum=vxor(sum,tmp);
        bytes -= 16*16; dst += 16; src += 16;
    }
    if (bytes >= 8*16) {
        o0 = offset;
        o1 = vxor(o0,ctx->I[0]);
        o2 = vxor(o0,ctx->I[1]);
        o3 = vxor(o1,ctx->I[1]);
        offset = vxor(o0,ctx->I[2]);
        store(dst+ 0, aes4(vxor(load(src + 1),o0), J, I, L, load(src+ 0)));
        store(dst+ 2, aes4(vxor(load(src + 3),o1), J, I, L, load(src+ 2)));
        store(dst+ 4, aes4(vxor(load(src + 5),o2), J, I, L, load(src+ 4)));
        store(dst+ 6, aes4(vxor(load(src + 7),o3), J, I, L, load(src+ 6)));
        tmp=aes4(load(dst+ 0),J,I,L,load(src+ 1));store(dst+ 1,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 2),J,I,L,load(src+ 3));store(dst+ 3,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 4),J,I,L,load(src+ 5));store(dst+ 5,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 6),J,I,L,load(src+ 7));store(dst+ 7,tmp);sum=vxor(sum,tmp);
        bytes -= 8*16; dst += 8; src += 8;
    }
    if (bytes >= 4*16) {
        o0 = offset;
        o1 = vxor(o0,ctx->I[0]);
        offset = vxor(o0,ctx->I[1]);
        store(dst+ 0, aes4(vxor(load(src + 1),o0), J, I, L, load(src+ 0)));
        store(dst+ 2, aes4(vxor(load(src + 3),o1), J, I, L, load(src+ 2)));
        tmp=aes4(load(dst+ 0),J,I,L,load(src+ 1));store(dst+ 1,tmp);sum=vxor(sum,tmp);
        tmp=aes4(load(dst+ 2),J,I,L,load(src+ 3));store(dst+ 3,tmp);sum=vxor(sum,tmp);
        bytes -= 4*16; dst += 4; src += 4;
    }
    if (bytes) {
        o0 = offset;
        store(dst+ 0, aes4(vxor(load(src + 1),o0), J, I, L, load(src+ 0)));
        tmp=aes4(load(dst+ 0),J,I,L,load(src+ 1));store(dst+ 1,tmp);sum=vxor(sum,tmp);
    }
    return sum;
}

// Assembly:
vmovdqa (%rdi), %xmm1
vmovdqa 0x20(%rdi), %xmm0
vmovdqa 0x30(%rdi), %xmm2
vmovdqa 0x60(%rdi), %xmm3
vmovdqa 0x27d3(%rip), %xmm5     # 0x4000
vpshufb %xmm5, %xmm0, %xmm0
vpshufd $0x93, %xmm0, %xmm4     # xmm4 = xmm0[3,0,1,2]
vpsrad $0x1f, %xmm4, %xmm6
vpaddd %xmm0, %xmm0, %xmm4
vpternlogd $0x78, 0x27d5(%rip), %xmm6, %xmm4 # 0x4020
vpshufb %xmm5, %xmm4, %xmm7
vpxor %xmm0, %xmm0, %xmm0
xorl %eax, %eax
vpmovzxbd 0x2810(%rip), %xmm16 # 0x4070
vmovdqa 0x2798(%rip), %xmm6     # 0x4000
movl %edx, %r8d
cmpl $0x100, %r8d            # imm = 0x100
jb 0x1b0c
vpxor (%rdi), %xmm7, %xmm12
vmovdqa 0x10(%rdi), %xmm11
vmovdqa 0x20(%rdi), %xmm15
vpxor 0x10(%rsi,%rax), %xmm7, %xmm8
vaesenc %xmm2, %xmm8, %xmm8
vaesenc %xmm1, %xmm8, %xmm8
vaesenc %xmm3, %xmm8, %xmm8
vaesenc (%rsi,%rax), %xmm8, %xmm8
vmovdqu %xmm8, (%rcx,%rax)
vpxor 0x30(%rsi,%rax), %xmm12, %xmm9
vaesenc %xmm2, %xmm9, %xmm9
vaesenc %xmm1, %xmm9, %xmm9
vaesenc %xmm3, %xmm9, %xmm9
vaesenc 0x20(%rsi,%rax), %xmm9, %xmm9
vpxor %xmm7, %xmm11, %xmm13
vmovdqu %xmm9, 0x20(%rcx,%rax)
vpxor 0x50(%rsi,%rax), %xmm13, %xmm10
vaesenc %xmm2, %xmm10, %xmm10
vaesenc %xmm1, %xmm10, %xmm10
vaesenc %xmm3, %xmm10, %xmm10
vaesenc 0x40(%rsi,%rax), %xmm10, %xmm10
vmovdqu %xmm10, 0x40(%rcx,%rax)
vpxor %xmm11, %xmm12, %xmm14
vpxor 0x70(%rsi,%rax), %xmm14, %xmm11
vaesenc %xmm2, %xmm11, %xmm11
vaesenc %xmm1, %xmm11, %xmm11
vaesenc %xmm3, %xmm11, %xmm11
vaesenc 0x60(%rsi,%rax), %xmm11, %xmm11
vmovdqu %xmm11, 0x60(%rcx,%rax)
vmovdqu 0x90(%rsi,%rax), %xmm5
vpternlogq $0x96, %xmm15, %xmm7, %xmm5
vaesenc %xmm2, %xmm5, %xmm5
vaesenc %xmm1, %xmm5, %xmm5
vaesenc %xmm3, %xmm5, %xmm5
vaesenc 0x80(%rsi,%rax), %xmm5, %xmm7
vpshufd $0x93, %xmm4, %xmm5     # xmm5 = xmm4[3,0,1,2]
vmovdqu %xmm7, 0x80(%rcx,%rax)
vpternlogq $0x96, 0xb0(%rsi,%rax), %xmm15, %xmm12
vaesenc %xmm2, %xmm12, %xmm12
vaesenc %xmm1, %xmm12, %xmm12
vaesenc %xmm3, %xmm12, %xmm12
vaesenc 0xa0(%rsi,%rax), %xmm12, %xmm12
vmovdqu %xmm12, 0xa0(%rcx,%rax)
vpsrad $0x1f, %xmm5, %xmm5
vpternlogq $0x96, 0xd0(%rsi,%rax), %xmm15, %xmm13
vaesenc %xmm2, %xmm13, %xmm13
vaesenc %xmm1, %xmm13, %xmm13
vaesenc %xmm3, %xmm13, %xmm13
vaesenc 0xc0(%rsi,%rax), %xmm13, %xmm13
vmovdqu %xmm13, 0xc0(%rcx,%rax)
vpternlogq $0x96, 0xf0(%rsi,%rax), %xmm15, %xmm14
vpaddd %xmm4, %xmm4, %xmm4
vaesenc %xmm2, %xmm14, %xmm14
vaesenc %xmm1, %xmm14, %xmm14
vaesenc %xmm3, %xmm14, %xmm14
vaesenc 0xe0(%rsi,%rax), %xmm14, %xmm14
vpternlogd $0x78, %xmm16, %xmm5, %xmm4
vmovdqu %xmm14, 0xe0(%rcx,%rax)
vaesenc %xmm2, %xmm8, %xmm5
vaesenc %xmm1, %xmm5, %xmm5
vaesenc %xmm3, %xmm5, %xmm5
vaesenc 0x10(%rsi,%rax), %xmm5, %xmm5
vmovdqu %xmm5, 0x10(%rcx,%rax)
vaesenc %xmm2, %xmm9, %xmm8
vaesenc %xmm1, %xmm8, %xmm8
vaesenc %xmm3, %xmm8, %xmm8
vaesenc 0x30(%rsi,%rax), %xmm8, %xmm8
vmovdqu %xmm8, 0x30(%rcx,%rax)
vaesenc %xmm2, %xmm10, %xmm9
vaesenc %xmm1, %xmm9, %xmm9
vaesenc %xmm3, %xmm9, %xmm9
vaesenc 0x50(%rsi,%rax), %xmm9, %xmm9
vmovdqu %xmm9, 0x50(%rcx,%rax)
vpshufb %xmm6, %xmm4, %xmm10
vaesenc %xmm2, %xmm11, %xmm11
vaesenc %xmm1, %xmm11, %xmm11
vaesenc %xmm3, %xmm11, %xmm11
vaesenc 0x70(%rsi,%rax), %xmm11, %xmm11
vpternlogq $0x96, %xmm8, %xmm5, %xmm0
vmovdqu %xmm11, 0x70(%rcx,%rax)
vaesenc %xmm2, %xmm7, %xmm5
vaesenc %xmm1, %xmm5, %xmm5
vaesenc %xmm3, %xmm5, %xmm5
vaesenc 0x90(%rsi,%rax), %xmm5, %xmm5
vmovdqu %xmm5, 0x90(%rcx,%rax)
vaesenc %xmm2, %xmm12, %xmm7
vaesenc %xmm1, %xmm7, %xmm7
vaesenc %xmm3, %xmm7, %xmm7
vaesenc 0xb0(%rsi,%rax), %xmm7, %xmm7
vmovdqu %xmm7, 0xb0(%rcx,%rax)
vaesenc %xmm2, %xmm13, %xmm8
vaesenc %xmm1, %xmm8, %xmm8
vaesenc %xmm3, %xmm8, %xmm8
vaesenc 0xd0(%rsi,%rax), %xmm8, %xmm8
vmovdqu %xmm8, 0xd0(%rcx,%rax)
vpternlogq $0x96, %xmm9, %xmm11, %xmm0
vaesenc %xmm2, %xmm14, %xmm9
vaesenc %xmm1, %xmm9, %xmm9
vaesenc %xmm3, %xmm9, %xmm9
vaesenc 0xf0(%rsi,%rax), %xmm9, %xmm9
vpternlogq $0x96, %xmm5, %xmm7, %xmm0
vmovdqu %xmm9, 0xf0(%rcx,%rax)
vpternlogq $0x96, %xmm8, %xmm9, %xmm0
addl $0xffffff00, %r8d       # imm = 0xFFFFFF00
addq $0x100, %rax            # imm = 0x100
vmovdqa %xmm10, %xmm7
jmp 0x186b
cmpl $0x80, %r8d
jb 0x1c54
vpxor (%rdi), %xmm7, %xmm5
vmovdqa 0x10(%rdi), %xmm6
vpxor 0x20(%rdi), %xmm7, %xmm4
vpxor 0x10(%rsi,%rax), %xmm7, %xmm8
vaesenc %xmm2, %xmm8, %xmm8
vaesenc %xmm1, %xmm8, %xmm8
vaesenc %xmm3, %xmm8, %xmm8
vaesenc (%rsi,%rax), %xmm8, %xmm8
vmovdqu %xmm8, (%rcx,%rax)
vpxor 0x30(%rsi,%rax), %xmm5, %xmm9
vaesenc %xmm2, %xmm9, %xmm9
vaesenc %xmm1, %xmm9, %xmm9
vaesenc %xmm3, %xmm9, %xmm9
vaesenc 0x20(%rsi,%rax), %xmm9, %xmm9
vmovdqu %xmm9, 0x20(%rcx,%rax)
vmovdqu 0x50(%rsi,%rax), %xmm10
vpternlogq $0x96, %xmm6, %xmm7, %xmm10
vaesenc %xmm2, %xmm10, %xmm7
vaesenc %xmm1, %xmm7, %xmm7
vaesenc %xmm3, %xmm7, %xmm7
vaesenc 0x40(%rsi,%rax), %xmm7, %xmm7
vmovdqu %xmm7, 0x40(%rcx,%rax)
vpternlogq $0x96, 0x70(%rsi,%rax), %xmm6, %xmm5
vaesenc %xmm2, %xmm5, %xmm5
vaesenc %xmm1, %xmm5, %xmm5
vaesenc %xmm3, %xmm5, %xmm5
vaesenc 0x60(%rsi,%rax), %xmm5, %xmm5
vmovdqu %xmm5, 0x60(%rcx,%rax)
vaesenc %xmm2, %xmm8, %xmm6
vaesenc %xmm1, %xmm6, %xmm6
vaesenc %xmm3, %xmm6, %xmm6
vaesenc 0x10(%rsi,%rax), %xmm6, %xmm6
vmovdqu %xmm6, 0x10(%rcx,%rax)
vaesenc %xmm2, %xmm9, %xmm8
vaesenc %xmm1, %xmm8, %xmm8
vaesenc %xmm3, %xmm8, %xmm8
vaesenc 0x30(%rsi,%rax), %xmm8, %xmm8
vmovdqu %xmm8, 0x30(%rcx,%rax)
vaesenc %xmm2, %xmm7, %xmm7
vaesenc %xmm1, %xmm7, %xmm7
vaesenc %xmm3, %xmm7, %xmm7
vaesenc 0x50(%rsi,%rax), %xmm7, %xmm7
vmovdqu %xmm7, 0x50(%rcx,%rax)
vaesenc %xmm2, %xmm5, %xmm5
vaesenc %xmm1, %xmm5, %xmm5
vaesenc %xmm3, %xmm5, %xmm5
vaesenc 0x70(%rsi,%rax), %xmm5, %xmm5
addq %rax, %rsi
vmovdqu %xmm5, 0x70(%rcx,%rax)
addq %rax, %rcx
vpternlogq $0x96, %xmm8, %xmm6, %xmm0
vpternlogq $0x96, %xmm7, %xmm5, %xmm0
subl %eax, %edx
addl $-0x80, %edx
movl $0x80, %eax
addq %rax, %rcx
addq %rax, %rsi
vmovdqa %xmm4, %xmm7
movl %edx, %r8d
jmp 0x1c5a
addq %rax, %rcx
addq %rax, %rsi
cmpl $0x40, %r8d
jb 0x1cf7
vmovdqa (%rdi), %xmm4
vpxor 0x10(%rdi), %xmm7, %xmm5
vpxor 0x10(%rsi), %xmm7, %xmm6
vaesenc %xmm2, %xmm6, %xmm6
vaesenc %xmm1, %xmm6, %xmm6
vaesenc %xmm3, %xmm6, %xmm6
vaesenc (%rsi), %xmm6, %xmm6
vmovdqu %xmm6, (%rcx)
vpternlogq $0x96, 0x30(%rsi), %xmm7, %xmm4
vaesenc %xmm2, %xmm4, %xmm4
vaesenc %xmm1, %xmm4, %xmm4
vaesenc %xmm3, %xmm4, %xmm4
vaesenc 0x20(%rsi), %xmm4, %xmm4
vmovdqu %xmm4, 0x20(%rcx)
vaesenc %xmm2, %xmm6, %xmm6
vaesenc %xmm1, %xmm6, %xmm6
vaesenc %xmm3, %xmm6, %xmm6
vaesenc 0x10(%rsi), %xmm6, %xmm6
vmovdqu %xmm6, 0x10(%rcx)
vaesenc %xmm2, %xmm4, %xmm4
vaesenc %xmm1, %xmm4, %xmm4
vaesenc %xmm3, %xmm4, %xmm4
vaesenc 0x30(%rsi), %xmm4, %xmm4
vmovdqu %xmm4, 0x30(%rcx)
vpternlogq $0x96, %xmm4, %xmm6, %xmm0
addl $-0x40, %r8d
addq $0x40, %rcx
addq $0x40, %rsi
vmovdqa %xmm5, %xmm7
testl %r8d, %r8d
je 0x1d37
vpxor 0x10(%rsi), %xmm7, %xmm4
vaesenc %xmm2, %xmm4, %xmm4
vaesenc %xmm1, %xmm4, %xmm4
vaesenc %xmm3, %xmm4, %xmm4
vaesenc (%rsi), %xmm4, %xmm4
vmovdqu %xmm4, (%rcx)
vaesenc %xmm2, %xmm4, %xmm2
vaesenc %xmm1, %xmm2, %xmm1
vaesenc %xmm3, %xmm1, %xmm1
vaesenc 0x10(%rsi), %xmm1, %xmm1
vmovdqu %xmm1, 0x10(%rcx)
vpxor %xmm0, %xmm1, %xmm0
retq