void unshuffle64(long long a[], int n, int n2, long long tmp[]) {
  int i;
  int nhalf;
  long long *p1, *p2, *pt;
  nhalf = (n + 1) >> 1;
  pt = tmp;
  p1 = &a[n2 * nhalf];
  for (i = nhalf; i < n; i++) {
    *pt = *p1;
    p1 += n2;
    pt += 1;
  }
  p2 = &a[n2 * (nhalf - 1)];
  p1 = &a[(n2 * (nhalf - 1)) << 1];
  for (i = nhalf - 1; i >= 0; i--) {
    *p1 = *p2;
    p2 -= n2;
    p1 -= (n2 + n2);
  }
  pt = tmp;
  p1 = &a[n2];
  for (i = 1; i < n; i += 2) {
    *p1 = *pt;
    p1 += (n2 + n2);
    pt += 1;
  }
}


x86 assembly (clang, -O0):
<unshuffle64>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    118e <unshuffle64+0x8e>
mov    -0x28(%rbp),%rax
mov    (%rax),%rcx
mov    -0x38(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1145 <unshuffle64+0x45>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
mov    -0x20(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
mov    -0x20(%rbp),%edx
sub    $0x1,%edx
imul   %edx,%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     1233 <unshuffle64+0x133>
mov    -0x30(%rbp),%rax
mov    (%rax),%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%ecx
add    -0x10(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    11d6 <unshuffle64+0xd6>
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12a1 <unshuffle64+0x1a1>
mov    -0x38(%rbp),%rax
mov    (%rax),%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%ecx
add    -0x10(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x1c(%rbp)
jmp    1255 <unshuffle64+0x155>
pop    %rbp
ret

x86 assembly (clang, -O2):
<unshuffle64>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
lea    0x1(%rsi),%r9d
sar    %r9d
movslq %edx,%r8
cmp    %esi,%r9d
jge    1207 <unshuffle64+0x107>
mov    %r9d,%eax
imul   %edx,%eax
cltq
lea    (%rdi,%rax,8),%rax
mov    %esi,%r15d
sub    %r9d,%r15d
mov    %r9d,%r11d
not    %r11d
add    %esi,%r11d
and    $0x7,%r15d
je     1175 <unshuffle64+0x75>
lea    0x0(,%r8,8),%r14
neg    %r15d
xor    %ebx,%ebx
mov    %rcx,%r10
nopl   0x0(%rax)
mov    (%rax),%rbp
mov    %rbp,(%r10)
add    $0x8,%r10
add    %r14,%rax
add    $0xffffffff,%ebx
cmp    %ebx,%r15d
jne    1150 <unshuffle64+0x50>
mov    %r9d,%ebp
sub    %ebx,%ebp
cmp    $0x7,%r11d
jae    1185 <unshuffle64+0x85>
jmp    1207 <unshuffle64+0x107>
mov    %rcx,%r10
mov    %r9d,%ebp
cmp    $0x7,%r11d
jb     1207 <unshuffle64+0x107>
mov    %esi,%r11d
sub    %ebp,%r11d
lea    0x0(,%r8,8),%r14
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%rax),%rbp
mov    %rbp,(%r10,%rbx,8)
mov    (%rax,%r14,1),%rbp
add    %r14,%rax
mov    %rbp,0x8(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x10(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x18(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x20(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x28(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x30(%r10,%rbx,8)
mov    (%r14,%rax,1),%rbp
add    %r14,%rax
mov    %rbp,0x38(%r10,%rbx,8)
add    $0x8,%rbx
add    %r14,%rax
cmp    %ebx,%r11d
jne    11a0 <unshuffle64+0xa0>
test   %esi,%esi
jle    13f2 <unshuffle64+0x2f2>
lea    -0x1(%r9),%r10d
mov    %r10d,%eax
imul   %edx,%eax
lea    (%rax,%rax,1),%ebp
movslq %ebp,%rbp
lea    (%rdi,%rbp,8),%r11
cltq
lea    (%rdi,%rax,8),%rax
add    %edx,%edx
movslq %edx,%r14
xor    %ebx,%ebx
test   %r10d,%r10d
mov    $0x0,%r15d
cmovs  %r10d,%r15d
mov    %r9d,%r12d
sub    %r15d,%r12d
not    %r15d
add    %r9d,%r15d
and    $0x7,%r12d
je     1287 <unshuffle64+0x187>
lea    0x0(,%r8,8),%r9
neg    %r9
lea    0x0(,%r14,8),%rbp
neg    %rbp
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%rax),%rdx
mov    %rdx,(%r11)
add    $0x1,%ebx
add    %r9,%rax
add    %rbp,%r11
cmp    %ebx,%r12d
jne    1270 <unshuffle64+0x170>
sub    %ebx,%r10d
cmp    $0x7,%r15d
jb     1328 <unshuffle64+0x228>
add    $0x8,%r10d
lea    0x0(,%r8,8),%rdx
neg    %rdx
lea    0x0(,%r14,8),%rbx
neg    %rbx
nopl   0x0(%rax,%rax,1)
mov    (%rax),%rbp
mov    %rbp,(%r11)
mov    (%rax,%rdx,1),%rbp
add    %rdx,%rax
mov    %rbp,(%r11,%rbx,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
mov    (%rdx,%rax,1),%rbp
add    %rdx,%rax
mov    %rbp,(%rbx,%r11,1)
add    %rbx,%r11
add    $0xfffffff8,%r10d
add    %rdx,%rax
add    %rbx,%r11
cmp    $0x7,%r10d
jg     12b0 <unshuffle64+0x1b0>
cmp    $0x2,%esi
jl     13f2 <unshuffle64+0x2f2>
lea    (%rdi,%r8,8),%rax
add    $0xfffffffe,%esi
mov    %esi,%edi
shr    %edi
lea    0x1(%rdi),%r8d
cmp    $0xe,%esi
jb     13c9 <unshuffle64+0x2c9>
mov    %r8d,%esi
and    $0xfffffff8,%esi
mov    %r14,%r9
shl    $0x6,%r9
lea    0x0(,%r14,8),%rbx
xchg   %ax,%ax
mov    %rax,%rdx
mov    (%rcx),%rax
mov    %rax,(%rdx)
mov    0x8(%rcx),%rbp
lea    (%rdx,%rbx,1),%rax
mov    %rbp,(%rdx,%rbx,1)
mov    0x10(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
mov    0x18(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
mov    0x20(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
mov    0x28(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
mov    0x30(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
mov    0x38(%rcx),%rbp
mov    %rbp,(%rbx,%rax,1)
add    %rbx,%rax
add    $0x40,%rcx
add    %rbx,%rax
add    $0xfffffff8,%esi
jne    1360 <unshuffle64+0x260>
add    %r9,%rdx
mov    %rdx,%rax
test   $0x7,%r8b
je     13f2 <unshuffle64+0x2f2>
shl    $0x3,%r14
add    $0x1,%dil
movzbl %dil,%edx
and    $0x7,%edx
xor    %esi,%esi
mov    (%rcx,%rsi,8),%rdi
mov    %rdi,(%rax)
add    $0x1,%rsi
add    %r14,%rax
cmp    %esi,%edx
jne    13e0 <unshuffle64+0x2e0>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @unshuffle64(i64* nocapture %0, i32 %1, i32 %2, i64* nocapture %3) {
%5 = add nsw i32 %1, 1
%6 = ashr i32 %5, 1
%7 = icmp slt i32 %6, %1
br i1 %7, label %8, label %64
8: ; preds = %4
%9 = mul nsw i32 %6, %2
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds i64, i64* %0, i64 %10
%12 = sext i32 %2 to i64
%13 = sub i32 %1, %6
%14 = xor i32 %6, -1
%15 = add i32 %14, %1
%16 = and i32 %13, 7
%17 = icmp eq i32 %16, 0
br i1 %17, label %29, label %18
18: ; preds = %8, %18
%19 = phi i64* [ %25, %18 ], [ %3, %8 ]
%20 = phi i64* [ %24, %18 ], [ %11, %8 ]
%21 = phi i32 [ %26, %18 ], [ %6, %8 ]
%22 = phi i32 [ %27, %18 ], [ 0, %8 ]
%23 = load i64, i64* %20
store i64 %23, i64* %19
%24 = getelementptr inbounds i64, i64* %20, i64 %12
%25 = getelementptr inbounds i64, i64* %19, i64 1
%26 = add nsw i32 %21, 1
%27 = add i32 %22, 1
%28 = icmp eq i32 %27, %16
br i1 %28, label %29, label %18
29: ; preds = %18, %8
%30 = phi i64* [ %3, %8 ], [ %25, %18 ]
%31 = phi i64* [ %11, %8 ], [ %24, %18 ]
%32 = phi i32 [ %6, %8 ], [ %26, %18 ]
%33 = icmp ult i32 %15, 7
br i1 %33, label %64, label %34
34: ; preds = %29, %34
%35 = phi i64* [ %61, %34 ], [ %30, %29 ]
%36 = phi i64* [ %60, %34 ], [ %31, %29 ]
%37 = phi i32 [ %62, %34 ], [ %32, %29 ]
%38 = load i64, i64* %36
store i64 %38, i64* %35
%39 = getelementptr inbounds i64, i64* %36, i64 %12
%40 = getelementptr inbounds i64, i64* %35, i64 1
%41 = load i64, i64* %39
store i64 %41, i64* %40
%42 = getelementptr inbounds i64, i64* %39, i64 %12
%43 = getelementptr inbounds i64, i64* %35, i64 2
%44 = load i64, i64* %42
store i64 %44, i64* %43
%45 = getelementptr inbounds i64, i64* %42, i64 %12
%46 = getelementptr inbounds i64, i64* %35, i64 3
%47 = load i64, i64* %45
store i64 %47, i64* %46
%48 = getelementptr inbounds i64, i64* %45, i64 %12
%49 = getelementptr inbounds i64, i64* %35, i64 4
%50 = load i64, i64* %48
store i64 %50, i64* %49
%51 = getelementptr inbounds i64, i64* %48, i64 %12
%52 = getelementptr inbounds i64, i64* %35, i64 5
%53 = load i64, i64* %51
store i64 %53, i64* %52
%54 = getelementptr inbounds i64, i64* %51, i64 %12
%55 = getelementptr inbounds i64, i64* %35, i64 6
%56 = load i64, i64* %54
store i64 %56, i64* %55
%57 = getelementptr inbounds i64, i64* %54, i64 %12
%58 = getelementptr inbounds i64, i64* %35, i64 7
%59 = load i64, i64* %57
store i64 %59, i64* %58
%60 = getelementptr inbounds i64, i64* %57, i64 %12
%61 = getelementptr inbounds i64, i64* %35, i64 8
%62 = add nsw i32 %37, 8
%63 = icmp eq i32 %62, %1
br i1 %63, label %64, label %34
64: ; preds = %29, %34, %4
%65 = add nsw i32 %6, -1
%66 = mul nsw i32 %65, %2
%67 = icmp sgt i32 %1, 0
br i1 %67, label %68, label %188
68: ; preds = %64
%69 = shl i32 %66, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i64, i64* %0, i64 %70
%72 = sext i32 %66 to i64
%73 = getelementptr inbounds i64, i64* %0, i64 %72
%74 = sext i32 %2 to i64
%75 = sub nsw i64 0, %74
%76 = shl nsw i32 %2, 1
%77 = sext i32 %76 to i64
%78 = sub nsw i64 0, %77
%79 = call i32 @llvm.smin.i32(i32 %65, i32 0)
%80 = sub i32 %6, %79
%81 = xor i32 %79, -1
%82 = add i32 %6, %81
%83 = and i32 %80, 7
%84 = icmp eq i32 %83, 0
br i1 %84, label %96, label %85
85: ; preds = %68, %85
%86 = phi i64* [ %91, %85 ], [ %73, %68 ]
%87 = phi i64* [ %92, %85 ], [ %71, %68 ]
%88 = phi i32 [ %93, %85 ], [ %65, %68 ]
%89 = phi i32 [ %94, %85 ], [ 0, %68 ]
%90 = load i64, i64* %86
store i64 %90, i64* %87
%91 = getelementptr inbounds i64, i64* %86, i64 %75
%92 = getelementptr inbounds i64, i64* %87, i64 %78
%93 = add nsw i32 %88, -1
%94 = add i32 %89, 1
%95 = icmp eq i32 %94, %83
br i1 %95, label %96, label %85
96: ; preds = %85, %68
%97 = phi i64* [ %73, %68 ], [ %91, %85 ]
%98 = phi i64* [ %71, %68 ], [ %92, %85 ]
%99 = phi i32 [ %65, %68 ], [ %93, %85 ]
%100 = icmp ult i32 %82, 7
br i1 %100, label %131, label %101
101: ; preds = %96, %101
%102 = phi i64* [ %127, %101 ], [ %97, %96 ]
%103 = phi i64* [ %128, %101 ], [ %98, %96 ]
%104 = phi i32 [ %129, %101 ], [ %99, %96 ]
%105 = load i64, i64* %102
store i64 %105, i64* %103
%106 = getelementptr inbounds i64, i64* %102, i64 %75
%107 = getelementptr inbounds i64, i64* %103, i64 %78
%108 = load i64, i64* %106
store i64 %108, i64* %107
%109 = getelementptr inbounds i64, i64* %106, i64 %75
%110 = getelementptr inbounds i64, i64* %107, i64 %78
%111 = load i64, i64* %109
store i64 %111, i64* %110
%112 = getelementptr inbounds i64, i64* %109, i64 %75
%113 = getelementptr inbounds i64, i64* %110, i64 %78
%114 = load i64, i64* %112
store i64 %114, i64* %113
%115 = getelementptr inbounds i64, i64* %112, i64 %75
%116 = getelementptr inbounds i64, i64* %113, i64 %78
%117 = load i64, i64* %115
store i64 %117, i64* %116
%118 = getelementptr inbounds i64, i64* %115, i64 %75
%119 = getelementptr inbounds i64, i64* %116, i64 %78
%120 = load i64, i64* %118
store i64 %120, i64* %119
%121 = getelementptr inbounds i64, i64* %118, i64 %75
%122 = getelementptr inbounds i64, i64* %119, i64 %78
%123 = load i64, i64* %121
store i64 %123, i64* %122
%124 = getelementptr inbounds i64, i64* %121, i64 %75
%125 = getelementptr inbounds i64, i64* %122, i64 %78
%126 = load i64, i64* %124
store i64 %126, i64* %125
%127 = getelementptr inbounds i64, i64* %124, i64 %75
%128 = getelementptr inbounds i64, i64* %125, i64 %78
%129 = add nsw i32 %104, -8
%130 = icmp sgt i32 %104, 7
br i1 %130, label %101, label %131
131: ; preds = %101, %96
%132 = icmp sgt i32 %1, 1
br i1 %132, label %133, label %188
133: ; preds = %131
%134 = sext i32 %2 to i64
%135 = getelementptr inbounds i64, i64* %0, i64 %134
%136 = shl nsw i32 %2, 1
%137 = sext i32 %136 to i64
%138 = add i32 %1, -2
%139 = lshr i32 %138, 1
%140 = add nuw i32 %139, 1
%141 = and i32 %140, 7
%142 = icmp ult i32 %138, 14
br i1 %142, label %175, label %143
143: ; preds = %133
%144 = and i32 %140, -8
br label %145
145: ; preds = %145, %143
%146 = phi i64* [ %3, %143 ], [ %172, %145 ]
%147 = phi i64* [ %135, %143 ], [ %171, %145 ]
%148 = phi i32 [ 0, %143 ], [ %173, %145 ]
%149 = load i64, i64* %146
store i64 %149, i64* %147
%150 = getelementptr inbounds i64, i64* %147, i64 %137
%151 = getelementptr inbounds i64, i64* %146, i64 1
%152 = load i64, i64* %151
store i64 %152, i64* %150
%153 = getelementptr inbounds i64, i64* %150, i64 %137
%154 = getelementptr inbounds i64, i64* %146, i64 2
%155 = load i64, i64* %154
store i64 %155, i64* %153
%156 = getelementptr inbounds i64, i64* %153, i64 %137
%157 = getelementptr inbounds i64, i64* %146, i64 3
%158 = load i64, i64* %157
store i64 %158, i64* %156
%159 = getelementptr inbounds i64, i64* %156, i64 %137
%160 = getelementptr inbounds i64, i64* %146, i64 4
%161 = load i64, i64* %160
store i64 %161, i64* %159
%162 = getelementptr inbounds i64, i64* %159, i64 %137
%163 = getelementptr inbounds i64, i64* %146, i64 5
%164 = load i64, i64* %163
store i64 %164, i64* %162
%165 = getelementptr inbounds i64, i64* %162, i64 %137
%166 = getelementptr inbounds i64, i64* %146, i64 6
%167 = load i64, i64* %166
store i64 %167, i64* %165
%168 = getelementptr inbounds i64, i64* %165, i64 %137
%169 = getelementptr inbounds i64, i64* %146, i64 7
%170 = load i64, i64* %169
store i64 %170, i64* %168
%171 = getelementptr inbounds i64, i64* %168, i64 %137
%172 = getelementptr inbounds i64, i64* %146, i64 8
%173 = add i32 %148, 8
%174 = icmp eq i32 %173, %144
br i1 %174, label %175, label %145
175: ; preds = %145, %133
%176 = phi i64* [ %3, %133 ], [ %172, %145 ]
%177 = phi i64* [ %135, %133 ], [ %171, %145 ]
%178 = icmp eq i32 %141, 0
br i1 %178, label %188, label %179
179: ; preds = %175, %179
%180 = phi i64* [ %185, %179 ], [ %176, %175 ]
%181 = phi i64* [ %184, %179 ], [ %177, %175 ]
%182 = phi i32 [ %186, %179 ], [ 0, %175 ]
%183 = load i64, i64* %180
store i64 %183, i64* %181
%184 = getelementptr inbounds i64, i64* %181, i64 %137
%185 = getelementptr inbounds i64, i64* %180, i64 1
%186 = add i32 %182, 1
%187 = icmp eq i32 %186, %141
br i1 %187, label %188, label %179
188: ; preds = %175, %179, %64, %131
ret void
}