unsigned int cell_map(int celln) {
  int col, row;
  switch ((celln >> 12) & 7) {
  case 0:
  case 1:
  case 2:
  case 3:
    col = celln >> 8;
    row = celln & 0xff;
    break;
  case 4:
  case 5:
    col = celln >> 7;
    row = celln & 0x7f;
    row |= 0x10000 >> 8;
    break;
  case 6:
    col = celln >> 6;
    row = celln & 0x3f;
    row |= 0x18000 >> 8;
    break;
  case 7:
    col = celln >> 5;
    row = celln & 0x1f;
    row |= (celln & 0x7800) >> 6;
    break;
  default:
    col = row = 0;
    break;
  }
  return (col & 0x3f) + row * 64;
}


x86 assembly (clang, -O0):
<cell_map>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shr    $0xc,%eax
and    $0x7,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x7,%eax
ja     11b8 <cell_map+0xb8>
mov    -0x18(%rbp),%rax
lea    0xed6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x4(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0xc(%rbp)
jmp    11c6 <cell_map+0xc6>
mov    -0x4(%rbp),%eax
sar    $0x7,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
or     $0x100,%eax
mov    %eax,-0xc(%rbp)
jmp    11c6 <cell_map+0xc6>
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0x3f,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
or     $0x180,%eax
mov    %eax,-0xc(%rbp)
jmp    11c6 <cell_map+0xc6>
mov    -0x4(%rbp),%eax
sar    $0x5,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0x1f,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
and    $0x7800,%eax
sar    $0x6,%eax
or     -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
jmp    11c6 <cell_map+0xc6>
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
and    $0x3f,%eax
mov    -0xc(%rbp),%ecx
shl    $0x6,%ecx
add    %ecx,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cell_map>:
mov    %edi,%eax
mov    %edi,%ecx
shr    $0xc,%ecx
and    $0x7,%ecx
lea    0xeef(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    %eax,%ecx
sar    $0x8,%ecx
movzbl %al,%eax
jmp    1156 <cell_map+0x56>
mov    %eax,%ecx
sar    $0x7,%ecx
and    $0x7f,%eax
or     $0x100,%eax
jmp    1156 <cell_map+0x56>
mov    %eax,%ecx
sar    $0x6,%ecx
and    $0x3f,%eax
or     $0x180,%eax
jmp    1156 <cell_map+0x56>
mov    %eax,%ecx
sar    $0x5,%ecx
mov    %eax,%edx
and    $0x1f,%edx
shr    $0x6,%eax
and    $0x1e0,%eax
or     %edx,%eax
and    $0x3f,%ecx
shl    $0x6,%eax
or     %ecx,%eax
ret

LLVM IR (-O0):
define i32 @cell_map(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
%5 = load i32, i32* %2
%6 = ashr i32 %5, 12
%7 = and i32 %6, 7
switch i32 %7, label %37 [
i32 0, label %8
i32 1, label %8
i32 2, label %8
i32 3, label %8
i32 4, label %13
i32 5, label %13
i32 6, label %20
i32 7, label %27
]
8: ; preds = %1, %1, %1, %1
%9 = load i32, i32* %2
%10 = ashr i32 %9, 8
store i32 %10, i32* %3
%11 = load i32, i32* %2
%12 = and i32 %11, 255
store i32 %12, i32* %4
br label %38
13: ; preds = %1, %1
%14 = load i32, i32* %2
%15 = ashr i32 %14, 7
store i32 %15, i32* %3
%16 = load i32, i32* %2
%17 = and i32 %16, 127
store i32 %17, i32* %4
%18 = load i32, i32* %4
%19 = or i32 %18, 256
store i32 %19, i32* %4
br label %38
20: ; preds = %1
%21 = load i32, i32* %2
%22 = ashr i32 %21, 6
store i32 %22, i32* %3
%23 = load i32, i32* %2
%24 = and i32 %23, 63
store i32 %24, i32* %4
%25 = load i32, i32* %4
%26 = or i32 %25, 384
store i32 %26, i32* %4
br label %38
27: ; preds = %1
%28 = load i32, i32* %2
%29 = ashr i32 %28, 5
store i32 %29, i32* %3
%30 = load i32, i32* %2
%31 = and i32 %30, 31
store i32 %31, i32* %4
%32 = load i32, i32* %2
%33 = and i32 %32, 30720
%34 = ashr i32 %33, 6
%35 = load i32, i32* %4
%36 = or i32 %35, %34
store i32 %36, i32* %4
br label %38
37: ; preds = %1
store i32 0, i32* %4
store i32 0, i32* %3
br label %38
38: ; preds = %37, %27, %20, %13, %8
%39 = load i32, i32* %3
%40 = and i32 %39, 63
%41 = load i32, i32* %4
%42 = mul nsw i32 %41, 64
%43 = add nsw i32 %40, %42
ret i32 %43
}

LLVM IR (-O2):
define i32 @cell_map(i32 %0) {
%2 = lshr i32 %0, 12
%3 = and i32 %2, 7
switch i32 %3, label %21 [
i32 0, label %4
i32 1, label %4
i32 2, label %4
i32 3, label %4
i32 4, label %7
i32 5, label %7
i32 6, label %11
i32 7, label %15
]
4: ; preds = %1, %1, %1, %1
%5 = ashr i32 %0, 8
%6 = and i32 %0, 255
br label %22
7: ; preds = %1, %1
%8 = ashr i32 %0, 7
%9 = and i32 %0, 127
%10 = or i32 %9, 256
br label %22
11: ; preds = %1
%12 = ashr i32 %0, 6
%13 = and i32 %0, 63
%14 = or i32 %13, 384
br label %22
15: ; preds = %1
%16 = ashr i32 %0, 5
%17 = and i32 %0, 31
%18 = lshr i32 %0, 6
%19 = and i32 %18, 480
%20 = or i32 %19, %17
br label %22
21: ; preds = %1
unreachable
22: ; preds = %15, %11, %7, %4
%23 = phi i32 [ %16, %15 ], [ %12, %11 ], [ %8, %7 ], [ %5, %4 ]
%24 = phi i32 [ %20, %15 ], [ %14, %11 ], [ %10, %7 ], [ %6, %4 ]
%25 = and i32 %23, 63
%26 = shl nsw i32 %24, 6
%27 = or i32 %26, %25
ret i32 %27
}