#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_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*/ ASN1error(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 {
    ASN1error(ASN1_R_FIRST_NUM_TOO_LARGE);
    goto err;
  }
  if (num <= 0) {
    ASN1error(ASN1_R_MISSING_SECOND_NUMBER);
    goto err;
  }
  c = *(p++);
  num--;
  for (;;) {
    if (num <= 0)
      break;
    if ((c != '.') && (c != ' ')) {
      ASN1error(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')) {
        ASN1error(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)) {
        ASN1error(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) {
        ASN1error(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    16bf <a2d_ASN1_OBJECT+0x50f>
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    1273 <a2d_ASN1_OBJECT+0xc3>
mov    0x2d59(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
cmpl   $0x0,-0x24(%rbp)
jg     1290 <a2d_ASN1_OBJECT+0xe0>
mov    0x2d44(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
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     12bd <a2d_ASN1_OBJECT+0x10d>
jmp    1667 <a2d_ASN1_OBJECT+0x4b7>
cmpl   $0x2e,-0x34(%rbp)
je     12e4 <a2d_ASN1_OBJECT+0x134>
cmpl   $0x20,-0x34(%rbp)
je     12e4 <a2d_ASN1_OBJECT+0x134>
mov    0x2cf8(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
movq   $0x0,-0x70(%rbp)
movl   $0x0,-0x38(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     1302 <a2d_ASN1_OBJECT+0x152>
jmp    1445 <a2d_ASN1_OBJECT+0x295>
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     1334 <a2d_ASN1_OBJECT+0x184>
cmpl   $0x2e,-0x34(%rbp)
jne    1339 <a2d_ASN1_OBJECT+0x189>
jmp    1445 <a2d_ASN1_OBJECT+0x295>
cmpl   $0x30,-0x34(%rbp)
jl     134d <a2d_ASN1_OBJECT+0x19d>
cmpl   $0x39,-0x34(%rbp)
jle    1360 <a2d_ASN1_OBJECT+0x1b0>
mov    0x2c5c(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
cmpl   $0x0,-0x38(%rbp)
jne    13e8 <a2d_ASN1_OBJECT+0x238>
mov    -0x70(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    0x2c2c(%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     13e8 <a2d_ASN1_OBJECT+0x238>
movl   $0x1,-0x38(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    13bd <a2d_ASN1_OBJECT+0x20d>
mov    $0x0,%al
call   1050 <BN_new@plt>
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
je     13de <a2d_ASN1_OBJECT+0x22e>
mov    -0x78(%rbp),%rdi
mov    -0x70(%rbp),%rsi
call   1040 <BN_set_word@plt>
cmp    $0x0,%eax
jne    13e3 <a2d_ASN1_OBJECT+0x233>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
jmp    13e8 <a2d_ASN1_OBJECT+0x238>
cmpl   $0x0,-0x38(%rbp)
je     142b <a2d_ASN1_OBJECT+0x27b>
mov    -0x78(%rbp),%rdi
mov    $0xa,%esi
call   10b0 <BN_mul_word@plt>
cmp    $0x0,%eax
je     1421 <a2d_ASN1_OBJECT+0x271>
mov    -0x78(%rbp),%rdi
mov    -0x34(%rbp),%esi
sub    $0x30,%esi
call   1080 <BN_add_word@plt>
cmp    $0x0,%eax
jne    1426 <a2d_ASN1_OBJECT+0x276>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
jmp    1440 <a2d_ASN1_OBJECT+0x290>
imul   $0xa,-0x70(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x30,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
jmp    12f3 <a2d_ASN1_OBJECT+0x143>
cmpl   $0x0,-0x30(%rbp)
jne    14b6 <a2d_ASN1_OBJECT+0x306>
cmpl   $0x2,-0x2c(%rbp)
jge    1477 <a2d_ASN1_OBJECT+0x2c7>
cmpq   $0x28,-0x70(%rbp)
jb     1477 <a2d_ASN1_OBJECT+0x2c7>
mov    0x2b85(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
cmpl   $0x0,-0x38(%rbp)
je     14a1 <a2d_ASN1_OBJECT+0x2f1>
mov    -0x78(%rbp),%rdi
imul   $0x28,-0x2c(%rbp),%esi
call   1080 <BN_add_word@plt>
cmp    $0x0,%eax
jne    149c <a2d_ASN1_OBJECT+0x2ec>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
jmp    14b1 <a2d_ASN1_OBJECT+0x301>
movslq -0x2c(%rbp),%rax
imul   $0x28,%rax,%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
jmp    14b6 <a2d_ASN1_OBJECT+0x306>
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x38(%rbp)
je     157c <a2d_ASN1_OBJECT+0x3cc>
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    1534 <a2d_ASN1_OBJECT+0x384>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     150a <a2d_ASN1_OBJECT+0x35a>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x7c(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%edi
call   10a0 <malloc@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    152f <a2d_ASN1_OBJECT+0x37f>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
jmp    1534 <a2d_ASN1_OBJECT+0x384>
jmp    1539 <a2d_ASN1_OBJECT+0x389>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x7c(%rbp)
cmp    $0x0,%eax
je     1577 <a2d_ASN1_OBJECT+0x3c7>
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    1539 <a2d_ASN1_OBJECT+0x389>
jmp    15c8 <a2d_ASN1_OBJECT+0x418>
jmp    1581 <a2d_ASN1_OBJECT+0x3d1>
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    15be <a2d_ASN1_OBJECT+0x40e>
jmp    15c3 <a2d_ASN1_OBJECT+0x413>
jmp    1581 <a2d_ASN1_OBJECT+0x3d1>
jmp    15c8 <a2d_ASN1_OBJECT+0x418>
cmpq   $0x0,-0x10(%rbp)
je     1659 <a2d_ASN1_OBJECT+0x4a9>
mov    -0x30(%rbp),%eax
add    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jle    15f5 <a2d_ASN1_OBJECT+0x445>
mov    0x29f7(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
jmp    1695 <a2d_ASN1_OBJECT+0x4e5>
jmp    15fa <a2d_ASN1_OBJECT+0x44a>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jle    1639 <a2d_ASN1_OBJECT+0x489>
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    15fa <a2d_ASN1_OBJECT+0x44a>
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    1662 <a2d_ASN1_OBJECT+0x4b2>
mov    -0x28(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    12ae <a2d_ASN1_OBJECT+0xfe>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     1681 <a2d_ASN1_OBJECT+0x4d1>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x78(%rbp),%rdi
call   1090 <BN_free@plt>
mov    -0x30(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16bf <a2d_ASN1_OBJECT+0x50f>
mov    -0x58(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
je     16af <a2d_ASN1_OBJECT+0x4ff>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
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    $0x58,%rsp
mov    %ecx,%r13d
test   %ecx,%ecx
je     1213 <a2d_ASN1_OBJECT+0x63>
mov    %rdx,%r15
mov    %esi,%ebx
mov    %rdi,%r14
cmp    $0xffffffff,%r13d
jne    11de <a2d_ASN1_OBJECT+0x2e>
mov    %r15,%rdi
call   1070 <strlen@plt>
mov    %eax,%r13d
movzbl (%r15),%ecx
lea    -0x30(%rcx),%eax
cmp    $0x2,%al
ja     11f8 <a2d_ASN1_OBJECT+0x48>
cmp    $0x2,%r13d
jge    1225 <a2d_ASN1_OBJECT+0x75>
mov    0x2dd2(%rip),%rax
jmp    11ff <a2d_ASN1_OBJECT+0x4f>
mov    0x2dc1(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
xor    %ebp,%ebp
xor    %r13d,%r13d
mov    %rbp,%rdi
call   1090 <BN_free@plt>
mov    %r13d,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
je     1206 <a2d_ASN1_OBJECT+0x56>
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 0xd7a(%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     12aa <a2d_ASN1_OBJECT+0xfa>
cmp    $0x20,%eax
jne    172b <a2d_ASN1_OBJECT+0x57b>
add    $0x1,%r15
add    $0x1,%r10d
xor    %r14d,%r14d
mov    %r15,%rax
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %rax,%r15
movsbl -0x1(%rax),%r12d
cmp    $0x20,%r12d
je     13cb <a2d_ASN1_OBJECT+0x21b>
cmp    $0x2e,%r12b
je     13cb <a2d_ASN1_OBJECT+0x21b>
lea    -0x3a(%r12),%eax
cmp    $0xf6,%al
jb     16fe <a2d_ASN1_OBJECT+0x54e>
test   %ecx,%ecx
je     1300 <a2d_ASN1_OBJECT+0x150>
mov    %r12,%rbx
mov    %r10d,%r12d
jmp    136f <a2d_ASN1_OBJECT+0x1bf>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x2ca1(%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    133e <a2d_ASN1_OBJECT+0x18e>
lea    (%r14,%r14,4),%rax
mov    %r12,%rbx
mov    %r12d,%ecx
add    $0xffffffd0,%ecx
lea    (%rcx,%rax,2),%r14
xor    %ecx,%ecx
jmp    13b1 <a2d_ASN1_OBJECT+0x201>
mov    %r12,%rbx
mov    %r10d,%r12d
test   %rbp,%rbp
jne    135c <a2d_ASN1_OBJECT+0x1ac>
xor    %eax,%eax
call   1050 <BN_new@plt>
mov    %rax,%rbp
test   %rax,%rax
je     174f <a2d_ASN1_OBJECT+0x59f>
mov    %rbp,%rdi
mov    %r14,%rsi
call   1040 <BN_set_word@plt>
test   %eax,%eax
je     170c <a2d_ASN1_OBJECT+0x55c>
mov    $0xa,%esi
mov    %rbp,%rdi
call   10b0 <BN_mul_word@plt>
test   %eax,%eax
je     170c <a2d_ASN1_OBJECT+0x55c>
mov    %ebx,%esi
add    $0xffffffd0,%esi
mov    %rbp,%rdi
call   1080 <BN_add_word@plt>
mov    $0x1,%ecx
test   %eax,%eax
mov    (%rsp),%rdx
mov    %r12d,%r10d
movdqa 0xc59(%rip),%xmm3
pxor   %xmm4,%xmm4
je     1710 <a2d_ASN1_OBJECT+0x560>
lea    0x1(%r15),%rax
add    $0xffffffff,%r10d
cmp    $0x2,%r10d
jae    12c0 <a2d_ASN1_OBJECT+0x110>
xor    %r10d,%r10d
mov    %rbx,%r12
jmp    13cf <a2d_ASN1_OBJECT+0x21f>
add    $0xfffffffe,%r10d
test   %r13d,%r13d
je     13dd <a2d_ASN1_OBJECT+0x22d>
test   %ecx,%ecx
jne    1414 <a2d_ASN1_OBJECT+0x264>
jmp    1503 <a2d_ASN1_OBJECT+0x353>
cmpb   $0x31,0x38(%rsp)
ja     13ee <a2d_ASN1_OBJECT+0x23e>
cmp    $0x27,%r14
ja     1760 <a2d_ASN1_OBJECT+0x5b0>
test   %ecx,%ecx
je     14fe <a2d_ASN1_OBJECT+0x34e>
mov    %rbp,%rdi
mov    0x18(%rsp),%esi
mov    %r10d,%r14d
call   1080 <BN_add_word@plt>
mov    %r14d,%r10d
mov    (%rsp),%rdx
test   %eax,%eax
je     1710 <a2d_ASN1_OBJECT+0x560>
mov    %r10d,0x8(%rsp)
mov    %rbp,%rdi
call   1060 <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    1478 <a2d_ASN1_OBJECT+0x2c8>
mov    (%rsp),%rdi
lea    0x40(%rsp),%rax
cmp    %rax,%rdi
je     145f <a2d_ASN1_OBJECT+0x2af>
call   1030 <free@plt>
lea    0x20(%rbx),%edi
mov    %edi,0xc(%rsp)
call   10a0 <malloc@plt>
mov    %rax,%rdx
test   %rax,%rax
jne    147c <a2d_ASN1_OBJECT+0x2cc>
jmp    1769 <a2d_ASN1_OBJECT+0x5b9>
mov    (%rsp),%rdx
mov    %rbx,%rax
add    $0xc,%r14d
xor    %ebx,%ebx
cmp    $0xd,%r14d
jae    14a6 <a2d_ASN1_OBJECT+0x2f6>
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%r10d
movdqa 0xb63(%rip),%xmm3
pxor   %xmm4,%xmm4
jmp    152f <a2d_ASN1_OBJECT+0x37f>
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   10c0 <BN_div_word@plt>
mov    %r12,%rdx
mov    %al,(%r12,%rbx,1)
add    $0x1,%rbx
cmp    %ebx,%ebp
jne    14c0 <a2d_ASN1_OBJECT+0x310>
mov    %r14,%rbp
mov    0x10(%rsp),%r14
mov    0x8(%rsp),%r10d
movdqa 0xb0c(%rip),%xmm3
pxor   %xmm4,%xmm4
mov    (%rsp),%r12
jmp    152f <a2d_ASN1_OBJECT+0x37f>
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     1510 <a2d_ASN1_OBJECT+0x360>
mov    0x10(%rsp),%r14
lea    (%rbx,%r13,1),%eax
test   %r14,%r14
je     15b6 <a2d_ASN1_OBJECT+0x406>
cmp    0x1c(%rsp),%eax
jg     1753 <a2d_ASN1_OBJECT+0x5a3>
cmp    $0x2,%ebx
jl     159b <a2d_ASN1_OBJECT+0x3eb>
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    15c7 <a2d_ASN1_OBJECT+0x417>
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     1580 <a2d_ASN1_OBJECT+0x3d0>
mov    (%rdx),%al
movslq %r13d,%rcx
add    $0x1,%r13d
mov    %al,(%r14,%rcx,1)
test   %r10d,%r10d
jg     1294 <a2d_ASN1_OBJECT+0xe4>
jmp    1734 <a2d_ASN1_OBJECT+0x584>
mov    %eax,%r13d
test   %r10d,%r10d
jg     1294 <a2d_ASN1_OBJECT+0xe4>
jmp    1734 <a2d_ASN1_OBJECT+0x584>
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     1567 <a2d_ASN1_OBJECT+0x3b7>
shr    $0x20,%r8
jne    1567 <a2d_ASN1_OBJECT+0x3b7>
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    1643 <a2d_ASN1_OBJECT+0x493>
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    1643 <a2d_ASN1_OBJECT+0x493>
mov    %rcx,%r13
mov    %rax,%rsi
mov    %r8,%rbp
jmp    156d <a2d_ASN1_OBJECT+0x3bd>
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    165f <a2d_ASN1_OBJECT+0x4af>
cmp    %rdi,%r9
mov    %r8,%rbp
jne    156d <a2d_ASN1_OBJECT+0x3bd>
jmp    159b <a2d_ASN1_OBJECT+0x3eb>
mov    0x28ab(%rip),%rax
mov    (%rax),%edi
call   10d0 <ASN1error@plt>
mov    (%rsp),%rdx
lea    0x40(%rsp),%rax
cmp    %rax,%rdx
je     1208 <a2d_ASN1_OBJECT+0x58>
mov    %rdx,%rdi
call   1030 <free@plt>
jmp    1208 <a2d_ASN1_OBJECT+0x58>
mov    0x289e(%rip),%rax
jmp    1705 <a2d_ASN1_OBJECT+0x555>
lea    0x40(%rsp),%rax
cmp    %rax,%rdx
je     120b <a2d_ASN1_OBJECT+0x5b>
mov    %rdx,%rdi
call   1030 <free@plt>
jmp    120b <a2d_ASN1_OBJECT+0x5b>
xor    %ebp,%ebp
jmp    170c <a2d_ASN1_OBJECT+0x55c>
mov    %rdx,(%rsp)
mov    0x2882(%rip),%rax
jmp    1705 <a2d_ASN1_OBJECT+0x555>
mov    0x2889(%rip),%rax
jmp    1705 <a2d_ASN1_OBJECT+0x555>
xor    %edx,%edx
jmp    171e <a2d_ASN1_OBJECT+0x56e>

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

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