void ATM_Dos(double *et, double *e, double *dos) {
  double e21, e31, e32, e41, e42, e43;
  double e1, e2, e4;
  --et;
  e21 = et[2] - et[1];
  e31 = et[3] - et[1];
  e32 = et[3] - et[2];
  e41 = et[4] - et[1];
  e42 = et[4] - et[2];
  e43 = et[4] - et[3];
  if (*e < et[1]) {
    *dos = 0.;
  } else if (*e > et[1] && *e < et[2]) {
    e1 = (*e - et[1]);
    *dos = 3.0 * e1 * e1 / (e21 * e31 * e41);
  } else if (*e > et[2] && *e < et[3]) {
    e2 = (*e - et[2]);
    *dos = (e21 * 3. + e2 * 6. - (e31 + e42) * 3. * e2 * e2 / (e32 * e42)) /
           (e31 * e41);
  } else if (*e > et[3] && *e < et[4]) {
    e4 = (et[4] - *e);
    *dos = 3.0 * e4 * e4 / (e41 * e42 * e43);
  } else if (*e > et[4]) {
    *dos = 0.;
  }
}


x86 assembly (clang, -O0):
<ATM_Dos>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    11d1 <ATM_Dos+0xd1>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13b2 <ATM_Dos+0x2b2>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomisd 0x8(%rax),%xmm0
jbe    124b <ATM_Dos+0x14b>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    124b <ATM_Dos+0x14b>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xddf(%rip),%xmm0
mulsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    13ad <ATM_Dos+0x2ad>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomisd 0x10(%rax),%xmm0
jbe    1302 <ATM_Dos+0x202>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    1302 <ATM_Dos+0x202>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xd68(%rip),%xmm1
mulsd  -0x58(%rbp),%xmm1
movsd  0xd53(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
addsd  -0x40(%rbp),%xmm1
movsd  0xd39(%rip),%xmm2
mulsd  %xmm2,%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
mulsd  -0x40(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    13a8 <ATM_Dos+0x2a8>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomisd 0x18(%rax),%xmm0
jbe    137c <ATM_Dos+0x27c>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    137c <ATM_Dos+0x27c>
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xcae(%rip),%xmm0
mulsd  -0x60(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
mulsd  -0x48(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    13a3 <ATM_Dos+0x2a3>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomisd 0x20(%rax),%xmm0
jbe    139e <ATM_Dos+0x29e>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13a3 <ATM_Dos+0x2a3>
jmp    13a8 <ATM_Dos+0x2a8>
jmp    13ad <ATM_Dos+0x2ad>
jmp    13b2 <ATM_Dos+0x2b2>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ATM_Dos>:
movsd  (%rdi),%xmm0
movsd  (%rsi),%xmm2
xorpd  %xmm1,%xmm1
ucomisd %xmm2,%xmm0
ja     121c <ATM_Dos+0x11c>
movsd  0x8(%rdi),%xmm6
movapd %xmm6,%xmm3
subsd  %xmm0,%xmm3
movsd  0x10(%rdi),%xmm5
movapd %xmm5,%xmm4
subsd  %xmm0,%xmm4
movsd  0x18(%rdi),%xmm7
movapd %xmm7,%xmm9
subsd  %xmm0,%xmm9
ucomisd %xmm0,%xmm2
jbe    1171 <ATM_Dos+0x71>
ucomisd %xmm2,%xmm6
jbe    1171 <ATM_Dos+0x71>
subsd  %xmm0,%xmm2
movsd  0xea9(%rip),%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm4,%xmm3
mulsd  %xmm9,%xmm3
divsd  %xmm3,%xmm1
jmp    121c <ATM_Dos+0x11c>
movapd %xmm7,%xmm8
subsd  %xmm6,%xmm8
ucomisd %xmm6,%xmm2
jbe    11dd <ATM_Dos+0xdd>
ucomisd %xmm2,%xmm5
jbe    11dd <ATM_Dos+0xdd>
subsd  %xmm6,%xmm5
subsd  %xmm6,%xmm2
movsd  0xe71(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  0xe5d(%rip),%xmm1
mulsd  %xmm1,%xmm3
addsd  %xmm0,%xmm3
movapd %xmm4,%xmm0
addsd  %xmm8,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm8,%xmm5
divsd  %xmm5,%xmm0
subsd  %xmm0,%xmm3
mulsd  %xmm4,%xmm9
divsd  %xmm9,%xmm3
movapd %xmm3,%xmm1
jmp    121c <ATM_Dos+0x11c>
ucomisd %xmm5,%xmm2
jbe    1216 <ATM_Dos+0x116>
ucomisd %xmm2,%xmm7
jbe    1216 <ATM_Dos+0x116>
movapd %xmm7,%xmm0
subsd  %xmm5,%xmm0
subsd  %xmm2,%xmm7
movsd  0xe03(%rip),%xmm1
mulsd  %xmm7,%xmm1
mulsd  %xmm7,%xmm1
mulsd  %xmm8,%xmm9
mulsd  %xmm0,%xmm9
divsd  %xmm9,%xmm1
jmp    121c <ATM_Dos+0x11c>
ucomisd %xmm7,%xmm2
jbe    1220 <ATM_Dos+0x120>
movsd  %xmm1,(%rdx)
ret

LLVM IR (-O0):
define void @ATM_Dos(double* %0, double* %1, double* %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca double*
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
store double* %0, double** %4
store double* %1, double** %5
store double* %2, double** %6
%16 = load double*, double** %4
%17 = getelementptr inbounds double, double* %16, i32 -1
store double* %17, double** %4
%18 = load double*, double** %4
%19 = getelementptr inbounds double, double* %18, i64 2
%20 = load double, double* %19
%21 = load double*, double** %4
%22 = getelementptr inbounds double, double* %21, i64 1
%23 = load double, double* %22
%24 = fsub double %20, %23
store double %24, double* %7
%25 = load double*, double** %4
%26 = getelementptr inbounds double, double* %25, i64 3
%27 = load double, double* %26
%28 = load double*, double** %4
%29 = getelementptr inbounds double, double* %28, i64 1
%30 = load double, double* %29
%31 = fsub double %27, %30
store double %31, double* %8
%32 = load double*, double** %4
%33 = getelementptr inbounds double, double* %32, i64 3
%34 = load double, double* %33
%35 = load double*, double** %4
%36 = getelementptr inbounds double, double* %35, i64 2
%37 = load double, double* %36
%38 = fsub double %34, %37
store double %38, double* %9
%39 = load double*, double** %4
%40 = getelementptr inbounds double, double* %39, i64 4
%41 = load double, double* %40
%42 = load double*, double** %4
%43 = getelementptr inbounds double, double* %42, i64 1
%44 = load double, double* %43
%45 = fsub double %41, %44
store double %45, double* %10
%46 = load double*, double** %4
%47 = getelementptr inbounds double, double* %46, i64 4
%48 = load double, double* %47
%49 = load double*, double** %4
%50 = getelementptr inbounds double, double* %49, i64 2
%51 = load double, double* %50
%52 = fsub double %48, %51
store double %52, double* %11
%53 = load double*, double** %4
%54 = getelementptr inbounds double, double* %53, i64 4
%55 = load double, double* %54
%56 = load double*, double** %4
%57 = getelementptr inbounds double, double* %56, i64 3
%58 = load double, double* %57
%59 = fsub double %55, %58
store double %59, double* %12
%60 = load double*, double** %5
%61 = load double, double* %60
%62 = load double*, double** %4
%63 = getelementptr inbounds double, double* %62, i64 1
%64 = load double, double* %63
%65 = fcmp olt double %61, %64
br i1 %65, label %66, label %68
66: ; preds = %3
%67 = load double*, double** %6
store double 0.000000e+00, double* %67
br label %188
68: ; preds = %3
%69 = load double*, double** %5
%70 = load double, double* %69
%71 = load double*, double** %4
%72 = getelementptr inbounds double, double* %71, i64 1
%73 = load double, double* %72
%74 = fcmp ogt double %70, %73
br i1 %74, label %75, label %100
75: ; preds = %68
%76 = load double*, double** %5
%77 = load double, double* %76
%78 = load double*, double** %4
%79 = getelementptr inbounds double, double* %78, i64 2
%80 = load double, double* %79
%81 = fcmp olt double %77, %80
br i1 %81, label %82, label %100
82: ; preds = %75
%83 = load double*, double** %5
%84 = load double, double* %83
%85 = load double*, double** %4
%86 = getelementptr inbounds double, double* %85, i64 1
%87 = load double, double* %86
%88 = fsub double %84, %87
store double %88, double* %13
%89 = load double, double* %13
%90 = fmul double 3.000000e+00, %89
%91 = load double, double* %13
%92 = fmul double %90, %91
%93 = load double, double* %7
%94 = load double, double* %8
%95 = fmul double %93, %94
%96 = load double, double* %10
%97 = fmul double %95, %96
%98 = fdiv double %92, %97
%99 = load double*, double** %6
store double %98, double* %99
br label %187
100: ; preds = %75, %68
%101 = load double*, double** %5
%102 = load double, double* %101
%103 = load double*, double** %4
%104 = getelementptr inbounds double, double* %103, i64 2
%105 = load double, double* %104
%106 = fcmp ogt double %102, %105
br i1 %106, label %107, label %143
107: ; preds = %100
%108 = load double*, double** %5
%109 = load double, double* %108
%110 = load double*, double** %4
%111 = getelementptr inbounds double, double* %110, i64 3
%112 = load double, double* %111
%113 = fcmp olt double %109, %112
br i1 %113, label %114, label %143
114: ; preds = %107
%115 = load double*, double** %5
%116 = load double, double* %115
%117 = load double*, double** %4
%118 = getelementptr inbounds double, double* %117, i64 2
%119 = load double, double* %118
%120 = fsub double %116, %119
store double %120, double* %14
%121 = load double, double* %7
%122 = load double, double* %14
%123 = fmul double %122, 6.000000e+00
%124 = call double @llvm.fmuladd.f64(double %121, double 3.000000e+00, double %123)
%125 = load double, double* %8
%126 = load double, double* %11
%127 = fadd double %125, %126
%128 = fmul double %127, 3.000000e+00
%129 = load double, double* %14
%130 = fmul double %128, %129
%131 = load double, double* %14
%132 = fmul double %130, %131
%133 = load double, double* %9
%134 = load double, double* %11
%135 = fmul double %133, %134
%136 = fdiv double %132, %135
%137 = fsub double %124, %136
%138 = load double, double* %8
%139 = load double, double* %10
%140 = fmul double %138, %139
%141 = fdiv double %137, %140
%142 = load double*, double** %6
store double %141, double* %142
br label %186
143: ; preds = %107, %100
%144 = load double*, double** %5
%145 = load double, double* %144
%146 = load double*, double** %4
%147 = getelementptr inbounds double, double* %146, i64 3
%148 = load double, double* %147
%149 = fcmp ogt double %145, %148
br i1 %149, label %150, label %175
150: ; preds = %143
%151 = load double*, double** %5
%152 = load double, double* %151
%153 = load double*, double** %4
%154 = getelementptr inbounds double, double* %153, i64 4
%155 = load double, double* %154
%156 = fcmp olt double %152, %155
br i1 %156, label %157, label %175
157: ; preds = %150
%158 = load double*, double** %4
%159 = getelementptr inbounds double, double* %158, i64 4
%160 = load double, double* %159
%161 = load double*, double** %5
%162 = load double, double* %161
%163 = fsub double %160, %162
store double %163, double* %15
%164 = load double, double* %15
%165 = fmul double 3.000000e+00, %164
%166 = load double, double* %15
%167 = fmul double %165, %166
%168 = load double, double* %10
%169 = load double, double* %11
%170 = fmul double %168, %169
%171 = load double, double* %12
%172 = fmul double %170, %171
%173 = fdiv double %167, %172
%174 = load double*, double** %6
store double %173, double* %174
br label %185
175: ; preds = %150, %143
%176 = load double*, double** %5
%177 = load double, double* %176
%178 = load double*, double** %4
%179 = getelementptr inbounds double, double* %178, i64 4
%180 = load double, double* %179
%181 = fcmp ogt double %177, %180
br i1 %181, label %182, label %184
182: ; preds = %175
%183 = load double*, double** %6
store double 0.000000e+00, double* %183
br label %184
184: ; preds = %182, %175
br label %185
185: ; preds = %184, %157
br label %186
186: ; preds = %185, %114
br label %187
187: ; preds = %186, %82
br label %188
188: ; preds = %187, %66
ret void
}

LLVM IR (-O2):
define void @ATM_Dos(double* nocapture %0, double* nocapture %1, double* nocapture writeonly %2) {
%4 = getelementptr inbounds double, double* %0, i64 1
%5 = load double, double* %4
%6 = load double, double* %0
%7 = fsub double %5, %6
%8 = getelementptr inbounds double, double* %0, i64 2
%9 = load double, double* %8
%10 = fsub double %9, %6
%11 = fsub double %9, %5
%12 = getelementptr inbounds double, double* %0, i64 3
%13 = load double, double* %12
%14 = fsub double %13, %6
%15 = fsub double %13, %5
%16 = fsub double %13, %9
%17 = load double, double* %1
%18 = fcmp olt double %17, %6
br i1 %18, label %60, label %19
19: ; preds = %3
%20 = fcmp ogt double %17, %6
%21 = fcmp olt double %17, %5
%22 = select i1 %20, i1 %21, i1 false
br i1 %22, label %23, label %30
23: ; preds = %19
%24 = fsub double %17, %6
%25 = fmul double %24, 3.000000e+00
%26 = fmul double %24, %25
%27 = fmul double %7, %10
%28 = fmul double %27, %14
%29 = fdiv double %26, %28
br label %60
30: ; preds = %19
%31 = fcmp ogt double %17, %5
%32 = fcmp olt double %17, %9
%33 = select i1 %31, i1 %32, i1 false
br i1 %33, label %34, label %47
34: ; preds = %30
%35 = fsub double %17, %5
%36 = fmul double %35, 6.000000e+00
%37 = tail call double @llvm.fmuladd.f64(double %7, double 3.000000e+00, double %36)
%38 = fadd double %10, %15
%39 = fmul double %38, 3.000000e+00
%40 = fmul double %35, %39
%41 = fmul double %35, %40
%42 = fmul double %11, %15
%43 = fdiv double %41, %42
%44 = fsub double %37, %43
%45 = fmul double %10, %14
%46 = fdiv double %44, %45
br label %60
47: ; preds = %30
%48 = fcmp ogt double %17, %9
%49 = fcmp olt double %17, %13
%50 = select i1 %48, i1 %49, i1 false
br i1 %50, label %51, label %58
51: ; preds = %47
%52 = fsub double %13, %17
%53 = fmul double %52, 3.000000e+00
%54 = fmul double %52, %53
%55 = fmul double %14, %15
%56 = fmul double %16, %55
%57 = fdiv double %54, %56
br label %60
58: ; preds = %47
%59 = fcmp ogt double %17, %13
br i1 %59, label %60, label %62
60: ; preds = %58, %3, %34, %51, %23
%61 = phi double [ %29, %23 ], [ %57, %51 ], [ %46, %34 ], [ 0.000000e+00, %3 ], [ 0.000000e+00, %58 ]
store double %61, double* %2
br label %62
62: ; preds = %60, %58
ret void
}