// File: /workspace/github_c_makefile_star2_O2/mjosaarinen[P]brutus/crypto_aead/minalpherv11/avx2/MinalpherMode.cpp
// Function: minalpher_mode_decryption(unsigned char const*, unsigned char const*, unsigned char const*, unsigned long long, unsigned char*, unsigned long long*)
int minalpher_mode_decryption(
  const unsigned char     *_K,    /* I    Secret key                */
  const unsigned char     *_N,    /* I    Nonce                     */
  const unsigned char     *_C,    /* I    Ciphertext                */
  unsigned long long      _clen,  /* I    Length of Ciphertext      */
  unsigned char           *M_,    /* O    Message                   */
  unsigned long long      *mlen_  /* O    Length of Message         */
  ){
  /*==== Prepare ====*/
  __m256i ymmTagA[4];
  __m256i ymmTagB[4];
  for (int i = 0; i<4; i++){
    ymmTagA[i] = _mm256_setzero_si256();
    ymmTagB[i] = _mm256_setzero_si256();
  }
  __m256i DATA;
  __m256i DATA1, DATA2, DATA3, DATA4;

  /*==== Process Message ====*/
  int mblock = (int)((_clen) / 32);

  /*==== Create L ====*/
  int cnt = 0;
  __m256i ymmL, ymmL_H;
  create_l(ymmL, _K, _N);

  //Main loop
  int p = 0;
  for (p = 0; p < ((long long)(_clen)-128); p += 128)
  {
    //Encryption
    DATA1 = _mm256_load_si256((const __m256i*)(_C + p));
    DATA2 = _mm256_load_si256((const __m256i*)(_C + p + 32));
    DATA3 = _mm256_load_si256((const __m256i*)(_C + p + 64));
    DATA4 = _mm256_load_si256((const __m256i*)(_C + p + 96));

    __m256i tweak1, tweak2, tweak3, tweak4, tweak5, tweak6, tweak7, tweak8;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak1 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak5 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak2 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak6 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak3 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak7 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak4 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak8 = ymmL;

    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);
    DATA4 = _mm256_xor_si256(DATA4, tweak4);
    minalpher_core_quadruple_block_inverse(DATA1, DATA2, DATA3, DATA4);
    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);
    DATA4 = _mm256_xor_si256(DATA4, tweak4);
    _mm256_store_si256((__m256i *)(M_ + p), DATA1);
    _mm256_store_si256((__m256i *)(M_ + p + 32), DATA2);
    _mm256_store_si256((__m256i *)(M_ + p + 64), DATA3);
    _mm256_store_si256((__m256i *)(M_ + p + 96), DATA4);
  }

  //length update
  *mlen_ = p;

  if ((mblock % 4) == 0){
    //padding
    DATA1 = _mm256_load_si256((const __m256i*)(_C + p));
    DATA2 = _mm256_load_si256((const __m256i*)(_C + p + 32));
    DATA3 = _mm256_load_si256((const __m256i*)(_C + p + 64));
    DATA4 = _mm256_load_si256((const __m256i*)(_C + p + 96));

    //tweak update
    __m256i tweak1, tweak2, tweak3, tweak4, tweak5, tweak6, tweak7, tweak8;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak1 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak5 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak2 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak6 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak3 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak7 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak4 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak8 = ymmL;

    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);
    DATA4 = _mm256_xor_si256(DATA4, tweak4);
    minalpher_core_quadruple_block_inverse(DATA1, DATA2, DATA3, DATA4);
    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);
    DATA4 = _mm256_xor_si256(DATA4, tweak4);

    _mm256_store_si256((__m256i *)(M_ + p), DATA1);
    _mm256_store_si256((__m256i *)(M_ + p + 32), DATA2);
    _mm256_store_si256((__m256i *)(M_ + p + 64), DATA3);
    _mm256_store_si256((__m256i *)(M_ + p + 96), DATA4);

    //Format Verification
    for (int d = BLOCK_SIZE - 1; d >= 0; d--){
      if ( (M_ + p + 96)[d] == 0x80){
        *mlen_ += 96 + d;
        return 0;
      }
      if ((M_ + p + 96)[d] != 0x00){
        break;
      }
    }
  }
  else if ((mblock % 4) == 3){
    //padding
    DATA1 = _mm256_load_si256((const __m256i*)(_C + p));
    DATA2 = _mm256_load_si256((const __m256i*)(_C + p + 32));
    DATA3 = _mm256_load_si256((const __m256i*)(_C + p + 64));

    //tweak update
    __m256i tweak1, tweak2, tweak3, tweak4, tweak5, tweak6;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak1 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak4 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak2 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak5 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak3 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak6 = ymmL;

    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);
    minalpher_core_quadruple_block_inverse(DATA1, DATA2, DATA3);
    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    DATA3 = _mm256_xor_si256(DATA3, tweak3);

    _mm256_store_si256((__m256i *)(M_ + p), DATA1);
    _mm256_store_si256((__m256i *)(M_ + p + 32), DATA2);
    _mm256_store_si256((__m256i *)(M_ + p + 64), DATA3);

    //Format Verification
    for (int d = BLOCK_SIZE - 1; d >= 0; d--){
      if ((M_ + p + 64)[d] == 0x80){
        *mlen_ += 64 + d;
        return 0;
      }
      if ((M_ + p + 64)[d] != 0x00){
        break;
      }
    }
  }
  else if ((mblock % 4) == 2){
    //padding
    DATA1 = _mm256_load_si256((const __m256i*)(_C + p));
    DATA2 = _mm256_load_si256((const __m256i*)(_C + p + 32));

    //tweak update
    __m256i tweak1, tweak2, tweak3, tweak4;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak1 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak3 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak2 = ymmL;
    tweak_update(ymmL, ymmL_H, cnt);
    tweak4 = ymmL;

    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);
    minalpher_core_double_block_inverse(DATA1, DATA2);
    DATA1 = _mm256_xor_si256(DATA1, tweak1);
    DATA2 = _mm256_xor_si256(DATA2, tweak2);

    _mm256_store_si256((__m256i *)(M_ + p), DATA1);
    _mm256_store_si256((__m256i *)(M_ + p + 32), DATA2);

    //Format Verification
    for (int d = BLOCK_SIZE - 1; d >= 0; d--){
      if ((M_ + p + 32)[d] == 0x80){
        *mlen_ += 32 + d;
        return 0;
      }
      if ((M_ + p + 32)[d] != 0x00){
        break;
      }
    }
  }
  else{
    //padding
    DATA1 = _mm256_load_si256((const __m256i*)(_C + p));

    //Encryption
    tweak_update(ymmL, ymmL_H, cnt);
    DATA1 = _mm256_xor_si256(DATA1, ymmL);
    minalpher_core_single_block_inverse(DATA1);
    DATA = _mm256_xor_si256(DATA1, ymmL);
    _mm256_store_si256((__m256i *)(M_ + p), DATA);

    //Format Verification
    for (int d = BLOCK_SIZE - 1; d >= 0; d--){
      if ((M_ + p)[d] == 0x80){
        *mlen_ += d;
        return 0;
      }
      if ((M_ + p)[d] != 0x00){
        break;
      }
    }
  }

  return -1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
andq $-0x20, %rsp
subq $0x220, %rsp            # imm = 0x220
movq %r9, 0xf0(%rsp)
movq %r8, 0x18(%rsp)
movq %rcx, %r14
movq %rdx, %r15
movq %rsi, %rdx
movq %rdi, %rsi
movq %rcx, %rax
shrq $0x5, %rax
movq %rax, 0xe8(%rsp)
leaq 0x14(%rsp), %rbx
andl $0x0, (%rbx)
leaq 0x80(%rsp), %r12
movq %r12, %rdi
callq 0x8214
addq $-0x80, %r14
movq %r14, 0xf8(%rsp)
addq $0x60, %r15
xorl %r14d, %r14d
leaq 0x180(%rsp), %r13
cmpq %r14, 0xf8(%rsp)
jle 0x9711
vmovaps -0x60(%r15), %ymm0
vmovaps %ymm0, 0x1c0(%rsp)
vmovaps -0x40(%r15), %ymm0
vmovaps %ymm0, 0x1e0(%rsp)
vmovaps -0x20(%r15), %ymm0
vmovaps %ymm0, 0x140(%rsp)
vmovaps (%r15), %ymm0
vmovaps %ymm0, 0x100(%rsp)
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
vzeroupper
callq 0x81a1
vmovaps 0x80(%rsp), %ymm0
vmovaps %ymm0, 0xa0(%rsp)
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
vzeroupper
callq 0x81a1
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0x81a1
vmovaps 0x80(%rsp), %ymm0
vmovaps %ymm0, 0x40(%rsp)
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
vzeroupper
callq 0x81a1
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0x81a1
vmovaps 0x80(%rsp), %ymm0
vmovaps %ymm0, 0x20(%rsp)
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
vzeroupper
callq 0x81a1
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0x81a1
vmovaps 0x80(%rsp), %ymm0
vmovaps %ymm0, 0x60(%rsp)
movq %r12, %rdi
movq %r13, %rsi
movq %rbx, %rdx
vzeroupper
callq 0x81a1
vmovaps 0x1c0(%rsp), %ymm0
vxorps 0xa0(%rsp), %ymm0, %ymm0
vmovaps %ymm0, 0xc0(%rsp)
vmovaps 0x40(%rsp), %ymm0
vxorps 0x1e0(%rsp), %ymm0, %ymm0
vmovaps %ymm0, 0x120(%rsp)
vmovaps 0x20(%rsp), %ymm0
vxorps 0x140(%rsp), %ymm0, %ymm0
vmovaps %ymm0, 0x160(%rsp)
vmovaps 0x60(%rsp), %ymm0
vxorps 0x100(%rsp), %ymm0, %ymm0
vmovaps %ymm0, 0x1a0(%rsp)
leaq 0xc0(%rsp), %rdi
leaq 0x120(%rsp), %rsi
leaq 0x160(%rsp), %rdx
leaq 0x1a0(%rsp), %rcx
vzeroupper
callq 0x2080
vmovaps 0xa0(%rsp), %ymm0
vxorps 0xc0(%rsp), %ymm0, %ymm0
vmovaps %ymm0, 0xc0(%rsp)
vmovaps 0x40(%rsp), %ymm1
vxorps 0x120(%rsp), %ymm1, %ymm1
vmovaps %ymm1, 0x120(%rsp)
vmovaps 0x20(%rsp), %ymm2
vxorps 0x160(%rsp), %ymm2, %ymm2
vmovaps %ymm2, 0x160(%rsp)
vmovaps 0x60(%rsp), %ymm3
vxorps 0x1a0(%rsp), %ymm3, %ymm3
vmovaps %ymm3, 0x1a0(%rsp)
movq 0x18(%rsp), %rax
vmovaps %ymm0, (%rax)
vmovaps %ymm1, 0x20(%rax)
vmovaps %ymm2, 0x40(%rax)
vmovaps %ymm3, 0x60(%rax)
movl $0x80, %ecx
addq %rcx, %r14
addq %rcx, %rax
movq %rax, 0x18(%rsp)
addq %rcx, %r15
jmp 0x94ec
movq 0xf0(%rsp), %rax
movq %r14, (%rax)
movq %rax, %r14
pushq $0x4
popq %rcx
movq 0xe8(%rsp), %rax
cltd
idivl %ecx
vmovaps -0x60(%r15), %ymm0
vmovaps %ymm0, 0xa0(%rsp)
cmpl $0x3, %edx
je 0x9a40
cmpl $0x2, %edx
je 0x993b
testl %edx, %edx
jne 0x9bba
vmovaps -0x40(%r15), %ymm0
vmovaps %ymm0, 0x1c0(%rsp)
vmovaps -0x20(%r15), %ymm0
vmovaps %ymm0, 0x1e0(%rsp)
vmovaps (%r15), %ymm0
vmovaps %ymm0, 0x140(%rsp)
leaq 0x80(%rsp), %rbx
leaq 0x180(%rsp), %r15
leaq 0x14(%rsp), %r12
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x40(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x20(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x60(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x100(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps 0x40(%rsp), %ymm0
vxorps 0xa0(%rsp), %ymm0, %ymm0
leaq 0xc0(%rsp), %rbx
vmovaps %ymm0, (%rbx)
vmovaps 0x20(%rsp), %ymm0
vxorps 0x1c0(%rsp), %ymm0, %ymm0
leaq 0x120(%rsp), %r15
vmovaps %ymm0, (%r15)
vmovaps 0x60(%rsp), %ymm0
vxorps 0x1e0(%rsp), %ymm0, %ymm0
leaq 0x160(%rsp), %r12
vmovaps %ymm0, (%r12)
vmovaps 0x100(%rsp), %ymm0
vxorps 0x140(%rsp), %ymm0, %ymm0
leaq 0x1a0(%rsp), %r13
vmovaps %ymm0, (%r13)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
movq %r13, %rcx
vzeroupper
callq 0x2080
vmovaps 0x40(%rsp), %ymm0
vxorps (%rbx), %ymm0, %ymm0
vmovaps 0x20(%rsp), %ymm1
vxorps (%r15), %ymm1, %ymm1
vmovaps 0x60(%rsp), %ymm2
vxorps (%r12), %ymm2, %ymm2
vmovaps 0x100(%rsp), %ymm3
vxorps (%r13), %ymm3, %ymm3
movq 0x18(%rsp), %rdi
vmovaps %ymm0, (%rdi)
vmovaps %ymm1, 0x20(%rdi)
vmovaps %ymm2, 0x40(%rdi)
vmovaps %ymm3, 0x60(%rdi)
pushq $0x7f
popq %rcx
pushq $0x1f
popq %rdx
pushq $-0x1
popq %rax
movl %ecx, %esi
addl $-0x60, %esi
js 0x9c36
movl %edx, %edx
movzbl 0x60(%rdi,%rdx), %esi
testl %esi, %esi
jne 0x9bb0
decq %rcx
decl %edx
jmp 0x991a
vmovaps -0x40(%r15), %ymm0
vmovaps %ymm0, 0x60(%rsp)
leaq 0x80(%rsp), %rbx
leaq 0x180(%rsp), %r15
leaq 0x14(%rsp), %r12
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x40(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x20(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps 0x40(%rsp), %ymm0
vxorps 0xa0(%rsp), %ymm0, %ymm0
leaq 0xc0(%rsp), %rbx
vmovaps %ymm0, (%rbx)
vmovaps 0x20(%rsp), %ymm0
vxorps 0x60(%rsp), %ymm0, %ymm0
leaq 0x120(%rsp), %r15
vmovaps %ymm0, (%r15)
movq %rbx, %rdi
movq %r15, %rsi
vzeroupper
callq 0x2150
vmovaps 0x40(%rsp), %ymm0
vxorps (%rbx), %ymm0, %ymm0
vmovaps 0x20(%rsp), %ymm1
vxorps (%r15), %ymm1, %ymm1
movq 0x18(%rsp), %rdi
vmovaps %ymm0, (%rdi)
vmovaps %ymm1, 0x20(%rdi)
pushq $0x3f
popq %rcx
pushq $0x1f
popq %rdx
pushq $-0x1
popq %rax
movl %ecx, %esi
addl $-0x20, %esi
js 0x9c36
movl %edx, %edx
movzbl 0x20(%rdi,%rdx), %esi
testl %esi, %esi
jne 0x9bb0
decq %rcx
decl %edx
jmp 0x9a1f
vmovaps -0x40(%r15), %ymm0
vmovaps %ymm0, 0x140(%rsp)
vmovaps -0x20(%r15), %ymm0
vmovaps %ymm0, 0x100(%rsp)
leaq 0x80(%rsp), %rbx
leaq 0x180(%rsp), %r15
leaq 0x14(%rsp), %r12
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x40(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x20(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x81a1
vmovaps (%rbx), %ymm0
vmovaps %ymm0, 0x60(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x81a1
vmovaps 0x40(%rsp), %ymm0
vxorps 0xa0(%rsp), %ymm0, %ymm0
leaq 0xc0(%rsp), %rbx
vmovaps %ymm0, (%rbx)
vmovaps 0x20(%rsp), %ymm0
vxorps 0x140(%rsp), %ymm0, %ymm0
leaq 0x120(%rsp), %r15
vmovaps %ymm0, (%r15)
vmovaps 0x60(%rsp), %ymm0
vxorps 0x100(%rsp), %ymm0, %ymm0
leaq 0x160(%rsp), %r12
vmovaps %ymm0, (%r12)
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rdx
vzeroupper
callq 0x2190
vmovaps 0x40(%rsp), %ymm0
vxorps (%rbx), %ymm0, %ymm0
vmovaps 0x20(%rsp), %ymm1
vxorps (%r15), %ymm1, %ymm1
vmovaps 0x60(%rsp), %ymm2
vxorps (%r12), %ymm2, %ymm2
movq 0x18(%rsp), %rdi
vmovaps %ymm0, (%rdi)
vmovaps %ymm1, 0x20(%rdi)
vmovaps %ymm2, 0x40(%rdi)
pushq $0x5f
popq %rcx
pushq $0x1f
popq %rdx
pushq $-0x1
popq %rax
movl %ecx, %esi
addl $-0x40, %esi
js 0x9c36
movl %edx, %edx
movzbl 0x40(%rdi,%rdx), %esi
testl %esi, %esi
jne 0x9bb0
decq %rcx
decl %edx
jmp 0x9b93
cmpl $0x80, %esi
je 0x9c31
jmp 0x9c36
leaq 0x80(%rsp), %rbx
leaq 0x180(%rsp), %rsi
leaq 0x14(%rsp), %rdx
movq %rbx, %rdi
vzeroupper
callq 0x81a1
vmovaps 0xa0(%rsp), %ymm0
vxorps (%rbx), %ymm0, %ymm0
leaq 0xc0(%rsp), %r15
vmovaps %ymm0, (%r15)
movq %r15, %rdi
vzeroupper
callq 0x21a0
vmovaps (%rbx), %ymm0
vxorps (%r15), %ymm0, %ymm0
movq 0x18(%rsp), %rsi
vmovaps %ymm0, (%rsi)
pushq $0x1f
popq %rcx
pushq $-0x1
popq %rax
testl %ecx, %ecx
js 0x9c36
movl %ecx, %ecx
movzbl (%rsi,%rcx), %edx
testl %edx, %edx
jne 0x9c29
decl %ecx
jmp 0x9c17
cmpl $0x80, %edx
jne 0x9c36
addq %rcx, (%r14)
xorl %eax, %eax
leaq -0x28(%rbp), %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
vzeroupper
retq