void mp_mul_rcsqu_save(int n, double *a, double *b, int nc, double *c) {
  int j, k, kk, ks, m;
  double wkr, wki, xr, xi, yr, yi, ajr, aji, akr, aki;
  ks = (nc << 2) / n;
  kk = 0;
  m = n >> 1;
  for (j = 2; j < m; j += 2) {
    k = n - j;
    kk += ks;
    wkr = ((double)0.5) - c[nc - kk];
    wki = c[kk];
    xr = a[j] - a[k];
    xi = a[j + 1] + a[k + 1];
    yr = wkr * xr - wki * xi;
    yi = wkr * xi + wki * xr;
    xr = a[j] - yr;
    xi = a[j + 1] - yi;
    yr = a[k] + yr;
    yi = a[k + 1] - yi;
    a[j] = xr;
    a[j + 1] = xi;
    a[k] = yr;
    a[k + 1] = yi;
    ajr = xr * xr - xi * xi;
    aji = 2 * xr * xi;
    akr = yr * yr - yi * yi;
    aki = 2 * yr * yi;
    xr = ajr - akr;
    xi = aji + aki;
    yr = wkr * xr + wki * xi;
    yi = wkr * xi - wki * xr;
    b[j] = ajr - yr;
    b[j + 1] = aji - yi;
    b[k] = akr + yr;
    b[k + 1] = aki - yi;
  }
  xr = a[m];
  xi = a[m + 1];
  b[m] = xr * xr - xi * xi;
  b[m + 1] = 2 * xr * xi;
}


x86 assembly (clang, -O0):
<mp_mul_rcsqu_save>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x2,%eax
cltd
idivl  -0x4(%rbp)
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x3c(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    1481 <mp_mul_rcsqu_save+0x381>
mov    -0x4(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  0xe97(%rip),%xmm0
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  -0x60(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x58(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  -0x60(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0xcda(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  -0x70(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0xc88(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x58(%rbp)
movsd  -0x80(%rbp),%xmm0
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x78(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x88(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x90(%rbp),%xmm0
ff
subsd  -0x70(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    113e <mp_mul_rcsqu_save+0x3e>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  -0x60(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0xb0e(%rip),%xmm0
mulsd  -0x58(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mp_mul_rcsqu_save>:
push   %rbx
mov    %rdx,%r9
mov    %edi,%ebx
sar    %ebx
movslq %ebx,%r10
cmp    $0x5,%edi
jle    1287 <mp_mul_rcsqu_save+0x187>
lea    0x0(,%rcx,4),%eax
cltd
idiv   %edi
mov    %edi,%edi
movslq %ebx,%r11
cltq
movslq %ecx,%rdx
lea    (%r8,%rax,8),%rcx
sub    %rax,%rdx
shl    $0x3,%rax
lea    (%r8,%rdx,8),%rdx
mov    %rax,%r8
neg    %r8
add    $0xfffffffffffffffe,%rdi
mov    $0x2,%ebx
movsd  0xeb1(%rip),%xmm9
movapd 0xeb8(%rip),%xmm8
nopl   0x0(%rax,%rax,1)
movapd %xmm9,%xmm2
subsd  (%rdx),%xmm2
movupd (%rsi,%rbx,8),%xmm7
movupd (%rsi,%rdi,8),%xmm0
movapd %xmm7,%xmm1
subpd  %xmm0,%xmm1
movapd %xmm7,%xmm6
addpd  %xmm0,%xmm6
movapd %xmm6,%xmm4
movsd  %xmm1,%xmm4
movsd  (%rcx),%xmm3
movapd %xmm3,%xmm10
xorpd  %xmm8,%xmm10
shufpd $0x1,%xmm3,%xmm6
movapd %xmm10,%xmm5
unpcklpd %xmm1,%xmm5
mulpd  %xmm6,%xmm5
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm4
addpd  %xmm5,%xmm4
subpd  %xmm4,%xmm7
movapd %xmm0,%xmm6
addpd  %xmm4,%xmm6
subpd  %xmm4,%xmm0
movapd %xmm0,%xmm1
movsd  %xmm6,%xmm1
movupd %xmm7,(%rsi,%rbx,8)
movupd %xmm1,(%rsi,%rdi,8)
movapd %xmm7,%xmm4
unpckhpd %xmm7,%xmm4
movapd %xmm7,%xmm1
addsd  %xmm7,%xmm7
mulsd  %xmm4,%xmm7
mulsd  %xmm4,%xmm4
mulsd  %xmm1,%xmm1
subsd  %xmm4,%xmm1
unpcklpd %xmm7,%xmm1
unpckhpd %xmm0,%xmm0
movapd %xmm6,%xmm4
addsd  %xmm6,%xmm6
mulsd  %xmm0,%xmm6
mulsd  %xmm0,%xmm0
mulsd  %xmm4,%xmm4
subsd  %xmm0,%xmm4
movapd %xmm4,%xmm0
unpcklpd %xmm6,%xmm0
movapd %xmm1,%xmm5
subpd  %xmm0,%xmm5
addpd  %xmm1,%xmm0
movapd %xmm0,%xmm7
movsd  %xmm5,%xmm7
unpcklpd %xmm5,%xmm3
shufpd $0x1,%xmm10,%xmm0
mulpd  %xmm3,%xmm0
mulpd  %xmm2,%xmm7
addpd  %xmm0,%xmm7
subpd  %xmm7,%xmm1
movupd %xmm1,(%r9,%rbx,8)
addsd  %xmm7,%xmm4
movsd  %xmm4,(%r9,%rdi,8)
unpckhpd %xmm7,%xmm7
subsd  %xmm7,%xmm6
movsd  %xmm6,0x8(%r9,%rdi,8)
add    $0x2,%rbx
add    %rax,%rcx
add    %r8,%rdx
add    $0xfffffffffffffffe,%rdi
cmp    %r11,%rbx
jl     1160 <mp_mul_rcsqu_save+0x60>
jmp    128a <mp_mul_rcsqu_save+0x18a>
mov    %r10,%r11
movsd  (%rsi,%r11,8),%xmm0
movsd  0x8(%rsi,%r10,8),%xmm1
movapd %xmm0,%xmm2
addsd  %xmm0,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm1
mulsd  %xmm2,%xmm2
subsd  %xmm1,%xmm2
movsd  %xmm2,(%r9,%r11,8)
movsd  %xmm0,0x8(%r9,%r10,8)
pop    %rbx
ret

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

LLVM IR (-O2):
define void @mp_mul_rcsqu_save(i32 %0, double* nocapture %1, double* nocapture writeonly %2, i32 %3, double* nocapture %4) {
%6 = ashr i32 %0, 1
%7 = icmp sgt i32 %0, 5
br i1 %7, label %10, label %8
8: ; preds = %5
%9 = sext i32 %6 to i64
br label %93
10: ; preds = %5
%11 = shl i32 %3, 2
%12 = sdiv i32 %11, %0
%13 = zext i32 %0 to i64
%14 = sext i32 %6 to i64
%15 = sext i32 %12 to i64
%16 = sext i32 %3 to i64
br label %17
17: ; preds = %10, %17
%18 = phi i64 [ 0, %10 ], [ %21, %17 ]
%19 = phi i64 [ 2, %10 ], [ %91, %17 ]
%20 = sub nsw i64 %13, %19
%21 = add nsw i64 %18, %15
%22 = sub nsw i64 %16, %21
%23 = getelementptr inbounds double, double* %4, i64 %22
%24 = load double, double* %23
%25 = fsub double 5.000000e-01, %24
%26 = getelementptr inbounds double, double* %4, i64 %21
%27 = load double, double* %26
%28 = getelementptr inbounds double, double* %1, i64 %19
%29 = getelementptr inbounds double, double* %1, i64 %20
%30 = bitcast double* %28 to <2 x double>*
%31 = load <2 x double>, <2 x double>* %30
%32 = add nsw i64 %20, 1
%33 = bitcast double* %29 to <2 x double>*
%34 = load <2 x double>, <2 x double>* %33
%35 = fsub <2 x double> %31, %34
%36 = fadd <2 x double> %31, %34
%37 = shufflevector <2 x double> %35, <2 x double> %36, <2 x i32> <i32 0, i32 3>
%38 = fneg double %27
%39 = extractelement <2 x double> %36, i64 1
%40 = insertelement <2 x double> poison, double %39, i64 0
%41 = insertelement <2 x double> %40, double %27, i64 1
%42 = insertelement <2 x double> poison, double %38, i64 0
%43 = shufflevector <2 x double> %42, <2 x double> %35, <2 x i32> <i32 0, i32 2>
%44 = fmul <2 x double> %41, %43
%45 = insertelement <2 x double> poison, double %25, i64 0
%46 = shufflevector <2 x double> %45, <2 x double> poison, <2 x i32> zeroinitializer
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %37, <2 x double> %44)
%48 = fsub <2 x double> %31, %47
%49 = fadd <2 x double> %34, %47
%50 = fsub <2 x double> %34, %47
%51 = shufflevector <2 x double> %49, <2 x double> %50, <2 x i32> <i32 0, i32 3>
%52 = bitcast double* %28 to <2 x double>*
store <2 x double> %48, <2 x double>* %52
%53 = bitcast double* %29 to <2 x double>*
store <2 x double> %51, <2 x double>* %53
%54 = extractelement <2 x double> %48, i64 1
%55 = fneg double %54
%56 = fmul double %54, %55
%57 = extractelement <2 x double> %48, i64 0
%58 = tail call double @llvm.fmuladd.f64(double %57, double %57, double %56)
%59 = fmul double %57, 2.000000e+00
%60 = fmul double %54, %59
%61 = extractelement <2 x double> %50, i64 1
%62 = fneg double %61
%63 = fmul double %61, %62
%64 = extractelement <2 x double> %49, i64 0
%65 = tail call double @llvm.fmuladd.f64(double %64, double %64, double %63)
%66 = fmul double %64, 2.000000e+00
%67 = fmul double %61, %66
%68 = insertelement <2 x double> poison, double %58, i64 0
%69 = insertelement <2 x double> %68, double %60, i64 1
%70 = insertelement <2 x double> poison, double %65, i64 0
%71 = insertelement <2 x double> %70, double %67, i64 1
%72 = fsub <2 x double> %69, %71
%73 = fadd <2 x double> %69, %71
%74 = shufflevector <2 x double> %72, <2 x double> %73, <2 x i32> <i32 0, i32 3>
%75 = insertelement <2 x double> poison, double %27, i64 0
%76 = shufflevector <2 x double> %75, <2 x double> %72, <2 x i32> <i32 0, i32 2>
%77 = extractelement <2 x double> %73, i64 1
%78 = insertelement <2 x double> poison, double %77, i64 0
%79 = insertelement <2 x double> %78, double %38, i64 1
%80 = fmul <2 x double> %76, %79
%81 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %74, <2 x double> %80)
%82 = getelementptr inbounds double, double* %2, i64 %19
%83 = fsub <2 x double> %69, %81
%84 = bitcast double* %82 to <2 x double>*
store <2 x double> %83, <2 x double>* %84
%85 = extractelement <2 x double> %81, i64 0
%86 = fadd double %65, %85
%87 = getelementptr inbounds double, double* %2, i64 %20
store double %86, double* %87
%88 = extractelement <2 x double> %81, i64 1
%89 = fsub double %67, %88
%90 = getelementptr inbounds double, double* %2, i64 %32
store double %89, double* %90
%91 = add nuw nsw i64 %19, 2
%92 = icmp slt i64 %91, %14
br i1 %92, label %17, label %93
93: ; preds = %17, %8
%94 = phi i64 [ %9, %8 ], [ %14, %17 ]
%95 = getelementptr inbounds double, double* %1, i64 %94
%96 = load double, double* %95
%97 = add nsw i32 %6, 1
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds double, double* %1, i64 %98
%100 = load double, double* %99
%101 = fneg double %100
%102 = fmul double %100, %101
%103 = tail call double @llvm.fmuladd.f64(double %96, double %96, double %102)
%104 = getelementptr inbounds double, double* %2, i64 %94
store double %103, double* %104
%105 = fmul double %96, 2.000000e+00
%106 = fmul double %105, %100
%107 = getelementptr inbounds double, double* %2, i64 %98
store double %106, double* %107
ret void
}