int get_scancode(int i) {
  if (i >= 'a' && i <= 'z')
    i = i - 'a' + 'A';
  switch (i) {
  case 0x1b:
    return 0x0100;
  case '!':
  case '1':
    return 0x0200;
  case '@':
  case '2':
    return 0x0300;
  case '#':
  case '3':
    return 0x0400;
  case '$':
  case '4':
    return 0x0500;
  case '%':
  case '5':
    return 0x0600;
  case '^':
  case '6':
    return 0x0700;
  case '&':
  case '7':
    return 0x0800;
  case '*':
  case '8':
    return 0x0900;
  case '(':
  case '9':
    return 0x0A00;
  case ')':
  case '0':
    return 0x0B00;
  case '_':
  case '-':
    return 0x0C00;
  case '+':
  case '=':
    return 0x0D00;
  case 0x7F:
  case 0x08:
    return 0x0E00;
  case 0x09:
    return 0x0F00;
  case 'Q':
    return 0x1000;
  case 'W':
    return 0x1100;
  case 'E':
    return 0x1200;
  case 'R':
    return 0x1300;
  case 'T':
    return 0x1400;
  case 'Y':
    return 0x1500;
  case 'U':
    return 0x1600;
  case 'I':
    return 0x1700;
  case 'O':
    return 0x1800;
  case 'P':
    return 0x1900;
  case '{':
  case '[':
    return 0x1A00;
  case '}':
  case ']':
    return 0x1B00;
  case 0x0D:
    return 0x1C00;
  case 'A':
    return 0x1E00;
  case 'S':
    return 0x1F00;
  case 'D':
    return 0x2000;
  case 'F':
    return 0x2100;
  case 'G':
    return 0x2200;
  case 'H':
    return 0x2300;
  case 'J':
    return 0x2400;
  case 'K':
    return 0x2500;
  case 'L':
    return 0x2600;
  case ':':
  case ';':
    return 0x2700;
  case '\'':
  case '"':
    return 0x2800;
  case '`':
  case '~':
    return 0x2900;
  case '\\':
  case '|':
    return 0x2B00;
  case 'Z':
    return 0x2C00;
  case 'X':
    return 0x2D00;
  case 'C':
    return 0x2E00;
  case 'V':
    return 0x2F00;
  case 'B':
    return 0x3000;
  case 'N':
    return 0x3100;
  case 'M':
    return 0x3200;
  case ',':
  case '<':
    return 0x3300;
  case '.':
  case '>':
    return 0x3400;
  case '/':
  case '?':
    return 0x3500;
  case ' ':
    return 0x3900;
  default:
    return i & 0xFF00;
  }
}


x86 assembly (clang, -O0):
<get_scancode>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x61,-0x8(%rbp)
jl     1127 <get_scancode+0x27>
cmpl   $0x7a,-0x8(%rbp)
jg     1127 <get_scancode+0x27>
mov    -0x8(%rbp),%eax
sub    $0x61,%eax
add    $0x41,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0xfffffff8,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x77,%eax
ja     13c0 <get_scancode+0x2c0>
mov    -0x10(%rbp),%rax
lea    0xeb9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x100,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x200,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x300,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x400,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x500,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x600,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x700,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x800,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x900,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xa00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xb00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xc00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xd00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xe00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0xf00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1000,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1100,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1200,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1300,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1400,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1500,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1600,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1700,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1800,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1900,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1a00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1b00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1c00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1e00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x1f00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2000,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2100,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2200,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2300,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2400,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2500,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2600,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2700,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2800,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2900,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2b00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2c00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2d00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2e00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x2f00,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3000,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3100,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3200,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3300,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3400,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3500,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
movl   $0x3900,-0x4(%rbp)
jmp    13cb <get_scancode+0x2cb>
mov    -0x8(%rbp),%eax
and    $0xff00,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_scancode>:
lea    -0x61(%rdi),%eax
lea    -0x20(%rdi),%ecx
cmp    $0x1a,%eax
cmovae %edi,%ecx
lea    -0x8(%rcx),%edx
cmp    $0x77,%edx
ja     11b7 <get_scancode+0xb7>
mov    $0x100,%eax
lea    0xedc(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    $0xe00,%eax
ret
mov    $0x200,%eax
ret
mov    $0x2800,%eax
ret
mov    $0x400,%eax
ret
mov    $0x500,%eax
ret
mov    $0x600,%eax
ret
mov    $0x800,%eax
ret
mov    $0xa00,%eax
ret
mov    $0xb00,%eax
ret
mov    $0x900,%eax
ret
mov    $0xd00,%eax
ret
mov    $0x3300,%eax
ret
mov    $0xc00,%eax
ret
mov    $0x3400,%eax
ret
mov    $0x3500,%eax
ret
mov    $0x300,%eax
ret
mov    $0x700,%eax
ret
mov    $0x2700,%eax
ret
mov    $0x1a00,%eax
ret
mov    $0x2b00,%eax
ret
mov    $0x1b00,%eax
ret
mov    $0x2900,%eax
ret
mov    $0xf00,%eax
ret
and    $0xff00,%ecx
mov    %ecx,%eax
ret
mov    $0x1c00,%eax
ret
mov    $0x3900,%eax
ret
mov    $0x1e00,%eax
ret
mov    $0x3000,%eax
ret
mov    $0x2e00,%eax
ret
mov    $0x2000,%eax
ret
mov    $0x1200,%eax
ret
mov    $0x2100,%eax
ret
mov    $0x2200,%eax
ret
mov    $0x2300,%eax
ret
mov    $0x1700,%eax
ret
mov    $0x2400,%eax
ret
mov    $0x2500,%eax
ret
mov    $0x2600,%eax
ret
mov    $0x3200,%eax
ret
mov    $0x3100,%eax
ret
mov    $0x1800,%eax
ret
mov    $0x1900,%eax
ret
mov    $0x1000,%eax
ret
mov    $0x1300,%eax
ret
mov    $0x1f00,%eax
ret
mov    $0x1400,%eax
ret
mov    $0x1600,%eax
ret
mov    $0x2f00,%eax
ret
mov    $0x1100,%eax
ret
mov    $0x2d00,%eax
ret
mov    $0x1500,%eax
ret
mov    $0x2c00,%eax
ret

LLVM IR (-O0):
define i32 @get_scancode(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp sge i32 %4, 97
br i1 %5, label %6, label %13
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp sle i32 %7, 122
br i1 %8, label %9, label %13
9: ; preds = %6
%10 = load i32, i32* %3
%11 = sub nsw i32 %10, 97
%12 = add nsw i32 %11, 65
store i32 %12, i32* %3
br label %13
13: ; preds = %9, %6, %1
%14 = load i32, i32* %3
switch i32 %14, label %67 [
i32 27, label %15
i32 33, label %16
i32 49, label %16
i32 64, label %17
i32 50, label %17
i32 35, label %18
i32 51, label %18
i32 36, label %19
i32 52, label %19
i32 37, label %20
i32 53, label %20
i32 94, label %21
i32 54, label %21
i32 38, label %22
i32 55, label %22
i32 42, label %23
i32 56, label %23
i32 40, label %24
i32 57, label %24
i32 41, label %25
i32 48, label %25
i32 95, label %26
i32 45, label %26
i32 43, label %27
i32 61, label %27
i32 127, label %28
i32 8, label %28
i32 9, label %29
i32 81, label %30
i32 87, label %31
i32 69, label %32
i32 82, label %33
i32 84, label %34
i32 89, label %35
i32 85, label %36
i32 73, label %37
i32 79, label %38
i32 80, label %39
i32 123, label %40
i32 91, label %40
i32 125, label %41
i32 93, label %41
i32 13, label %42
i32 65, label %43
i32 83, label %44
i32 68, label %45
i32 70, label %46
i32 71, label %47
i32 72, label %48
i32 74, label %49
i32 75, label %50
i32 76, label %51
i32 58, label %52
i32 59, label %52
i32 39, label %53
i32 34, label %53
i32 96, label %54
i32 126, label %54
i32 92, label %55
i32 124, label %55
i32 90, label %56
i32 88, label %57
i32 67, label %58
i32 86, label %59
i32 66, label %60
i32 78, label %61
i32 77, label %62
i32 44, label %63
i32 60, label %63
i32 46, label %64
i32 62, label %64
i32 47, label %65
i32 63, label %65
i32 32, label %66
]
15: ; preds = %13
store i32 256, i32* %2
br label %70
16: ; preds = %13, %13
store i32 512, i32* %2
br label %70
17: ; preds = %13, %13
store i32 768, i32* %2
br label %70
18: ; preds = %13, %13
store i32 1024, i32* %2
br label %70
19: ; preds = %13, %13
store i32 1280, i32* %2
br label %70
20: ; preds = %13, %13
store i32 1536, i32* %2
br label %70
21: ; preds = %13, %13
store i32 1792, i32* %2
br label %70
22: ; preds = %13, %13
store i32 2048, i32* %2
br label %70
23: ; preds = %13, %13
store i32 2304, i32* %2
br label %70
24: ; preds = %13, %13
store i32 2560, i32* %2
br label %70
25: ; preds = %13, %13
store i32 2816, i32* %2
br label %70
26: ; preds = %13, %13
store i32 3072, i32* %2
br label %70
27: ; preds = %13, %13
store i32 3328, i32* %2
br label %70
28: ; preds = %13, %13
store i32 3584, i32* %2
br label %70
29: ; preds = %13
store i32 3840, i32* %2
br label %70
30: ; preds = %13
store i32 4096, i32* %2
br label %70
31: ; preds = %13
store i32 4352, i32* %2
br label %70
32: ; preds = %13
store i32 4608, i32* %2
br label %70
33: ; preds = %13
store i32 4864, i32* %2
br label %70
34: ; preds = %13
store i32 5120, i32* %2
br label %70
35: ; preds = %13
store i32 5376, i32* %2
br label %70
36: ; preds = %13
store i32 5632, i32* %2
br label %70
37: ; preds = %13
store i32 5888, i32* %2
br label %70
38: ; preds = %13
store i32 6144, i32* %2
br label %70
39: ; preds = %13
store i32 6400, i32* %2
br label %70
40: ; preds = %13, %13
store i32 6656, i32* %2
br label %70
41: ; preds = %13, %13
store i32 6912, i32* %2
br label %70
42: ; preds = %13
store i32 7168, i32* %2
br label %70
43: ; preds = %13
store i32 7680, i32* %2
br label %70
44: ; preds = %13
store i32 7936, i32* %2
br label %70
45: ; preds = %13
store i32 8192, i32* %2
br label %70
46: ; preds = %13
store i32 8448, i32* %2
br label %70
47: ; preds = %13
store i32 8704, i32* %2
br label %70
48: ; preds = %13
store i32 8960, i32* %2
br label %70
49: ; preds = %13
store i32 9216, i32* %2
br label %70
50: ; preds = %13
store i32 9472, i32* %2
br label %70
51: ; preds = %13
store i32 9728, i32* %2
br label %70
52: ; preds = %13, %13
store i32 9984, i32* %2
br label %70
53: ; preds = %13, %13
store i32 10240, i32* %2
br label %70
54: ; preds = %13, %13
store i32 10496, i32* %2
br label %70
55: ; preds = %13, %13
store i32 11008, i32* %2
br label %70
56: ; preds = %13
store i32 11264, i32* %2
br label %70
57: ; preds = %13
store i32 11520, i32* %2
br label %70
58: ; preds = %13
store i32 11776, i32* %2
br label %70
59: ; preds = %13
store i32 12032, i32* %2
br label %70
60: ; preds = %13
store i32 12288, i32* %2
br label %70
61: ; preds = %13
store i32 12544, i32* %2
br label %70
62: ; preds = %13
store i32 12800, i32* %2
br label %70
63: ; preds = %13, %13
store i32 13056, i32* %2
br label %70
64: ; preds = %13, %13
store i32 13312, i32* %2
br label %70
65: ; preds = %13, %13
store i32 13568, i32* %2
br label %70
66: ; preds = %13
store i32 14592, i32* %2
br label %70
67: ; preds = %13
%68 = load i32, i32* %3
%69 = and i32 %68, 65280
store i32 %69, i32* %2
br label %70
70: ; preds = %67, %66, %65, %64, %63, %62, %61, %60, %59, %58, %57, %56, %55, %54, %53, %52, %51, %50, %49, %48, %47, %46, %45, %44, %43, %42, %41, %40, %39, %38, %37, %36, %35, %34, %33, %32, %31, %30, %29, %28, %27, %26, %25, %24, %23, %22, %21, %20, %19, %18, %17, %16, %15
%71 = load i32, i32* %2
ret i32 %71
}

LLVM IR (-O2):
define i32 @get_scancode(i32 %0) {
%2 = add i32 %0, -97
%3 = icmp ult i32 %2, 26
%4 = add nsw i32 %0, -32
%5 = select i1 %3, i32 %4, i32 %0
switch i32 %5, label %57 [
i32 27, label %59
i32 33, label %6
i32 49, label %6
i32 64, label %7
i32 50, label %7
i32 35, label %8
i32 51, label %8
i32 36, label %9
i32 52, label %9
i32 37, label %10
i32 53, label %10
i32 94, label %11
i32 54, label %11
i32 38, label %12
i32 55, label %12
i32 42, label %13
i32 56, label %13
i32 40, label %14
i32 57, label %14
i32 41, label %15
i32 48, label %15
i32 95, label %16
i32 45, label %16
i32 43, label %17
i32 61, label %17
i32 127, label %18
i32 8, label %18
i32 9, label %19
i32 81, label %20
i32 87, label %21
i32 69, label %22
i32 82, label %23
i32 84, label %24
i32 89, label %25
i32 85, label %26
i32 73, label %27
i32 79, label %28
i32 80, label %29
i32 123, label %30
i32 91, label %30
i32 125, label %31
i32 93, label %31
i32 13, label %32
i32 65, label %33
i32 83, label %34
i32 68, label %35
i32 70, label %36
i32 71, label %37
i32 72, label %38
i32 74, label %39
i32 75, label %40
i32 76, label %41
i32 58, label %42
i32 59, label %42
i32 39, label %43
i32 34, label %43
i32 96, label %44
i32 126, label %44
i32 92, label %45
i32 124, label %45
i32 90, label %46
i32 88, label %47
i32 67, label %48
i32 86, label %49
i32 66, label %50
i32 78, label %51
i32 77, label %52
i32 44, label %53
i32 60, label %53
i32 46, label %54
i32 62, label %54
i32 47, label %55
i32 63, label %55
i32 32, label %56
]
6: ; preds = %1, %1
br label %59
7: ; preds = %1, %1
br label %59
8: ; preds = %1, %1
br label %59
9: ; preds = %1, %1
br label %59
10: ; preds = %1, %1
br label %59
11: ; preds = %1, %1
br label %59
12: ; preds = %1, %1
br label %59
13: ; preds = %1, %1
br label %59
14: ; preds = %1, %1
br label %59
15: ; preds = %1, %1
br label %59
16: ; preds = %1, %1
br label %59
17: ; preds = %1, %1
br label %59
18: ; preds = %1, %1
br label %59
19: ; preds = %1
br label %59
20: ; preds = %1
br label %59
21: ; preds = %1
br label %59
22: ; preds = %1
br label %59
23: ; preds = %1
br label %59
24: ; preds = %1
br label %59
25: ; preds = %1
br label %59
26: ; preds = %1
br label %59
27: ; preds = %1
br label %59
28: ; preds = %1
br label %59
29: ; preds = %1
br label %59
30: ; preds = %1, %1
br label %59
31: ; preds = %1, %1
br label %59
32: ; preds = %1
br label %59
33: ; preds = %1
br label %59
34: ; preds = %1
br label %59
35: ; preds = %1
br label %59
36: ; preds = %1
br label %59
37: ; preds = %1
br label %59
38: ; preds = %1
br label %59
39: ; preds = %1
br label %59
40: ; preds = %1
br label %59
41: ; preds = %1
br label %59
42: ; preds = %1, %1
br label %59
43: ; preds = %1, %1
br label %59
44: ; preds = %1, %1
br label %59
45: ; preds = %1, %1
br label %59
46: ; preds = %1
br label %59
47: ; preds = %1
br label %59
48: ; preds = %1
br label %59
49: ; preds = %1
br label %59
50: ; preds = %1
br label %59
51: ; preds = %1
br label %59
52: ; preds = %1
br label %59
53: ; preds = %1, %1
br label %59
54: ; preds = %1, %1
br label %59
55: ; preds = %1, %1
br label %59
56: ; preds = %1
br label %59
57: ; preds = %1
%58 = and i32 %5, 65280
br label %59
59: ; preds = %1, %57, %56, %55, %54, %53, %52, %51, %50, %49, %48, %47, %46, %45, %44, %43, %42, %41, %40, %39, %38, %37, %36, %35, %34, %33, %32, %31, %30, %29, %28, %27, %26, %25, %24, %23, %22, %21, %20, %19, %18, %17, %16, %15, %14, %13, %12, %11, %10, %9, %8, %7, %6
%60 = phi i32 [ %58, %57 ], [ 14592, %56 ], [ 13568, %55 ], [ 13312, %54 ], [ 13056, %53 ], [ 12800, %52 ], [ 12544, %51 ], [ 12288, %50 ], [ 12032, %49 ], [ 11776, %48 ], [ 11520, %47 ], [ 11264, %46 ], [ 11008, %45 ], [ 10496, %44 ], [ 10240, %43 ], [ 9984, %42 ], [ 9728, %41 ], [ 9472, %40 ], [ 9216, %39 ], [ 8960, %38 ], [ 8704, %37 ], [ 8448, %36 ], [ 8192, %35 ], [ 7936, %34 ], [ 7680, %33 ], [ 7168, %32 ], [ 6912, %31 ], [ 6656, %30 ], [ 6400, %29 ], [ 6144, %28 ], [ 5888, %27 ], [ 5632, %26 ], [ 5376, %25 ], [ 5120, %24 ], [ 4864, %23 ], [ 4608, %22 ], [ 4352, %21 ], [ 4096, %20 ], [ 3840, %19 ], [ 3584, %18 ], [ 3328, %17 ], [ 3072, %16 ], [ 2816, %15 ], [ 2560, %14 ], [ 2304, %13 ], [ 2048, %12 ], [ 1792, %11 ], [ 1536, %10 ], [ 1280, %9 ], [ 1024, %8 ], [ 768, %7 ], [ 512, %6 ], [ 256, %1 ]
ret i32 %60
}