double HTS_mlsadf1(double x, double *b, const int m, const double a,
                   const double aa, const int pd, double *d,
                   const double *ppade) {
  double v, out = 0.0, *pt;
  int i;
  pt = &d[pd + 1];
  for (i = pd; i >= 1; i--) {
    d[i] = aa * pt[i - 1] + a * d[i];
    pt[i] = d[i] * b[1];
    v = pt[i] * ppade[i];
    x += (1 & i) ? v : -v;
    out += v;
  }
  pt[0] = x;
  out += x;
  return (out);
}


x86 assembly (clang, -O0):
<HTS_mlsadf1>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
mov    %edx,-0x2c(%rbp)
mov    %rcx,-0x38(%rbp)
mov    %r8,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
cmpl   $0x1,-0x5c(%rbp)
jl     1240 <HTS_mlsadf1+0x140>
movsd  -0x28(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x20(%rbp),%xmm1
mov    -0x38(%rbp),%rax
movslq -0x5c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x58(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x5c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x5c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     11f3 <HTS_mlsadf1+0xf3>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1214 <HTS_mlsadf1+0x114>
movsd  -0x48(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
addsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x48(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x5c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x5c(%rbp)
jmp    114b <HTS_mlsadf1+0x4b>
movsd  -0x8(%rbp),%xmm0
mov    -0x58(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x8(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<HTS_mlsadf1>:
movslq %edx,%rsi
lea    (%rcx,%rsi,8),%r9
add    $0x8,%r9
test   %esi,%esi
jle    1173 <HTS_mlsadf1+0x73>
mov    %edx,%edx
xorpd  %xmm3,%xmm3
movapd 0xee3(%rip),%xmm4
jmp    1131 <HTS_mlsadf1+0x31>
nop
addsd  %xmm6,%xmm0
addsd  %xmm5,%xmm3
cmp    $0x1,%rdx
mov    %rsi,%rdx
jbe    1177 <HTS_mlsadf1+0x77>
lea    -0x1(%rdx),%rsi
mov    %esi,%eax
movsd  (%rcx,%rdx,8),%xmm6
mulsd  %xmm1,%xmm6
movsd  (%r9,%rax,8),%xmm5
mulsd  %xmm2,%xmm5
addsd  %xmm6,%xmm5
movsd  %xmm5,(%rcx,%rdx,8)
mulsd  0x8(%rdi),%xmm5
movsd  %xmm5,(%r9,%rdx,8)
mulsd  (%r8,%rdx,8),%xmm5
movapd %xmm5,%xmm6
test   $0x1,%dl
jne    1120 <HTS_mlsadf1+0x20>
xorpd  %xmm4,%xmm6
jmp    1120 <HTS_mlsadf1+0x20>
xorpd  %xmm3,%xmm3
movsd  %xmm0,(%r9)
addsd  %xmm0,%xmm3
movapd %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @HTS_mlsadf1(double %0, double* %1, i32 %2, double %3, double %4, i32 %5, double* %6, double* %7) {
%9 = alloca double
%10 = alloca double*
%11 = alloca i32
%12 = alloca double
%13 = alloca double
%14 = alloca i32
%15 = alloca double*
%16 = alloca double*
%17 = alloca double
%18 = alloca double
%19 = alloca double*
%20 = alloca i32
store double %0, double* %9
store double* %1, double** %10
store i32 %2, i32* %11
store double %3, double* %12
store double %4, double* %13
store i32 %5, i32* %14
store double* %6, double** %15
store double* %7, double** %16
store double 0.000000e+00, double* %18
%21 = load double*, double** %15
%22 = load i32, i32* %14
%23 = add nsw i32 %22, 1
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds double, double* %21, i64 %24
store double* %25, double** %19
%26 = load i32, i32* %14
store i32 %26, i32* %20
br label %27
27: ; preds = %89, %8
%28 = load i32, i32* %20
%29 = icmp sge i32 %28, 1
br i1 %29, label %30, label %92
30: ; preds = %27
%31 = load double, double* %13
%32 = load double*, double** %19
%33 = load i32, i32* %20
%34 = sub nsw i32 %33, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds double, double* %32, i64 %35
%37 = load double, double* %36
%38 = load double, double* %12
%39 = load double*, double** %15
%40 = load i32, i32* %20
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds double, double* %39, i64 %41
%43 = load double, double* %42
%44 = fmul double %38, %43
%45 = call double @llvm.fmuladd.f64(double %31, double %37, double %44)
%46 = load double*, double** %15
%47 = load i32, i32* %20
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds double, double* %46, i64 %48
store double %45, double* %49
%50 = load double*, double** %15
%51 = load i32, i32* %20
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds double, double* %50, i64 %52
%54 = load double, double* %53
%55 = load double*, double** %10
%56 = getelementptr inbounds double, double* %55, i64 1
%57 = load double, double* %56
%58 = fmul double %54, %57
%59 = load double*, double** %19
%60 = load i32, i32* %20
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %59, i64 %61
store double %58, double* %62
%63 = load double*, double** %19
%64 = load i32, i32* %20
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds double, double* %63, i64 %65
%67 = load double, double* %66
%68 = load double*, double** %16
%69 = load i32, i32* %20
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds double, double* %68, i64 %70
%72 = load double, double* %71
%73 = fmul double %67, %72
store double %73, double* %17
%74 = load i32, i32* %20
%75 = and i32 1, %74
%76 = icmp ne i32 %75, 0
br i1 %76, label %77, label %79
77: ; preds = %30
%78 = load double, double* %17
br label %82
79: ; preds = %30
%80 = load double, double* %17
%81 = fneg double %80
br label %82
82: ; preds = %79, %77
%83 = phi double [ %78, %77 ], [ %81, %79 ]
%84 = load double, double* %9
%85 = fadd double %84, %83
store double %85, double* %9
%86 = load double, double* %17
%87 = load double, double* %18
%88 = fadd double %87, %86
store double %88, double* %18
br label %89
89: ; preds = %82
%90 = load i32, i32* %20
%91 = add nsw i32 %90, -1
store i32 %91, i32* %20
br label %27
92: ; preds = %27
%93 = load double, double* %9
%94 = load double*, double** %19
%95 = getelementptr inbounds double, double* %94, i64 0
store double %93, double* %95
%96 = load double, double* %9
%97 = load double, double* %18
%98 = fadd double %97, %96
store double %98, double* %18
%99 = load double, double* %18
ret double %99
}

LLVM IR (-O2):
define double @HTS_mlsadf1(double %0, double* nocapture %1, i32 %2, double %3, double %4, i32 %5, double* nocapture %6, double* nocapture %7) {
%9 = add nsw i32 %5, 1
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds double, double* %6, i64 %10
%12 = icmp sgt i32 %5, 0
br i1 %12, label %13, label %41
13: ; preds = %8
%14 = getelementptr inbounds double, double* %1, i64 1
%15 = zext i32 %5 to i64
br label %16
16: ; preds = %13, %16
%17 = phi i64 [ %15, %13 ], [ %20, %16 ]
%18 = phi double [ %0, %13 ], [ %38, %16 ]
%19 = phi double [ 0.000000e+00, %13 ], [ %39, %16 ]
%20 = add nsw i64 %17, -1
%21 = and i64 %20, 4294967295
%22 = getelementptr inbounds double, double* %11, i64 %21
%23 = load double, double* %22
%24 = getelementptr inbounds double, double* %6, i64 %17
%25 = load double, double* %24
%26 = fmul double %25, %3
%27 = tail call double @llvm.fmuladd.f64(double %4, double %23, double %26)
store double %27, double* %24
%28 = load double, double* %14
%29 = fmul double %27, %28
%30 = getelementptr inbounds double, double* %11, i64 %17
store double %29, double* %30
%31 = getelementptr inbounds double, double* %7, i64 %17
%32 = load double, double* %31
%33 = fmul double %29, %32
%34 = and i64 %17, 1
%35 = icmp eq i64 %34, 0
%36 = fneg double %33
%37 = select i1 %35, double %36, double %33
%38 = fadd double %18, %37
%39 = fadd double %19, %33
%40 = icmp ugt i64 %17, 1
br i1 %40, label %16, label %41
41: ; preds = %16, %8
%42 = phi double [ 0.000000e+00, %8 ], [ %39, %16 ]
%43 = phi double [ %0, %8 ], [ %38, %16 ]
store double %43, double* %11
%44 = fadd double %42, %43
ret double %44
}