#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double dd_two_prod(double const, double const, double *);
double dd_two_sum(double, double, double *);
int /*<<< orphan*/ qd_renorm5(double *, double *, double *, double *, double *);
int /*<<< orphan*/ qd_three_sum(double *, double *, double *);
void qd_mul(const double *a, const double *b, double *c) {
  double p0, p1, p2, p3, p4, p5;
  double q0, q1, q2, q3, q4, q5;
  double p6, p7, p8, p9;
  double q6, q7, q8, q9;
  double r0, r1;
  double t0, t1;
  double s0, s1, s2;
  p0 = dd_two_prod(a[0], b[0], &q0);
  p1 = dd_two_prod(a[0], b[1], &q1);
  p2 = dd_two_prod(a[1], b[0], &q2);
  p3 = dd_two_prod(a[0], b[2], &q3);
  p4 = dd_two_prod(a[1], b[1], &q4);
  p5 = dd_two_prod(a[2], b[0], &q5);
  qd_three_sum(&p1, &p2, &q0);
  qd_three_sum(&p2, &q1, &q2);
  qd_three_sum(&p3, &p4, &p5);
  s0 = dd_two_sum(p2, p3, &t0);
  s1 = dd_two_sum(q1, p4, &t1);
  s2 = q2 + p5;
  s1 = dd_two_sum(s1, t0, &t0);
  s2 += (t0 + t1);
  p6 = dd_two_prod(a[0], b[3], &q6);
  p7 = dd_two_prod(a[1], b[2], &q7);
  p8 = dd_two_prod(a[2], b[1], &q8);
  p9 = dd_two_prod(a[3], b[0], &q9);
  q0 = dd_two_sum(q0, q3, &q3);
  q4 = dd_two_sum(q4, q5, &q5);
  p6 = dd_two_sum(p6, p7, &p7);
  p8 = dd_two_sum(p8, p9, &p9);
  t0 = dd_two_sum(q0, q4, &t1);
  t1 += (q3 + q5);
  r0 = dd_two_sum(p6, p8, &r1);
  r1 += (p7 + p9);
  q3 = dd_two_sum(t0, r0, &q4);
  q4 += (t1 + r1);
  t0 = dd_two_sum(q3, s1, &t1);
  t1 += q4;
  t1 += a[1] * b[3] + a[2] * b[2] + a[3] * b[1] + q6 + q7 + q8 + q9 + s2;
  qd_renorm5(&p0, &p1, &s0, &t0, &t1);
  c[0] = p0;
  c[1] = p1;
  c[2] = s0;
  c[3] = t0;
}


x86 assembly (clang, -O0):
<qd_mul>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
lea    -0x50(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    -0x58(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
lea    -0x60(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
lea    -0x68(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    -0x70(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
lea    -0x78(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x48(%rbp)
lea    -0x28(%rbp),%rdi
lea    -0x30(%rbp),%rsi
lea    -0x50(%rbp),%rdx
call   1060 <qd_three_sum@plt>
lea    -0x30(%rbp),%rdi
lea    -0x58(%rbp),%rsi
lea    -0x60(%rbp),%rdx
call   1060 <qd_three_sum@plt>
lea    -0x38(%rbp),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x48(%rbp),%rdx
call   1060 <qd_three_sum@plt>
movsd  -0x30(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
lea    -0xd0(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
lea    -0xd8(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
movsd  -0xd0(%rbp),%xmm1
ff
lea    -0xd0(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
addsd  -0xd8(%rbp),%xmm0
ff
addsd  -0xf0(%rbp),%xmm0
ff
movsd  %xmm0,-0xf0(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm1
lea    -0xa0(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x80(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm1
lea    -0xa8(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
lea    -0xb0(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
lea    -0xb8(%rbp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
lea    -0x68(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm1
lea    -0x78(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
lea    -0x88(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0x80(%rbp)
movsd  -0x90(%rbp),%xmm0
ff
movsd  -0x98(%rbp),%xmm1
ff
lea    -0x98(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm1
lea    -0xd8(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x68(%rbp),%xmm0
addsd  -0x78(%rbp),%xmm0
addsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0x80(%rbp),%xmm0
movsd  -0x90(%rbp),%xmm1
ff
lea    -0xc8(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xd0(%rbp),%xmm0
ff
movsd  -0xc0(%rbp),%xmm1
ff
lea    -0x70(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0x68(%rbp)
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  -0xe8(%rbp),%xmm1
ff
lea    -0xd8(%rbp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x70(%rbp),%xmm0
addsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm2
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
mulsd  0x10(%rax),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0xa0(%rbp),%xmm0
ff
addsd  -0xa8(%rbp),%xmm0
ff
addsd  -0xb0(%rbp),%xmm0
ff
addsd  -0xb8(%rbp),%xmm0
ff
addsd  -0xf0(%rbp),%xmm0
ff
addsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
lea    -0x20(%rbp),%rdi
lea    -0x28(%rbp),%rsi
lea    -0xe0(%rbp),%rdx
lea    -0xd0(%rbp),%rcx
lea    -0xd8(%rbp),%r8
call   1050 <qd_renorm5@plt>
movsd  -0x20(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x28(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0xe0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0xd0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<qd_mul>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xe8,%rsp
mov    %rdx,0xb0(%rsp)
mov    %rsi,%r15
mov    %rdi,%rbx
movsd  (%rdi),%xmm0
movsd  (%rsi),%xmm1
lea    0x48(%rsp),%r12
mov    %r12,%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x90(%rsp)
movsd  (%rbx),%xmm0
movsd  0x8(%r15),%xmm1
lea    0xe0(%rsp),%rbp
mov    %rbp,%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x50(%rsp)
movsd  0x8(%rbx),%xmm0
movsd  (%r15),%xmm1
lea    0xd8(%rsp),%r13
mov    %r13,%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x88(%rsp)
movsd  (%rbx),%xmm0
movsd  0x10(%r15),%xmm1
lea    0x18(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x80(%rsp)
movsd  0x8(%rbx),%xmm0
movsd  0x8(%r15),%xmm1
mov    %rsp,%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x78(%rsp)
movsd  0x10(%rbx),%xmm0
movsd  (%r15),%xmm1
lea    0x40(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x70(%rsp)
lea    0x50(%rsp),%rdi
lea    0x88(%rsp),%r14
mov    %r14,%rsi
mov    %r12,%rdx
call   1060 <qd_three_sum@plt>
mov    %r14,%rdi
mov    %rbp,%rsi
mov    %r13,%rdx
call   1060 <qd_three_sum@plt>
lea    0x80(%rsp),%rdi
lea    0x78(%rsp),%rsi
lea    0x70(%rsp),%rdx
call   1060 <qd_three_sum@plt>
movsd  0x88(%rsp),%xmm0
movsd  0x80(%rsp),%xmm1
lea    0x10(%rsp),%rbp
mov    %rbp,%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,0x58(%rsp)
movsd  0xe0(%rsp),%xmm0
movsd  0x78(%rsp),%xmm1
lea    0x8(%rsp),%r12
mov    %r12,%rdi
call   1040 <dd_two_sum@plt>
movsd  0xd8(%rsp),%xmm1
addsd  0x70(%rsp),%xmm1
movsd  %xmm1,0x30(%rsp)
movsd  0x10(%rsp),%xmm1
mov    %rbp,%rdi
call   1040 <dd_two_sum@plt>
movsd  0x10(%rsp),%xmm1
addsd  0x8(%rsp),%xmm1
movsd  %xmm0,0xa8(%rsp)
addsd  0x30(%rsp),%xmm1
movsd  %xmm1,0x30(%rsp)
movsd  (%rbx),%xmm0
movsd  0x18(%r15),%xmm1
lea    0xd0(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x28(%rsp)
movsd  0x8(%rbx),%xmm0
movsd  0x10(%r15),%xmm1
lea    0xc8(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x20(%rsp)
movsd  %xmm0,0x68(%rsp)
movsd  0x10(%rbx),%xmm0
movsd  0x8(%r15),%xmm1
lea    0xc0(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0xa0(%rsp)
movsd  0x18(%rbx),%xmm0
movsd  (%r15),%xmm1
lea    0xb8(%rsp),%rdi
call   1030 <dd_two_prod@plt>
movsd  %xmm0,0x98(%rsp)
movsd  %xmm0,0x60(%rsp)
movsd  0x48(%rsp),%xmm0
movsd  0x18(%rsp),%xmm1
lea    0x18(%rsp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,0x48(%rsp)
movsd  (%rsp),%xmm0
movsd  0x40(%rsp),%xmm1
lea    0x40(%rsp),%rdi
call   1040 <dd_two_sum@plt>
movsd  %xmm0,(%rsp)
lea    0x68(%rsp),%rdi
movsd  0x28(%rsp),%xmm0
movsd  0x20(%rsp),%xmm1
call   1040 <dd_two_sum@plt>
movsd  %xmm0,0x28(%rsp)
lea    0x60(%rsp),%rdi
movsd  0xa0(%rsp),%xmm0
movsd  0x98(%rsp),%xmm1
call   1040 <dd_two_sum@plt>
movsd  %xmm0,0x20(%rsp)
movsd  0x48(%rsp),%xmm0
movsd  (%rsp),%xmm1
mov    %r12,%rdi
call   1040 <dd_two_sum@plt>
movsd  0x18(%rsp),%xmm1
addsd  0x40(%rsp),%xmm1
movsd  %xmm0,0x10(%rsp)
addsd  0x8(%rsp),%xmm1
movsd  %xmm1,0x8(%rsp)
lea    0x38(%rsp),%rdi
movsd  0x28(%rsp),%xmm0
movsd  0x20(%rsp),%xmm1
call   1040 <dd_two_sum@plt>
movaps %xmm0,%xmm1
movsd  0x68(%rsp),%xmm0
addsd  0x60(%rsp),%xmm0
addsd  0x38(%rsp),%xmm0
movsd  %xmm0,0x38(%rsp)
movsd  0x10(%rsp),%xmm0
mov    %rsp,%rdi
call   1040 <dd_two_sum@plt>
movsd  0x8(%rsp),%xmm1
addsd  0x38(%rsp),%xmm1
movsd  %xmm0,0x18(%rsp)
addsd  (%rsp),%xmm1
movsd  %xmm1,(%rsp)
movsd  0xa8(%rsp),%xmm1
mov    %r12,%rdi
call   1040 <dd_two_sum@plt>
movsd  (%rsp),%xmm1
addsd  0x8(%rsp),%xmm1
movsd  %xmm0,0x10(%rsp)
movsd  0x10(%rbx),%xmm0
mulsd  0x10(%r15),%xmm0
movsd  0x8(%rbx),%xmm2
mulsd  0x18(%r15),%xmm2
addsd  %xmm0,%xmm2
movsd  0x18(%rbx),%xmm0
mulsd  0x8(%r15),%xmm0
addsd  %xmm2,%xmm0
addsd  0xd0(%rsp),%xmm0
addsd  0xc8(%rsp),%xmm0
addsd  0xc0(%rsp),%xmm0
addsd  0xb8(%rsp),%xmm0
addsd  0x30(%rsp),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rsp)
lea    0x90(%rsp),%rdi
lea    0x58(%rsp),%rdx
lea    0x50(%rsp),%rsi
mov    %rbp,%rcx
mov    %r12,%r8
call   1050 <qd_renorm5@plt>
movsd  0x90(%rsp),%xmm0
mov    0xb0(%rsp),%rax
movsd  %xmm0,(%rax)
movsd  0x50(%rsp),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  0x58(%rsp),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x18(%rax)
add    $0xe8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @qd_mul(double* %0, double* %1, double* %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca double*
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%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
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
store double* %0, double** %4
store double* %1, double** %5
store double* %2, double** %6
%34 = load double*, double** %4
%35 = getelementptr inbounds double, double* %34, i64 0
%36 = load double, double* %35
%37 = load double*, double** %5
%38 = getelementptr inbounds double, double* %37, i64 0
%39 = load double, double* %38
%40 = call double @dd_two_prod(double %36, double %39, double* %13)
store double %40, double* %7
%41 = load double*, double** %4
%42 = getelementptr inbounds double, double* %41, i64 0
%43 = load double, double* %42
%44 = load double*, double** %5
%45 = getelementptr inbounds double, double* %44, i64 1
%46 = load double, double* %45
%47 = call double @dd_two_prod(double %43, double %46, double* %14)
store double %47, double* %8
%48 = load double*, double** %4
%49 = getelementptr inbounds double, double* %48, i64 1
%50 = load double, double* %49
%51 = load double*, double** %5
%52 = getelementptr inbounds double, double* %51, i64 0
%53 = load double, double* %52
%54 = call double @dd_two_prod(double %50, double %53, double* %15)
store double %54, double* %9
%55 = load double*, double** %4
%56 = getelementptr inbounds double, double* %55, i64 0
%57 = load double, double* %56
%58 = load double*, double** %5
%59 = getelementptr inbounds double, double* %58, i64 2
%60 = load double, double* %59
%61 = call double @dd_two_prod(double %57, double %60, double* %16)
store double %61, double* %10
%62 = load double*, double** %4
%63 = getelementptr inbounds double, double* %62, i64 1
%64 = load double, double* %63
%65 = load double*, double** %5
%66 = getelementptr inbounds double, double* %65, i64 1
%67 = load double, double* %66
%68 = call double @dd_two_prod(double %64, double %67, double* %17)
store double %68, double* %11
%69 = load double*, double** %4
%70 = getelementptr inbounds double, double* %69, i64 2
%71 = load double, double* %70
%72 = load double*, double** %5
%73 = getelementptr inbounds double, double* %72, i64 0
%74 = load double, double* %73
%75 = call double @dd_two_prod(double %71, double %74, double* %18)
store double %75, double* %12
%76 = call i32 @qd_three_sum(double* %8, double* %9, double* %13)
%77 = call i32 @qd_three_sum(double* %9, double* %14, double* %15)
%78 = call i32 @qd_three_sum(double* %10, double* %11, double* %12)
%79 = load double, double* %9
%80 = load double, double* %10
%81 = call double @dd_two_sum(double %79, double %80, double* %29)
store double %81, double* %31
%82 = load double, double* %14
%83 = load double, double* %11
%84 = call double @dd_two_sum(double %82, double %83, double* %30)
store double %84, double* %32
%85 = load double, double* %15
%86 = load double, double* %12
%87 = fadd double %85, %86
store double %87, double* %33
%88 = load double, double* %32
%89 = load double, double* %29
%90 = call double @dd_two_sum(double %88, double %89, double* %29)
store double %90, double* %32
%91 = load double, double* %29
%92 = load double, double* %30
%93 = fadd double %91, %92
%94 = load double, double* %33
%95 = fadd double %94, %93
store double %95, double* %33
%96 = load double*, double** %4
%97 = getelementptr inbounds double, double* %96, i64 0
%98 = load double, double* %97
%99 = load double*, double** %5
%100 = getelementptr inbounds double, double* %99, i64 3
%101 = load double, double* %100
%102 = call double @dd_two_prod(double %98, double %101, double* %23)
store double %102, double* %19
%103 = load double*, double** %4
%104 = getelementptr inbounds double, double* %103, i64 1
%105 = load double, double* %104
%106 = load double*, double** %5
%107 = getelementptr inbounds double, double* %106, i64 2
%108 = load double, double* %107
%109 = call double @dd_two_prod(double %105, double %108, double* %24)
store double %109, double* %20
%110 = load double*, double** %4
%111 = getelementptr inbounds double, double* %110, i64 2
%112 = load double, double* %111
%113 = load double*, double** %5
%114 = getelementptr inbounds double, double* %113, i64 1
%115 = load double, double* %114
%116 = call double @dd_two_prod(double %112, double %115, double* %25)
store double %116, double* %21
%117 = load double*, double** %4
%118 = getelementptr inbounds double, double* %117, i64 3
%119 = load double, double* %118
%120 = load double*, double** %5
%121 = getelementptr inbounds double, double* %120, i64 0
%122 = load double, double* %121
%123 = call double @dd_two_prod(double %119, double %122, double* %26)
store double %123, double* %22
%124 = load double, double* %13
%125 = load double, double* %16
%126 = call double @dd_two_sum(double %124, double %125, double* %16)
store double %126, double* %13
%127 = load double, double* %17
%128 = load double, double* %18
%129 = call double @dd_two_sum(double %127, double %128, double* %18)
store double %129, double* %17
%130 = load double, double* %19
%131 = load double, double* %20
%132 = call double @dd_two_sum(double %130, double %131, double* %20)
store double %132, double* %19
%133 = load double, double* %21
%134 = load double, double* %22
%135 = call double @dd_two_sum(double %133, double %134, double* %22)
store double %135, double* %21
%136 = load double, double* %13
%137 = load double, double* %17
%138 = call double @dd_two_sum(double %136, double %137, double* %30)
store double %138, double* %29
%139 = load double, double* %16
%140 = load double, double* %18
%141 = fadd double %139, %140
%142 = load double, double* %30
%143 = fadd double %142, %141
store double %143, double* %30
%144 = load double, double* %19
%145 = load double, double* %21
%146 = call double @dd_two_sum(double %144, double %145, double* %28)
store double %146, double* %27
%147 = load double, double* %20
%148 = load double, double* %22
%149 = fadd double %147, %148
%150 = load double, double* %28
%151 = fadd double %150, %149
store double %151, double* %28
%152 = load double, double* %29
%153 = load double, double* %27
%154 = call double @dd_two_sum(double %152, double %153, double* %17)
store double %154, double* %16
%155 = load double, double* %30
%156 = load double, double* %28
%157 = fadd double %155, %156
%158 = load double, double* %17
%159 = fadd double %158, %157
store double %159, double* %17
%160 = load double, double* %16
%161 = load double, double* %32
%162 = call double @dd_two_sum(double %160, double %161, double* %30)
store double %162, double* %29
%163 = load double, double* %17
%164 = load double, double* %30
%165 = fadd double %164, %163
store double %165, double* %30
%166 = load double*, double** %4
%167 = getelementptr inbounds double, double* %166, i64 1
%168 = load double, double* %167
%169 = load double*, double** %5
%170 = getelementptr inbounds double, double* %169, i64 3
%171 = load double, double* %170
%172 = load double*, double** %4
%173 = getelementptr inbounds double, double* %172, i64 2
%174 = load double, double* %173
%175 = load double*, double** %5
%176 = getelementptr inbounds double, double* %175, i64 2
%177 = load double, double* %176
%178 = fmul double %174, %177
%179 = call double @llvm.fmuladd.f64(double %168, double %171, double %178)
%180 = load double*, double** %4
%181 = getelementptr inbounds double, double* %180, i64 3
%182 = load double, double* %181
%183 = load double*, double** %5
%184 = getelementptr inbounds double, double* %183, i64 1
%185 = load double, double* %184
%186 = call double @llvm.fmuladd.f64(double %182, double %185, double %179)
%187 = load double, double* %23
%188 = fadd double %186, %187
%189 = load double, double* %24
%190 = fadd double %188, %189
%191 = load double, double* %25
%192 = fadd double %190, %191
%193 = load double, double* %26
%194 = fadd double %192, %193
%195 = load double, double* %33
%196 = fadd double %194, %195
%197 = load double, double* %30
%198 = fadd double %197, %196
store double %198, double* %30
%199 = call i32 @qd_renorm5(double* %7, double* %8, double* %31, double* %29, double* %30)
%200 = load double, double* %7
%201 = load double*, double** %6
%202 = getelementptr inbounds double, double* %201, i64 0
store double %200, double* %202
%203 = load double, double* %8
%204 = load double*, double** %6
%205 = getelementptr inbounds double, double* %204, i64 1
store double %203, double* %205
%206 = load double, double* %31
%207 = load double*, double** %6
%208 = getelementptr inbounds double, double* %207, i64 2
store double %206, double* %208
%209 = load double, double* %29
%210 = load double*, double** %6
%211 = getelementptr inbounds double, double* %210, i64 3
store double %209, double* %211
ret void
}

LLVM IR (-O2):
define void @qd_mul(double* nocapture %0, double* nocapture %1, double* nocapture writeonly %2) {
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%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
%26 = bitcast double* %4 to i8*
%27 = bitcast double* %5 to i8*
%28 = bitcast double* %6 to i8*
%29 = bitcast double* %7 to i8*
%30 = bitcast double* %8 to i8*
%31 = bitcast double* %9 to i8*
%32 = bitcast double* %10 to i8*
%33 = bitcast double* %11 to i8*
%34 = bitcast double* %12 to i8*
%35 = bitcast double* %13 to i8*
%36 = bitcast double* %14 to i8*
%37 = bitcast double* %15 to i8*
%38 = bitcast double* %16 to i8*
%39 = bitcast double* %17 to i8*
%40 = bitcast double* %18 to i8*
%41 = bitcast double* %19 to i8*
%42 = bitcast double* %20 to i8*
%43 = bitcast double* %21 to i8*
%44 = bitcast double* %22 to i8*
%45 = bitcast double* %23 to i8*
%46 = bitcast double* %24 to i8*
%47 = bitcast double* %25 to i8*
%48 = load double, double* %0
%49 = load double, double* %1
%50 = call double @dd_two_prod(double %48, double %49, double* %10)
store double %50, double* %4
%51 = load double, double* %0
%52 = getelementptr inbounds double, double* %1, i64 1
%53 = load double, double* %52
%54 = call double @dd_two_prod(double %51, double %53, double* %11)
store double %54, double* %5
%55 = getelementptr inbounds double, double* %0, i64 1
%56 = load double, double* %55
%57 = load double, double* %1
%58 = call double @dd_two_prod(double %56, double %57, double* %12)
store double %58, double* %6
%59 = load double, double* %0
%60 = getelementptr inbounds double, double* %1, i64 2
%61 = load double, double* %60
%62 = call double @dd_two_prod(double %59, double %61, double* %13)
store double %62, double* %7
%63 = load double, double* %55
%64 = load double, double* %52
%65 = call double @dd_two_prod(double %63, double %64, double* %14)
store double %65, double* %8
%66 = getelementptr inbounds double, double* %0, i64 2
%67 = load double, double* %66
%68 = load double, double* %1
%69 = call double @dd_two_prod(double %67, double %68, double* %15)
store double %69, double* %9
%70 = call i32 @qd_three_sum(double* %5, double* %6, double* %10)
%71 = call i32 @qd_three_sum(double* %6, double* %11, double* %12)
%72 = call i32 @qd_three_sum(double* %7, double* %8, double* %9)
%73 = load double, double* %6
%74 = load double, double* %7
%75 = call double @dd_two_sum(double %73, double %74, double* %23)
store double %75, double* %25
%76 = load double, double* %11
%77 = load double, double* %8
%78 = call double @dd_two_sum(double %76, double %77, double* %24)
%79 = load double, double* %12
%80 = load double, double* %9
%81 = fadd double %79, %80
%82 = load double, double* %23
%83 = call double @dd_two_sum(double %78, double %82, double* %23)
%84 = load double, double* %23
%85 = load double, double* %24
%86 = fadd double %84, %85
%87 = fadd double %81, %86
%88 = load double, double* %0
%89 = getelementptr inbounds double, double* %1, i64 3
%90 = load double, double* %89
%91 = call double @dd_two_prod(double %88, double %90, double* %18)
%92 = load double, double* %55
%93 = load double, double* %60
%94 = call double @dd_two_prod(double %92, double %93, double* %19)
store double %94, double* %16
%95 = load double, double* %66
%96 = load double, double* %52
%97 = call double @dd_two_prod(double %95, double %96, double* %20)
%98 = getelementptr inbounds double, double* %0, i64 3
%99 = load double, double* %98
%100 = load double, double* %1
%101 = call double @dd_two_prod(double %99, double %100, double* %21)
store double %101, double* %17
%102 = load double, double* %10
%103 = load double, double* %13
%104 = call double @dd_two_sum(double %102, double %103, double* %13)
store double %104, double* %10
%105 = load double, double* %14
%106 = load double, double* %15
%107 = call double @dd_two_sum(double %105, double %106, double* %15)
store double %107, double* %14
%108 = call double @dd_two_sum(double %91, double %94, double* %16)
%109 = call double @dd_two_sum(double %97, double %101, double* %17)
%110 = load double, double* %10
%111 = load double, double* %14
%112 = call double @dd_two_sum(double %110, double %111, double* %24)
store double %112, double* %23
%113 = load double, double* %13
%114 = load double, double* %15
%115 = fadd double %113, %114
%116 = load double, double* %24
%117 = fadd double %116, %115
store double %117, double* %24
%118 = call double @dd_two_sum(double %108, double %109, double* %22)
%119 = load double, double* %16
%120 = load double, double* %17
%121 = fadd double %119, %120
%122 = load double, double* %22
%123 = fadd double %122, %121
store double %123, double* %22
%124 = load double, double* %23
%125 = call double @dd_two_sum(double %124, double %118, double* %14)
store double %125, double* %13
%126 = load double, double* %24
%127 = load double, double* %22
%128 = fadd double %126, %127
%129 = load double, double* %14
%130 = fadd double %129, %128
store double %130, double* %14
%131 = call double @dd_two_sum(double %125, double %83, double* %24)
store double %131, double* %23
%132 = load double, double* %14
%133 = load double, double* %24
%134 = fadd double %132, %133
%135 = load double, double* %55
%136 = load double, double* %89
%137 = load double, double* %66
%138 = load double, double* %60
%139 = fmul double %137, %138
%140 = call double @llvm.fmuladd.f64(double %135, double %136, double %139)
%141 = load double, double* %98
%142 = load double, double* %52
%143 = call double @llvm.fmuladd.f64(double %141, double %142, double %140)
%144 = load double, double* %18
%145 = fadd double %143, %144
%146 = load double, double* %19
%147 = fadd double %145, %146
%148 = load double, double* %20
%149 = fadd double %147, %148
%150 = load double, double* %21
%151 = fadd double %149, %150
%152 = fadd double %87, %151
%153 = fadd double %134, %152
store double %153, double* %24
%154 = call i32 @qd_renorm5(double* %4, double* %5, double* %25, double* %23, double* %24)
%155 = load double, double* %4
store double %155, double* %2
%156 = load double, double* %5
%157 = getelementptr inbounds double, double* %2, i64 1
store double %156, double* %157
%158 = load double, double* %25
%159 = getelementptr inbounds double, double* %2, i64 2
store double %158, double* %159
%160 = load double, double* %23
%161 = getelementptr inbounds double, double* %2, i64 3
store double %160, double* %161
ret void
}