#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 */

/* Variables and functions */
int /*<<< orphan*/ lcd_putstr(char *);
void lcd_disp_5(unsigned int x) {
  char s[6];
  unsigned int y;
  if (x <= 65535) {
    y = x / 10000;
    s[0] = (char)(y + 0x30);
    x -= (y * 10000);
    y = x / 1000;
    s[1] = (char)(y + 0x30);
    x -= (y * 1000);
    y = x / 100;
    s[2] = (char)(y + 0x30);
    x -= (y * 100);
    y = x / 10;
    s[3] = (char)(y + 0x30);
    x -= (y * 10);
    s[4] = (char)(x + 0x30);
    s[5] = '\0';
    if (s[0] == '0') {
      s[0] = ' ';
      if (s[1] == '0') {
        s[1] = ' ';
        if (s[2] == '0') {
          s[2] = ' ';
          if (s[3] == '0') {
            s[3] = ' ';
          }
        }
      }
    }
    lcd_putstr(s);
  } else {
    lcd_putstr("XXXXX");
  }
}


x86 assembly (clang, -O0):
<lcd_disp_5>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
cmpl   $0xffff,-0x4(%rbp)
ja     122c <lcd_disp_5+0x11c>
mov    -0x4(%rbp),%eax
mov    $0x2710,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
add    $0x30,%eax
mov    %al,-0xa(%rbp)
imul   $0x2710,-0x10(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x3e8,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
add    $0x30,%eax
mov    %al,-0x9(%rbp)
imul   $0x3e8,-0x10(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x64,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
add    $0x30,%eax
mov    %al,-0x8(%rbp)
imul   $0x64,-0x10(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
add    $0x30,%eax
mov    %al,-0x7(%rbp)
imul   $0xa,-0x10(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%eax
mov    %al,-0x6(%rbp)
movb   $0x0,-0x5(%rbp)
movsbl -0xa(%rbp),%eax
cmp    $0x30,%eax
jne    121e <lcd_disp_5+0x10e>
movb   $0x20,-0xa(%rbp)
movsbl -0x9(%rbp),%eax
cmp    $0x30,%eax
jne    1219 <lcd_disp_5+0x109>
movb   $0x20,-0x9(%rbp)
movsbl -0x8(%rbp),%eax
cmp    $0x30,%eax
jne    1214 <lcd_disp_5+0x104>
movb   $0x20,-0x8(%rbp)
movsbl -0x7(%rbp),%eax
cmp    $0x30,%eax
jne    120f <lcd_disp_5+0xff>
movb   $0x20,-0x7(%rbp)
jmp    1214 <lcd_disp_5+0x104>
jmp    1219 <lcd_disp_5+0x109>
jmp    121e <lcd_disp_5+0x10e>
lea    -0xa(%rbp),%rdi
call   1030 <lcd_putstr@plt>
jmp    1238 <lcd_disp_5+0x128>
lea    0xdcd(%rip),%rdi
call   1030 <lcd_putstr@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lcd_disp_5>:
cmp    $0xffff,%edi
ja     11cd <lcd_disp_5+0xbd>
push   %rax
movzwl %di,%eax
shr    $0x4,%eax
imul   $0x347,%eax,%ecx
shr    $0x13,%ecx
lea    0x30(%rcx),%r8d
mov    %r8b,0x2(%rsp)
imul   $0xffffd8f0,%ecx,%edx
add    %edi,%edx
imul   $0x10624dd3,%rdx,%rcx
shr    $0x26,%rcx
lea    0x30(%rcx),%esi
mov    %sil,0x3(%rsp)
imul   $0xfffffc18,%ecx,%esi
add    %edx,%esi
imul   $0x51eb851f,%rsi,%rdx
shr    $0x25,%rdx
lea    0x30(%rdx),%edi
mov    %dil,0x4(%rsp)
imul   $0xffffff9c,%edx,%edi
add    %esi,%edi
mov    $0xcccccccd,%esi
imul   %rdi,%rsi
shr    $0x23,%rsi
lea    0x30(%rsi),%eax
mov    %al,0x5(%rsp)
lea    (%rsi,%rsi,1),%eax
lea    (%rax,%rax,4),%eax
sub    %eax,%edi
add    $0x30,%dil
mov    %dil,0x6(%rsp)
movb   $0x0,0x7(%rsp)
cmp    $0x30,%r8b
jne    11c1 <lcd_disp_5+0xb1>
movb   $0x20,0x2(%rsp)
test   %cl,%cl
jne    11c1 <lcd_disp_5+0xb1>
movb   $0x20,0x3(%rsp)
test   %dl,%dl
jne    11c1 <lcd_disp_5+0xb1>
movb   $0x20,0x4(%rsp)
test   %sil,%sil
jne    11c1 <lcd_disp_5+0xb1>
movb   $0x20,0x5(%rsp)
lea    0x2(%rsp),%rdi
call   1030 <lcd_putstr@plt>
pop    %rax
ret
lea    0xe2c(%rip),%rdi
jmp    1030 <lcd_putstr@plt>

LLVM IR (-O0):
@.str = [6 x i8] c"XXXXX\00"
define void @lcd_disp_5(i32 %0) {
%2 = alloca i32
%3 = alloca [6 x i8]
%4 = alloca i32
store i32 %0, i32* %2
%5 = load i32, i32* %2
%6 = icmp ule i32 %5, 65535
br i1 %6, label %7, label %83
7: ; preds = %1
%8 = load i32, i32* %2
%9 = udiv i32 %8, 10000
store i32 %9, i32* %4
%10 = load i32, i32* %4
%11 = add i32 %10, 48
%12 = trunc i32 %11 to i8
%13 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 0
store i8 %12, i8* %13
%14 = load i32, i32* %4
%15 = mul i32 %14, 10000
%16 = load i32, i32* %2
%17 = sub i32 %16, %15
store i32 %17, i32* %2
%18 = load i32, i32* %2
%19 = udiv i32 %18, 1000
store i32 %19, i32* %4
%20 = load i32, i32* %4
%21 = add i32 %20, 48
%22 = trunc i32 %21 to i8
%23 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 1
store i8 %22, i8* %23
%24 = load i32, i32* %4
%25 = mul i32 %24, 1000
%26 = load i32, i32* %2
%27 = sub i32 %26, %25
store i32 %27, i32* %2
%28 = load i32, i32* %2
%29 = udiv i32 %28, 100
store i32 %29, i32* %4
%30 = load i32, i32* %4
%31 = add i32 %30, 48
%32 = trunc i32 %31 to i8
%33 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 2
store i8 %32, i8* %33
%34 = load i32, i32* %4
%35 = mul i32 %34, 100
%36 = load i32, i32* %2
%37 = sub i32 %36, %35
store i32 %37, i32* %2
%38 = load i32, i32* %2
%39 = udiv i32 %38, 10
store i32 %39, i32* %4
%40 = load i32, i32* %4
%41 = add i32 %40, 48
%42 = trunc i32 %41 to i8
%43 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 3
store i8 %42, i8* %43
%44 = load i32, i32* %4
%45 = mul i32 %44, 10
%46 = load i32, i32* %2
%47 = sub i32 %46, %45
store i32 %47, i32* %2
%48 = load i32, i32* %2
%49 = add i32 %48, 48
%50 = trunc i32 %49 to i8
%51 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 4
store i8 %50, i8* %51
%52 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 5
store i8 0, i8* %52
%53 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 0
%54 = load i8, i8* %53
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 48
br i1 %56, label %57, label %80
57: ; preds = %7
%58 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 0
store i8 32, i8* %58
%59 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 1
%60 = load i8, i8* %59
%61 = sext i8 %60 to i32
%62 = icmp eq i32 %61, 48
br i1 %62, label %63, label %79
63: ; preds = %57
%64 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 1
store i8 32, i8* %64
%65 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 2
%66 = load i8, i8* %65
%67 = sext i8 %66 to i32
%68 = icmp eq i32 %67, 48
br i1 %68, label %69, label %78
69: ; preds = %63
%70 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 2
store i8 32, i8* %70
%71 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 3
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 48
br i1 %74, label %75, label %77
75: ; preds = %69
%76 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 3
store i8 32, i8* %76
br label %77
77: ; preds = %75, %69
br label %78
78: ; preds = %77, %63
br label %79
79: ; preds = %78, %57
br label %80
80: ; preds = %79, %7
%81 = getelementptr inbounds [6 x i8], [6 x i8]* %3, i64 0, i64 0
%82 = call i32 @lcd_putstr(i8* %81)
br label %85
83: ; preds = %1
%84 = call i32 @lcd_putstr(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
br label %85
85: ; preds = %83, %80
ret void
}

LLVM IR (-O2):
@.str = [6 x i8] c"XXXXX\00"
define void @lcd_disp_5(i32 %0) {
%2 = alloca [6 x i8]
%3 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 0
%4 = icmp ult i32 %0, 65536
br i1 %4, label %5, label %45
5: ; preds = %1
%6 = trunc i32 %0 to i16
%7 = udiv i16 %6, 10000
%8 = zext i16 %7 to i32
%9 = trunc i16 %7 to i8
%10 = or i8 %9, 48
store i8 %10, i8* %3
%11 = mul nsw i32 %8, -10000
%12 = add nsw i32 %11, %0
%13 = udiv i32 %12, 1000
%14 = trunc i32 %13 to i8
%15 = add i8 %14, 48
%16 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 1
store i8 %15, i8* %16
%17 = mul i32 %13, -1000
%18 = add i32 %17, %12
%19 = udiv i32 %18, 100
%20 = trunc i32 %19 to i8
%21 = add i8 %20, 48
%22 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 2
store i8 %21, i8* %22
%23 = mul i32 %19, -100
%24 = add i32 %23, %18
%25 = udiv i32 %24, 10
%26 = trunc i32 %25 to i8
%27 = add i8 %26, 48
%28 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 3
store i8 %27, i8* %28
%29 = mul i32 %25, -10
%30 = add i32 %29, %24
%31 = trunc i32 %30 to i8
%32 = add i8 %31, 48
%33 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 4
store i8 %32, i8* %33
%34 = getelementptr inbounds [6 x i8], [6 x i8]* %2, i64 0, i64 5
store i8 0, i8* %34
%35 = icmp eq i8 %10, 48
br i1 %35, label %36, label %43
36: ; preds = %5
store i8 32, i8* %3
%37 = icmp eq i8 %14, 0
br i1 %37, label %38, label %43
38: ; preds = %36
store i8 32, i8* %16
%39 = icmp eq i8 %20, 0
br i1 %39, label %40, label %43
40: ; preds = %38
store i8 32, i8* %22
%41 = icmp eq i8 %26, 0
br i1 %41, label %42, label %43
42: ; preds = %40
store i8 32, i8* %28
br label %43
43: ; preds = %36, %40, %42, %38, %5
%44 = call i32 @lcd_putstr(i8* %3)
br label %47
45: ; preds = %1
%46 = tail call i32 @lcd_putstr(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
br label %47
47: ; preds = %45, %43
ret void
}