#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 uint32_t;
typedef int int32_t;

/* Variables and functions */
int clz32(int);
int /*<<< orphan*/ reverse(char *);
char *itoa(int32_t value, char *buf, int base) {
  switch (base) {
  case 2: {
    int i = 0, lz = 31 - clz32(value);
    do {
      int32_t bit = (value >> lz) & 1;
      lz--;
      buf[i++] = '0' + bit;
    } while (lz >= 0);
    buf[i] = '\0';
    break;
  }
  default:
  case 10: {
    int i = 0;
    int32_t sign = value;
    if (value < 0)
      value = -value;
    uint32_t v = value;
    do {
      buf[i++] = '0' + v % 10;
      v /= 10;
    } while (v > 0);
    if (sign < 0)
      buf[i++] = '-';
    buf[i] = '\0';
    reverse(buf);
    break;
  }
  case 16: {
    int i = 0, lz = clz32(value) & 0x1c, nyb = 28 - lz;
    do {
      int32_t c = (value >> nyb) & 0xf;
      nyb -= 4;
      if (c > 9)
        c = 'A' + c - 10;
      else
        c = '0' + c;
      buf[i++] = c;
    } while (nyb >= 0);
    buf[i] = '\0';
  } break;
  }
  return buf;
}


x86 assembly (clang, -O0):
<itoa>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x40(%rbp)
sub    $0x2,%eax
je     1168 <itoa+0x48>
jmp    1146 <itoa+0x26>
mov    -0x40(%rbp),%eax
sub    $0xa,%eax
je     11d7 <itoa+0xb7>
jmp    1157 <itoa+0x37>
mov    -0x40(%rbp),%eax
sub    $0x10,%eax
je     1271 <itoa+0x151>
jmp    11d2 <itoa+0xb2>
movl   $0x0,-0x18(%rbp)
mov    -0x4(%rbp),%edi
call   1040 <clz32@plt>
mov    %eax,%ecx
mov    $0x1f,%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sar    %cl,%eax
and    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x18(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
cmpl   $0x0,-0x1c(%rbp)
jge    1183 <itoa+0x63>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    12fc <itoa+0x1dc>
jmp    11d7 <itoa+0xb7>
movl   $0x0,-0x24(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x4(%rbp)
jge    11f6 <itoa+0xd6>
xor    %eax,%eax
sub    -0x4(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x24(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x2c(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jg     11fc <itoa+0xdc>
cmpl   $0x0,-0x28(%rbp)
jge    1257 <itoa+0x137>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
movb   $0x2d,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rdi
call   1030 <reverse@plt>
jmp    12fc <itoa+0x1dc>
movl   $0x0,-0x30(%rbp)
mov    -0x4(%rbp),%edi
call   1040 <clz32@plt>
and    $0x1c,%eax
mov    %eax,-0x34(%rbp)
mov    $0x1c,%eax
sub    -0x34(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
mov    -0x38(%rbp),%ecx
sar    %cl,%eax
and    $0xf,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
sub    $0x4,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x9,-0x3c(%rbp)
jle    12c3 <itoa+0x1a3>
mov    -0x3c(%rbp),%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %eax,-0x3c(%rbp)
jmp    12cc <itoa+0x1ac>
mov    -0x3c(%rbp),%eax
add    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%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)
cmpl   $0x0,-0x38(%rbp)
jge    1291 <itoa+0x171>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<itoa>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %edi,%r14d
cmp    $0x10,%edx
je     16a4 <itoa+0x584>
cmp    $0x2,%edx
jne    1804 <itoa+0x6e4>
mov    %r14d,%edi
call   1040 <clz32@plt>
xor    %edx,%edx
mov    $0x1f,%ecx
sub    %eax,%ecx
mov    $0x0,%edi
cmovs  %ecx,%edi
mov    $0x1f,%esi
add    %eax,%edi
sub    %edi,%esi
cmp    $0xf,%esi
jb     1680 <itoa+0x560>
add    $0x1,%rsi
mov    %rsi,%rdx
and    $0xfffffffffffffff0,%rdx
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm13
movdqa 0xe7b(%rip),%xmm8
paddd  %xmm13,%xmm8
movdqa 0xe7d(%rip),%xmm15
paddd  %xmm13,%xmm15
movdqa 0xe7f(%rip),%xmm14
paddd  %xmm13,%xmm14
paddd  0xe81(%rip),%xmm13
movd   %r14d,%xmm0
pshufd $0x0,%xmm0,%xmm9
lea    -0x10(%rdx),%rax
mov    %rax,%r8
shr    $0x4,%r8
add    $0x1,%r8
test   %rax,%rax
je     186a <itoa+0x74a>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %eax,%eax
movaps 0xe5d(%rip),%xmm12
movdqa 0xe94(%rip),%xmm11
movdqa 0xe6b(%rip),%xmm10
cs nopw 0x0(%rax,%rax,1)
nop
pshuflw $0xfe,%xmm8,%xmm0
movdqa %xmm9,%xmm2
psrld  %xmm0,%xmm2
pshuflw $0x54,%xmm8,%xmm0
movdqa %xmm9,%xmm1
psrld  %xmm0,%xmm1
pshufd $0xee,%xmm8,%xmm0
pshuflw $0xfe,%xmm0,%xmm5
movdqa %xmm9,%xmm6
psrld  %xmm5,%xmm6
punpcklqdq %xmm2,%xmm1
pshuflw $0x54,%xmm0,%xmm0
movdqa %xmm9,%xmm2
psrld  %xmm0,%xmm2
punpckhqdq %xmm6,%xmm2
pshuflw $0xfe,%xmm15,%xmm0
movdqa %xmm9,%xmm5
psrld  %xmm0,%xmm5
shufps $0xcc,%xmm2,%xmm1
pshuflw $0x54,%xmm15,%xmm2
movdqa %xmm9,%xmm0
psrld  %xmm2,%xmm0
pshufd $0xee,%xmm15,%xmm2
pshuflw $0xfe,%xmm2,%xmm6
movdqa %xmm9,%xmm7
psrld  %xmm6,%xmm7
punpcklqdq %xmm5,%xmm0
pshuflw $0x54,%xmm2,%xmm2
movdqa %xmm9,%xmm5
psrld  %xmm2,%xmm5
punpckhqdq %xmm7,%xmm5
pshuflw $0xfe,%xmm14,%xmm2
movdqa %xmm9,%xmm6
psrld  %xmm2,%xmm6
shufps $0xcc,%xmm5,%xmm0
pshuflw $0x54,%xmm14,%xmm5
movdqa %xmm9,%xmm2
psrld  %xmm5,%xmm2
pshufd $0xee,%xmm14,%xmm5
pshuflw $0xfe,%xmm5,%xmm7
movdqa %xmm9,%xmm3
psrld  %xmm7,%xmm3
punpcklqdq %xmm6,%xmm2
pshuflw $0x54,%xmm5,%xmm5
movdqa %xmm9,%xmm6
psrld  %xmm5,%xmm6
punpckhqdq %xmm3,%xmm6
pshuflw $0xfe,%xmm13,%xmm3
movdqa %xmm9,%xmm7
psrld  %xmm3,%xmm7
shufps $0xcc,%xmm6,%xmm2
pshuflw $0x54,%xmm13,%xmm3
movdqa %xmm9,%xmm5
psrld  %xmm3,%xmm5
pshufd $0xee,%xmm13,%xmm3
pshuflw $0xfe,%xmm3,%xmm6
movdqa %xmm9,%xmm4
psrld  %xmm6,%xmm4
punpcklqdq %xmm7,%xmm5
pshuflw $0x54,%xmm3,%xmm3
movdqa %xmm9,%xmm6
psrld  %xmm3,%xmm6
punpckhqdq %xmm4,%xmm6
shufps $0xcc,%xmm6,%xmm5
andps  %xmm12,%xmm5
andps  %xmm12,%xmm2
packuswb %xmm2,%xmm5
andps  %xmm12,%xmm0
andps  %xmm12,%xmm1
packuswb %xmm1,%xmm0
packuswb %xmm0,%xmm5
movdqa 0xcfc(%rip),%xmm7
pand   %xmm7,%xmm5
por    %xmm10,%xmm5
movdqu %xmm5,(%rbx,%rax,1)
movdqa %xmm13,%xmm0
movdqa 0xd01(%rip),%xmm1
paddd  %xmm1,%xmm0
movdqa %xmm14,%xmm2
paddd  %xmm1,%xmm2
movdqa %xmm15,%xmm3
paddd  %xmm1,%xmm3
movdqa %xmm8,%xmm4
paddd  %xmm1,%xmm4
pshuflw $0xfe,%xmm4,%xmm1
movdqa %xmm9,%xmm5
psrld  %xmm1,%xmm5
pshuflw $0x54,%xmm4,%xmm6
movdqa %xmm9,%xmm1
psrld  %xmm6,%xmm1
punpcklqdq %xmm5,%xmm1
pshufd $0xee,%xmm4,%xmm4
pshuflw $0xfe,%xmm4,%xmm5
movdqa %xmm9,%xmm6
psrld  %xmm5,%xmm6
pshuflw $0x54,%xmm4,%xmm4
movdqa %xmm9,%xmm5
psrld  %xmm4,%xmm5
punpckhqdq %xmm6,%xmm5
shufps $0xcc,%xmm5,%xmm1
pshuflw $0xfe,%xmm3,%xmm4
movdqa %xmm9,%xmm6
psrld  %xmm4,%xmm6
pshuflw $0x54,%xmm3,%xmm4
movdqa %xmm9,%xmm5
psrld  %xmm4,%xmm5
punpcklqdq %xmm6,%xmm5
pshufd $0xee,%xmm3,%xmm3
pshuflw $0xfe,%xmm3,%xmm4
movdqa %xmm9,%xmm6
psrld  %xmm4,%xmm6
pshuflw $0x54,%xmm3,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
punpckhqdq %xmm6,%xmm4
shufps $0xcc,%xmm4,%xmm5
pshuflw $0xfe,%xmm2,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
pshuflw $0x54,%xmm2,%xmm3
movdqa %xmm9,%xmm6
psrld  %xmm3,%xmm6
punpcklqdq %xmm4,%xmm6
pshufd $0xee,%xmm2,%xmm2
pshuflw $0xfe,%xmm2,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
pshuflw $0x54,%xmm2,%xmm2
movdqa %xmm9,%xmm3
psrld  %xmm2,%xmm3
punpckhqdq %xmm4,%xmm3
shufps $0xcc,%xmm3,%xmm6
pshuflw $0xfe,%xmm0,%xmm2
movdqa %xmm9,%xmm3
psrld  %xmm2,%xmm3
pshuflw $0x54,%xmm0,%xmm4
movdqa %xmm9,%xmm2
psrld  %xmm4,%xmm2
punpcklqdq %xmm3,%xmm2
pshufd $0xee,%xmm0,%xmm0
pshuflw $0xfe,%xmm0,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
pshuflw $0x54,%xmm0,%xmm0
movdqa %xmm9,%xmm3
psrld  %xmm0,%xmm3
punpckhqdq %xmm4,%xmm3
shufps $0xcc,%xmm3,%xmm2
andps  %xmm12,%xmm2
andps  %xmm12,%xmm6
packuswb %xmm6,%xmm2
andps  %xmm12,%xmm5
andps  %xmm12,%xmm1
packuswb %xmm1,%xmm5
packuswb %xmm5,%xmm2
pand   %xmm7,%xmm2
por    %xmm10,%xmm2
movdqu %xmm2,0x10(%rbx,%rax,1)
add    $0x20,%rax
paddd  %xmm11,%xmm13
paddd  %xmm11,%xmm14
paddd  %xmm11,%xmm15
paddd  %xmm11,%xmm8
add    $0xfffffffffffffffe,%rdi
jne    1200 <itoa+0xe0>
test   $0x1,%r8b
je     166b <itoa+0x54b>
pshuflw $0xfe,%xmm8,%xmm0
movdqa %xmm9,%xmm2
psrld  %xmm0,%xmm2
pshuflw $0x54,%xmm8,%xmm0
movdqa %xmm9,%xmm1
psrld  %xmm0,%xmm1
pshufd $0xee,%xmm8,%xmm0
pshuflw $0xfe,%xmm0,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
punpcklqdq %xmm2,%xmm1
pshuflw $0x54,%xmm0,%xmm0
movdqa %xmm9,%xmm2
psrld  %xmm0,%xmm2
punpckhqdq %xmm4,%xmm2
pshuflw $0xfe,%xmm15,%xmm0
movdqa %xmm9,%xmm3
psrld  %xmm0,%xmm3
shufps $0xcc,%xmm2,%xmm1
pshuflw $0x54,%xmm15,%xmm2
movdqa %xmm9,%xmm0
psrld  %xmm2,%xmm0
pshufd $0xee,%xmm15,%xmm2
pshuflw $0xfe,%xmm2,%xmm4
movdqa %xmm9,%xmm5
psrld  %xmm4,%xmm5
punpcklqdq %xmm3,%xmm0
pshuflw $0x54,%xmm2,%xmm2
movdqa %xmm9,%xmm3
psrld  %xmm2,%xmm3
punpckhqdq %xmm5,%xmm3
pshuflw $0xfe,%xmm14,%xmm2
movdqa %xmm9,%xmm4
psrld  %xmm2,%xmm4
shufps $0xcc,%xmm3,%xmm0
pshuflw $0x54,%xmm14,%xmm3
movdqa %xmm9,%xmm2
psrld  %xmm3,%xmm2
pshufd $0xee,%xmm14,%xmm3
pshuflw $0xfe,%xmm3,%xmm5
movdqa %xmm9,%xmm6
psrld  %xmm5,%xmm6
punpcklqdq %xmm4,%xmm2
pshuflw $0x54,%xmm3,%xmm3
movdqa %xmm9,%xmm4
psrld  %xmm3,%xmm4
punpckhqdq %xmm6,%xmm4
pshuflw $0xfe,%xmm13,%xmm3
movdqa %xmm9,%xmm5
psrld  %xmm3,%xmm5
shufps $0xcc,%xmm4,%xmm2
pshuflw $0x54,%xmm13,%xmm4
movdqa %xmm9,%xmm3
psrld  %xmm4,%xmm3
pshufd $0xee,%xmm13,%xmm4
pshuflw $0xfe,%xmm4,%xmm6
movdqa %xmm9,%xmm7
psrld  %xmm6,%xmm7
punpcklqdq %xmm5,%xmm3
pshuflw $0x54,%xmm4,%xmm4
psrld  %xmm4,%xmm9
punpckhqdq %xmm7,%xmm9
shufps $0xcc,%xmm9,%xmm3
movaps 0xa02(%rip),%xmm4
andps  %xmm4,%xmm3
andps  %xmm4,%xmm2
packuswb %xmm2,%xmm3
andps  %xmm4,%xmm0
andps  %xmm4,%xmm1
packuswb %xmm1,%xmm0
packuswb %xmm0,%xmm3
pand   0x9f2(%rip),%xmm3
por    0x9fa(%rip),%xmm3
movdqu %xmm3,(%rbx,%rax,1)
cmp    %rdx,%rsi
je     1699 <itoa+0x579>
sub    %edx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r14d,%eax
shr    %cl,%eax
lea    -0x1(%rcx),%esi
and    $0x1,%al
or     $0x30,%al
mov    %al,(%rbx,%rdx,1)
add    $0x1,%rdx
test   %ecx,%ecx
mov    %esi,%ecx
jg     1680 <itoa+0x560>
mov    %edx,%eax
movb   $0x0,(%rbx,%rax,1)
jmp    185f <itoa+0x73f>
mov    %r14d,%edi
call   1040 <clz32@plt>
and    $0x1c,%eax
mov    %eax,%r8d
xor    $0x1c,%r8d
mov    %r8d,%esi
mov    %r14d,%edi
mov    %r8d,%ecx
sar    %cl,%edi
shr    $0x2,%esi
add    $0x1,%rsi
and    $0xf,%edi
lea    0x30(%rdi),%ecx
lea    0x37(%rdi),%edx
cmp    $0xa,%edi
movzbl %dl,%edx
movzbl %cl,%ecx
cmovae %edx,%ecx
mov    %cl,(%rbx)
cmp    $0x1c,%eax
je     17fe <itoa+0x6de>
lea    -0x4(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x1(%rbx)
cmp    $0x2,%esi
je     17fe <itoa+0x6de>
lea    -0x8(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x2(%rbx)
cmp    $0x3,%esi
je     17fe <itoa+0x6de>
lea    -0xc(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x3(%rbx)
cmp    $0x4,%esi
je     17fe <itoa+0x6de>
lea    -0x10(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x4(%rbx)
cmp    $0x5,%esi
je     17fe <itoa+0x6de>
lea    -0x14(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x5(%rbx)
cmp    $0x6,%esi
je     17fe <itoa+0x6de>
lea    -0x18(%r8),%ecx
mov    %r14d,%eax
sar    %cl,%eax
and    $0xf,%eax
lea    0x30(%rax),%ecx
lea    0x37(%rax),%edx
cmp    $0xa,%eax
movzbl %dl,%eax
movzbl %cl,%ecx
cmovae %eax,%ecx
mov    %cl,0x6(%rbx)
cmp    $0x7,%esi
je     17fe <itoa+0x6de>
add    $0xe4,%r8b
mov    %r8d,%ecx
sar    %cl,%r14d
and    $0xf,%r14d
lea    0x30(%r14),%eax
lea    0x37(%r14),%ecx
cmp    $0xa,%r14d
movzbl %cl,%ecx
movzbl %al,%eax
cmovae %ecx,%eax
mov    %al,0x7(%rbx)
movb   $0x0,(%rbx,%rsi,1)
jmp    185f <itoa+0x73f>
mov    %r14d,%ecx
neg    %ecx
cmovs  %r14d,%ecx
xor    %eax,%eax
nop
movslq %ecx,%rdx
imul   $0x66666667,%rdx,%rcx
mov    %rcx,%rsi
shr    $0x3f,%rsi
sar    $0x22,%rcx
add    %esi,%ecx
lea    (%rcx,%rcx,1),%esi
lea    (%rsi,%rsi,4),%esi
mov    %edx,%edi
sub    %esi,%edi
add    $0x30,%dil
mov    %dil,(%rbx,%rax,1)
add    $0x1,%rax
cmp    $0x9,%edx
jg     1810 <itoa+0x6f0>
test   %r14d,%r14d
jns    1851 <itoa+0x731>
mov    %eax,%ecx
add    $0x1,%rax
movb   $0x2d,(%rbx,%rcx,1)
cltq
movb   $0x0,(%rbx,%rax,1)
mov    %rbx,%rdi
call   1030 <reverse@plt>
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
xor    %eax,%eax
test   $0x1,%r8b
jne    1509 <itoa+0x3e9>
jmp    166b <itoa+0x54b>

LLVM IR (-O0):
define i8* @itoa(i32 %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i32 %0, i32* %4
store i8* %1, i8** %5
store i32 %2, i32* %6
%17 = load i32, i32* %6
switch i32 %17, label %45 [
i32 2, label %18
i32 10, label %46
i32 16, label %86
]
18: ; preds = %3
store i32 0, i32* %7
%19 = load i32, i32* %4
%20 = call i32 @clz32(i32 %19)
%21 = sub nsw i32 31, %20
store i32 %21, i32* %8
br label %22
22: ; preds = %37, %18
%23 = load i32, i32* %4
%24 = load i32, i32* %8
%25 = ashr i32 %23, %24
%26 = and i32 %25, 1
store i32 %26, i32* %9
%27 = load i32, i32* %8
%28 = add nsw i32 %27, -1
store i32 %28, i32* %8
%29 = load i32, i32* %9
%30 = add nsw i32 48, %29
%31 = trunc i32 %30 to i8
%32 = load i8*, i8** %5
%33 = load i32, i32* %7
%34 = add nsw i32 %33, 1
store i32 %34, i32* %7
%35 = sext i32 %33 to i64
%36 = getelementptr inbounds i8, i8* %32, i64 %35
store i8 %31, i8* %36
br label %37
37: ; preds = %22
%38 = load i32, i32* %8
%39 = icmp sge i32 %38, 0
br i1 %39, label %22, label %40
40: ; preds = %37
%41 = load i8*, i8** %5
%42 = load i32, i32* %7
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %41, i64 %43
store i8 0, i8* %44
br label %124
45: ; preds = %3
br label %46
46: ; preds = %3, %45
store i32 0, i32* %10
%47 = load i32, i32* %4
store i32 %47, i32* %11
%48 = load i32, i32* %4
%49 = icmp slt i32 %48, 0
br i1 %49, label %50, label %53
50: ; preds = %46
%51 = load i32, i32* %4
%52 = sub nsw i32 0, %51
store i32 %52, i32* %4
br label %53
53: ; preds = %50, %46
%54 = load i32, i32* %4
store i32 %54, i32* %12
br label %55
55: ; preds = %67, %53
%56 = load i32, i32* %12
%57 = srem i32 %56, 10
%58 = add nsw i32 48, %57
%59 = trunc i32 %58 to i8
%60 = load i8*, i8** %5
%61 = load i32, i32* %10
%62 = add nsw i32 %61, 1
store i32 %62, i32* %10
%63 = sext i32 %61 to i64
%64 = getelementptr inbounds i8, i8* %60, i64 %63
store i8 %59, i8* %64
%65 = load i32, i32* %12
%66 = sdiv i32 %65, 10
store i32 %66, i32* %12
br label %67
67: ; preds = %55
%68 = load i32, i32* %12
%69 = icmp sgt i32 %68, 0
br i1 %69, label %55, label %70
70: ; preds = %67
%71 = load i32, i32* %11
%72 = icmp slt i32 %71, 0
br i1 %72, label %73, label %79
73: ; preds = %70
%74 = load i8*, i8** %5
%75 = load i32, i32* %10
%76 = add nsw i32 %75, 1
store i32 %76, i32* %10
%77 = sext i32 %75 to i64
%78 = getelementptr inbounds i8, i8* %74, i64 %77
store i8 45, i8* %78
br label %79
79: ; preds = %73, %70
%80 = load i8*, i8** %5
%81 = load i32, i32* %10
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8, i8* %80, i64 %82
store i8 0, i8* %83
%84 = load i8*, i8** %5
%85 = call i32 @reverse(i8* %84)
br label %124
86: ; preds = %3
store i32 0, i32* %13
%87 = load i32, i32* %4
%88 = call i32 @clz32(i32 %87)
%89 = and i32 %88, 28
store i32 %89, i32* %14
%90 = load i32, i32* %14
%91 = sub nsw i32 28, %90
store i32 %91, i32* %15
br label %92
92: ; preds = %116, %86
%93 = load i32, i32* %4
%94 = load i32, i32* %15
%95 = ashr i32 %93, %94
%96 = and i32 %95, 15
store i32 %96, i32* %16
%97 = load i32, i32* %15
%98 = sub nsw i32 %97, 4
store i32 %98, i32* %15
%99 = load i32, i32* %16
%100 = icmp sgt i32 %99, 9
br i1 %100, label %101, label %105
101: ; preds = %92
%102 = load i32, i32* %16
%103 = add nsw i32 65, %102
%104 = sub nsw i32 %103, 10
store i32 %104, i32* %16
br label %108
105: ; preds = %92
%106 = load i32, i32* %16
%107 = add nsw i32 48, %106
store i32 %107, i32* %16
br label %108
108: ; preds = %105, %101
%109 = load i32, i32* %16
%110 = trunc i32 %109 to i8
%111 = load i8*, i8** %5
%112 = load i32, i32* %13
%113 = add nsw i32 %112, 1
store i32 %113, i32* %13
%114 = sext i32 %112 to i64
%115 = getelementptr inbounds i8, i8* %111, i64 %114
store i8 %110, i8* %115
br label %116
116: ; preds = %108
%117 = load i32, i32* %15
%118 = icmp sge i32 %117, 0
br i1 %118, label %92, label %119
119: ; preds = %116
%120 = load i8*, i8** %5
%121 = load i32, i32* %13
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds i8, i8* %120, i64 %122
store i8 0, i8* %123
br label %124
124: ; preds = %119, %79, %40
%125 = load i8*, i8** %5
ret i8* %125
}

LLVM IR (-O2):
define i8* @itoa(i32 %0, i8* returned %1, i32 %2) {
switch i32 %2, label %82 [
i32 2, label %4
i32 16, label %107
]
4: ; preds = %3
%5 = tail call i32 @clz32(i32 %0)
%6 = sub i32 31, %5
%7 = call i32 @llvm.smin.i32(i32 %6, i32 0)
%8 = add i32 %5, %7
%9 = sub i32 31, %8
%10 = zext i32 %9 to i64
%11 = add nuw nsw i64 %10, 1
%12 = icmp ult i32 %9, 15
br i1 %12, label %64, label %13
13: ; preds = %4
%14 = and i64 %11, 8589934576
%15 = trunc i64 %14 to i32
%16 = sub i32 %6, %15
%17 = insertelement <16 x i32> poison, i32 %6, i64 0
%18 = shufflevector <16 x i32> %17, <16 x i32> poison, <16 x i32> zeroinitializer
%19 = add <16 x i32> %18, <i32 0, i32 -1, i32 -2, i32 -3, i32 -4, i32 -5, i32 -6, i32 -7, i32 -8, i32 -9, i32 -10, i32 -11, i32 -12, i32 -13, i32 -14, i32 -15>
%20 = insertelement <16 x i32> poison, i32 %0, i64 0
%21 = shufflevector <16 x i32> %20, <16 x i32> poison, <16 x i32> zeroinitializer
%22 = add nsw i64 %14, -16
%23 = lshr exact i64 %22, 4
%24 = add nuw nsw i64 %23, 1
%25 = and i64 %24, 1
%26 = icmp eq i64 %22, 0
br i1 %26, label %51, label %27
27: ; preds = %13
%28 = and i64 %24, 2305843009213693950
br label %29
29: ; preds = %29, %27
%30 = phi i64 [ 0, %27 ], [ %47, %29 ]
%31 = phi <16 x i32> [ %19, %27 ], [ %48, %29 ]
%32 = phi i64 [ 0, %27 ], [ %49, %29 ]
%33 = lshr <16 x i32> %21, %31
%34 = trunc <16 x i32> %33 to <16 x i8>
%35 = and <16 x i8> %34, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%36 = or <16 x i8> %35, <i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48>
%37 = getelementptr inbounds i8, i8* %1, i64 %30
%38 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %36, <16 x i8>* %38
%39 = or i64 %30, 16
%40 = add <16 x i32> %31, <i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16, i32 -16>
%41 = lshr <16 x i32> %21, %40
%42 = trunc <16 x i32> %41 to <16 x i8>
%43 = and <16 x i8> %42, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%44 = or <16 x i8> %43, <i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48>
%45 = getelementptr inbounds i8, i8* %1, i64 %39
%46 = bitcast i8* %45 to <16 x i8>*
store <16 x i8> %44, <16 x i8>* %46
%47 = add nuw i64 %30, 32
%48 = add <16 x i32> %31, <i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32, i32 -32>
%49 = add i64 %32, 2
%50 = icmp eq i64 %49, %28
br i1 %50, label %51, label %29
51: ; preds = %29, %13
%52 = phi i64 [ 0, %13 ], [ %47, %29 ]
%53 = phi <16 x i32> [ %19, %13 ], [ %48, %29 ]
%54 = icmp eq i64 %25, 0
br i1 %54, label %62, label %55
55: ; preds = %51
%56 = lshr <16 x i32> %21, %53
%57 = trunc <16 x i32> %56 to <16 x i8>
%58 = and <16 x i8> %57, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%59 = or <16 x i8> %58, <i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48>
%60 = getelementptr inbounds i8, i8* %1, i64 %52
%61 = bitcast i8* %60 to <16 x i8>*
store <16 x i8> %59, <16 x i8>* %61
br label %62
62: ; preds = %51, %55
%63 = icmp eq i64 %11, %14
br i1 %63, label %78, label %64
64: ; preds = %4, %62
%65 = phi i64 [ 0, %4 ], [ %14, %62 ]
%66 = phi i32 [ %6, %4 ], [ %16, %62 ]
br label %67
67: ; preds = %64, %67
%68 = phi i64 [ %75, %67 ], [ %65, %64 ]
%69 = phi i32 [ %71, %67 ], [ %66, %64 ]
%70 = lshr i32 %0, %69
%71 = add nsw i32 %69, -1
%72 = trunc i32 %70 to i8
%73 = and i8 %72, 1
%74 = or i8 %73, 48
%75 = add nuw nsw i64 %68, 1
%76 = getelementptr inbounds i8, i8* %1, i64 %68
store i8 %74, i8* %76
%77 = icmp sgt i32 %69, 0
br i1 %77, label %67, label %78
78: ; preds = %67, %62
%79 = phi i64 [ %14, %62 ], [ %75, %67 ]
%80 = and i64 %79, 4294967295
%81 = getelementptr inbounds i8, i8* %1, i64 %80
store i8 0, i8* %81
br label %200
82: ; preds = %3
%83 = icmp slt i32 %0, 0
%84 = sub nsw i32 0, %0
%85 = select i1 %83, i32 %84, i32 %0
br label %86
86: ; preds = %86, %82
%87 = phi i64 [ %92, %86 ], [ 0, %82 ]
%88 = phi i32 [ %94, %86 ], [ %85, %82 ]
%89 = srem i32 %88, 10
%90 = trunc i32 %89 to i8
%91 = add nsw i8 %90, 48
%92 = add nuw i64 %87, 1
%93 = getelementptr inbounds i8, i8* %1, i64 %87
store i8 %91, i8* %93
%94 = sdiv i32 %88, 10
%95 = icmp sgt i32 %88, 9
br i1 %95, label %86, label %96
96: ; preds = %86
br i1 %83, label %97, label %101
97: ; preds = %96
%98 = add i64 %87, 2
%99 = and i64 %92, 4294967295
%100 = getelementptr inbounds i8, i8* %1, i64 %99
store i8 45, i8* %100
br label %101
101: ; preds = %97, %96
%102 = phi i64 [ %98, %97 ], [ %92, %96 ]
%103 = shl i64 %102, 32
%104 = ashr exact i64 %103, 32
%105 = getelementptr inbounds i8, i8* %1, i64 %104
store i8 0, i8* %105
%106 = tail call i32 @reverse(i8* %1)
br label %200
107: ; preds = %3
%108 = tail call i32 @clz32(i32 %0)
%109 = and i32 %108, 28
%110 = xor i32 %109, 28
%111 = lshr exact i32 %110, 2
%112 = add nuw nsw i32 %111, 1
%113 = zext i32 %112 to i64
%114 = ashr i32 %0, %110
%115 = and i32 %114, 15
%116 = icmp ugt i32 %115, 9
%117 = add nuw nsw i32 %115, 55
%118 = or i32 %115, 48
%119 = select i1 %116, i32 %117, i32 %118
%120 = trunc i32 %119 to i8
store i8 %120, i8* %1
%121 = icmp eq i32 %110, 0
br i1 %121, label %198, label %122
122: ; preds = %107
%123 = add nsw i32 %110, -4
%124 = ashr i32 %0, %123
%125 = and i32 %124, 15
%126 = icmp ugt i32 %125, 9
%127 = add nuw nsw i32 %125, 55
%128 = or i32 %125, 48
%129 = select i1 %126, i32 %127, i32 %128
%130 = trunc i32 %129 to i8
%131 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %130, i8* %131
%132 = icmp eq i32 %112, 2
br i1 %132, label %198, label %133
133: ; preds = %122
%134 = add nsw i32 %110, -8
%135 = ashr i32 %0, %134
%136 = and i32 %135, 15
%137 = icmp ugt i32 %136, 9
%138 = add nuw nsw i32 %136, 55
%139 = or i32 %136, 48
%140 = select i1 %137, i32 %138, i32 %139
%141 = trunc i32 %140 to i8
%142 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %141, i8* %142
%143 = icmp eq i32 %112, 3
br i1 %143, label %198, label %144
144: ; preds = %133
%145 = add nsw i32 %110, -12
%146 = ashr i32 %0, %145
%147 = and i32 %146, 15
%148 = icmp ugt i32 %147, 9
%149 = add nuw nsw i32 %147, 55
%150 = or i32 %147, 48
%151 = select i1 %148, i32 %149, i32 %150
%152 = trunc i32 %151 to i8
%153 = getelementptr inbounds i8, i8* %1, i64 3
store i8 %152, i8* %153
%154 = icmp eq i32 %112, 4
br i1 %154, label %198, label %155
155: ; preds = %144
%156 = add nsw i32 %110, -16
%157 = ashr i32 %0, %156
%158 = and i32 %157, 15
%159 = icmp ugt i32 %158, 9
%160 = add nuw nsw i32 %158, 55
%161 = or i32 %158, 48
%162 = select i1 %159, i32 %160, i32 %161
%163 = trunc i32 %162 to i8
%164 = getelementptr inbounds i8, i8* %1, i64 4
store i8 %163, i8* %164
%165 = icmp eq i32 %112, 5
br i1 %165, label %198, label %166
166: ; preds = %155
%167 = add nsw i32 %110, -20
%168 = ashr i32 %0, %167
%169 = and i32 %168, 15
%170 = icmp ugt i32 %169, 9
%171 = add nuw nsw i32 %169, 55
%172 = or i32 %169, 48
%173 = select i1 %170, i32 %171, i32 %172
%174 = trunc i32 %173 to i8
%175 = getelementptr inbounds i8, i8* %1, i64 5
store i8 %174, i8* %175
%176 = icmp eq i32 %112, 6
br i1 %176, label %198, label %177
177: ; preds = %166
%178 = add nsw i32 %110, -24
%179 = ashr i32 %0, %178
%180 = and i32 %179, 15
%181 = icmp ugt i32 %180, 9
%182 = add nuw nsw i32 %180, 55
%183 = or i32 %180, 48
%184 = select i1 %181, i32 %182, i32 %183
%185 = trunc i32 %184 to i8
%186 = getelementptr inbounds i8, i8* %1, i64 6
store i8 %185, i8* %186
%187 = icmp eq i32 %112, 7
br i1 %187, label %198, label %188
188: ; preds = %177
%189 = add nsw i32 %110, -28
%190 = ashr i32 %0, %189
%191 = and i32 %190, 15
%192 = icmp ugt i32 %191, 9
%193 = add nuw nsw i32 %191, 55
%194 = or i32 %191, 48
%195 = select i1 %192, i32 %193, i32 %194
%196 = trunc i32 %195 to i8
%197 = getelementptr inbounds i8, i8* %1, i64 7
store i8 %196, i8* %197
br label %198
198: ; preds = %188, %177, %166, %155, %144, %133, %122, %107
%199 = getelementptr inbounds i8, i8* %1, i64 %113
store i8 0, i8* %199
br label %200
200: ; preds = %198, %101, %78
ret i8* %1
}