#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 */

/* Variables and functions */
int atodec(char *);
int decimal(int, char *, int, int);
int hex(int, char *, int, int);
scalar_t__ isdigit(char);
int /*<<< orphan*/ memcpy(char *, char *, int);
int number(int, char *, int, int);
int outchar(char, char *, int);
int outstring(char *, int, char *, int, int);
int /*<<< orphan*/ read_string(char *, int);
int strlen(char *);
int /*<<< orphan*/ sys_write(char *, int);
int vprintf(char *p, char *form, int a, int b, int *arg, int _opt) {
  int i, n, off, argc, value, num, numindex, opt, inoff;
  char flag, numbuf[5], *ptr, *inptr;
  flag = 0;
  off = 0;
  argc = -2;
  n = strlen(form);
  for (i = 0; i < n; i++) {
    if (flag & 1) {
      if (argc == -2)
        value = a;
      else if (argc == -1)
        value = b;
      else
        value = arg[argc];
    }
    if (form[i] == '%') {
      if (i > 0 && form[i - 1] == '%') {
        flag &= ~1;
        if (!(_opt & 0x100000))
          off = outchar(form[i], p, off);
      } else {
        flag |= 1;
        numindex = -1;
        num = 0;
        opt = _opt;
      }
    } else if ((flag & 1) && (form[i] == 'd' || form[i] == 'i')) {
      argc++;
      off = decimal(value, p, off, num | opt);
      flag &= ~1;
    } else if ((flag & 1) && form[i] == 'u') {
      argc++;
      off = number(value, p, off, num | opt);
      flag &= ~1;
    } else if ((flag & 1) && (form[i] == 'x' || form[i] == 'X')) {
      argc++;
      off = hex(value, p, off, num | opt);
      flag &= ~1;
    } else if ((flag & 1) && form[i] == 's') {
      argc++;
      ptr = (char *)value;
      if (opt & 0x100000) {
        if (p == (char *)-1) {
          if (!(opt & 0x10000))
            num = -1;
          read_string(ptr, num);
          sys_write("\n", 1);
        } else if (p > (char *)255) {
          while (p[off] <= ' ')
            off++;
          inptr = &(p[off]);
          inoff = off;
          while (p[off] > ' ')
            off++;
          memcpy(ptr, inptr, off - inoff);
          ptr[off - inoff] = 0;
        }
      } else {
        off = outstring(ptr, strlen(ptr), p, off, num | opt);
      }
      flag &= ~1;
    } else if ((flag & 1) && form[i] == 'c') {
      argc++;
      if (opt & 0x100000) {
        ptr = (char *)value;
        if (p == (char *)-1) {
          *ptr = 0;
          read_string(ptr, 1);
          sys_write("\n", 1);
        } else {
          while (p[off] <= ' ')
            off++;
          *ptr = p[off++];
        }
      } else {
        off = outchar((char)value, p, off);
      }
      flag &= ~1;
    } else if ((flag & 1) && isdigit(form[i])) {
      if (numindex > 3)
        flag &= ~1;
      else {
        numbuf[++numindex] = form[i];
        numbuf[numindex + 1] = 0;
        num = atodec(numbuf);
        opt |= 0x10000;
        if (form[i] == '0')
          opt |= 0x20000;
      }
    } else if ((flag & 1) && (form[i] == '.' || form[i] == ' ' ||
                              form[i] == 'l' || form[i] == '-')) {
      if (form[i] == '.')
        opt |= 0x40000;
      if (form[i] == '-')
        opt |= 0x80000;
    } else {
      flag &= ~1;
      if (!(_opt & 0x100000))
        off = outchar(form[i], p, off);
    }
  }
  return off;
}


x86 assembly (clang, -O0):
<vprintf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movb   $0x0,-0x49(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0xfffffffe,-0x34(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1836 <vprintf+0x686>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1251 <vprintf+0xa1>
cmpl   $0xfffffffe,-0x34(%rbp)
jne    1224 <vprintf+0x74>
mov    -0x14(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    124c <vprintf+0x9c>
cmpl   $0xffffffff,-0x34(%rbp)
jne    1239 <vprintf+0x89>
mov    -0x18(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1247 <vprintf+0x97>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
jmp    124c <vprintf+0x9c>
jmp    1251 <vprintf+0xa1>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    12ea <vprintf+0x13a>
cmpl   $0x0,-0x28(%rbp)
jle    12c7 <vprintf+0x117>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    12c7 <vprintf+0x117>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
mov    -0x24(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
jne    12c2 <vprintf+0x112>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
movsbl %al,%edi
call   10a0 <outchar@plt>
mov    %eax,-0x30(%rbp)
jmp    12e5 <vprintf+0x135>
movsbl -0x49(%rbp),%eax
or     $0x1,%eax
mov    %al,-0x49(%rbp)
movl   $0xffffffff,-0x40(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    1823 <vprintf+0x673>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1354 <vprintf+0x1a4>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x64,%eax
je     1324 <vprintf+0x174>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x69,%eax
jne    1354 <vprintf+0x1a4>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%edi
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
mov    -0x3c(%rbp),%ecx
or     -0x44(%rbp),%ecx
call   1080 <decimal@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    181e <vprintf+0x66e>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     13a9 <vprintf+0x1f9>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x75,%eax
jne    13a9 <vprintf+0x1f9>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%edi
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
mov    -0x3c(%rbp),%ecx
or     -0x44(%rbp),%ecx
call   1060 <number@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    1819 <vprintf+0x669>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1413 <vprintf+0x263>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x78,%eax
je     13e3 <vprintf+0x233>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x58,%eax
jne    1413 <vprintf+0x263>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%edi
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
mov    -0x3c(%rbp),%ecx
or     -0x44(%rbp),%ecx
call   10c0 <hex@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    1814 <vprintf+0x664>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     157f <vprintf+0x3cf>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x73,%eax
jne    157f <vprintf+0x3cf>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
movslq -0x38(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x44(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
je     1542 <vprintf+0x392>
mov    $0xffffffffffffffff,%rax
cmp    %rax,-0x8(%rbp)
jne    14a5 <vprintf+0x2f5>
mov    -0x44(%rbp),%eax
and    $0x10000,%eax
cmp    $0x0,%eax
jne    1483 <vprintf+0x2d3>
movl   $0xffffffff,-0x3c(%rbp)
mov    -0x58(%rbp),%rdi
mov    -0x3c(%rbp),%esi
call   10d0 <read_string@plt>
lea    0xb6a(%rip),%rdi
mov    $0x1,%esi
call   1090 <sys_write@plt>
jmp    153d <vprintf+0x38d>
mov    $0xff,%eax
cmp    %rax,-0x8(%rbp)
jbe    1538 <vprintf+0x388>
jmp    14b9 <vprintf+0x309>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jg     14dc <vprintf+0x32c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    14b9 <vprintf+0x309>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jle    1514 <vprintf+0x364>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    14f1 <vprintf+0x341>
mov    -0x58(%rbp),%rdi
mov    -0x60(%rbp),%rsi
mov    -0x30(%rbp),%edx
sub    -0x48(%rbp),%edx
call   1050 <memcpy@plt>
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    153d <vprintf+0x38d>
jmp    1570 <vprintf+0x3c0>
mov    -0x58(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x58(%rbp),%rdi
call   1040 <strlen@plt>
mov    -0x68(%rbp),%rdi
mov    %eax,%esi
mov    -0x8(%rbp),%rdx
mov    -0x30(%rbp),%ecx
mov    -0x3c(%rbp),%r8d
or     -0x44(%rbp),%r8d
call   10b0 <outstring@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    180f <vprintf+0x65f>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     166e <vprintf+0x4be>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x63,%eax
jne    166e <vprintf+0x4be>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x44(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
je     164a <vprintf+0x49a>
movslq -0x38(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    $0xffffffffffffffff,%rax
cmp    %rax,-0x8(%rbp)
jne    1602 <vprintf+0x452>
mov    -0x58(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x1,%esi
call   10d0 <read_string@plt>
lea    0xa0d(%rip),%rdi
mov    $0x1,%esi
call   1090 <sys_write@plt>
jmp    1645 <vprintf+0x495>
jmp    1607 <vprintf+0x457>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jg     162a <vprintf+0x47a>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1607 <vprintf+0x457>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x58(%rbp),%rax
mov    %cl,(%rax)
jmp    165f <vprintf+0x4af>
mov    -0x38(%rbp),%eax
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
movsbl %al,%edi
call   10a0 <outchar@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    180a <vprintf+0x65a>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     171a <vprintf+0x56a>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     171a <vprintf+0x56a>
cmpl   $0x3,-0x40(%rbp)
jle    16b2 <vprintf+0x502>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    1715 <vprintf+0x565>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
cltq
mov    %cl,-0x4e(%rbp,%rax,1)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
cltq
movb   $0x0,-0x4e(%rbp,%rax,1)
lea    -0x4e(%rbp),%rdi
call   1070 <atodec@plt>
mov    %eax,-0x3c(%rbp)
mov    -0x44(%rbp),%eax
or     $0x10000,%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jne    1710 <vprintf+0x560>
mov    -0x44(%rbp),%eax
or     $0x20000,%eax
mov    %eax,-0x44(%rbp)
jmp    1715 <vprintf+0x565>
jmp    1805 <vprintf+0x655>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     17c3 <vprintf+0x613>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     177e <vprintf+0x5ce>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     177e <vprintf+0x5ce>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6c,%eax
je     177e <vprintf+0x5ce>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    17c3 <vprintf+0x613>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    179e <vprintf+0x5ee>
mov    -0x44(%rbp),%eax
or     $0x40000,%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    17be <vprintf+0x60e>
mov    -0x44(%rbp),%eax
or     $0x80000,%eax
mov    %eax,-0x44(%rbp)
jmp    1800 <vprintf+0x650>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
mov    -0x24(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
jne    17fb <vprintf+0x64b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    -0x8(%rbp),%rsi
mov    -0x30(%rbp),%edx
movsbl %al,%edi
call   10a0 <outchar@plt>
mov    %eax,-0x30(%rbp)
jmp    1800 <vprintf+0x650>
jmp    1805 <vprintf+0x655>
jmp    180a <vprintf+0x65a>
jmp    180f <vprintf+0x65f>
jmp    1814 <vprintf+0x664>
jmp    1819 <vprintf+0x669>
jmp    181e <vprintf+0x66e>
jmp    1823 <vprintf+0x673>
jmp    1828 <vprintf+0x678>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    11f3 <vprintf+0x43>
mov    -0x30(%rbp),%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<vprintf>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r9d,0xc(%rsp)
mov    %r8,0x48(%rsp)
mov    %ecx,0x28(%rsp)
mov    %edx,0x2c(%rsp)
mov    %rsi,%rbp
mov    %rdi,%r14
mov    %rsi,%rdi
call   1040 <strlen@plt>
test   %eax,%eax
jle    1587 <vprintf+0x3d7>
mov    %eax,%eax
mov    %rax,0x50(%rsp)
lea    -0x1(%r14),%rax
mov    %rax,0x38(%rsp)
mov    $0xfffffffe,%r13d
xor    %r12d,%r12d
xor    %ebx,%ebx
xor    %r15d,%r15d
mov    %rax,0x20(%rsp)
mov    %rbp,0x18(%rsp)
mov    %r14,0x10(%rsp)
jmp    1249 <vprintf+0x99>
cs nopw 0x0(%rax,%rax,1)
nop
movl   $0x0,0x8(%rsp)
mov    $0xffffffff,%eax
mov    %rax,0x20(%rsp)
mov    0xc(%rsp),%eax
mov    %eax,0x4(%rsp)
add    $0x1,%r12
cmp    0x50(%rsp),%r12
je     158a <vprintf+0x3da>
test   $0x1,%bl
jne    1290 <vprintf+0xe0>
cmpb   $0x25,0x0(%rbp,%r12,1)
jne    12f0 <vprintf+0x140>
mov    $0x1,%bl
test   %r12,%r12
je     1220 <vprintf+0x70>
mov    $0xffffffff,%eax
add    %r12d,%eax
cmpb   $0x25,0x0(%rbp,%rax,1)
jne    1220 <vprintf+0x70>
testl  $0x100000,0xc(%rsp)
jne    13f3 <vprintf+0x243>
mov    $0x25,%edi
jmp    138b <vprintf+0x1db>
nopl   0x0(%rax,%rax,1)
mov    0x2c(%rsp),%edi
cmp    $0xfffffffe,%r13d
je     12af <vprintf+0xff>
mov    0x28(%rsp),%edi
cmp    $0xffffffff,%r13d
je     12af <vprintf+0xff>
movslq %r13d,%rax
mov    0x48(%rsp),%rcx
mov    (%rcx,%rax,4),%edi
mov    0x0(%rbp,%r12,1),%al
lea    -0x58(%rax),%ecx
cmp    $0x20,%cl
ja     133d <vprintf+0x18d>
movzbl %cl,%ecx
lea    0xd36(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
add    $0x1,%r13d
mov    0x4(%rsp),%ecx
or     0x8(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   10c0 <hex@plt>
jmp    13f0 <vprintf+0x240>
nop
lea    (%r12,%rbp,1),%r14
testl  $0x100000,0xc(%rsp)
jne    1368 <vprintf+0x1b8>
movsbl (%r14),%edi
mov    0x10(%rsp),%r14
mov    %r14,%rsi
mov    %r15d,%edx
call   10a0 <outchar@plt>
mov    %eax,%r15d
xor    %ebx,%ebx
mov    0x18(%rsp),%rbp
jmp    123a <vprintf+0x8a>
add    $0x1,%r13d
mov    0x4(%rsp),%ecx
or     0x8(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   1080 <decimal@plt>
jmp    13f0 <vprintf+0x240>
cmp    $0x25,%al
je     125a <vprintf+0xaa>
lea    (%r12,%rbp,1),%r14
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     14bb <vprintf+0x30b>
mov    0x20(%rsp),%rcx
cmp    $0x3,%ecx
jle    1508 <vprintf+0x358>
xor    %ebx,%ebx
mov    0x18(%rsp),%rbp
mov    0x10(%rsp),%r14
jmp    123a <vprintf+0x8a>
add    $0x1,%r13d
testl  $0x100000,0x4(%rsp)
jne    13fa <vprintf+0x24a>
movsbl %dil,%edi
mov    %r14,%rsi
mov    %r15d,%edx
call   10a0 <outchar@plt>
jmp    13f0 <vprintf+0x240>
add    $0x1,%r13d
movslq %edi,%rdi
mov    0x4(%rsp),%ebx
test   $0x100000,%ebx
jne    1424 <vprintf+0x274>
mov    %rdi,0x40(%rsp)
call   1040 <strlen@plt>
mov    %ebx,%r8d
or     0x8(%rsp),%r8d
mov    0x40(%rsp),%rdi
mov    %eax,%esi
mov    %r14,%rdx
mov    %r15d,%ecx
call   10b0 <outstring@plt>
jmp    13f0 <vprintf+0x240>
add    $0x1,%r13d
mov    0x4(%rsp),%ecx
or     0x8(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   1060 <number@plt>
nopl   0x0(%rax,%rax,1)
mov    %eax,%r15d
xor    %ebx,%ebx
jmp    123a <vprintf+0x8a>
movslq %edi,%rdi
cmp    $0xffffffffffffffff,%r14
je     154c <vprintf+0x39c>
movslq %r15d,%rax
add    %r14,%rax
nopl   (%rax)
movzbl (%rax),%ecx
add    $0x1,%r15d
add    $0x1,%rax
cmp    $0x21,%cl
jl     1410 <vprintf+0x260>
mov    %cl,(%rdi)
jmp    13f3 <vprintf+0x243>
cmp    $0xffffffffffffffff,%r14
je     1556 <vprintf+0x3a6>
cmp    $0x100,%r14
jb     13f3 <vprintf+0x243>
movslq %r15d,%rax
mov    0x38(%rsp),%rcx
lea    (%rcx,%rax,1),%rsi
lea    -0x1(%r15),%ecx
shl    $0x20,%rax
movabs $0xffffffff00000000,%rdx
ff ff ff
add    %rdx,%rax
mov    $0xffffffff,%ebx
nopl   (%rax)
mov    %ecx,%ebp
mov    %r15d,%edx
cmpb   $0x21,0x1(%rsi)
lea    0x1(%rsi),%rsi
lea    0x1(%rbp),%ecx
lea    0x1(%rdx),%r15d
lea    0x1(%rbx,%rax,1),%rax
jl     1460 <vprintf+0x2b0>
movslq %edx,%rax
add    0x10(%rsp),%rax
mov    $0xffffffff,%ebx
nopl   0x0(%rax,%rax,1)
add    $0x1,%ebp
add    $0x1,%ebx
cmpb   $0x20,(%rax)
lea    0x1(%rax),%rax
jg     1490 <vprintf+0x2e0>
mov    %ebx,%edx
mov    %rdi,%r14
call   1050 <memcpy@plt>
movslq %ebx,%rax
movb   $0x0,(%r14,%rax,1)
xor    %ebx,%ebx
mov    %ebp,%r15d
jmp    136a <vprintf+0x1ba>
mov    (%r14),%al
lea    -0x2d(%rax),%ecx
cmp    $0x3f,%cl
ja     14d9 <vprintf+0x329>
movzbl %cl,%ecx
movabs $0x8000000000000003,%rdx
bt     %rcx,%rdx
jb     14e1 <vprintf+0x331>
cmp    $0x20,%al
jne    12f4 <vprintf+0x144>
mov    0x4(%rsp),%edx
mov    %edx,%ecx
or     $0x40000,%ecx
cmp    $0x2e,%al
cmovne %edx,%ecx
mov    %ecx,%edx
or     $0x80000,%edx
cmp    $0x2d,%al
cmovne %ecx,%edx
mov    %edx,0x4(%rsp)
jmp    136a <vprintf+0x1ba>
mov    (%r14),%al
movslq %ecx,%rcx
lea    0x1(%rcx),%rdx
mov    %rdx,0x20(%rsp)
mov    %al,0x34(%rsp,%rcx,1)
lea    0x33(%rsp),%rdi
movb   $0x0,0x2(%rcx,%rdi,1)
call   1070 <atodec@plt>
mov    %eax,0x8(%rsp)
xor    %eax,%eax
cmpb   $0x30,(%r14)
sete   %al
shl    $0x11,%eax
or     0x4(%rsp),%eax
or     $0x10000,%eax
mov    %eax,0x4(%rsp)
jmp    136a <vprintf+0x1ba>
movb   $0x0,(%rdi)
mov    $0x1,%esi
jmp    156c <vprintf+0x3bc>
mov    %ebx,%eax
and    $0x10000,%eax
cmp    $0x1,%eax
sbb    %eax,%eax
mov    0x8(%rsp),%esi
or     %eax,%esi
mov    %esi,0x8(%rsp)
call   10d0 <read_string@plt>
lea    0xb0c(%rip),%rdi
mov    $0x1,%esi
call   1090 <sys_write@plt>
jmp    13f3 <vprintf+0x243>
xor    %r15d,%r15d
mov    %r15d,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [2 x i8] c"\0A\00"
define i32 @vprintf(i8* %0, i8* %1, i32 %2, i32 %3, i32* %4, i32 %5) {
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i8
%23 = alloca [5 x i8]
%24 = alloca i8*
%25 = alloca i8*
store i8* %0, i8** %7
store i8* %1, i8** %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32* %4, i32** %11
store i32 %5, i32* %12
store i8 0, i8* %22
store i32 0, i32* %15
store i32 -2, i32* %16
%26 = load i8*, i8** %8
%27 = call i32 @strlen(i8* %26)
store i32 %27, i32* %14
store i32 0, i32* %13
br label %28
28: ; preds = %493, %6
%29 = load i32, i32* %13
%30 = load i32, i32* %14
%31 = icmp slt i32 %29, %30
br i1 %31, label %32, label %496
32: ; preds = %28
%33 = load i8, i8* %22
%34 = sext i8 %33 to i32
%35 = and i32 %34, 1
%36 = icmp ne i32 %35, 0
br i1 %36, label %37, label %55
37: ; preds = %32
%38 = load i32, i32* %16
%39 = icmp eq i32 %38, -2
br i1 %39, label %40, label %42
40: ; preds = %37
%41 = load i32, i32* %9
store i32 %41, i32* %17
br label %54
42: ; preds = %37
%43 = load i32, i32* %16
%44 = icmp eq i32 %43, -1
br i1 %44, label %45, label %47
45: ; preds = %42
%46 = load i32, i32* %10
store i32 %46, i32* %17
br label %53
47: ; preds = %42
%48 = load i32*, i32** %11
%49 = load i32, i32* %16
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i32, i32* %48, i64 %50
%52 = load i32, i32* %51
store i32 %52, i32* %17
br label %53
53: ; preds = %47, %45
br label %54
54: ; preds = %53, %40
br label %55
55: ; preds = %54, %32
%56 = load i8*, i8** %8
%57 = load i32, i32* %13
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %56, i64 %58
%60 = load i8, i8* %59
%61 = sext i8 %60 to i32
%62 = icmp eq i32 %61, 37
br i1 %62, label %63, label %100
63: ; preds = %55
%64 = load i32, i32* %13
%65 = icmp sgt i32 %64, 0
br i1 %65, label %66, label %93
66: ; preds = %63
%67 = load i8*, i8** %8
%68 = load i32, i32* %13
%69 = sub nsw i32 %68, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %67, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 37
br i1 %74, label %75, label %93
75: ; preds = %66
%76 = load i8, i8* %22
%77 = sext i8 %76 to i32
%78 = and i32 %77, -2
%79 = trunc i32 %78 to i8
store i8 %79, i8* %22
%80 = load i32, i32* %12
%81 = and i32 %80, 1048576
%82 = icmp ne i32 %81, 0
br i1 %82, label %92, label %83
83: ; preds = %75
%84 = load i8*, i8** %8
%85 = load i32, i32* %13
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = load i8*, i8** %7
%90 = load i32, i32* %15
%91 = call i32 @outchar(i8 signext %88, i8* %89, i32 %90)
store i32 %91, i32* %15
br label %92
92: ; preds = %83, %75
br label %99
93: ; preds = %66, %63
%94 = load i8, i8* %22
%95 = sext i8 %94 to i32
%96 = or i32 %95, 1
%97 = trunc i32 %96 to i8
store i8 %97, i8* %22
store i32 -1, i32* %19
store i32 0, i32* %18
%98 = load i32, i32* %12
store i32 %98, i32* %20
br label %99
99: ; preds = %93, %92
br label %492
100: ; preds = %55
%101 = load i8, i8* %22
%102 = sext i8 %101 to i32
%103 = and i32 %102, 1
%104 = icmp ne i32 %103, 0
br i1 %104, label %105, label %135
105: ; preds = %100
%106 = load i8*, i8** %8
%107 = load i32, i32* %13
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %106, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 100
br i1 %112, label %121, label %113
113: ; preds = %105
%114 = load i8*, i8** %8
%115 = load i32, i32* %13
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = load i8, i8* %117
%119 = sext i8 %118 to i32
%120 = icmp eq i32 %119, 105
br i1 %120, label %121, label %135
121: ; preds = %113, %105
%122 = load i32, i32* %16
%123 = add nsw i32 %122, 1
store i32 %123, i32* %16
%124 = load i32, i32* %17
%125 = load i8*, i8** %7
%126 = load i32, i32* %15
%127 = load i32, i32* %18
%128 = load i32, i32* %20
%129 = or i32 %127, %128
%130 = call i32 @decimal(i32 %124, i8* %125, i32 %126, i32 %129)
store i32 %130, i32* %15
%131 = load i8, i8* %22
%132 = sext i8 %131 to i32
%133 = and i32 %132, -2
%134 = trunc i32 %133 to i8
store i8 %134, i8* %22
br label %491
135: ; preds = %113, %100
%136 = load i8, i8* %22
%137 = sext i8 %136 to i32
%138 = and i32 %137, 1
%139 = icmp ne i32 %138, 0
br i1 %139, label %140, label %162
140: ; preds = %135
%141 = load i8*, i8** %8
%142 = load i32, i32* %13
%143 = sext i32 %142 to i64
%144 = getelementptr inbounds i8, i8* %141, i64 %143
%145 = load i8, i8* %144
%146 = sext i8 %145 to i32
%147 = icmp eq i32 %146, 117
br i1 %147, label %148, label %162
148: ; preds = %140
%149 = load i32, i32* %16
%150 = add nsw i32 %149, 1
store i32 %150, i32* %16
%151 = load i32, i32* %17
%152 = load i8*, i8** %7
%153 = load i32, i32* %15
%154 = load i32, i32* %18
%155 = load i32, i32* %20
%156 = or i32 %154, %155
%157 = call i32 @number(i32 %151, i8* %152, i32 %153, i32 %156)
store i32 %157, i32* %15
%158 = load i8, i8* %22
%159 = sext i8 %158 to i32
%160 = and i32 %159, -2
%161 = trunc i32 %160 to i8
store i8 %161, i8* %22
br label %490
162: ; preds = %140, %135
%163 = load i8, i8* %22
%164 = sext i8 %163 to i32
%165 = and i32 %164, 1
%166 = icmp ne i32 %165, 0
br i1 %166, label %167, label %197
167: ; preds = %162
%168 = load i8*, i8** %8
%169 = load i32, i32* %13
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds i8, i8* %168, i64 %170
%172 = load i8, i8* %171
%173 = sext i8 %172 to i32
%174 = icmp eq i32 %173, 120
br i1 %174, label %183, label %175
175: ; preds = %167
%176 = load i8*, i8** %8
%177 = load i32, i32* %13
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds i8, i8* %176, i64 %178
%180 = load i8, i8* %179
%181 = sext i8 %180 to i32
%182 = icmp eq i32 %181, 88
br i1 %182, label %183, label %197
183: ; preds = %175, %167
%184 = load i32, i32* %16
%185 = add nsw i32 %184, 1
store i32 %185, i32* %16
%186 = load i32, i32* %17
%187 = load i8*, i8** %7
%188 = load i32, i32* %15
%189 = load i32, i32* %18
%190 = load i32, i32* %20
%191 = or i32 %189, %190
%192 = call i32 @hex(i32 %186, i8* %187, i32 %188, i32 %191)
store i32 %192, i32* %15
%193 = load i8, i8* %22
%194 = sext i8 %193 to i32
%195 = and i32 %194, -2
%196 = trunc i32 %195 to i8
store i8 %196, i8* %22
br label %489
197: ; preds = %175, %162
%198 = load i8, i8* %22
%199 = sext i8 %198 to i32
%200 = and i32 %199, 1
%201 = icmp ne i32 %200, 0
br i1 %201, label %202, label %294
202: ; preds = %197
%203 = load i8*, i8** %8
%204 = load i32, i32* %13
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds i8, i8* %203, i64 %205
%207 = load i8, i8* %206
%208 = sext i8 %207 to i32
%209 = icmp eq i32 %208, 115
br i1 %209, label %210, label %294
210: ; preds = %202
%211 = load i32, i32* %16
%212 = add nsw i32 %211, 1
store i32 %212, i32* %16
%213 = load i32, i32* %17
%214 = sext i32 %213 to i64
%215 = inttoptr i64 %214 to i8*
store i8* %215, i8** %24
%216 = load i32, i32* %20
%217 = and i32 %216, 1048576
%218 = icmp ne i32 %217, 0
br i1 %218, label %219, label %279
219: ; preds = %210
%220 = load i8*, i8** %7
%221 = icmp eq i8* %220, inttoptr (i64 -1 to i8*)
br i1 %221, label %222, label %232
222: ; preds = %219
%223 = load i32, i32* %20
%224 = and i32 %223, 65536
%225 = icmp ne i32 %224, 0
br i1 %225, label %227, label %226
226: ; preds = %222
store i32 -1, i32* %18
br label %227
227: ; preds = %226, %222
%228 = load i8*, i8** %24
%229 = load i32, i32* %18
%230 = call i32 @read_string(i8* %228, i32 %229)
%231 = call i32 @sys_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %278
232: ; preds = %219
%233 = load i8*, i8** %7
%234 = icmp ugt i8* %233, inttoptr (i64 255 to i8*)
br i1 %234, label %235, label %277
235: ; preds = %232
br label %236
236: ; preds = %244, %235
%237 = load i8*, i8** %7
%238 = load i32, i32* %15
%239 = sext i32 %238 to i64
%240 = getelementptr inbounds i8, i8* %237, i64 %239
%241 = load i8, i8* %240
%242 = sext i8 %241 to i32
%243 = icmp sle i32 %242, 32
br i1 %243, label %244, label %247
244: ; preds = %236
%245 = load i32, i32* %15
%246 = add nsw i32 %245, 1
store i32 %246, i32* %15
br label %236
247: ; preds = %236
%248 = load i8*, i8** %7
%249 = load i32, i32* %15
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds i8, i8* %248, i64 %250
store i8* %251, i8** %25
%252 = load i32, i32* %15
store i32 %252, i32* %21
br label %253
253: ; preds = %261, %247
%254 = load i8*, i8** %7
%255 = load i32, i32* %15
%256 = sext i32 %255 to i64
%257 = getelementptr inbounds i8, i8* %254, i64 %256
%258 = load i8, i8* %257
%259 = sext i8 %258 to i32
%260 = icmp sgt i32 %259, 32
br i1 %260, label %261, label %264
261: ; preds = %253
%262 = load i32, i32* %15
%263 = add nsw i32 %262, 1
store i32 %263, i32* %15
br label %253
264: ; preds = %253
%265 = load i8*, i8** %24
%266 = load i8*, i8** %25
%267 = load i32, i32* %15
%268 = load i32, i32* %21
%269 = sub nsw i32 %267, %268
%270 = call i32 @memcpy(i8* %265, i8* %266, i32 %269)
%271 = load i8*, i8** %24
%272 = load i32, i32* %15
%273 = load i32, i32* %21
%274 = sub nsw i32 %272, %273
%275 = sext i32 %274 to i64
%276 = getelementptr inbounds i8, i8* %271, i64 %275
store i8 0, i8* %276
br label %277
277: ; preds = %264, %232
br label %278
278: ; preds = %277, %227
br label %289
279: ; preds = %210
%280 = load i8*, i8** %24
%281 = load i8*, i8** %24
%282 = call i32 @strlen(i8* %281)
%283 = load i8*, i8** %7
%284 = load i32, i32* %15
%285 = load i32, i32* %18
%286 = load i32, i32* %20
%287 = or i32 %285, %286
%288 = call i32 @outstring(i8* %280, i32 %282, i8* %283, i32 %284, i32 %287)
store i32 %288, i32* %15
br label %289
289: ; preds = %279, %278
%290 = load i8, i8* %22
%291 = sext i8 %290 to i32
%292 = and i32 %291, -2
%293 = trunc i32 %292 to i8
store i8 %293, i8* %22
br label %488
294: ; preds = %202, %197
%295 = load i8, i8* %22
%296 = sext i8 %295 to i32
%297 = and i32 %296, 1
%298 = icmp ne i32 %297, 0
br i1 %298, label %299, label %356
299: ; preds = %294
%300 = load i8*, i8** %8
%301 = load i32, i32* %13
%302 = sext i32 %301 to i64
%303 = getelementptr inbounds i8, i8* %300, i64 %302
%304 = load i8, i8* %303
%305 = sext i8 %304 to i32
%306 = icmp eq i32 %305, 99
br i1 %306, label %307, label %356
307: ; preds = %299
%308 = load i32, i32* %16
%309 = add nsw i32 %308, 1
store i32 %309, i32* %16
%310 = load i32, i32* %20
%311 = and i32 %310, 1048576
%312 = icmp ne i32 %311, 0
br i1 %312, label %313, label %345
313: ; preds = %307
%314 = load i32, i32* %17
%315 = sext i32 %314 to i64
%316 = inttoptr i64 %315 to i8*
store i8* %316, i8** %24
%317 = load i8*, i8** %7
%318 = icmp eq i8* %317, inttoptr (i64 -1 to i8*)
br i1 %318, label %319, label %324
319: ; preds = %313
%320 = load i8*, i8** %24
store i8 0, i8* %320
%321 = load i8*, i8** %24
%322 = call i32 @read_string(i8* %321, i32 1)
%323 = call i32 @sys_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %344
324: ; preds = %313
br label %325
325: ; preds = %333, %324
%326 = load i8*, i8** %7
%327 = load i32, i32* %15
%328 = sext i32 %327 to i64
%329 = getelementptr inbounds i8, i8* %326, i64 %328
%330 = load i8, i8* %329
%331 = sext i8 %330 to i32
%332 = icmp sle i32 %331, 32
br i1 %332, label %333, label %336
333: ; preds = %325
%334 = load i32, i32* %15
%335 = add nsw i32 %334, 1
store i32 %335, i32* %15
br label %325
336: ; preds = %325
%337 = load i8*, i8** %7
%338 = load i32, i32* %15
%339 = add nsw i32 %338, 1
store i32 %339, i32* %15
%340 = sext i32 %338 to i64
%341 = getelementptr inbounds i8, i8* %337, i64 %340
%342 = load i8, i8* %341
%343 = load i8*, i8** %24
store i8 %342, i8* %343
br label %344
344: ; preds = %336, %319
br label %351
345: ; preds = %307
%346 = load i32, i32* %17
%347 = trunc i32 %346 to i8
%348 = load i8*, i8** %7
%349 = load i32, i32* %15
%350 = call i32 @outchar(i8 signext %347, i8* %348, i32 %349)
store i32 %350, i32* %15
br label %351
351: ; preds = %345, %344
%352 = load i8, i8* %22
%353 = sext i8 %352 to i32
%354 = and i32 %353, -2
%355 = trunc i32 %354 to i8
store i8 %355, i8* %22
br label %487
356: ; preds = %299, %294
%357 = load i8, i8* %22
%358 = sext i8 %357 to i32
%359 = and i32 %358, 1
%360 = icmp ne i32 %359, 0
br i1 %360, label %361, label %407
361: ; preds = %356
%362 = load i8*, i8** %8
%363 = load i32, i32* %13
%364 = sext i32 %363 to i64
%365 = getelementptr inbounds i8, i8* %362, i64 %364
%366 = load i8, i8* %365
%367 = call i64 @isdigit(i8 signext %366)
%368 = icmp ne i64 %367, 0
br i1 %368, label %369, label %407
369: ; preds = %361
%370 = load i32, i32* %19
%371 = icmp sgt i32 %370, 3
br i1 %371, label %372, label %377
372: ; preds = %369
%373 = load i8, i8* %22
%374 = sext i8 %373 to i32
%375 = and i32 %374, -2
%376 = trunc i32 %375 to i8
store i8 %376, i8* %22
br label %406
377: ; preds = %369
%378 = load i8*, i8** %8
%379 = load i32, i32* %13
%380 = sext i32 %379 to i64
%381 = getelementptr inbounds i8, i8* %378, i64 %380
%382 = load i8, i8* %381
%383 = load i32, i32* %19
%384 = add nsw i32 %383, 1
store i32 %384, i32* %19
%385 = sext i32 %384 to i64
%386 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 %385
store i8 %382, i8* %386
%387 = load i32, i32* %19
%388 = add nsw i32 %387, 1
%389 = sext i32 %388 to i64
%390 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 %389
store i8 0, i8* %390
%391 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 0
%392 = call i32 @atodec(i8* %391)
store i32 %392, i32* %18
%393 = load i32, i32* %20
%394 = or i32 %393, 65536
store i32 %394, i32* %20
%395 = load i8*, i8** %8
%396 = load i32, i32* %13
%397 = sext i32 %396 to i64
%398 = getelementptr inbounds i8, i8* %395, i64 %397
%399 = load i8, i8* %398
%400 = sext i8 %399 to i32
%401 = icmp eq i32 %400, 48
br i1 %401, label %402, label %405
402: ; preds = %377
%403 = load i32, i32* %20
%404 = or i32 %403, 131072
store i32 %404, i32* %20
br label %405
405: ; preds = %402, %377
br label %406
406: ; preds = %405, %372
br label %486
407: ; preds = %361, %356
%408 = load i8, i8* %22
%409 = sext i8 %408 to i32
%410 = and i32 %409, 1
%411 = icmp ne i32 %410, 0
br i1 %411, label %412, label %467
412: ; preds = %407
%413 = load i8*, i8** %8
%414 = load i32, i32* %13
%415 = sext i32 %414 to i64
%416 = getelementptr inbounds i8, i8* %413, i64 %415
%417 = load i8, i8* %416
%418 = sext i8 %417 to i32
%419 = icmp eq i32 %418, 46
br i1 %419, label %444, label %420
420: ; preds = %412
%421 = load i8*, i8** %8
%422 = load i32, i32* %13
%423 = sext i32 %422 to i64
%424 = getelementptr inbounds i8, i8* %421, i64 %423
%425 = load i8, i8* %424
%426 = sext i8 %425 to i32
%427 = icmp eq i32 %426, 32
br i1 %427, label %444, label %428
428: ; preds = %420
%429 = load i8*, i8** %8
%430 = load i32, i32* %13
%431 = sext i32 %430 to i64
%432 = getelementptr inbounds i8, i8* %429, i64 %431
%433 = load i8, i8* %432
%434 = sext i8 %433 to i32
%435 = icmp eq i32 %434, 108
br i1 %435, label %444, label %436
436: ; preds = %428
%437 = load i8*, i8** %8
%438 = load i32, i32* %13
%439 = sext i32 %438 to i64
%440 = getelementptr inbounds i8, i8* %437, i64 %439
%441 = load i8, i8* %440
%442 = sext i8 %441 to i32
%443 = icmp eq i32 %442, 45
br i1 %443, label %444, label %467
444: ; preds = %436, %428, %420, %412
%445 = load i8*, i8** %8
%446 = load i32, i32* %13
%447 = sext i32 %446 to i64
%448 = getelementptr inbounds i8, i8* %445, i64 %447
%449 = load i8, i8* %448
%450 = sext i8 %449 to i32
%451 = icmp eq i32 %450, 46
br i1 %451, label %452, label %455
452: ; preds = %444
%453 = load i32, i32* %20
%454 = or i32 %453, 262144
store i32 %454, i32* %20
br label %455
455: ; preds = %452, %444
%456 = load i8*, i8** %8
%457 = load i32, i32* %13
%458 = sext i32 %457 to i64
%459 = getelementptr inbounds i8, i8* %456, i64 %458
%460 = load i8, i8* %459
%461 = sext i8 %460 to i32
%462 = icmp eq i32 %461, 45
br i1 %462, label %463, label %466
463: ; preds = %455
%464 = load i32, i32* %20
%465 = or i32 %464, 524288
store i32 %465, i32* %20
br label %466
466: ; preds = %463, %455
br label %485
467: ; preds = %436, %407
%468 = load i8, i8* %22
%469 = sext i8 %468 to i32
%470 = and i32 %469, -2
%471 = trunc i32 %470 to i8
store i8 %471, i8* %22
%472 = load i32, i32* %12
%473 = and i32 %472, 1048576
%474 = icmp ne i32 %473, 0
br i1 %474, label %484, label %475
475: ; preds = %467
%476 = load i8*, i8** %8
%477 = load i32, i32* %13
%478 = sext i32 %477 to i64
%479 = getelementptr inbounds i8, i8* %476, i64 %478
%480 = load i8, i8* %479
%481 = load i8*, i8** %7
%482 = load i32, i32* %15
%483 = call i32 @outchar(i8 signext %480, i8* %481, i32 %482)
store i32 %483, i32* %15
br label %484
484: ; preds = %475, %467
br label %485
485: ; preds = %484, %466
br label %486
486: ; preds = %485, %406
br label %487
487: ; preds = %486, %351
br label %488
488: ; preds = %487, %289
br label %489
489: ; preds = %488, %183
br label %490
490: ; preds = %489, %148
br label %491
491: ; preds = %490, %121
br label %492
492: ; preds = %491, %99
br label %493
493: ; preds = %492
%494 = load i32, i32* %13
%495 = add nsw i32 %494, 1
store i32 %495, i32* %13
br label %28
496: ; preds = %28
%497 = load i32, i32* %15
ret i32 %497
}

LLVM IR (-O2):
@.str = [2 x i8] c"\0A\00"
define i32 @vprintf(i8* %0, i8* %1, i32 %2, i32 %3, i32* nocapture %4, i32 %5) {
%7 = alloca [5 x i8]
%8 = getelementptr inbounds [5 x i8], [5 x i8]* %7, i64 0, i64 0
%9 = tail call i32 @strlen(i8* %1)
%10 = icmp sgt i32 %9, 0
br i1 %10, label %11, label %172
11: ; preds = %6
%12 = icmp eq i8* %0, inttoptr (i64 -1 to i8*)
%13 = icmp ugt i8* %0, inttoptr (i64 255 to i8*)
%14 = and i32 %5, 1048576
%15 = icmp eq i32 %14, 0
%16 = zext i32 %9 to i64
br label %17
17: ; preds = %11, %163
%18 = phi i64 [ 0, %11 ], [ %170, %163 ]
%19 = phi i8 [ 0, %11 ], [ %169, %163 ]
%20 = phi i32 [ 0, %11 ], [ %168, %163 ]
%21 = phi i32 [ undef, %11 ], [ %167, %163 ]
%22 = phi i32 [ undef, %11 ], [ %166, %163 ]
%23 = phi i32 [ undef, %11 ], [ %165, %163 ]
%24 = phi i32 [ -2, %11 ], [ %164, %163 ]
%25 = and i8 %19, 1
%26 = icmp eq i8 %25, 0
br i1 %26, label %37, label %27
27: ; preds = %17
switch i32 %24, label %29 [
i32 -2, label %33
i32 -1, label %28
]
28: ; preds = %27
br label %33
29: ; preds = %27
%30 = sext i32 %24 to i64
%31 = getelementptr inbounds i32, i32* %4, i64 %30
%32 = load i32, i32* %31
br label %33
33: ; preds = %27, %29, %28
%34 = phi i32 [ %3, %28 ], [ %32, %29 ], [ %2, %27 ]
%35 = getelementptr inbounds i8, i8* %1, i64 %18
%36 = load i8, i8* %35
switch i8 %36, label %131 [
i8 37, label %41
i8 100, label %52
i8 105, label %52
i8 117, label %56
i8 120, label %60
i8 88, label %60
i8 115, label %64
i8 99, label %107
]
37: ; preds = %17
%38 = getelementptr inbounds i8, i8* %1, i64 %18
%39 = load i8, i8* %38
%40 = icmp eq i8 %39, 37
br i1 %40, label %41, label %158
41: ; preds = %33, %37
%42 = icmp eq i64 %18, 0
br i1 %42, label %163, label %43
43: ; preds = %41
%44 = add nuw i64 %18, 4294967295
%45 = and i64 %44, 4294967295
%46 = getelementptr inbounds i8, i8* %1, i64 %45
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 37
br i1 %48, label %49, label %163
49: ; preds = %43
br i1 %15, label %50, label %163
50: ; preds = %49
%51 = call i32 @outchar(i8 signext 37, i8* %0, i32 %20)
br label %163
52: ; preds = %33, %33
%53 = add nsw i32 %24, 1
%54 = or i32 %21, %23
%55 = call i32 @decimal(i32 %34, i8* %0, i32 %20, i32 %54)
br label %163
56: ; preds = %33
%57 = add nsw i32 %24, 1
%58 = or i32 %21, %23
%59 = call i32 @number(i32 %34, i8* %0, i32 %20, i32 %58)
br label %163
60: ; preds = %33, %33
%61 = add nsw i32 %24, 1
%62 = or i32 %21, %23
%63 = call i32 @hex(i32 %34, i8* %0, i32 %20, i32 %62)
br label %163
64: ; preds = %33
%65 = add nsw i32 %24, 1
%66 = sext i32 %34 to i64
%67 = inttoptr i64 %66 to i8*
%68 = and i32 %21, 1048576
%69 = icmp eq i32 %68, 0
br i1 %69, label %103, label %70
70: ; preds = %64
br i1 %12, label %71, label %77
71: ; preds = %70
%72 = and i32 %21, 65536
%73 = icmp eq i32 %72, 0
%74 = select i1 %73, i32 -1, i32 %23
%75 = call i32 @read_string(i8* %67, i32 %74)
%76 = call i32 @sys_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %163
77: ; preds = %70
br i1 %13, label %78, label %163
78: ; preds = %77
%79 = sext i32 %20 to i64
br label %80
80: ; preds = %78, %80
%81 = phi i64 [ %79, %78 ], [ %85, %80 ]
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = load i8, i8* %82
%84 = icmp slt i8 %83, 33
%85 = add i64 %81, 1
br i1 %84, label %80, label %86
86: ; preds = %80
%87 = getelementptr inbounds i8, i8* %0, i64 %81
%88 = trunc i64 %81 to i32
%89 = shl i64 %81, 32
%90 = ashr exact i64 %89, 32
br label %91
91: ; preds = %91, %86
%92 = phi i64 [ %96, %91 ], [ %90, %86 ]
%93 = getelementptr inbounds i8, i8* %0, i64 %92
%94 = load i8, i8* %93
%95 = icmp sgt i8 %94, 32
%96 = add i64 %92, 1
br i1 %95, label %91, label %97
97: ; preds = %91
%98 = trunc i64 %92 to i32
%99 = sub nsw i32 %98, %88
%100 = call i32 @memcpy(i8* %67, i8* %87, i32 %99)
%101 = sext i32 %99 to i64
%102 = getelementptr inbounds i8, i8* %67, i64 %101
store i8 0, i8* %102
br label %163
103: ; preds = %64
%104 = call i32 @strlen(i8* %67)
%105 = or i32 %21, %23
%106 = call i32 @outstring(i8* %67, i32 %104, i8* %0, i32 %20, i32 %105)
br label %163
107: ; preds = %33
%108 = add nsw i32 %24, 1
%109 = and i32 %21, 1048576
%110 = icmp eq i32 %109, 0
br i1 %110, label %128, label %111
111: ; preds = %107
%112 = sext i32 %34 to i64
%113 = inttoptr i64 %112 to i8*
br i1 %12, label %116, label %114
114: ; preds = %111
%115 = sext i32 %20 to i64
br label %119
116: ; preds = %111
store i8 0, i8* %113
%117 = call i32 @read_string(i8* %113, i32 1)
%118 = call i32 @sys_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %163
119: ; preds = %114, %119
%120 = phi i64 [ %115, %114 ], [ %124, %119 ]
%121 = getelementptr inbounds i8, i8* %0, i64 %120
%122 = load i8, i8* %121
%123 = icmp slt i8 %122, 33
%124 = add i64 %120, 1
br i1 %123, label %119, label %125
125: ; preds = %119
%126 = trunc i64 %120 to i32
%127 = add nsw i32 %126, 1
store i8 %122, i8* %113
br label %163
128: ; preds = %107
%129 = trunc i32 %34 to i8
%130 = call i32 @outchar(i8 signext %129, i8* %0, i32 %20)
br label %163
131: ; preds = %33
%132 = call i64 @isdigit(i8 signext %36)
%133 = icmp eq i64 %132, 0
br i1 %133, label %149, label %134
134: ; preds = %131
%135 = icmp sgt i32 %22, 3
br i1 %135, label %163, label %136
136: ; preds = %134
%137 = load i8, i8* %35
%138 = add nsw i32 %22, 1
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds [5 x i8], [5 x i8]* %7, i64 0, i64 %139
store i8 %137, i8* %140
%141 = add nsw i32 %22, 2
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds [5 x i8], [5 x i8]* %7, i64 0, i64 %142
store i8 0, i8* %143
%144 = call i32 @atodec(i8* %8)
%145 = load i8, i8* %35
%146 = icmp eq i8 %145, 48
%147 = select i1 %146, i32 196608, i32 65536
%148 = or i32 %147, %21
br label %163
149: ; preds = %131
%150 = load i8, i8* %35
switch i8 %150, label %158 [
i8 46, label %151
i8 32, label %151
i8 108, label %151
i8 45, label %151
]
151: ; preds = %149, %149, %149, %149
%152 = icmp eq i8 %150, 46
%153 = or i32 %21, 262144
%154 = select i1 %152, i32 %153, i32 %21
%155 = icmp eq i8 %150, 45
%156 = or i32 %154, 524288
%157 = select i1 %155, i32 %156, i32 %154
br label %163
158: ; preds = %37, %149
%159 = phi i8* [ %35, %149 ], [ %38, %37 ]
br i1 %15, label %160, label %163
160: ; preds = %158
%161 = load i8, i8* %159
%162 = call i32 @outchar(i8 signext %161, i8* %0, i32 %20)
br label %163
163: ; preds = %134, %128, %125, %116, %103, %77, %97, %71, %41, %43, %151, %136, %49, %50, %56, %158, %160, %60, %52
%164 = phi i32 [ %24, %49 ], [ %24, %50 ], [ %53, %52 ], [ %57, %56 ], [ %61, %60 ], [ %24, %158 ], [ %24, %160 ], [ %24, %136 ], [ %24, %151 ], [ %24, %43 ], [ %24, %41 ], [ %65, %71 ], [ %65, %97 ], [ %65, %77 ], [ %65, %103 ], [ %108, %116 ], [ %108, %125 ], [ %108, %128 ], [ %24, %134 ]
%165 = phi i32 [ %23, %49 ], [ %23, %50 ], [ %23, %52 ], [ %23, %56 ], [ %23, %60 ], [ %23, %158 ], [ %23, %160 ], [ %144, %136 ], [ %23, %151 ], [ 0, %43 ], [ 0, %41 ], [ %74, %71 ], [ %23, %97 ], [ %23, %77 ], [ %23, %103 ], [ %23, %116 ], [ %23, %125 ], [ %23, %128 ], [ %23, %134 ]
%166 = phi i32 [ %22, %49 ], [ %22, %50 ], [ %22, %52 ], [ %22, %56 ], [ %22, %60 ], [ %22, %158 ], [ %22, %160 ], [ %138, %136 ], [ %22, %151 ], [ -1, %43 ], [ -1, %41 ], [ %22, %71 ], [ %22, %97 ], [ %22, %77 ], [ %22, %103 ], [ %22, %116 ], [ %22, %125 ], [ %22, %128 ], [ %22, %134 ]
%167 = phi i32 [ %21, %49 ], [ %21, %50 ], [ %21, %52 ], [ %21, %56 ], [ %21, %60 ], [ %21, %158 ], [ %21, %160 ], [ %148, %136 ], [ %157, %151 ], [ %5, %43 ], [ %5, %41 ], [ %21, %71 ], [ %21, %97 ], [ %21, %77 ], [ %21, %103 ], [ %21, %116 ], [ %21, %125 ], [ %21, %128 ], [ %21, %134 ]
%168 = phi i32 [ %20, %49 ], [ %51, %50 ], [ %55, %52 ], [ %59, %56 ], [ %63, %60 ], [ %20, %158 ], [ %162, %160 ], [ %20, %136 ], [ %20, %151 ], [ %20, %43 ], [ %20, %41 ], [ %20, %71 ], [ %98, %97 ], [ %20, %77 ], [ %106, %103 ], [ %20, %116 ], [ %127, %125 ], [ %130, %128 ], [ %20, %134 ]
%169 = phi i8 [ 0, %49 ], [ 0, %50 ], [ 0, %52 ], [ 0, %56 ], [ 0, %60 ], [ 0, %158 ], [ 0, %160 ], [ %19, %136 ], [ %19, %151 ], [ 1, %43 ], [ 1, %41 ], [ 0, %71 ], [ 0, %97 ], [ 0, %77 ], [ 0, %103 ], [ 0, %116 ], [ 0, %125 ], [ 0, %128 ], [ 0, %134 ]
%170 = add nuw nsw i64 %18, 1
%171 = icmp eq i64 %170, %16
br i1 %171, label %172, label %17
172: ; preds = %163, %6
%173 = phi i32 [ 0, %6 ], [ %168, %163 ]
ret i32 %173
}