// File: /workspace/github_c_makefile_star2_O0/mjosaarinen[P]brutus/crypto_aead/scream12v3/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] ^= ((2199*(2*i)) % 65536);
    /* 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] ^= ((2199*(2*i+1)) % 65536);
    /* 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 0x1941
jmp 0x12c3
movzwl -0x36(%rsp), %eax
movzwl -0x34(%rsp), %ecx
andl %ecx, %eax
movzwl -0x38(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3d10(%rip), %rax      # 0x4ff0
movw %cx, (%rax)
movzwl -0x36(%rsp), %eax
movzwl -0x32(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3ce7(%rip), %rax      # 0x4fe0
movw %cx, (%rax)
movq 0x3ced(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %ecx
xorl %ecx, %eax
movq 0x3cac(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movq 0x3cc3(%rip), %rax      # 0x4ff0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movq 0x3c76(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movq 0x3c8c(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movq 0x3c54(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
xorl %eax, %ecx
movq 0x3c63(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %edx
xorl %edx, %eax
andl %eax, %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x30(%rsp), %eax
movzwl -0x2e(%rsp), %ecx
andl %ecx, %eax
movzwl -0x2c(%rsp), %ecx
xorl %ecx, %eax
movq 0x3c41(%rip), %rcx      # 0x4ff0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x2e(%rsp), %eax
movzwl -0x2c(%rsp), %ecx
orl %ecx, %eax
movzwl -0x2a(%rsp), %ecx
xorl %ecx, %eax
movq 0x3be5(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movq 0x3bfc(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x2a(%rsp), %ecx
andl %ecx, %eax
movzwl -0x30(%rsp), %ecx
xorl %ecx, %eax
movq 0x3bec(%rip), %rcx      # 0x4ff8
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movq 0x3b9b(%rip), %rax      # 0x4fc0
movzwl (%rax), %eax
movzwl -0x30(%rsp), %ecx
andl %ecx, %eax
movzwl -0x2e(%rsp), %ecx
xorl %ecx, %eax
movq 0x3ba3(%rip), %rcx      # 0x4fe0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x36(%rsp), %eax
movzwl -0x34(%rsp), %ecx
andl %ecx, %eax
xorl $-0x1, %eax
movzwl -0x38(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3b81(%rip), %rax      # 0x4ff0
movw %cx, (%rax)
movzwl -0x36(%rsp), %eax
movzwl -0x32(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3b58(%rip), %rax      # 0x4fe0
movw %cx, (%rax)
movq 0x3b5e(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %ecx
xorl %ecx, %eax
movq 0x3b1d(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movq 0x3b34(%rip), %rax      # 0x4ff0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movq 0x3ae7(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movq 0x3afd(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movq 0x3ac5(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
xorl %eax, %ecx
movq 0x3ad4(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %edx
xorl %edx, %eax
andl %eax, %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movl -0x5c(%rsp), %eax
shll %eax
imull $0x897, %eax, %eax      # imm = 0x897
movl $0x10000, %ecx          # imm = 0x10000
cltd
idivl %ecx
movzwl -0x38(%rsp), %eax
xorl %edx, %eax
movw %ax, -0x38(%rsp)
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x15a8
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x1a96(%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 0x1c78(%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 0x154c
jmp 0x15aa
movzwl -0x36(%rsp), %eax
movzwl -0x34(%rsp), %ecx
andl %ecx, %eax
movzwl -0x38(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3a29(%rip), %rax      # 0x4ff0
movw %cx, (%rax)
movzwl -0x36(%rsp), %eax
movzwl -0x32(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3a00(%rip), %rax      # 0x4fe0
movw %cx, (%rax)
movq 0x3a06(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %ecx
xorl %ecx, %eax
movq 0x39c5(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movq 0x39dc(%rip), %rax      # 0x4ff0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movq 0x398f(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movq 0x39a5(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movq 0x396d(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
xorl %eax, %ecx
movq 0x397c(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %edx
xorl %edx, %eax
andl %eax, %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movzwl -0x30(%rsp), %eax
movzwl -0x2e(%rsp), %ecx
andl %ecx, %eax
movzwl -0x2c(%rsp), %ecx
xorl %ecx, %eax
movq 0x395a(%rip), %rcx      # 0x4ff0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x38(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x38(%rsp)
movzwl -0x2e(%rsp), %eax
movzwl -0x2c(%rsp), %ecx
orl %ecx, %eax
movzwl -0x2a(%rsp), %ecx
xorl %ecx, %eax
movq 0x38fe(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x34(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x34(%rsp)
movq 0x3915(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x2a(%rsp), %ecx
andl %ecx, %eax
movzwl -0x30(%rsp), %ecx
xorl %ecx, %eax
movq 0x3905(%rip), %rcx      # 0x4ff8
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x36(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x36(%rsp)
movq 0x38b4(%rip), %rax      # 0x4fc0
movzwl (%rax), %eax
movzwl -0x30(%rsp), %ecx
andl %ecx, %eax
movzwl -0x2e(%rsp), %ecx
xorl %ecx, %eax
movq 0x38bc(%rip), %rcx      # 0x4fe0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x32(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x32(%rsp)
movzwl -0x36(%rsp), %eax
movzwl -0x34(%rsp), %ecx
andl %ecx, %eax
xorl $-0x1, %eax
movzwl -0x38(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x389a(%rip), %rax      # 0x4ff0
movw %cx, (%rax)
movzwl -0x36(%rsp), %eax
movzwl -0x32(%rsp), %ecx
xorl %ecx, %eax
movw %ax, %cx
movq 0x3871(%rip), %rax      # 0x4fe0
movw %cx, (%rax)
movq 0x3877(%rip), %rax      # 0x4ff0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %ecx
xorl %ecx, %eax
movq 0x3836(%rip), %rcx      # 0x4fc0
movw %ax, (%rcx)
movzwl %ax, %ecx
movzwl -0x2e(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2e(%rsp)
movq 0x384d(%rip), %rax      # 0x4ff0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
andl %eax, %ecx
movzwl -0x2c(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2c(%rsp)
movq 0x3800(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movq 0x3816(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
andl %eax, %ecx
movzwl -0x2a(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x2a(%rsp)
movq 0x37de(%rip), %rax      # 0x4fc0
movzwl (%rax), %ecx
movzwl -0x32(%rsp), %eax
xorl %eax, %ecx
movq 0x37ed(%rip), %rax      # 0x4fe0
movzwl (%rax), %eax
movzwl -0x34(%rsp), %edx
xorl %edx, %eax
andl %eax, %ecx
movzwl -0x30(%rsp), %eax
xorl %ecx, %eax
movw %ax, -0x30(%rsp)
movl -0x5c(%rsp), %eax
shll %eax
addl $0x1, %eax
imull $0x897, %eax, %eax      # imm = 0x897
movl $0x10000, %ecx          # imm = 0x10000
cltd
idivl %ecx
movzwl -0x38(%rsp), %eax
xorl %edx, %eax
movw %ax, -0x38(%rsp)
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x1892
movslq -0x60(%rsp), %rax
movzwl -0x38(%rsp,%rax,2), %eax
sarl $0x8, %eax
movslq %eax, %rcx
leaq 0x17ac(%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 0x198e(%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 0x1836
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x18ec
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 0x189a
movl $0x0, -0x60(%rsp)
cmpl $0x8, -0x60(%rsp)
jge 0x192f
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 0x18f4
jmp 0x1931
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x12b6
movl $0x0, -0x5c(%rsp)
cmpl $0x3, -0x5c(%rsp)
jge 0x19b9
movl $0x0, -0x60(%rsp)
cmpl $0x4, -0x60(%rsp)
jge 0x19aa
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 0x1958
jmp 0x19ac
movl -0x5c(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rsp)
jmp 0x1949
movl $0x0, -0x5c(%rsp)
cmpl $0x8, -0x5c(%rsp)
jge 0x1a15
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 0x19c1
retq
nopw %cs:(%rax,%rax)