double ffiTestDoubles15(double f1, double f2, double f3, double f4, double f5,
                        double f6, double f7, double f8, double f9, double f10,
                        double f11, double f12, double f13, double f14,
                        double f15) {
  ;
  return (double)(f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12 +
                  f13 + f14 + f15);
}


x86 assembly (clang, -O0):
<ffiTestDoubles15>:
push   %rbp
mov    %rsp,%rbp
movsd  0x40(%rbp),%xmm8
movsd  0x38(%rbp),%xmm8
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  %xmm5,-0x30(%rbp)
movsd  %xmm6,-0x38(%rbp)
movsd  %xmm7,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
addsd  0x10(%rbp),%xmm0
addsd  0x18(%rbp),%xmm0
addsd  0x20(%rbp),%xmm0
addsd  0x28(%rbp),%xmm0
addsd  0x30(%rbp),%xmm0
addsd  0x38(%rbp),%xmm0
addsd  0x40(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<ffiTestDoubles15>:
addsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
addsd  %xmm4,%xmm0
addsd  %xmm5,%xmm0
addsd  %xmm6,%xmm0
addsd  %xmm7,%xmm0
addsd  0x8(%rsp),%xmm0
addsd  0x10(%rsp),%xmm0
addsd  0x18(%rsp),%xmm0
addsd  0x20(%rsp),%xmm0
addsd  0x28(%rsp),%xmm0
addsd  0x30(%rsp),%xmm0
addsd  0x38(%rsp),%xmm0
ret

LLVM IR (-O0):
define double @ffiTestDoubles15(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14) {
%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
store double %0, double* %16
store double %1, double* %17
store double %2, double* %18
store double %3, double* %19
store double %4, double* %20
store double %5, double* %21
store double %6, double* %22
store double %7, double* %23
store double %8, double* %24
store double %9, double* %25
store double %10, double* %26
store double %11, double* %27
store double %12, double* %28
store double %13, double* %29
store double %14, double* %30
%31 = load double, double* %16
%32 = load double, double* %17
%33 = fadd double %31, %32
%34 = load double, double* %18
%35 = fadd double %33, %34
%36 = load double, double* %19
%37 = fadd double %35, %36
%38 = load double, double* %20
%39 = fadd double %37, %38
%40 = load double, double* %21
%41 = fadd double %39, %40
%42 = load double, double* %22
%43 = fadd double %41, %42
%44 = load double, double* %23
%45 = fadd double %43, %44
%46 = load double, double* %24
%47 = fadd double %45, %46
%48 = load double, double* %25
%49 = fadd double %47, %48
%50 = load double, double* %26
%51 = fadd double %49, %50
%52 = load double, double* %27
%53 = fadd double %51, %52
%54 = load double, double* %28
%55 = fadd double %53, %54
%56 = load double, double* %29
%57 = fadd double %55, %56
%58 = load double, double* %30
%59 = fadd double %57, %58
ret double %59
}

LLVM IR (-O2):
define double @ffiTestDoubles15(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14) {
%16 = fadd double %0, %1
%17 = fadd double %16, %2
%18 = fadd double %17, %3
%19 = fadd double %18, %4
%20 = fadd double %19, %5
%21 = fadd double %20, %6
%22 = fadd double %21, %7
%23 = fadd double %22, %8
%24 = fadd double %23, %9
%25 = fadd double %24, %10
%26 = fadd double %25, %11
%27 = fadd double %26, %12
%28 = fadd double %27, %13
%29 = fadd double %28, %14
ret double %29
}