#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 ULONG_MAX;
int /*<<< orphan*/ free(char *);
char *malloc(int);
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)
          free(tmp);
        tmpsize = blsize + 32;
        tmp = 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)
    free(tmp);
  BN_free(bl);
  return (len);
err:
  if (tmp != ftmp)
    free(tmp);
  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    16f5 <a2d_ASN1_OBJECT+0x545>
cmpl   $0xffffffff,-0x24(%rbp)
jne    1213 <a2d_ASN1_OBJECT+0x63>
mov    -0x20(%rbp),%rdi
call   1080 <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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1050 <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   1040 <BN_set_word@plt>
cmp    $0x0,%eax
jne    1407 <a2d_ASN1_OBJECT+0x257>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
jmp    140c <a2d_ASN1_OBJECT+0x25c>
cmpl   $0x0,-0x38(%rbp)
je     144f <a2d_ASN1_OBJECT+0x29f>
mov    -0x78(%rbp),%rdi
mov    $0xa,%esi
call   10c0 <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   1090 <BN_add_word@plt>
cmp    $0x0,%eax
jne    144a <a2d_ASN1_OBJECT+0x29a>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
cmpl   $0x0,-0x38(%rbp)
je     14ce <a2d_ASN1_OBJECT+0x31e>
mov    -0x78(%rbp),%rdi
imul   $0x28,-0x2c(%rbp),%esi
call   1090 <BN_add_word@plt>
cmp    $0x0,%eax
jne    14c9 <a2d_ASN1_OBJECT+0x319>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1070 <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   1030 <free@plt>
mov    -0x7c(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%edi
call   10b0 <malloc@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    155c <a2d_ASN1_OBJECT+0x3ac>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   10d0 <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   1060 <ASN1err@plt>
jmp    16cb <a2d_ASN1_OBJECT+0x51b>
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   1030 <free@plt>
mov    -0x78(%rbp),%rdi
call   10a0 <BN_free@plt>
mov    -0x30(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16f5 <a2d_ASN1_OBJECT+0x545>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     16e5 <a2d_ASN1_OBJECT+0x535>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x78(%rbp),%rdi
call   10a0 <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    $0x58,%rsp
mov    %ecx,%r13d
test   %ecx,%ecx
je     1225 <a2d_ASN1_OBJECT+0x75>
mov    %rdx,%r15
mov    %esi,%ebx
mov    %rdi,%r14
cmp    $0xffffffff,%r13d
jne    11de <a2d_ASN1_OBJECT+0x2e>
mov    %r15,%rdi
call   1080 <strlen@plt>
mov    %eax,%r13d
movzbl (%r15),%ecx
lea    -0x30(%rcx),%eax
cmp    $0x2,%al
ja     1201 <a2d_ASN1_OBJECT+0x51>
cmp    $0x2,%r13d
jge    1237 <a2d_ASN1_OBJECT+0x87>
mov    0x2de2(%rip),%rax
mov    (%rax),%edi
mov    0x2dc1(%rip),%rax
jmp    1211 <a2d_ASN1_OBJECT+0x61>
mov    0x2dd0(%rip),%rax
mov    (%rax),%edi
mov    0x2da7(%rip),%rax
mov    (%rax),%esi
call   1060 <ASN1err@plt>
xor    %ebp,%ebp
xor    %r13d,%r13d
mov    %rbp,%rdi
call   10a0 <BN_free@plt>
mov    %r13d,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
je     1218 <a2d_ASN1_OBJECT+0x68>
mov    %ebx,0x1c(%rsp)
mov    %rcx,0x38(%rsp)
lea    -0x30(%rcx),%eax
lea    0x40(%rsp),%rdx
mov    %r13d,%r10d
add    $0xfffffffe,%r10d
mov    0x1(%r15),%r12b
add    $0x2,%r15
lea    0x0(,%rax,8),%ecx
lea    (%rcx,%rcx,4),%ecx
mov    %ecx,0x18(%rsp)
mov    %eax,%eax
shl    $0x3,%rax
lea    (%rax,%rax,4),%rax
mov    %rax,0x30(%rsp)
lea    0x1(%r14),%rax
mov    %rax,0x28(%rsp)
lea    0x10(%r14),%rax
mov    %rax,0x20(%rsp)
movl   $0x18,0xc(%rsp)
movdqa 0xd68(%rip),%xmm3
pxor   %xmm4,%xmm4
xor    %ebp,%ebp
xor    %r13d,%r13d
mov    %r14,0x10(%rsp)
movsbl %r12b,%eax
cmp    $0x2e,%eax
mov    %rdx,(%rsp)
je     12bc <a2d_ASN1_OBJECT+0x10c>
cmp    $0x20,%eax
jne    1744 <a2d_ASN1_OBJECT+0x594>
add    $0x1,%r15
add    $0x1,%r10d
xor    %r14d,%r14d
mov    %r15,%rax
xor    %ecx,%ecx
nopl   0x0(%rax)
mov    %rax,%r15
movsbl -0x1(%rax),%r12d
cmp    $0x20,%r12d
je     13db <a2d_ASN1_OBJECT+0x22b>
cmp    $0x2e,%r12b
je     13db <a2d_ASN1_OBJECT+0x22b>
lea    -0x3a(%r12),%eax
cmp    $0xf6,%al
jb     170e <a2d_ASN1_OBJECT+0x55e>
test   %ecx,%ecx
je     1310 <a2d_ASN1_OBJECT+0x160>
mov    %r12,%rbx
mov    %r10d,%r12d
jmp    137f <a2d_ASN1_OBJECT+0x1cf>
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,%r14
jae    134e <a2d_ASN1_OBJECT+0x19e>
lea    (%r14,%r14,4),%rax
mov    %r12,%rbx
mov    %r12d,%ecx
add    $0xffffffd0,%ecx
lea    (%rcx,%rax,2),%r14
xor    %ecx,%ecx
jmp    13c1 <a2d_ASN1_OBJECT+0x211>
mov    %r12,%rbx
mov    %r10d,%r12d
test   %rbp,%rbp
jne    136c <a2d_ASN1_OBJECT+0x1bc>
xor    %eax,%eax
call   1050 <BN_new@plt>
mov    %rax,%rbp
test   %rax,%rax
je     1768 <a2d_ASN1_OBJECT+0x5b8>
mov    %rbp,%rdi
mov    %r14,%rsi
call   1040 <BN_set_word@plt>
test   %eax,%eax
je     1725 <a2d_ASN1_OBJECT+0x575>
mov    $0xa,%esi
mov    %rbp,%rdi
call   10c0 <BN_mul_word@plt>
test   %eax,%eax
je     1725 <a2d_ASN1_OBJECT+0x575>
mov    %ebx,%esi
add    $0xffffffd0,%esi
mov    %rbp,%rdi
call   1090 <BN_add_word@plt>
mov    $0x1,%ecx
test   %eax,%eax
mov    (%rsp),%rdx
mov    %r12d,%r10d
movdqa 0xc49(%rip),%xmm3
pxor   %xmm4,%xmm4
je     1729 <a2d_ASN1_OBJECT+0x579>
lea    0x1(%r15),%rax
add    $0xffffffff,%r10d
cmp    $0x2,%r10d
jae    12d0 <a2d_ASN1_OBJECT+0x120>
xor    %r10d,%r10d
mov    %rbx,%r12
jmp    13df <a2d_ASN1_OBJECT+0x22f>
add    $0xfffffffe,%r10d
test   %r13d,%r13d
je     13ed <a2d_ASN1_OBJECT+0x23d>
test   %ecx,%ecx
jne    1424 <a2d_ASN1_OBJECT+0x274>
jmp    1513 <a2d_ASN1_OBJECT+0x363>
cmpb   $0x31,0x38(%rsp)
ja     13fe <a2d_ASN1_OBJECT+0x24e>
cmp    $0x27,%r14
ja     1779 <a2d_ASN1_OBJECT+0x5c9>
test   %ecx,%ecx
je     150e <a2d_ASN1_OBJECT+0x35e>
mov    %rbp,%rdi
mov    0x18(%rsp),%esi
mov    %r10d,%r14d
call   1090 <BN_add_word@plt>
mov    %r14d,%r10d
mov    (%rsp),%rdx
test   %eax,%eax
je     1729 <a2d_ASN1_OBJECT+0x579>
mov    %r10d,0x8(%rsp)
mov    %rbp,%rdi
call   1070 <BN_num_bits@plt>
mov    %eax,%r14d
lea    0x6(%r14),%eax
cltq
imul   $0xffffffff92492493,%rax,%rax
shr    $0x20,%rax
lea    (%rax,%r14,1),%ebx
add    $0x6,%ebx
mov    %ebx,%eax
shr    $0x1f,%eax
sar    $0x2,%ebx
add    %eax,%ebx
cmp    0xc(%rsp),%ebx
jle    1488 <a2d_ASN1_OBJECT+0x2d8>
mov    (%rsp),%rdi
lea    0x40(%rsp),%rax
cmp    %rax,%rdi
je     146f <a2d_ASN1_OBJECT+0x2bf>
call   1030 <free@plt>
lea    0x20(%rbx),%edi
mov    %edi,0xc(%rsp)
call   10b0 <malloc@plt>
mov    %rax,%rdx
test   %rax,%rax
jne    148c <a2d_ASN1_OBJECT+0x2dc>
jmp    1782 <a2d_ASN1_OBJECT+0x5d2>
mov    (%rsp),%rdx
mov    %rbx,%rax
add    $0xc,%r14d
xor    %ebx,%ebx
cmp    $0xd,%r14d
jae    14b6 <a2d_ASN1_OBJECT+0x306>
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%r10d
movdqa 0xb53(%rip),%xmm3
pxor   %xmm4,%xmm4
jmp    153f <a2d_ASN1_OBJECT+0x38f>
mov    %r12,(%rsp)
mov    %rbp,%r14
mov    %eax,%ebp
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    $0x80,%esi
mov    %rdx,%r12
call   10d0 <BN_div_word@plt>
mov    %r12,%rdx
mov    %al,(%r12,%rbx,1)
add    $0x1,%rbx
cmp    %ebx,%ebp
jne    14d0 <a2d_ASN1_OBJECT+0x320>
mov    %r14,%rbp
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%r10d
movdqa 0xafc(%rip),%xmm3
pxor   %xmm4,%xmm4
mov    (%rsp),%r12
jmp    153f <a2d_ASN1_OBJECT+0x38f>
add    0x30(%rsp),%r14
xor    %ebx,%ebx
mov    %r14,%rax
nopl   0x0(%rax,%rax,1)
mov    %r14d,%ecx
and    $0x7f,%cl
mov    %cl,(%rdx,%rbx,1)
add    $0x1,%rbx
shr    $0x7,%rax
cmp    $0x7f,%r14
mov    %rax,%r14
ja     1520 <a2d_ASN1_OBJECT+0x370>
mov    0x10(%rsp),%r14
lea    (%rbx,%r13,1),%eax
test   %r14,%r14
je     15c6 <a2d_ASN1_OBJECT+0x416>
cmp    0x1c(%rsp),%eax
jg     176c <a2d_ASN1_OBJECT+0x5bc>
cmp    $0x2,%ebx
jl     15ab <a2d_ASN1_OBJECT+0x3fb>
mov    %ebx,%eax
movslq %r13d,%rcx
mov    %rax,%rsi
sub    $0x2,%rsi
mov    $0x0,%r9d
cmovae %rsi,%r9
add    $0x1,%r9
cmp    $0x20,%r9
jae    15d7 <a2d_ASN1_OBJECT+0x427>
mov    %rcx,%r13
mov    %rax,%rsi
add    $0x1,%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    -0x2(%rsi),%eax
movzbl (%rdx,%rax,1),%eax
or     $0x80,%al
mov    %al,(%r14,%r13,1)
add    $0x1,%r13
add    $0xffffffffffffffff,%rsi
cmp    $0x2,%rsi
ja     1590 <a2d_ASN1_OBJECT+0x3e0>
mov    (%rdx),%al
movslq %r13d,%rcx
add    $0x1,%r13d
mov    %al,(%r14,%rcx,1)
test   %r10d,%r10d
jg     12a6 <a2d_ASN1_OBJECT+0xf6>
jmp    174d <a2d_ASN1_OBJECT+0x59d>
mov    %eax,%r13d
test   %r10d,%r10d
jg     12a6 <a2d_ASN1_OBJECT+0xf6>
jmp    174d <a2d_ASN1_OBJECT+0x59d>
mov    %rax,%rdi
sub    $0x2,%rdi
mov    $0x0,%r8d
cmovae %rdi,%r8
mov    %eax,%edi
sub    $0x2,%edi
mov    $0x0,%esi
cmovb  %esi,%edi
add    $0xffffffff,%ebx
cmp    %edi,%ebx
jb     1577 <a2d_ASN1_OBJECT+0x3c7>
shr    $0x20,%r8
jne    1577 <a2d_ASN1_OBJECT+0x3c7>
mov    %rbp,%r8
lea    (%r14,%rcx,1),%rdi
cmp    $0x2,%rax
mov    $0x2,%esi
cmovb  %rax,%rsi
lea    (%rdx,%rbx,1),%rbp
add    $0x1,%rbp
cmp    %rbp,%rdi
jae    1653 <a2d_ASN1_OBJECT+0x4a3>
lea    (%rcx,%rax,1),%rdi
sub    %rsi,%rdi
add    0x28(%rsp),%rdi
add    %rsi,%rbx
sub    %rax,%rbx
add    %rdx,%rbx
cmp    %rdi,%rbx
jae    1653 <a2d_ASN1_OBJECT+0x4a3>
mov    %rcx,%r13
mov    %rax,%rsi
mov    %r8,%rbp
jmp    157d <a2d_ASN1_OBJECT+0x3cd>
mov    %r9,%rdi
and    $0xffffffffffffffe0,%rdi
lea    (%rdi,%rcx,1),%r13
mov    %rax,%rsi
sub    %rdi,%rsi
add    $0xffffffffffffffff,%rax
add    0x20(%rsp),%rcx
xor    %ebx,%ebx
mov    %eax,%ebp
movdqu -0x1f(%rdx,%rbp,1),%xmm0
movdqu -0xf(%rdx,%rbp,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(%rcx,%rbx,1)
movdqu %xmm0,(%rcx,%rbx,1)
add    $0x20,%rbx
add    $0xffffffffffffffe0,%rax
cmp    %rbx,%rdi
jne    166f <a2d_ASN1_OBJECT+0x4bf>
cmp    %rdi,%r9
mov    %r8,%rbp
jne    157d <a2d_ASN1_OBJECT+0x3cd>
jmp    15ab <a2d_ASN1_OBJECT+0x3fb>
mov    0x2893(%rip),%rcx
mov    0x28bc(%rip),%rax
mov    (%rax),%edi
mov    (%rcx),%esi
call   1060 <ASN1err@plt>
mov    (%rsp),%rdx
lea    0x40(%rsp),%rax
cmp    %rax,%rdx
je     121a <a2d_ASN1_OBJECT+0x6a>
mov    %rdx,%rdi
call   1030 <free@plt>
jmp    121a <a2d_ASN1_OBJECT+0x6a>
mov    0x287d(%rip),%rcx
jmp    1715 <a2d_ASN1_OBJECT+0x565>
lea    0x40(%rsp),%rax
cmp    %rax,%rdx
je     121d <a2d_ASN1_OBJECT+0x6d>
mov    %rdx,%rdi
call   1030 <free@plt>
jmp    121d <a2d_ASN1_OBJECT+0x6d>
xor    %ebp,%ebp
jmp    1725 <a2d_ASN1_OBJECT+0x575>
mov    %rdx,(%rsp)
mov    0x2869(%rip),%rcx
jmp    1715 <a2d_ASN1_OBJECT+0x565>
mov    0x2870(%rip),%rcx
jmp    1715 <a2d_ASN1_OBJECT+0x565>
xor    %edx,%edx
jmp    1737 <a2d_ASN1_OBJECT+0x587>

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 %317
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 %307
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 %307
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 %307
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 %307
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 %307
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 %307
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 %307
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 %307
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 @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* @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 %307
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 %307
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 @free(i8* %301)
br label %303
303: ; preds = %300, %296
%304 = load i32*, i32** %20
%305 = call i32 @BN_free(i32* %304)
%306 = load i32, i32* %12
store i32 %306, i32* %5
br label %317
307: ; preds = %259, %214, %179, %166, %147, %132, %105, %77, %56, %49
%308 = load i8*, i8** %16
%309 = getelementptr inbounds [24 x i8], [24 x i8]* %15, i64 0, i64 0
%310 = icmp ne i8* %308, %309
br i1 %310, label %311, label %314
311: ; preds = %307
%312 = load i8*, i8** %16
%313 = call i32 @free(i8* %312)
br label %314
314: ; preds = %311, %307
%315 = load i32*, i32** %20
%316 = call i32 @BN_free(i32* %315)
store i32 0, i32* %5
br label %317
317: ; preds = %314, %303, %25
%318 = load i32, i32* %5
ret i32 %318
}

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 %276
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 %272
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 %272
27: ; preds = %15
%28 = icmp eq i32 %10, 2
br i1 %28, label %272, 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 %257 [
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 %257, 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 %264, 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 %264, 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 %264, 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 %264, 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 %257, 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 %264, 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 @free(i8* %43)
br label %126
126: ; preds = %124, %122
%127 = add nsw i32 %120, 32
%128 = call i8* @malloc(i32 %127)
%129 = icmp eq i8* %128, null
br i1 %129, label %268, 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 %257, 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 %272, label %255
255: ; preds = %253
%256 = call i32 @free(i8* %159)
br label %272
257: ; preds = %162, %103, %39, %59
%258 = 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 ]
%259 = phi i8* [ %43, %59 ], [ %43, %39 ], [ %43, %103 ], [ %159, %162 ]
%260 = phi i32* [ %50, %59 ], [ %40, %39 ], [ %100, %103 ], [ %100, %162 ]
%261 = load i32, i32* @ASN1_F_A2D_ASN1_OBJECT
%262 = load i32, i32* %258
%263 = call i32 @ASN1err(i32 %261, i32 %262)
br label %264
264: ; preds = %108, %79, %83, %72, %75, %257
%265 = phi i8* [ %259, %257 ], [ %43, %75 ], [ %43, %72 ], [ %43, %83 ], [ %43, %79 ], [ %43, %108 ]
%266 = phi i32* [ %260, %257 ], [ %80, %79 ], [ %80, %83 ], [ null, %72 ], [ %76, %75 ], [ %100, %108 ]
%267 = icmp eq i8* %265, %6
br i1 %267, label %272, label %268
268: ; preds = %126, %264
%269 = phi i32* [ %266, %264 ], [ %100, %126 ]
%270 = phi i8* [ %265, %264 ], [ null, %126 ]
%271 = call i32 @free(i8* %270)
br label %272
272: ; preds = %264, %268, %23, %19, %253, %255, %27
%273 = phi i32* [ %100, %255 ], [ %100, %253 ], [ null, %27 ], [ %269, %268 ], [ %266, %264 ], [ null, %23 ], [ null, %19 ]
%274 = phi i32 [ %251, %255 ], [ %251, %253 ], [ 0, %27 ], [ 0, %268 ], [ 0, %264 ], [ 0, %23 ], [ 0, %19 ]
%275 = call i32 @BN_free(i32* %273)
br label %276
276: ; preds = %272, %4
%277 = phi i32 [ %3, %4 ], [ %274, %272 ]
ret i32 %277
}