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


x86 assembly (clang, -O0):
<ascii2gsm>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0xc(%rbp)
sub    $0xa,%eax
je     1172 <ascii2gsm+0x72>
jmp    111b <ascii2gsm+0x1b>
mov    -0xc(%rbp),%eax
sub    $0x24,%eax
je     115a <ascii2gsm+0x5a>
jmp    112c <ascii2gsm+0x2c>
mov    -0xc(%rbp),%eax
sub    $0x40,%eax
je     114e <ascii2gsm+0x4e>
jmp    113d <ascii2gsm+0x3d>
mov    -0xc(%rbp),%eax
sub    $0x5f,%eax
je     1166 <ascii2gsm+0x66>
jmp    117e <ascii2gsm+0x7e>
movl   $0x0,-0x4(%rbp)
jmp    11cf <ascii2gsm+0xcf>
movl   $0x2,-0x4(%rbp)
jmp    11cf <ascii2gsm+0xcf>
movl   $0x11,-0x4(%rbp)
jmp    11cf <ascii2gsm+0xcf>
movl   $0xd,-0x4(%rbp)
jmp    11cf <ascii2gsm+0xcf>
cmpl   $0x20,-0x8(%rbp)
jl     11b8 <ascii2gsm+0xb8>
mov    $0x5b,%eax
cmp    -0x8(%rbp),%eax
jg     11a0 <ascii2gsm+0xa0>
cmpl   $0x60,-0x8(%rbp)
jle    11b8 <ascii2gsm+0xb8>
mov    $0x7b,%eax
cmp    -0x8(%rbp),%eax
jg     11c4 <ascii2gsm+0xc4>
cmpl   $0x7f,-0x8(%rbp)
jg     11c4 <ascii2gsm+0xc4>
movl   $0x2e,-0x4(%rbp)
jmp    11cf <ascii2gsm+0xcf>
jmp    11c9 <ascii2gsm+0xc9>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ascii2gsm>:
cmp    $0x3f,%edi
jg     1115 <ascii2gsm+0x15>
cmp    $0xa,%edi
je     1125 <ascii2gsm+0x25>
cmp    $0x24,%edi
jne    112e <ascii2gsm+0x2e>
mov    $0x2,%eax
ret
cmp    $0x40,%edi
je     112b <ascii2gsm+0x2b>
cmp    $0x5f,%edi
jne    112e <ascii2gsm+0x2e>
mov    $0x11,%eax
ret
mov    $0xd,%eax
ret
xor    %eax,%eax
ret
mov    $0x2e,%eax
cmp    $0x20,%edi
jl     1150 <ascii2gsm+0x50>
lea    -0x5b(%rdi),%ecx
cmp    $0x24,%ecx
ja     1151 <ascii2gsm+0x51>
movabs $0x1f0000003f,%rdx
bt     %rcx,%rdx
jae    1151 <ascii2gsm+0x51>
ret
mov    %edi,%eax
ret

LLVM IR (-O0):
define i32 @ascii2gsm(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
switch i32 %4, label %9 [
i32 64, label %5
i32 36, label %6
i32 95, label %7
i32 10, label %8
]
5: ; preds = %1
store i32 0, i32* %2
br label %28
6: ; preds = %1
store i32 2, i32* %2
br label %28
7: ; preds = %1
store i32 17, i32* %2
br label %28
8: ; preds = %1
store i32 13, 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 @ascii2gsm(i32 %0) {
switch i32 %0, label %5 [
i32 64, label %9
i32 36, label %2
i32 95, label %3
i32 10, 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 ], [ 13, %4 ], [ 17, %3 ], [ 2, %2 ], [ 0, %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
}