#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 /*<<< orphan*/ sio_write(char *, int);
int strlen(char *);
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;
  volatile int w;
  for (w = 0; w < 1000; w++)
    ;
  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);
          sio_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);
          sio_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)
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    $0x3e8,%eax
jge    11f6 <vprintf+0x46>
jmp    11e8 <vprintf+0x38>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    11d5 <vprintf+0x25>
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    185e <vprintf+0x6ae>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1279 <vprintf+0xc9>
cmpl   $0xfffffffe,-0x34(%rbp)
jne    124c <vprintf+0x9c>
mov    -0x14(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1274 <vprintf+0xc4>
cmpl   $0xffffffff,-0x34(%rbp)
jne    1261 <vprintf+0xb1>
mov    -0x18(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    126f <vprintf+0xbf>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
jmp    1274 <vprintf+0xc4>
jmp    1279 <vprintf+0xc9>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    1312 <vprintf+0x162>
cmpl   $0x0,-0x28(%rbp)
jle    12ef <vprintf+0x13f>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    12ef <vprintf+0x13f>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
mov    -0x24(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
jne    12ea <vprintf+0x13a>
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    130d <vprintf+0x15d>
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    184b <vprintf+0x69b>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     137c <vprintf+0x1cc>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x64,%eax
je     134c <vprintf+0x19c>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x69,%eax
jne    137c <vprintf+0x1cc>
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   1090 <decimal@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    1846 <vprintf+0x696>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     13d1 <vprintf+0x221>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x75,%eax
jne    13d1 <vprintf+0x221>
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   1070 <number@plt>
mov    %eax,-0x30(%rbp)
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    1841 <vprintf+0x691>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     143b <vprintf+0x28b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x78,%eax
je     140b <vprintf+0x25b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x58,%eax
jne    143b <vprintf+0x28b>
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    183c <vprintf+0x68c>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     15a7 <vprintf+0x3f7>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x73,%eax
jne    15a7 <vprintf+0x3f7>
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     156a <vprintf+0x3ba>
mov    $0xffffffffffffffff,%rax
cmp    %rax,-0x8(%rbp)
jne    14cd <vprintf+0x31d>
mov    -0x44(%rbp),%eax
and    $0x10000,%eax
cmp    $0x0,%eax
jne    14ab <vprintf+0x2fb>
movl   $0xffffffff,-0x3c(%rbp)
mov    -0x58(%rbp),%rdi
mov    -0x3c(%rbp),%esi
call   10d0 <read_string@plt>
lea    0xb42(%rip),%rdi
mov    $0x1,%esi
call   1050 <sio_write@plt>
jmp    1565 <vprintf+0x3b5>
mov    $0xff,%eax
cmp    %rax,-0x8(%rbp)
jbe    1560 <vprintf+0x3b0>
jmp    14e1 <vprintf+0x331>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jg     1504 <vprintf+0x354>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    14e1 <vprintf+0x331>
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    153c <vprintf+0x38c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1519 <vprintf+0x369>
mov    -0x58(%rbp),%rdi
mov    -0x60(%rbp),%rsi
mov    -0x30(%rbp),%edx
sub    -0x48(%rbp),%edx
call   1060 <memcpy@plt>
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1565 <vprintf+0x3b5>
jmp    1598 <vprintf+0x3e8>
mov    -0x58(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x58(%rbp),%rdi
call   1040 <strlen@plt>
mov    -0x70(%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    1837 <vprintf+0x687>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1696 <vprintf+0x4e6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x63,%eax
jne    1696 <vprintf+0x4e6>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x44(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
je     1672 <vprintf+0x4c2>
movslq -0x38(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    $0xffffffffffffffff,%rax
cmp    %rax,-0x8(%rbp)
jne    162a <vprintf+0x47a>
mov    -0x58(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x58(%rbp),%rdi
mov    $0x1,%esi
call   10d0 <read_string@plt>
lea    0x9e5(%rip),%rdi
mov    $0x1,%esi
call   1050 <sio_write@plt>
jmp    166d <vprintf+0x4bd>
jmp    162f <vprintf+0x47f>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jg     1652 <vprintf+0x4a2>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    162f <vprintf+0x47f>
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    1687 <vprintf+0x4d7>
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    1832 <vprintf+0x682>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1742 <vprintf+0x592>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1742 <vprintf+0x592>
cmpl   $0x3,-0x40(%rbp)
jle    16da <vprintf+0x52a>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
jmp    173d <vprintf+0x58d>
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   1080 <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    1738 <vprintf+0x588>
mov    -0x44(%rbp),%eax
or     $0x20000,%eax
mov    %eax,-0x44(%rbp)
jmp    173d <vprintf+0x58d>
jmp    182d <vprintf+0x67d>
movsbl -0x49(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     17eb <vprintf+0x63b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     17a6 <vprintf+0x5f6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     17a6 <vprintf+0x5f6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6c,%eax
je     17a6 <vprintf+0x5f6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    17eb <vprintf+0x63b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    17c6 <vprintf+0x616>
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    17e6 <vprintf+0x636>
mov    -0x44(%rbp),%eax
or     $0x80000,%eax
mov    %eax,-0x44(%rbp)
jmp    1828 <vprintf+0x678>
movsbl -0x49(%rbp),%eax
and    $0xfffffffe,%eax
mov    %al,-0x49(%rbp)
mov    -0x24(%rbp),%eax
and    $0x100000,%eax
cmp    $0x0,%eax
jne    1823 <vprintf+0x673>
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    1828 <vprintf+0x678>
jmp    182d <vprintf+0x67d>
jmp    1832 <vprintf+0x682>
jmp    1837 <vprintf+0x687>
jmp    183c <vprintf+0x68c>
jmp    1841 <vprintf+0x691>
jmp    1846 <vprintf+0x696>
jmp    184b <vprintf+0x69b>
jmp    1850 <vprintf+0x6a0>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    121b <vprintf+0x6b>
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    $0x68,%rsp
mov    %r9d,0x14(%rsp)
mov    %r8,0x58(%rsp)
mov    %ecx,0x38(%rsp)
mov    %edx,0x3c(%rsp)
mov    %rsi,%rbp
mov    %rdi,%r14
movl   $0x0,0x24(%rsp)
mov    0x24(%rsp),%eax
cmp    $0x3e7,%eax
jg     1200 <vprintf+0x50>
nopl   0x0(%rax)
addl   $0x1,0x24(%rsp)
mov    0x24(%rsp),%eax
cmp    $0x3e8,%eax
jl     11f0 <vprintf+0x40>
mov    %rbp,%rdi
call   1040 <strlen@plt>
test   %eax,%eax
jle    15a7 <vprintf+0x3f7>
mov    %eax,%eax
mov    %rax,0x60(%rsp)
lea    -0x1(%r14),%rax
mov    %rax,0x48(%rsp)
mov    $0xfffffffe,%r13d
xor    %r12d,%r12d
xor    %ebx,%ebx
xor    %r15d,%r15d
mov    %rax,0x30(%rsp)
mov    %rbp,0x28(%rsp)
mov    %r14,0x18(%rsp)
jmp    1269 <vprintf+0xb9>
nop
movl   $0x0,0x10(%rsp)
mov    $0xffffffff,%eax
mov    %rax,0x30(%rsp)
mov    0x14(%rsp),%eax
mov    %eax,0xc(%rsp)
add    $0x1,%r12
cmp    0x60(%rsp),%r12
je     15aa <vprintf+0x3fa>
test   $0x1,%bl
jne    12b0 <vprintf+0x100>
cmpb   $0x25,0x0(%rbp,%r12,1)
jne    1310 <vprintf+0x160>
mov    $0x1,%bl
test   %r12,%r12
je     1240 <vprintf+0x90>
mov    $0xffffffff,%eax
add    %r12d,%eax
cmpb   $0x25,0x0(%rbp,%rax,1)
jne    1240 <vprintf+0x90>
testl  $0x100000,0x14(%rsp)
jne    1413 <vprintf+0x263>
mov    $0x25,%edi
jmp    13ab <vprintf+0x1fb>
nopl   0x0(%rax,%rax,1)
mov    0x3c(%rsp),%edi
cmp    $0xfffffffe,%r13d
je     12cf <vprintf+0x11f>
mov    0x38(%rsp),%edi
cmp    $0xffffffff,%r13d
je     12cf <vprintf+0x11f>
movslq %r13d,%rax
mov    0x58(%rsp),%rcx
mov    (%rcx,%rax,4),%edi
mov    0x0(%rbp,%r12,1),%al
lea    -0x58(%rax),%ecx
cmp    $0x20,%cl
ja     135d <vprintf+0x1ad>
movzbl %cl,%ecx
lea    0xd16(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
add    $0x1,%r13d
mov    0xc(%rsp),%ecx
or     0x10(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   10c0 <hex@plt>
jmp    1410 <vprintf+0x260>
nop
lea    (%r12,%rbp,1),%r14
testl  $0x100000,0x14(%rsp)
jne    1388 <vprintf+0x1d8>
movsbl (%r14),%edi
mov    0x18(%rsp),%r14
mov    %r14,%rsi
mov    %r15d,%edx
call   10a0 <outchar@plt>
mov    %eax,%r15d
xor    %ebx,%ebx
mov    0x28(%rsp),%rbp
jmp    125a <vprintf+0xaa>
add    $0x1,%r13d
mov    0xc(%rsp),%ecx
or     0x10(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   1090 <decimal@plt>
jmp    1410 <vprintf+0x260>
cmp    $0x25,%al
je     127a <vprintf+0xca>
lea    (%r12,%rbp,1),%r14
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     14db <vprintf+0x32b>
mov    0x30(%rsp),%rcx
cmp    $0x3,%ecx
jle    1528 <vprintf+0x378>
xor    %ebx,%ebx
mov    0x28(%rsp),%rbp
mov    0x18(%rsp),%r14
jmp    125a <vprintf+0xaa>
add    $0x1,%r13d
testl  $0x100000,0xc(%rsp)
jne    141a <vprintf+0x26a>
movsbl %dil,%edi
mov    %r14,%rsi
mov    %r15d,%edx
call   10a0 <outchar@plt>
jmp    1410 <vprintf+0x260>
add    $0x1,%r13d
movslq %edi,%rdi
mov    0xc(%rsp),%ebx
test   $0x100000,%ebx
jne    1444 <vprintf+0x294>
mov    %rdi,0x50(%rsp)
call   1040 <strlen@plt>
mov    %ebx,%r8d
or     0x10(%rsp),%r8d
mov    0x50(%rsp),%rdi
mov    %eax,%esi
mov    %r14,%rdx
mov    %r15d,%ecx
call   10b0 <outstring@plt>
jmp    1410 <vprintf+0x260>
add    $0x1,%r13d
mov    0xc(%rsp),%ecx
or     0x10(%rsp),%ecx
mov    %r14,%rsi
mov    %r15d,%edx
call   1070 <number@plt>
nopl   0x0(%rax,%rax,1)
mov    %eax,%r15d
xor    %ebx,%ebx
jmp    125a <vprintf+0xaa>
movslq %edi,%rdi
cmp    $0xffffffffffffffff,%r14
je     156c <vprintf+0x3bc>
movslq %r15d,%rax
add    %r14,%rax
nopl   (%rax)
movzbl (%rax),%ecx
add    $0x1,%r15d
add    $0x1,%rax
cmp    $0x21,%cl
jl     1430 <vprintf+0x280>
mov    %cl,(%rdi)
jmp    1413 <vprintf+0x263>
cmp    $0xffffffffffffffff,%r14
je     1576 <vprintf+0x3c6>
cmp    $0x100,%r14
jb     1413 <vprintf+0x263>
movslq %r15d,%rax
mov    0x48(%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     1480 <vprintf+0x2d0>
movslq %edx,%rax
add    0x18(%rsp),%rax
mov    $0xffffffff,%ebx
nopl   0x0(%rax,%rax,1)
add    $0x1,%ebp
add    $0x1,%ebx
cmpb   $0x20,(%rax)
lea    0x1(%rax),%rax
jg     14b0 <vprintf+0x300>
mov    %ebx,%edx
mov    %rdi,%r14
call   1060 <memcpy@plt>
movslq %ebx,%rax
movb   $0x0,(%r14,%rax,1)
xor    %ebx,%ebx
mov    %ebp,%r15d
jmp    138a <vprintf+0x1da>
mov    (%r14),%al
lea    -0x2d(%rax),%ecx
cmp    $0x3f,%cl
ja     14f9 <vprintf+0x349>
movzbl %cl,%ecx
movabs $0x8000000000000003,%rdx
bt     %rcx,%rdx
jb     1501 <vprintf+0x351>
cmp    $0x20,%al
jne    1314 <vprintf+0x164>
mov    0xc(%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,0xc(%rsp)
jmp    138a <vprintf+0x1da>
mov    (%r14),%al
movslq %ecx,%rcx
lea    0x1(%rcx),%rdx
mov    %rdx,0x30(%rsp)
mov    %al,0x44(%rsp,%rcx,1)
lea    0x43(%rsp),%rdi
movb   $0x0,0x2(%rcx,%rdi,1)
call   1080 <atodec@plt>
mov    %eax,0x10(%rsp)
xor    %eax,%eax
cmpb   $0x30,(%r14)
sete   %al
shl    $0x11,%eax
or     0xc(%rsp),%eax
or     $0x10000,%eax
mov    %eax,0xc(%rsp)
jmp    138a <vprintf+0x1da>
movb   $0x0,(%rdi)
mov    $0x1,%esi
jmp    158c <vprintf+0x3dc>
mov    %ebx,%eax
and    $0x10000,%eax
cmp    $0x1,%eax
sbb    %eax,%eax
mov    0x10(%rsp),%esi
or     %eax,%esi
mov    %esi,0x10(%rsp)
call   10d0 <read_string@plt>
lea    0xaec(%rip),%rdi
mov    $0x1,%esi
call   1050 <sio_write@plt>
jmp    1413 <vprintf+0x263>
xor    %r15d,%r15d
mov    %r15d,%eax
add    $0x68,%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*
%26 = alloca i32
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 volatile i32 0, i32* %26
br label %27
27: ; preds = %31, %6
%28 = load volatile i32, i32* %26
%29 = icmp slt i32 %28, 1000
br i1 %29, label %30, label %34
30: ; preds = %27
br label %31
31: ; preds = %30
%32 = load volatile i32, i32* %26
%33 = add nsw i32 %32, 1
store volatile i32 %33, i32* %26
br label %27
34: ; preds = %27
store i8 0, i8* %22
store i32 0, i32* %15
store i32 -2, i32* %16
%35 = load i8*, i8** %8
%36 = call i32 @strlen(i8* %35)
store i32 %36, i32* %14
store i32 0, i32* %13
br label %37
37: ; preds = %502, %34
%38 = load i32, i32* %13
%39 = load i32, i32* %14
%40 = icmp slt i32 %38, %39
br i1 %40, label %41, label %505
41: ; preds = %37
%42 = load i8, i8* %22
%43 = sext i8 %42 to i32
%44 = and i32 %43, 1
%45 = icmp ne i32 %44, 0
br i1 %45, label %46, label %64
46: ; preds = %41
%47 = load i32, i32* %16
%48 = icmp eq i32 %47, -2
br i1 %48, label %49, label %51
49: ; preds = %46
%50 = load i32, i32* %9
store i32 %50, i32* %17
br label %63
51: ; preds = %46
%52 = load i32, i32* %16
%53 = icmp eq i32 %52, -1
br i1 %53, label %54, label %56
54: ; preds = %51
%55 = load i32, i32* %10
store i32 %55, i32* %17
br label %62
56: ; preds = %51
%57 = load i32*, i32** %11
%58 = load i32, i32* %16
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i32, i32* %57, i64 %59
%61 = load i32, i32* %60
store i32 %61, i32* %17
br label %62
62: ; preds = %56, %54
br label %63
63: ; preds = %62, %49
br label %64
64: ; preds = %63, %41
%65 = load i8*, i8** %8
%66 = load i32, i32* %13
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 37
br i1 %71, label %72, label %109
72: ; preds = %64
%73 = load i32, i32* %13
%74 = icmp sgt i32 %73, 0
br i1 %74, label %75, label %102
75: ; preds = %72
%76 = load i8*, i8** %8
%77 = load i32, i32* %13
%78 = sub nsw i32 %77, 1
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i8, i8* %76, i64 %79
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 37
br i1 %83, label %84, label %102
84: ; preds = %75
%85 = load i8, i8* %22
%86 = sext i8 %85 to i32
%87 = and i32 %86, -2
%88 = trunc i32 %87 to i8
store i8 %88, i8* %22
%89 = load i32, i32* %12
%90 = and i32 %89, 1048576
%91 = icmp ne i32 %90, 0
br i1 %91, label %101, label %92
92: ; preds = %84
%93 = load i8*, i8** %8
%94 = load i32, i32* %13
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %93, i64 %95
%97 = load i8, i8* %96
%98 = load i8*, i8** %7
%99 = load i32, i32* %15
%100 = call i32 @outchar(i8 signext %97, i8* %98, i32 %99)
store i32 %100, i32* %15
br label %101
101: ; preds = %92, %84
br label %108
102: ; preds = %75, %72
%103 = load i8, i8* %22
%104 = sext i8 %103 to i32
%105 = or i32 %104, 1
%106 = trunc i32 %105 to i8
store i8 %106, i8* %22
store i32 -1, i32* %19
store i32 0, i32* %18
%107 = load i32, i32* %12
store i32 %107, i32* %20
br label %108
108: ; preds = %102, %101
br label %501
109: ; preds = %64
%110 = load i8, i8* %22
%111 = sext i8 %110 to i32
%112 = and i32 %111, 1
%113 = icmp ne i32 %112, 0
br i1 %113, label %114, label %144
114: ; preds = %109
%115 = load i8*, i8** %8
%116 = load i32, i32* %13
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i8, i8* %115, i64 %117
%119 = load i8, i8* %118
%120 = sext i8 %119 to i32
%121 = icmp eq i32 %120, 100
br i1 %121, label %130, label %122
122: ; preds = %114
%123 = load i8*, i8** %8
%124 = load i32, i32* %13
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %123, i64 %125
%127 = load i8, i8* %126
%128 = sext i8 %127 to i32
%129 = icmp eq i32 %128, 105
br i1 %129, label %130, label %144
130: ; preds = %122, %114
%131 = load i32, i32* %16
%132 = add nsw i32 %131, 1
store i32 %132, i32* %16
%133 = load i32, i32* %17
%134 = load i8*, i8** %7
%135 = load i32, i32* %15
%136 = load i32, i32* %18
%137 = load i32, i32* %20
%138 = or i32 %136, %137
%139 = call i32 @decimal(i32 %133, i8* %134, i32 %135, i32 %138)
store i32 %139, i32* %15
%140 = load i8, i8* %22
%141 = sext i8 %140 to i32
%142 = and i32 %141, -2
%143 = trunc i32 %142 to i8
store i8 %143, i8* %22
br label %500
144: ; preds = %122, %109
%145 = load i8, i8* %22
%146 = sext i8 %145 to i32
%147 = and i32 %146, 1
%148 = icmp ne i32 %147, 0
br i1 %148, label %149, label %171
149: ; preds = %144
%150 = load i8*, i8** %8
%151 = load i32, i32* %13
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %150, i64 %152
%154 = load i8, i8* %153
%155 = sext i8 %154 to i32
%156 = icmp eq i32 %155, 117
br i1 %156, label %157, label %171
157: ; preds = %149
%158 = load i32, i32* %16
%159 = add nsw i32 %158, 1
store i32 %159, i32* %16
%160 = load i32, i32* %17
%161 = load i8*, i8** %7
%162 = load i32, i32* %15
%163 = load i32, i32* %18
%164 = load i32, i32* %20
%165 = or i32 %163, %164
%166 = call i32 @number(i32 %160, i8* %161, i32 %162, i32 %165)
store i32 %166, i32* %15
%167 = load i8, i8* %22
%168 = sext i8 %167 to i32
%169 = and i32 %168, -2
%170 = trunc i32 %169 to i8
store i8 %170, i8* %22
br label %499
171: ; preds = %149, %144
%172 = load i8, i8* %22
%173 = sext i8 %172 to i32
%174 = and i32 %173, 1
%175 = icmp ne i32 %174, 0
br i1 %175, label %176, label %206
176: ; preds = %171
%177 = load i8*, i8** %8
%178 = load i32, i32* %13
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds i8, i8* %177, i64 %179
%181 = load i8, i8* %180
%182 = sext i8 %181 to i32
%183 = icmp eq i32 %182, 120
br i1 %183, label %192, label %184
184: ; preds = %176
%185 = load i8*, i8** %8
%186 = load i32, i32* %13
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds i8, i8* %185, i64 %187
%189 = load i8, i8* %188
%190 = sext i8 %189 to i32
%191 = icmp eq i32 %190, 88
br i1 %191, label %192, label %206
192: ; preds = %184, %176
%193 = load i32, i32* %16
%194 = add nsw i32 %193, 1
store i32 %194, i32* %16
%195 = load i32, i32* %17
%196 = load i8*, i8** %7
%197 = load i32, i32* %15
%198 = load i32, i32* %18
%199 = load i32, i32* %20
%200 = or i32 %198, %199
%201 = call i32 @hex(i32 %195, i8* %196, i32 %197, i32 %200)
store i32 %201, i32* %15
%202 = load i8, i8* %22
%203 = sext i8 %202 to i32
%204 = and i32 %203, -2
%205 = trunc i32 %204 to i8
store i8 %205, i8* %22
br label %498
206: ; preds = %184, %171
%207 = load i8, i8* %22
%208 = sext i8 %207 to i32
%209 = and i32 %208, 1
%210 = icmp ne i32 %209, 0
br i1 %210, label %211, label %303
211: ; preds = %206
%212 = load i8*, i8** %8
%213 = load i32, i32* %13
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds i8, i8* %212, i64 %214
%216 = load i8, i8* %215
%217 = sext i8 %216 to i32
%218 = icmp eq i32 %217, 115
br i1 %218, label %219, label %303
219: ; preds = %211
%220 = load i32, i32* %16
%221 = add nsw i32 %220, 1
store i32 %221, i32* %16
%222 = load i32, i32* %17
%223 = sext i32 %222 to i64
%224 = inttoptr i64 %223 to i8*
store i8* %224, i8** %24
%225 = load i32, i32* %20
%226 = and i32 %225, 1048576
%227 = icmp ne i32 %226, 0
br i1 %227, label %228, label %288
228: ; preds = %219
%229 = load i8*, i8** %7
%230 = icmp eq i8* %229, inttoptr (i64 -1 to i8*)
br i1 %230, label %231, label %241
231: ; preds = %228
%232 = load i32, i32* %20
%233 = and i32 %232, 65536
%234 = icmp ne i32 %233, 0
br i1 %234, label %236, label %235
235: ; preds = %231
store i32 -1, i32* %18
br label %236
236: ; preds = %235, %231
%237 = load i8*, i8** %24
%238 = load i32, i32* %18
%239 = call i32 @read_string(i8* %237, i32 %238)
%240 = call i32 @sio_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %287
241: ; preds = %228
%242 = load i8*, i8** %7
%243 = icmp ugt i8* %242, inttoptr (i64 255 to i8*)
br i1 %243, label %244, label %286
244: ; preds = %241
br label %245
245: ; preds = %253, %244
%246 = load i8*, i8** %7
%247 = load i32, i32* %15
%248 = sext i32 %247 to i64
%249 = getelementptr inbounds i8, i8* %246, i64 %248
%250 = load i8, i8* %249
%251 = sext i8 %250 to i32
%252 = icmp sle i32 %251, 32
br i1 %252, label %253, label %256
253: ; preds = %245
%254 = load i32, i32* %15
%255 = add nsw i32 %254, 1
store i32 %255, i32* %15
br label %245
256: ; preds = %245
%257 = load i8*, i8** %7
%258 = load i32, i32* %15
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds i8, i8* %257, i64 %259
store i8* %260, i8** %25
%261 = load i32, i32* %15
store i32 %261, i32* %21
br label %262
262: ; preds = %270, %256
%263 = load i8*, i8** %7
%264 = load i32, i32* %15
%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 = icmp sgt i32 %268, 32
br i1 %269, label %270, label %273
270: ; preds = %262
%271 = load i32, i32* %15
%272 = add nsw i32 %271, 1
store i32 %272, i32* %15
br label %262
273: ; preds = %262
%274 = load i8*, i8** %24
%275 = load i8*, i8** %25
%276 = load i32, i32* %15
%277 = load i32, i32* %21
%278 = sub nsw i32 %276, %277
%279 = call i32 @memcpy(i8* %274, i8* %275, i32 %278)
%280 = load i8*, i8** %24
%281 = load i32, i32* %15
%282 = load i32, i32* %21
%283 = sub nsw i32 %281, %282
%284 = sext i32 %283 to i64
%285 = getelementptr inbounds i8, i8* %280, i64 %284
store i8 0, i8* %285
br label %286
286: ; preds = %273, %241
br label %287
287: ; preds = %286, %236
br label %298
288: ; preds = %219
%289 = load i8*, i8** %24
%290 = load i8*, i8** %24
%291 = call i32 @strlen(i8* %290)
%292 = load i8*, i8** %7
%293 = load i32, i32* %15
%294 = load i32, i32* %18
%295 = load i32, i32* %20
%296 = or i32 %294, %295
%297 = call i32 @outstring(i8* %289, i32 %291, i8* %292, i32 %293, i32 %296)
store i32 %297, i32* %15
br label %298
298: ; preds = %288, %287
%299 = load i8, i8* %22
%300 = sext i8 %299 to i32
%301 = and i32 %300, -2
%302 = trunc i32 %301 to i8
store i8 %302, i8* %22
br label %497
303: ; preds = %211, %206
%304 = load i8, i8* %22
%305 = sext i8 %304 to i32
%306 = and i32 %305, 1
%307 = icmp ne i32 %306, 0
br i1 %307, label %308, label %365
308: ; preds = %303
%309 = load i8*, i8** %8
%310 = load i32, i32* %13
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds i8, i8* %309, i64 %311
%313 = load i8, i8* %312
%314 = sext i8 %313 to i32
%315 = icmp eq i32 %314, 99
br i1 %315, label %316, label %365
316: ; preds = %308
%317 = load i32, i32* %16
%318 = add nsw i32 %317, 1
store i32 %318, i32* %16
%319 = load i32, i32* %20
%320 = and i32 %319, 1048576
%321 = icmp ne i32 %320, 0
br i1 %321, label %322, label %354
322: ; preds = %316
%323 = load i32, i32* %17
%324 = sext i32 %323 to i64
%325 = inttoptr i64 %324 to i8*
store i8* %325, i8** %24
%326 = load i8*, i8** %7
%327 = icmp eq i8* %326, inttoptr (i64 -1 to i8*)
br i1 %327, label %328, label %333
328: ; preds = %322
%329 = load i8*, i8** %24
store i8 0, i8* %329
%330 = load i8*, i8** %24
%331 = call i32 @read_string(i8* %330, i32 1)
%332 = call i32 @sio_write(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0), i32 1)
br label %353
333: ; preds = %322
br label %334
334: ; preds = %342, %333
%335 = load i8*, i8** %7
%336 = load i32, i32* %15
%337 = sext i32 %336 to i64
%338 = getelementptr inbounds i8, i8* %335, i64 %337
%339 = load i8, i8* %338
%340 = sext i8 %339 to i32
%341 = icmp sle i32 %340, 32
br i1 %341, label %342, label %345
342: ; preds = %334
%343 = load i32, i32* %15
%344 = add nsw i32 %343, 1
store i32 %344, i32* %15
br label %334
345: ; preds = %334
%346 = load i8*, i8** %7
%347 = load i32, i32* %15
%348 = add nsw i32 %347, 1
store i32 %348, i32* %15
%349 = sext i32 %347 to i64
%350 = getelementptr inbounds i8, i8* %346, i64 %349
%351 = load i8, i8* %350
%352 = load i8*, i8** %24
store i8 %351, i8* %352
br label %353
353: ; preds = %345, %328
br label %360
354: ; preds = %316
%355 = load i32, i32* %17
%356 = trunc i32 %355 to i8
%357 = load i8*, i8** %7
%358 = load i32, i32* %15
%359 = call i32 @outchar(i8 signext %356, i8* %357, i32 %358)
store i32 %359, i32* %15
br label %360
360: ; preds = %354, %353
%361 = load i8, i8* %22
%362 = sext i8 %361 to i32
%363 = and i32 %362, -2
%364 = trunc i32 %363 to i8
store i8 %364, i8* %22
br label %496
365: ; preds = %308, %303
%366 = load i8, i8* %22
%367 = sext i8 %366 to i32
%368 = and i32 %367, 1
%369 = icmp ne i32 %368, 0
br i1 %369, label %370, label %416
370: ; preds = %365
%371 = load i8*, i8** %8
%372 = load i32, i32* %13
%373 = sext i32 %372 to i64
%374 = getelementptr inbounds i8, i8* %371, i64 %373
%375 = load i8, i8* %374
%376 = call i64 @isdigit(i8 signext %375)
%377 = icmp ne i64 %376, 0
br i1 %377, label %378, label %416
378: ; preds = %370
%379 = load i32, i32* %19
%380 = icmp sgt i32 %379, 3
br i1 %380, label %381, label %386
381: ; preds = %378
%382 = load i8, i8* %22
%383 = sext i8 %382 to i32
%384 = and i32 %383, -2
%385 = trunc i32 %384 to i8
store i8 %385, i8* %22
br label %415
386: ; preds = %378
%387 = load i8*, i8** %8
%388 = load i32, i32* %13
%389 = sext i32 %388 to i64
%390 = getelementptr inbounds i8, i8* %387, i64 %389
%391 = load i8, i8* %390
%392 = load i32, i32* %19
%393 = add nsw i32 %392, 1
store i32 %393, i32* %19
%394 = sext i32 %393 to i64
%395 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 %394
store i8 %391, i8* %395
%396 = load i32, i32* %19
%397 = add nsw i32 %396, 1
%398 = sext i32 %397 to i64
%399 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 %398
store i8 0, i8* %399
%400 = getelementptr inbounds [5 x i8], [5 x i8]* %23, i64 0, i64 0
%401 = call i32 @atodec(i8* %400)
store i32 %401, i32* %18
%402 = load i32, i32* %20
%403 = or i32 %402, 65536
store i32 %403, i32* %20
%404 = load i8*, i8** %8
%405 = load i32, i32* %13
%406 = sext i32 %405 to i64
%407 = getelementptr inbounds i8, i8* %404, i64 %406
%408 = load i8, i8* %407
%409 = sext i8 %408 to i32
%410 = icmp eq i32 %409, 48
br i1 %410, label %411, label %414
411: ; preds = %386
%412 = load i32, i32* %20
%413 = or i32 %412, 131072
store i32 %413, i32* %20
br label %414
414: ; preds = %411, %386
br label %415
415: ; preds = %414, %381
br label %495
416: ; preds = %370, %365
%417 = load i8, i8* %22
%418 = sext i8 %417 to i32
%419 = and i32 %418, 1
%420 = icmp ne i32 %419, 0
br i1 %420, label %421, label %476
421: ; preds = %416
%422 = load i8*, i8** %8
%423 = load i32, i32* %13
%424 = sext i32 %423 to i64
%425 = getelementptr inbounds i8, i8* %422, i64 %424
%426 = load i8, i8* %425
%427 = sext i8 %426 to i32
%428 = icmp eq i32 %427, 46
br i1 %428, label %453, label %429
429: ; preds = %421
%430 = load i8*, i8** %8
%431 = load i32, i32* %13
%432 = sext i32 %431 to i64
%433 = getelementptr inbounds i8, i8* %430, i64 %432
%434 = load i8, i8* %433
%435 = sext i8 %434 to i32
%436 = icmp eq i32 %435, 32
br i1 %436, label %453, label %437
437: ; preds = %429
%438 = load i8*, i8** %8
%439 = load i32, i32* %13
%440 = sext i32 %439 to i64
%441 = getelementptr inbounds i8, i8* %438, i64 %440
%442 = load i8, i8* %441
%443 = sext i8 %442 to i32
%444 = icmp eq i32 %443, 108
br i1 %444, label %453, label %445
445: ; preds = %437
%446 = load i8*, i8** %8
%447 = load i32, i32* %13
%448 = sext i32 %447 to i64
%449 = getelementptr inbounds i8, i8* %446, i64 %448
%450 = load i8, i8* %449
%451 = sext i8 %450 to i32
%452 = icmp eq i32 %451, 45
br i1 %452, label %453, label %476
453: ; preds = %445, %437, %429, %421
%454 = load i8*, i8** %8
%455 = load i32, i32* %13
%456 = sext i32 %455 to i64
%457 = getelementptr inbounds i8, i8* %454, i64 %456
%458 = load i8, i8* %457
%459 = sext i8 %458 to i32
%460 = icmp eq i32 %459, 46
br i1 %460, label %461, label %464
461: ; preds = %453
%462 = load i32, i32* %20
%463 = or i32 %462, 262144
store i32 %463, i32* %20
br label %464
464: ; preds = %461, %453
%465 = load i8*, i8** %8
%466 = load i32, i32* %13
%467 = sext i32 %466 to i64
%468 = getelementptr inbounds i8, i8* %465, i64 %467
%469 = load i8, i8* %468
%470 = sext i8 %469 to i32
%471 = icmp eq i32 %470, 45
br i1 %471, label %472, label %475
472: ; preds = %464
%473 = load i32, i32* %20
%474 = or i32 %473, 524288
store i32 %474, i32* %20
br label %475
475: ; preds = %472, %464
br label %494
476: ; preds = %445, %416
%477 = load i8, i8* %22
%478 = sext i8 %477 to i32
%479 = and i32 %478, -2
%480 = trunc i32 %479 to i8
store i8 %480, i8* %22
%481 = load i32, i32* %12
%482 = and i32 %481, 1048576
%483 = icmp ne i32 %482, 0
br i1 %483, label %493, label %484
484: ; preds = %476
%485 = load i8*, i8** %8
%486 = load i32, i32* %13
%487 = sext i32 %486 to i64
%488 = getelementptr inbounds i8, i8* %485, i64 %487
%489 = load i8, i8* %488
%490 = load i8*, i8** %7
%491 = load i32, i32* %15
%492 = call i32 @outchar(i8 signext %489, i8* %490, i32 %491)
store i32 %492, i32* %15
br label %493
493: ; preds = %484, %476
br label %494
494: ; preds = %493, %475
br label %495
495: ; preds = %494, %415
br label %496
496: ; preds = %495, %360
br label %497
497: ; preds = %496, %298
br label %498
498: ; preds = %497, %192
br label %499
499: ; preds = %498, %157
br label %500
500: ; preds = %499, %130
br label %501
501: ; preds = %500, %108
br label %502
502: ; preds = %501
%503 = load i32, i32* %13
%504 = add nsw i32 %503, 1
store i32 %504, i32* %13
br label %37
505: ; preds = %37
%506 = load i32, i32* %15
ret i32 %506
}

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