int check_letter(char c, int index) {
  switch (index) {
  case 0:
    return c == 'p' || c == 'P';
  case 1:
    return c == 'r' || c == 'R';
  case 2:
    return c == 'o' || c == 'O';
  case 3:
    return c == 'b' || c == 'B';
  case 4:
    return c == 'l' || c == 'L';
  case 5:
    return c == 'e' || c == 'E';
  case 6:
    return c == 'm' || c == 'M';
  default:
    return 0;
  }
}


x86 assembly (clang, -O0):
<check_letter>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %rax,-0x18(%rbp)
sub    $0x6,%rax
ja     127b <check_letter+0x17b>
mov    -0x18(%rbp),%rax
lea    0xed7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x70,%ecx
mov    %al,-0x19(%rbp)
je     1151 <check_letter+0x51>
movsbl -0x5(%rbp),%eax
cmp    $0x50,%eax
sete   %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x72,%ecx
mov    %al,-0x1a(%rbp)
je     1180 <check_letter+0x80>
movsbl -0x5(%rbp),%eax
cmp    $0x52,%eax
sete   %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x6f,%ecx
mov    %al,-0x1b(%rbp)
je     11af <check_letter+0xaf>
movsbl -0x5(%rbp),%eax
cmp    $0x4f,%eax
sete   %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x62,%ecx
mov    %al,-0x1c(%rbp)
je     11de <check_letter+0xde>
movsbl -0x5(%rbp),%eax
cmp    $0x42,%eax
sete   %al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x6c,%ecx
mov    %al,-0x1d(%rbp)
je     120d <check_letter+0x10d>
movsbl -0x5(%rbp),%eax
cmp    $0x4c,%eax
sete   %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x65,%ecx
mov    %al,-0x1e(%rbp)
je     123c <check_letter+0x13c>
movsbl -0x5(%rbp),%eax
cmp    $0x45,%eax
sete   %al
mov    %al,-0x1e(%rbp)
mov    -0x1e(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movsbl -0x5(%rbp),%ecx
mov    $0x1,%al
cmp    $0x6d,%ecx
mov    %al,-0x1f(%rbp)
je     126b <check_letter+0x16b>
movsbl -0x5(%rbp),%eax
cmp    $0x4d,%eax
sete   %al
mov    %al,-0x1f(%rbp)
mov    -0x1f(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1282 <check_letter+0x182>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_letter>:
cmp    $0x6,%esi
ja     1121 <check_letter+0x21>
mov    %esi,%eax
lea    0xef2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
and    $0xdf,%dil
cmp    $0x50,%dil
jmp    1161 <check_letter+0x61>
xor    %eax,%eax
movzbl %al,%eax
ret
and    $0xdf,%dil
cmp    $0x52,%dil
jmp    1161 <check_letter+0x61>
and    $0xdf,%dil
cmp    $0x4f,%dil
jmp    1161 <check_letter+0x61>
and    $0xdf,%dil
cmp    $0x42,%dil
jmp    1161 <check_letter+0x61>
and    $0xdf,%dil
cmp    $0x4c,%dil
jmp    1161 <check_letter+0x61>
and    $0xdf,%dil
cmp    $0x45,%dil
jmp    1161 <check_letter+0x61>
and    $0xdf,%dil
cmp    $0x4d,%dil
sete   %al
movzbl %al,%eax
ret

LLVM IR (-O0):
define i32 @check_letter(i8 signext %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8
%5 = alloca i32
store i8 %0, i8* %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
switch i32 %6, label %84 [
i32 0, label %7
i32 1, label %18
i32 2, label %29
i32 3, label %40
i32 4, label %51
i32 5, label %62
i32 6, label %73
]
7: ; preds = %2
%8 = load i8, i8* %4
%9 = sext i8 %8 to i32
%10 = icmp eq i32 %9, 112
br i1 %10, label %15, label %11
11: ; preds = %7
%12 = load i8, i8* %4
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 80
br label %15
15: ; preds = %11, %7
%16 = phi i1 [ true, %7 ], [ %14, %11 ]
%17 = zext i1 %16 to i32
store i32 %17, i32* %3
br label %85
18: ; preds = %2
%19 = load i8, i8* %4
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 114
br i1 %21, label %26, label %22
22: ; preds = %18
%23 = load i8, i8* %4
%24 = sext i8 %23 to i32
%25 = icmp eq i32 %24, 82
br label %26
26: ; preds = %22, %18
%27 = phi i1 [ true, %18 ], [ %25, %22 ]
%28 = zext i1 %27 to i32
store i32 %28, i32* %3
br label %85
29: ; preds = %2
%30 = load i8, i8* %4
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 111
br i1 %32, label %37, label %33
33: ; preds = %29
%34 = load i8, i8* %4
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 79
br label %37
37: ; preds = %33, %29
%38 = phi i1 [ true, %29 ], [ %36, %33 ]
%39 = zext i1 %38 to i32
store i32 %39, i32* %3
br label %85
40: ; preds = %2
%41 = load i8, i8* %4
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 98
br i1 %43, label %48, label %44
44: ; preds = %40
%45 = load i8, i8* %4
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 66
br label %48
48: ; preds = %44, %40
%49 = phi i1 [ true, %40 ], [ %47, %44 ]
%50 = zext i1 %49 to i32
store i32 %50, i32* %3
br label %85
51: ; preds = %2
%52 = load i8, i8* %4
%53 = sext i8 %52 to i32
%54 = icmp eq i32 %53, 108
br i1 %54, label %59, label %55
55: ; preds = %51
%56 = load i8, i8* %4
%57 = sext i8 %56 to i32
%58 = icmp eq i32 %57, 76
br label %59
59: ; preds = %55, %51
%60 = phi i1 [ true, %51 ], [ %58, %55 ]
%61 = zext i1 %60 to i32
store i32 %61, i32* %3
br label %85
62: ; preds = %2
%63 = load i8, i8* %4
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 101
br i1 %65, label %70, label %66
66: ; preds = %62
%67 = load i8, i8* %4
%68 = sext i8 %67 to i32
%69 = icmp eq i32 %68, 69
br label %70
70: ; preds = %66, %62
%71 = phi i1 [ true, %62 ], [ %69, %66 ]
%72 = zext i1 %71 to i32
store i32 %72, i32* %3
br label %85
73: ; preds = %2
%74 = load i8, i8* %4
%75 = sext i8 %74 to i32
%76 = icmp eq i32 %75, 109
br i1 %76, label %81, label %77
77: ; preds = %73
%78 = load i8, i8* %4
%79 = sext i8 %78 to i32
%80 = icmp eq i32 %79, 77
br label %81
81: ; preds = %77, %73
%82 = phi i1 [ true, %73 ], [ %80, %77 ]
%83 = zext i1 %82 to i32
store i32 %83, i32* %3
br label %85
84: ; preds = %2
store i32 0, i32* %3
br label %85
85: ; preds = %84, %81, %70, %59, %48, %37, %26, %15
%86 = load i32, i32* %3
ret i32 %86
}

LLVM IR (-O2):
define i32 @check_letter(i8 signext %0, i32 %1) {
switch i32 %1, label %24 [
i32 0, label %3
i32 1, label %6
i32 2, label %9
i32 3, label %12
i32 4, label %15
i32 5, label %18
i32 6, label %21
]
3: ; preds = %2
%4 = and i8 %0, -33
%5 = icmp eq i8 %4, 80
br label %24
6: ; preds = %2
%7 = and i8 %0, -33
%8 = icmp eq i8 %7, 82
br label %24
9: ; preds = %2
%10 = and i8 %0, -33
%11 = icmp eq i8 %10, 79
br label %24
12: ; preds = %2
%13 = and i8 %0, -33
%14 = icmp eq i8 %13, 66
br label %24
15: ; preds = %2
%16 = and i8 %0, -33
%17 = icmp eq i8 %16, 76
br label %24
18: ; preds = %2
%19 = and i8 %0, -33
%20 = icmp eq i8 %19, 69
br label %24
21: ; preds = %2
%22 = and i8 %0, -33
%23 = icmp eq i8 %22, 77
br label %24
24: ; preds = %2, %21, %18, %15, %12, %9, %6, %3
%25 = phi i1 [ %23, %21 ], [ %20, %18 ], [ %17, %15 ], [ %14, %12 ], [ %11, %9 ], [ %8, %6 ], [ %5, %3 ], [ false, %2 ]
%26 = zext i1 %25 to i32
ret i32 %26
}