void _itoa(unsigned int uiNum, unsigned char *buf, unsigned char uiRadix) {
  unsigned char c, i;
  unsigned char *p, rst[32];
  p = rst;
  for (i = 0; i < 32; i++, p++) {
    c = uiNum % uiRadix;
    *p = c + ((c < 10) ? '0' : '7');
    uiNum /= uiRadix;
    if (!uiNum)
      break;
  }
  for (c = 0; c <= i; c++) {
    *buf++ = *p--;
  }
  *buf = '\0';
}


x86 assembly (clang, -O0):
<_itoa>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %al,-0x11(%rbp)
lea    -0x40(%rbp),%rax
mov    %rax,-0x20(%rbp)
movb   $0x0,-0x13(%rbp)
movzbl -0x13(%rbp),%eax
cmp    $0x20,%eax
jge    1196 <_itoa+0x96>
mov    -0x4(%rbp),%eax
movzbl -0x11(%rbp),%ecx
xor    %edx,%edx
div    %ecx
mov    %dl,%al
mov    %al,-0x12(%rbp)
movzbl -0x12(%rbp),%eax
movzbl -0x12(%rbp),%esi
mov    $0x37,%ecx
mov    $0x30,%edx
cmp    $0xa,%esi
cmovl  %edx,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
movzbl -0x11(%rbp),%ecx
mov    -0x4(%rbp),%eax
xor    %edx,%edx
div    %ecx
mov    %eax,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jne    1178 <_itoa+0x78>
jmp    1196 <_itoa+0x96>
jmp    117d <_itoa+0x7d>
mov    -0x13(%rbp),%al
add    $0x1,%al
mov    %al,-0x13(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    111c <_itoa+0x1c>
movb   $0x0,-0x12(%rbp)
movzbl -0x12(%rbp),%eax
movzbl -0x13(%rbp),%ecx
cmp    %ecx,%eax
jg     11d9 <_itoa+0xd9>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x12(%rbp),%al
add    $0x1,%al
mov    %al,-0x12(%rbp)
jmp    119a <_itoa+0x9a>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_itoa>:
mov    %edx,%r8d
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
mov    %edi,%eax
xor    %edx,%edx
div    %r8d
lea    0x37(%rdx),%r9d
lea    0x30(%rdx),%ecx
cmp    $0xa,%edx
cmovae %r9d,%ecx
mov    %cl,-0x28(%rsp,%r10,1)
cmp    %r8d,%edi
jb     114e <_itoa+0x4e>
add    $0x1,%r10
mov    %eax,%edi
cmp    $0x20,%r10b
jne    1110 <_itoa+0x10>
lea    (%rsp,%r10,1),%rax
add    $0xffffffffffffffd8,%rax
mov    $0x20,%r10b
cmp    $0xf,%r10b
jb     1184 <_itoa+0x84>
jmp    115c <_itoa+0x5c>
lea    (%rsp,%r10,1),%rax
add    $0xffffffffffffffd8,%rax
cmp    $0xf,%r10b
jb     1184 <_itoa+0x84>
lea    0x1(%rax),%rcx
cmp    %rsi,%rcx
jbe    123b <_itoa+0x13b>
movzbl %r10b,%ecx
lea    (%rcx,%rsi,1),%rdx
add    $0x1,%rdx
mov    %rax,%rdi
sub    %rcx,%rdi
cmp    %rdx,%rdi
jae    123b <_itoa+0x13b>
xor    %r8d,%r8d
mov    %r10d,%r9d
sub    %r8b,%r9b
lea    0x1(%r9),%edx
and    $0x7,%dl
je     11bd <_itoa+0xbd>
neg    %dl
movzbl %dl,%edi
xor    %edx,%edx
nopl   (%rax)
movzbl (%rax,%rdx,1),%ecx
mov    %cl,(%rsi)
add    $0x1,%rsi
add    $0xffffffffffffffff,%rdx
cmp    %dl,%dil
jne    11a0 <_itoa+0xa0>
add    %rdx,%rax
movzbl %r8b,%r8d
sub    %edx,%r8d
cmp    $0x7,%r9b
jb     12ca <_itoa+0x1ca>
not    %r10b
add    %r8b,%r10b
movzbl %r10b,%r8d
xor    %edx,%edx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rax,%rdi,1),%ecx
mov    %cl,(%rsi,%rdx,1)
movzbl -0x1(%rax,%rdi,1),%ecx
mov    %cl,0x1(%rsi,%rdx,1)
movzbl -0x2(%rax,%rdi,1),%ecx
mov    %cl,0x2(%rsi,%rdx,1)
movzbl -0x3(%rax,%rdi,1),%ecx
mov    %cl,0x3(%rsi,%rdx,1)
movzbl -0x4(%rax,%rdi,1),%ecx
mov    %cl,0x4(%rsi,%rdx,1)
movzbl -0x5(%rax,%rdi,1),%ecx
mov    %cl,0x5(%rsi,%rdx,1)
movzbl -0x6(%rax,%rdi,1),%ecx
mov    %cl,0x6(%rsi,%rdx,1)
movzbl -0x7(%rax,%rdi,1),%ecx
mov    %cl,0x7(%rsi,%rdx,1)
add    $0xfffffffffffffff8,%rdi
add    $0x8,%rdx
cmp    %dil,%r8b
jne    11e0 <_itoa+0xe0>
sub    %rdi,%rsi
jmp    12ca <_itoa+0x1ca>
lea    0x1(%r10),%ecx
movzbl %cl,%edi
mov    %edi,%r8d
and    $0xfffffff0,%r8d
movdqu -0xf(%rax),%xmm1
pxor   %xmm0,%xmm0
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm2,%xmm1
movdqu %xmm1,(%rsi)
cmp    $0x10,%r8
je     12c2 <_itoa+0x1c2>
movdqu -0x1f(%rax),%xmm1
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm2,%xmm0
movdqu %xmm0,0x10(%rsi)
add    %r8,%rsi
cmp    %rdi,%r8
jne    12ce <_itoa+0x1ce>
movb   $0x0,(%rsi)
ret
sub    %r8,%rax
jmp    1187 <_itoa+0x87>

LLVM IR (-O0):
define void @_itoa(i32 %0, i8* %1, i8 zeroext %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8*
%10 = alloca [32 x i8]
store i32 %0, i32* %4
store i8* %1, i8** %5
store i8 %2, i8* %6
%11 = getelementptr inbounds [32 x i8], [32 x i8]* %10, i64 0, i64 0
store i8* %11, i8** %9
store i8 0, i8* %8
br label %12
12: ; preds = %40, %3
%13 = load i8, i8* %8
%14 = zext i8 %13 to i32
%15 = icmp slt i32 %14, 32
br i1 %15, label %16, label %45
16: ; preds = %12
%17 = load i32, i32* %4
%18 = load i8, i8* %6
%19 = zext i8 %18 to i32
%20 = urem i32 %17, %19
%21 = trunc i32 %20 to i8
store i8 %21, i8* %7
%22 = load i8, i8* %7
%23 = zext i8 %22 to i32
%24 = load i8, i8* %7
%25 = zext i8 %24 to i32
%26 = icmp slt i32 %25, 10
%27 = zext i1 %26 to i64
%28 = select i1 %26, i32 48, i32 55
%29 = add nsw i32 %23, %28
%30 = trunc i32 %29 to i8
%31 = load i8*, i8** %9
store i8 %30, i8* %31
%32 = load i8, i8* %6
%33 = zext i8 %32 to i32
%34 = load i32, i32* %4
%35 = udiv i32 %34, %33
store i32 %35, i32* %4
%36 = load i32, i32* %4
%37 = icmp ne i32 %36, 0
br i1 %37, label %39, label %38
38: ; preds = %16
br label %45
39: ; preds = %16
br label %40
40: ; preds = %39
%41 = load i8, i8* %8
%42 = add i8 %41, 1
store i8 %42, i8* %8
%43 = load i8*, i8** %9
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %9
br label %12
45: ; preds = %38, %12
store i8 0, i8* %7
br label %46
46: ; preds = %58, %45
%47 = load i8, i8* %7
%48 = zext i8 %47 to i32
%49 = load i8, i8* %8
%50 = zext i8 %49 to i32
%51 = icmp sle i32 %48, %50
br i1 %51, label %52, label %61
52: ; preds = %46
%53 = load i8*, i8** %9
%54 = getelementptr inbounds i8, i8* %53, i32 -1
store i8* %54, i8** %9
%55 = load i8, i8* %53
%56 = load i8*, i8** %5
%57 = getelementptr inbounds i8, i8* %56, i32 1
store i8* %57, i8** %5
store i8 %55, i8* %56
br label %58
58: ; preds = %52
%59 = load i8, i8* %7
%60 = add i8 %59, 1
store i8 %60, i8* %7
br label %46
61: ; preds = %46
%62 = load i8*, i8** %5
store i8 0, i8* %62
ret void
}

LLVM IR (-O2):
define void @_itoa(i32 %0, i8* nocapture writeonly %1, i8 zeroext %2) {
%4 = alloca [32 x i8]
%5 = getelementptr inbounds [32 x i8], [32 x i8]* %4, i64 0, i64 0
%6 = zext i8 %2 to i32
br label %7
7: ; preds = %3, %18
%8 = phi i8* [ %5, %3 ], [ %20, %18 ]
%9 = phi i8 [ 0, %3 ], [ %19, %18 ]
%10 = phi i32 [ %0, %3 ], [ %12, %18 ]
%11 = urem i32 %10, %6
%12 = udiv i32 %10, %6
%13 = icmp ult i32 %11, 10
%14 = select i1 %13, i32 48, i32 55
%15 = add nuw nsw i32 %14, %11
%16 = trunc i32 %15 to i8
store i8 %16, i8* %8
%17 = icmp ult i32 %10, %6
br i1 %17, label %22, label %18
18: ; preds = %7
%19 = add nuw nsw i8 %9, 1
%20 = getelementptr inbounds i8, i8* %8, i64 1
%21 = icmp eq i8 %19, 32
br i1 %21, label %22, label %7
22: ; preds = %7, %18
%23 = phi i8 [ %9, %7 ], [ 32, %18 ]
%24 = phi i8* [ %8, %7 ], [ %20, %18 ]
%25 = add nuw i8 %23, 1
%26 = zext i8 %25 to i64
%27 = icmp ult i8 %23, 15
br i1 %27, label %59, label %28
28: ; preds = %22
%29 = zext i8 %23 to i64
%30 = add nuw nsw i64 %29, 1
%31 = getelementptr i8, i8* %1, i64 %30
%32 = sub nsw i64 0, %29
%33 = getelementptr i8, i8* %24, i64 %32
%34 = getelementptr i8, i8* %24, i64 1
%35 = icmp ugt i8* %34, %1
%36 = icmp ult i8* %33, %31
%37 = and i1 %35, %36
br i1 %37, label %59, label %38
38: ; preds = %28
%39 = and i64 %26, 240
%40 = sub nsw i64 0, %39
%41 = getelementptr i8, i8* %24, i64 %40
%42 = trunc i64 %39 to i8
%43 = getelementptr i8, i8* %1, i64 %39
%44 = getelementptr i8, i8* %24, i64 -15
%45 = bitcast i8* %44 to <16 x i8>*
%46 = load <16 x i8>, <16 x i8>* %45
%47 = shufflevector <16 x i8> %46, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%48 = bitcast i8* %1 to <16 x i8>*
store <16 x i8> %47, <16 x i8>* %48
%49 = icmp eq i64 %39, 16
br i1 %49, label %57, label %50
50: ; preds = %38
%51 = getelementptr i8, i8* %1, i64 16
%52 = getelementptr i8, i8* %24, i64 -31
%53 = bitcast i8* %52 to <16 x i8>*
%54 = load <16 x i8>, <16 x i8>* %53
%55 = shufflevector <16 x i8> %54, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%56 = bitcast i8* %51 to <16 x i8>*
store <16 x i8> %55, <16 x i8>* %56
br label %57
57: ; preds = %50, %38
%58 = icmp eq i64 %39, %26
br i1 %58, label %116, label %59
59: ; preds = %28, %22, %57
%60 = phi i8* [ %24, %28 ], [ %24, %22 ], [ %41, %57 ]
%61 = phi i8 [ 0, %28 ], [ 0, %22 ], [ %42, %57 ]
%62 = phi i8* [ %1, %28 ], [ %1, %22 ], [ %43, %57 ]
%63 = add nuw i8 %23, 1
%64 = sub i8 %63, %61
%65 = sub i8 %23, %61
%66 = and i8 %64, 7
%67 = icmp eq i8 %66, 0
br i1 %67, label %79, label %68
68: ; preds = %59, %68
%69 = phi i8* [ %73, %68 ], [ %60, %59 ]
%70 = phi i8 [ %76, %68 ], [ %61, %59 ]
%71 = phi i8* [ %75, %68 ], [ %62, %59 ]
%72 = phi i8 [ %77, %68 ], [ 0, %59 ]
%73 = getelementptr inbounds i8, i8* %69, i64 -1
%74 = load i8, i8* %69
%75 = getelementptr inbounds i8, i8* %71, i64 1
store i8 %74, i8* %71
%76 = add nuw nsw i8 %70, 1
%77 = add i8 %72, 1
%78 = icmp eq i8 %77, %66
br i1 %78, label %79, label %68
79: ; preds = %68, %59
%80 = phi i8* [ undef, %59 ], [ %75, %68 ]
%81 = phi i8* [ %60, %59 ], [ %73, %68 ]
%82 = phi i8 [ %61, %59 ], [ %76, %68 ]
%83 = phi i8* [ %62, %59 ], [ %75, %68 ]
%84 = icmp ult i8 %65, 7
br i1 %84, label %116, label %85
85: ; preds = %79, %85
%86 = phi i8* [ %111, %85 ], [ %81, %79 ]
%87 = phi i8 [ %114, %85 ], [ %82, %79 ]
%88 = phi i8* [ %113, %85 ], [ %83, %79 ]
%89 = getelementptr inbounds i8, i8* %86, i64 -1
%90 = load i8, i8* %86
%91 = getelementptr inbounds i8, i8* %88, i64 1
store i8 %90, i8* %88
%92 = getelementptr inbounds i8, i8* %86, i64 -2
%93 = load i8, i8* %89
%94 = getelementptr inbounds i8, i8* %88, i64 2
store i8 %93, i8* %91
%95 = getelementptr inbounds i8, i8* %86, i64 -3
%96 = load i8, i8* %92
%97 = getelementptr inbounds i8, i8* %88, i64 3
store i8 %96, i8* %94
%98 = getelementptr inbounds i8, i8* %86, i64 -4
%99 = load i8, i8* %95
%100 = getelementptr inbounds i8, i8* %88, i64 4
store i8 %99, i8* %97
%101 = getelementptr inbounds i8, i8* %86, i64 -5
%102 = load i8, i8* %98
%103 = getelementptr inbounds i8, i8* %88, i64 5
store i8 %102, i8* %100
%104 = getelementptr inbounds i8, i8* %86, i64 -6
%105 = load i8, i8* %101
%106 = getelementptr inbounds i8, i8* %88, i64 6
store i8 %105, i8* %103
%107 = getelementptr inbounds i8, i8* %86, i64 -7
%108 = load i8, i8* %104
%109 = getelementptr inbounds i8, i8* %88, i64 7
store i8 %108, i8* %106
%110 = add nuw nsw i8 %87, 7
%111 = getelementptr inbounds i8, i8* %86, i64 -8
%112 = load i8, i8* %107
%113 = getelementptr inbounds i8, i8* %88, i64 8
store i8 %112, i8* %109
%114 = add nuw nsw i8 %87, 8
%115 = icmp eq i8 %110, %23
br i1 %115, label %116, label %85
116: ; preds = %79, %85, %57
%117 = phi i8* [ %43, %57 ], [ %80, %79 ], [ %113, %85 ]
store i8 0, i8* %117
ret void
}