char doschar(char c) {
  if (c == 0) {
    return 0;
  } else if ((c == '/') || (c == '\\')) {
    return '/';
  } else if (c == '.') {
    return '.';
  } else if ((c >= 'A') && (c <= 'Z')) {
    return c;
  } else if ((c >= '0') && (c <= '9')) {
    return c;
  } else if ((c >= 'a') && (c <= 'z')) {
    return (c - 'a') + 'A';
  } else if (c == 0xE5) {
    return 0x05;
  } else if (c > 127) {
    return c;
  } else if ((c == '!') || (c == '#') || (c == '$') || (c == '%') ||
             (c == '&') || (c == '\'') || (c == '(') || (c == ')') ||
             (c == '-') || (c == '@') || (c == '^') || (c == '_') ||
             (c == '`') || (c == '{') || (c == '}') || (c == '~') ||
             (c == ' ')) {
    return c;
  } else {
    return 1;
  }
}


x86 assembly (clang, -O0):
<doschar>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x2(%rbp)
movsbl -0x2(%rbp),%eax
cmp    $0x0,%eax
jne    1120 <doschar+0x20>
movb   $0x0,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x2f,%eax
je     113a <doschar+0x3a>
movsbl -0x2(%rbp),%eax
cmp    $0x5c,%eax
jne    1143 <doschar+0x43>
movb   $0x2f,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x2e,%eax
jne    1159 <doschar+0x59>
movb   $0x2e,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x41,%eax
jl     117e <doschar+0x7e>
movsbl -0x2(%rbp),%eax
cmp    $0x5a,%eax
jg     117e <doschar+0x7e>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x30,%eax
jl     11a3 <doschar+0xa3>
movsbl -0x2(%rbp),%eax
cmp    $0x39,%eax
jg     11a3 <doschar+0xa3>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jl     11cf <doschar+0xcf>
movsbl -0x2(%rbp),%eax
cmp    $0x7a,%eax
jg     11cf <doschar+0xcf>
movsbl -0x2(%rbp),%eax
sub    $0x61,%eax
add    $0x41,%eax
mov    %al,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0xe5,%eax
jne    11e7 <doschar+0xe7>
movb   $0x5,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x7f,%eax
jle    11ff <doschar+0xff>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movsbl -0x2(%rbp),%eax
cmp    $0x21,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x23,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x24,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x25,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x26,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x27,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x28,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x29,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x2d,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x40,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x5e,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x5f,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x60,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x7b,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x7d,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x7e,%eax
je     12dc <doschar+0x1dc>
movsbl -0x2(%rbp),%eax
cmp    $0x20,%eax
jne    12e7 <doschar+0x1e7>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    12eb <doschar+0x1eb>
movb   $0x1,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<doschar>:
mov    %edi,%eax
cmp    $0x2e,%al
jg     1111 <doschar+0x11>
test   %al,%al
je     111b <doschar+0x1b>
cmp    $0x2e,%al
jne    111c <doschar+0x1c>
mov    $0x2e,%al
ret
cmp    $0x2f,%al
je     1119 <doschar+0x19>
cmp    $0x5c,%al
jne    111c <doschar+0x1c>
mov    $0x2f,%al
ret
lea    -0x41(%rax),%ecx
cmp    $0x1a,%cl
jb     111b <doschar+0x1b>
lea    -0x30(%rax),%ecx
cmp    $0xa,%cl
jb     111b <doschar+0x1b>
lea    -0x61(%rax),%ecx
cmp    $0x19,%cl
ja     1137 <doschar+0x37>
add    $0xe0,%al
ret
lea    -0x20(%rax),%ecx
cmp    $0x5e,%cl
ja     1152 <doschar+0x52>
movzbl %cl,%ecx
lea    0xeb7(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x1,%al
ret

LLVM IR (-O0):
define signext i8 @doschar(i8 signext %0) {
%2 = alloca i8
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = sext i8 %4 to i32
%6 = icmp eq i32 %5, 0
br i1 %6, label %7, label %8
7: ; preds = %1
store i8 0, i8* %2
br label %138
8: ; preds = %1
%9 = load i8, i8* %3
%10 = sext i8 %9 to i32
%11 = icmp eq i32 %10, 47
br i1 %11, label %16, label %12
12: ; preds = %8
%13 = load i8, i8* %3
%14 = sext i8 %13 to i32
%15 = icmp eq i32 %14, 92
br i1 %15, label %16, label %17
16: ; preds = %12, %8
store i8 47, i8* %2
br label %138
17: ; preds = %12
%18 = load i8, i8* %3
%19 = sext i8 %18 to i32
%20 = icmp eq i32 %19, 46
br i1 %20, label %21, label %22
21: ; preds = %17
store i8 46, i8* %2
br label %138
22: ; preds = %17
%23 = load i8, i8* %3
%24 = sext i8 %23 to i32
%25 = icmp sge i32 %24, 65
br i1 %25, label %26, label %32
26: ; preds = %22
%27 = load i8, i8* %3
%28 = sext i8 %27 to i32
%29 = icmp sle i32 %28, 90
br i1 %29, label %30, label %32
30: ; preds = %26
%31 = load i8, i8* %3
store i8 %31, i8* %2
br label %138
32: ; preds = %26, %22
%33 = load i8, i8* %3
%34 = sext i8 %33 to i32
%35 = icmp sge i32 %34, 48
br i1 %35, label %36, label %42
36: ; preds = %32
%37 = load i8, i8* %3
%38 = sext i8 %37 to i32
%39 = icmp sle i32 %38, 57
br i1 %39, label %40, label %42
40: ; preds = %36
%41 = load i8, i8* %3
store i8 %41, i8* %2
br label %138
42: ; preds = %36, %32
%43 = load i8, i8* %3
%44 = sext i8 %43 to i32
%45 = icmp sge i32 %44, 97
br i1 %45, label %46, label %56
46: ; preds = %42
%47 = load i8, i8* %3
%48 = sext i8 %47 to i32
%49 = icmp sle i32 %48, 122
br i1 %49, label %50, label %56
50: ; preds = %46
%51 = load i8, i8* %3
%52 = sext i8 %51 to i32
%53 = sub nsw i32 %52, 97
%54 = add nsw i32 %53, 65
%55 = trunc i32 %54 to i8
store i8 %55, i8* %2
br label %138
56: ; preds = %46, %42
%57 = load i8, i8* %3
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 229
br i1 %59, label %60, label %61
60: ; preds = %56
store i8 5, i8* %2
br label %138
61: ; preds = %56
%62 = load i8, i8* %3
%63 = sext i8 %62 to i32
%64 = icmp sgt i32 %63, 127
br i1 %64, label %65, label %67
65: ; preds = %61
%66 = load i8, i8* %3
store i8 %66, i8* %2
br label %138
67: ; preds = %61
%68 = load i8, i8* %3
%69 = sext i8 %68 to i32
%70 = icmp eq i32 %69, 33
br i1 %70, label %135, label %71
71: ; preds = %67
%72 = load i8, i8* %3
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 35
br i1 %74, label %135, label %75
75: ; preds = %71
%76 = load i8, i8* %3
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 36
br i1 %78, label %135, label %79
79: ; preds = %75
%80 = load i8, i8* %3
%81 = sext i8 %80 to i32
%82 = icmp eq i32 %81, 37
br i1 %82, label %135, label %83
83: ; preds = %79
%84 = load i8, i8* %3
%85 = sext i8 %84 to i32
%86 = icmp eq i32 %85, 38
br i1 %86, label %135, label %87
87: ; preds = %83
%88 = load i8, i8* %3
%89 = sext i8 %88 to i32
%90 = icmp eq i32 %89, 39
br i1 %90, label %135, label %91
91: ; preds = %87
%92 = load i8, i8* %3
%93 = sext i8 %92 to i32
%94 = icmp eq i32 %93, 40
br i1 %94, label %135, label %95
95: ; preds = %91
%96 = load i8, i8* %3
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 41
br i1 %98, label %135, label %99
99: ; preds = %95
%100 = load i8, i8* %3
%101 = sext i8 %100 to i32
%102 = icmp eq i32 %101, 45
br i1 %102, label %135, label %103
103: ; preds = %99
%104 = load i8, i8* %3
%105 = sext i8 %104 to i32
%106 = icmp eq i32 %105, 64
br i1 %106, label %135, label %107
107: ; preds = %103
%108 = load i8, i8* %3
%109 = sext i8 %108 to i32
%110 = icmp eq i32 %109, 94
br i1 %110, label %135, label %111
111: ; preds = %107
%112 = load i8, i8* %3
%113 = sext i8 %112 to i32
%114 = icmp eq i32 %113, 95
br i1 %114, label %135, label %115
115: ; preds = %111
%116 = load i8, i8* %3
%117 = sext i8 %116 to i32
%118 = icmp eq i32 %117, 96
br i1 %118, label %135, label %119
119: ; preds = %115
%120 = load i8, i8* %3
%121 = sext i8 %120 to i32
%122 = icmp eq i32 %121, 123
br i1 %122, label %135, label %123
123: ; preds = %119
%124 = load i8, i8* %3
%125 = sext i8 %124 to i32
%126 = icmp eq i32 %125, 125
br i1 %126, label %135, label %127
127: ; preds = %123
%128 = load i8, i8* %3
%129 = sext i8 %128 to i32
%130 = icmp eq i32 %129, 126
br i1 %130, label %135, label %131
131: ; preds = %127
%132 = load i8, i8* %3
%133 = sext i8 %132 to i32
%134 = icmp eq i32 %133, 32
br i1 %134, label %135, label %137
135: ; preds = %131, %127, %123, %119, %115, %111, %107, %103, %99, %95, %91, %87, %83, %79, %75, %71, %67
%136 = load i8, i8* %3
store i8 %136, i8* %2
br label %138
137: ; preds = %131
store i8 1, i8* %2
br label %138
138: ; preds = %137, %135, %65, %60, %50, %40, %30, %21, %16, %7
%139 = load i8, i8* %2
ret i8 %139
}

LLVM IR (-O2):
define signext i8 @doschar(i8 signext %0) {
switch i8 %0, label %3 [
i8 0, label %17
i8 92, label %16
i8 47, label %16
i8 46, label %2
]
2: ; preds = %1
br label %17
3: ; preds = %1
%4 = add i8 %0, -65
%5 = icmp ult i8 %4, 26
%6 = add i8 %0, -48
%7 = icmp ult i8 %6, 10
%8 = or i1 %5, %7
br i1 %8, label %17, label %9
9: ; preds = %3
%10 = add i8 %0, -97
%11 = icmp ult i8 %10, 26
br i1 %11, label %12, label %14
12: ; preds = %9
%13 = add nsw i8 %0, -32
br label %17
14: ; preds = %9
switch i8 %0, label %15 [
i8 126, label %17
i8 125, label %17
i8 123, label %17
i8 96, label %17
i8 95, label %17
i8 94, label %17
i8 64, label %17
i8 45, label %17
i8 41, label %17
i8 40, label %17
i8 39, label %17
i8 38, label %17
i8 37, label %17
i8 36, label %17
i8 35, label %17
i8 33, label %17
i8 32, label %17
]
15: ; preds = %14
br label %17
16: ; preds = %1, %1
br label %17
17: ; preds = %1, %16, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %14, %3, %15, %12, %2
%18 = phi i8 [ 46, %2 ], [ %13, %12 ], [ 1, %15 ], [ %0, %1 ], [ %0, %3 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ %0, %14 ], [ 47, %16 ]
ret i8 %18
}