// File: /workspace/github_c_makefile_star2_O0/mjosaarinen[P]brutus/crypto_aead/scream12v2/ref/scream_cipher.c
// Function: LS_encrypt
void LS_encrypt(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];
  }
    
  /* Initial key + tweak addition */
  for (j=0; j<8; j++) data[j] ^= k[j] ^ t[j];
    
  /* ---------------- Step Function ---------------- */
  for (i=0; i<nSteps; i++) {
        
    /* ---------------- First Round ---------------- */
    /* SBox layer (bitsliced) */
    SBOX(data);
    /* First round constant */
    data[0] ^= ((27*(2*i)) % 256);
    /* LBox layer (tables) */
    for (j=0; j<8; j++)
      data[j] = LBox2[data[j]>>8] ^ LBox1[data[j]&0xff];
        
    /* ---------------- Second Round -------------- */
    /* SBox layer (bitsliced) */
    SBOX(data);
    /* Round constant */
    data[0] ^= ((27*(2*i+1)) % 256);
    /* LBox layer (tables) */
    for (j=0; j<8; j++)
      data[j] = LBox2[data[j]>>8] ^ LBox1[data[j]&0xff];
        
    /* Tweak schedule */
    for (j=0; j<4; j++) {
      t[j]   ^= t[j+4];
      t[j+4] ^= t[j];
    }
    /* ----------- Key + Tweak Addition ---------- */
    for (j=0; j<8; j++) data[j] ^= k[j] ^ t[j];
  }

  /* ----------- Restore initial tweak --------- */
  for (i=nSteps%3; i<3; i++) {
    for (j=0; j<4; j++) {
      t[j]   ^= t[j+4];
      t[j+4] ^= 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 0x126b
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 0x119c
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x12ae
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 0x1273
movl $0x0, -0x5c(%rsp)
cmpl $0xc, -0x5c(%rsp)
jge 0x18e7
jmp 0x12c3
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%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 -0x32(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x32(%rsp)
movzwl -0x30(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x30(%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 -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)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
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)
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x157b
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x1ac3(%rip), %rax      # 0x3000
movzwl (%rax,%rcx,2), %eax
movslq -0x60(%rsp), %rcx
movzwl -0x38(%rsp,%rcx,2), %ecx
andl $0xff, %ecx
movslq %ecx, %rdx
leaq 0x1ca5(%rip), %rcx      # 0x3200
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 0x151f
jmp 0x157d
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%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 -0x32(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x32(%rsp)
movzwl -0x30(%rsp), %eax
xorl $-0x1, %eax
movw %ax, -0x30(%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 -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)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
andl %eax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x32(%rsp), %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x36(%rsp), %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x34(%rsp), %ecx
movzwl -0x30(%rsp), %eax
andl %eax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movzwl -0x38(%rsp), %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
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)
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1838
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x1806(%rip), %rax      # 0x3000
movzwl (%rax,%rcx,2), %eax
movslq -0x60(%rsp), %rcx
movzwl -0x38(%rsp,%rcx,2), %ecx
andl $0xff, %ecx
movslq %ecx, %rdx
leaq 0x19e8(%rip), %rcx      # 0x3200
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 0x17dc
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x1892
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x58(%rsp,%rax,2)
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %edx
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x58(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x1840
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x18d5
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 0x189a
jmp 0x18d7
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x12b6
movl $0x0, -0x5c(%rsp)
cmpl $0x3, -0x5c(%rsp)
jge 0x195f
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x1950
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %edx
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x58(%rsp,%rax,2)
movslq -0x60(%rsp), %rax
movzwl -0x58(%rsp,%rax,2), %edx
movl -0x60(%rsp), %eax
addl $0x4, %eax
cltq
movzwl -0x58(%rsp,%rax,2), %ecx
xorl %edx, %ecx
movw %cx, -0x58(%rsp,%rax,2)
movl -0x60(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rsp)
jmp 0x18fe
jmp 0x1952
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x18ef
movl $0x0, -0x5c(%rsp)
cmpl $0x8, -0x5c(%rsp)
jge 0x19bb
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 0x1967
retq
nopl (%rax)