#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 uint8_t;

/* Variables and functions */
int log10_approx(uint8_t x) {
  int l, log;
  if (x == 1) {
    return (0);
  }
  if (x < 8) {
    return (11 * x + 11);
  }
  log = 980 - 980 / x;
  log /= 10;
  if (x < 31) {
    l = 19 * x;
    l = l / 10;
    log += l - 4;
  } else {
    l = 67 * x;
    l = l / 100;
    if (x > 51 && x < 81) {
      log += l + 42;
    } else {
      log += l + 39;
    }
  }
  if (log > 200)
    log = 200;
  return (log);
}


x86 assembly (clang, -O0):
<log10_approx>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x1,-0x8(%rbp)
jne    111d <log10_approx+0x1d>
movl   $0x0,-0x4(%rbp)
jmp    11ee <log10_approx+0xee>
cmpl   $0x8,-0x8(%rbp)
jge    1136 <log10_approx+0x36>
imul   $0xb,-0x8(%rbp),%eax
add    $0xb,%eax
mov    %eax,-0x4(%rbp)
jmp    11ee <log10_approx+0xee>
mov    $0x3d4,%eax
cltd
idivl  -0x8(%rbp)
mov    %eax,%ecx
mov    $0x3d4,%eax
sub    %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x10(%rbp)
cmpl   $0x1f,-0x8(%rbp)
jge    1189 <log10_approx+0x89>
imul   $0x13,-0x8(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x4,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    11d4 <log10_approx+0xd4>
imul   $0x43,-0x8(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
cmpl   $0x33,-0x8(%rbp)
jle    11c3 <log10_approx+0xc3>
cmpl   $0x51,-0x8(%rbp)
jge    11c3 <log10_approx+0xc3>
mov    -0xc(%rbp),%eax
add    $0x2a,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    11cf <log10_approx+0xcf>
mov    -0xc(%rbp),%eax
add    $0x27,%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    11d4 <log10_approx+0xd4>
cmpl   $0xc8,-0x10(%rbp)
jle    11e8 <log10_approx+0xe8>
movl   $0xc8,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<log10_approx>:
xor    %eax,%eax
cmp    $0x1,%edi
je     118c <log10_approx+0x8c>
cmp    $0x7,%edi
jg     111a <log10_approx+0x1a>
lea    (%rdi,%rdi,4),%eax
lea    (%rdi,%rax,2),%eax
add    $0xb,%eax
ret
mov    $0x3d4,%ecx
mov    $0x3d4,%eax
xor    %edx,%edx
div    %edi
sub    %eax,%ecx
movzwl %cx,%eax
imul   $0xcccd,%eax,%eax
shr    $0x13,%eax
cmp    $0x1e,%edi
ja     1152 <log10_approx+0x52>
lea    (%rdi,%rdi,8),%ecx
lea    (%rdi,%rcx,2),%ecx
movzwl %cx,%ecx
imul   $0xcccd,%ecx,%ecx
shr    $0x13,%ecx
add    $0xfffffffc,%ecx
jmp    117c <log10_approx+0x7c>
imul   $0x43,%edi,%ecx
movslq %ecx,%rcx
imul   $0x51eb851f,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x25,%rcx
add    %edx,%ecx
add    $0xffffffcc,%edi
cmp    $0x1c,%edi
ja     1179 <log10_approx+0x79>
add    $0x2a,%ecx
jmp    117c <log10_approx+0x7c>
add    $0x27,%ecx
add    %eax,%ecx
cmp    $0xc8,%ecx
mov    $0xc8,%eax
cmovl  %ecx,%eax
ret

LLVM IR (-O0):
define i32 @log10_approx(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %3
%6 = load i32, i32* %3
%7 = icmp eq i32 %6, 1
br i1 %7, label %8, label %9
8: ; preds = %1
store i32 0, i32* %2
br label %60
9: ; preds = %1
%10 = load i32, i32* %3
%11 = icmp slt i32 %10, 8
br i1 %11, label %12, label %16
12: ; preds = %9
%13 = load i32, i32* %3
%14 = mul nsw i32 11, %13
%15 = add nsw i32 %14, 11
store i32 %15, i32* %2
br label %60
16: ; preds = %9
%17 = load i32, i32* %3
%18 = sdiv i32 980, %17
%19 = sub nsw i32 980, %18
store i32 %19, i32* %5
%20 = load i32, i32* %5
%21 = sdiv i32 %20, 10
store i32 %21, i32* %5
%22 = load i32, i32* %3
%23 = icmp slt i32 %22, 31
br i1 %23, label %24, label %33
24: ; preds = %16
%25 = load i32, i32* %3
%26 = mul nsw i32 19, %25
store i32 %26, i32* %4
%27 = load i32, i32* %4
%28 = sdiv i32 %27, 10
store i32 %28, i32* %4
%29 = load i32, i32* %4
%30 = sub nsw i32 %29, 4
%31 = load i32, i32* %5
%32 = add nsw i32 %31, %30
store i32 %32, i32* %5
br label %54
33: ; preds = %16
%34 = load i32, i32* %3
%35 = mul nsw i32 67, %34
store i32 %35, i32* %4
%36 = load i32, i32* %4
%37 = sdiv i32 %36, 100
store i32 %37, i32* %4
%38 = load i32, i32* %3
%39 = icmp sgt i32 %38, 51
br i1 %39, label %40, label %48
40: ; preds = %33
%41 = load i32, i32* %3
%42 = icmp slt i32 %41, 81
br i1 %42, label %43, label %48
43: ; preds = %40
%44 = load i32, i32* %4
%45 = add nsw i32 %44, 42
%46 = load i32, i32* %5
%47 = add nsw i32 %46, %45
store i32 %47, i32* %5
br label %53
48: ; preds = %40, %33
%49 = load i32, i32* %4
%50 = add nsw i32 %49, 39
%51 = load i32, i32* %5
%52 = add nsw i32 %51, %50
store i32 %52, i32* %5
br label %53
53: ; preds = %48, %43
br label %54
54: ; preds = %53, %24
%55 = load i32, i32* %5
%56 = icmp sgt i32 %55, 200
br i1 %56, label %57, label %58
57: ; preds = %54
store i32 200, i32* %5
br label %58
58: ; preds = %57, %54
%59 = load i32, i32* %5
store i32 %59, i32* %2
br label %60
60: ; preds = %58, %12, %8
%61 = load i32, i32* %2
ret i32 %61
}

LLVM IR (-O2):
define i32 @log10_approx(i32 %0) {
%2 = icmp eq i32 %0, 1
br i1 %2, label %35, label %3
3: ; preds = %1
%4 = icmp slt i32 %0, 8
br i1 %4, label %5, label %8
5: ; preds = %3
%6 = mul nsw i32 %0, 11
%7 = add nsw i32 %6, 11
br label %35
8: ; preds = %3
%9 = udiv i32 980, %0
%10 = trunc i32 %9 to i16
%11 = sub nuw nsw i16 980, %10
%12 = udiv i16 %11, 10
%13 = zext i16 %12 to i32
%14 = icmp ult i32 %0, 31
br i1 %14, label %15, label %21
15: ; preds = %8
%16 = trunc i32 %0 to i16
%17 = mul nuw nsw i16 %16, 19
%18 = udiv i16 %17, 10
%19 = zext i16 %18 to i32
%20 = add nsw i32 %19, -4
br label %30
21: ; preds = %8
%22 = mul nsw i32 %0, 67
%23 = sdiv i32 %22, 100
%24 = add nsw i32 %0, -52
%25 = icmp ult i32 %24, 29
br i1 %25, label %26, label %28
26: ; preds = %21
%27 = add nsw i32 %23, 42
br label %30
28: ; preds = %21
%29 = add nsw i32 %23, 39
br label %30
30: ; preds = %26, %28, %15
%31 = phi i32 [ %20, %15 ], [ %27, %26 ], [ %29, %28 ]
%32 = add nsw i32 %31, %13
%33 = icmp slt i32 %32, 200
%34 = select i1 %33, i32 %32, i32 200
br label %35
35: ; preds = %1, %30, %5
%36 = phi i32 [ %7, %5 ], [ %34, %30 ], [ 0, %1 ]
ret i32 %36
}