// File: /workspace/github_c_makefile_star2_O3/mjosaarinen[P]brutus/crypto_aead/scream10v2/sse/scream.c
// Function: encrypt_tweakey
__attribute__((flatten)) void encrypt_tweakey (v16qi *restrict X, v16qi *restrict T3) {
#if NSTEPS > 15
#error Round constant not implemented
#endif
  static const v16qi RC[64] = {
    CV(  0), CV( 27), CV( 54), CV( 81), CV(108), CV(135), CV(162), CV(189), 
    CV(216), CV(243), CV( 14), CV( 41), CV( 68), CV( 95), CV(122), CV(149), 
    CV(176), CV(203), CV(230), CV(  1), CV( 28), CV( 55), CV( 82), CV(109), 
    CV(136), CV(163), CV(190), CV(217), CV(244), CV( 15), CV( 42), CV( 69), 
    CV( 96), CV(123), CV(150), CV(177), CV(204), CV(231), CV(  2), CV( 29), 
    CV( 56), CV( 83), CV(110), CV(137), CV(164), CV(191), CV(218), CV(245), 
    CV( 16), CV( 43), CV( 70), CV( 97), CV(124), CV(151), CV(178), CV(205), 
    CV(232), CV(  3), CV( 30), CV( 57), CV( 84), CV(111), CV(138), CV(165), 
  };

  int t=0;
  int i,j;

  for (i=0; i<NSTEPS; i++) {
    // Key addition
    for (j=0; j<8; j++) {
      X[j] ^= T3[t++];
    }
    SBOX(X);
    // Round constants
    X[0] ^= RC[2*i];

    // Key addition
    for (j=8; j<16; j++) {
      X[j] ^= T3[t++];
    }
    SBOX((X+8));


    // LBox
    LBox16P(X);

    // Sbox
    SBOX(X);
    // Round constants
    X[0] ^= RC[2*i+1];

    SBOX((X+8));
    
    // LBox
    LBox16P(X);
    
    if (t == 48)
      t=0;
  }

  // Final key addition
  for (j=0; j<16; j++) {
      X[j] ^= T3[t++];
  }
}

// Assembly:
pushq %r14
pushq %rbx
leaq 0x90(%rdi), %rax
xorl %ecx, %ecx
vpcmpeqd %xmm0, %xmm0, %xmm0
leaq 0x2e1d(%rip), %rdx      # 0x4010
vpbroadcastb 0x2e04(%rip), %xmm1 # 0x4000
xorl %r9d, %r9d
xorl %r8d, %r8d
movslq %r8d, %r10
shlq $0x4, %r10
addq %rsi, %r10
xorl %r11d, %r11d
incl %r8d
vmovdqa (%rdi,%r11), %xmm2
vpxor (%r10,%r11), %xmm2, %xmm2
vmovdqa %xmm2, (%rdi,%r11)
addq $0x10, %r11
cmpq $0x80, %r11
jne 0x120f
vmovdqa (%rdi), %xmm2
vmovdqa 0x10(%rdi), %xmm3
vmovdqa 0x40(%rdi), %xmm4
vmovdqa 0x50(%rdi), %xmm5
vmovdqa 0x20(%rdi), %xmm6
vpternlogq $0x78, %xmm2, %xmm3, %xmm6
vpxor %xmm3, %xmm6, %xmm3
vmovdqa 0x30(%rdi), %xmm7
vpternlogq $0x78, %xmm2, %xmm4, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vpternlogq $0x78, %xmm3, %xmm7, %xmm2
vpxor %xmm3, %xmm4, %xmm4
vpand %xmm4, %xmm6, %xmm8
vpternlogq $0x96, %xmm3, %xmm2, %xmm8
vpxor %xmm2, %xmm5, %xmm3
vmovdqa 0x60(%rdi), %xmm9
vpxor %xmm8, %xmm9, %xmm10
vmovdqa 0x70(%rdi), %xmm11
vpternlogq $0xd2, %xmm11, %xmm9, %xmm2
vmovdqa %xmm2, 0x50(%rdi)
vpternlogq $0xd2, %xmm5, %xmm11, %xmm8
vmovdqa %xmm8, 0x60(%rdi)
vpternlogq $0xc6, %xmm9, %xmm6, %xmm5
vmovdqa %xmm5, 0x70(%rdi)
vpand %xmm3, %xmm10, %xmm2
vpternlogq $0x96, %xmm11, %xmm6, %xmm2
vpxor %xmm2, %xmm10, %xmm5
vpternlogq $0xd2, %xmm3, %xmm4, %xmm7
vpternlogq $0xd2, %xmm5, %xmm7, %xmm3
vpternlogq $0xf, %xmm7, %xmm7, %xmm7
vmovdqa %xmm7, 0x30(%rdi)
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, 0x20(%rdi)
vpternlogq $0x96, %xmm0, %xmm5, %xmm4
vmovdqa %xmm4, 0x40(%rdi)
vpand %xmm2, %xmm4, %xmm2
vpternlogq $0x96, %xmm5, %xmm3, %xmm2
vmovdqa %xmm2, 0x10(%rdi)
movq %r9, %r10
shlq $0x5, %r10
vpxor (%r10,%rdx), %xmm3, %xmm2
vmovdqa %xmm2, (%rdi)
leaq (%r9,%r9), %r11
movslq %r8d, %r10
movq %r10, %rbx
shlq $0x4, %rbx
addq %rsi, %rbx
addq $-0x30, %r10
movl $0x80, %r14d
vmovdqa (%rdi,%r14), %xmm2
vpxor -0x80(%rbx,%r14), %xmm2, %xmm2
vmovdqa %xmm2, (%rdi,%r14)
addq $0x10, %r14
incq %r10
incl %r8d
cmpq $0x100, %r14            # imm = 0x100
jne 0x132b
vmovdqa 0x80(%rdi), %xmm2
vmovdqa 0x90(%rdi), %xmm3
vmovdqa 0xc0(%rdi), %xmm4
vmovdqa 0xd0(%rdi), %xmm5
vmovdqa 0xa0(%rdi), %xmm6
vpternlogq $0x78, %xmm2, %xmm3, %xmm6
vpxor %xmm3, %xmm6, %xmm3
vmovdqa 0xb0(%rdi), %xmm7
vpternlogq $0x78, %xmm2, %xmm4, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vpternlogq $0x78, %xmm3, %xmm7, %xmm2
vpxor %xmm3, %xmm4, %xmm4
vpand %xmm4, %xmm6, %xmm8
vpternlogq $0x96, %xmm3, %xmm2, %xmm8
vpxor %xmm2, %xmm5, %xmm3
vmovdqa 0xe0(%rdi), %xmm9
vpxor %xmm8, %xmm9, %xmm10
vmovdqa 0xf0(%rdi), %xmm11
vpternlogq $0xd2, %xmm11, %xmm9, %xmm2
vmovdqa %xmm2, 0xd0(%rdi)
vpternlogq $0xd2, %xmm5, %xmm11, %xmm8
vmovdqa %xmm8, 0xe0(%rdi)
vpternlogq $0xc6, %xmm9, %xmm6, %xmm5
vmovdqa %xmm5, 0xf0(%rdi)
vpand %xmm3, %xmm10, %xmm2
vpternlogq $0x96, %xmm11, %xmm6, %xmm2
vpxor %xmm2, %xmm10, %xmm5
vpternlogq $0xd2, %xmm3, %xmm4, %xmm7
vpternlogq $0xd2, %xmm5, %xmm7, %xmm3
vpternlogq $0xf, %xmm7, %xmm7, %xmm7
vmovdqa %xmm7, 0xb0(%rdi)
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, 0xa0(%rdi)
vmovdqa %xmm3, 0x80(%rdi)
vpternlogq $0x96, %xmm0, %xmm5, %xmm4
vmovdqa %xmm4, 0xc0(%rdi)
vpand %xmm2, %xmm4, %xmm2
vpternlogq $0x96, %xmm5, %xmm3, %xmm2
vmovdqa %xmm2, 0x90(%rdi)
movq $-0x2, %rbx
movq %rax, %r14
vmovdqa -0x90(%r14), %xmm2
vmovdqa -0x80(%r14), %xmm3
vmovdqa -0x10(%r14), %xmm4
vmovdqa (%r14), %xmm5
movdqa 0x2f8f(%rip), %xmm6     # 0x4410
vpsrld $0x4, %xmm2, %xmm7
vpand %xmm1, %xmm7, %xmm7
vpsrld $0x4, %xmm3, %xmm8
vpand %xmm1, %xmm8, %xmm8
vpshufb %xmm7, %xmm6, %xmm9
vmovdqa %xmm9, -0x90(%r14)
vpshufb %xmm8, %xmm6, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x2f6b(%rip), %xmm10    # 0x4420
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%r14)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%r14)
movdqa 0x2f5d(%rip), %xmm10    # 0x4430
vpand %xmm1, %xmm2, %xmm2
vpshufb %xmm2, %xmm10, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%r14)
vpand %xmm1, %xmm3, %xmm3
vpshufb %xmm3, %xmm10, %xmm10
vpxor %xmm6, %xmm10, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x2f3a(%rip), %xmm10    # 0x4440
vpshufb %xmm2, %xmm10, %xmm2
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, -0x10(%r14)
vpshufb %xmm3, %xmm10, %xmm3
vpxor %xmm3, %xmm8, %xmm3
vmovdqa %xmm3, (%r14)
movdqa 0x2f25(%rip), %xmm7     # 0x4450
vpsrld $0x4, %xmm4, %xmm8
vpand %xmm1, %xmm8, %xmm8
vpsrld $0x4, %xmm5, %xmm10
vpand %xmm1, %xmm10, %xmm10
vpshufb %xmm8, %xmm7, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%r14)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x2ef9(%rip), %xmm7     # 0x4460
vpshufb %xmm8, %xmm7, %xmm8
vpxor %xmm2, %xmm8, %xmm2
vmovdqa %xmm2, -0x10(%r14)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm3, %xmm7, %xmm3
vmovdqa %xmm3, (%r14)
movdqa 0x2ee4(%rip), %xmm7     # 0x4470
vpand %xmm1, %xmm4, %xmm4
vpand %xmm1, %xmm5, %xmm5
vpshufb %xmm4, %xmm7, %xmm8
vpxor %xmm9, %xmm8, %xmm8
vmovdqa %xmm8, -0x90(%r14)
vpshufb %xmm5, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x2ec2(%rip), %xmm6     # 0x4480
vpshufb %xmm4, %xmm6, %xmm4
vpxor %xmm2, %xmm4, %xmm2
vmovdqa %xmm2, -0x10(%r14)
vpshufb %xmm5, %xmm6, %xmm2
vpxor %xmm3, %xmm2, %xmm2
vmovdqa %xmm2, (%r14)
addq $0x2, %rbx
addq $0x20, %r14
cmpq $0x6, %rbx
jb 0x145f
vmovdqa (%rdi), %xmm2
vmovdqa 0x10(%rdi), %xmm3
vmovdqa 0x40(%rdi), %xmm4
vmovdqa 0x50(%rdi), %xmm5
vmovdqa 0x20(%rdi), %xmm6
vpternlogq $0x78, %xmm2, %xmm3, %xmm6
vpxor %xmm3, %xmm6, %xmm3
vmovdqa 0x30(%rdi), %xmm7
vpternlogq $0x78, %xmm2, %xmm4, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vpternlogq $0x78, %xmm3, %xmm7, %xmm2
vpxor %xmm3, %xmm4, %xmm4
vpand %xmm4, %xmm6, %xmm8
vpternlogq $0x96, %xmm3, %xmm2, %xmm8
vpxor %xmm2, %xmm5, %xmm3
vmovdqa 0x60(%rdi), %xmm9
vpxor %xmm8, %xmm9, %xmm10
vmovdqa 0x70(%rdi), %xmm11
vpternlogq $0xd2, %xmm11, %xmm9, %xmm2
vmovdqa %xmm2, 0x50(%rdi)
vpternlogq $0xd2, %xmm5, %xmm11, %xmm8
vmovdqa %xmm8, 0x60(%rdi)
vpternlogq $0xc6, %xmm9, %xmm6, %xmm5
vmovdqa %xmm5, 0x70(%rdi)
vpand %xmm3, %xmm10, %xmm2
vpternlogq $0x96, %xmm11, %xmm6, %xmm2
vpxor %xmm2, %xmm10, %xmm5
vpternlogq $0xd2, %xmm3, %xmm4, %xmm7
vpternlogq $0xd2, %xmm5, %xmm7, %xmm3
vpternlogq $0xf, %xmm7, %xmm7, %xmm7
vmovdqa %xmm7, 0x30(%rdi)
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, 0x20(%rdi)
vpternlogq $0x96, %xmm0, %xmm5, %xmm4
vmovdqa %xmm4, 0x40(%rdi)
vpand %xmm2, %xmm4, %xmm2
vpternlogq $0x96, %xmm5, %xmm3, %xmm2
vmovdqa %xmm2, 0x10(%rdi)
shlq $0x4, %r11
vpxor 0x10(%r11,%rdx), %xmm3, %xmm2
vmovdqa %xmm2, (%rdi)
vmovdqa 0x80(%rdi), %xmm2
vmovdqa 0x90(%rdi), %xmm3
vmovdqa 0xa0(%rdi), %xmm4
vpternlogq $0x78, %xmm2, %xmm3, %xmm4
vmovdqa 0xc0(%rdi), %xmm5
vmovdqa 0xb0(%rdi), %xmm6
vpxor %xmm3, %xmm4, %xmm3
vpternlogq $0x78, %xmm2, %xmm5, %xmm6
vpxor %xmm4, %xmm6, %xmm4
vpternlogq $0x78, %xmm3, %xmm6, %xmm2
vpxor %xmm3, %xmm5, %xmm5
vpand %xmm5, %xmm4, %xmm7
vpternlogq $0x96, %xmm3, %xmm2, %xmm7
vmovdqa 0xd0(%rdi), %xmm3
vpxor %xmm2, %xmm3, %xmm8
vmovdqa 0xe0(%rdi), %xmm9
vpxor %xmm7, %xmm9, %xmm10
vmovdqa 0xf0(%rdi), %xmm11
vpternlogq $0xd2, %xmm11, %xmm9, %xmm2
vmovdqa %xmm2, 0xd0(%rdi)
vpternlogq $0xd2, %xmm3, %xmm11, %xmm7
vmovdqa %xmm7, 0xe0(%rdi)
vpternlogq $0xc6, %xmm9, %xmm4, %xmm3
vmovdqa %xmm3, 0xf0(%rdi)
vpand %xmm8, %xmm10, %xmm2
vpternlogq $0x96, %xmm11, %xmm4, %xmm2
vpxor %xmm2, %xmm10, %xmm3
vpternlogq $0xd2, %xmm8, %xmm5, %xmm6
vpternlogq $0xd2, %xmm3, %xmm6, %xmm8
vpternlogq $0xf, %xmm6, %xmm6, %xmm6
vmovdqa %xmm6, 0xb0(%rdi)
vpxor %xmm6, %xmm2, %xmm2
vmovdqa %xmm2, 0xa0(%rdi)
vmovdqa %xmm8, 0x80(%rdi)
vpternlogq $0x96, %xmm0, %xmm3, %xmm5
vmovdqa %xmm5, 0xc0(%rdi)
vpand %xmm2, %xmm5, %xmm2
vpternlogq $0x96, %xmm3, %xmm8, %xmm2
vmovdqa %xmm2, 0x90(%rdi)
movq $-0x2, %r11
movq %rax, %rbx
vmovdqa -0x90(%rbx), %xmm2
vmovdqa -0x80(%rbx), %xmm3
vmovdqa -0x10(%rbx), %xmm4
vmovdqa (%rbx), %xmm5
movdqa 0x2c1a(%rip), %xmm6     # 0x4410
vpsrld $0x4, %xmm2, %xmm7
vpand %xmm1, %xmm7, %xmm7
vpsrld $0x4, %xmm3, %xmm8
vpand %xmm1, %xmm8, %xmm8
vpshufb %xmm7, %xmm6, %xmm9
vmovdqa %xmm9, -0x90(%rbx)
vpshufb %xmm8, %xmm6, %xmm6
vmovdqa %xmm6, -0x80(%rbx)
movdqa 0x2bf8(%rip), %xmm10    # 0x4420
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%rbx)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%rbx)
movdqa 0x2bec(%rip), %xmm10    # 0x4430
vpand %xmm1, %xmm2, %xmm2
vpshufb %xmm2, %xmm10, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%rbx)
vpand %xmm1, %xmm3, %xmm3
vpshufb %xmm3, %xmm10, %xmm10
vpxor %xmm6, %xmm10, %xmm6
vmovdqa %xmm6, -0x80(%rbx)
movdqa 0x2bcb(%rip), %xmm10    # 0x4440
vpshufb %xmm2, %xmm10, %xmm2
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, -0x10(%rbx)
vpshufb %xmm3, %xmm10, %xmm3
vpxor %xmm3, %xmm8, %xmm3
vmovdqa %xmm3, (%rbx)
movdqa 0x2bb8(%rip), %xmm7     # 0x4450
vpsrld $0x4, %xmm4, %xmm8
vpand %xmm1, %xmm8, %xmm8
vpsrld $0x4, %xmm5, %xmm10
vpand %xmm1, %xmm10, %xmm10
vpshufb %xmm8, %xmm7, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%rbx)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%rbx)
movdqa 0x2b8e(%rip), %xmm7     # 0x4460
vpshufb %xmm8, %xmm7, %xmm8
vpxor %xmm2, %xmm8, %xmm2
vmovdqa %xmm2, -0x10(%rbx)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm3, %xmm7, %xmm3
vmovdqa %xmm3, (%rbx)
movdqa 0x2b7b(%rip), %xmm7     # 0x4470
vpand %xmm1, %xmm4, %xmm4
vpand %xmm1, %xmm5, %xmm5
vpshufb %xmm4, %xmm7, %xmm8
vpxor %xmm9, %xmm8, %xmm8
vmovdqa %xmm8, -0x90(%rbx)
vpshufb %xmm5, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%rbx)
movdqa 0x2b5b(%rip), %xmm6     # 0x4480
vpshufb %xmm4, %xmm6, %xmm4
vpxor %xmm2, %xmm4, %xmm2
vmovdqa %xmm2, -0x10(%rbx)
vpshufb %xmm5, %xmm6, %xmm2
vpxor %xmm3, %xmm2, %xmm2
vmovdqa %xmm2, (%rbx)
addq $0x2, %r11
addq $0x20, %rbx
cmpq $0x6, %r11
jb 0x17d8
testq %r10, %r10
cmovel %ecx, %r8d
incq %r9
cmpq $0xa, %r9
jne 0x1202
movslq %r8d, %rax
shlq $0x4, %rax
addq %rax, %rsi
xorl %eax, %eax
vmovdqa (%rdi,%rax), %xmm0
vpxor (%rsi,%rax), %xmm0, %xmm0
vmovdqa %xmm0, (%rdi,%rax)
addq $0x10, %rax
cmpq $0x100, %rax            # imm = 0x100
jne 0x1972
popq %rbx
popq %r14
retq