short BCM2WIRINGPI(short b) {
  if (b == 17)
    return 0;
  else if (b == 18)
    return 1;
  else if (b == 27)
    return 2;
  else if (b == 22)
    return 3;
  else if (b == 23)
    return 4;
  else if (b == 24)
    return 5;
  else if (b == 25)
    return 6;
  else if (b == 4)
    return 7;
  else if (b == 2)
    return 8;
  else if (b == 3)
    return 9;
  else if (b == 8)
    return 10;
  else if (b == 7)
    return 11;
  else if (b == 10)
    return 12;
  else if (b == 9)
    return 13;
  else if (b == 11)
    return 14;
  else if (b == 14)
    return 15;
  else if (b == 15)
    return 16;
  else if (b == 28)
    return 17;
  else if (b == 29)
    return 18;
  else if (b == 30)
    return 19;
  else if (b == 31)
    return 20;
  else
    return 0;
}


x86 assembly (clang, -O0):
<BCM2WIRINGPI>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x4(%rbp)
movswl -0x4(%rbp),%eax
cmp    $0x11,%eax
jne    1123 <BCM2WIRINGPI+0x23>
movw   $0x0,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x12,%eax
jne    113b <BCM2WIRINGPI+0x3b>
movw   $0x1,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x1b,%eax
jne    1153 <BCM2WIRINGPI+0x53>
movw   $0x2,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x16,%eax
jne    116b <BCM2WIRINGPI+0x6b>
movw   $0x3,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x17,%eax
jne    1183 <BCM2WIRINGPI+0x83>
movw   $0x4,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x18,%eax
jne    119b <BCM2WIRINGPI+0x9b>
movw   $0x5,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x19,%eax
jne    11b3 <BCM2WIRINGPI+0xb3>
movw   $0x6,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x4,%eax
jne    11cb <BCM2WIRINGPI+0xcb>
movw   $0x7,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x2,%eax
jne    11e3 <BCM2WIRINGPI+0xe3>
movw   $0x8,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x3,%eax
jne    11fb <BCM2WIRINGPI+0xfb>
movw   $0x9,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x8,%eax
jne    1213 <BCM2WIRINGPI+0x113>
movw   $0xa,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x7,%eax
jne    122b <BCM2WIRINGPI+0x12b>
movw   $0xb,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0xa,%eax
jne    1243 <BCM2WIRINGPI+0x143>
movw   $0xc,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x9,%eax
jne    125b <BCM2WIRINGPI+0x15b>
movw   $0xd,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0xb,%eax
jne    1273 <BCM2WIRINGPI+0x173>
movw   $0xe,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0xe,%eax
jne    128b <BCM2WIRINGPI+0x18b>
movw   $0xf,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0xf,%eax
jne    12a3 <BCM2WIRINGPI+0x1a3>
movw   $0x10,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x1c,%eax
jne    12bb <BCM2WIRINGPI+0x1bb>
movw   $0x11,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x1d,%eax
jne    12d3 <BCM2WIRINGPI+0x1d3>
movw   $0x12,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x1e,%eax
jne    12eb <BCM2WIRINGPI+0x1eb>
movw   $0x13,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movswl -0x4(%rbp),%eax
cmp    $0x1f,%eax
jne    1303 <BCM2WIRINGPI+0x203>
movw   $0x14,-0x2(%rbp)
jmp    1309 <BCM2WIRINGPI+0x209>
movw   $0x0,-0x2(%rbp)
movswl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<BCM2WIRINGPI>:
add    $0xfffffffe,%edi
cmp    $0x1d,%di
ja     1119 <BCM2WIRINGPI+0x19>
movswq %di,%rax
lea    0xeec(%rip),%rcx
movzwl (%rcx,%rax,2),%eax
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
define signext i16 @BCM2WIRINGPI(i16 signext %0) {
%2 = alloca i16
%3 = alloca i16
store i16 %0, i16* %3
%4 = load i16, i16* %3
%5 = sext i16 %4 to i32
%6 = icmp eq i32 %5, 17
br i1 %6, label %7, label %8
7: ; preds = %1
store i16 0, i16* %2
br label %109
8: ; preds = %1
%9 = load i16, i16* %3
%10 = sext i16 %9 to i32
%11 = icmp eq i32 %10, 18
br i1 %11, label %12, label %13
12: ; preds = %8
store i16 1, i16* %2
br label %109
13: ; preds = %8
%14 = load i16, i16* %3
%15 = sext i16 %14 to i32
%16 = icmp eq i32 %15, 27
br i1 %16, label %17, label %18
17: ; preds = %13
store i16 2, i16* %2
br label %109
18: ; preds = %13
%19 = load i16, i16* %3
%20 = sext i16 %19 to i32
%21 = icmp eq i32 %20, 22
br i1 %21, label %22, label %23
22: ; preds = %18
store i16 3, i16* %2
br label %109
23: ; preds = %18
%24 = load i16, i16* %3
%25 = sext i16 %24 to i32
%26 = icmp eq i32 %25, 23
br i1 %26, label %27, label %28
27: ; preds = %23
store i16 4, i16* %2
br label %109
28: ; preds = %23
%29 = load i16, i16* %3
%30 = sext i16 %29 to i32
%31 = icmp eq i32 %30, 24
br i1 %31, label %32, label %33
32: ; preds = %28
store i16 5, i16* %2
br label %109
33: ; preds = %28
%34 = load i16, i16* %3
%35 = sext i16 %34 to i32
%36 = icmp eq i32 %35, 25
br i1 %36, label %37, label %38
37: ; preds = %33
store i16 6, i16* %2
br label %109
38: ; preds = %33
%39 = load i16, i16* %3
%40 = sext i16 %39 to i32
%41 = icmp eq i32 %40, 4
br i1 %41, label %42, label %43
42: ; preds = %38
store i16 7, i16* %2
br label %109
43: ; preds = %38
%44 = load i16, i16* %3
%45 = sext i16 %44 to i32
%46 = icmp eq i32 %45, 2
br i1 %46, label %47, label %48
47: ; preds = %43
store i16 8, i16* %2
br label %109
48: ; preds = %43
%49 = load i16, i16* %3
%50 = sext i16 %49 to i32
%51 = icmp eq i32 %50, 3
br i1 %51, label %52, label %53
52: ; preds = %48
store i16 9, i16* %2
br label %109
53: ; preds = %48
%54 = load i16, i16* %3
%55 = sext i16 %54 to i32
%56 = icmp eq i32 %55, 8
br i1 %56, label %57, label %58
57: ; preds = %53
store i16 10, i16* %2
br label %109
58: ; preds = %53
%59 = load i16, i16* %3
%60 = sext i16 %59 to i32
%61 = icmp eq i32 %60, 7
br i1 %61, label %62, label %63
62: ; preds = %58
store i16 11, i16* %2
br label %109
63: ; preds = %58
%64 = load i16, i16* %3
%65 = sext i16 %64 to i32
%66 = icmp eq i32 %65, 10
br i1 %66, label %67, label %68
67: ; preds = %63
store i16 12, i16* %2
br label %109
68: ; preds = %63
%69 = load i16, i16* %3
%70 = sext i16 %69 to i32
%71 = icmp eq i32 %70, 9
br i1 %71, label %72, label %73
72: ; preds = %68
store i16 13, i16* %2
br label %109
73: ; preds = %68
%74 = load i16, i16* %3
%75 = sext i16 %74 to i32
%76 = icmp eq i32 %75, 11
br i1 %76, label %77, label %78
77: ; preds = %73
store i16 14, i16* %2
br label %109
78: ; preds = %73
%79 = load i16, i16* %3
%80 = sext i16 %79 to i32
%81 = icmp eq i32 %80, 14
br i1 %81, label %82, label %83
82: ; preds = %78
store i16 15, i16* %2
br label %109
83: ; preds = %78
%84 = load i16, i16* %3
%85 = sext i16 %84 to i32
%86 = icmp eq i32 %85, 15
br i1 %86, label %87, label %88
87: ; preds = %83
store i16 16, i16* %2
br label %109
88: ; preds = %83
%89 = load i16, i16* %3
%90 = sext i16 %89 to i32
%91 = icmp eq i32 %90, 28
br i1 %91, label %92, label %93
92: ; preds = %88
store i16 17, i16* %2
br label %109
93: ; preds = %88
%94 = load i16, i16* %3
%95 = sext i16 %94 to i32
%96 = icmp eq i32 %95, 29
br i1 %96, label %97, label %98
97: ; preds = %93
store i16 18, i16* %2
br label %109
98: ; preds = %93
%99 = load i16, i16* %3
%100 = sext i16 %99 to i32
%101 = icmp eq i32 %100, 30
br i1 %101, label %102, label %103
102: ; preds = %98
store i16 19, i16* %2
br label %109
103: ; preds = %98
%104 = load i16, i16* %3
%105 = sext i16 %104 to i32
%106 = icmp eq i32 %105, 31
br i1 %106, label %107, label %108
107: ; preds = %103
store i16 20, i16* %2
br label %109
108: ; preds = %103
store i16 0, i16* %2
br label %109
109: ; preds = %108, %107, %102, %97, %92, %87, %82, %77, %72, %67, %62, %57, %52, %47, %42, %37, %32, %27, %22, %17, %12, %7
%110 = load i16, i16* %2
ret i16 %110
}

LLVM IR (-O2):
@switch.table.BCM2WIRINGPI = [30 x i16] [i16 8, i16 9, i16 7, i16 0, i16 0, i16 11, i16 10, i16 13, i16 12, i16 14, i16 0, i16 0, i16 15, i16 16, i16 0, i16 0, i16 1, i16 0, i16 0, i16 0, i16 3, i16 4, i16 5, i16 6, i16 0, i16 2, i16 17, i16 18, i16 19, i16 20]
define signext i16 @BCM2WIRINGPI(i16 signext %0) {
%2 = add i16 %0, -2
%3 = icmp ult i16 %2, 30
br i1 %3, label %4, label %8
4: ; preds = %1
%5 = sext i16 %2 to i64
%6 = getelementptr inbounds [30 x i16], [30 x i16]* @switch.table.BCM2WIRINGPI, i64 0, i64 %5
%7 = load i16, i16* %6
br label %8
8: ; preds = %4, %1
%9 = phi i16 [ 0, %1 ], [ %7, %4 ]
ret i16 %9
}