char *htoa(i)
int i;
{
  static char buf[19 + 3];
  char *p = buf + 19 + 2;
  if (i >= 0) {
    do {
      if ('0' + i % 16 <= '9') {
        *--p = '0' + (i % 16);
        i /= 16;
      } else {
        *--p = '7' + (i % 16);
        i /= 16;
      }
    } while (i != 0);
    *--p = 'x';
    *--p = '0';
    return p;
  }
  return p;
}


x86 assembly (clang, -O0):
<htoa>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
lea    0x2f22(%rip),%rax
add    $0x15,%rax
mov    %rax,-0x18(%rbp)
cmpl   $0x0,-0xc(%rbp)
jl     11e3 <htoa+0xe3>
jmp    1125 <htoa+0x25>
mov    -0xc(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
cmp    $0x39,%edx
jg     1171 <htoa+0x71>
mov    -0xc(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,-0x1(%rax)
mov    -0xc(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
jmp    11a1 <htoa+0xa1>
mov    -0xc(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
add    $0x37,%edx
mov    %dl,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,-0x1(%rax)
mov    -0xc(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
jmp    11a6 <htoa+0xa6>
cmpl   $0x0,-0xc(%rbp)
jne    1125 <htoa+0x25>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x78,-0x1(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x30,-0x1(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    11eb <htoa+0xeb>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<htoa>:
test   %edi,%edi
js     1150 <htoa+0x50>
lea    0x2f3a(%rip),%rsi
jmp    1126 <htoa+0x26>
nopl   (%rax)
add    $0x37,%dil
lea    -0x1(%rax),%rsi
mov    %dil,-0x1(%rax)
sar    $0x4,%edx
mov    %edx,%edi
cmp    $0x1e,%ecx
jbe    1145 <htoa+0x45>
lea    0xf(%rdi),%ecx
test   %edi,%edi
mov    %edi,%edx
cmovs  %ecx,%edx
mov    %rsi,%rax
mov    %edx,%esi
and    $0xfffffff0,%esi
sub    %esi,%edi
cmp    $0x9,%edi
jg     1110 <htoa+0x10>
add    $0x30,%dil
jmp    1114 <htoa+0x14>
movw   $0x7830,-0x3(%rax)
add    $0xfffffffffffffffd,%rax
ret
lea    0x2eee(%rip),%rax
ret

LLVM IR (-O0):
@htoa.buf = internal global [22 x i8] zeroinitializer
define i8* @htoa(i32 %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i8*
store i32 %0, i32* %3
store i8* getelementptr inbounds ([22 x i8], [22 x i8]* @htoa.buf, i64 0, i64 21), i8** %4
%5 = load i32, i32* %3
%6 = icmp sge i32 %5, 0
br i1 %6, label %7, label %41
7: ; preds = %1
br label %8
8: ; preds = %32, %7
%9 = load i32, i32* %3
%10 = srem i32 %9, 16
%11 = add nsw i32 48, %10
%12 = icmp sle i32 %11, 57
br i1 %12, label %13, label %22
13: ; preds = %8
%14 = load i32, i32* %3
%15 = srem i32 %14, 16
%16 = add nsw i32 48, %15
%17 = trunc i32 %16 to i8
%18 = load i8*, i8** %4
%19 = getelementptr inbounds i8, i8* %18, i32 -1
store i8* %19, i8** %4
store i8 %17, i8* %19
%20 = load i32, i32* %3
%21 = sdiv i32 %20, 16
store i32 %21, i32* %3
br label %31
22: ; preds = %8
%23 = load i32, i32* %3
%24 = srem i32 %23, 16
%25 = add nsw i32 55, %24
%26 = trunc i32 %25 to i8
%27 = load i8*, i8** %4
%28 = getelementptr inbounds i8, i8* %27, i32 -1
store i8* %28, i8** %4
store i8 %26, i8* %28
%29 = load i32, i32* %3
%30 = sdiv i32 %29, 16
store i32 %30, i32* %3
br label %31
31: ; preds = %22, %13
br label %32
32: ; preds = %31
%33 = load i32, i32* %3
%34 = icmp ne i32 %33, 0
br i1 %34, label %8, label %35
35: ; preds = %32
%36 = load i8*, i8** %4
%37 = getelementptr inbounds i8, i8* %36, i32 -1
store i8* %37, i8** %4
store i8 120, i8* %37
%38 = load i8*, i8** %4
%39 = getelementptr inbounds i8, i8* %38, i32 -1
store i8* %39, i8** %4
store i8 48, i8* %39
%40 = load i8*, i8** %4
store i8* %40, i8** %2
br label %43
41: ; preds = %1
%42 = load i8*, i8** %4
store i8* %42, i8** %2
br label %43
43: ; preds = %41, %35
%44 = load i8*, i8** %2
ret i8* %44
}

LLVM IR (-O2):
@htoa.buf = internal global [22 x i8] zeroinitializer
define i8* @htoa(i32 %0) {
%2 = icmp sgt i32 %0, -1
br i1 %2, label %3, label %23
3: ; preds = %1, %16
%4 = phi i32 [ %7, %16 ], [ %0, %1 ]
%5 = phi i8* [ %17, %16 ], [ getelementptr inbounds ([22 x i8], [22 x i8]* @htoa.buf, i64 0, i64 21), %1 ]
%6 = srem i32 %4, 16
%7 = sdiv i32 %4, 16
%8 = icmp slt i32 %6, 10
%9 = trunc i32 %6 to i8
br i1 %8, label %10, label %13
10: ; preds = %3
%11 = add nsw i8 %9, 48
%12 = getelementptr inbounds i8, i8* %5, i64 -1
store i8 %11, i8* %12
br label %16
13: ; preds = %3
%14 = add nuw nsw i8 %9, 55
%15 = getelementptr inbounds i8, i8* %5, i64 -1
store i8 %14, i8* %15
br label %16
16: ; preds = %10, %13
%17 = phi i8* [ %12, %10 ], [ %15, %13 ]
%18 = add i32 %4, 15
%19 = icmp ult i32 %18, 31
br i1 %19, label %20, label %3
20: ; preds = %16
%21 = getelementptr inbounds i8, i8* %5, i64 -2
store i8 120, i8* %21
%22 = getelementptr inbounds i8, i8* %5, i64 -3
store i8 48, i8* %22
br label %23
23: ; preds = %1, %20
%24 = phi i8* [ %22, %20 ], [ getelementptr inbounds ([22 x i8], [22 x i8]* @htoa.buf, i64 0, i64 21), %1 ]
ret i8* %24
}