char decodeChar(unsigned int c) {
  char cvt;
  if (c >= 0x01 && c <= 0x1A)
    cvt = c + 0x40;
  else if (c >= 0x1B && c <= 0x24)
    cvt = c + 0x15;
  else
    switch (c) {
    case 0x00:
      cvt = ' ';
      break;
    case 0x25:
      cvt = '*';
      break;
    case 0x26:
      cvt = '+';
      break;
    case 0x27:
      cvt = '/';
      break;
    case 0x28:
      cvt = '@';
      break;
    case 0x29:
      cvt = '_';
      break;
    default:
      cvt = '?';
      break;
    }
  return cvt;
}


x86 assembly (clang, -O0):
<decodeChar>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x1,-0x4(%rbp)
jb     1129 <decodeChar+0x29>
cmpl   $0x1a,-0x4(%rbp)
ja     1129 <decodeChar+0x29>
mov    -0x4(%rbp),%eax
add    $0x40,%eax
mov    %al,-0x5(%rbp)
jmp    11b4 <decodeChar+0xb4>
cmpl   $0x1b,-0x4(%rbp)
jb     114b <decodeChar+0x4b>
cmpl   $0x24,-0x4(%rbp)
ja     114b <decodeChar+0x4b>
mov    -0x4(%rbp),%eax
add    $0x15,%eax
mov    %al,-0x5(%rbp)
jmp    11af <decodeChar+0xaf>
mov    -0x4(%rbp),%eax
mov    %rax,-0x10(%rbp)
sub    $0x29,%rax
ja     11a6 <decodeChar+0xa6>
mov    -0x10(%rbp),%rax
lea    0xe99(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x20,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x2a,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x2b,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x2f,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x40,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x5f,-0x5(%rbp)
jmp    11aa <decodeChar+0xaa>
movb   $0x3f,-0x5(%rbp)
jmp    11af <decodeChar+0xaf>
jmp    11b4 <decodeChar+0xb4>
movsbl -0x5(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decodeChar>:
lea    -0x1(%rdi),%eax
cmp    $0x19,%eax
ja     110f <decodeChar+0xf>
add    $0x40,%dil
mov    %edi,%eax
ret
lea    -0x1b(%rdi),%eax
cmp    $0x9,%eax
ja     111e <decodeChar+0x1e>
add    $0x15,%dil
mov    %edi,%eax
ret
cmp    $0x29,%edi
ja     113a <decodeChar+0x3a>
mov    $0x20,%al
mov    %edi,%ecx
lea    0xed2(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x2a,%al
ret
mov    $0x3f,%al
ret
mov    $0x2b,%al
ret
mov    $0x2f,%al
ret
mov    $0x40,%al
ret
mov    $0x5f,%al
ret

LLVM IR (-O0):
define signext i8 @decodeChar(i32 %0) {
%2 = alloca i32
%3 = alloca i8
store i32 %0, i32* %2
%4 = load i32, i32* %2
%5 = icmp uge i32 %4, 1
br i1 %5, label %6, label %13
6: ; preds = %1
%7 = load i32, i32* %2
%8 = icmp ule i32 %7, 26
br i1 %8, label %9, label %13
9: ; preds = %6
%10 = load i32, i32* %2
%11 = add i32 %10, 64
%12 = trunc i32 %11 to i8
store i8 %12, i8* %3
br label %34
13: ; preds = %6, %1
%14 = load i32, i32* %2
%15 = icmp uge i32 %14, 27
br i1 %15, label %16, label %23
16: ; preds = %13
%17 = load i32, i32* %2
%18 = icmp ule i32 %17, 36
br i1 %18, label %19, label %23
19: ; preds = %16
%20 = load i32, i32* %2
%21 = add i32 %20, 21
%22 = trunc i32 %21 to i8
store i8 %22, i8* %3
br label %33
23: ; preds = %16, %13
%24 = load i32, i32* %2
switch i32 %24, label %31 [
i32 0, label %25
i32 37, label %26
i32 38, label %27
i32 39, label %28
i32 40, label %29
i32 41, label %30
]
25: ; preds = %23
store i8 32, i8* %3
br label %32
26: ; preds = %23
store i8 42, i8* %3
br label %32
27: ; preds = %23
store i8 43, i8* %3
br label %32
28: ; preds = %23
store i8 47, i8* %3
br label %32
29: ; preds = %23
store i8 64, i8* %3
br label %32
30: ; preds = %23
store i8 95, i8* %3
br label %32
31: ; preds = %23
store i8 63, i8* %3
br label %32
32: ; preds = %31, %30, %29, %28, %27, %26, %25
br label %33
33: ; preds = %32, %19
br label %34
34: ; preds = %33, %9
%35 = load i8, i8* %3
ret i8 %35
}

LLVM IR (-O2):
define signext i8 @decodeChar(i32 %0) {
%2 = add i32 %0, -1
%3 = icmp ult i32 %2, 26
br i1 %3, label %4, label %7
4: ; preds = %1
%5 = trunc i32 %0 to i8
%6 = add nuw nsw i8 %5, 64
br label %20
7: ; preds = %1
%8 = add i32 %0, -27
%9 = icmp ult i32 %8, 10
br i1 %9, label %10, label %13
10: ; preds = %7
%11 = trunc i32 %0 to i8
%12 = add nuw nsw i8 %11, 21
br label %20
13: ; preds = %7
switch i32 %0, label %19 [
i32 0, label %20
i32 37, label %14
i32 38, label %15
i32 39, label %16
i32 40, label %17
i32 41, label %18
]
14: ; preds = %13
br label %20
15: ; preds = %13
br label %20
16: ; preds = %13
br label %20
17: ; preds = %13
br label %20
18: ; preds = %13
br label %20
19: ; preds = %13
br label %20
20: ; preds = %13, %10, %19, %18, %17, %16, %15, %14, %4
%21 = phi i8 [ %6, %4 ], [ %12, %10 ], [ 63, %19 ], [ 95, %18 ], [ 64, %17 ], [ 47, %16 ], [ 43, %15 ], [ 42, %14 ], [ 32, %13 ]
ret i8 %21
}