extern double ppcfltest(int x1, double x2, int x3, double x4, int x5, double x6,
                        int x7, double x8, double x9, double x10, double x11,
                        double x12, double x13, double x14, double x15,
                        double x16, double x17, double x18, double x19) {
  return x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 +
         x14 + x15 + x16 + x17 + x18 + x19;
}


x86 assembly (clang, -O0):
<ppcfltest>:
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
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
movsd  %xmm2,-0x30(%rbp)
mov    %ecx,-0x34(%rbp)
movsd  %xmm3,-0x40(%rbp)
movsd  %xmm4,-0x48(%rbp)
movsd  %xmm5,-0x50(%rbp)
movsd  %xmm6,-0x58(%rbp)
movsd  %xmm7,-0x60(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
addsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x30(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm1
addsd  %xmm1,%xmm0
addsd  -0x40(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
addsd  -0x58(%rbp),%xmm0
addsd  -0x60(%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):
<ppcfltest>:
cvtsi2sd %edi,%xmm8
addsd  %xmm8,%xmm0
xorps  %xmm8,%xmm8
cvtsi2sd %esi,%xmm8
addsd  %xmm8,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
addsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
addsd  %xmm1,%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 @ppcfltest(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18) {
%20 = alloca i32
%21 = alloca double
%22 = alloca i32
%23 = alloca double
%24 = alloca i32
%25 = alloca double
%26 = alloca i32
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
store i32 %0, i32* %20
store double %1, double* %21
store i32 %2, i32* %22
store double %3, double* %23
store i32 %4, i32* %24
store double %5, double* %25
store i32 %6, i32* %26
store double %7, double* %27
store double %8, double* %28
store double %9, double* %29
store double %10, double* %30
store double %11, double* %31
store double %12, double* %32
store double %13, double* %33
store double %14, double* %34
store double %15, double* %35
store double %16, double* %36
store double %17, double* %37
store double %18, double* %38
%39 = load i32, i32* %20
%40 = sitofp i32 %39 to double
%41 = load double, double* %21
%42 = fadd double %40, %41
%43 = load i32, i32* %22
%44 = sitofp i32 %43 to double
%45 = fadd double %42, %44
%46 = load double, double* %23
%47 = fadd double %45, %46
%48 = load i32, i32* %24
%49 = sitofp i32 %48 to double
%50 = fadd double %47, %49
%51 = load double, double* %25
%52 = fadd double %50, %51
%53 = load i32, i32* %26
%54 = sitofp i32 %53 to double
%55 = fadd double %52, %54
%56 = load double, double* %27
%57 = fadd double %55, %56
%58 = load double, double* %28
%59 = fadd double %57, %58
%60 = load double, double* %29
%61 = fadd double %59, %60
%62 = load double, double* %30
%63 = fadd double %61, %62
%64 = load double, double* %31
%65 = fadd double %63, %64
%66 = load double, double* %32
%67 = fadd double %65, %66
%68 = load double, double* %33
%69 = fadd double %67, %68
%70 = load double, double* %34
%71 = fadd double %69, %70
%72 = load double, double* %35
%73 = fadd double %71, %72
%74 = load double, double* %36
%75 = fadd double %73, %74
%76 = load double, double* %37
%77 = fadd double %75, %76
%78 = load double, double* %38
%79 = fadd double %77, %78
ret double %79
}

LLVM IR (-O2):
define double @ppcfltest(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, double %8, double %9, double %10, double %11, double %12, double %13, double %14, double %15, double %16, double %17, double %18) {
%20 = sitofp i32 %0 to double
%21 = fadd double %20, %1
%22 = sitofp i32 %2 to double
%23 = fadd double %21, %22
%24 = fadd double %23, %3
%25 = sitofp i32 %4 to double
%26 = fadd double %24, %25
%27 = fadd double %26, %5
%28 = sitofp i32 %6 to double
%29 = fadd double %27, %28
%30 = fadd double %29, %7
%31 = fadd double %30, %8
%32 = fadd double %31, %9
%33 = fadd double %32, %10
%34 = fadd double %33, %11
%35 = fadd double %34, %12
%36 = fadd double %35, %13
%37 = fadd double %36, %14
%38 = fadd double %37, %15
%39 = fadd double %38, %16
%40 = fadd double %39, %17
%41 = fadd double %40, %18
ret double %41
}