double poly20(double x, double c1, double c2, double c3, double c4, double c5,
              double c6, double c7, double c8, double c9, double a0, double a1,
              double a2, double a3, double a4, double a5, double a6, double a7,
              double a8, double a9) {
  return x *
         (c1 -
          x * (c2 -
               x * (c3 -
                    x * (c4 -
                         x * (c5 -
                              x * (c6 -
                                   x * (c7 -
                                        x * (c8 -
                                             x * (c9 -
                                                  x * (a0 -
                                                       x * (a1 -
                                                            x * (a2 -
                                                                 x * (a3 -
                                                                      x * (a4 -
                                                                           x * (a5 -
                                                                                x * (a6 -
                                                                                     x * (a7 -
                                                                                          x * (a8 -
                                                                                               x * (a9 -
                                                                                                    x)))))))))))))))))));
}


x86 assembly (clang, -O0):
<poly20>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movsd  0x68(%rbp),%xmm8
movsd  0x60(%rbp),%xmm8
movsd  0x58(%rbp),%xmm8
movsd  0x50(%rbp),%xmm8
movsd  0x48(%rbp),%xmm8
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
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm2
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x18(%rbp),%xmm4
movsd  -0x8(%rbp),%xmm3
movsd  -0x20(%rbp),%xmm6
movsd  -0x8(%rbp),%xmm5
movsd  -0x28(%rbp),%xmm8
movsd  -0x8(%rbp),%xmm7
movsd  -0x30(%rbp),%xmm10
movsd  -0x8(%rbp),%xmm9
movsd  -0x38(%rbp),%xmm12
movsd  -0x8(%rbp),%xmm11
movsd  -0x40(%rbp),%xmm14
movsd  -0x8(%rbp),%xmm13
movsd  0x10(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x8(%rbp),%xmm15
movsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0x20(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0x28(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  0x30(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0x38(%rbp),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0x40(%rbp),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  0x48(%rbp),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  0x50(%rbp),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  0x58(%rbp),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  0x60(%rbp),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0x8(%rbp),%xmm1
movsd  0x68(%rbp),%xmm0
subsd  -0x8(%rbp),%xmm0
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm0,%xmm1
movsd  -0xf0(%rbp),%xmm0
ff
addsd  %xmm0,%xmm1
movsd  -0xe8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  -0xe0(%rbp),%xmm1
ff
addsd  %xmm1,%xmm0
movsd  -0xd8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm0,%xmm1
movsd  -0xd0(%rbp),%xmm0
ff
addsd  %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  -0xc0(%rbp),%xmm1
ff
addsd  %xmm1,%xmm0
movsd  -0xb8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm0,%xmm1
movsd  -0xb0(%rbp),%xmm0
ff
addsd  %xmm0,%xmm1
movsd  -0xa8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  -0xa0(%rbp),%xmm1
ff
addsd  %xmm1,%xmm0
movsd  -0x98(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm0,%xmm1
movsd  -0x90(%rbp),%xmm0
ff
addsd  %xmm0,%xmm1
movsd  -0x88(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x80(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x78(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm0,%xmm1
movsd  -0x70(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x60(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x58(%rbp),%xmm1
movq   %xmm15,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm15
mulsd  %xmm0,%xmm15
movsd  -0x50(%rbp),%xmm0
addsd  %xmm0,%xmm15
movsd  -0x48(%rbp),%xmm0
movq   %xmm13,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm13
mulsd  %xmm15,%xmm13
addsd  %xmm14,%xmm13
movq   %xmm11,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm11
mulsd  %xmm13,%xmm11
addsd  %xmm12,%xmm11
movq   %xmm9,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm9
mulsd  %xmm11,%xmm9
addsd  %xmm10,%xmm9
movq   %xmm7,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm7
mulsd  %xmm9,%xmm7
addsd  %xmm8,%xmm7
movq   %xmm5,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm5
mulsd  %xmm7,%xmm5
addsd  %xmm6,%xmm5
movq   %xmm3,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm3
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<poly20>:
movsd  0x58(%rsp),%xmm8
movsd  0x60(%rsp),%xmm9
subsd  %xmm0,%xmm9
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
movsd  0x50(%rsp),%xmm9
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm9
movsd  0x48(%rsp),%xmm8
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
movsd  0x40(%rsp),%xmm9
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm9
movsd  0x38(%rsp),%xmm8
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
movsd  0x30(%rsp),%xmm9
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm9
movsd  0x28(%rsp),%xmm8
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
movsd  0x20(%rsp),%xmm9
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm9
movsd  0x18(%rsp),%xmm8
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
movsd  0x10(%rsp),%xmm9
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm9
movsd  0x8(%rsp),%xmm8
mulsd  %xmm0,%xmm9
subsd  %xmm9,%xmm8
mulsd  %xmm0,%xmm8
subsd  %xmm8,%xmm7
mulsd  %xmm0,%xmm7
subsd  %xmm7,%xmm6
mulsd  %xmm0,%xmm6
subsd  %xmm6,%xmm5
mulsd  %xmm0,%xmm5
subsd  %xmm5,%xmm4
mulsd  %xmm0,%xmm4
subsd  %xmm4,%xmm3
mulsd  %xmm0,%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm0,%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @poly20(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, double %15, double %16, double %17, double %18, double %19) {
%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
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
store double %0, double* %21
store double %1, double* %22
store double %2, double* %23
store double %3, double* %24
store double %4, double* %25
store double %5, double* %26
store double %6, double* %27
store double %7, double* %28
store double %8, double* %29
store double %9, double* %30
store double %10, double* %31
store double %11, double* %32
store double %12, double* %33
store double %13, double* %34
store double %14, double* %35
store double %15, double* %36
store double %16, double* %37
store double %17, double* %38
store double %18, double* %39
store double %19, double* %40
%41 = load double, double* %21
%42 = load double, double* %22
%43 = load double, double* %21
%44 = load double, double* %23
%45 = load double, double* %21
%46 = load double, double* %24
%47 = load double, double* %21
%48 = load double, double* %25
%49 = load double, double* %21
%50 = load double, double* %26
%51 = load double, double* %21
%52 = load double, double* %27
%53 = load double, double* %21
%54 = load double, double* %28
%55 = load double, double* %21
%56 = load double, double* %29
%57 = load double, double* %21
%58 = load double, double* %30
%59 = load double, double* %21
%60 = load double, double* %31
%61 = load double, double* %21
%62 = load double, double* %32
%63 = load double, double* %21
%64 = load double, double* %33
%65 = load double, double* %21
%66 = load double, double* %34
%67 = load double, double* %21
%68 = load double, double* %35
%69 = load double, double* %21
%70 = load double, double* %36
%71 = load double, double* %21
%72 = load double, double* %37
%73 = load double, double* %21
%74 = load double, double* %38
%75 = load double, double* %21
%76 = load double, double* %39
%77 = load double, double* %21
%78 = load double, double* %40
%79 = load double, double* %21
%80 = fsub double %78, %79
%81 = fneg double %77
%82 = call double @llvm.fmuladd.f64(double %81, double %80, double %76)
%83 = fneg double %75
%84 = call double @llvm.fmuladd.f64(double %83, double %82, double %74)
%85 = fneg double %73
%86 = call double @llvm.fmuladd.f64(double %85, double %84, double %72)
%87 = fneg double %71
%88 = call double @llvm.fmuladd.f64(double %87, double %86, double %70)
%89 = fneg double %69
%90 = call double @llvm.fmuladd.f64(double %89, double %88, double %68)
%91 = fneg double %67
%92 = call double @llvm.fmuladd.f64(double %91, double %90, double %66)
%93 = fneg double %65
%94 = call double @llvm.fmuladd.f64(double %93, double %92, double %64)
%95 = fneg double %63
%96 = call double @llvm.fmuladd.f64(double %95, double %94, double %62)
%97 = fneg double %61
%98 = call double @llvm.fmuladd.f64(double %97, double %96, double %60)
%99 = fneg double %59
%100 = call double @llvm.fmuladd.f64(double %99, double %98, double %58)
%101 = fneg double %57
%102 = call double @llvm.fmuladd.f64(double %101, double %100, double %56)
%103 = fneg double %55
%104 = call double @llvm.fmuladd.f64(double %103, double %102, double %54)
%105 = fneg double %53
%106 = call double @llvm.fmuladd.f64(double %105, double %104, double %52)
%107 = fneg double %51
%108 = call double @llvm.fmuladd.f64(double %107, double %106, double %50)
%109 = fneg double %49
%110 = call double @llvm.fmuladd.f64(double %109, double %108, double %48)
%111 = fneg double %47
%112 = call double @llvm.fmuladd.f64(double %111, double %110, double %46)
%113 = fneg double %45
%114 = call double @llvm.fmuladd.f64(double %113, double %112, double %44)
%115 = fneg double %43
%116 = call double @llvm.fmuladd.f64(double %115, double %114, double %42)
%117 = fmul double %41, %116
ret double %117
}

LLVM IR (-O2):
define double @poly20(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, double %15, double %16, double %17, double %18, double %19) {
%21 = fsub double %19, %0
%22 = fneg double %0
%23 = tail call double @llvm.fmuladd.f64(double %22, double %21, double %18)
%24 = tail call double @llvm.fmuladd.f64(double %22, double %23, double %17)
%25 = tail call double @llvm.fmuladd.f64(double %22, double %24, double %16)
%26 = tail call double @llvm.fmuladd.f64(double %22, double %25, double %15)
%27 = tail call double @llvm.fmuladd.f64(double %22, double %26, double %14)
%28 = tail call double @llvm.fmuladd.f64(double %22, double %27, double %13)
%29 = tail call double @llvm.fmuladd.f64(double %22, double %28, double %12)
%30 = tail call double @llvm.fmuladd.f64(double %22, double %29, double %11)
%31 = tail call double @llvm.fmuladd.f64(double %22, double %30, double %10)
%32 = tail call double @llvm.fmuladd.f64(double %22, double %31, double %9)
%33 = tail call double @llvm.fmuladd.f64(double %22, double %32, double %8)
%34 = tail call double @llvm.fmuladd.f64(double %22, double %33, double %7)
%35 = tail call double @llvm.fmuladd.f64(double %22, double %34, double %6)
%36 = tail call double @llvm.fmuladd.f64(double %22, double %35, double %5)
%37 = tail call double @llvm.fmuladd.f64(double %22, double %36, double %4)
%38 = tail call double @llvm.fmuladd.f64(double %22, double %37, double %3)
%39 = tail call double @llvm.fmuladd.f64(double %22, double %38, double %2)
%40 = tail call double @llvm.fmuladd.f64(double %22, double %39, double %1)
%41 = fmul double %40, %0
ret double %41
}