double poly_6_3a(double a[], double x, long degree) {
  long i = 1;
  double result = a[0];
  double result1 = 0;
  double result2 = 0;
  double xpwr = x;
  double xpwr1 = x * x * x;
  double xpwr2 = x * x * x * x * x;
  double xpwr_step = x * x * x * x * x * x;
  for (; i <= degree - 6; i += 6) {
    result = result + (a[i] * xpwr + a[i + 1] * xpwr * x);
    result1 = result1 + (a[i + 2] * xpwr1 + a[i + 3] * xpwr1 * x);
    result2 = result2 + (a[i + 4] * xpwr2 + a[i + 5] * xpwr2 * x);
    xpwr *= xpwr_step;
    xpwr1 *= xpwr_step;
    xpwr2 *= xpwr_step;
  }
  for (; i <= degree; i++) {
    result = result + a[i] * xpwr;
    xpwr *= x;
  }
  return result + result1 + result2;
}


x86 assembly (clang, -O0):
<poly_6_3a>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movq   $0x1,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x6,%rcx
cmp    %rcx,%rax
jg     12aa <poly_6_3a+0x1aa>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x40(%rbp),%xmm3
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm2
mulsd  -0x40(%rbp),%xmm2
mulsd  -0x10(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  0x10(%rax,%rcx,8),%xmm1
movsd  -0x48(%rbp),%xmm3
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  0x18(%rax,%rcx,8),%xmm2
mulsd  -0x48(%rbp),%xmm2
mulsd  -0x10(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  0x20(%rax,%rcx,8),%xmm1
movsd  -0x50(%rbp),%xmm3
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  0x28(%rax,%rcx,8),%xmm2
mulsd  -0x50(%rbp),%xmm2
mulsd  -0x10(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x20(%rbp)
jmp    1195 <poly_6_3a+0x95>
jmp    12af <poly_6_3a+0x1af>
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jg     1301 <poly_6_3a+0x201>
movsd  -0x28(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    12af <poly_6_3a+0x1af>
movsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<poly_6_3a>:
movsd  (%rdi),%xmm2
cmp    $0x7,%rsi
jge    111c <poly_6_3a+0x1c>
xorpd  %xmm1,%xmm1
mov    $0x1,%eax
movapd %xmm0,%xmm3
jmp    11ce <poly_6_3a+0xce>
movapd %xmm0,%xmm4
mulsd  %xmm0,%xmm4
mulsd  %xmm0,%xmm4
movapd %xmm4,%xmm5
mulsd  %xmm0,%xmm5
mulsd  %xmm0,%xmm5
lea    -0x6(%rsi),%rcx
unpcklpd %xmm5,%xmm4
mulsd  %xmm0,%xmm5
movapd %xmm0,%xmm8
unpcklpd %xmm0,%xmm8
movapd %xmm5,%xmm9
unpcklpd %xmm5,%xmm9
xorpd  %xmm1,%xmm1
mov    $0x1,%eax
movapd %xmm0,%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  0x8(%rdi,%rax,8),%xmm6
mulsd  %xmm3,%xmm6
mulsd  %xmm0,%xmm6
movsd  (%rdi,%rax,8),%xmm7
mulsd  %xmm3,%xmm7
addsd  %xmm6,%xmm7
addsd  %xmm7,%xmm2
movsd  0x18(%rdi,%rax,8),%xmm6
movhpd 0x28(%rdi,%rax,8),%xmm6
movsd  0x10(%rdi,%rax,8),%xmm7
mulpd  %xmm4,%xmm6
movhpd 0x20(%rdi,%rax,8),%xmm7
mulpd  %xmm8,%xmm6
mulpd  %xmm4,%xmm7
addpd  %xmm6,%xmm7
addpd  %xmm7,%xmm1
mulsd  %xmm5,%xmm3
mulpd  %xmm9,%xmm4
add    $0x6,%rax
cmp    %rcx,%rax
jle    1170 <poly_6_3a+0x70>
cmp    %rsi,%rax
jg     1280 <poly_6_3a+0x180>
mov    %esi,%edx
sub    %eax,%edx
add    $0x1,%edx
mov    %rsi,%rcx
sub    %rax,%rcx
and    $0x3,%rdx
je     120b <poly_6_3a+0x10b>
nopw   0x0(%rax,%rax,1)
movsd  (%rdi,%rax,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm4,%xmm2
mulsd  %xmm0,%xmm3
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    11f0 <poly_6_3a+0xf0>
cmp    $0x3,%rcx
jb     1280 <poly_6_3a+0x180>
sub    %rax,%rsi
lea    (%rdi,%rax,8),%rax
add    $0x18,%rax
mov    $0xffffffffffffffff,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  -0x10(%rax,%rcx,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm0,%xmm3
movsd  -0x8(%rax,%rcx,8),%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm4,%xmm2
mulsd  %xmm0,%xmm3
movsd  (%rax,%rcx,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm0,%xmm3
movsd  0x8(%rax,%rcx,8),%xmm2
mulsd  %xmm3,%xmm2
addsd  %xmm4,%xmm2
mulsd  %xmm0,%xmm3
add    $0x4,%rcx
cmp    %rcx,%rsi
jne    1230 <poly_6_3a+0x130>
addsd  %xmm1,%xmm2
unpckhpd %xmm1,%xmm1
addsd  %xmm2,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @poly_6_3a(double* %0, double %1, i64 %2) {
%4 = alloca double*
%5 = alloca double
%6 = alloca i64
%7 = alloca i64
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store double* %0, double** %4
store double %1, double* %5
store i64 %2, i64* %6
store i64 1, i64* %7
%15 = load double*, double** %4
%16 = getelementptr inbounds double, double* %15, i64 0
%17 = load double, double* %16
store double %17, double* %8
store double 0.000000e+00, double* %9
store double 0.000000e+00, double* %10
%18 = load double, double* %5
store double %18, double* %11
%19 = load double, double* %5
%20 = load double, double* %5
%21 = fmul double %19, %20
%22 = load double, double* %5
%23 = fmul double %21, %22
store double %23, double* %12
%24 = load double, double* %5
%25 = load double, double* %5
%26 = fmul double %24, %25
%27 = load double, double* %5
%28 = fmul double %26, %27
%29 = load double, double* %5
%30 = fmul double %28, %29
%31 = load double, double* %5
%32 = fmul double %30, %31
store double %32, double* %13
%33 = load double, double* %5
%34 = load double, double* %5
%35 = fmul double %33, %34
%36 = load double, double* %5
%37 = fmul double %35, %36
%38 = load double, double* %5
%39 = fmul double %37, %38
%40 = load double, double* %5
%41 = fmul double %39, %40
%42 = load double, double* %5
%43 = fmul double %41, %42
store double %43, double* %14
br label %44
44: ; preds = %112, %3
%45 = load i64, i64* %7
%46 = load i64, i64* %6
%47 = sub nsw i64 %46, 6
%48 = icmp sle i64 %45, %47
br i1 %48, label %49, label %115
49: ; preds = %44
%50 = load double, double* %8
%51 = load double*, double** %4
%52 = load i64, i64* %7
%53 = getelementptr inbounds double, double* %51, i64 %52
%54 = load double, double* %53
%55 = load double, double* %11
%56 = load double*, double** %4
%57 = load i64, i64* %7
%58 = add nsw i64 %57, 1
%59 = getelementptr inbounds double, double* %56, i64 %58
%60 = load double, double* %59
%61 = load double, double* %11
%62 = fmul double %60, %61
%63 = load double, double* %5
%64 = fmul double %62, %63
%65 = call double @llvm.fmuladd.f64(double %54, double %55, double %64)
%66 = fadd double %50, %65
store double %66, double* %8
%67 = load double, double* %9
%68 = load double*, double** %4
%69 = load i64, i64* %7
%70 = add nsw i64 %69, 2
%71 = getelementptr inbounds double, double* %68, i64 %70
%72 = load double, double* %71
%73 = load double, double* %12
%74 = load double*, double** %4
%75 = load i64, i64* %7
%76 = add nsw i64 %75, 3
%77 = getelementptr inbounds double, double* %74, i64 %76
%78 = load double, double* %77
%79 = load double, double* %12
%80 = fmul double %78, %79
%81 = load double, double* %5
%82 = fmul double %80, %81
%83 = call double @llvm.fmuladd.f64(double %72, double %73, double %82)
%84 = fadd double %67, %83
store double %84, double* %9
%85 = load double, double* %10
%86 = load double*, double** %4
%87 = load i64, i64* %7
%88 = add nsw i64 %87, 4
%89 = getelementptr inbounds double, double* %86, i64 %88
%90 = load double, double* %89
%91 = load double, double* %13
%92 = load double*, double** %4
%93 = load i64, i64* %7
%94 = add nsw i64 %93, 5
%95 = getelementptr inbounds double, double* %92, i64 %94
%96 = load double, double* %95
%97 = load double, double* %13
%98 = fmul double %96, %97
%99 = load double, double* %5
%100 = fmul double %98, %99
%101 = call double @llvm.fmuladd.f64(double %90, double %91, double %100)
%102 = fadd double %85, %101
store double %102, double* %10
%103 = load double, double* %14
%104 = load double, double* %11
%105 = fmul double %104, %103
store double %105, double* %11
%106 = load double, double* %14
%107 = load double, double* %12
%108 = fmul double %107, %106
store double %108, double* %12
%109 = load double, double* %14
%110 = load double, double* %13
%111 = fmul double %110, %109
store double %111, double* %13
br label %112
112: ; preds = %49
%113 = load i64, i64* %7
%114 = add nsw i64 %113, 6
store i64 %114, i64* %7
br label %44
115: ; preds = %44
br label %116
116: ; preds = %131, %115
%117 = load i64, i64* %7
%118 = load i64, i64* %6
%119 = icmp sle i64 %117, %118
br i1 %119, label %120, label %134
120: ; preds = %116
%121 = load double, double* %8
%122 = load double*, double** %4
%123 = load i64, i64* %7
%124 = getelementptr inbounds double, double* %122, i64 %123
%125 = load double, double* %124
%126 = load double, double* %11
%127 = call double @llvm.fmuladd.f64(double %125, double %126, double %121)
store double %127, double* %8
%128 = load double, double* %5
%129 = load double, double* %11
%130 = fmul double %129, %128
store double %130, double* %11
br label %131
131: ; preds = %120
%132 = load i64, i64* %7
%133 = add nsw i64 %132, 1
store i64 %133, i64* %7
br label %116
134: ; preds = %116
%135 = load double, double* %8
%136 = load double, double* %9
%137 = fadd double %135, %136
%138 = load double, double* %10
%139 = fadd double %137, %138
ret double %139
}

LLVM IR (-O2):
define double @poly_6_3a(double* nocapture %0, double %1, i64 %2) {
%4 = load double, double* %0
%5 = fmul double %1, %1
%6 = fmul double %5, %1
%7 = fmul double %6, %1
%8 = fmul double %7, %1
%9 = fmul double %8, %1
%10 = add nsw i64 %2, -6
%11 = icmp slt i64 %2, 7
br i1 %11, label %19, label %12
12: ; preds = %3
%13 = insertelement <2 x double> poison, double %6, i64 0
%14 = insertelement <2 x double> %13, double %8, i64 1
%15 = insertelement <2 x double> poison, double %1, i64 0
%16 = shufflevector <2 x double> %15, <2 x double> poison, <2 x i32> zeroinitializer
%17 = insertelement <2 x double> poison, double %9, i64 0
%18 = shufflevector <2 x double> %17, <2 x double> poison, <2 x i32> zeroinitializer
br label %49
19: ; preds = %49, %3
%20 = phi double [ %4, %3 ], [ %63, %49 ]
%21 = phi double [ %1, %3 ], [ %84, %49 ]
%22 = phi i64 [ 1, %3 ], [ %86, %49 ]
%23 = phi <2 x double> [ zeroinitializer, %3 ], [ %83, %49 ]
%24 = icmp sgt i64 %22, %2
br i1 %24, label %113, label %25
25: ; preds = %19
%26 = add i64 %2, 1
%27 = sub i64 %26, %22
%28 = sub i64 %2, %22
%29 = and i64 %27, 3
%30 = icmp eq i64 %29, 0
br i1 %30, label %43, label %31
31: ; preds = %25, %31
%32 = phi i64 [ %40, %31 ], [ %22, %25 ]
%33 = phi double [ %39, %31 ], [ %21, %25 ]
%34 = phi double [ %38, %31 ], [ %20, %25 ]
%35 = phi i64 [ %41, %31 ], [ 0, %25 ]
%36 = getelementptr inbounds double, double* %0, i64 %32
%37 = load double, double* %36
%38 = tail call double @llvm.fmuladd.f64(double %37, double %33, double %34)
%39 = fmul double %33, %1
%40 = add nuw i64 %32, 1
%41 = add i64 %35, 1
%42 = icmp eq i64 %41, %29
br i1 %42, label %43, label %31
43: ; preds = %31, %25
%44 = phi double [ undef, %25 ], [ %38, %31 ]
%45 = phi i64 [ %22, %25 ], [ %40, %31 ]
%46 = phi double [ %21, %25 ], [ %39, %31 ]
%47 = phi double [ %20, %25 ], [ %38, %31 ]
%48 = icmp ult i64 %28, 3
br i1 %48, label %113, label %88
49: ; preds = %12, %49
%50 = phi i64 [ %86, %49 ], [ 1, %12 ]
%51 = phi double [ %84, %49 ], [ %1, %12 ]
%52 = phi double [ %63, %49 ], [ %4, %12 ]
%53 = phi <2 x double> [ %83, %49 ], [ zeroinitializer, %12 ]
%54 = phi <2 x double> [ %85, %49 ], [ %14, %12 ]
%55 = getelementptr inbounds double, double* %0, i64 %50
%56 = load double, double* %55
%57 = add nuw nsw i64 %50, 1
%58 = getelementptr inbounds double, double* %0, i64 %57
%59 = load double, double* %58
%60 = fmul double %51, %59
%61 = fmul double %60, %1
%62 = tail call double @llvm.fmuladd.f64(double %56, double %51, double %61)
%63 = fadd double %52, %62
%64 = add nuw nsw i64 %50, 2
%65 = getelementptr inbounds double, double* %0, i64 %64
%66 = load double, double* %65
%67 = add nuw nsw i64 %50, 3
%68 = getelementptr inbounds double, double* %0, i64 %67
%69 = load double, double* %68
%70 = add nuw nsw i64 %50, 4
%71 = getelementptr inbounds double, double* %0, i64 %70
%72 = load double, double* %71
%73 = add nuw nsw i64 %50, 5
%74 = getelementptr inbounds double, double* %0, i64 %73
%75 = load double, double* %74
%76 = insertelement <2 x double> poison, double %69, i64 0
%77 = insertelement <2 x double> %76, double %75, i64 1
%78 = fmul <2 x double> %54, %77
%79 = fmul <2 x double> %78, %16
%80 = insertelement <2 x double> poison, double %66, i64 0
%81 = insertelement <2 x double> %80, double %72, i64 1
%82 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %81, <2 x double> %54, <2 x double> %79)
%83 = fadd <2 x double> %53, %82
%84 = fmul double %9, %51
%85 = fmul <2 x double> %18, %54
%86 = add nuw nsw i64 %50, 6
%87 = icmp sgt i64 %86, %10
br i1 %87, label %19, label %49
88: ; preds = %43, %88
%89 = phi i64 [ %111, %88 ], [ %45, %43 ]
%90 = phi double [ %110, %88 ], [ %46, %43 ]
%91 = phi double [ %109, %88 ], [ %47, %43 ]
%92 = getelementptr inbounds double, double* %0, i64 %89
%93 = load double, double* %92
%94 = tail call double @llvm.fmuladd.f64(double %93, double %90, double %91)
%95 = fmul double %90, %1
%96 = add nuw i64 %89, 1
%97 = getelementptr inbounds double, double* %0, i64 %96
%98 = load double, double* %97
%99 = tail call double @llvm.fmuladd.f64(double %98, double %95, double %94)
%100 = fmul double %95, %1
%101 = add nuw i64 %89, 2
%102 = getelementptr inbounds double, double* %0, i64 %101
%103 = load double, double* %102
%104 = tail call double @llvm.fmuladd.f64(double %103, double %100, double %99)
%105 = fmul double %100, %1
%106 = add nuw i64 %89, 3
%107 = getelementptr inbounds double, double* %0, i64 %106
%108 = load double, double* %107
%109 = tail call double @llvm.fmuladd.f64(double %108, double %105, double %104)
%110 = fmul double %105, %1
%111 = add nuw i64 %89, 4
%112 = icmp eq i64 %106, %2
br i1 %112, label %113, label %88
113: ; preds = %43, %88, %19
%114 = phi double [ %20, %19 ], [ %44, %43 ], [ %109, %88 ]
%115 = extractelement <2 x double> %23, i64 0
%116 = fadd double %115, %114
%117 = extractelement <2 x double> %23, i64 1
%118 = fadd double %117, %116
ret double %118
}