void hc_fftw_to_half_mx(register double *Xr, register double *Xi,
                        register double *X, long N) {
  register long k;
  long Nover2 = N >> 1;
  if (N & 1) {
    Xr[0] = X[0];
    Xi[0] = 0.0;
    for (k = 1; k < ((N + 1) >> 1); ++k) {
      Xr[k] = X[k];
      Xi[k] = X[N - k];
    }
  } else {
    Xr[0] = X[0];
    Xi[0] = 0.0;
    for (k = 1; k < (Nover2); ++k) {
      Xr[k] = X[k];
      Xi[k] = X[N - k];
    }
    Xr[Nover2] = X[Nover2];
    Xi[Nover2] = 0.0;
  }
}


x86 assembly (clang, -O0):
<hc_fftw_to_half_mx>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
sar    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     11bc <hc_fftw_to_half_mx+0xbc>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movq   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x1,%rcx
sar    $0x1,%rcx
cmp    %rcx,%rax
jge    11b7 <hc_fftw_to_half_mx+0xb7>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1155 <hc_fftw_to_half_mx+0x55>
jmp    1260 <hc_fftw_to_half_mx+0x160>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
movq   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    1236 <hc_fftw_to_half_mx+0x136>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11df <hc_fftw_to_half_mx+0xdf>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<hc_fftw_to_half_mx>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rdi)
movq   $0x0,(%rsi)
test   $0x1,%cl
jne    1394 <hc_fftw_to_half_mx+0x294>
mov    %rcx,%r8
sar    %r8
cmp    $0x4,%rcx
jl     137b <hc_fftw_to_half_mx+0x27b>
cmp    $0x3,%r8
mov    $0x2,%r11d
cmovge %r8,%r11
lea    -0x1(%r11),%rax
mov    $0x1,%r9d
cmp    $0x4,%rax
jb     12ec <hc_fftw_to_half_mx+0x1ec>
mov    %rax,-0x8(%rsp)
lea    0x8(%rdi),%rbp
lea    (%rdi,%r11,8),%rbx
lea    0x8(%rsi),%r14
lea    (%rsi,%r11,8),%r12
mov    %rcx,%rax
sub    %r11,%rax
lea    (%rdx,%rax,8),%rax
add    $0x8,%rax
lea    (%rdx,%rcx,8),%r15
lea    0x8(%rdx),%r10
lea    (%rdx,%r11,8),%r13
cmp    %r12,%rbp
setb   -0x11(%rsp)
cmp    %rbx,%r14
setb   -0x12(%rsp)
cmp    %r15,%rbp
setb   -0x10(%rsp)
cmp    %rbx,%rax
setb   -0x13(%rsp)
cmp    %r13,%rbp
setb   %bpl
cmp    %rbx,%r10
setb   -0x14(%rsp)
cmp    %r15,%r14
setb   %bl
cmp    %r12,%rax
setb   %r15b
cmp    %r13,%r14
setb   %r14b
cmp    %r12,%r10
setb   %r10b
mov    -0x12(%rsp),%al
test   %al,-0x11(%rsp)
jne    12ec <hc_fftw_to_half_mx+0x1ec>
mov    -0x13(%rsp),%al
and    %al,-0x10(%rsp)
jne    12ec <hc_fftw_to_half_mx+0x1ec>
and    -0x14(%rsp),%bpl
jne    12ec <hc_fftw_to_half_mx+0x1ec>
and    %r15b,%bl
jne    12ec <hc_fftw_to_half_mx+0x1ec>
and    %r10b,%r14b
jne    12ec <hc_fftw_to_half_mx+0x1ec>
mov    -0x8(%rsp),%r10
mov    %r10,%r9
and    $0xfffffffffffffffc,%r9
lea    -0x4(%r9),%rax
mov    %rax,%r14
shr    $0x2,%r14
add    $0x1,%r14
test   %rax,%rax
je     1602 <hc_fftw_to_half_mx+0x502>
mov    %r14,%r15
and    $0xfffffffffffffffe,%r15
lea    (%rdx,%rcx,8),%rbx
add    $0xfffffffffffffff0,%rbx
mov    $0x1,%eax
xchg   %ax,%ax
movups (%rdx,%rax,8),%xmm0
movups 0x10(%rdx,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
movups -0x10(%rbx),%xmm0
movups (%rbx),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,(%rsi,%rax,8)
movups %xmm0,0x10(%rsi,%rax,8)
movups 0x20(%rdx,%rax,8),%xmm0
movups 0x30(%rdx,%rax,8),%xmm1
movups %xmm0,0x20(%rdi,%rax,8)
movups %xmm1,0x30(%rdi,%rax,8)
movups -0x30(%rbx),%xmm0
movups -0x20(%rbx),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,0x20(%rsi,%rax,8)
movups %xmm0,0x30(%rsi,%rax,8)
add    $0x8,%rax
add    $0xffffffffffffffc0,%rbx
add    $0xfffffffffffffffe,%r15
jne    1240 <hc_fftw_to_half_mx+0x140>
test   $0x1,%r14b
je     12df <hc_fftw_to_half_mx+0x1df>
movups (%rdx,%rax,8),%xmm0
movups 0x10(%rdx,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
mov    %rcx,%rbp
sub    %rax,%rbp
movups -0x18(%rdx,%rbp,8),%xmm0
movups -0x8(%rdx,%rbp,8),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,(%rsi,%rax,8)
movups %xmm0,0x10(%rsi,%rax,8)
cmp    %r9,%r10
je     137b <hc_fftw_to_half_mx+0x27b>
or     $0x1,%r9
lea    0x1(%r9),%rax
test   $0x1,%r11b
jne    1316 <hc_fftw_to_half_mx+0x216>
movsd  (%rdx,%r9,8),%xmm0
movsd  %xmm0,(%rdi,%r9,8)
mov    %rcx,%rbp
sub    %r9,%rbp
movsd  (%rdx,%rbp,8),%xmm0
movsd  %xmm0,(%rsi,%r9,8)
mov    %rax,%r9
cmp    %rax,%r11
je     137b <hc_fftw_to_half_mx+0x27b>
sub    %r9,%r11
lea    (%rsi,%r9,8),%r10
add    $0x8,%r10
sub    %r9,%rcx
lea    (%rdx,%rcx,8),%rcx
lea    (%rdi,%r9,8),%r14
add    $0x8,%r14
lea    (%rdx,%r9,8),%rax
add    $0x8,%rax
xor    %ebx,%ebx
nop
movsd  -0x8(%rax,%rbx,8),%xmm0
movsd  %xmm0,-0x8(%r14,%rbx,8)
movsd  (%rcx),%xmm0
movsd  %xmm0,-0x8(%r10,%rbx,8)
movsd  (%rax,%rbx,8),%xmm0
movsd  %xmm0,(%r14,%rbx,8)
movsd  -0x8(%rcx),%xmm0
movsd  %xmm0,(%r10,%rbx,8)
add    $0x2,%rbx
add    $0xfffffffffffffff0,%rcx
cmp    %rbx,%r11
jne    1340 <hc_fftw_to_half_mx+0x240>
movsd  (%rdx,%r8,8),%xmm0
movsd  %xmm0,(%rdi,%r8,8)
movq   $0x0,(%rsi,%r8,8)
jmp    15f7 <hc_fftw_to_half_mx+0x4f7>
cmp    $0x3,%rcx
jl     15f7 <hc_fftw_to_half_mx+0x4f7>
lea    0x1(%rcx),%rbp
mov    %rbp,%r11
shr    %r11
lea    -0x1(%r11),%rax
mov    $0x1,%r8d
cmp    $0x4,%rax
jb     1563 <hc_fftw_to_half_mx+0x463>
mov    %rax,-0x8(%rsp)
mov    %rbp,-0x10(%rsp)
lea    0x8(%rdi),%rbp
lea    (%rdi,%r11,8),%rbx
lea    0x8(%rsi),%r14
lea    (%rsi,%r11,8),%r13
mov    %rcx,%rax
sub    %r11,%rax
lea    (%rdx,%rax,8),%rax
add    $0x8,%rax
lea    (%rdx,%rcx,8),%r12
lea    0x8(%rdx),%r15
lea    (%rdx,%r11,8),%r10
cmp    %r13,%rbp
setb   -0x11(%rsp)
cmp    %rbx,%r14
setb   -0x12(%rsp)
cmp    %r12,%rbp
setb   %r9b
cmp    %rbx,%rax
setb   -0x13(%rsp)
cmp    %r10,%rbp
setb   %bpl
cmp    %rbx,%r15
setb   %bl
cmp    %r12,%r14
setb   %r12b
cmp    %r13,%rax
setb   -0x14(%rsp)
cmp    %r10,%r14
setb   %r14b
cmp    %r13,%r15
setb   %r10b
mov    -0x12(%rsp),%al
test   %al,-0x11(%rsp)
jne    155e <hc_fftw_to_half_mx+0x45e>
and    -0x13(%rsp),%r9b
jne    155e <hc_fftw_to_half_mx+0x45e>
and    %bl,%bpl
jne    155e <hc_fftw_to_half_mx+0x45e>
and    -0x14(%rsp),%r12b
jne    155e <hc_fftw_to_half_mx+0x45e>
and    %r10b,%r14b
mov    -0x10(%rsp),%rbp
jne    1563 <hc_fftw_to_half_mx+0x463>
mov    -0x8(%rsp),%r9
mov    %r9,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rax
mov    %rax,%r14
shr    $0x2,%r14
add    $0x1,%r14
test   %rax,%rax
je     1616 <hc_fftw_to_half_mx+0x516>
mov    %r14,%r15
and    $0xfffffffffffffffe,%r15
lea    (%rdx,%rcx,8),%rbx
add    $0xfffffffffffffff0,%rbx
mov    $0x1,%eax
nopl   0x0(%rax)
movups (%rdx,%rax,8),%xmm0
movups 0x10(%rdx,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
movups -0x10(%rbx),%xmm0
movups (%rbx),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,(%rsi,%rax,8)
movups %xmm0,0x10(%rsi,%rax,8)
movups 0x20(%rdx,%rax,8),%xmm0
movups 0x30(%rdx,%rax,8),%xmm1
movups %xmm0,0x20(%rdi,%rax,8)
movups %xmm1,0x30(%rdi,%rax,8)
movups -0x30(%rbx),%xmm0
movups -0x20(%rbx),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,0x20(%rsi,%rax,8)
movups %xmm0,0x30(%rsi,%rax,8)
add    $0x8,%rax
add    $0xffffffffffffffc0,%rbx
add    $0xfffffffffffffffe,%r15
jne    14b0 <hc_fftw_to_half_mx+0x3b0>
test   $0x1,%r14b
je     154f <hc_fftw_to_half_mx+0x44f>
movups (%rdx,%rax,8),%xmm0
movups 0x10(%rdx,%rax,8),%xmm1
movups %xmm0,(%rdi,%rax,8)
movups %xmm1,0x10(%rdi,%rax,8)
mov    %rcx,%rbx
sub    %rax,%rbx
movups -0x18(%rdx,%rbx,8),%xmm0
movups -0x8(%rdx,%rbx,8),%xmm1
shufps $0x4e,%xmm1,%xmm1
shufps $0x4e,%xmm0,%xmm0
movups %xmm1,(%rsi,%rax,8)
movups %xmm0,0x10(%rsi,%rax,8)
cmp    %r8,%r9
je     15f7 <hc_fftw_to_half_mx+0x4f7>
or     $0x1,%r8
jmp    1563 <hc_fftw_to_half_mx+0x463>
mov    -0x10(%rsp),%rbp
lea    0x1(%r8),%rax
test   $0x2,%bpl
jne    158d <hc_fftw_to_half_mx+0x48d>
movsd  (%rdx,%r8,8),%xmm0
movsd  %xmm0,(%rdi,%r8,8)
mov    %rcx,%rbp
sub    %r8,%rbp
movsd  (%rdx,%rbp,8),%xmm0
movsd  %xmm0,(%rsi,%r8,8)
mov    %rax,%r8
cmp    %rax,%r11
je     15f7 <hc_fftw_to_half_mx+0x4f7>
sub    %r8,%r11
lea    (%rsi,%r8,8),%rax
add    $0x8,%rax
sub    %r8,%rcx
lea    (%rdx,%rcx,8),%rcx
lea    (%rdi,%r8,8),%rsi
add    $0x8,%rsi
lea    (%rdx,%r8,8),%rdx
add    $0x8,%rdx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
movsd  -0x8(%rdx,%rdi,8),%xmm0
movsd  %xmm0,-0x8(%rsi,%rdi,8)
movsd  (%rcx),%xmm0
movsd  %xmm0,-0x8(%rax,%rdi,8)
movsd  (%rdx,%rdi,8),%xmm0
movsd  %xmm0,(%rsi,%rdi,8)
movsd  -0x8(%rcx),%xmm0
movsd  %xmm0,(%rax,%rdi,8)
add    $0x2,%rdi
add    $0xfffffffffffffff0,%rcx
cmp    %rdi,%r11
jne    15c0 <hc_fftw_to_half_mx+0x4c0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x1,%eax
test   $0x1,%r14b
jne    12ac <hc_fftw_to_half_mx+0x1ac>
jmp    12df <hc_fftw_to_half_mx+0x1df>
mov    $0x1,%eax
test   $0x1,%r14b
jne    151c <hc_fftw_to_half_mx+0x41c>
jmp    154f <hc_fftw_to_half_mx+0x44f>

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

LLVM IR (-O2):
define void @hc_fftw_to_half_mx(double* nocapture writeonly %0, double* nocapture writeonly %1, double* nocapture %2, i64 %3) {
%5 = ashr i64 %3, 1
%6 = and i64 %3, 1
%7 = icmp eq i64 %6, 0
%8 = load double, double* %2
store double %8, double* %0
store double 0.000000e+00, double* %1
br i1 %7, label %183, label %9
9: ; preds = %4
%10 = icmp sgt i64 %3, 2
br i1 %10, label %11, label %361
11: ; preds = %9
%12 = add nuw nsw i64 %3, 1
%13 = lshr i64 %12, 1
%14 = add nsw i64 %13, -1
%15 = icmp ult i64 %14, 4
br i1 %15, label %147, label %16
16: ; preds = %11
%17 = getelementptr double, double* %0, i64 1
%18 = getelementptr double, double* %0, i64 %13
%19 = getelementptr double, double* %1, i64 1
%20 = getelementptr double, double* %1, i64 %13
%21 = add i64 %3, 1
%22 = sub i64 %21, %13
%23 = getelementptr double, double* %2, i64 %22
%24 = getelementptr double, double* %2, i64 %3
%25 = getelementptr double, double* %2, i64 1
%26 = getelementptr double, double* %2, i64 %13
%27 = icmp ult double* %17, %20
%28 = icmp ult double* %19, %18
%29 = and i1 %27, %28
%30 = icmp ult double* %17, %24
%31 = icmp ult double* %23, %18
%32 = and i1 %30, %31
%33 = or i1 %29, %32
%34 = icmp ult double* %17, %26
%35 = icmp ult double* %25, %18
%36 = and i1 %34, %35
%37 = or i1 %33, %36
%38 = icmp ult double* %19, %24
%39 = icmp ult double* %23, %20
%40 = and i1 %38, %39
%41 = or i1 %37, %40
%42 = icmp ult double* %19, %26
%43 = icmp ult double* %25, %20
%44 = and i1 %42, %43
%45 = or i1 %41, %44
br i1 %45, label %147, label %46
46: ; preds = %16
%47 = and i64 %14, -4
%48 = or i64 %47, 1
%49 = add i64 %47, -4
%50 = lshr exact i64 %49, 2
%51 = add nuw nsw i64 %50, 1
%52 = and i64 %51, 1
%53 = icmp eq i64 %49, 0
br i1 %53, label %116, label %54
54: ; preds = %46
%55 = and i64 %51, 9223372036854775806
br label %56
56: ; preds = %56, %54
%57 = phi i64 [ 0, %54 ], [ %111, %56 ]
%58 = phi i64 [ 0, %54 ], [ %112, %56 ]
%59 = or i64 %57, 1
%60 = getelementptr inbounds double, double* %2, i64 %59
%61 = bitcast double* %60 to <2 x double>*
%62 = load <2 x double>, <2 x double>* %61
%63 = getelementptr inbounds double, double* %60, i64 2
%64 = bitcast double* %63 to <2 x double>*
%65 = load <2 x double>, <2 x double>* %64
%66 = getelementptr inbounds double, double* %0, i64 %59
%67 = bitcast double* %66 to <2 x double>*
store <2 x double> %62, <2 x double>* %67
%68 = getelementptr inbounds double, double* %66, i64 2
%69 = bitcast double* %68 to <2 x double>*
store <2 x double> %65, <2 x double>* %69
%70 = sub nsw i64 %3, %59
%71 = getelementptr inbounds double, double* %2, i64 %70
%72 = getelementptr inbounds double, double* %71, i64 -1
%73 = bitcast double* %72 to <2 x double>*
%74 = load <2 x double>, <2 x double>* %73
%75 = shufflevector <2 x double> %74, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%76 = getelementptr inbounds double, double* %71, i64 -2
%77 = getelementptr inbounds double, double* %76, i64 -1
%78 = bitcast double* %77 to <2 x double>*
%79 = load <2 x double>, <2 x double>* %78
%80 = shufflevector <2 x double> %79, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%81 = getelementptr inbounds double, double* %1, i64 %59
%82 = bitcast double* %81 to <2 x double>*
store <2 x double> %75, <2 x double>* %82
%83 = getelementptr inbounds double, double* %81, i64 2
%84 = bitcast double* %83 to <2 x double>*
store <2 x double> %80, <2 x double>* %84
%85 = or i64 %57, 5
%86 = getelementptr inbounds double, double* %2, i64 %85
%87 = bitcast double* %86 to <2 x double>*
%88 = load <2 x double>, <2 x double>* %87
%89 = getelementptr inbounds double, double* %86, i64 2
%90 = bitcast double* %89 to <2 x double>*
%91 = load <2 x double>, <2 x double>* %90
%92 = getelementptr inbounds double, double* %0, i64 %85
%93 = bitcast double* %92 to <2 x double>*
store <2 x double> %88, <2 x double>* %93
%94 = getelementptr inbounds double, double* %92, i64 2
%95 = bitcast double* %94 to <2 x double>*
store <2 x double> %91, <2 x double>* %95
%96 = sub nsw i64 %3, %85
%97 = getelementptr inbounds double, double* %2, i64 %96
%98 = getelementptr inbounds double, double* %97, i64 -1
%99 = bitcast double* %98 to <2 x double>*
%100 = load <2 x double>, <2 x double>* %99
%101 = shufflevector <2 x double> %100, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%102 = getelementptr inbounds double, double* %97, i64 -2
%103 = getelementptr inbounds double, double* %102, i64 -1
%104 = bitcast double* %103 to <2 x double>*
%105 = load <2 x double>, <2 x double>* %104
%106 = shufflevector <2 x double> %105, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%107 = getelementptr inbounds double, double* %1, i64 %85
%108 = bitcast double* %107 to <2 x double>*
store <2 x double> %101, <2 x double>* %108
%109 = getelementptr inbounds double, double* %107, i64 2
%110 = bitcast double* %109 to <2 x double>*
store <2 x double> %106, <2 x double>* %110
%111 = add nuw i64 %57, 8
%112 = add i64 %58, 2
%113 = icmp eq i64 %112, %55
br i1 %113, label %114, label %56
114: ; preds = %56
%115 = or i64 %111, 1
br label %116
116: ; preds = %114, %46
%117 = phi i64 [ 1, %46 ], [ %115, %114 ]
%118 = icmp eq i64 %52, 0
br i1 %118, label %145, label %119
119: ; preds = %116
%120 = getelementptr inbounds double, double* %2, i64 %117
%121 = bitcast double* %120 to <2 x double>*
%122 = load <2 x double>, <2 x double>* %121
%123 = getelementptr inbounds double, double* %120, i64 2
%124 = bitcast double* %123 to <2 x double>*
%125 = load <2 x double>, <2 x double>* %124
%126 = getelementptr inbounds double, double* %0, i64 %117
%127 = bitcast double* %126 to <2 x double>*
store <2 x double> %122, <2 x double>* %127
%128 = getelementptr inbounds double, double* %126, i64 2
%129 = bitcast double* %128 to <2 x double>*
store <2 x double> %125, <2 x double>* %129
%130 = sub nsw i64 %3, %117
%131 = getelementptr inbounds double, double* %2, i64 %130
%132 = getelementptr inbounds double, double* %131, i64 -1
%133 = bitcast double* %132 to <2 x double>*
%134 = load <2 x double>, <2 x double>* %133
%135 = shufflevector <2 x double> %134, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%136 = getelementptr inbounds double, double* %131, i64 -2
%137 = getelementptr inbounds double, double* %136, i64 -1
%138 = bitcast double* %137 to <2 x double>*
%139 = load <2 x double>, <2 x double>* %138
%140 = shufflevector <2 x double> %139, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%141 = getelementptr inbounds double, double* %1, i64 %117
%142 = bitcast double* %141 to <2 x double>*
store <2 x double> %135, <2 x double>* %142
%143 = getelementptr inbounds double, double* %141, i64 2
%144 = bitcast double* %143 to <2 x double>*
store <2 x double> %140, <2 x double>* %144
br label %145
145: ; preds = %116, %119
%146 = icmp eq i64 %14, %47
br i1 %146, label %361, label %147
147: ; preds = %16, %11, %145
%148 = phi i64 [ 1, %16 ], [ 1, %11 ], [ %48, %145 ]
%149 = add i64 %148, 1
%150 = and i64 %12, 2
%151 = icmp eq i64 %150, 0
br i1 %151, label %152, label %161
152: ; preds = %147
%153 = getelementptr inbounds double, double* %2, i64 %148
%154 = load double, double* %153
%155 = getelementptr inbounds double, double* %0, i64 %148
store double %154, double* %155
%156 = sub nsw i64 %3, %148
%157 = getelementptr inbounds double, double* %2, i64 %156
%158 = load double, double* %157
%159 = getelementptr inbounds double, double* %1, i64 %148
store double %158, double* %159
%160 = add nuw nsw i64 %148, 1
br label %161
161: ; preds = %152, %147
%162 = phi i64 [ %148, %147 ], [ %160, %152 ]
%163 = icmp eq i64 %13, %149
br i1 %163, label %361, label %164
164: ; preds = %161, %164
%165 = phi i64 [ %181, %164 ], [ %162, %161 ]
%166 = getelementptr inbounds double, double* %2, i64 %165
%167 = load double, double* %166
%168 = getelementptr inbounds double, double* %0, i64 %165
store double %167, double* %168
%169 = sub nsw i64 %3, %165
%170 = getelementptr inbounds double, double* %2, i64 %169
%171 = load double, double* %170
%172 = getelementptr inbounds double, double* %1, i64 %165
store double %171, double* %172
%173 = add nuw nsw i64 %165, 1
%174 = getelementptr inbounds double, double* %2, i64 %173
%175 = load double, double* %174
%176 = getelementptr inbounds double, double* %0, i64 %173
store double %175, double* %176
%177 = sub nsw i64 %3, %173
%178 = getelementptr inbounds double, double* %2, i64 %177
%179 = load double, double* %178
%180 = getelementptr inbounds double, double* %1, i64 %173
store double %179, double* %180
%181 = add nuw nsw i64 %165, 2
%182 = icmp eq i64 %181, %13
br i1 %182, label %361, label %164
183: ; preds = %4
%184 = icmp sgt i64 %3, 3
br i1 %184, label %185, label %356
185: ; preds = %183
%186 = call i64 @llvm.smax.i64(i64 %5, i64 2)
%187 = add nsw i64 %186, -1
%188 = icmp ult i64 %187, 4
br i1 %188, label %320, label %189
189: ; preds = %185
%190 = getelementptr double, double* %0, i64 1
%191 = getelementptr double, double* %0, i64 %186
%192 = getelementptr double, double* %1, i64 1
%193 = getelementptr double, double* %1, i64 %186
%194 = add i64 %3, 1
%195 = sub i64 %194, %186
%196 = getelementptr double, double* %2, i64 %195
%197 = getelementptr double, double* %2, i64 %3
%198 = getelementptr double, double* %2, i64 1
%199 = getelementptr double, double* %2, i64 %186
%200 = icmp ult double* %190, %193
%201 = icmp ult double* %192, %191
%202 = and i1 %200, %201
%203 = icmp ult double* %190, %197
%204 = icmp ult double* %196, %191
%205 = and i1 %203, %204
%206 = or i1 %202, %205
%207 = icmp ult double* %190, %199
%208 = icmp ult double* %198, %191
%209 = and i1 %207, %208
%210 = or i1 %206, %209
%211 = icmp ult double* %192, %197
%212 = icmp ult double* %196, %193
%213 = and i1 %211, %212
%214 = or i1 %210, %213
%215 = icmp ult double* %192, %199
%216 = icmp ult double* %198, %193
%217 = and i1 %215, %216
%218 = or i1 %214, %217
br i1 %218, label %320, label %219
219: ; preds = %189
%220 = and i64 %187, -4
%221 = or i64 %220, 1
%222 = add nsw i64 %220, -4
%223 = lshr exact i64 %222, 2
%224 = add nuw nsw i64 %223, 1
%225 = and i64 %224, 1
%226 = icmp eq i64 %222, 0
br i1 %226, label %289, label %227
227: ; preds = %219
%228 = and i64 %224, 9223372036854775806
br label %229
229: ; preds = %229, %227
%230 = phi i64 [ 0, %227 ], [ %284, %229 ]
%231 = phi i64 [ 0, %227 ], [ %285, %229 ]
%232 = or i64 %230, 1
%233 = getelementptr inbounds double, double* %2, i64 %232
%234 = bitcast double* %233 to <2 x double>*
%235 = load <2 x double>, <2 x double>* %234
%236 = getelementptr inbounds double, double* %233, i64 2
%237 = bitcast double* %236 to <2 x double>*
%238 = load <2 x double>, <2 x double>* %237
%239 = getelementptr inbounds double, double* %0, i64 %232
%240 = bitcast double* %239 to <2 x double>*
store <2 x double> %235, <2 x double>* %240
%241 = getelementptr inbounds double, double* %239, i64 2
%242 = bitcast double* %241 to <2 x double>*
store <2 x double> %238, <2 x double>* %242
%243 = sub nsw i64 %3, %232
%244 = getelementptr inbounds double, double* %2, i64 %243
%245 = getelementptr inbounds double, double* %244, i64 -1
%246 = bitcast double* %245 to <2 x double>*
%247 = load <2 x double>, <2 x double>* %246
%248 = shufflevector <2 x double> %247, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%249 = getelementptr inbounds double, double* %244, i64 -2
%250 = getelementptr inbounds double, double* %249, i64 -1
%251 = bitcast double* %250 to <2 x double>*
%252 = load <2 x double>, <2 x double>* %251
%253 = shufflevector <2 x double> %252, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%254 = getelementptr inbounds double, double* %1, i64 %232
%255 = bitcast double* %254 to <2 x double>*
store <2 x double> %248, <2 x double>* %255
%256 = getelementptr inbounds double, double* %254, i64 2
%257 = bitcast double* %256 to <2 x double>*
store <2 x double> %253, <2 x double>* %257
%258 = or i64 %230, 5
%259 = getelementptr inbounds double, double* %2, i64 %258
%260 = bitcast double* %259 to <2 x double>*
%261 = load <2 x double>, <2 x double>* %260
%262 = getelementptr inbounds double, double* %259, i64 2
%263 = bitcast double* %262 to <2 x double>*
%264 = load <2 x double>, <2 x double>* %263
%265 = getelementptr inbounds double, double* %0, i64 %258
%266 = bitcast double* %265 to <2 x double>*
store <2 x double> %261, <2 x double>* %266
%267 = getelementptr inbounds double, double* %265, i64 2
%268 = bitcast double* %267 to <2 x double>*
store <2 x double> %264, <2 x double>* %268
%269 = sub nsw i64 %3, %258
%270 = getelementptr inbounds double, double* %2, i64 %269
%271 = getelementptr inbounds double, double* %270, i64 -1
%272 = bitcast double* %271 to <2 x double>*
%273 = load <2 x double>, <2 x double>* %272
%274 = shufflevector <2 x double> %273, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%275 = getelementptr inbounds double, double* %270, i64 -2
%276 = getelementptr inbounds double, double* %275, i64 -1
%277 = bitcast double* %276 to <2 x double>*
%278 = load <2 x double>, <2 x double>* %277
%279 = shufflevector <2 x double> %278, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%280 = getelementptr inbounds double, double* %1, i64 %258
%281 = bitcast double* %280 to <2 x double>*
store <2 x double> %274, <2 x double>* %281
%282 = getelementptr inbounds double, double* %280, i64 2
%283 = bitcast double* %282 to <2 x double>*
store <2 x double> %279, <2 x double>* %283
%284 = add nuw i64 %230, 8
%285 = add i64 %231, 2
%286 = icmp eq i64 %285, %228
br i1 %286, label %287, label %229
287: ; preds = %229
%288 = or i64 %284, 1
br label %289
289: ; preds = %287, %219
%290 = phi i64 [ 1, %219 ], [ %288, %287 ]
%291 = icmp eq i64 %225, 0
br i1 %291, label %318, label %292
292: ; preds = %289
%293 = getelementptr inbounds double, double* %2, i64 %290
%294 = bitcast double* %293 to <2 x double>*
%295 = load <2 x double>, <2 x double>* %294
%296 = getelementptr inbounds double, double* %293, i64 2
%297 = bitcast double* %296 to <2 x double>*
%298 = load <2 x double>, <2 x double>* %297
%299 = getelementptr inbounds double, double* %0, i64 %290
%300 = bitcast double* %299 to <2 x double>*
store <2 x double> %295, <2 x double>* %300
%301 = getelementptr inbounds double, double* %299, i64 2
%302 = bitcast double* %301 to <2 x double>*
store <2 x double> %298, <2 x double>* %302
%303 = sub nsw i64 %3, %290
%304 = getelementptr inbounds double, double* %2, i64 %303
%305 = getelementptr inbounds double, double* %304, i64 -1
%306 = bitcast double* %305 to <2 x double>*
%307 = load <2 x double>, <2 x double>* %306
%308 = shufflevector <2 x double> %307, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%309 = getelementptr inbounds double, double* %304, i64 -2
%310 = getelementptr inbounds double, double* %309, i64 -1
%311 = bitcast double* %310 to <2 x double>*
%312 = load <2 x double>, <2 x double>* %311
%313 = shufflevector <2 x double> %312, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%314 = getelementptr inbounds double, double* %1, i64 %290
%315 = bitcast double* %314 to <2 x double>*
store <2 x double> %308, <2 x double>* %315
%316 = getelementptr inbounds double, double* %314, i64 2
%317 = bitcast double* %316 to <2 x double>*
store <2 x double> %313, <2 x double>* %317
br label %318
318: ; preds = %289, %292
%319 = icmp eq i64 %187, %220
br i1 %319, label %356, label %320
320: ; preds = %189, %185, %318
%321 = phi i64 [ 1, %189 ], [ 1, %185 ], [ %221, %318 ]
%322 = add i64 %321, 1
%323 = and i64 %186, 1
%324 = icmp eq i64 %323, 0
br i1 %324, label %325, label %334
325: ; preds = %320
%326 = getelementptr inbounds double, double* %2, i64 %321
%327 = load double, double* %326
%328 = getelementptr inbounds double, double* %0, i64 %321
store double %327, double* %328
%329 = sub nsw i64 %3, %321
%330 = getelementptr inbounds double, double* %2, i64 %329
%331 = load double, double* %330
%332 = getelementptr inbounds double, double* %1, i64 %321
store double %331, double* %332
%333 = add nuw nsw i64 %321, 1
br label %334
334: ; preds = %325, %320
%335 = phi i64 [ %321, %320 ], [ %333, %325 ]
%336 = icmp eq i64 %186, %322
br i1 %336, label %356, label %337
337: ; preds = %334, %337
%338 = phi i64 [ %354, %337 ], [ %335, %334 ]
%339 = getelementptr inbounds double, double* %2, i64 %338
%340 = load double, double* %339
%341 = getelementptr inbounds double, double* %0, i64 %338
store double %340, double* %341
%342 = sub nsw i64 %3, %338
%343 = getelementptr inbounds double, double* %2, i64 %342
%344 = load double, double* %343
%345 = getelementptr inbounds double, double* %1, i64 %338
store double %344, double* %345
%346 = add nuw nsw i64 %338, 1
%347 = getelementptr inbounds double, double* %2, i64 %346
%348 = load double, double* %347
%349 = getelementptr inbounds double, double* %0, i64 %346
store double %348, double* %349
%350 = sub nsw i64 %3, %346
%351 = getelementptr inbounds double, double* %2, i64 %350
%352 = load double, double* %351
%353 = getelementptr inbounds double, double* %1, i64 %346
store double %352, double* %353
%354 = add nuw nsw i64 %338, 2
%355 = icmp eq i64 %354, %186
br i1 %355, label %356, label %337
356: ; preds = %334, %337, %318, %183
%357 = getelementptr inbounds double, double* %2, i64 %5
%358 = load double, double* %357
%359 = getelementptr inbounds double, double* %0, i64 %5
store double %358, double* %359
%360 = getelementptr inbounds double, double* %1, i64 %5
store double 0.000000e+00, double* %360
br label %361
361: ; preds = %161, %164, %145, %9, %356
ret void
}