int gsm2ascii(int c) {
  switch (c) {
  case 0x00:
    return '@';
  case 0x02:
    return '$';
  case 0x11:
    return '_';
  case 0x0d:
    return '\n';
  default:
    if (c < 0x20 || (0x5b <= c && c <= 0x60) || (0x7b <= c && c <= 0x7f))
      return '.';
  }
  return c;
}


x86 assembly (clang, -O0):
<gsm2ascii>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
mov    %rax,-0x10(%rbp)
sub    $0x11,%rax
ja     115c <gsm2ascii+0x5c>
mov    -0x10(%rbp),%rax
lea    0xedd(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x40,-0x4(%rbp)
jmp    11ad <gsm2ascii+0xad>
movl   $0x24,-0x4(%rbp)
jmp    11ad <gsm2ascii+0xad>
movl   $0x5f,-0x4(%rbp)
jmp    11ad <gsm2ascii+0xad>
movl   $0xa,-0x4(%rbp)
jmp    11ad <gsm2ascii+0xad>
cmpl   $0x20,-0x8(%rbp)
jl     1196 <gsm2ascii+0x96>
mov    $0x5b,%eax
cmp    -0x8(%rbp),%eax
jg     117e <gsm2ascii+0x7e>
cmpl   $0x60,-0x8(%rbp)
jle    1196 <gsm2ascii+0x96>
mov    $0x7b,%eax
cmp    -0x8(%rbp),%eax
jg     11a2 <gsm2ascii+0xa2>
cmpl   $0x7f,-0x8(%rbp)
jg     11a2 <gsm2ascii+0xa2>
movl   $0x2e,-0x4(%rbp)
jmp    11ad <gsm2ascii+0xad>
jmp    11a7 <gsm2ascii+0xa7>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<gsm2ascii>:
cmp    $0x11,%edi
ja     1122 <gsm2ascii+0x22>
mov    $0x40,%eax
mov    %edi,%ecx
lea    0xeed(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x24,%eax
ret
mov    $0x2e,%eax
cmp    $0x20,%edi
jl     1144 <gsm2ascii+0x44>
lea    -0x5b(%rdi),%ecx
cmp    $0x24,%ecx
ja     1151 <gsm2ascii+0x51>
movabs $0x1f0000003f,%rdx
bt     %rcx,%rdx
jae    1151 <gsm2ascii+0x51>
ret
mov    $0xa,%eax
ret
mov    $0x5f,%eax
ret
mov    %edi,%eax
ret

LLVM IR (-O0):
define i32 @gsm2ascii(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
switch i32 %4, label %9 [
i32 0, label %5
i32 2, label %6
i32 17, label %7
i32 13, label %8
]
5: ; preds = %1
store i32 64, i32* %2
br label %28
6: ; preds = %1
store i32 36, i32* %2
br label %28
7: ; preds = %1
store i32 95, i32* %2
br label %28
8: ; preds = %1
store i32 10, i32* %2
br label %28
9: ; preds = %1
%10 = load i32, i32* %3
%11 = icmp slt i32 %10, 32
br i1 %11, label %24, label %12
12: ; preds = %9
%13 = load i32, i32* %3
%14 = icmp sle i32 91, %13
br i1 %14, label %15, label %18
15: ; preds = %12
%16 = load i32, i32* %3
%17 = icmp sle i32 %16, 96
br i1 %17, label %24, label %18
18: ; preds = %15, %12
%19 = load i32, i32* %3
%20 = icmp sle i32 123, %19
br i1 %20, label %21, label %25
21: ; preds = %18
%22 = load i32, i32* %3
%23 = icmp sle i32 %22, 127
br i1 %23, label %24, label %25
24: ; preds = %21, %15, %9
store i32 46, i32* %2
br label %28
25: ; preds = %21, %18
br label %26
26: ; preds = %25
%27 = load i32, i32* %3
store i32 %27, i32* %2
br label %28
28: ; preds = %26, %24, %8, %7, %6, %5
%29 = load i32, i32* %2
ret i32 %29
}

LLVM IR (-O2):
define i32 @gsm2ascii(i32 %0) {
switch i32 %0, label %5 [
i32 0, label %9
i32 2, label %2
i32 17, label %3
i32 13, label %4
]
2: ; preds = %1
br label %9
3: ; preds = %1
br label %9
4: ; preds = %1
br label %9
5: ; preds = %1
%6 = icmp slt i32 %0, 32
br i1 %6, label %9, label %7
7: ; preds = %5
switch i32 %0, label %8 [
i32 127, label %9
i32 126, label %9
i32 125, label %9
i32 124, label %9
i32 123, label %9
i32 96, label %9
i32 95, label %9
i32 94, label %9
i32 93, label %9
i32 92, label %9
i32 91, label %9
]
8: ; preds = %7
br label %9
9: ; preds = %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %7, %5, %1, %8, %4, %3, %2
%10 = phi i32 [ %0, %8 ], [ 10, %4 ], [ 95, %3 ], [ 36, %2 ], [ 64, %1 ], [ 46, %7 ], [ 46, %5 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ], [ 46, %7 ]
ret i32 %10
}