void arm_uint2hexstr(char *dst, unsigned int src) {
  int ite, pos = 0;
  static const char hexchars[] = "0123456789ABCDEF";
  for (ite = 0; ite < 8; ite++) {
    if ((pos == 0) && !((src >> (4 * (8 - ite - 1))) & 0xF)) {
      continue;
    }
    dst[pos] = hexchars[(src >> (4 * (8 - ite - 1))) & 0xF];
    pos++;
  }
  if (pos == 0) {
    dst[pos] = '0';
    pos++;
  }
  dst[pos] = '\0';
}


x86 assembly (clang, -O0):
<arm_uint2hexstr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x10(%rbp)
cmpl   $0x8,-0x10(%rbp)
jge    1197 <arm_uint2hexstr+0x97>
cmpl   $0x0,-0x14(%rbp)
jne    1151 <arm_uint2hexstr+0x51>
mov    -0xc(%rbp),%eax
mov    $0x8,%ecx
sub    -0x10(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
shr    %cl,%eax
and    $0xf,%eax
cmp    $0x0,%eax
jne    1151 <arm_uint2hexstr+0x51>
jmp    1189 <arm_uint2hexstr+0x89>
mov    -0xc(%rbp),%eax
mov    $0x8,%ecx
sub    -0x10(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
shr    %cl,%eax
and    $0xf,%eax
mov    %eax,%eax
mov    %eax,%ecx
lea    0xe8e(%rip),%rax
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1119 <arm_uint2hexstr+0x19>
cmpl   $0x0,-0x14(%rbp)
jne    11b6 <arm_uint2hexstr+0xb6>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movb   $0x30,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<arm_uint2hexstr>:
cmp    $0x10000000,%esi
jae    1139 <arm_uint2hexstr+0x39>
xor    %eax,%eax
test   $0xf000000,%esi
jne    1150 <arm_uint2hexstr+0x50>
test   $0xf00000,%esi
je     11f4 <arm_uint2hexstr+0xf4>
mov    %esi,%eax
shr    $0x14,%eax
and    $0xf,%eax
lea    0xed3(%rip),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,(%rdi)
mov    $0x1,%eax
jmp    117b <arm_uint2hexstr+0x7b>
mov    %esi,%eax
shr    $0x1c,%rax
lea    0xeba(%rip),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,(%rdi)
mov    $0x1,%eax
mov    %esi,%ecx
shr    $0x18,%ecx
and    $0xf,%ecx
lea    0xea1(%rip),%r8
mov    (%rcx,%r8,1),%cl
mov    %eax,%edx
mov    %cl,(%rdi,%rdx,1)
mov    %esi,%ecx
shr    $0x14,%ecx
and    $0xf,%ecx
mov    (%rcx,%r8,1),%cl
mov    %cl,0x1(%rdi,%rdx,1)
or     $0x2,%eax
mov    %esi,%ecx
shr    $0x10,%ecx
and    $0xf,%ecx
lea    0xe76(%rip),%rdx
mov    (%rcx,%rdx,1),%cl
mov    %eax,%edx
mov    %cl,(%rdi,%rdx,1)
add    $0x1,%eax
mov    %esi,%ecx
shr    $0xc,%ecx
and    $0xf,%ecx
lea    0xe5c(%rip),%rdx
mov    (%rcx,%rdx,1),%cl
mov    %eax,%edx
mov    %cl,(%rdi,%rdx,1)
add    $0x1,%eax
mov    %esi,%ecx
shr    $0x8,%ecx
and    $0xf,%ecx
lea    0xe42(%rip),%rdx
mov    (%rcx,%rdx,1),%cl
mov    %eax,%edx
mov    %cl,(%rdi,%rdx,1)
add    $0x1,%eax
mov    %esi,%ecx
shr    $0x4,%ecx
and    $0xf,%ecx
lea    0xe28(%rip),%r8
mov    (%rcx,%r8,1),%cl
mov    %eax,%edx
mov    %cl,(%rdi,%rdx,1)
and    $0xf,%esi
mov    (%rsi,%r8,1),%cl
mov    %cl,0x1(%rdi,%rdx,1)
add    $0x2,%eax
movb   $0x0,(%rdi,%rax,1)
ret
xor    %eax,%eax
test   $0xf0000,%esi
jne    117b <arm_uint2hexstr+0x7b>
xor    %eax,%eax
test   $0xf000,%esi
jne    1195 <arm_uint2hexstr+0x95>
xor    %eax,%eax
test   $0xf00,%esi
jne    11af <arm_uint2hexstr+0xaf>
xor    %eax,%eax
test   $0xf0,%sil
jne    11c9 <arm_uint2hexstr+0xc9>
and    $0xf,%rsi
je     1232 <arm_uint2hexstr+0x132>
lea    0xdd5(%rip),%rax
mov    (%rsi,%rax,1),%al
mov    %al,(%rdi)
jmp    1235 <arm_uint2hexstr+0x135>
movb   $0x30,(%rdi)
mov    $0x1,%eax
movb   $0x0,(%rdi,%rax,1)
ret

LLVM IR (-O0):
@arm_uint2hexstr.hexchars = internal constant [17 x i8] c"0123456789ABCDEF\00"
define void @arm_uint2hexstr(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 0, i32* %6
store i32 0, i32* %5
br label %7
7: ; preds = %40, %2
%8 = load i32, i32* %5
%9 = icmp slt i32 %8, 8
br i1 %9, label %10, label %43
10: ; preds = %7
%11 = load i32, i32* %6
%12 = icmp eq i32 %11, 0
br i1 %12, label %13, label %23
13: ; preds = %10
%14 = load i32, i32* %4
%15 = load i32, i32* %5
%16 = sub nsw i32 8, %15
%17 = sub nsw i32 %16, 1
%18 = mul nsw i32 4, %17
%19 = lshr i32 %14, %18
%20 = and i32 %19, 15
%21 = icmp ne i32 %20, 0
br i1 %21, label %23, label %22
22: ; preds = %13
br label %40
23: ; preds = %13, %10
%24 = load i32, i32* %4
%25 = load i32, i32* %5
%26 = sub nsw i32 8, %25
%27 = sub nsw i32 %26, 1
%28 = mul nsw i32 4, %27
%29 = lshr i32 %24, %28
%30 = and i32 %29, 15
%31 = zext i32 %30 to i64
%32 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %31
%33 = load i8, i8* %32
%34 = load i8*, i8** %3
%35 = load i32, i32* %6
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
store i8 %33, i8* %37
%38 = load i32, i32* %6
%39 = add nsw i32 %38, 1
store i32 %39, i32* %6
br label %40
40: ; preds = %23, %22
%41 = load i32, i32* %5
%42 = add nsw i32 %41, 1
store i32 %42, i32* %5
br label %7
43: ; preds = %7
%44 = load i32, i32* %6
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %53
46: ; preds = %43
%47 = load i8*, i8** %3
%48 = load i32, i32* %6
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i8, i8* %47, i64 %49
store i8 48, i8* %50
%51 = load i32, i32* %6
%52 = add nsw i32 %51, 1
store i32 %52, i32* %6
br label %53
53: ; preds = %46, %43
%54 = load i8*, i8** %3
%55 = load i32, i32* %6
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %54, i64 %56
store i8 0, i8* %57
ret void
}

LLVM IR (-O2):
@arm_uint2hexstr.hexchars = internal unnamed_addr constant [17 x i8] c"0123456789ABCDEF\00"
define void @arm_uint2hexstr(i8* nocapture writeonly %0, i32 %1) {
%3 = icmp ult i32 %1, 268435456
br i1 %3, label %9, label %4
4: ; preds = %2
%5 = lshr i32 %1, 28
%6 = zext i32 %5 to i64
%7 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %6
%8 = load i8, i8* %7
store i8 %8, i8* %0
br label %24
9: ; preds = %2
%10 = and i32 %1, 251658240
%11 = icmp eq i32 %10, 0
br i1 %11, label %12, label %24
12: ; preds = %9
%13 = and i32 %1, 15728640
%14 = icmp eq i32 %13, 0
br i1 %14, label %21, label %15
15: ; preds = %12
%16 = lshr i32 %1, 20
%17 = and i32 %16, 15
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %18
%20 = load i8, i8* %19
store i8 %20, i8* %0
br label %45
21: ; preds = %12
%22 = and i32 %1, 983040
%23 = icmp eq i32 %22, 0
br i1 %23, label %42, label %45
24: ; preds = %9, %4
%25 = phi i32 [ 0, %9 ], [ 1, %4 ]
%26 = lshr i32 %1, 24
%27 = and i32 %26, 15
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %28
%30 = load i8, i8* %29
%31 = zext i32 %25 to i64
%32 = getelementptr inbounds i8, i8* %0, i64 %31
store i8 %30, i8* %32
%33 = add nuw nsw i32 %25, 1
%34 = lshr i32 %1, 20
%35 = and i32 %34, 15
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %36
%38 = load i8, i8* %37
%39 = zext i32 %33 to i64
%40 = getelementptr inbounds i8, i8* %0, i64 %39
store i8 %38, i8* %40
%41 = or i32 %25, 2
br label %45
42: ; preds = %21
%43 = and i32 %1, 61440
%44 = icmp eq i32 %43, 0
br i1 %44, label %65, label %55
45: ; preds = %15, %21, %24
%46 = phi i32 [ %41, %24 ], [ 1, %15 ], [ 0, %21 ]
%47 = lshr i32 %1, 16
%48 = and i32 %47, 15
%49 = zext i32 %48 to i64
%50 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %49
%51 = load i8, i8* %50
%52 = zext i32 %46 to i64
%53 = getelementptr inbounds i8, i8* %0, i64 %52
store i8 %51, i8* %53
%54 = add nuw nsw i32 %46, 1
br label %55
55: ; preds = %45, %42
%56 = phi i32 [ 0, %42 ], [ %54, %45 ]
%57 = lshr i32 %1, 12
%58 = and i32 %57, 15
%59 = zext i32 %58 to i64
%60 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %59
%61 = load i8, i8* %60
%62 = zext i32 %56 to i64
%63 = getelementptr inbounds i8, i8* %0, i64 %62
store i8 %61, i8* %63
%64 = add nuw nsw i32 %56, 1
br label %68
65: ; preds = %42
%66 = and i32 %1, 3840
%67 = icmp eq i32 %66, 0
br i1 %67, label %78, label %68
68: ; preds = %55, %65
%69 = phi i32 [ 0, %65 ], [ %64, %55 ]
%70 = lshr i32 %1, 8
%71 = and i32 %70, 15
%72 = zext i32 %71 to i64
%73 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %72
%74 = load i8, i8* %73
%75 = zext i32 %69 to i64
%76 = getelementptr inbounds i8, i8* %0, i64 %75
store i8 %74, i8* %76
%77 = add nuw nsw i32 %69, 1
br label %81
78: ; preds = %65
%79 = and i32 %1, 240
%80 = icmp eq i32 %79, 0
br i1 %80, label %99, label %81
81: ; preds = %68, %78
%82 = phi i32 [ 0, %78 ], [ %77, %68 ]
%83 = lshr i32 %1, 4
%84 = and i32 %83, 15
%85 = zext i32 %84 to i64
%86 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %85
%87 = load i8, i8* %86
%88 = zext i32 %82 to i64
%89 = getelementptr inbounds i8, i8* %0, i64 %88
store i8 %87, i8* %89
%90 = add nuw nsw i32 %82, 1
%91 = and i32 %1, 15
%92 = zext i32 %91 to i64
%93 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %92
%94 = load i8, i8* %93
%95 = zext i32 %90 to i64
%96 = getelementptr inbounds i8, i8* %0, i64 %95
store i8 %94, i8* %96
%97 = add nuw nsw i32 %82, 2
%98 = zext i32 %97 to i64
br label %107
99: ; preds = %78
%100 = and i32 %1, 15
%101 = icmp eq i32 %100, 0
br i1 %101, label %106, label %102
102: ; preds = %99
%103 = zext i32 %100 to i64
%104 = getelementptr inbounds [17 x i8], [17 x i8]* @arm_uint2hexstr.hexchars, i64 0, i64 %103
%105 = load i8, i8* %104
store i8 %105, i8* %0
br label %107
106: ; preds = %99
store i8 48, i8* %0
br label %107
107: ; preds = %81, %102, %106
%108 = phi i64 [ 1, %106 ], [ %98, %81 ], [ 1, %102 ]
%109 = getelementptr inbounds i8, i8* %0, i64 %108
store i8 0, i8* %109
ret void
}