// File: /workspace/github_c_makefile_star2_O2/mjosaarinen[P]brutus/crypto_aead/scream10v2/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
  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=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);

    SBOX_Inv((X+8));
    X[0] ^= RC[2*i+1];
    SBOX_Inv(X);

    LBoxInv16P(X);

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

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
leaq 0x1f0(%rsi), %rax
movl $0xf, %ecx
testl %ecx, %ecx
js 0x1a15
movl %ecx, %edx
shlq $0x4, %rdx
vmovdqa (%rdi,%rdx), %xmm0
vpxor (%rax), %xmm0, %xmm0
vmovdqa %xmm0, (%rdi,%rdx)
decl %ecx
addq $-0x10, %rax
jmp 0x19f5
leaq 0x90(%rdi), %rax
leaq -0x90(%rsi), %rcx
movl $0x10, %edx
vpbroadcastb 0x25d0(%rip), %xmm0 # 0x4001
movl $0x9, %r8d
vpcmpeqd %xmm1, %xmm1, %xmm1
leaq 0x25ce(%rip), %r9       # 0x4010
movl $0x30, %r10d
movabsq $0xf, %r11
movl $0x7, %ebx
testl %r8d, %r8d
js 0x21f8
movq %rax, %r14
xorl %r15d, %r15d
cmpq $0x7, %r15
ja 0x1bf9
vmovdqa -0x90(%r14), %xmm2
vmovdqa -0x80(%r14), %xmm3
vmovdqa -0x10(%r14), %xmm4
vmovdqa (%r14), %xmm5
movdqa 0x29fe(%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 0x29da(%rip), %xmm10    # 0x44a0
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%r14)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%r14)
movdqa 0x29cc(%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 0x29a9(%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 0x2994(%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 0x2968(%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 0x2953(%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 0x2931(%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, %r15
addq $0x20, %r14
jmp 0x1a66
vmovdqa 0x80(%rdi), %xmm2
vmovdqa 0xa0(%rdi), %xmm3
vmovdqa 0xc0(%rdi), %xmm4
vpand %xmm3, %xmm4, %xmm5
vpternlogq $0x96, 0x90(%rdi), %xmm2, %xmm5
vmovdqa 0xb0(%rdi), %xmm6
vpxor %xmm4, %xmm5, %xmm4
vpternlogq $0x78, %xmm5, %xmm6, %xmm2
vpxor %xmm3, %xmm6, %xmm3
vpxor %xmm5, %xmm3, %xmm5
vmovdqa 0xd0(%rdi), %xmm7
vpand %xmm5, %xmm2, %xmm8
vpxor %xmm2, %xmm7, %xmm9
vmovdqa 0xe0(%rdi), %xmm10
vmovdqa 0xf0(%rdi), %xmm11
vpxor %xmm5, %xmm10, %xmm5
vpternlogq $0x96, %xmm3, %xmm11, %xmm8
vpandn %xmm8, %xmm5, %xmm3
vpxor %xmm3, %xmm9, %xmm12
vmovdqa %xmm12, 0xd0(%rdi)
vpternlogq $0x78, %xmm4, %xmm2, %xmm6
vpandn %xmm9, %xmm8, %xmm2
vpxor %xmm5, %xmm2, %xmm12
vmovdqa %xmm12, 0xe0(%rdi)
vpandn %xmm5, %xmm9, %xmm5
vpxor %xmm5, %xmm8, %xmm8
vmovdqa %xmm8, 0xf0(%rdi)
vpxor %xmm5, %xmm11, %xmm5
vpandn %xmm5, %xmm4, %xmm8
vpternlogq $0x96, %xmm2, %xmm10, %xmm8
vpternlogq $0x96, %xmm7, %xmm8, %xmm3
vpternlogq $0x96, %xmm1, %xmm3, %xmm4
vmovdqa %xmm4, 0xc0(%rdi)
vpternlogq $0x78, %xmm6, %xmm3, %xmm8
vpternlogq $0xf, %xmm6, %xmm6, %xmm6
vmovdqa %xmm8, 0x80(%rdi)
vpxor %xmm6, %xmm5, %xmm2
vpternlogq $0x78, %xmm4, %xmm8, %xmm6
vmovdqa %xmm6, 0xb0(%rdi)
vpxor %xmm2, %xmm3, %xmm3
vmovdqa %xmm3, 0x90(%rdi)
vpternlogq $0x6c, %xmm3, %xmm2, %xmm8
vmovdqa %xmm8, 0xa0(%rdi)
leal (%r8,%r8), %ebp
leal 0x1(,%r8,2), %r14d
shlq $0x4, %r14
vmovdqa (%rdi), %xmm2
vmovdqa 0x20(%rdi), %xmm3
vmovdqa 0x30(%rdi), %xmm4
vmovdqa 0x40(%rdi), %xmm5
vpxor (%r14,%r9), %xmm2, %xmm2
vpand %xmm3, %xmm5, %xmm6
vpternlogq $0x96, 0x10(%rdi), %xmm2, %xmm6
vpxor %xmm5, %xmm6, %xmm5
vpternlogq $0x78, %xmm6, %xmm4, %xmm2
vpxor %xmm3, %xmm4, %xmm3
vpternlogq $0x78, %xmm5, %xmm2, %xmm4
vpxor %xmm6, %xmm3, %xmm6
vmovdqa 0x50(%rdi), %xmm7
vpand %xmm6, %xmm2, %xmm8
vpxor %xmm2, %xmm7, %xmm2
vmovdqa 0x60(%rdi), %xmm9
vmovdqa 0x70(%rdi), %xmm10
vpxor %xmm6, %xmm9, %xmm6
vpternlogq $0x96, %xmm3, %xmm10, %xmm8
vpandn %xmm8, %xmm6, %xmm3
vpxor %xmm2, %xmm3, %xmm11
vmovdqa %xmm11, 0x50(%rdi)
vpandn %xmm2, %xmm8, %xmm11
vpxor %xmm6, %xmm11, %xmm12
vmovdqa %xmm12, 0x60(%rdi)
vpandn %xmm6, %xmm2, %xmm2
vpxor %xmm2, %xmm8, %xmm6
vmovdqa %xmm6, 0x70(%rdi)
vpxor %xmm2, %xmm10, %xmm2
vpandn %xmm2, %xmm5, %xmm6
vpternlogq $0x96, %xmm11, %xmm9, %xmm6
vpternlogq $0x96, %xmm7, %xmm6, %xmm3
vpternlogq $0x96, %xmm1, %xmm3, %xmm5
vmovdqa %xmm5, 0x40(%rdi)
vpternlogq $0x78, %xmm4, %xmm3, %xmm6
vmovdqa %xmm6, (%rdi)
vpternlogq $0xf, %xmm4, %xmm4, %xmm4
vpxor %xmm4, %xmm2, %xmm2
vpternlogq $0x78, %xmm5, %xmm6, %xmm4
vmovdqa %xmm4, 0x30(%rdi)
vpxor %xmm2, %xmm3, %xmm3
vmovdqa %xmm3, 0x10(%rdi)
vpternlogq $0x6c, %xmm3, %xmm2, %xmm6
vmovdqa %xmm6, 0x20(%rdi)
movq %rax, %r14
xorl %r15d, %r15d
cmpq $0x7, %r15
ja 0x1f90
vmovdqa -0x90(%r14), %xmm2
vmovdqa -0x80(%r14), %xmm3
vmovdqa -0x10(%r14), %xmm4
vmovdqa (%r14), %xmm5
movdqa 0x2667(%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 0x2643(%rip), %xmm10    # 0x44a0
vpshufb %xmm7, %xmm10, %xmm7
vmovdqa %xmm7, -0x10(%r14)
vpshufb %xmm8, %xmm10, %xmm8
vmovdqa %xmm8, (%r14)
movdqa 0x2635(%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 0x2612(%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 0x25fd(%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 0x25d1(%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 0x25bc(%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 0x259a(%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, %r15
addq $0x20, %r14
jmp 0x1dfd
vmovdqa 0x80(%rdi), %xmm2
vmovdqa 0xa0(%rdi), %xmm3
vmovdqa 0xb0(%rdi), %xmm4
vmovdqa 0xc0(%rdi), %xmm5
vpand %xmm3, %xmm5, %xmm6
vpternlogq $0x96, 0x90(%rdi), %xmm2, %xmm6
vpxor %xmm5, %xmm6, %xmm5
vpternlogq $0x78, %xmm6, %xmm4, %xmm2
vpxor %xmm3, %xmm4, %xmm3
vpxor %xmm6, %xmm3, %xmm6
vmovdqa 0xd0(%rdi), %xmm7
vpand %xmm6, %xmm2, %xmm8
vpxor %xmm2, %xmm7, %xmm9
vmovdqa 0xe0(%rdi), %xmm10
vmovdqa 0xf0(%rdi), %xmm11
vpxor %xmm6, %xmm10, %xmm6
vpternlogq $0x96, %xmm3, %xmm11, %xmm8
vpandn %xmm8, %xmm6, %xmm3
vpxor %xmm3, %xmm9, %xmm12
vmovdqa %xmm12, 0xd0(%rdi)
vpandn %xmm9, %xmm8, %xmm12
vpxor %xmm6, %xmm12, %xmm13
vmovdqa %xmm13, 0xe0(%rdi)
testl %edx, %edx
cmovel %r10d, %edx
vpternlogq $0x78, %xmm5, %xmm2, %xmm4
vpandn %xmm6, %xmm9, %xmm2
vpxor %xmm2, %xmm8, %xmm6
vmovdqa %xmm6, 0xf0(%rdi)
vpxor %xmm2, %xmm11, %xmm2
vpandn %xmm2, %xmm5, %xmm6
vpternlogq $0x96, %xmm12, %xmm10, %xmm6
vpternlogq $0x96, %xmm7, %xmm6, %xmm3
vpternlogq $0x96, %xmm1, %xmm3, %xmm5
vmovdqa %xmm5, 0xc0(%rdi)
vpternlogq $0x78, %xmm4, %xmm3, %xmm6
vpternlogq $0xf, %xmm4, %xmm4, %xmm4
vmovdqa %xmm6, 0x80(%rdi)
vpxor %xmm4, %xmm2, %xmm2
vpternlogq $0x78, %xmm5, %xmm6, %xmm4
vmovdqa %xmm4, 0xb0(%rdi)
vpxor %xmm2, %xmm3, %xmm3
vmovdqa %xmm3, 0x90(%rdi)
vpternlogq $0x6c, %xmm3, %xmm2, %xmm6
vmovdqa %xmm6, 0xa0(%rdi)
movslq %edx, %r14
shlq $0x4, %r14
leaq (%rsi,%r14), %r15
movl $0xf0, %r12d
movq %r11, %r13
cmpq $0x8, %r13
jb 0x20db
vmovdqa (%rdi,%r12), %xmm2
vpxor -0x100(%r15,%r12), %xmm2, %xmm2
vmovdqa %xmm2, (%rdi,%r12)
decq %r13
addq $-0x10, %r12
jmp 0x20b6
movl %ebp, %r15d
vmovdqa (%rdi), %xmm2
vmovdqa 0x20(%rdi), %xmm3
vmovdqa 0x30(%rdi), %xmm4
shlq $0x4, %r15
vmovdqa 0x40(%rdi), %xmm5
vpxor (%r15,%r9), %xmm2, %xmm2
vpand %xmm3, %xmm5, %xmm6
vpternlogq $0x96, 0x10(%rdi), %xmm2, %xmm6
vpxor %xmm5, %xmm6, %xmm5
vpternlogq $0x78, %xmm6, %xmm4, %xmm2
vpxor %xmm3, %xmm4, %xmm3
vpxor %xmm6, %xmm3, %xmm6
vpand %xmm6, %xmm2, %xmm7
vmovdqa 0x50(%rdi), %xmm8
vpxor %xmm2, %xmm8, %xmm9
vmovdqa 0x60(%rdi), %xmm10
vpxor %xmm6, %xmm10, %xmm6
vmovdqa 0x70(%rdi), %xmm11
vpternlogq $0x96, %xmm3, %xmm11, %xmm7
vpandn %xmm7, %xmm6, %xmm3
vpxor %xmm3, %xmm9, %xmm12
vmovdqa %xmm12, 0x50(%rdi)
vpandn %xmm9, %xmm7, %xmm12
vpxor %xmm6, %xmm12, %xmm13
vmovdqa %xmm13, 0x60(%rdi)
vpternlogq $0x78, %xmm5, %xmm2, %xmm4
vpandn %xmm6, %xmm9, %xmm2
vpxor %xmm2, %xmm7, %xmm6
vmovdqa %xmm6, 0x70(%rdi)
vpxor %xmm2, %xmm11, %xmm2
vpandn %xmm2, %xmm5, %xmm6
vpternlogq $0x96, %xmm12, %xmm10, %xmm6
vpternlogq $0x96, %xmm8, %xmm6, %xmm3
vpternlogq $0x96, %xmm1, %xmm3, %xmm5
vmovdqa %xmm5, 0x40(%rdi)
vpternlogq $0x78, %xmm4, %xmm3, %xmm6
vpternlogq $0xf, %xmm4, %xmm4, %xmm4
vmovdqa %xmm6, (%rdi)
vpxor %xmm4, %xmm2, %xmm2
vpternlogq $0x78, %xmm5, %xmm6, %xmm4
vmovdqa %xmm4, 0x30(%rdi)
vpxor %xmm2, %xmm3, %xmm3
vmovdqa %xmm3, 0x10(%rdi)
vpternlogq $0x6c, %xmm3, %xmm2, %xmm6
vmovdqa %xmm6, 0x20(%rdi)
addq %rcx, %r14
addl $-0x10, %edx
movl %ebx, %ebp
testl %ebp, %ebp
js 0x21f0
movl %ebp, %r15d
shlq $0x4, %r15
vmovdqa (%rdi,%r15), %xmm2
vpxor (%r14), %xmm2, %xmm2
vmovdqa %xmm2, (%rdi,%r15)
decl %ebp
addq $-0x10, %r14
jmp 0x21cc
decl %r8d
jmp 0x1a57
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq