void McbCreateSubKeys(const unsigned char Key[8],
                      unsigned char SubKeys[16][6]) {
  static unsigned char lShifts[] = {1, 1, 2, 2, 2, 2, 2, 2,
                                    1, 2, 2, 2, 2, 2, 2, 1};
  static unsigned char tblPC2[] = {
      13, 16, 10, 23, 0,  4,  2,  27, 14, 5,  20, 9,  22, 18, 11, 3,
      25, 7,  15, 6,  26, 19, 12, 1,  40, 51, 30, 36, 46, 54, 29, 39,
      50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31};
  long lPair[17][2];
  int n;
  unsigned char bytePair[7];
  unsigned char KeyPlus[7];
  McbCreateKeyPlus(Key, KeyPlus);
  lPair[0][0] = (KeyPlus[0] << 20) | (KeyPlus[1] << 12) | (KeyPlus[2] << 4) |
                ((KeyPlus[3] & 0xF0) >> 4);
  lPair[0][1] = ((KeyPlus[3] & 0x0F) << 24) | (KeyPlus[4] << 16) |
                (KeyPlus[5] << 8) | KeyPlus[6];
  for (n = 1; n < 17; n++) {
    if (lShifts[n - 1] == 2) {
      (lPair[n][0]) =
          ((lPair[n - 1][0]) << 2) | (((lPair[n - 1][0]) & 0x0C000000) >> 26);
      ;
      (lPair[n][1]) =
          ((lPair[n - 1][1]) << 2) | (((lPair[n - 1][1]) & 0x0C000000) >> 26);
      ;
    } else {
      (lPair[n][0]) =
          ((lPair[n - 1][0]) << 1) | (((lPair[n - 1][0]) & 0x08000000) >> 27);
      ;
      (lPair[n][1]) =
          ((lPair[n - 1][1]) << 1) | (((lPair[n - 1][1]) & 0x08000000) >> 27);
      ;
    }
  }
  memset(SubKeys, 0, 16 * 6);
  for (n = 0; n < 16; n++) {
    bytePair[0] = ((lPair[n + 1][0]) & 0xFF00000) >> 20;
    bytePair[1] = ((lPair[n + 1][0]) & 0x00FF000) >> 12;
    bytePair[2] = ((lPair[n + 1][0]) & 0x0000FF0) >> 4;
    bytePair[3] = (((lPair[n + 1][0]) & 0x000000F) << 4) |
                  (((lPair[n + 1][1]) & 0xF000000) >> 24);
    bytePair[4] = ((lPair[n + 1][1]) & 0x0FF0000) >> 16;
    bytePair[5] = ((lPair[n + 1][1]) & 0x000FF00) >> 8;
    bytePair[6] = ((lPair[n + 1][1]) & 0x00000FF);
    ;
    McbMapTrueBits(tblPC2, sizeof(tblPC2), bytePair, SubKeys[n]);
  }
}


x86 assembly (clang, -O0):
<McbCreateSubKeys>:
push   %rbp
mov    %rsp,%rbp
sub    $0x140,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
lea    -0x132(%rbp),%rsi
mov    $0x0,%al
call   1050 <McbCreateKeyPlus@plt>
movzbl -0x132(%rbp),%eax
shl    $0x14,%eax
movzbl -0x131(%rbp),%ecx
shl    $0xc,%ecx
or     %ecx,%eax
movzbl -0x130(%rbp),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
movzbl -0x12f(%rbp),%ecx
and    $0xf0,%ecx
sar    $0x4,%ecx
or     %ecx,%eax
cltq
mov    %rax,-0x120(%rbp)
movzbl -0x12f(%rbp),%eax
and    $0xf,%eax
shl    $0x18,%eax
movzbl -0x12e(%rbp),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
movzbl -0x12d(%rbp),%ecx
shl    $0x8,%ecx
or     %ecx,%eax
movzbl -0x12c(%rbp),%ecx
or     %ecx,%eax
cltq
mov    %rax,-0x118(%rbp)
movl   $0x1,-0x124(%rbp)
cmpl   $0x11,-0x124(%rbp)
jge    13b0 <McbCreateSubKeys+0x280>
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    0x2e4d(%rip),%rax
movzbl (%rax,%rcx,1),%eax
cmp    $0x2,%eax
jne    12ce <McbCreateSubKeys+0x19e>
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rcx
shl    $0x2,%rcx
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    (%rax),%rax
and    $0xc000000,%rax
sar    $0x1a,%rax
or     %rax,%rcx
movslq -0x124(%rbp),%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rcx
shl    $0x2,%rcx
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    0x8(%rax),%rax
and    $0xc000000,%rax
sar    $0x1a,%rax
or     %rax,%rcx
movslq -0x124(%rbp),%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,0x8(%rax)
jmp    1397 <McbCreateSubKeys+0x267>
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rcx
shl    $0x1,%rcx
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    (%rax),%rax
and    $0x8000000,%rax
sar    $0x1b,%rax
or     %rax,%rcx
movslq -0x124(%rbp),%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rcx
shl    $0x1,%rcx
mov    -0x124(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    0x8(%rax),%rax
and    $0x8000000,%rax
sar    $0x1b,%rax
or     %rax,%rcx
movslq -0x124(%rbp),%rdx
lea    -0x120(%rbp),%rax
shl    $0x4,%rdx
add    %rdx,%rax
mov    %rcx,0x8(%rax)
jmp    139c <McbCreateSubKeys+0x26c>
mov    -0x124(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124(%rbp)
jmp    11d3 <McbCreateSubKeys+0xa3>
mov    -0x10(%rbp),%rdi
xor    %esi,%esi
mov    $0x60,%edx
call   1030 <memset@plt>
movl   $0x0,-0x124(%rbp)
cmpl   $0x10,-0x124(%rbp)
jge    157b <McbCreateSubKeys+0x44b>
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rax
and    $0xff00000,%rax
sar    $0x14,%rax
mov    %al,-0x12b(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rax
and    $0xff000,%rax
sar    $0xc,%rax
mov    %al,-0x12a(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rax
and    $0xff0,%rax
sar    $0x4,%rax
mov    %al,-0x129(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    (%rax),%rax
and    $0xf,%rax
shl    $0x4,%rax
mov    -0x124(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rdx
lea    -0x120(%rbp),%rcx
shl    $0x4,%rdx
add    %rdx,%rcx
mov    0x8(%rcx),%rcx
and    $0xf000000,%rcx
sar    $0x18,%rcx
or     %rcx,%rax
mov    %al,-0x128(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rax
and    $0xff0000,%rax
sar    $0x10,%rax
mov    %al,-0x127(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rax
and    $0xff00,%rax
sar    $0x8,%rax
mov    %al,-0x126(%rbp)
mov    -0x124(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    -0x120(%rbp),%rax
shl    $0x4,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rax
and    $0xff,%rax
mov    %al,-0x125(%rbp)
lea    -0x12b(%rbp),%rdx
mov    -0x10(%rbp),%rcx
movslq -0x124(%rbp),%rax
imul   $0x6,%rax,%rax
add    %rax,%rcx
lea    0x2af5(%rip),%rdi
mov    $0x30,%esi
mov    $0x0,%al
call   1040 <McbMapTrueBits@plt>
mov    -0x124(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124(%rbp)
jmp    13ca <McbCreateSubKeys+0x29a>
add    $0x140,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<McbCreateSubKeys>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x128,%rsp
mov    %rsi,%r14
xor    %r15d,%r15d
lea    0x2(%rsp),%rsi
xor    %eax,%eax
call   1040 <McbCreateKeyPlus@plt>
movzbl 0x2(%rsp),%eax
shl    $0x14,%rax
movzbl 0x3(%rsp),%ecx
shl    $0xc,%rcx
or     %rax,%rcx
movzbl 0x4(%rsp),%eax
shl    $0x4,%rax
or     %rcx,%rax
movzbl 0x5(%rsp),%ecx
mov    %rcx,%rsi
shr    $0x4,%rsi
or     %rax,%rsi
mov    %rsi,0x10(%rsp)
and    $0xf,%ecx
shl    $0x18,%rcx
movzbl 0x6(%rsp),%eax
shl    $0x10,%rax
or     %rcx,%rax
movzbl 0x7(%rsp),%ecx
shl    $0x8,%rcx
or     %rax,%rcx
movzbl 0x8(%rsp),%edi
or     %rcx,%rdi
mov    %rdi,0x18(%rsp)
lea    0x28(%rsp),%r10
cs nopw 0x0(%rax,%rax,1)
mov    $0x7efc,%eax
mov    %r15d,%ecx
shr    %cl,%rax
and    $0x1,%eax
lea    (%rax,%rax,1),%r8d
add    $0x1,%r8d
lea    0x1(%rax),%r9d
mov    %rsi,%rdx
mov    %r9d,%ecx
shl    %cl,%rdx
xor    $0x1b,%al
mov    %eax,%ecx
shr    %cl,%rsi
mov    %rdi,%rbx
mov    %r9d,%ecx
shl    %cl,%rbx
and    %r8d,%esi
mov    %eax,%ecx
shr    %cl,%rdi
or     %rdx,%rsi
and    %r8d,%edi
or     %rbx,%rdi
mov    %rsi,-0x8(%r10)
mov    %rdi,(%r10)
add    $0x10,%r10
add    $0x1,%r15
cmp    $0x10,%r15
jne    11b0 <McbCreateSubKeys+0x90>
xorps  %xmm0,%xmm0
movups %xmm0,0x50(%r14)
movups %xmm0,0x40(%r14)
movups %xmm0,0x30(%r14)
movups %xmm0,0x20(%r14)
movups %xmm0,0x10(%r14)
movups %xmm0,(%r14)
lea    0x2e10(%rip),%r15
lea    0x9(%rsp),%r12
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    0x20(%rsp,%rbx,1),%rcx
mov    0x28(%rsp,%rbx,1),%rax
mov    %rcx,%rdx
shr    $0x14,%rdx
mov    %dl,0x9(%rsp)
mov    %rcx,%rdx
shr    $0xc,%rdx
mov    %dl,0xa(%rsp)
mov    %rcx,%rdx
shr    $0x4,%rdx
mov    %dl,0xb(%rsp)
shl    $0x4,%ecx
mov    %eax,%edx
shr    $0x18,%edx
and    $0xf,%edx
or     %ecx,%edx
mov    %dl,0xc(%rsp)
mov    %rax,%rcx
shr    $0x10,%rcx
mov    %cl,0xd(%rsp)
mov    %ah,0xe(%rsp)
mov    %al,0xf(%rsp)
mov    $0x30,%esi
mov    %r15,%rdi
mov    %r12,%rdx
mov    %r14,%rcx
xor    %eax,%eax
call   1030 <McbMapTrueBits@plt>
add    $0x6,%r14
add    $0x10,%rbx
cmp    $0x100,%rbx
jne    1240 <McbCreateSubKeys+0x120>
add    $0x128,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@McbCreateSubKeys.lShifts = internal global [16 x i8] c"\01\01\02\02\02\02\02\02\01\02\02\02\02\02\02\01"
@McbCreateSubKeys.tblPC2 = internal global [48 x i8] c"\0D\10\0A\17\00\04\02\1B\0E\05\14\09\16\12\0B\03\19\07\0F\06\1A\13\0C\01(3\1E$.6\1D'2, /+0&7!4-)1#\1C\1F"
define void @McbCreateSubKeys(i8* %0, [6 x i8]* %1) {
%3 = alloca i8*
%4 = alloca [6 x i8]*
%5 = alloca [17 x [2 x i64]]
%6 = alloca i32
%7 = alloca [7 x i8]
%8 = alloca [7 x i8]
store i8* %0, i8** %3
store [6 x i8]* %1, [6 x i8]** %4
%9 = load i8*, i8** %3
%10 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 0
%11 = call i32 (i8*, i8*, ...) bitcast (i32 (...)* @McbCreateKeyPlus to i32 (i8*, i8*, ...)*)(i8* %9, i8* %10)
%12 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 0
%13 = load i8, i8* %12
%14 = zext i8 %13 to i32
%15 = shl i32 %14, 20
%16 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 1
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
%19 = shl i32 %18, 12
%20 = or i32 %15, %19
%21 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 2
%22 = load i8, i8* %21
%23 = zext i8 %22 to i32
%24 = shl i32 %23, 4
%25 = or i32 %20, %24
%26 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 3
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = and i32 %28, 240
%30 = ashr i32 %29, 4
%31 = or i32 %25, %30
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 0
%34 = getelementptr inbounds [2 x i64], [2 x i64]* %33, i64 0, i64 0
store i64 %32, i64* %34
%35 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 3
%36 = load i8, i8* %35
%37 = zext i8 %36 to i32
%38 = and i32 %37, 15
%39 = shl i32 %38, 24
%40 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 4
%41 = load i8, i8* %40
%42 = zext i8 %41 to i32
%43 = shl i32 %42, 16
%44 = or i32 %39, %43
%45 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 5
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = shl i32 %47, 8
%49 = or i32 %44, %48
%50 = getelementptr inbounds [7 x i8], [7 x i8]* %8, i64 0, i64 6
%51 = load i8, i8* %50
%52 = zext i8 %51 to i32
%53 = or i32 %49, %52
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 0
%56 = getelementptr inbounds [2 x i64], [2 x i64]* %55, i64 0, i64 1
store i64 %54, i64* %56
store i32 1, i32* %6
br label %57
57: ; preds = %151, %2
%58 = load i32, i32* %6
%59 = icmp slt i32 %58, 17
br i1 %59, label %60, label %154
60: ; preds = %57
%61 = load i32, i32* %6
%62 = sub nsw i32 %61, 1
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds [16 x i8], [16 x i8]* @McbCreateSubKeys.lShifts, i64 0, i64 %63
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = icmp eq i32 %66, 2
br i1 %67, label %68, label %109
68: ; preds = %60
%69 = load i32, i32* %6
%70 = sub nsw i32 %69, 1
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %71
%73 = getelementptr inbounds [2 x i64], [2 x i64]* %72, i64 0, i64 0
%74 = load i64, i64* %73
%75 = shl i64 %74, 2
%76 = load i32, i32* %6
%77 = sub nsw i32 %76, 1
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %78
%80 = getelementptr inbounds [2 x i64], [2 x i64]* %79, i64 0, i64 0
%81 = load i64, i64* %80
%82 = and i64 %81, 201326592
%83 = ashr i64 %82, 26
%84 = or i64 %75, %83
%85 = load i32, i32* %6
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %86
%88 = getelementptr inbounds [2 x i64], [2 x i64]* %87, i64 0, i64 0
store i64 %84, i64* %88
%89 = load i32, i32* %6
%90 = sub nsw i32 %89, 1
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %91
%93 = getelementptr inbounds [2 x i64], [2 x i64]* %92, i64 0, i64 1
%94 = load i64, i64* %93
%95 = shl i64 %94, 2
%96 = load i32, i32* %6
%97 = sub nsw i32 %96, 1
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %98
%100 = getelementptr inbounds [2 x i64], [2 x i64]* %99, i64 0, i64 1
%101 = load i64, i64* %100
%102 = and i64 %101, 201326592
%103 = ashr i64 %102, 26
%104 = or i64 %95, %103
%105 = load i32, i32* %6
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %106
%108 = getelementptr inbounds [2 x i64], [2 x i64]* %107, i64 0, i64 1
store i64 %104, i64* %108
br label %150
109: ; preds = %60
%110 = load i32, i32* %6
%111 = sub nsw i32 %110, 1
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %112
%114 = getelementptr inbounds [2 x i64], [2 x i64]* %113, i64 0, i64 0
%115 = load i64, i64* %114
%116 = shl i64 %115, 1
%117 = load i32, i32* %6
%118 = sub nsw i32 %117, 1
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %119
%121 = getelementptr inbounds [2 x i64], [2 x i64]* %120, i64 0, i64 0
%122 = load i64, i64* %121
%123 = and i64 %122, 134217728
%124 = ashr i64 %123, 27
%125 = or i64 %116, %124
%126 = load i32, i32* %6
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %127
%129 = getelementptr inbounds [2 x i64], [2 x i64]* %128, i64 0, i64 0
store i64 %125, i64* %129
%130 = load i32, i32* %6
%131 = sub nsw i32 %130, 1
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %132
%134 = getelementptr inbounds [2 x i64], [2 x i64]* %133, i64 0, i64 1
%135 = load i64, i64* %134
%136 = shl i64 %135, 1
%137 = load i32, i32* %6
%138 = sub nsw i32 %137, 1
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %139
%141 = getelementptr inbounds [2 x i64], [2 x i64]* %140, i64 0, i64 1
%142 = load i64, i64* %141
%143 = and i64 %142, 134217728
%144 = ashr i64 %143, 27
%145 = or i64 %136, %144
%146 = load i32, i32* %6
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %147
%149 = getelementptr inbounds [2 x i64], [2 x i64]* %148, i64 0, i64 1
store i64 %145, i64* %149
br label %150
150: ; preds = %109, %68
br label %151
151: ; preds = %150
%152 = load i32, i32* %6
%153 = add nsw i32 %152, 1
store i32 %153, i32* %6
br label %57
154: ; preds = %57
%155 = load [6 x i8]*, [6 x i8]** %4
%156 = bitcast [6 x i8]* %155 to i8*
store i32 0, i32* %6
br label %157
157: ; preds = %246, %154
%158 = load i32, i32* %6
%159 = icmp slt i32 %158, 16
br i1 %159, label %160, label %249
160: ; preds = %157
%161 = load i32, i32* %6
%162 = add nsw i32 %161, 1
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %163
%165 = getelementptr inbounds [2 x i64], [2 x i64]* %164, i64 0, i64 0
%166 = load i64, i64* %165
%167 = and i64 %166, 267386880
%168 = ashr i64 %167, 20
%169 = trunc i64 %168 to i8
%170 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 0
store i8 %169, i8* %170
%171 = load i32, i32* %6
%172 = add nsw i32 %171, 1
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %173
%175 = getelementptr inbounds [2 x i64], [2 x i64]* %174, i64 0, i64 0
%176 = load i64, i64* %175
%177 = and i64 %176, 1044480
%178 = ashr i64 %177, 12
%179 = trunc i64 %178 to i8
%180 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 1
store i8 %179, i8* %180
%181 = load i32, i32* %6
%182 = add nsw i32 %181, 1
%183 = sext i32 %182 to i64
%184 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %183
%185 = getelementptr inbounds [2 x i64], [2 x i64]* %184, i64 0, i64 0
%186 = load i64, i64* %185
%187 = and i64 %186, 4080
%188 = ashr i64 %187, 4
%189 = trunc i64 %188 to i8
%190 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 2
store i8 %189, i8* %190
%191 = load i32, i32* %6
%192 = add nsw i32 %191, 1
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %193
%195 = getelementptr inbounds [2 x i64], [2 x i64]* %194, i64 0, i64 0
%196 = load i64, i64* %195
%197 = and i64 %196, 15
%198 = shl i64 %197, 4
%199 = load i32, i32* %6
%200 = add nsw i32 %199, 1
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %201
%203 = getelementptr inbounds [2 x i64], [2 x i64]* %202, i64 0, i64 1
%204 = load i64, i64* %203
%205 = and i64 %204, 251658240
%206 = ashr i64 %205, 24
%207 = or i64 %198, %206
%208 = trunc i64 %207 to i8
%209 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 3
store i8 %208, i8* %209
%210 = load i32, i32* %6
%211 = add nsw i32 %210, 1
%212 = sext i32 %211 to i64
%213 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %212
%214 = getelementptr inbounds [2 x i64], [2 x i64]* %213, i64 0, i64 1
%215 = load i64, i64* %214
%216 = and i64 %215, 16711680
%217 = ashr i64 %216, 16
%218 = trunc i64 %217 to i8
%219 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 4
store i8 %218, i8* %219
%220 = load i32, i32* %6
%221 = add nsw i32 %220, 1
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %222
%224 = getelementptr inbounds [2 x i64], [2 x i64]* %223, i64 0, i64 1
%225 = load i64, i64* %224
%226 = and i64 %225, 65280
%227 = ashr i64 %226, 8
%228 = trunc i64 %227 to i8
%229 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 5
store i8 %228, i8* %229
%230 = load i32, i32* %6
%231 = add nsw i32 %230, 1
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %5, i64 0, i64 %232
%234 = getelementptr inbounds [2 x i64], [2 x i64]* %233, i64 0, i64 1
%235 = load i64, i64* %234
%236 = and i64 %235, 255
%237 = trunc i64 %236 to i8
%238 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 6
store i8 %237, i8* %238
%239 = getelementptr inbounds [7 x i8], [7 x i8]* %7, i64 0, i64 0
%240 = load [6 x i8]*, [6 x i8]** %4
%241 = load i32, i32* %6
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds [6 x i8], [6 x i8]* %240, i64 %242
%244 = getelementptr inbounds [6 x i8], [6 x i8]* %243, i64 0, i64 0
%245 = call i32 (i8*, i64, i8*, i8*, ...) bitcast (i32 (...)* @McbMapTrueBits to i32 (i8*, i64, i8*, i8*, ...)*)(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @McbCreateSubKeys.tblPC2, i64 0, i64 0), i64 48, i8* %239, i8* %244)
br label %246
246: ; preds = %160
%247 = load i32, i32* %6
%248 = add nsw i32 %247, 1
store i32 %248, i32* %6
br label %157
249: ; preds = %157
ret void
}

LLVM IR (-O2):
@McbCreateSubKeys.tblPC2 = internal global [48 x i8] c"\0D\10\0A\17\00\04\02\1B\0E\05\14\09\16\12\0B\03\19\07\0F\06\1A\13\0C\01(3\1E$.6\1D'2, /+0&7!4-)1#\1C\1F"
define void @McbCreateSubKeys(i8* %0, [6 x i8]* %1) {
%3 = alloca [17 x [2 x i64]]
%4 = alloca [7 x i8]
%5 = alloca [7 x i8]
%6 = bitcast [17 x [2 x i64]]* %3 to i8*
%7 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 0
%8 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 0
%9 = call i32 (i8*, i8*, ...) bitcast (i32 (...)* @McbCreateKeyPlus to i32 (i8*, i8*, ...)*)(i8* %0, i8* %8)
%10 = load i8, i8* %8
%11 = zext i8 %10 to i64
%12 = shl nuw nsw i64 %11, 20
%13 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 1
%14 = load i8, i8* %13
%15 = zext i8 %14 to i64
%16 = shl nuw nsw i64 %15, 12
%17 = or i64 %16, %12
%18 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 2
%19 = load i8, i8* %18
%20 = zext i8 %19 to i64
%21 = shl nuw nsw i64 %20, 4
%22 = or i64 %17, %21
%23 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 3
%24 = load i8, i8* %23
%25 = lshr i8 %24, 4
%26 = zext i8 %25 to i64
%27 = or i64 %22, %26
%28 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 0, i64 0
store i64 %27, i64* %28
%29 = and i8 %24, 15
%30 = zext i8 %29 to i64
%31 = shl nuw nsw i64 %30, 24
%32 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 4
%33 = load i8, i8* %32
%34 = zext i8 %33 to i64
%35 = shl nuw nsw i64 %34, 16
%36 = or i64 %35, %31
%37 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 5
%38 = load i8, i8* %37
%39 = zext i8 %38 to i64
%40 = shl nuw nsw i64 %39, 8
%41 = or i64 %36, %40
%42 = getelementptr inbounds [7 x i8], [7 x i8]* %5, i64 0, i64 6
%43 = load i8, i8* %42
%44 = zext i8 %43 to i64
%45 = or i64 %41, %44
%46 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 0, i64 1
store i64 %45, i64* %46
br label %47
47: ; preds = %2, %47
%48 = phi i64 [ %45, %2 ], [ %65, %47 ]
%49 = phi i64 [ %27, %2 ], [ %61, %47 ]
%50 = phi i64 [ 1, %2 ], [ %68, %47 ]
%51 = add nsw i64 %50, -1
%52 = lshr i64 32508, %51
%53 = and i64 %52, 1
%54 = icmp eq i64 %53, 0
%55 = select i1 %54, i64 1, i64 2
%56 = xor i64 %53, 27
%57 = select i1 %54, i64 1, i64 3
%58 = shl i64 %49, %55
%59 = lshr i64 %49, %56
%60 = and i64 %59, %57
%61 = or i64 %60, %58
%62 = shl i64 %48, %55
%63 = lshr i64 %48, %56
%64 = and i64 %63, %57
%65 = or i64 %64, %62
%66 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 %50, i64 0
store i64 %61, i64* %66
%67 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 %50, i64 1
store i64 %65, i64* %67
%68 = add nuw nsw i64 %50, 1
%69 = icmp eq i64 %68, 17
br i1 %69, label %70, label %47
70: ; preds = %47
%71 = getelementptr [6 x i8], [6 x i8]* %1, i64 0, i64 0
%72 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 1
%73 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 2
%74 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 3
%75 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 4
%76 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 5
%77 = getelementptr inbounds [7 x i8], [7 x i8]* %4, i64 0, i64 6
br label %78
78: ; preds = %70, %78
%79 = phi i64 [ 0, %70 ], [ %80, %78 ]
%80 = add nuw nsw i64 %79, 1
%81 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 %80, i64 0
%82 = load i64, i64* %81
%83 = lshr i64 %82, 20
%84 = trunc i64 %83 to i8
store i8 %84, i8* %7
%85 = lshr i64 %82, 12
%86 = trunc i64 %85 to i8
store i8 %86, i8* %72
%87 = lshr i64 %82, 4
%88 = trunc i64 %87 to i8
store i8 %88, i8* %73
%89 = shl i64 %82, 4
%90 = getelementptr inbounds [17 x [2 x i64]], [17 x [2 x i64]]* %3, i64 0, i64 %80, i64 1
%91 = load i64, i64* %90
%92 = lshr i64 %91, 24
%93 = and i64 %92, 15
%94 = or i64 %93, %89
%95 = trunc i64 %94 to i8
store i8 %95, i8* %74
%96 = lshr i64 %91, 16
%97 = trunc i64 %96 to i8
store i8 %97, i8* %75
%98 = lshr i64 %91, 8
%99 = trunc i64 %98 to i8
store i8 %99, i8* %76
%100 = trunc i64 %91 to i8
store i8 %100, i8* %77
%101 = getelementptr inbounds [6 x i8], [6 x i8]* %1, i64 %79, i64 0
%102 = call i32 (i8*, i64, i8*, i8*, ...) bitcast (i32 (...)* @McbMapTrueBits to i32 (i8*, i64, i8*, i8*, ...)*)(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @McbCreateSubKeys.tblPC2, i64 0, i64 0), i64 48, i8* %7, i8* %101)
%103 = icmp eq i64 %80, 16
br i1 %103, label %104, label %78
104: ; preds = %78
ret void
}