double rmsq(int range, double c, double d, double e) {
  double a, b;
  a = (c - d - d + e);
  b = (d + d + d + d - c - c - c - e);
  if (range)
    return 2.0 *
           (a * a * 0.8 + a * b + (4.0 * a * c + b * b) / 3.0 + (b + c) * c);
  else
    return a * a / 20.0 + a * b / 8.0 + a * c / 3.0 + b * b / 12.0 +
           b * c / 2.0 + c * c;
}


x86 assembly (clang, -O0):
<rmsq>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
subsd  -0x20(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     11eb <rmsq+0xeb>
movsd  -0x30(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
movsd  0xeae(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe96(%rip),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm3
movsd  -0x38(%rbp),%xmm2
mulsd  -0x38(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  0xe5a(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xe23(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1280 <rmsq+0x180>
movsd  -0x30(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
movsd  0xe23(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  0xe05(%rip),%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xde3(%rip),%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  0xdc1(%rip),%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xd9f(%rip),%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rmsq>:
movapd %xmm1,%xmm3
addsd  %xmm1,%xmm3
addsd  %xmm1,%xmm3
addsd  %xmm1,%xmm3
subsd  %xmm0,%xmm3
unpcklpd %xmm0,%xmm3
movapd %xmm0,%xmm4
unpcklpd %xmm1,%xmm4
subpd  %xmm4,%xmm3
subpd  %xmm4,%xmm3
unpcklpd %xmm2,%xmm2
movapd %xmm3,%xmm1
subpd  %xmm2,%xmm1
addpd  %xmm3,%xmm2
movapd %xmm2,%xmm3
movsd  %xmm1,%xmm3
unpckhpd %xmm2,%xmm2
movapd %xmm2,%xmm4
mulsd  %xmm2,%xmm4
test   %edi,%edi
je     119d <rmsq+0x9d>
movapd %xmm2,%xmm5
mulsd  %xmm1,%xmm5
mulsd  0xea0(%rip),%xmm4
addsd  %xmm5,%xmm4
movsd  0xe9c(%rip),%xmm5
mulsd  %xmm2,%xmm5
mulsd  %xmm3,%xmm3
mulsd  %xmm0,%xmm5
addsd  %xmm3,%xmm5
divsd  0xe8c(%rip),%xmm5
addsd  %xmm4,%xmm5
addsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm5,%xmm1
addsd  %xmm1,%xmm1
movapd %xmm1,%xmm0
ret
divsd  0xe73(%rip),%xmm4
mulsd  %xmm1,%xmm2
mulsd  0xe6f(%rip),%xmm2
addsd  %xmm4,%xmm2
movapd %xmm1,%xmm4
unpcklpd %xmm0,%xmm4
mulpd  %xmm4,%xmm3
divpd  0xe67(%rip),%xmm3
movapd %xmm3,%xmm4
unpckhpd %xmm3,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm0,%xmm1
mulsd  0xe47(%rip),%xmm1
addsd  %xmm3,%xmm4
addsd  %xmm4,%xmm1
mulsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @rmsq(i32 %0, double %1, double %2, double %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
store i32 %0, i32* %6
store double %1, double* %7
store double %2, double* %8
store double %3, double* %9
%12 = load double, double* %7
%13 = load double, double* %8
%14 = fsub double %12, %13
%15 = load double, double* %8
%16 = fsub double %14, %15
%17 = load double, double* %9
%18 = fadd double %16, %17
store double %18, double* %10
%19 = load double, double* %8
%20 = load double, double* %8
%21 = fadd double %19, %20
%22 = load double, double* %8
%23 = fadd double %21, %22
%24 = load double, double* %8
%25 = fadd double %23, %24
%26 = load double, double* %7
%27 = fsub double %25, %26
%28 = load double, double* %7
%29 = fsub double %27, %28
%30 = load double, double* %7
%31 = fsub double %29, %30
%32 = load double, double* %9
%33 = fsub double %31, %32
store double %33, double* %11
%34 = load i32, i32* %6
%35 = icmp ne i32 %34, 0
br i1 %35, label %36, label %59
36: ; preds = %4
%37 = load double, double* %10
%38 = load double, double* %10
%39 = fmul double %37, %38
%40 = load double, double* %10
%41 = load double, double* %11
%42 = fmul double %40, %41
%43 = call double @llvm.fmuladd.f64(double %39, double 8.000000e-01, double %42)
%44 = load double, double* %10
%45 = fmul double 4.000000e+00, %44
%46 = load double, double* %7
%47 = load double, double* %11
%48 = load double, double* %11
%49 = fmul double %47, %48
%50 = call double @llvm.fmuladd.f64(double %45, double %46, double %49)
%51 = fdiv double %50, 3.000000e+00
%52 = fadd double %43, %51
%53 = load double, double* %11
%54 = load double, double* %7
%55 = fadd double %53, %54
%56 = load double, double* %7
%57 = call double @llvm.fmuladd.f64(double %55, double %56, double %52)
%58 = fmul double 2.000000e+00, %57
store double %58, double* %5
br label %87
59: ; preds = %4
%60 = load double, double* %10
%61 = load double, double* %10
%62 = fmul double %60, %61
%63 = fdiv double %62, 2.000000e+01
%64 = load double, double* %10
%65 = load double, double* %11
%66 = fmul double %64, %65
%67 = fdiv double %66, 8.000000e+00
%68 = fadd double %63, %67
%69 = load double, double* %10
%70 = load double, double* %7
%71 = fmul double %69, %70
%72 = fdiv double %71, 3.000000e+00
%73 = fadd double %68, %72
%74 = load double, double* %11
%75 = load double, double* %11
%76 = fmul double %74, %75
%77 = fdiv double %76, 1.200000e+01
%78 = fadd double %73, %77
%79 = load double, double* %11
%80 = load double, double* %7
%81 = fmul double %79, %80
%82 = fdiv double %81, 2.000000e+00
%83 = fadd double %78, %82
%84 = load double, double* %7
%85 = load double, double* %7
%86 = call double @llvm.fmuladd.f64(double %84, double %85, double %83)
store double %86, double* %5
br label %87
87: ; preds = %59, %36
%88 = load double, double* %5
ret double %88
}

LLVM IR (-O2):
define double @rmsq(i32 %0, double %1, double %2, double %3) {
%5 = fadd double %2, %2
%6 = fadd double %5, %2
%7 = fadd double %6, %2
%8 = fsub double %7, %1
%9 = insertelement <2 x double> poison, double %1, i64 1
%10 = insertelement <2 x double> %9, double %8, i64 0
%11 = insertelement <2 x double> poison, double %1, i64 0
%12 = insertelement <2 x double> %11, double %2, i64 1
%13 = fsub <2 x double> %10, %12
%14 = fsub <2 x double> %13, %12
%15 = insertelement <2 x double> poison, double %3, i64 0
%16 = shufflevector <2 x double> %15, <2 x double> poison, <2 x i32> zeroinitializer
%17 = fsub <2 x double> %14, %16
%18 = fadd <2 x double> %14, %16
%19 = shufflevector <2 x double> %17, <2 x double> %18, <2 x i32> <i32 0, i32 3>
%20 = icmp eq i32 %0, 0
%21 = extractelement <2 x double> %18, i64 1
%22 = fmul double %21, %21
br i1 %20, label %36, label %23
23: ; preds = %4
%24 = extractelement <2 x double> %17, i64 0
%25 = fmul double %21, %24
%26 = tail call double @llvm.fmuladd.f64(double %22, double 8.000000e-01, double %25)
%27 = fmul double %21, 4.000000e+00
%28 = fmul <2 x double> %19, %19
%29 = extractelement <2 x double> %28, i64 0
%30 = tail call double @llvm.fmuladd.f64(double %27, double %1, double %29)
%31 = fdiv double %30, 3.000000e+00
%32 = fadd double %26, %31
%33 = fadd double %24, %1
%34 = tail call double @llvm.fmuladd.f64(double %33, double %1, double %32)
%35 = fmul double %34, 2.000000e+00
br label %53
36: ; preds = %4
%37 = fdiv double %22, 2.000000e+01
%38 = extractelement <2 x double> %17, i64 0
%39 = fmul double %21, %38
%40 = fmul double %39, 1.250000e-01
%41 = fadd double %37, %40
%42 = insertelement <2 x double> %17, double %1, i64 1
%43 = fmul <2 x double> %19, %42
%44 = fdiv <2 x double> %43, <double 1.200000e+01, double 3.000000e+00>
%45 = extractelement <2 x double> %44, i64 1
%46 = fadd double %45, %41
%47 = extractelement <2 x double> %44, i64 0
%48 = fadd double %47, %46
%49 = fmul double %38, %1
%50 = fmul double %49, 5.000000e-01
%51 = fadd double %50, %48
%52 = tail call double @llvm.fmuladd.f64(double %1, double %1, double %51)
br label %53
53: ; preds = %36, %23
%54 = phi double [ %35, %23 ], [ %52, %36 ]
ret double %54
}