double QrombDriver(func, a, b, error) double (*func)(), a, b, error;
{
  int l;
  double f[64 + 1], del;
  double QrombSlave();
  for (l = 0; l <= 64; l += 2) {
    del = (b - a) / 64;
    f[l] = (*func)(a + l * del);
  }
  return QrombSlave(func, f, a, b, error);
}


x86 assembly (clang, -O0):
<QrombDriver>:
push   %rbp
mov    %rsp,%rbp
sub    $0x240,%rsp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x40,-0x24(%rbp)
jg     119a <QrombDriver+0x8a>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  0xeaf(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x238(%rbp)
ff
mov    -0x8(%rbp),%rcx
movsd  -0x10(%rbp),%xmm1
cvtsi2sdl -0x24(%rbp),%xmm0
movsd  -0x238(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    $0x1,%al
call   *%rcx
movslq -0x24(%rbp),%rax
movsd  %xmm0,-0x230(%rbp,%rax,8)
ff ff
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    1135 <QrombDriver+0x25>
mov    -0x8(%rbp),%rdi
lea    -0x230(%rbp),%rsi
movsd  -0x10(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm2
mov    $0x3,%al
call   1030 <QrombSlave@plt>
add    $0x240,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<QrombDriver>:
push   %r14
push   %rbx
sub    $0x228,%rsp
movsd  %xmm2,0x10(%rsp)
mov    %rdi,%r14
movsd  %xmm1,0x8(%rsp)
movsd  %xmm0,(%rsp)
subsd  %xmm0,%xmm1
mulsd  0xec6(%rip),%xmm1
movsd  %xmm1,0x18(%rsp)
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
mulsd  0x18(%rsp),%xmm0
addsd  (%rsp),%xmm0
mov    $0x1,%al
call   *%r14
movsd  %xmm0,0x20(%rsp,%rbx,8)
lea    0x2(%rbx),%rax
cmp    $0x3f,%rbx
mov    %rax,%rbx
jb     1150 <QrombDriver+0x40>
lea    0x20(%rsp),%rsi
mov    %r14,%rdi
movsd  (%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm2
mov    $0x3,%al
call   1030 <QrombSlave@plt>
add    $0x228,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define double @QrombDriver(double (...)* %0, double %1, double %2, double %3) {
%5 = alloca double (...)*
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca i32
%10 = alloca [65 x double]
%11 = alloca double
store double (...)* %0, double (...)** %5
store double %1, double* %6
store double %2, double* %7
store double %3, double* %8
store i32 0, i32* %9
br label %12
12: ; preds = %31, %4
%13 = load i32, i32* %9
%14 = icmp sle i32 %13, 64
br i1 %14, label %15, label %34
15: ; preds = %12
%16 = load double, double* %7
%17 = load double, double* %6
%18 = fsub double %16, %17
%19 = fdiv double %18, 6.400000e+01
store double %19, double* %11
%20 = load double (...)*, double (...)** %5
%21 = load double, double* %6
%22 = load i32, i32* %9
%23 = sitofp i32 %22 to double
%24 = load double, double* %11
%25 = call double @llvm.fmuladd.f64(double %23, double %24, double %21)
%26 = bitcast double (...)* %20 to double (double, ...)*
%27 = call double (double, ...) %26(double %25)
%28 = load i32, i32* %9
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [65 x double], [65 x double]* %10, i64 0, i64 %29
store double %27, double* %30
br label %31
31: ; preds = %15
%32 = load i32, i32* %9
%33 = add nsw i32 %32, 2
store i32 %33, i32* %9
br label %12
34: ; preds = %12
%35 = load double (...)*, double (...)** %5
%36 = getelementptr inbounds [65 x double], [65 x double]* %10, i64 0, i64 0
%37 = load double, double* %6
%38 = load double, double* %7
%39 = load double, double* %8
%40 = call double (double (...)*, double*, double, double, double, ...) bitcast (double (...)* @QrombSlave to double (double (...)*, double*, double, double, double, ...)*)(double (...)* %35, double* %36, double %37, double %38, double %39)
ret double %40
}

LLVM IR (-O2):
define double @QrombDriver(double (...)* %0, double %1, double %2, double %3) {
%5 = alloca [65 x double]
%6 = bitcast [65 x double]* %5 to i8*
%7 = fsub double %2, %1
%8 = fmul double %7, 1.562500e-02
%9 = bitcast double (...)* %0 to double (double, ...)*
br label %10
10: ; preds = %4, %10
%11 = phi i64 [ 0, %4 ], [ %17, %10 ]
%12 = trunc i64 %11 to i32
%13 = sitofp i32 %12 to double
%14 = tail call double @llvm.fmuladd.f64(double %13, double %8, double %1)
%15 = tail call double (double, ...) %9(double %14)
%16 = getelementptr inbounds [65 x double], [65 x double]* %5, i64 0, i64 %11
store double %15, double* %16
%17 = add nuw nsw i64 %11, 2
%18 = icmp ult i64 %11, 63
br i1 %18, label %10, label %19
19: ; preds = %10
%20 = getelementptr inbounds [65 x double], [65 x double]* %5, i64 0, i64 0
%21 = call double (double (...)*, double*, double, double, double, ...) bitcast (double (...)* @QrombSlave to double (double (...)*, double*, double, double, double, ...)*)(double (...)* %0, double* %20, double %1, double %2, double %3)
ret double %21
}