char ook2bfchar(char a, char b) {
  if (a == '.' && b == '?')
    return '>';
  if (a == '?' && b == '.')
    return '<';
  if (a == '.' && b == '.')
    return '+';
  if (a == '!' && b == '!')
    return '-';
  if (a == '!' && b == '.')
    return '.';
  if (a == '.' && b == '!')
    return ',';
  if (a == '!' && b == '?')
    return '[';
  if (a == '?' && b == '!')
    return ']';
  return '.';
}


x86 assembly (clang, -O0):
<ook2bfchar>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x2(%rbp),%eax
cmp    $0x2e,%eax
jne    1133 <ook2bfchar+0x33>
movsbl -0x3(%rbp),%eax
cmp    $0x3f,%eax
jne    1133 <ook2bfchar+0x33>
movb   $0x3e,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x3f,%eax
jne    1156 <ook2bfchar+0x56>
movsbl -0x3(%rbp),%eax
cmp    $0x2e,%eax
jne    1156 <ook2bfchar+0x56>
movb   $0x3c,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x2e,%eax
jne    1179 <ook2bfchar+0x79>
movsbl -0x3(%rbp),%eax
cmp    $0x2e,%eax
jne    1179 <ook2bfchar+0x79>
movb   $0x2b,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x21,%eax
jne    119c <ook2bfchar+0x9c>
movsbl -0x3(%rbp),%eax
cmp    $0x21,%eax
jne    119c <ook2bfchar+0x9c>
movb   $0x2d,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x21,%eax
jne    11bf <ook2bfchar+0xbf>
movsbl -0x3(%rbp),%eax
cmp    $0x2e,%eax
jne    11bf <ook2bfchar+0xbf>
movb   $0x2e,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x2e,%eax
jne    11e2 <ook2bfchar+0xe2>
movsbl -0x3(%rbp),%eax
cmp    $0x21,%eax
jne    11e2 <ook2bfchar+0xe2>
movb   $0x2c,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x21,%eax
jne    1205 <ook2bfchar+0x105>
movsbl -0x3(%rbp),%eax
cmp    $0x3f,%eax
jne    1205 <ook2bfchar+0x105>
movb   $0x5b,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movsbl -0x2(%rbp),%eax
cmp    $0x3f,%eax
jne    1228 <ook2bfchar+0x128>
movsbl -0x3(%rbp),%eax
cmp    $0x21,%eax
jne    1228 <ook2bfchar+0x128>
movb   $0x5d,-0x1(%rbp)
jmp    122c <ook2bfchar+0x12c>
movb   $0x2e,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ook2bfchar>:
cmp    $0x2e,%dil
jne    110f <ook2bfchar+0xf>
mov    $0x3e,%al
cmp    $0x3f,%sil
jne    110f <ook2bfchar+0xf>
ret
cmp    $0x3f,%dil
jne    111d <ook2bfchar+0x1d>
mov    $0x3c,%al
cmp    $0x2e,%sil
je     110e <ook2bfchar+0xe>
cmp    $0x2e,%dil
jne    112b <ook2bfchar+0x2b>
mov    $0x2b,%al
cmp    $0x2e,%sil
je     110e <ook2bfchar+0xe>
cmp    $0x21,%dil
jne    1139 <ook2bfchar+0x39>
mov    $0x2d,%al
cmp    $0x21,%sil
je     110e <ook2bfchar+0xe>
cmp    $0x21,%dil
jne    1147 <ook2bfchar+0x47>
mov    $0x2e,%al
cmp    $0x2e,%sil
je     110e <ook2bfchar+0xe>
cmp    $0x2e,%dil
jne    1155 <ook2bfchar+0x55>
mov    $0x2c,%al
cmp    $0x21,%sil
je     110e <ook2bfchar+0xe>
cmp    $0x21,%dil
jne    1163 <ook2bfchar+0x63>
mov    $0x5b,%al
cmp    $0x3f,%sil
je     110e <ook2bfchar+0xe>
xor    $0x21,%sil
xor    $0x3f,%dil
or     %sil,%dil
mov    $0x5d,%ecx
mov    $0x2e,%eax
cmove  %ecx,%eax
ret

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

LLVM IR (-O2):
define signext i8 @ook2bfchar(i8 signext %0, i8 signext %1) {
%3 = icmp eq i8 %0, 46
%4 = icmp eq i8 %1, 63
%5 = and i1 %3, %4
br i1 %5, label %25, label %6
6: ; preds = %2
%7 = icmp eq i8 %0, 63
%8 = icmp eq i8 %1, 46
%9 = and i1 %7, %8
br i1 %9, label %25, label %10
10: ; preds = %6
%11 = and i1 %3, %8
br i1 %11, label %25, label %12
12: ; preds = %10
%13 = icmp eq i8 %0, 33
%14 = icmp eq i8 %1, 33
%15 = and i1 %13, %14
br i1 %15, label %25, label %16
16: ; preds = %12
%17 = and i1 %13, %8
br i1 %17, label %25, label %18
18: ; preds = %16
%19 = and i1 %3, %14
br i1 %19, label %25, label %20
20: ; preds = %18
%21 = and i1 %13, %4
br i1 %21, label %25, label %22
22: ; preds = %20
%23 = and i1 %7, %14
%24 = select i1 %23, i8 93, i8 46
br label %25
25: ; preds = %22, %20, %18, %16, %12, %10, %6, %2
%26 = phi i8 [ 62, %2 ], [ 60, %6 ], [ 43, %10 ], [ 45, %12 ], [ 46, %16 ], [ 44, %18 ], [ 91, %20 ], [ %24, %22 ]
ret i8 %26
}