#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 */
unsigned long getch();
int /*<<< orphan*/ putchar(char);
unsigned long getnum(void) {
  int i;
  unsigned long ch, ch2, value = 0;
  for (i = 0; i < 16;) {
    ch = ch2 = getch();
    if (ch == '\n' || ch == '\r')
      break;
    if ('0' <= ch && ch <= '9')
      ch -= '0';
    else if ('A' <= ch && ch <= 'Z')
      ch = ch - 'A' + 10;
    else if ('a' <= ch && ch <= 'z')
      ch = ch - 'a' + 10;
    else if (ch == 8) {
      if (i > 0) {
        --i;
        putchar(ch);
        putchar(' ');
        putchar(ch);
      }
      value >>= 4;
      continue;
    }
    putchar(ch2);
    value = (value << 4) + ch;
    ++i;
  }
  putchar('\r');
  putchar('\n');
  return value;
}


x86 assembly (clang, -O0):
<getnum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movq   $0x0,-0x20(%rbp)
movl   $0x0,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jge    127e <getnum+0x15e>
mov    $0x0,%al
call   1040 <getch@plt>
mov    %rax,-0x18(%rbp)
mov    %rax,-0x10(%rbp)
cmpq   $0xa,-0x10(%rbp)
je     1166 <getnum+0x46>
cmpq   $0xd,-0x10(%rbp)
jne    116b <getnum+0x4b>
jmp    127e <getnum+0x15e>
mov    $0x30,%eax
cmp    -0x10(%rbp),%rax
ja     1196 <getnum+0x76>
cmpq   $0x39,-0x10(%rbp)
ja     1196 <getnum+0x76>
mov    -0x10(%rbp),%rax
sub    $0x30,%rax
mov    %rax,-0x10(%rbp)
jmp    1254 <getnum+0x134>
mov    $0x41,%eax
cmp    -0x10(%rbp),%rax
ja     11c5 <getnum+0xa5>
cmpq   $0x5a,-0x10(%rbp)
ja     11c5 <getnum+0xa5>
mov    -0x10(%rbp),%rax
sub    $0x41,%rax
add    $0xa,%rax
mov    %rax,-0x10(%rbp)
jmp    124f <getnum+0x12f>
mov    $0x61,%eax
cmp    -0x10(%rbp),%rax
ja     11f4 <getnum+0xd4>
cmpq   $0x7a,-0x10(%rbp)
ja     11f4 <getnum+0xd4>
mov    -0x10(%rbp),%rax
sub    $0x61,%rax
add    $0xa,%rax
mov    %rax,-0x10(%rbp)
jmp    124a <getnum+0x12a>
cmpq   $0x8,-0x10(%rbp)
jne    1245 <getnum+0x125>
cmpl   $0x0,-0x4(%rbp)
jle    1234 <getnum+0x114>
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
mov    -0x10(%rbp),%rax
movsbl %al,%edi
call   1030 <putchar@plt>
mov    $0x20,%edi
call   1030 <putchar@plt>
mov    -0x10(%rbp),%rax
movsbl %al,%edi
call   1030 <putchar@plt>
mov    -0x20(%rbp),%rax
shr    $0x4,%rax
mov    %rax,-0x20(%rbp)
jmp    1137 <getnum+0x17>
jmp    124a <getnum+0x12a>
jmp    124f <getnum+0x12f>
jmp    1254 <getnum+0x134>
mov    -0x18(%rbp),%rax
movsbl %al,%edi
call   1030 <putchar@plt>
mov    -0x20(%rbp),%rax
shl    $0x4,%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1137 <getnum+0x17>
mov    $0xd,%edi
call   1030 <putchar@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
mov    -0x20(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getnum>:
push   %rbp
push   %r14
push   %rbx
xor    %ebx,%ebx
xor    %r14d,%r14d
nopl   0x0(%rax)
xor    %eax,%eax
call   1040 <getch@plt>
cmp    $0xa,%rax
je     11dd <getnum+0xbd>
cmp    $0xd,%rax
je     11dd <getnum+0xbd>
lea    -0x30(%rax),%rbp
cmp    $0xa,%rbp
jb     11c0 <getnum+0xa0>
lea    -0x41(%rax),%rcx
cmp    $0x19,%rcx
ja     1170 <getnum+0x50>
mov    %rax,%rbp
add    $0xffffffffffffffc9,%rbp
jmp    11c0 <getnum+0xa0>
nopl   0x0(%rax,%rax,1)
lea    -0x61(%rax),%rcx
mov    %rax,%rbp
cmp    $0x19,%rcx
ja     1183 <getnum+0x63>
add    $0xffffffffffffffa9,%rbp
jmp    11c0 <getnum+0xa0>
cmp    $0x8,%rax
jne    11c0 <getnum+0xa0>
test   %r14d,%r14d
jle    11b0 <getnum+0x90>
add    $0xffffffff,%r14d
mov    $0x8,%edi
call   1030 <putchar@plt>
mov    $0x20,%edi
call   1030 <putchar@plt>
mov    $0x8,%edi
call   1030 <putchar@plt>
shr    $0x4,%rbx
cmp    $0x10,%r14d
jl     1130 <getnum+0x10>
jmp    11dd <getnum+0xbd>
movsbl %al,%edi
call   1030 <putchar@plt>
shl    $0x4,%rbx
add    %rbp,%rbx
add    $0x1,%r14d
cmp    $0x10,%r14d
jl     1130 <getnum+0x10>
mov    $0xd,%edi
call   1030 <putchar@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
mov    %rbx,%rax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i64 @getnum() {
%1 = alloca i32
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
store i64 0, i64* %4
store i32 0, i32* %1
br label %5
5: ; preds = %67, %61, %0
%6 = load i32, i32* %1
%7 = icmp slt i32 %6, 16
br i1 %7, label %8, label %77
8: ; preds = %5
%9 = call i64 (...) @getch()
store i64 %9, i64* %3
store i64 %9, i64* %2
%10 = load i64, i64* %2
%11 = icmp eq i64 %10, 10
br i1 %11, label %15, label %12
12: ; preds = %8
%13 = load i64, i64* %2
%14 = icmp eq i64 %13, 13
br i1 %14, label %15, label %16
15: ; preds = %12, %8
br label %77
16: ; preds = %12
%17 = load i64, i64* %2
%18 = icmp ule i64 48, %17
br i1 %18, label %19, label %25
19: ; preds = %16
%20 = load i64, i64* %2
%21 = icmp ule i64 %20, 57
br i1 %21, label %22, label %25
22: ; preds = %19
%23 = load i64, i64* %2
%24 = sub i64 %23, 48
store i64 %24, i64* %2
br label %67
25: ; preds = %19, %16
%26 = load i64, i64* %2
%27 = icmp ule i64 65, %26
br i1 %27, label %28, label %35
28: ; preds = %25
%29 = load i64, i64* %2
%30 = icmp ule i64 %29, 90
br i1 %30, label %31, label %35
31: ; preds = %28
%32 = load i64, i64* %2
%33 = sub i64 %32, 65
%34 = add i64 %33, 10
store i64 %34, i64* %2
br label %66
35: ; preds = %28, %25
%36 = load i64, i64* %2
%37 = icmp ule i64 97, %36
br i1 %37, label %38, label %45
38: ; preds = %35
%39 = load i64, i64* %2
%40 = icmp ule i64 %39, 122
br i1 %40, label %41, label %45
41: ; preds = %38
%42 = load i64, i64* %2
%43 = sub i64 %42, 97
%44 = add i64 %43, 10
store i64 %44, i64* %2
br label %65
45: ; preds = %38, %35
%46 = load i64, i64* %2
%47 = icmp eq i64 %46, 8
br i1 %47, label %48, label %64
48: ; preds = %45
%49 = load i32, i32* %1
%50 = icmp sgt i32 %49, 0
br i1 %50, label %51, label %61
51: ; preds = %48
%52 = load i32, i32* %1
%53 = add nsw i32 %52, -1
store i32 %53, i32* %1
%54 = load i64, i64* %2
%55 = trunc i64 %54 to i8
%56 = call i32 @putchar(i8 signext %55)
%57 = call i32 @putchar(i8 signext 32)
%58 = load i64, i64* %2
%59 = trunc i64 %58 to i8
%60 = call i32 @putchar(i8 signext %59)
br label %61
61: ; preds = %51, %48
%62 = load i64, i64* %4
%63 = lshr i64 %62, 4
store i64 %63, i64* %4
br label %5
64: ; preds = %45
br label %65
65: ; preds = %64, %41
br label %66
66: ; preds = %65, %31
br label %67
67: ; preds = %66, %22
%68 = load i64, i64* %3
%69 = trunc i64 %68 to i8
%70 = call i32 @putchar(i8 signext %69)
%71 = load i64, i64* %4
%72 = shl i64 %71, 4
%73 = load i64, i64* %2
%74 = add i64 %72, %73
store i64 %74, i64* %4
%75 = load i32, i32* %1
%76 = add nsw i32 %75, 1
store i32 %76, i32* %1
br label %5
77: ; preds = %15, %5
%78 = call i32 @putchar(i8 signext 13)
%79 = call i32 @putchar(i8 signext 10)
%80 = load i64, i64* %4
ret i64 %80
}

LLVM IR (-O2):
define i64 @getnum() {
br label %1
1: ; preds = %0, %30
%2 = phi i64 [ 0, %0 ], [ %32, %30 ]
%3 = phi i32 [ 0, %0 ], [ %31, %30 ]
%4 = tail call i64 (...) @getch()
switch i64 %4, label %5 [
i64 13, label %41
i64 10, label %41
]
5: ; preds = %1
%6 = add i64 %4, -48
%7 = icmp ult i64 %6, 10
br i1 %7, label %34, label %8
8: ; preds = %5
%9 = add i64 %4, -65
%10 = icmp ult i64 %9, 26
br i1 %10, label %11, label %13
11: ; preds = %8
%12 = add nsw i64 %4, -55
br label %34
13: ; preds = %8
%14 = add i64 %4, -97
%15 = icmp ult i64 %14, 26
br i1 %15, label %16, label %18
16: ; preds = %13
%17 = add nsw i64 %4, -87
br label %34
18: ; preds = %13
%19 = icmp eq i64 %4, 8
br i1 %19, label %20, label %34
20: ; preds = %18
%21 = icmp sgt i32 %3, 0
br i1 %21, label %22, label %27
22: ; preds = %20
%23 = add nsw i32 %3, -1
%24 = tail call i32 @putchar(i8 signext 8)
%25 = tail call i32 @putchar(i8 signext 32)
%26 = tail call i32 @putchar(i8 signext 8)
br label %27
27: ; preds = %22, %20
%28 = phi i32 [ %23, %22 ], [ %3, %20 ]
%29 = lshr i64 %2, 4
br label %30
30: ; preds = %27, %34
%31 = phi i32 [ %40, %34 ], [ %28, %27 ]
%32 = phi i64 [ %39, %34 ], [ %29, %27 ]
%33 = icmp slt i32 %31, 16
br i1 %33, label %1, label %41
34: ; preds = %5, %11, %18, %16
%35 = phi i64 [ %12, %11 ], [ %17, %16 ], [ %4, %18 ], [ %6, %5 ]
%36 = trunc i64 %4 to i8
%37 = tail call i32 @putchar(i8 signext %36)
%38 = shl i64 %2, 4
%39 = add i64 %35, %38
%40 = add nsw i32 %3, 1
br label %30
41: ; preds = %1, %1, %30
%42 = phi i64 [ %2, %1 ], [ %2, %1 ], [ %32, %30 ]
%43 = tail call i32 @putchar(i8 signext 13)
%44 = tail call i32 @putchar(i8 signext 10)
ret i64 %42
}