#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int /*<<< orphan*/ BIGNUM;

/* Variables and functions */
int /*<<< orphan*/ ASN1_F_A2D_ASN1_OBJECT;
int /*<<< orphan*/ ASN1_R_BUFFER_TOO_SMALL;
int /*<<< orphan*/ ASN1_R_FIRST_NUM_TOO_LARGE;
int /*<<< orphan*/ ASN1_R_INVALID_DIGIT;
int /*<<< orphan*/ ASN1_R_INVALID_SEPARATOR;
int /*<<< orphan*/ ASN1_R_MISSING_SECOND_NUMBER;
int /*<<< orphan*/ ASN1_R_SECOND_NUMBER_TOO_LARGE;
int /*<<< orphan*/ ASN1err(int /*<<< orphan*/, int /*<<< orphan*/);
int /*<<< orphan*/ BN_add_word(int /*<<< orphan*/ *, int);
scalar_t__ BN_div_word(int /*<<< orphan*/ *, int);
int /*<<< orphan*/ BN_free(int /*<<< orphan*/ *);
int /*<<< orphan*/ BN_mul_word(int /*<<< orphan*/ *, long);
int /*<<< orphan*/ *BN_new();
int BN_num_bits(int /*<<< orphan*/ *);
int /*<<< orphan*/ BN_set_word(int /*<<< orphan*/ *, unsigned long);
int /*<<< orphan*/ OPENSSL_free(char *);
char *OPENSSL_malloc(int);
int ULONG_MAX;
int strlen(char const *);
int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num) {
  int i, first, len = 0, c, use_bn;
  char ftmp[24], *tmp = ftmp;
  int tmpsize = sizeof ftmp;
  const char *p;
  unsigned long l;
  BIGNUM *bl = NULL;
  if (num == 0)
    return (0);
  else if (num == -1)
    num = strlen(buf);
  p = buf;
  c = *(p++);
  num--;
  if ((c >= '0') && (c <= '2')) {
    first = c - '0';
  } else {
    ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_FIRST_NUM_TOO_LARGE);
    goto err;
  }
  if (num <= 0) {
    ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_MISSING_SECOND_NUMBER);
    goto err;
  }
  c = *(p++);
  num--;
  for (;;) {
    if (num <= 0)
      break;
    if ((c != '.') && (c != ' ')) {
      ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_INVALID_SEPARATOR);
      goto err;
    }
    l = 0;
    use_bn = 0;
    for (;;) {
      if (num <= 0)
        break;
      num--;
      c = *(p++);
      if ((c == ' ') || (c == '.'))
        break;
      if ((c < '0') || (c > '9')) {
        ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_INVALID_DIGIT);
        goto err;
      }
      if (!use_bn && l >= ((ULONG_MAX - 80) / 10L)) {
        use_bn = 1;
        if (!bl)
          bl = BN_new();
        if (!bl || !BN_set_word(bl, l))
          goto err;
      }
      if (use_bn) {
        if (!BN_mul_word(bl, 10L) || !BN_add_word(bl, c - '0'))
          goto err;
      } else
        l = l * 10L + (long)(c - '0');
    }
    if (len == 0) {
      if ((first < 2) && (l >= 40)) {
        ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_SECOND_NUMBER_TOO_LARGE);
        goto err;
      }
      if (use_bn) {
        if (!BN_add_word(bl, first * 40))
          goto err;
      } else
        l += (long)first * 40;
    }
    i = 0;
    if (use_bn) {
      int blsize;
      blsize = BN_num_bits(bl);
      blsize = (blsize + 6) / 7;
      if (blsize > tmpsize) {
        if (tmp != ftmp)
          OPENSSL_free(tmp);
        tmpsize = blsize + 32;
        tmp = OPENSSL_malloc(tmpsize);
        if (!tmp)
          goto err;
      }
      while (blsize--)
        tmp[i++] = (unsigned char)BN_div_word(bl, 0x80L);
    } else {
      for (;;) {
        tmp[i++] = (unsigned char)l & 0x7f;
        l >>= 7L;
        if (l == 0L)
          break;
      }
    }
    if (out != NULL) {
      if (len + i > olen) {
        ASN1err(ASN1_F_A2D_ASN1_OBJECT, ASN1_R_BUFFER_TOO_SMALL);
        goto err;
      }
      while (--i > 0)
        out[len++] = tmp[i] | 0x80;
      out[len++] = tmp[0];
    } else
      len += i;
  }
  if (tmp != ftmp)
    OPENSSL_free(tmp);
  if (bl)
    BN_free(bl);
  return (len);
err:
  if (tmp != ftmp)
    OPENSSL_free(tmp);
  if (bl)
    BN_free(bl);
  return (0);
}


x86 assembly (clang, -O0):
<a2d_ASN1_OBJECT>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movl   $0x0,-0x30(%rbp)
lea    -0x50(%rbp),%rax
mov    %rax,-0x58(%rbp)
movl   $0x18,-0x5c(%rbp)
movq   $0x0,-0x78(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    11fd <a2d_ASN1_OBJECT+0x4d>
movl   $0x0,-0x4(%rbp)
jmp    170b <a2d_ASN1_OBJECT+0x55b>
cmpl   $0xffffffff,-0x24(%rbp)
jne    1213 <a2d_ASN1_OBJECT+0x63>
mov    -0x20(%rbp),%rdi
call   1070 <strlen@plt>
mov    %eax,-0x24(%rbp)
jmp    1218 <a2d_ASN1_OBJECT+0x68>
mov    -0x20(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x30,-0x34(%rbp)
jl     1260 <a2d_ASN1_OBJECT+0xb0>
cmpl   $0x32,-0x34(%rbp)
jg     1260 <a2d_ASN1_OBJECT+0xb0>
mov    -0x34(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    127c <a2d_ASN1_OBJECT+0xcc>
mov    0x2d71(%rip),%rax
mov    (%rax),%edi
mov    0x2d48(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
cmpl   $0x0,-0x24(%rbp)
jg     12a2 <a2d_ASN1_OBJECT+0xf2>
mov    0x2d4b(%rip),%rax
mov    (%rax),%edi
mov    0x2d2a(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     12cf <a2d_ASN1_OBJECT+0x11f>
jmp    169d <a2d_ASN1_OBJECT+0x4ed>
cmpl   $0x2e,-0x34(%rbp)
je     12ff <a2d_ASN1_OBJECT+0x14f>
cmpl   $0x20,-0x34(%rbp)
je     12ff <a2d_ASN1_OBJECT+0x14f>
mov    0x2cee(%rip),%rax
mov    (%rax),%edi
mov    0x2cd5(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
movq   $0x0,-0x70(%rbp)
movl   $0x0,-0x38(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     131d <a2d_ASN1_OBJECT+0x16d>
jmp    1469 <a2d_ASN1_OBJECT+0x2b9>
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x68(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x20,-0x34(%rbp)
je     134f <a2d_ASN1_OBJECT+0x19f>
cmpl   $0x2e,-0x34(%rbp)
jne    1354 <a2d_ASN1_OBJECT+0x1a4>
jmp    1469 <a2d_ASN1_OBJECT+0x2b9>
cmpl   $0x30,-0x34(%rbp)
jl     1368 <a2d_ASN1_OBJECT+0x1b8>
cmpl   $0x39,-0x34(%rbp)
jle    1384 <a2d_ASN1_OBJECT+0x1d4>
mov    0x2c69(%rip),%rax
mov    (%rax),%edi
mov    0x2c30(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
cmpl   $0x0,-0x38(%rbp)
jne    140c <a2d_ASN1_OBJECT+0x25c>
mov    -0x70(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    0x2c00(%rip),%rax
mov    (%rax),%eax
sub    $0x50,%eax
cltq
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x88(%rbp),%rax
cmp    %rcx,%rax
jb     140c <a2d_ASN1_OBJECT+0x25c>
movl   $0x1,-0x38(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    13e1 <a2d_ASN1_OBJECT+0x231>
mov    $0x0,%al
call   1040 <BN_new@plt>
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
je     1402 <a2d_ASN1_OBJECT+0x252>
mov    -0x78(%rbp),%rdi
mov    -0x70(%rbp),%rsi
call   1030 <BN_set_word@plt>
cmp    $0x0,%eax
jne    1407 <a2d_ASN1_OBJECT+0x257>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
jmp    140c <a2d_ASN1_OBJECT+0x25c>
cmpl   $0x0,-0x38(%rbp)
je     144f <a2d_ASN1_OBJECT+0x29f>
mov    -0x78(%rbp),%rdi
mov    $0xa,%esi
call   10b0 <BN_mul_word@plt>
cmp    $0x0,%eax
je     1445 <a2d_ASN1_OBJECT+0x295>
mov    -0x78(%rbp),%rdi
mov    -0x34(%rbp),%esi
sub    $0x30,%esi
call   1080 <BN_add_word@plt>
cmp    $0x0,%eax
jne    144a <a2d_ASN1_OBJECT+0x29a>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
jmp    1464 <a2d_ASN1_OBJECT+0x2b4>
imul   $0xa,-0x70(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x30,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
jmp    130e <a2d_ASN1_OBJECT+0x15e>
cmpl   $0x0,-0x30(%rbp)
jne    14e3 <a2d_ASN1_OBJECT+0x333>
cmpl   $0x2,-0x2c(%rbp)
jge    14a4 <a2d_ASN1_OBJECT+0x2f4>
cmpq   $0x28,-0x70(%rbp)
jb     14a4 <a2d_ASN1_OBJECT+0x2f4>
mov    0x2b49(%rip),%rax
mov    (%rax),%edi
mov    0x2b58(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
cmpl   $0x0,-0x38(%rbp)
je     14ce <a2d_ASN1_OBJECT+0x31e>
mov    -0x78(%rbp),%rdi
imul   $0x28,-0x2c(%rbp),%esi
call   1080 <BN_add_word@plt>
cmp    $0x0,%eax
jne    14c9 <a2d_ASN1_OBJECT+0x319>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
jmp    14de <a2d_ASN1_OBJECT+0x32e>
movslq -0x2c(%rbp),%rax
imul   $0x28,%rax,%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
jmp    14e3 <a2d_ASN1_OBJECT+0x333>
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x38(%rbp)
je     15a9 <a2d_ASN1_OBJECT+0x3f9>
mov    -0x78(%rbp),%rdi
call   1060 <BN_num_bits@plt>
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
add    $0x6,%eax
mov    $0x7,%ecx
cltd
idiv   %ecx
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jle    1561 <a2d_ASN1_OBJECT+0x3b1>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     1537 <a2d_ASN1_OBJECT+0x387>
mov    -0x58(%rbp),%rdi
call   10d0 <OPENSSL_free@plt>
mov    -0x7c(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%edi
call   10a0 <OPENSSL_malloc@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    155c <a2d_ASN1_OBJECT+0x3ac>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
jmp    1561 <a2d_ASN1_OBJECT+0x3b1>
jmp    1566 <a2d_ASN1_OBJECT+0x3b6>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x7c(%rbp)
cmp    $0x0,%eax
je     15a4 <a2d_ASN1_OBJECT+0x3f4>
mov    -0x78(%rbp),%rdi
mov    $0x80,%esi
call   10c0 <BN_div_word@plt>
mov    %al,%dl
mov    -0x58(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1566 <a2d_ASN1_OBJECT+0x3b6>
jmp    15f5 <a2d_ASN1_OBJECT+0x445>
jmp    15ae <a2d_ASN1_OBJECT+0x3fe>
mov    -0x70(%rbp),%rax
movzbl %al,%eax
and    $0x7f,%eax
mov    %al,%dl
mov    -0x58(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x70(%rbp),%rax
shr    $0x7,%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
jne    15eb <a2d_ASN1_OBJECT+0x43b>
jmp    15f0 <a2d_ASN1_OBJECT+0x440>
jmp    15ae <a2d_ASN1_OBJECT+0x3fe>
jmp    15f5 <a2d_ASN1_OBJECT+0x445>
cmpq   $0x0,-0x10(%rbp)
je     168f <a2d_ASN1_OBJECT+0x4df>
mov    -0x30(%rbp),%eax
add    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jle    162b <a2d_ASN1_OBJECT+0x47b>
mov    0x29c2(%rip),%rax
mov    (%rax),%edi
mov    0x29c1(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
jmp    16d6 <a2d_ASN1_OBJECT+0x526>
jmp    1630 <a2d_ASN1_OBJECT+0x480>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jle    166f <a2d_ASN1_OBJECT+0x4bf>
mov    -0x58(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
or     $0x80,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1630 <a2d_ASN1_OBJECT+0x480>
mov    -0x58(%rbp),%rax
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1698 <a2d_ASN1_OBJECT+0x4e8>
mov    -0x28(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    12c0 <a2d_ASN1_OBJECT+0x110>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     16b7 <a2d_ASN1_OBJECT+0x507>
mov    -0x58(%rbp),%rdi
call   10d0 <OPENSSL_free@plt>
cmpq   $0x0,-0x78(%rbp)
je     16cb <a2d_ASN1_OBJECT+0x51b>
mov    -0x78(%rbp),%rdi
call   1090 <BN_free@plt>
mov    -0x30(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    170b <a2d_ASN1_OBJECT+0x55b>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     16f0 <a2d_ASN1_OBJECT+0x540>
mov    -0x58(%rbp),%rdi
call   10d0 <OPENSSL_free@plt>
cmpq   $0x0,-0x78(%rbp)
je     1704 <a2d_ASN1_OBJECT+0x554>
mov    -0x78(%rbp),%rdi
call   1090 <BN_free@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<a2d_ASN1_OBJECT>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %ecx,%ebp
test   %ecx,%ecx
je     11fe <a2d_ASN1_OBJECT+0x4e>
mov    %rdx,%r12
mov    %esi,%ebx
mov    %rdi,%r15
cmp    $0xffffffff,%ebp
jne    11db <a2d_ASN1_OBJECT+0x2b>
mov    %r12,%rdi
call   1070 <strlen@plt>
mov    %eax,%ebp
movzbl (%r12),%ecx
lea    -0x30(%rcx),%eax
cmp    $0x2,%al
ja     1203 <a2d_ASN1_OBJECT+0x53>
cmp    $0x2,%ebp
jge    122f <a2d_ASN1_OBJECT+0x7f>
mov    0x2de5(%rip),%rax
mov    (%rax),%edi
mov    0x2dc4(%rip),%rax
jmp    1213 <a2d_ASN1_OBJECT+0x63>
mov    %ebp,%r14d
jmp    121d <a2d_ASN1_OBJECT+0x6d>
mov    0x2dce(%rip),%rax
mov    (%rax),%edi
mov    0x2da5(%rip),%rax
mov    (%rax),%esi
call   1050 <ASN1err@plt>
xor    %r14d,%r14d
mov    %r14d,%eax
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %r14d,%r14d
cmp    $0x2,%ebp
je     121d <a2d_ASN1_OBJECT+0x6d>
mov    %ebx,0x24(%rsp)
mov    %rcx,0x48(%rsp)
lea    -0x30(%rcx),%eax
lea    0x50(%rsp),%rdx
add    $0xfffffffe,%ebp
mov    0x1(%r12),%bl
add    $0x2,%r12
lea    0x0(,%rax,8),%ecx
lea    (%rcx,%rcx,4),%ecx
mov    %ecx,0x20(%rsp)
mov    %eax,%eax
shl    $0x3,%rax
lea    (%rax,%rax,4),%rax
mov    %rax,0x40(%rsp)
lea    0x1(%r15),%rax
mov    %rax,0x38(%rsp)
lea    0x10(%r15),%rax
mov    %rax,0x30(%rsp)
movl   $0x18,0x14(%rsp)
movdqa 0xd6d(%rip),%xmm3
pxor   %xmm4,%xmm4
xor    %eax,%eax
mov    %rax,0x8(%rsp)
xor    %r14d,%r14d
mov    %r15,0x18(%rsp)
movsbl %bl,%eax
cmp    $0x2e,%eax
mov    %rdx,(%rsp)
je     12bb <a2d_ASN1_OBJECT+0x10b>
cmp    $0x20,%eax
jne    1712 <a2d_ASN1_OBJECT+0x562>
add    $0x1,%r12
add    $0x1,%ebp
xor    %r15d,%r15d
mov    %r12,%rax
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %rax,%r12
movsbl -0x1(%rax),%ebx
cmp    $0x20,%ebx
je     13e6 <a2d_ASN1_OBJECT+0x236>
cmp    $0x2e,%bl
je     13e6 <a2d_ASN1_OBJECT+0x236>
lea    -0x3a(%rbx),%eax
cmp    $0xf6,%al
jb     16f0 <a2d_ASN1_OBJECT+0x540>
test   %ecx,%ecx
je     1310 <a2d_ASN1_OBJECT+0x160>
mov    %rbx,%r13
mov    0x8(%rsp),%rbx
jmp    1389 <a2d_ASN1_OBJECT+0x1d9>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x2c89(%rip),%rax
mov    (%rax),%eax
add    $0xffffffb0,%eax
cltq
imul   $0x66666667,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
sar    $0x22,%rax
add    %ecx,%eax
cltq
cmp    %rax,%r15
jae    1356 <a2d_ASN1_OBJECT+0x1a6>
lea    (%r15,%r15,4),%rax
mov    %rbx,%r13
mov    %ebx,%ecx
add    $0xffffffd0,%ecx
lea    (%rcx,%rax,2),%r15
xor    %ecx,%ecx
mov    (%rsp),%rdx
mov    0x8(%rsp),%rbx
jmp    13c9 <a2d_ASN1_OBJECT+0x219>
mov    %rbx,%r13
mov    0x8(%rsp),%rbx
test   %rbx,%rbx
jne    1376 <a2d_ASN1_OBJECT+0x1c6>
xor    %eax,%eax
call   1040 <BN_new@plt>
mov    %rax,%rbx
test   %rax,%rax
je     173c <a2d_ASN1_OBJECT+0x58c>
mov    %rbx,%rdi
mov    %r15,%rsi
call   1030 <BN_set_word@plt>
test   %eax,%eax
je     173e <a2d_ASN1_OBJECT+0x58e>
mov    $0xa,%esi
mov    %rbx,%rdi
call   10b0 <BN_mul_word@plt>
test   %eax,%eax
je     173e <a2d_ASN1_OBJECT+0x58e>
mov    %r13d,%esi
add    $0xffffffd0,%esi
mov    %rbx,%rdi
call   1080 <BN_add_word@plt>
mov    $0x1,%ecx
test   %eax,%eax
mov    (%rsp),%rdx
movdqa 0xc41(%rip),%xmm3
pxor   %xmm4,%xmm4
je     1742 <a2d_ASN1_OBJECT+0x592>
mov    %rbx,0x8(%rsp)
lea    0x1(%r12),%rax
add    $0xffffffff,%ebp
cmp    $0x2,%ebp
jae    12d0 <a2d_ASN1_OBJECT+0x120>
xor    %ebp,%ebp
mov    %r13,%rbx
jmp    13e9 <a2d_ASN1_OBJECT+0x239>
add    $0xfffffffe,%ebp
test   %r14d,%r14d
je     13f7 <a2d_ASN1_OBJECT+0x247>
test   %ecx,%ecx
jne    142a <a2d_ASN1_OBJECT+0x27a>
jmp    1501 <a2d_ASN1_OBJECT+0x351>
cmpb   $0x31,0x48(%rsp)
ja     1408 <a2d_ASN1_OBJECT+0x258>
cmp    $0x27,%r15
ja     177d <a2d_ASN1_OBJECT+0x5cd>
test   %ecx,%ecx
je     14fc <a2d_ASN1_OBJECT+0x34c>
mov    0x8(%rsp),%rdi
mov    0x20(%rsp),%esi
call   1080 <BN_add_word@plt>
mov    (%rsp),%rdx
test   %eax,%eax
je     170b <a2d_ASN1_OBJECT+0x55b>
mov    %rbx,0x28(%rsp)
mov    0x8(%rsp),%rdi
call   1060 <BN_num_bits@plt>
mov    %eax,%r15d
lea    0x6(%r15),%eax
cltq
imul   $0xffffffff92492493,%rax,%rax
shr    $0x20,%rax
lea    (%rax,%r15,1),%ebx
add    $0x6,%ebx
mov    %ebx,%eax
shr    $0x1f,%eax
sar    $0x2,%ebx
add    %eax,%ebx
cmp    0x14(%rsp),%ebx
jle    1490 <a2d_ASN1_OBJECT+0x2e0>
mov    (%rsp),%rdi
lea    0x50(%rsp),%rax
cmp    %rax,%rdi
je     1477 <a2d_ASN1_OBJECT+0x2c7>
call   10d0 <OPENSSL_free@plt>
lea    0x20(%rbx),%edi
mov    %edi,0x14(%rsp)
call   10a0 <OPENSSL_malloc@plt>
mov    %rax,%rdx
test   %rax,%rax
jne    1494 <a2d_ASN1_OBJECT+0x2e4>
jmp    1789 <a2d_ASN1_OBJECT+0x5d9>
mov    (%rsp),%rdx
add    $0xc,%r15d
xor    %r13d,%r13d
cmp    $0xd,%r15d
jae    14a8 <a2d_ASN1_OBJECT+0x2f8>
mov    0x18(%rsp),%r15
jmp    14e9 <a2d_ASN1_OBJECT+0x339>
mov    %r12,(%rsp)
mov    0x8(%rsp),%r15
mov    %ebx,%ebx
xor    %r13d,%r13d
cs nopw 0x0(%rax,%rax,1)
mov    %r15,%rdi
mov    $0x80,%esi
mov    %rdx,%r12
call   10c0 <BN_div_word@plt>
mov    %r12,%rdx
mov    %al,(%r12,%r13,1)
add    $0x1,%r13
cmp    %r13d,%ebx
jne    14c0 <a2d_ASN1_OBJECT+0x310>
mov    0x18(%rsp),%r15
mov    (%rsp),%r12
movdqa 0xb0f(%rip),%xmm3
pxor   %xmm4,%xmm4
mov    0x28(%rsp),%rbx
jmp    1530 <a2d_ASN1_OBJECT+0x380>
add    0x40(%rsp),%r15
xor    %r13d,%r13d
mov    %r15,%rax
nopw   0x0(%rax,%rax,1)
mov    %r15d,%ecx
and    $0x7f,%cl
mov    %cl,(%rdx,%r13,1)
add    $0x1,%r13
shr    $0x7,%rax
cmp    $0x7f,%r15
mov    %rax,%r15
ja     1510 <a2d_ASN1_OBJECT+0x360>
mov    0x18(%rsp),%r15
lea    (%r14,%r13,1),%eax
test   %r15,%r15
je     15b5 <a2d_ASN1_OBJECT+0x405>
cmp    0x24(%rsp),%eax
jg     176d <a2d_ASN1_OBJECT+0x5bd>
cmp    $0x2,%r13d
jl     159b <a2d_ASN1_OBJECT+0x3eb>
mov    %r13d,%eax
movslq %r14d,%r10
mov    %rax,%rsi
sub    $0x2,%rsi
mov    $0x0,%r8d
cmovae %rsi,%r8
add    $0x1,%r8
cmp    $0x20,%r8
jae    15c5 <a2d_ASN1_OBJECT+0x415>
mov    %r10,%r14
mov    %rax,%rsi
add    $0x1,%rsi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    -0x2(%rsi),%eax
movzbl (%rdx,%rax,1),%eax
or     $0x80,%al
mov    %al,(%r15,%r14,1)
add    $0x1,%r14
add    $0xffffffffffffffff,%rsi
cmp    $0x2,%rsi
ja     1580 <a2d_ASN1_OBJECT+0x3d0>
mov    (%rdx),%al
movslq %r14d,%rcx
add    $0x1,%r14d
mov    %al,(%r15,%rcx,1)
test   %ebp,%ebp
jg     12a6 <a2d_ASN1_OBJECT+0xf6>
jmp    171b <a2d_ASN1_OBJECT+0x56b>
mov    %eax,%r14d
test   %ebp,%ebp
jg     12a6 <a2d_ASN1_OBJECT+0xf6>
jmp    171b <a2d_ASN1_OBJECT+0x56b>
mov    %rax,%rsi
sub    $0x2,%rsi
mov    $0x0,%edi
cmovae %rsi,%rdi
mov    %eax,%esi
sub    $0x2,%esi
mov    $0x0,%ecx
cmovb  %ecx,%esi
add    $0xffffffff,%r13d
cmp    %esi,%r13d
jb     156a <a2d_ASN1_OBJECT+0x3ba>
shr    $0x20,%rdi
jne    156a <a2d_ASN1_OBJECT+0x3ba>
lea    (%r15,%r10,1),%rsi
cmp    $0x2,%rax
mov    $0x2,%r9d
cmovb  %rax,%r9
lea    (%rdx,%r13,1),%rdi
add    $0x1,%rdi
cmp    %rdi,%rsi
jae    1636 <a2d_ASN1_OBJECT+0x486>
lea    (%r10,%rax,1),%rsi
sub    %r9,%rsi
add    0x38(%rsp),%rsi
add    %r9,%r13
sub    %rax,%r13
add    %rdx,%r13
cmp    %rsi,%r13
jb     156a <a2d_ASN1_OBJECT+0x3ba>
mov    %r8,%r11
and    $0xffffffffffffffe0,%r11
lea    (%r11,%r10,1),%r14
mov    %rax,%rsi
sub    %r11,%rsi
add    $0xffffffffffffffff,%rax
add    0x30(%rsp),%r10
xor    %edi,%edi
mov    %eax,%ecx
movdqu -0x1f(%rdx,%rcx,1),%xmm0
movdqu -0xf(%rdx,%rcx,1),%xmm1
por    %xmm3,%xmm1
movdqa %xmm1,%xmm2
punpcklbw %xmm4,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm4,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm2,%xmm1
por    %xmm3,%xmm0
movdqa %xmm0,%xmm2
punpcklbw %xmm4,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm4,%xmm0
pshufd $0x4e,%xmm0,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm2,%xmm0
movdqu %xmm1,-0x10(%r10,%rdi,1)
movdqu %xmm0,(%r10,%rdi,1)
add    $0x20,%rdi
add    $0xffffffffffffffe0,%rax
cmp    %rdi,%r11
jne    1652 <a2d_ASN1_OBJECT+0x4a2>
cmp    %r11,%r8
jne    1570 <a2d_ASN1_OBJECT+0x3c0>
jmp    159b <a2d_ASN1_OBJECT+0x3eb>
mov    0x28b1(%rip),%rcx
mov    0x28da(%rip),%rax
mov    (%rax),%edi
mov    (%rcx),%esi
call   1050 <ASN1err@plt>
mov    (%rsp),%rdx
mov    0x8(%rsp),%rbx
jmp    1742 <a2d_ASN1_OBJECT+0x592>
mov    0x28af(%rip),%rcx
jmp    16f7 <a2d_ASN1_OBJECT+0x547>
lea    0x50(%rsp),%rax
cmp    %rax,%rdx
je     172d <a2d_ASN1_OBJECT+0x57d>
mov    %rdx,%rdi
call   10d0 <OPENSSL_free@plt>
mov    0x8(%rsp),%rdi
test   %rdi,%rdi
jne    1763 <a2d_ASN1_OBJECT+0x5b3>
jmp    121d <a2d_ASN1_OBJECT+0x6d>
xor    %ebx,%ebx
mov    (%rsp),%rdx
lea    0x50(%rsp),%rax
cmp    %rax,%rdx
je     1754 <a2d_ASN1_OBJECT+0x5a4>
mov    %rdx,%rdi
call   10d0 <OPENSSL_free@plt>
xor    %r14d,%r14d
test   %rbx,%rbx
je     121d <a2d_ASN1_OBJECT+0x6d>
mov    %rbx,%rdi
call   1090 <BN_free@plt>
jmp    121d <a2d_ASN1_OBJECT+0x6d>
mov    %rdx,(%rsp)
mov    0x2868(%rip),%rcx
jmp    16f7 <a2d_ASN1_OBJECT+0x547>
mov    0x286c(%rip),%rcx
jmp    16f7 <a2d_ASN1_OBJECT+0x547>
xor    %edx,%edx
mov    0x8(%rsp),%rbx
jmp    174c <a2d_ASN1_OBJECT+0x59c>

LLVM IR (-O0):
@ASN1_F_A2D_ASN1_OBJECT = global i32 0
@ASN1_R_FIRST_NUM_TOO_LARGE = global i32 0
@ASN1_R_MISSING_SECOND_NUMBER = global i32 0
@ASN1_R_INVALID_SEPARATOR = global i32 0
@ASN1_R_INVALID_DIGIT = global i32 0
@ULONG_MAX = global i32 0
@ASN1_R_SECOND_NUMBER_TOO_LARGE = global i32 0
@ASN1_R_BUFFER_TOO_SMALL = global i32 0
define i32 @a2d_ASN1_OBJECT(i8* %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca [24 x i8]
%16 = alloca i8*
%17 = alloca i32
%18 = alloca i8*
%19 = alloca i64
%20 = alloca i32*
%21 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i32 %3, i32* %9
store i32 0, i32* %12
%22 = getelementptr inbounds [24 x i8], [24 x i8]* %15, i64 0, i64 0
store i8* %22, i8** %16
store i32 24, i32* %17
store i32* null, i32** %20
%23 = load i32, i32* %9
%24 = icmp eq i32 %23, 0
br i1 %24, label %25, label %26
25: ; preds = %4
store i32 0, i32* %5
br label %325
26: ; preds = %4
%27 = load i32, i32* %9
%28 = icmp eq i32 %27, -1
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load i8*, i8** %8
%31 = call i32 @strlen(i8* %30)
store i32 %31, i32* %9
br label %32
32: ; preds = %29, %26
br label %33
33: ; preds = %32
%34 = load i8*, i8** %8
store i8* %34, i8** %18
%35 = load i8*, i8** %18
%36 = getelementptr inbounds i8, i8* %35, i32 1
store i8* %36, i8** %18
%37 = load i8, i8* %35
%38 = sext i8 %37 to i32
store i32 %38, i32* %13
%39 = load i32, i32* %9
%40 = add nsw i32 %39, -1
store i32 %40, i32* %9
%41 = load i32, i32* %13
%42 = icmp sge i32 %41, 48
br i1 %42, label %43, label %49
43: ; preds = %33
%44 = load i32, i32* %13
%45 = icmp sle i32 %44, 50
br i1 %45, label %46, label %49
46: ; preds = %43
%47 = load i32, i32* %13
%48 = sub nsw i32 %47, 48
store i32 %48, i32* %11
br label %53
49: ; preds = %43, %33
%50 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%51 = load i32, i32* @ASN1_R_FIRST_NUM_TOO_LARGE
%52 = call i32 @ASN1err(i32 %50, i32 %51)
br label %311
53: ; preds = %46
%54 = load i32, i32* %9
%55 = icmp sle i32 %54, 0
br i1 %55, label %56, label %60
56: ; preds = %53
%57 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%58 = load i32, i32* @ASN1_R_MISSING_SECOND_NUMBER
%59 = call i32 @ASN1err(i32 %57, i32 %58)
br label %311
60: ; preds = %53
%61 = load i8*, i8** %18
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %18
%63 = load i8, i8* %61
%64 = sext i8 %63 to i32
store i32 %64, i32* %13
%65 = load i32, i32* %9
%66 = add nsw i32 %65, -1
store i32 %66, i32* %9
br label %67
67: ; preds = %295, %60
%68 = load i32, i32* %9
%69 = icmp sle i32 %68, 0
br i1 %69, label %70, label %71
70: ; preds = %67
br label %296
71: ; preds = %67
%72 = load i32, i32* %13
%73 = icmp ne i32 %72, 46
br i1 %73, label %74, label %81
74: ; preds = %71
%75 = load i32, i32* %13
%76 = icmp ne i32 %75, 32
br i1 %76, label %77, label %81
77: ; preds = %74
%78 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%79 = load i32, i32* @ASN1_R_INVALID_SEPARATOR
%80 = call i32 @ASN1err(i32 %78, i32 %79)
br label %311
81: ; preds = %74, %71
store i64 0, i64* %19
store i32 0, i32* %14
br label %82
82: ; preds = %156, %81
%83 = load i32, i32* %9
%84 = icmp sle i32 %83, 0
br i1 %84, label %85, label %86
85: ; preds = %82
br label %157
86: ; preds = %82
%87 = load i32, i32* %9
%88 = add nsw i32 %87, -1
store i32 %88, i32* %9
%89 = load i8*, i8** %18
%90 = getelementptr inbounds i8, i8* %89, i32 1
store i8* %90, i8** %18
%91 = load i8, i8* %89
%92 = sext i8 %91 to i32
store i32 %92, i32* %13
%93 = load i32, i32* %13
%94 = icmp eq i32 %93, 32
br i1 %94, label %98, label %95
95: ; preds = %86
%96 = load i32, i32* %13
%97 = icmp eq i32 %96, 46
br i1 %97, label %98, label %99
98: ; preds = %95, %86
br label %157
99: ; preds = %95
%100 = load i32, i32* %13
%101 = icmp slt i32 %100, 48
br i1 %101, label %105, label %102
102: ; preds = %99
%103 = load i32, i32* %13
%104 = icmp sgt i32 %103, 57
br i1 %104, label %105, label %109
105: ; preds = %102, %99
%106 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%107 = load i32, i32* @ASN1_R_INVALID_DIGIT
%108 = call i32 @ASN1err(i32 %106, i32 %107)
br label %311
109: ; preds = %102
%110 = load i32, i32* %14
%111 = icmp ne i32 %110, 0
br i1 %111, label %134, label %112
112: ; preds = %109
%113 = load i64, i64* %19
%114 = load i32, i32* @ULONG_MAX
%115 = sub nsw i32 %114, 80
%116 = sext i32 %115 to i64
%117 = sdiv i64 %116, 10
%118 = icmp uge i64 %113, %117
br i1 %118, label %119, label %134
119: ; preds = %112
store i32 1, i32* %14
%120 = load i32*, i32** %20
%121 = icmp ne i32* %120, null
br i1 %121, label %124, label %122
122: ; preds = %119
%123 = call i32* (...) @BN_new()
store i32* %123, i32** %20
br label %124
124: ; preds = %122, %119
%125 = load i32*, i32** %20
%126 = icmp ne i32* %125, null
br i1 %126, label %127, label %132
127: ; preds = %124
%128 = load i32*, i32** %20
%129 = load i64, i64* %19
%130 = call i32 @BN_set_word(i32* %128, i64 %129)
%131 = icmp ne i32 %130, 0
br i1 %131, label %133, label %132
132: ; preds = %127, %124
br label %311
133: ; preds = %127
br label %134
134: ; preds = %133, %112, %109
%135 = load i32, i32* %14
%136 = icmp ne i32 %135, 0
br i1 %136, label %137, label %149
137: ; preds = %134
%138 = load i32*, i32** %20
%139 = call i32 @BN_mul_word(i32* %138, i64 10)
%140 = icmp ne i32 %139, 0
br i1 %140, label %141, label %147
141: ; preds = %137
%142 = load i32*, i32** %20
%143 = load i32, i32* %13
%144 = sub nsw i32 %143, 48
%145 = call i32 @BN_add_word(i32* %142, i32 %144)
%146 = icmp ne i32 %145, 0
br i1 %146, label %148, label %147
147: ; preds = %141, %137
br label %311
148: ; preds = %141
br label %156
149: ; preds = %134
%150 = load i64, i64* %19
%151 = mul i64 %150, 10
%152 = load i32, i32* %13
%153 = sub nsw i32 %152, 48
%154 = sext i32 %153 to i64
%155 = add i64 %151, %154
store i64 %155, i64* %19
br label %156
156: ; preds = %149, %148
br label %82
157: ; preds = %98, %85
%158 = load i32, i32* %12
%159 = icmp eq i32 %158, 0
br i1 %159, label %160, label %188
160: ; preds = %157
%161 = load i32, i32* %11
%162 = icmp slt i32 %161, 2
br i1 %162, label %163, label %170
163: ; preds = %160
%164 = load i64, i64* %19
%165 = icmp uge i64 %164, 40
br i1 %165, label %166, label %170
166: ; preds = %163
%167 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%168 = load i32, i32* @ASN1_R_SECOND_NUMBER_TOO_LARGE
%169 = call i32 @ASN1err(i32 %167, i32 %168)
br label %311
170: ; preds = %163, %160
%171 = load i32, i32* %14
%172 = icmp ne i32 %171, 0
br i1 %172, label %173, label %181
173: ; preds = %170
%174 = load i32*, i32** %20
%175 = load i32, i32* %11
%176 = mul nsw i32 %175, 40
%177 = call i32 @BN_add_word(i32* %174, i32 %176)
%178 = icmp ne i32 %177, 0
br i1 %178, label %180, label %179
179: ; preds = %173
br label %311
180: ; preds = %173
br label %187
181: ; preds = %170
%182 = load i32, i32* %11
%183 = sext i32 %182 to i64
%184 = mul nsw i64 %183, 40
%185 = load i64, i64* %19
%186 = add i64 %185, %184
store i64 %186, i64* %19
br label %187
187: ; preds = %181, %180
br label %188
188: ; preds = %187, %157
store i32 0, i32* %10
%189 = load i32, i32* %14
%190 = icmp ne i32 %189, 0
br i1 %190, label %191, label %231
191: ; preds = %188
%192 = load i32*, i32** %20
%193 = call i32 @BN_num_bits(i32* %192)
store i32 %193, i32* %21
%194 = load i32, i32* %21
%195 = add nsw i32 %194, 6
%196 = sdiv i32 %195, 7
store i32 %196, i32* %21
%197 = load i32, i32* %21
%198 = load i32, i32* %17
%199 = icmp sgt i32 %197, %198
br i1 %199, label %200, label %216
200: ; preds = %191
%201 = load i8*, i8** %16
%202 = getelementptr inbounds [24 x i8], [24 x i8]* %15, i64 0, i64 0
%203 = icmp ne i8* %201, %202
br i1 %203, label %204, label %207
204: ; preds = %200
%205 = load i8*, i8** %16
%206 = call i32 @OPENSSL_free(i8* %205)
br label %207
207: ; preds = %204, %200
%208 = load i32, i32* %21
%209 = add nsw i32 %208, 32
store i32 %209, i32* %17
%210 = load i32, i32* %17
%211 = call i8* @OPENSSL_malloc(i32 %210)
store i8* %211, i8** %16
%212 = load i8*, i8** %16
%213 = icmp ne i8* %212, null
br i1 %213, label %215, label %214
214: ; preds = %207
br label %311
215: ; preds = %207
br label %216
216: ; preds = %215, %191
br label %217
217: ; preds = %221, %216
%218 = load i32, i32* %21
%219 = add nsw i32 %218, -1
store i32 %219, i32* %21
%220 = icmp ne i32 %218, 0
br i1 %220, label %221, label %230
221: ; preds = %217
%222 = load i32*, i32** %20
%223 = call i64 @BN_div_word(i32* %222, i32 128)
%224 = trunc i64 %223 to i8
%225 = load i8*, i8** %16
%226 = load i32, i32* %10
%227 = add nsw i32 %226, 1
store i32 %227, i32* %10
%228 = sext i32 %226 to i64
%229 = getelementptr inbounds i8, i8* %225, i64 %228
store i8 %224, i8* %229
br label %217
230: ; preds = %217
br label %250
231: ; preds = %188
br label %232
232: ; preds = %248, %231
%233 = load i64, i64* %19
%234 = trunc i64 %233 to i8
%235 = zext i8 %234 to i32
%236 = and i32 %235, 127
%237 = trunc i32 %236 to i8
%238 = load i8*, i8** %16
%239 = load i32, i32* %10
%240 = add nsw i32 %239, 1
store i32 %240, i32* %10
%241 = sext i32 %239 to i64
%242 = getelementptr inbounds i8, i8* %238, i64 %241
store i8 %237, i8* %242
%243 = load i64, i64* %19
%244 = lshr i64 %243, 7
store i64 %244, i64* %19
%245 = load i64, i64* %19
%246 = icmp eq i64 %245, 0
br i1 %246, label %247, label %248
247: ; preds = %232
br label %249
248: ; preds = %232
br label %232
249: ; preds = %247
br label %250
250: ; preds = %249, %230
%251 = load i8*, i8** %6
%252 = icmp ne i8* %251, null
br i1 %252, label %253, label %291
253: ; preds = %250
%254 = load i32, i32* %12
%255 = load i32, i32* %10
%256 = add nsw i32 %254, %255
%257 = load i32, i32* %7
%258 = icmp sgt i32 %256, %257
br i1 %258, label %259, label %263
259: ; preds = %253
%260 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%261 = load i32, i32* @ASN1_R_BUFFER_TOO_SMALL
%262 = call i32 @ASN1err(i32 %260, i32 %261)
br label %311
263: ; preds = %253
br label %264
264: ; preds = %268, %263
%265 = load i32, i32* %10
%266 = add nsw i32 %265, -1
store i32 %266, i32* %10
%267 = icmp sgt i32 %266, 0
br i1 %267, label %268, label %282
268: ; preds = %264
%269 = load i8*, i8** %16
%270 = load i32, i32* %10
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds i8, i8* %269, i64 %271
%273 = load i8, i8* %272
%274 = sext i8 %273 to i32
%275 = or i32 %274, 128
%276 = trunc i32 %275 to i8
%277 = load i8*, i8** %6
%278 = load i32, i32* %12
%279 = add nsw i32 %278, 1
store i32 %279, i32* %12
%280 = sext i32 %278 to i64
%281 = getelementptr inbounds i8, i8* %277, i64 %280
store i8 %276, i8* %281
br label %264
282: ; preds = %264
%283 = load i8*, i8** %16
%284 = getelementptr inbounds i8, i8* %283, i64 0
%285 = load i8, i8* %284
%286 = load i8*, i8** %6
%287 = load i32, i32* %12
%288 = add nsw i32 %287, 1
store i32 %288, i32* %12
%289 = sext i32 %287 to i64
%290 = getelementptr inbounds i8, i8* %286, i64 %289
store i8 %285, i8* %290
br label %295
291: ; preds = %250
%292 = load i32, i32* %10
%293 = load i32, i32* %12
%294 = add nsw i32 %293, %292
store i32 %294, i32* %12
br label %295
295: ; preds = %291, %282
br label %67
296: ; preds = %70
%297 = load i8*, i8** %16
%298 = getelementptr inbounds [24 x i8], [24 x i8]* %15, i64 0, i64 0
%299 = icmp ne i8* %297, %298
br i1 %299, label %300, label %303
300: ; preds = %296
%301 = load i8*, i8** %16
%302 = call i32 @OPENSSL_free(i8* %301)
br label %303
303: ; preds = %300, %296
%304 = load i32*, i32** %20
%305 = icmp ne i32* %304, null
br i1 %305, label %306, label %309
306: ; preds = %303
%307 = load i32*, i32** %20
%308 = call i32 @BN_free(i32* %307)
br label %309
309: ; preds = %306, %303
%310 = load i32, i32* %12
store i32 %310, i32* %5
br label %325
311: ; preds = %259, %214, %179, %166, %147, %132, %105, %77, %56, %49
%312 = load i8*, i8** %16
%313 = getelementptr inbounds [24 x i8], [24 x i8]* %15, i64 0, i64 0
%314 = icmp ne i8* %312, %313
br i1 %314, label %315, label %318
315: ; preds = %311
%316 = load i8*, i8** %16
%317 = call i32 @OPENSSL_free(i8* %316)
br label %318
318: ; preds = %315, %311
%319 = load i32*, i32** %20
%320 = icmp ne i32* %319, null
br i1 %320, label %321, label %324
321: ; preds = %318
%322 = load i32*, i32** %20
%323 = call i32 @BN_free(i32* %322)
br label %324
324: ; preds = %321, %318
store i32 0, i32* %5
br label %325
325: ; preds = %324, %309, %25
%326 = load i32, i32* %5
ret i32 %326
}

LLVM IR (-O2):
@ASN1_F_A2D_ASN1_OBJECT = global i32 0
@ASN1_R_FIRST_NUM_TOO_LARGE = global i32 0
@ASN1_R_MISSING_SECOND_NUMBER = global i32 0
@ASN1_R_INVALID_SEPARATOR = global i32 0
@ASN1_R_INVALID_DIGIT = global i32 0
@ULONG_MAX = global i32 0
@ASN1_R_SECOND_NUMBER_TOO_LARGE = global i32 0
@ASN1_R_BUFFER_TOO_SMALL = global i32 0
define i32 @a2d_ASN1_OBJECT(i8* writeonly %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca [24 x i8]
%6 = getelementptr inbounds [24 x i8], [24 x i8]* %5, i64 0, i64 0
switch i32 %3, label %9 [
i32 0, label %281
i32 -1, label %7
]
7: ; preds = %4
%8 = tail call i32 @strlen(i8* %2)
br label %9
9: ; preds = %4, %7
%10 = phi i32 [ %8, %7 ], [ %3, %4 ]
%11 = getelementptr inbounds i8, i8* %2, i64 1
%12 = load i8, i8* %2
%13 = add i8 %12, -48
%14 = icmp ult i8 %13, 3
br i1 %14, label %15, label %19
15: ; preds = %9
%16 = zext i8 %12 to i32
%17 = add nsw i32 %16, -48
%18 = icmp slt i32 %10, 2
br i1 %18, label %23, label %27
19: ; preds = %9
%20 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%21 = load i32, i32* @ASN1_R_FIRST_NUM_TOO_LARGE
%22 = tail call i32 @ASN1err(i32 %20, i32 %21)
br label %281
23: ; preds = %15
%24 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%25 = load i32, i32* @ASN1_R_MISSING_SECOND_NUMBER
%26 = tail call i32 @ASN1err(i32 %24, i32 %25)
br label %281
27: ; preds = %15
%28 = icmp eq i32 %10, 2
br i1 %28, label %281, label %29
29: ; preds = %27
%30 = add nsw i32 %10, -2
%31 = load i8, i8* %11
%32 = getelementptr inbounds i8, i8* %2, i64 2
%33 = icmp ult i8 %12, 50
%34 = mul nuw nsw i32 %17, 40
%35 = zext i32 %17 to i64
%36 = mul nuw nsw i64 %35, 40
%37 = icmp eq i8* %0, null
%38 = getelementptr i8, i8* %0, i64 1
br label %39
39: ; preds = %29, %250
%40 = phi i32* [ null, %29 ], [ %100, %250 ]
%41 = phi i8* [ %32, %29 ], [ %56, %250 ]
%42 = phi i32 [ 24, %29 ], [ %160, %250 ]
%43 = phi i8* [ %6, %29 ], [ %159, %250 ]
%44 = phi i8 [ %31, %29 ], [ %57, %250 ]
%45 = phi i32 [ 0, %29 ], [ %251, %250 ]
%46 = phi i32 [ %30, %29 ], [ %101, %250 ]
%47 = sext i8 %44 to i32
switch i32 %47, label %261 [
i32 46, label %48
i32 32, label %48
]
48: ; preds = %39, %39
br label %49
49: ; preds = %48, %92
%50 = phi i32* [ %93, %92 ], [ %40, %48 ]
%51 = phi i64 [ %95, %92 ], [ 0, %48 ]
%52 = phi i8* [ %56, %92 ], [ %41, %48 ]
%53 = phi i32 [ %94, %92 ], [ 0, %48 ]
%54 = phi i32 [ %55, %92 ], [ %46, %48 ]
%55 = add nsw i32 %54, -1
%56 = getelementptr inbounds i8, i8* %52, i64 1
%57 = load i8, i8* %52
%58 = sext i8 %57 to i32
switch i8 %57, label %59 [
i8 46, label %97
i8 32, label %97
]
59: ; preds = %49
%60 = add i8 %57, -58
%61 = icmp ult i8 %60, -10
br i1 %61, label %261, label %62
62: ; preds = %59
%63 = icmp eq i32 %53, 0
br i1 %63, label %64, label %79
64: ; preds = %62
%65 = load i32, i32* @ULONG_MAX
%66 = add nsw i32 %65, -80
%67 = sdiv i32 %66, 10
%68 = sext i32 %67 to i64
%69 = icmp ult i64 %51, %68
br i1 %69, label %87, label %70
70: ; preds = %64
%71 = icmp eq i32* %50, null
br i1 %71, label %72, label %75
72: ; preds = %70
%73 = call i32* (...) @BN_new()
%74 = icmp eq i32* %73, null
br i1 %74, label %268, label %75
75: ; preds = %70, %72
%76 = phi i32* [ %73, %72 ], [ %50, %70 ]
%77 = call i32 @BN_set_word(i32* %76, i64 %51)
%78 = icmp eq i32 %77, 0
br i1 %78, label %268, label %79
79: ; preds = %75, %62
%80 = phi i32* [ %50, %62 ], [ %76, %75 ]
%81 = call i32 @BN_mul_word(i32* %80, i64 10)
%82 = icmp eq i32 %81, 0
br i1 %82, label %268, label %83
83: ; preds = %79
%84 = add nsw i32 %58, -48
%85 = call i32 @BN_add_word(i32* %80, i32 %84)
%86 = icmp eq i32 %85, 0
br i1 %86, label %268, label %92
87: ; preds = %64
%88 = mul i64 %51, 10
%89 = add nsw i32 %58, -48
%90 = zext i32 %89 to i64
%91 = add i64 %88, %90
br label %92
92: ; preds = %83, %87
%93 = phi i32* [ %80, %83 ], [ %50, %87 ]
%94 = phi i32 [ 1, %83 ], [ 0, %87 ]
%95 = phi i64 [ %51, %83 ], [ %91, %87 ]
%96 = icmp ult i32 %54, 2
br i1 %96, label %97, label %49
97: ; preds = %92, %49, %49
%98 = phi i32 [ %53, %49 ], [ %53, %49 ], [ %94, %92 ]
%99 = phi i64 [ %51, %49 ], [ %51, %49 ], [ %95, %92 ]
%100 = phi i32* [ %50, %49 ], [ %50, %49 ], [ %93, %92 ]
%101 = phi i32 [ %55, %49 ], [ %55, %49 ], [ 0, %92 ]
%102 = icmp eq i32 %45, 0
br i1 %102, label %103, label %113
103: ; preds = %97
%104 = icmp ugt i64 %99, 39
%105 = select i1 %33, i1 %104, i1 false
br i1 %105, label %261, label %106
106: ; preds = %103
%107 = icmp eq i32 %98, 0
br i1 %107, label %111, label %108
108: ; preds = %106
%109 = call i32 @BN_add_word(i32* %100, i32 %34)
%110 = icmp eq i32 %109, 0
br i1 %110, label %268, label %117
111: ; preds = %106
%112 = add i64 %99, %36
br label %115
113: ; preds = %97
%114 = icmp eq i32 %98, 0
br i1 %114, label %115, label %117
115: ; preds = %111, %113
%116 = phi i64 [ %99, %113 ], [ %112, %111 ]
br label %144
117: ; preds = %108, %113
%118 = call i32 @BN_num_bits(i32* %100)
%119 = add nsw i32 %118, 6
%120 = sdiv i32 %119, 7
%121 = icmp sgt i32 %120, %42
br i1 %121, label %122, label %130
122: ; preds = %117
%123 = icmp eq i8* %43, %6
br i1 %123, label %126, label %124
124: ; preds = %122
%125 = call i32 @OPENSSL_free(i8* %43)
br label %126
126: ; preds = %124, %122
%127 = add nsw i32 %120, 32
%128 = call i8* @OPENSSL_malloc(i32 %127)
%129 = icmp eq i8* %128, null
br i1 %129, label %272, label %130
130: ; preds = %126, %117
%131 = phi i8* [ %128, %126 ], [ %43, %117 ]
%132 = phi i32 [ %127, %126 ], [ %42, %117 ]
%133 = add i32 %118, 12
%134 = icmp ult i32 %133, 13
br i1 %134, label %157, label %135
135: ; preds = %130, %135
%136 = phi i64 [ %141, %135 ], [ 0, %130 ]
%137 = phi i32 [ %138, %135 ], [ %120, %130 ]
%138 = add nsw i32 %137, -1
%139 = call i64 @BN_div_word(i32* %100, i32 128)
%140 = trunc i64 %139 to i8
%141 = add nuw nsw i64 %136, 1
%142 = getelementptr inbounds i8, i8* %131, i64 %136
store i8 %140, i8* %142
%143 = icmp eq i32 %138, 0
br i1 %143, label %155, label %135
144: ; preds = %115, %144
%145 = phi i64 [ %149, %144 ], [ 0, %115 ]
%146 = phi i64 [ %151, %144 ], [ %116, %115 ]
%147 = trunc i64 %146 to i8
%148 = and i8 %147, 127
%149 = add nuw nsw i64 %145, 1
%150 = getelementptr inbounds i8, i8* %43, i64 %145
store i8 %148, i8* %150
%151 = lshr i64 %146, 7
%152 = icmp ult i64 %146, 128
br i1 %152, label %153, label %144
153: ; preds = %144
%154 = trunc i64 %149 to i32
br label %157
155: ; preds = %135
%156 = trunc i64 %141 to i32
br label %157
157: ; preds = %155, %153, %130
%158 = phi i32 [ 0, %130 ], [ %154, %153 ], [ %156, %155 ]
%159 = phi i8* [ %131, %130 ], [ %43, %153 ], [ %131, %155 ]
%160 = phi i32 [ %132, %130 ], [ %42, %153 ], [ %132, %155 ]
%161 = add nsw i32 %158, %45
br i1 %37, label %250, label %162
162: ; preds = %157
%163 = icmp sgt i32 %161, %1
br i1 %163, label %261, label %164
164: ; preds = %162
%165 = icmp sgt i32 %158, 1
br i1 %165, label %166, label %244
166: ; preds = %164
%167 = zext i32 %158 to i64
%168 = sext i32 %45 to i64
%169 = add nuw nsw i64 %167, 1
%170 = call i64 @llvm.umin.i64(i64 %167, i64 2)
%171 = sub nsw i64 %169, %170
%172 = icmp ult i64 %171, 32
br i1 %172, label %227, label %173
173: ; preds = %166
%174 = call i64 @llvm.umin.i64(i64 %167, i64 2)
%175 = sub nsw i64 %167, %174
%176 = add i32 %158, -1
%177 = trunc i64 %175 to i32
%178 = icmp ult i32 %176, %177
%179 = icmp ugt i64 %175, 4294967295
%180 = or i1 %178, %179
br i1 %180, label %227, label %181
181: ; preds = %173
%182 = getelementptr i8, i8* %0, i64 %168
%183 = add nsw i64 %168, %167
%184 = call i64 @llvm.umin.i64(i64 %167, i64 2)
%185 = sub nsw i64 %183, %184
%186 = getelementptr i8, i8* %38, i64 %185
%187 = add i32 %158, -1
%188 = zext i32 %187 to i64
%189 = add nuw nsw i64 %184, %188
%190 = sub nsw i64 %189, %167
%191 = getelementptr i8, i8* %159, i64 %190
%192 = getelementptr i8, i8* %159, i64 1
%193 = getelementptr i8, i8* %192, i64 %188
%194 = icmp ult i8* %182, %193
%195 = icmp ult i8* %191, %186
%196 = and i1 %194, %195
br i1 %196, label %227, label %197
197: ; preds = %181
%198 = and i64 %171, -32
%199 = add nsw i64 %198, %168
%200 = sub nsw i64 %167, %198
br label %201
201: ; preds = %201, %197
%202 = phi i64 [ 0, %197 ], [ %223, %201 ]
%203 = add i64 %202, %168
%204 = xor i64 %202, -1
%205 = add i64 %204, %167
%206 = and i64 %205, 4294967295
%207 = getelementptr inbounds i8, i8* %159, i64 %206
%208 = getelementptr inbounds i8, i8* %207, i64 -15
%209 = bitcast i8* %208 to <16 x i8>*
%210 = load <16 x i8>, <16 x i8>* %209
%211 = getelementptr inbounds i8, i8* %207, i64 -16
%212 = getelementptr inbounds i8, i8* %211, i64 -15
%213 = bitcast i8* %212 to <16 x i8>*
%214 = load <16 x i8>, <16 x i8>* %213
%215 = or <16 x i8> %210, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
%216 = shufflevector <16 x i8> %215, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%217 = or <16 x i8> %214, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
%218 = shufflevector <16 x i8> %217, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%219 = getelementptr inbounds i8, i8* %0, i64 %203
%220 = bitcast i8* %219 to <16 x i8>*
store <16 x i8> %216, <16 x i8>* %220
%221 = getelementptr inbounds i8, i8* %219, i64 16
%222 = bitcast i8* %221 to <16 x i8>*
store <16 x i8> %218, <16 x i8>* %222
%223 = add nuw i64 %202, 32
%224 = icmp eq i64 %223, %198
br i1 %224, label %225, label %201
225: ; preds = %201
%226 = icmp eq i64 %171, %198
br i1 %226, label %241, label %227
227: ; preds = %181, %173, %166, %225
%228 = phi i64 [ %168, %181 ], [ %168, %173 ], [ %168, %166 ], [ %199, %225 ]
%229 = phi i64 [ %167, %181 ], [ %167, %173 ], [ %167, %166 ], [ %200, %225 ]
br label %230
230: ; preds = %227, %230
%231 = phi i64 [ %238, %230 ], [ %228, %227 ]
%232 = phi i64 [ %233, %230 ], [ %229, %227 ]
%233 = add nsw i64 %232, -1
%234 = and i64 %233, 4294967295
%235 = getelementptr inbounds i8, i8* %159, i64 %234
%236 = load i8, i8* %235
%237 = or i8 %236, -128
%238 = add nsw i64 %231, 1
%239 = getelementptr inbounds i8, i8* %0, i64 %231
store i8 %237, i8* %239
%240 = icmp ugt i64 %232, 2
br i1 %240, label %230, label %241
241: ; preds = %230, %225
%242 = phi i64 [ %199, %225 ], [ %238, %230 ]
%243 = trunc i64 %242 to i32
br label %244
244: ; preds = %241, %164
%245 = phi i32 [ %45, %164 ], [ %243, %241 ]
%246 = load i8, i8* %159
%247 = add nsw i32 %245, 1
%248 = sext i32 %245 to i64
%249 = getelementptr inbounds i8, i8* %0, i64 %248
store i8 %246, i8* %249
br label %250
250: ; preds = %157, %244
%251 = phi i32 [ %247, %244 ], [ %161, %157 ]
%252 = icmp slt i32 %101, 1
br i1 %252, label %253, label %39
253: ; preds = %250
%254 = icmp eq i8* %159, %6
br i1 %254, label %257, label %255
255: ; preds = %253
%256 = call i32 @OPENSSL_free(i8* %159)
br label %257
257: ; preds = %255, %253
%258 = icmp eq i32* %100, null
br i1 %258, label %281, label %259
259: ; preds = %257
%260 = call i32 @BN_free(i32* %100)
br label %281
261: ; preds = %162, %103, %39, %59
%262 = phi i32* [ @ASN1_R_INVALID_DIGIT, %59 ], [ @ASN1_R_INVALID_SEPARATOR, %39 ], [ @ASN1_R_SECOND_NUMBER_TOO_LARGE, %103 ], [ @ASN1_R_BUFFER_TOO_SMALL, %162 ]
%263 = phi i8* [ %43, %59 ], [ %43, %39 ], [ %43, %103 ], [ %159, %162 ]
%264 = phi i32* [ %50, %59 ], [ %40, %39 ], [ %100, %103 ], [ %100, %162 ]
%265 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%266 = load i32, i32* %262
%267 = call i32 @ASN1err(i32 %265, i32 %266)
br label %268
268: ; preds = %108, %79, %83, %72, %75, %261
%269 = phi i8* [ %263, %261 ], [ %43, %75 ], [ %43, %72 ], [ %43, %83 ], [ %43, %79 ], [ %43, %108 ]
%270 = phi i32* [ %264, %261 ], [ %80, %79 ], [ %80, %83 ], [ null, %72 ], [ %76, %75 ], [ %100, %108 ]
%271 = icmp eq i8* %269, %6
br i1 %271, label %276, label %272
272: ; preds = %126, %268
%273 = phi i32* [ %270, %268 ], [ %100, %126 ]
%274 = phi i8* [ %269, %268 ], [ null, %126 ]
%275 = call i32 @OPENSSL_free(i8* %274)
br label %276
276: ; preds = %272, %268
%277 = phi i32* [ %273, %272 ], [ %270, %268 ]
%278 = icmp eq i32* %277, null
br i1 %278, label %281, label %279
279: ; preds = %276
%280 = call i32 @BN_free(i32* %277)
br label %281
281: ; preds = %27, %23, %19, %276, %279, %257, %259, %4
%282 = phi i32 [ %3, %4 ], [ %251, %259 ], [ %251, %257 ], [ 0, %279 ], [ 0, %276 ], [ 0, %19 ], [ 0, %23 ], [ 0, %27 ]
ret i32 %282
}