char shift(char cell, char dir) {
  switch (dir) {
  case 0:
    return cell + 1;
  case 1:
    if ((cell / 5) % 2)
      return cell + 7;
    else
      return cell + 6;
  case 2:
    if ((cell / 5) % 2)
      return cell + 6;
    else
      return cell + 5;
  case 3:
    return cell + 10;
  case 4:
    if ((cell / 5) % 2)
      return cell + 5;
    else
      return cell + 4;
  case 5:
    if ((cell / 5) % 2)
      return cell + 4;
    else
      return cell + 3;
  case 6:
    return cell - 1;
  case 7:
    if ((cell / 5) % 2)
      return cell - 6;
    else
      return cell - 7;
  case 8:
    if ((cell / 5) % 2)
      return cell - 5;
    else
      return cell - 6;
  case 9:
    return cell - 10;
  case 10:
    if ((cell / 5) % 2)
      return cell - 4;
    else
      return cell - 5;
  case 11:
    if ((cell / 5) % 2)
      return cell - 3;
    else
      return cell - 4;
  default:
    return cell;
  }
}


x86 assembly (clang, -O0):
<shift>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x3(%rbp),%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0xb,%eax
ja     134b <shift+0x24b>
mov    -0x10(%rbp),%rax
lea    0xed2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsbl -0x2(%rbp),%eax
add    $0x1,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1172 <shift+0x72>
movsbl -0x2(%rbp),%eax
add    $0x7,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
add    $0x6,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11ad <shift+0xad>
movsbl -0x2(%rbp),%eax
add    $0x6,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
add    $0x5,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
add    $0xa,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11f7 <shift+0xf7>
movsbl -0x2(%rbp),%eax
add    $0x5,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
add    $0x4,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1232 <shift+0x132>
movsbl -0x2(%rbp),%eax
add    $0x4,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0x1,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     127c <shift+0x17c>
movsbl -0x2(%rbp),%eax
sub    $0x6,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0x7,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     12b7 <shift+0x1b7>
movsbl -0x2(%rbp),%eax
sub    $0x5,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0x6,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0xa,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1301 <shift+0x201>
movsbl -0x2(%rbp),%eax
sub    $0x4,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0x5,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
mov    $0x5,%ecx
cltd
idiv   %ecx
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     133c <shift+0x23c>
movsbl -0x2(%rbp),%eax
sub    $0x3,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
movsbl -0x2(%rbp),%eax
sub    $0x4,%eax
mov    %al,-0x1(%rbp)
jmp    1351 <shift+0x251>
mov    -0x2(%rbp),%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<shift>:
mov    %edi,%eax
cmp    $0xb,%esi
ja     11e4 <shift+0xe4>
mov    %esi,%ecx
lea    0xeec(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
add    $0x1,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
je     1153 <shift+0x53>
add    $0x7,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
je     1171 <shift+0x71>
add    $0x6,%al
ret
add    $0xa,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
je     11e5 <shift+0xe5>
add    $0x5,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
jne    11e5 <shift+0xe5>
add    $0x3,%al
ret
add    $0xff,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
jne    1200 <shift+0x100>
add    $0xf9,%al
ret
add    $0xf6,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
jne    11e2 <shift+0xe2>
jmp    1203 <shift+0x103>
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
jne    1206 <shift+0x106>
add    $0xfc,%al
ret
add    $0x4,%al
ret
movsbl %al,%ecx
imul   $0x67,%ecx,%ecx
movzwl %cx,%ecx
mov    %ecx,%edx
shr    $0xf,%edx
shr    $0x9,%ecx
add    %dl,%cl
test   $0x1,%cl
jne    1203 <shift+0x103>
add    $0xfa,%al
ret
add    $0xfb,%al
ret
add    $0xfd,%al
ret

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

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