float log10_(int v) {
  return (v >= 1000000000u)  ? 9
         : (v >= 100000000u) ? 8
         : (v >= 10000000u)  ? 7
         : (v >= 1000000u)   ? 6
         : (v >= 100000u)    ? 5
         : (v >= 10000u)     ? 4
         : (v >= 1000u)      ? 3
         : (v >= 100u)       ? 2
         : (v >= 10u)        ? 1u
                             : 0u;
}


x86 assembly (clang, -O0):
<log10_>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x3b9aca00,-0x4(%rbp)
jb     1121 <log10_+0x21>
mov    $0x9,%eax
mov    %eax,-0x8(%rbp)
jmp    1211 <log10_+0x111>
cmpl   $0x5f5e100,-0x4(%rbp)
jb     113b <log10_+0x3b>
mov    $0x8,%eax
mov    %eax,-0xc(%rbp)
jmp    120b <log10_+0x10b>
cmpl   $0x989680,-0x4(%rbp)
jb     1155 <log10_+0x55>
mov    $0x7,%eax
mov    %eax,-0x10(%rbp)
jmp    1205 <log10_+0x105>
cmpl   $0xf4240,-0x4(%rbp)
jb     116f <log10_+0x6f>
mov    $0x6,%eax
mov    %eax,-0x14(%rbp)
jmp    11ff <log10_+0xff>
cmpl   $0x186a0,-0x4(%rbp)
jb     1189 <log10_+0x89>
mov    $0x5,%eax
mov    %eax,-0x18(%rbp)
jmp    11f9 <log10_+0xf9>
cmpl   $0x2710,-0x4(%rbp)
jb     11a3 <log10_+0xa3>
mov    $0x4,%eax
mov    %eax,-0x1c(%rbp)
jmp    11f3 <log10_+0xf3>
cmpl   $0x3e8,-0x4(%rbp)
jb     11bd <log10_+0xbd>
mov    $0x3,%eax
mov    %eax,-0x20(%rbp)
jmp    11ed <log10_+0xed>
cmpl   $0x64,-0x4(%rbp)
jb     11d4 <log10_+0xd4>
mov    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    11e7 <log10_+0xe7>
mov    -0x4(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0xa,%edx
cmovae %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,%eax
cvtsi2ss %rax,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<log10_>:
cmp    $0x3b9ac9ff,%edi
jbe    1111 <log10_+0x11>
movss  0xef0(%rip),%xmm0
ret
cmp    $0x5f5e0ff,%edi
jbe    1122 <log10_+0x22>
movss  0xee3(%rip),%xmm0
ret
cmp    $0x98967f,%edi
jbe    1133 <log10_+0x33>
movss  0xed6(%rip),%xmm0
ret
cmp    $0xf423f,%edi
jbe    1144 <log10_+0x44>
movss  0xec9(%rip),%xmm0
ret
cmp    $0x1869f,%edi
jbe    1155 <log10_+0x55>
movss  0xebc(%rip),%xmm0
ret
cmp    $0x270f,%edi
jbe    1166 <log10_+0x66>
movss  0xeaf(%rip),%xmm0
ret
cmp    $0x3e7,%edi
jbe    1177 <log10_+0x77>
movss  0xea2(%rip),%xmm0
ret
cmp    $0x63,%edi
jbe    1185 <log10_+0x85>
movss  0xe98(%rip),%xmm0
ret
cmp    $0xa,%edi
jae    118e <log10_+0x8e>
xorps  %xmm0,%xmm0
ret
movss  0xe8a(%rip),%xmm0
ret

LLVM IR (-O0):
define float @log10_(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = icmp uge i32 %3, 1000000000
br i1 %4, label %5, label %6
5: ; preds = %1
br label %53
6: ; preds = %1
%7 = load i32, i32* %2
%8 = icmp uge i32 %7, 100000000
br i1 %8, label %9, label %10
9: ; preds = %6
br label %51
10: ; preds = %6
%11 = load i32, i32* %2
%12 = icmp uge i32 %11, 10000000
br i1 %12, label %13, label %14
13: ; preds = %10
br label %49
14: ; preds = %10
%15 = load i32, i32* %2
%16 = icmp uge i32 %15, 1000000
br i1 %16, label %17, label %18
17: ; preds = %14
br label %47
18: ; preds = %14
%19 = load i32, i32* %2
%20 = icmp uge i32 %19, 100000
br i1 %20, label %21, label %22
21: ; preds = %18
br label %45
22: ; preds = %18
%23 = load i32, i32* %2
%24 = icmp uge i32 %23, 10000
br i1 %24, label %25, label %26
25: ; preds = %22
br label %43
26: ; preds = %22
%27 = load i32, i32* %2
%28 = icmp uge i32 %27, 1000
br i1 %28, label %29, label %30
29: ; preds = %26
br label %41
30: ; preds = %26
%31 = load i32, i32* %2
%32 = icmp uge i32 %31, 100
br i1 %32, label %33, label %34
33: ; preds = %30
br label %39
34: ; preds = %30
%35 = load i32, i32* %2
%36 = icmp uge i32 %35, 10
%37 = zext i1 %36 to i64
%38 = select i1 %36, i32 1, i32 0
br label %39
39: ; preds = %34, %33
%40 = phi i32 [ 2, %33 ], [ %38, %34 ]
br label %41
41: ; preds = %39, %29
%42 = phi i32 [ 3, %29 ], [ %40, %39 ]
br label %43
43: ; preds = %41, %25
%44 = phi i32 [ 4, %25 ], [ %42, %41 ]
br label %45
45: ; preds = %43, %21
%46 = phi i32 [ 5, %21 ], [ %44, %43 ]
br label %47
47: ; preds = %45, %17
%48 = phi i32 [ 6, %17 ], [ %46, %45 ]
br label %49
49: ; preds = %47, %13
%50 = phi i32 [ 7, %13 ], [ %48, %47 ]
br label %51
51: ; preds = %49, %9
%52 = phi i32 [ 8, %9 ], [ %50, %49 ]
br label %53
53: ; preds = %51, %5
%54 = phi i32 [ 9, %5 ], [ %52, %51 ]
%55 = uitofp i32 %54 to float
ret float %55
}

LLVM IR (-O2):
define float @log10_(i32 %0) {
%2 = icmp ugt i32 %0, 999999999
br i1 %2, label %20, label %3
3: ; preds = %1
%4 = icmp ugt i32 %0, 99999999
br i1 %4, label %20, label %5
5: ; preds = %3
%6 = icmp ugt i32 %0, 9999999
br i1 %6, label %20, label %7
7: ; preds = %5
%8 = icmp ugt i32 %0, 999999
br i1 %8, label %20, label %9
9: ; preds = %7
%10 = icmp ugt i32 %0, 99999
br i1 %10, label %20, label %11
11: ; preds = %9
%12 = icmp ugt i32 %0, 9999
br i1 %12, label %20, label %13
13: ; preds = %11
%14 = icmp ugt i32 %0, 999
br i1 %14, label %20, label %15
15: ; preds = %13
%16 = icmp ugt i32 %0, 99
br i1 %16, label %20, label %17
17: ; preds = %15
%18 = icmp ugt i32 %0, 9
%19 = uitofp i1 %18 to float
br label %20
20: ; preds = %3, %7, %11, %17, %15, %13, %9, %5, %1
%21 = phi float [ 9.000000e+00, %1 ], [ 8.000000e+00, %3 ], [ 7.000000e+00, %5 ], [ 6.000000e+00, %7 ], [ 5.000000e+00, %9 ], [ 4.000000e+00, %11 ], [ 3.000000e+00, %13 ], [ %19, %17 ], [ 2.000000e+00, %15 ]
ret float %21
}