double dahdsr(double t, double t_on, double t_off, double dl, double a,
              double h, double dc, double s, double r) {
  if (t < t_on + dl)
    return 0.0;
  if (t < t_on + dl + a)
    return (t - t_on - dl) / a;
  if (t < t_on + dl + a + h)
    return 1.0;
  if (t < t_on + dl + a + h + dc)
    return s + (1.0 - s) * (1.0 - (t - t_on - dl - a - h) / dc);
  if (t < t_off)
    return s;
  if (t < t_off + r)
    return s * (1.0 - (t - t_off) / r);
  return 0.0;
}


x86 assembly (clang, -O0):
<dahdsr>:
push   %rbp
mov    %rsp,%rbp
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  %xmm5,-0x38(%rbp)
movsd  %xmm6,-0x40(%rbp)
movsd  %xmm7,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1158 <dahdsr+0x58>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1194 <dahdsr+0x94>
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11c9 <dahdsr+0xc9>
movsd  0xe41(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    123f <dahdsr+0x13f>
movsd  -0x48(%rbp),%xmm1
movsd  0xe02(%rip),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm3
subsd  -0x18(%rbp),%xmm3
subsd  -0x28(%rbp),%xmm3
subsd  -0x30(%rbp),%xmm3
subsd  -0x38(%rbp),%xmm3
divsd  -0x40(%rbp),%xmm3
movsd  0xdd7(%rip),%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
movsd  -0x10(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1262 <dahdsr+0x162>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
movsd  -0x10(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
addsd  0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    12a9 <dahdsr+0x1a9>
movsd  -0x48(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
subsd  -0x20(%rbp),%xmm2
divsd  0x10(%rbp),%xmm2
movsd  0xd69(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b1 <dahdsr+0x1b1>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<dahdsr>:
movapd %xmm1,%xmm9
addsd  %xmm3,%xmm9
xorps  %xmm8,%xmm8
ucomisd %xmm0,%xmm9
jbe    111a <dahdsr+0x1a>
movaps %xmm8,%xmm0
ret
addsd  %xmm4,%xmm9
ucomisd %xmm0,%xmm9
jbe    1133 <dahdsr+0x33>
subsd  %xmm1,%xmm0
subsd  %xmm3,%xmm0
divsd  %xmm4,%xmm0
ret
addsd  %xmm5,%xmm9
ucomisd %xmm0,%xmm9
jbe    1148 <dahdsr+0x48>
movsd  0xeb9(%rip),%xmm0
ret
addsd  %xmm6,%xmm9
ucomisd %xmm0,%xmm9
jbe    118c <dahdsr+0x8c>
movsd  0xea4(%rip),%xmm2
movapd %xmm2,%xmm8
subsd  %xmm7,%xmm8
subsd  %xmm1,%xmm0
subsd  %xmm3,%xmm0
subsd  %xmm4,%xmm0
subsd  %xmm5,%xmm0
divsd  %xmm6,%xmm0
subsd  %xmm0,%xmm2
mulsd  %xmm8,%xmm2
addsd  %xmm7,%xmm2
movapd %xmm2,%xmm0
ret
ucomisd %xmm0,%xmm2
jbe    1196 <dahdsr+0x96>
movaps %xmm7,%xmm0
ret
movsd  0x8(%rsp),%xmm1
movapd %xmm2,%xmm3
addsd  %xmm1,%xmm3
ucomisd %xmm0,%xmm3
jbe    1115 <dahdsr+0x15>
subsd  %xmm2,%xmm0
divsd  %xmm1,%xmm0
movsd  0xe41(%rip),%xmm8
subsd  %xmm0,%xmm8
mulsd  %xmm7,%xmm8
movapd %xmm8,%xmm0
ret

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

LLVM IR (-O2):
define double @dahdsr(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, double %8) {
%10 = fadd double %1, %3
%11 = fcmp ogt double %10, %0
br i1 %11, label %44, label %12
12: ; preds = %9
%13 = fadd double %10, %4
%14 = fcmp ogt double %13, %0
br i1 %14, label %15, label %19
15: ; preds = %12
%16 = fsub double %0, %1
%17 = fsub double %16, %3
%18 = fdiv double %17, %4
br label %44
19: ; preds = %12
%20 = fadd double %13, %5
%21 = fcmp ogt double %20, %0
br i1 %21, label %44, label %22
22: ; preds = %19
%23 = fadd double %20, %6
%24 = fcmp ogt double %23, %0
br i1 %24, label %25, label %34
25: ; preds = %22
%26 = fsub double 1.000000e+00, %7
%27 = fsub double %0, %1
%28 = fsub double %27, %3
%29 = fsub double %28, %4
%30 = fsub double %29, %5
%31 = fdiv double %30, %6
%32 = fsub double 1.000000e+00, %31
%33 = tail call double @llvm.fmuladd.f64(double %26, double %32, double %7)
br label %44
34: ; preds = %22
%35 = fcmp olt double %0, %2
br i1 %35, label %44, label %36
36: ; preds = %34
%37 = fadd double %2, %8
%38 = fcmp ogt double %37, %0
br i1 %38, label %39, label %44
39: ; preds = %36
%40 = fsub double %0, %2
%41 = fdiv double %40, %8
%42 = fsub double 1.000000e+00, %41
%43 = fmul double %42, %7
br label %44
44: ; preds = %36, %34, %19, %9, %39, %25, %15
%45 = phi double [ %18, %15 ], [ %33, %25 ], [ %43, %39 ], [ 0.000000e+00, %9 ], [ 1.000000e+00, %19 ], [ %7, %34 ], [ 0.000000e+00, %36 ]
ret double %45
}