// File: /workspace/github_c_makefile_star2_O3/mjosaarinen[P]brutus/crypto_aead/scream10v3/sse/scream.c
// Function: decrypt_tweakey
__attribute__((flatten)) void decrypt_tweakey (v16qi *restrict x, v16qi *restrict T3) {
#if NSTEPS > 15
#error Round constant not implemented
#endif
#define CST1(i) CV((2199*i)%256)
#define CST2(i) CV(((2199*i)>>8)%256)
  static const v16qi RC1[32] = {
    CST1( 0), CST1( 1), CST1( 2), CST1( 3), CST1( 4), CST1( 5), CST1( 6), CST1( 7),
    CST1( 8), CST1( 9), CST1(10), CST1(11), CST1(12), CST1(13), CST1(14), CST1(15),
    CST1(16), CST1(17), CST1(18), CST1(19), CST1(20), CST1(21), CST1(22), CST1(23),
    CST1(24), CST1(25), CST1(26), CST1(27), CST1(28), CST1(29), CST1(30), CST1(31),
  };
  static const v16qi RC2[32] = {
    CST2( 0), CST2( 1), CST2( 2), CST2( 3), CST2( 4), CST2( 5), CST2( 6), CST2( 7),
    CST2( 8), CST2( 9), CST2(10), CST2(11), CST2(12), CST2(13), CST2(14), CST2(15),
    CST2(16), CST2(17), CST2(18), CST2(19), CST2(20), CST2(21), CST2(22), CST2(23),
    CST2(24), CST2(25), CST2(26), CST2(27), CST2(28), CST2(29), CST2(30), CST2(31),
  };
#undef CST1
#undef CST2

  int t=16*((NSTEPS%3)+1);
  int i,j;

  // Final key addition
  for (j=15; j>=0; j--) {
      x[j] ^= T3[--t];
  }

  for (i=NSTEPS-1; i>=0; i--) {
    if (t == 0)
      t=48;

    LBoxInv16P(x);

    x[8] ^= RC2[2*i+1];
    SBOX_Inv((x+8));
    x[0] ^= RC1[2*i+1];
    SBOX_Inv(x);

    LBoxInv16P(x);

    x[8] ^= RC2[2*i];
    SBOX_Inv((x+8));
    for (j=15; j>=8; j--) {
      x[j] ^= T3[--t];
    }
    x[0] ^= RC1[2*i];
    SBOX_Inv(x);
    for (j=7; j>=0; j--) {
      x[j] ^= T3[--t];
    }
  }
}

// Assembly:
movl $0x100, %eax            # imm = 0x100
vmovaps -0x10(%rdi,%rax), %xmm0
vxorps 0xf0(%rsi,%rax), %xmm0, %xmm0
vmovaps %xmm0, -0x10(%rdi,%rax)
addq $-0x10, %rax
jne 0x19cb
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
leaq 0x90(%rdi), %rax
leaq -0x90(%rsi), %rcx
movl $0x10, %edx
movl $0x9, %r8d
vpbroadcastb 0x25f0(%rip), %xmm0 # 0x4001
leaq 0x27f8(%rip), %r9       # 0x4210
vpcmpeqd %xmm1, %xmm1, %xmm1
leaq 0x25ed(%rip), %r10      # 0x4010
movl $0x30, %r11d
movq $-0x2, %rbx
movq %rax, %r14
vmovdqa -0x90(%r14), %xmm2
vmovdqa -0x80(%r14), %xmm3
vmovdqa -0x10(%r14), %xmm4
vmovdqa (%r14), %xmm5
movdqa 0x2a3b(%rip), %xmm6     # 0x4490
vpsrld $0x4, %xmm2, %xmm7
vpand %xmm0, %xmm7, %xmm7
vpsrld $0x4, %xmm3, %xmm8
vpand %xmm0, %xmm8, %xmm8
vpshufb %xmm7, %xmm6, %xmm9
vmovdqa %xmm9, -0x90(%r14)
vpshufb %xmm8, %xmm6, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x2a17(%rip), %xmm10    # 0x44a0
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%r14)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%r14)
movdqa 0x2a09(%rip), %xmm10    # 0x44b0
vpand %xmm0, %xmm2, %xmm2
vpshufb %xmm2, %xmm10, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%r14)
vpand %xmm0, %xmm3, %xmm3
vpshufb %xmm3, %xmm10, %xmm10
vpxor %xmm6, %xmm10, %xmm6
vmovdqa %xmm6, -0x80(%r14)
movdqa 0x29e6(%rip), %xmm10    # 0x44c0
vpshufb %xmm2, %xmm10, %xmm2
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, -0x10(%r14)
vpshufb %xmm3, %xmm10, %xmm3
vpxor %xmm3, %xmm8, %xmm3
vmovdqa %xmm3, (%r14)
movdqa 0x29d1(%rip), %xmm7     # 0x44d0
vpsrld $0x4, %xmm4, %xmm8
vpand %xmm0, %xmm8, %xmm8
vpsrld $0x4, %xmm5, %xmm10
vpand %xmm0, %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 0x29a5(%rip), %xmm7     # 0x44e0
vpshufb %xmm8, %xmm7, %xmm8
vpxor %xmm2, %xmm8, %xmm2
vmovdqa %xmm2, -0x10(%r14)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm3, %xmm7, %xmm3
vmovdqa %xmm3, (%r14)
movdqa 0x2990(%rip), %xmm7     # 0x44f0
vpand %xmm0, %xmm4, %xmm4
vpand %xmm0, %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 0x296e(%rip), %xmm6     # 0x4500
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 0x1a33
movq %r8, %rbx
shlq $0x5, %rbx
vmovdqa 0x80(%rdi), %xmm2
vpxor 0x10(%rbx,%r9), %xmm2, %xmm2
vmovdqa 0x90(%rdi), %xmm3
vmovdqa 0xa0(%rdi), %xmm4
vmovdqa %xmm2, %xmm5
vpternlogq $0x78, %xmm3, %xmm4, %xmm5
vmovdqa 0xb0(%rdi), %xmm6
vmovdqa %xmm4, %xmm7
vpternlogq $0x96, %xmm1, %xmm5, %xmm7
vpxor 0xd0(%rdi), %xmm7, %xmm8
vpxor %xmm3, %xmm6, %xmm9
vpternlogq $0xa6, 0xe0(%rdi), %xmm6, %xmm5
vpxor %xmm4, %xmm9, %xmm10
vpternlogq $0x6a, 0xf0(%rdi), %xmm7, %xmm9
vpxor %xmm6, %xmm7, %xmm7
vpternlogq $0x6a, 0xc0(%rdi), %xmm10, %xmm7
vmovdqa %xmm5, %xmm10
vpternlogq $0x78, %xmm8, %xmm7, %xmm10
vpxor %xmm2, %xmm10, %xmm2
vmovdqa %xmm2, 0x80(%rdi)
vmovdqa %xmm9, %xmm11
vpternlogq $0x1e, %xmm8, %xmm5, %xmm11
vpxor %xmm4, %xmm11, %xmm4
vmovdqa %xmm4, 0xa0(%rdi)
vpand %xmm9, %xmm10, %xmm10
vpternlogq $0x96, %xmm3, %xmm7, %xmm10
vmovdqa %xmm10, 0x90(%rdi)
vpand %xmm7, %xmm11, %xmm3
vpternlogq $0x96, %xmm6, %xmm8, %xmm3
vmovdqa %xmm3, 0xb0(%rdi)
vpternlogq $0x78, %xmm4, %xmm10, %xmm2
vpxor %xmm3, %xmm10, %xmm6
vpxor %xmm4, %xmm2, %xmm10
vpxor %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, 0xd0(%rdi)
vpternlogq $0x6c, %xmm3, %xmm5, %xmm2
vmovdqa %xmm2, 0xe0(%rdi)
vpternlogq $0x78, %xmm6, %xmm10, %xmm9
vmovdqa %xmm9, 0xf0(%rdi)
vpxor %xmm3, %xmm10, %xmm2
vpxor %xmm4, %xmm6, %xmm3
vpternlogq $0x6c, %xmm2, %xmm7, %xmm3
vmovdqa %xmm3, 0xc0(%rdi)
vmovdqa (%rdi), %xmm2
vmovdqa 0x10(%rdi), %xmm3
vmovdqa 0x20(%rdi), %xmm4
vmovdqa 0x30(%rdi), %xmm5
vpxor 0x10(%rbx,%r10), %xmm2, %xmm2
leaq (%r8,%r8), %rbx
vmovdqa %xmm2, %xmm6
vpternlogq $0x78, %xmm3, %xmm4, %xmm6
vpxor %xmm3, %xmm5, %xmm7
vmovdqa %xmm4, %xmm8
vpternlogq $0x96, %xmm1, %xmm6, %xmm8
vpxor 0x50(%rdi), %xmm8, %xmm9
vpternlogq $0xa6, 0x60(%rdi), %xmm5, %xmm6
vpxor %xmm4, %xmm7, %xmm10
vpternlogq $0x6a, 0x70(%rdi), %xmm8, %xmm7
vpxor %xmm5, %xmm8, %xmm8
vpternlogq $0x6a, 0x40(%rdi), %xmm10, %xmm8
vmovdqa %xmm6, %xmm10
vpternlogq $0x78, %xmm9, %xmm8, %xmm10
vpxor %xmm2, %xmm10, %xmm2
vmovdqa %xmm2, (%rdi)
vmovdqa %xmm7, %xmm11
vpternlogq $0x1e, %xmm9, %xmm6, %xmm11
vpxor %xmm4, %xmm11, %xmm4
vmovdqa %xmm4, 0x20(%rdi)
vpand %xmm7, %xmm10, %xmm10
vpternlogq $0x96, %xmm3, %xmm8, %xmm10
vmovdqa %xmm10, 0x10(%rdi)
vpand %xmm11, %xmm8, %xmm3
vpternlogq $0x96, %xmm5, %xmm9, %xmm3
vmovdqa %xmm3, 0x30(%rdi)
vpternlogq $0x78, %xmm4, %xmm10, %xmm2
vpxor %xmm3, %xmm10, %xmm5
vpxor %xmm4, %xmm2, %xmm10
vpxor %xmm9, %xmm10, %xmm9
vmovdqa %xmm9, 0x50(%rdi)
vpternlogq $0x6c, %xmm3, %xmm6, %xmm2
vmovdqa %xmm2, 0x60(%rdi)
vpternlogq $0x78, %xmm5, %xmm10, %xmm7
vmovdqa %xmm7, 0x70(%rdi)
vpxor %xmm3, %xmm10, %xmm2
vpxor %xmm4, %xmm5, %xmm3
vpternlogq $0x6c, %xmm2, %xmm8, %xmm3
vmovdqa %xmm3, 0x40(%rdi)
movq $-0x2, %r14
movq %rax, %r15
vmovdqa -0x90(%r15), %xmm2
vmovdqa -0x80(%r15), %xmm3
vmovdqa -0x10(%r15), %xmm4
vmovdqa (%r15), %xmm5
movdqa 0x26a2(%rip), %xmm6     # 0x4490
vpsrld $0x4, %xmm2, %xmm7
vpand %xmm0, %xmm7, %xmm7
vpsrld $0x4, %xmm3, %xmm8
vpand %xmm0, %xmm8, %xmm8
vpshufb %xmm7, %xmm6, %xmm9
vmovdqa %xmm9, -0x90(%r15)
vpshufb %xmm8, %xmm6, %xmm6
vmovdqa %xmm6, -0x80(%r15)
movdqa 0x267e(%rip), %xmm10    # 0x44a0
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%r15)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%r15)
movdqa 0x2670(%rip), %xmm10    # 0x44b0
vpand %xmm0, %xmm2, %xmm2
vpshufb %xmm2, %xmm10, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%r15)
vpand %xmm0, %xmm3, %xmm3
vpshufb %xmm3, %xmm10, %xmm10
vpxor %xmm6, %xmm10, %xmm6
vmovdqa %xmm6, -0x80(%r15)
movdqa 0x264d(%rip), %xmm10    # 0x44c0
vpshufb %xmm2, %xmm10, %xmm2
vpxor %xmm7, %xmm2, %xmm2
vmovdqa %xmm2, -0x10(%r15)
vpshufb %xmm3, %xmm10, %xmm3
vpxor %xmm3, %xmm8, %xmm3
vmovdqa %xmm3, (%r15)
movdqa 0x2638(%rip), %xmm7     # 0x44d0
vpsrld $0x4, %xmm4, %xmm8
vpand %xmm0, %xmm8, %xmm8
vpsrld $0x4, %xmm5, %xmm10
vpand %xmm0, %xmm10, %xmm10
vpshufb %xmm8, %xmm7, %xmm11
vpxor %xmm9, %xmm11, %xmm9
vmovdqa %xmm9, -0x90(%r15)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%r15)
movdqa 0x260c(%rip), %xmm7     # 0x44e0
vpshufb %xmm8, %xmm7, %xmm8
vpxor %xmm2, %xmm8, %xmm2
vmovdqa %xmm2, -0x10(%r15)
vpshufb %xmm10, %xmm7, %xmm7
vpxor %xmm3, %xmm7, %xmm3
vmovdqa %xmm3, (%r15)
movdqa 0x25f7(%rip), %xmm7     # 0x44f0
vpand %xmm0, %xmm4, %xmm4
vpand %xmm0, %xmm5, %xmm5
vpshufb %xmm4, %xmm7, %xmm8
vpxor %xmm9, %xmm8, %xmm8
vmovdqa %xmm8, -0x90(%r15)
vpshufb %xmm5, %xmm7, %xmm7
vpxor %xmm6, %xmm7, %xmm6
vmovdqa %xmm6, -0x80(%r15)
movdqa 0x25d5(%rip), %xmm6     # 0x4500
vpshufb %xmm4, %xmm6, %xmm4
vpxor %xmm2, %xmm4, %xmm2
vmovdqa %xmm2, -0x10(%r15)
vpshufb %xmm5, %xmm6, %xmm2
vpxor %xmm3, %xmm2, %xmm2
vmovdqa %xmm2, (%r15)
addq $0x2, %r14
addq $0x20, %r15
cmpq $0x6, %r14
jb 0x1dcc
testl %edx, %edx
cmovel %r11d, %edx
shlq $0x4, %rbx
vmovdqa 0x80(%rdi), %xmm2
vmovdqa 0x90(%rdi), %xmm3
vmovdqa 0xa0(%rdi), %xmm4
vmovdqa 0xb0(%rdi), %xmm5
vpxor (%rbx,%r9), %xmm2, %xmm2
vmovdqa %xmm2, %xmm6
vpternlogq $0x78, %xmm3, %xmm4, %xmm6
vpxor %xmm3, %xmm5, %xmm7
vmovdqa %xmm4, %xmm8
vpternlogq $0x96, %xmm1, %xmm6, %xmm8
vpxor 0xd0(%rdi), %xmm8, %xmm9
vpternlogq $0xa6, 0xe0(%rdi), %xmm5, %xmm6
vpxor %xmm4, %xmm7, %xmm10
vpternlogq $0x6a, 0xf0(%rdi), %xmm8, %xmm7
vpxor %xmm5, %xmm8, %xmm8
vpternlogq $0x6a, 0xc0(%rdi), %xmm10, %xmm8
vmovdqa %xmm6, %xmm10
vpternlogq $0x78, %xmm9, %xmm8, %xmm10
vpxor %xmm2, %xmm10, %xmm2
vmovdqa %xmm2, 0x80(%rdi)
vmovdqa %xmm7, %xmm11
vpternlogq $0x1e, %xmm9, %xmm6, %xmm11
vpxor %xmm4, %xmm11, %xmm4
vmovdqa %xmm4, 0xa0(%rdi)
vpand %xmm7, %xmm10, %xmm10
vpternlogq $0x96, %xmm3, %xmm8, %xmm10
vmovdqa %xmm10, 0x90(%rdi)
vpand %xmm11, %xmm8, %xmm3
vpternlogq $0x96, %xmm5, %xmm9, %xmm3
vmovdqa %xmm3, 0xb0(%rdi)
vpternlogq $0x78, %xmm4, %xmm10, %xmm2
vpxor %xmm3, %xmm10, %xmm5
vpxor %xmm4, %xmm2, %xmm10
vpxor %xmm9, %xmm10, %xmm9
vmovdqa %xmm9, 0xd0(%rdi)
vpternlogq $0x6c, %xmm3, %xmm6, %xmm2
vmovdqa %xmm2, 0xe0(%rdi)
vpternlogq $0x78, %xmm5, %xmm10, %xmm7
vmovdqa %xmm7, 0xf0(%rdi)
vpxor %xmm3, %xmm10, %xmm2
vpxor %xmm4, %xmm5, %xmm3
vpternlogq $0x6c, %xmm2, %xmm8, %xmm3
vmovdqa %xmm3, 0xc0(%rdi)
movslq %edx, %r14
shlq $0x4, %r14
leaq (%rsi,%r14), %r15
movl $0x10, %r12d
movl $0xf0, %r13d
vmovdqa (%rdi,%r13), %xmm2
vpxor -0x100(%r15,%r13), %xmm2, %xmm2
vmovdqa %xmm2, (%rdi,%r13)
decq %r12
addq $-0x10, %r13
cmpq $0x8, %r12
ja 0x2089
vmovdqa (%rdi), %xmm2
vmovdqa 0x10(%rdi), %xmm3
vmovdqa 0x20(%rdi), %xmm4
vmovdqa 0x30(%rdi), %xmm5
vpxor (%rbx,%r10), %xmm2, %xmm2
vmovdqa %xmm2, %xmm6
vpternlogq $0x78, %xmm3, %xmm4, %xmm6
vpxor %xmm3, %xmm5, %xmm7
vmovdqa %xmm4, %xmm8
vpternlogq $0x96, %xmm1, %xmm6, %xmm8
vpxor 0x50(%rdi), %xmm8, %xmm9
vpternlogq $0xa6, 0x60(%rdi), %xmm5, %xmm6
vpxor %xmm4, %xmm7, %xmm10
vpternlogq $0x6a, 0x70(%rdi), %xmm8, %xmm7
vpxor %xmm5, %xmm8, %xmm8
vpternlogq $0x6a, 0x40(%rdi), %xmm10, %xmm8
vmovdqa %xmm6, %xmm10
vpternlogq $0x78, %xmm9, %xmm8, %xmm10
vpxor %xmm2, %xmm10, %xmm2
vmovdqa %xmm2, (%rdi)
vmovdqa %xmm7, %xmm11
vpternlogq $0x1e, %xmm9, %xmm6, %xmm11
vpxor %xmm4, %xmm11, %xmm4
vmovdqa %xmm4, 0x20(%rdi)
vpand %xmm7, %xmm10, %xmm10
vpternlogq $0x96, %xmm3, %xmm8, %xmm10
vmovdqa %xmm10, 0x10(%rdi)
vpand %xmm11, %xmm8, %xmm3
vpternlogq $0x96, %xmm5, %xmm9, %xmm3
vmovdqa %xmm3, 0x30(%rdi)
vpternlogq $0x78, %xmm4, %xmm10, %xmm2
vpxor %xmm4, %xmm2, %xmm5
vpxor %xmm5, %xmm9, %xmm9
vmovdqa %xmm9, 0x50(%rdi)
vpternlogq $0x6c, %xmm3, %xmm6, %xmm2
vmovdqa %xmm2, 0x60(%rdi)
vpxor %xmm3, %xmm10, %xmm2
vpternlogq $0x78, %xmm2, %xmm5, %xmm7
vmovdqa %xmm7, 0x70(%rdi)
vpxor %xmm3, %xmm5, %xmm3
vpxor %xmm4, %xmm2, %xmm2
vpternlogq $0x6c, %xmm3, %xmm8, %xmm2
vmovdqa %xmm2, 0x40(%rdi)
addq %rcx, %r14
addl $-0x10, %edx
xorl %ebx, %ebx
vmovdqa 0x70(%rdi,%rbx), %xmm2
vpxor (%r14,%rbx), %xmm2, %xmm2
vmovdqa %xmm2, 0x70(%rdi,%rbx)
addq $-0x10, %rbx
cmpq $-0x80, %rbx
jne 0x2198
subq $0x1, %r8
jae 0x1a29
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq