// File: /workspace/github_c_makefile_star2_O0/mjosaarinen[P]brutus/crypto_aead/scream12v2/ref/scream_cipher.c
// Function: LS_decrypt
void LS_decrypt(const crypto_uint8 input[16], const crypto_uint8 key[16], const crypto_uint8 tweak[16],
		crypto_uint8 output[16]) {
  crypto_uint16 data[8];
  crypto_uint16 k[8];
  crypto_uint16 t[8];
  int i,j;

  for (i=0; i<8; i++) {
    data[i] = ((crypto_uint16)input[2*i+1]<<8) + input[2*i];
    k[i] = ((crypto_uint16)  key[2*i+1]<<8) +   key[2*i];
    t[i] = ((crypto_uint16)tweak[2*i+1]<<8) + tweak[2*i];
  }

  /* ---------------- Step Function ---------------- */
  for (i=nSteps-1; i>=0; i--) {
    /* ----------- Key + Tweak Addition ---------- */
    for (j=0; j<8; j++) data[j] ^= k[j];
    switch(i%3) {
    case     0:
      for (j=0; j<4; j++) data[j] ^= t[j] ^ t[j+4];
      for (j=4; j<8; j++) data[j] ^= t[j-4];
      break;
    case     1:
      for (j=0; j<4; j++) data[j] ^= t[j+4];
      for (j=4; j<8; j++) data[j] ^= t[j] ^ t[j-4];
      break;
    case     2:
      for (j=0; j<8; j++) data[j] ^= t[j] ;
      break;
    }

    /* ---------------- Second Round -------------- */
    /* LBox layer (tables) */
    for (j=0; j<8; j++)
      data[j] = LBoxInv2[data[j]>>8] ^ LBoxInv1[data[j]&0xff];
    /* Round constant */
    data[0] ^= ((27*(2*i+1)) % 256);
    /* SBox layer (bitsliced) */
    SBOX_Inv(data);
        
    /* ---------------- First Round ---------------- */
    /* LBox layer (tables) */
    for (j=0; j<8; j++)
      data[j] = LBoxInv2[data[j]>>8] ^ LBoxInv1[data[j]&0xff];
    /* First round constant */
    data[0] ^= ((27*(2*i)) % 256);
    /* SBox layer (bitsliced) */
    SBOX_Inv(data);
  }

  /* Final key + tweak addition */
  for (j=0; j<8; j++) data[j] ^= k[j] ^ t[j];
    
  for (i=0; i<8; i++) {
    output[2*i]   = data[i];
    output[2*i+1] = data[i]>>8;
  }
}

// Assembly:
movq %rdi, -0x8(%rsp)
movq %rsi, -0x10(%rsp)
movq %rdx, -0x18(%rsp)
movq %rcx, -0x20(%rsp)
movl $0x0, -0x5c(%rsp)
cmpl $0x8, -0x5c(%rsp)
jge 0x1aab
movq -0x8(%rsp), %rax
movl -0x5c(%rsp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movzbl (%rax,%rcx), %eax
movzwl %ax, %eax
shll $0x8, %eax
movq -0x8(%rsp), %rcx
movl -0x5c(%rsp), %edx
shll %edx
movslq %edx, %rdx
movzbl (%rcx,%rdx), %ecx
addl %ecx, %eax
movw %ax, %cx
movslq -0x5c(%rsp), %rax
movw %cx, -0x38(%rsp,%rax,2)
movq -0x10(%rsp), %rax
movl -0x5c(%rsp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movzbl (%rax,%rcx), %eax
movzwl %ax, %eax
shll $0x8, %eax
movq -0x10(%rsp), %rcx
movl -0x5c(%rsp), %edx
shll %edx
movslq %edx, %rdx
movzbl (%rcx,%rdx), %ecx
addl %ecx, %eax
movw %ax, %cx
movslq -0x5c(%rsp), %rax
movw %cx, -0x48(%rsp,%rax,2)
movq -0x18(%rsp), %rax
movl -0x5c(%rsp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movzbl (%rax,%rcx), %eax
movzwl %ax, %eax
shll $0x8, %eax
movq -0x18(%rsp), %rcx
movl -0x5c(%rsp), %edx
shll %edx
movslq %edx, %rdx
movzbl (%rcx,%rdx), %ecx
addl %ecx, %eax
movw %ax, %cx
movslq -0x5c(%rsp), %rax
movw %cx, -0x58(%rsp,%rax,2)
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x19dc
movl $0xb, -0x5c(%rsp)
cmpl $0x0, -0x5c(%rsp)
jl 0x2209
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1af5
movslq -0x60(%rsp), %rax
movzwl -0x48(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1ac6
movslq -0x5c(%rsp), %rcx
movl %ecx, %eax
imulq $0x55555556, %rcx, %rdx # imm = 0x55555556
movq %rdx, %rcx
shrq $0x3f, %rcx
shrq $0x20, %rdx
addl %ecx, %edx
movl %edx, %ecx
leal (%rcx,%rcx,2), %ecx
subl %ecx, %eax
movl %eax, -0x70(%rsp)
je 0x1b40
jmp 0x1b1f
movl -0x70(%rsp), %eax
subl $0x1, %eax
je 0x1bc7
jmp 0x1b2e
movl -0x70(%rsp), %eax
subl $0x2, %eax
je 0x1c4b
jmp 0x1c84
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x1b87
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %edx
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %eax
xorl %eax, %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1b48
movl $0x4, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1bc2
movl -0x60(%rsp), %eax
subl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1b8f
jmp 0x1c84
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x1c02
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1bcf
movl $0x4, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1c49
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %edx
movl -0x60(%rsp), %eax
subl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %eax
xorl %eax, %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1c0a
jmp 0x1c84
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1c82
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1c53
jmp 0x1c84
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1ce8
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x1756(%rip), %rax      # 0x3400
movzwl (%rax,%rcx,2), %eax
movslq -0x60(%rsp), %rcx
movzwl -0x38(%rsp,%rcx,2), %ecx
andl $0xff, %ecx
movslq %ecx, %rdx
leaq 0x1938(%rip), %rcx      # 0x3600
movzwl (%rcx,%rdx,2), %ecx
xorl %ecx, %eax
movw %ax, %cx
movslq -0x60(%rsp), %rax
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1c8c
movl -0x5c(%rsp), %eax
shll %eax
addl $0x1, %eax
imull $0x1b, %eax, %eax
movl $0x100, %ecx            # imm = 0x100
cltd
idivl %ecx
movzwl -0x38(%rsp), %eax
xorl %edx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movw -0x2e(%rsp), %ax
movw %ax, -0x62(%rsp)
movw -0x2c(%rsp), %ax
movw %ax, -0x64(%rsp)
movw -0x2a(%rsp), %ax
movw %ax, -0x66(%rsp)
movzwl -0x64(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x66(%rsp), %eax
andl %eax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movzwl -0x66(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x62(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movzwl -0x62(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x64(%rsp), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movzwl -0x32(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x32(%rsp)
movzwl -0x30(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x30(%rsp)
movzwl -0x2e(%rsp), %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x2c(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x2a(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1fa3
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x149b(%rip), %rax      # 0x3400
movzwl (%rax,%rcx,2), %eax
movslq -0x60(%rsp), %rcx
movzwl -0x38(%rsp,%rcx,2), %ecx
andl $0xff, %ecx
movslq %ecx, %rdx
leaq 0x167d(%rip), %rcx      # 0x3600
movzwl (%rcx,%rdx,2), %ecx
xorl %ecx, %eax
movw %ax, %cx
movslq -0x60(%rsp), %rax
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1f47
movl -0x5c(%rsp), %eax
shll %eax
imull $0x1b, %eax, %eax
movl $0x100, %ecx            # imm = 0x100
cltd
idivl %ecx
movzwl -0x38(%rsp), %eax
xorl %edx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movw -0x2e(%rsp), %ax
movw %ax, -0x68(%rsp)
movw -0x2c(%rsp), %ax
movw %ax, -0x6a(%rsp)
movw -0x2a(%rsp), %ax
movw %ax, -0x6c(%rsp)
movzwl -0x6a(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x6c(%rsp), %eax
andl %eax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movzwl -0x6c(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x68(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movzwl -0x68(%rsp), %ecx
xorl $-0x1, %ecx
movzwl -0x6a(%rsp), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movzwl -0x32(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x32(%rsp)
movzwl -0x30(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x30(%rsp)
movzwl -0x2e(%rsp), %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x2c(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x2a(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
jmp 0x21f9
movl -0x5c(%rsp), %eax
addl $-0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x1ab3
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x224c
movslq -0x60(%rsp), %rax
movzwl -0x48(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %eax
xorl %eax, %edx
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x38(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x2211
movl $0x0, -0x5c(%rsp)
cmpl $0x8, -0x5c(%rsp)
jge 0x22a8
movslq -0x5c(%rsp), %rax
movw -0x38(%rsp,%rax,2), %ax
movb %al, %dl
movq -0x20(%rsp), %rax
movl -0x5c(%rsp), %ecx
shll %ecx
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movslq -0x5c(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movb %al, %dl
movq -0x20(%rsp), %rax
movl -0x5c(%rsp), %ecx
shll %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x2254
retq
nopl (%rax)