void mp_mul_rcmul_nt_in1(int n, double *a, double *b, int nc, double *c) {
  int j, k, kk, ks, m;
  double wkr, wki, xr, xi, yr, yi, bjr, bji, bkr, bki;
  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 = b[j] - b[k];
    xi = b[j + 1] + b[k + 1];
    yr = wkr * xr - wki * xi;
    yi = wkr * xi + wki * xr;
    xr = b[j] - yr;
    xi = b[j + 1] - yi;
    yr = b[k] + yr;
    yi = b[k + 1] - yi;
    bjr = a[j] * xr - a[j + 1] * xi;
    bji = a[j] * xi + a[j + 1] * xr;
    bkr = a[k] * yr - a[k + 1] * yi;
    bki = a[k] * yi + a[k + 1] * yr;
    xr = bjr - bkr;
    xi = bji + bki;
    yr = wkr * xr + wki * xi;
    yi = wkr * xi - wki * xr;
    b[j] = bjr - yr;
    b[j + 1] = bji - yi;
    b[k] = bkr + yr;
    b[k + 1] = bki - yi;
  }
  xr = a[m];
  xi = a[m + 1];
  yr = b[m];
  yi = b[m + 1];
  b[m] = xr * yr - xi * yi;
  b[m + 1] = xr * yi + xi * yr;
}


x86 assembly (clang, -O0):
<mp_mul_rcmul_nt_in1>:
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    1497 <mp_mul_rcmul_nt_in1+0x397>
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  0xe8f(%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    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%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    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x18(%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    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x18(%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)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%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)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x60(%rbp),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x68(%rbp),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%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
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x70(%rbp),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%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_rcmul_nt_in1+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)
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  -0x70(%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  -0x58(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%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_rcmul_nt_in1>:
push   %rbx
mov    %rdx,%r9
mov    %edi,%ebx
sar    %ebx
movslq %ebx,%r10
cmp    $0x5,%edi
jle    1292 <mp_mul_rcmul_nt_in1+0x192>
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),%xmm8
movapd 0xeb8(%rip),%xmm9
nopl   0x0(%rax,%rax,1)
movapd %xmm8,%xmm2
subsd  (%rdx),%xmm2
movupd (%r9,%rbx,8),%xmm3
movupd (%r9,%rdi,8),%xmm5
movapd %xmm3,%xmm6
subpd  %xmm5,%xmm6
movapd %xmm3,%xmm0
addpd  %xmm5,%xmm0
movapd %xmm0,%xmm7
movsd  %xmm6,%xmm7
movsd  (%rcx),%xmm11
movapd %xmm11,%xmm10
xorpd  %xmm9,%xmm10
shufpd $0x1,%xmm11,%xmm0
movapd %xmm10,%xmm4
unpcklpd %xmm6,%xmm4
mulpd  %xmm0,%xmm4
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm7
addpd  %xmm4,%xmm7
subpd  %xmm7,%xmm3
movapd %xmm5,%xmm0
addpd  %xmm7,%xmm0
subpd  %xmm7,%xmm5
movapd %xmm5,%xmm4
movsd  %xmm0,%xmm4
movsd  (%rsi,%rbx,8),%xmm6
movsd  0x8(%rsi,%rbx,8),%xmm7
movapd %xmm3,%xmm1
shufpd $0x1,%xmm7,%xmm1
xorpd  %xmm9,%xmm7
unpcklpd %xmm3,%xmm7
mulpd  %xmm1,%xmm7
unpcklpd %xmm6,%xmm6
mulpd  %xmm3,%xmm6
addpd  %xmm7,%xmm6
movsd  (%rsi,%rdi,8),%xmm7
movsd  0x8(%rsi,%rdi,8),%xmm1
shufpd $0x1,%xmm1,%xmm5
xorpd  %xmm9,%xmm1
unpcklpd %xmm0,%xmm1
mulpd  %xmm5,%xmm1
unpcklpd %xmm7,%xmm7
mulpd  %xmm4,%xmm7
addpd  %xmm1,%xmm7
movapd %xmm6,%xmm0
subpd  %xmm7,%xmm0
movapd %xmm6,%xmm1
addpd  %xmm7,%xmm1
movapd %xmm1,%xmm3
movsd  %xmm0,%xmm3
unpcklpd %xmm0,%xmm11
shufpd $0x1,%xmm10,%xmm1
mulpd  %xmm11,%xmm1
mulpd  %xmm2,%xmm3
addpd  %xmm1,%xmm3
subpd  %xmm3,%xmm6
movupd %xmm6,(%r9,%rbx,8)
movapd %xmm7,%xmm0
addpd  %xmm3,%xmm0
subpd  %xmm3,%xmm7
movsd  %xmm0,%xmm7
movupd %xmm7,(%r9,%rdi,8)
add    $0x2,%rbx
add    %rax,%rcx
add    %r8,%rdx
add    $0xfffffffffffffffe,%rdi
cmp    %r11,%rbx
jl     1160 <mp_mul_rcmul_nt_in1+0x60>
jmp    1295 <mp_mul_rcmul_nt_in1+0x195>
mov    %r10,%r11
movsd  (%rsi,%r11,8),%xmm0
movsd  0x8(%rsi,%r10,8),%xmm1
movsd  (%r9,%r11,8),%xmm2
movsd  0x8(%r9,%r10,8),%xmm3
movapd %xmm0,%xmm4
mulsd  %xmm3,%xmm0
mulsd  %xmm1,%xmm3
mulsd  %xmm2,%xmm4
subsd  %xmm3,%xmm4
movsd  %xmm4,(%r9,%r11,8)
mulsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%r9,%r10,8)
pop    %rbx
ret

LLVM IR (-O0):
define void @mp_mul_rcmul_nt_in1(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 = %234, %5
%33 = load i32, i32* %11
%34 = load i32, i32* %15
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %237
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** %8
%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** %8
%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** %8
%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** %8
%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** %8
%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** %8
%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** %8
%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** %8
%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** %7
%124 = load i32, i32* %11
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds double, double* %123, i64 %125
%127 = load double, double* %126
%128 = load double, double* %18
%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
%134 = load double, double* %133
%135 = load double, double* %19
%136 = fmul double %134, %135
%137 = fneg double %136
%138 = call double @llvm.fmuladd.f64(double %127, double %128, double %137)
store double %138, double* %22
%139 = load double*, double** %7
%140 = load i32, i32* %11
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds double, double* %139, i64 %141
%143 = load double, double* %142
%144 = load double, double* %19
%145 = load double*, double** %7
%146 = load i32, i32* %11
%147 = add nsw i32 %146, 1
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds double, double* %145, i64 %148
%150 = load double, double* %149
%151 = load double, double* %18
%152 = fmul double %150, %151
%153 = call double @llvm.fmuladd.f64(double %143, double %144, double %152)
store double %153, double* %23
%154 = load double*, double** %7
%155 = load i32, i32* %12
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds double, double* %154, i64 %156
%158 = load double, double* %157
%159 = load double, double* %20
%160 = load double*, double** %7
%161 = load i32, i32* %12
%162 = add nsw i32 %161, 1
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds double, double* %160, i64 %163
%165 = load double, double* %164
%166 = load double, double* %21
%167 = fmul double %165, %166
%168 = fneg double %167
%169 = call double @llvm.fmuladd.f64(double %158, double %159, double %168)
store double %169, double* %24
%170 = load double*, double** %7
%171 = load i32, i32* %12
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds double, double* %170, i64 %172
%174 = load double, double* %173
%175 = load double, double* %21
%176 = load double*, double** %7
%177 = load i32, i32* %12
%178 = add nsw i32 %177, 1
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds double, double* %176, i64 %179
%181 = load double, double* %180
%182 = load double, double* %20
%183 = fmul double %181, %182
%184 = call double @llvm.fmuladd.f64(double %174, double %175, double %183)
store double %184, double* %25
%185 = load double, double* %22
%186 = load double, double* %24
%187 = fsub double %185, %186
store double %187, double* %18
%188 = load double, double* %23
%189 = load double, double* %25
%190 = fadd double %188, %189
store double %190, double* %19
%191 = load double, double* %16
%192 = load double, double* %18
%193 = load double, double* %17
%194 = load double, double* %19
%195 = fmul double %193, %194
%196 = call double @llvm.fmuladd.f64(double %191, double %192, double %195)
store double %196, double* %20
%197 = load double, double* %16
%198 = load double, double* %19
%199 = load double, double* %17
%200 = load double, double* %18
%201 = fmul double %199, %200
%202 = fneg double %201
%203 = call double @llvm.fmuladd.f64(double %197, double %198, double %202)
store double %203, double* %21
%204 = load double, double* %22
%205 = load double, double* %20
%206 = fsub double %204, %205
%207 = load double*, double** %8
%208 = load i32, i32* %11
%209 = sext i32 %208 to i64
%210 = getelementptr inbounds double, double* %207, i64 %209
store double %206, double* %210
%211 = load double, double* %23
%212 = load double, double* %21
%213 = fsub double %211, %212
%214 = load double*, double** %8
%215 = load i32, i32* %11
%216 = add nsw i32 %215, 1
%217 = sext i32 %216 to i64
%218 = getelementptr inbounds double, double* %214, i64 %217
store double %213, double* %218
%219 = load double, double* %24
%220 = load double, double* %20
%221 = fadd double %219, %220
%222 = load double*, double** %8
%223 = load i32, i32* %12
%224 = sext i32 %223 to i64
%225 = getelementptr inbounds double, double* %222, i64 %224
store double %221, double* %225
%226 = load double, double* %25
%227 = load double, double* %21
%228 = fsub double %226, %227
%229 = load double*, double** %8
%230 = load i32, i32* %12
%231 = add nsw i32 %230, 1
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds double, double* %229, i64 %232
store double %228, double* %233
br label %234
234: ; preds = %36
%235 = load i32, i32* %11
%236 = add nsw i32 %235, 2
store i32 %236, i32* %11
br label %32
237: ; preds = %32
%238 = load double*, double** %7
%239 = load i32, i32* %15
%240 = sext i32 %239 to i64
%241 = getelementptr inbounds double, double* %238, i64 %240
%242 = load double, double* %241
store double %242, double* %18
%243 = load double*, double** %7
%244 = load i32, i32* %15
%245 = add nsw i32 %244, 1
%246 = sext i32 %245 to i64
%247 = getelementptr inbounds double, double* %243, i64 %246
%248 = load double, double* %247
store double %248, double* %19
%249 = load double*, double** %8
%250 = load i32, i32* %15
%251 = sext i32 %250 to i64
%252 = getelementptr inbounds double, double* %249, i64 %251
%253 = load double, double* %252
store double %253, double* %20
%254 = load double*, double** %8
%255 = load i32, i32* %15
%256 = add nsw i32 %255, 1
%257 = sext i32 %256 to i64
%258 = getelementptr inbounds double, double* %254, i64 %257
%259 = load double, double* %258
store double %259, double* %21
%260 = load double, double* %18
%261 = load double, double* %20
%262 = load double, double* %19
%263 = load double, double* %21
%264 = fmul double %262, %263
%265 = fneg double %264
%266 = call double @llvm.fmuladd.f64(double %260, double %261, double %265)
%267 = load double*, double** %8
%268 = load i32, i32* %15
%269 = sext i32 %268 to i64
%270 = getelementptr inbounds double, double* %267, i64 %269
store double %266, double* %270
%271 = load double, double* %18
%272 = load double, double* %21
%273 = load double, double* %19
%274 = load double, double* %20
%275 = fmul double %273, %274
%276 = call double @llvm.fmuladd.f64(double %271, double %272, double %275)
%277 = load double*, double** %8
%278 = load i32, i32* %15
%279 = add nsw i32 %278, 1
%280 = sext i32 %279 to i64
%281 = getelementptr inbounds double, double* %277, i64 %280
store double %276, double* %281
ret void
}

LLVM IR (-O2):
define void @mp_mul_rcmul_nt_in1(i32 %0, double* nocapture %1, double* nocapture %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 %99
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 ], [ %97, %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* %2, i64 %19
%29 = getelementptr inbounds double, double* %2, i64 %20
%30 = or i64 %19, 1
%31 = bitcast double* %28 to <2 x double>*
%32 = load <2 x double>, <2 x double>* %31
%33 = add nsw i64 %20, 1
%34 = bitcast double* %29 to <2 x double>*
%35 = load <2 x double>, <2 x double>* %34
%36 = fsub <2 x double> %32, %35
%37 = fadd <2 x double> %32, %35
%38 = shufflevector <2 x double> %36, <2 x double> %37, <2 x i32> <i32 0, i32 3>
%39 = fneg double %27
%40 = extractelement <2 x double> %37, i64 1
%41 = insertelement <2 x double> poison, double %40, i64 0
%42 = insertelement <2 x double> %41, double %27, i64 1
%43 = insertelement <2 x double> poison, double %39, i64 0
%44 = shufflevector <2 x double> %43, <2 x double> %36, <2 x i32> <i32 0, i32 2>
%45 = fmul <2 x double> %42, %44
%46 = insertelement <2 x double> poison, double %25, i64 0
%47 = shufflevector <2 x double> %46, <2 x double> poison, <2 x i32> zeroinitializer
%48 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %47, <2 x double> %38, <2 x double> %45)
%49 = fsub <2 x double> %32, %48
%50 = fadd <2 x double> %35, %48
%51 = fsub <2 x double> %35, %48
%52 = shufflevector <2 x double> %50, <2 x double> %51, <2 x i32> <i32 0, i32 3>
%53 = getelementptr inbounds double, double* %1, i64 %19
%54 = load double, double* %53
%55 = getelementptr inbounds double, double* %1, i64 %30
%56 = load double, double* %55
%57 = fneg double %56
%58 = extractelement <2 x double> %49, i64 1
%59 = insertelement <2 x double> poison, double %58, i64 0
%60 = insertelement <2 x double> %59, double %56, i64 1
%61 = insertelement <2 x double> poison, double %57, i64 0
%62 = shufflevector <2 x double> %61, <2 x double> %49, <2 x i32> <i32 0, i32 2>
%63 = fmul <2 x double> %60, %62
%64 = insertelement <2 x double> poison, double %54, i64 0
%65 = shufflevector <2 x double> %64, <2 x double> poison, <2 x i32> zeroinitializer
%66 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %65, <2 x double> %49, <2 x double> %63)
%67 = getelementptr inbounds double, double* %1, i64 %20
%68 = load double, double* %67
%69 = getelementptr inbounds double, double* %1, i64 %33
%70 = load double, double* %69
%71 = fneg double %70
%72 = extractelement <2 x double> %51, i64 1
%73 = insertelement <2 x double> poison, double %72, i64 0
%74 = insertelement <2 x double> %73, double %70, i64 1
%75 = insertelement <2 x double> poison, double %71, i64 0
%76 = shufflevector <2 x double> %75, <2 x double> %50, <2 x i32> <i32 0, i32 2>
%77 = fmul <2 x double> %74, %76
%78 = insertelement <2 x double> poison, double %68, i64 0
%79 = shufflevector <2 x double> %78, <2 x double> poison, <2 x i32> zeroinitializer
%80 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %79, <2 x double> %52, <2 x double> %77)
%81 = fsub <2 x double> %66, %80
%82 = fadd <2 x double> %66, %80
%83 = shufflevector <2 x double> %81, <2 x double> %82, <2 x i32> <i32 0, i32 3>
%84 = insertelement <2 x double> poison, double %27, i64 0
%85 = shufflevector <2 x double> %84, <2 x double> %81, <2 x i32> <i32 0, i32 2>
%86 = extractelement <2 x double> %82, i64 1
%87 = insertelement <2 x double> poison, double %86, i64 0
%88 = insertelement <2 x double> %87, double %39, i64 1
%89 = fmul <2 x double> %85, %88
%90 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %47, <2 x double> %83, <2 x double> %89)
%91 = fsub <2 x double> %66, %90
%92 = bitcast double* %28 to <2 x double>*
store <2 x double> %91, <2 x double>* %92
%93 = fadd <2 x double> %80, %90
%94 = fsub <2 x double> %80, %90
%95 = shufflevector <2 x double> %93, <2 x double> %94, <2 x i32> <i32 0, i32 3>
%96 = bitcast double* %29 to <2 x double>*
store <2 x double> %95, <2 x double>* %96
%97 = add nuw nsw i64 %19, 2
%98 = icmp slt i64 %97, %14
br i1 %98, label %17, label %99
99: ; preds = %17, %8
%100 = phi i64 [ %9, %8 ], [ %14, %17 ]
%101 = getelementptr inbounds double, double* %1, i64 %100
%102 = load double, double* %101
%103 = add nsw i32 %6, 1
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds double, double* %1, i64 %104
%106 = load double, double* %105
%107 = getelementptr inbounds double, double* %2, i64 %100
%108 = load double, double* %107
%109 = getelementptr inbounds double, double* %2, i64 %104
%110 = load double, double* %109
%111 = fneg double %106
%112 = fmul double %110, %111
%113 = tail call double @llvm.fmuladd.f64(double %102, double %108, double %112)
store double %113, double* %107
%114 = fmul double %106, %108
%115 = tail call double @llvm.fmuladd.f64(double %102, double %110, double %114)
store double %115, double* %109
ret void
}