double L_LC(int i, int j, int k, const double *L) {
  const double f1 = 1.57542E9, f2 = 1.22760E9, f5 = 1.17645E9;
  double L1, L2, L5;
  if ((i && !L[0]) || (j && !L[1]) || (k && !L[2])) {
    return 0.0;
  }
  L1 = 299792458.0 / f1 * L[0];
  L2 = 299792458.0 / f2 * L[1];
  L5 = 299792458.0 / f5 * L[2];
  return (i * f1 * L1 + j * f2 * L2 + k * f5 * L5) / (i * f1 + j * f2 + k * f5);
}


x86 assembly (clang, -O0):
<L_LC>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
movsd  0xef7(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xee2(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xecd(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     1162 <L_LC+0x62>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1162 <L_LC+0x62>
jp     1162 <L_LC+0x62>
jmp    11b3 <L_LC+0xb3>
cmpl   $0x0,-0x10(%rbp)
je     118d <L_LC+0x8d>
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    118d <L_LC+0x8d>
jp     118d <L_LC+0x8d>
jmp    11b3 <L_LC+0xb3>
cmpl   $0x0,-0x14(%rbp)
je     11c0 <L_LC+0xc0>
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11c0 <L_LC+0xc0>
jp     11c0 <L_LC+0xc0>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1297 <L_LC+0x197>
mov    -0x20(%rbp),%rax
movsd  0xe5c(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0xe3f(%rip),%xmm0
mulsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0xe21(%rip),%xmm0
mulsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe02(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm2
cvtsi2sdl -0x10(%rbp),%xmm0
movsd  0xde4(%rip),%xmm3
mulsd  %xmm3,%xmm0
mulsd  -0x48(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
cvtsi2sdl -0x14(%rbp),%xmm0
movsd  0xdbe(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm2
cvtsi2sdl -0x10(%rbp),%xmm1
movsd  0xda3(%rip),%xmm3
mulsd  %xmm3,%xmm1
movsd  0xd9f(%rip),%xmm3
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
cvtsi2sdl -0x14(%rbp),%xmm1
movsd  0xd7a(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<L_LC>:
test   %edi,%edi
je     1114 <L_LC+0x14>
movsd  (%rcx),%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jne    1114 <L_LC+0x14>
jnp    1142 <L_LC+0x42>
test   %esi,%esi
je     1129 <L_LC+0x29>
movsd  0x8(%rcx),%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jne    1129 <L_LC+0x29>
jnp    1142 <L_LC+0x42>
movsd  0x10(%rcx),%xmm1
test   %edx,%edx
je     1143 <L_LC+0x43>
xorpd  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
jne    1143 <L_LC+0x43>
jp     1143 <L_LC+0x43>
ret
movsd  (%rcx),%xmm2
movsd  0x8(%rcx),%xmm0
mulsd  0xeac(%rip),%xmm2
mulsd  0xeac(%rip),%xmm0
mulsd  0xeac(%rip),%xmm1
cvtsi2sd %edi,%xmm3
movsd  0xea8(%rip),%xmm4
mulsd  %xmm3,%xmm4
cvtsi2sd %esi,%xmm5
mulsd  0xea0(%rip),%xmm5
cvtsi2sd %edx,%xmm6
mulsd  %xmm5,%xmm0
movsd  0xe98(%rip),%xmm7
mulsd  %xmm6,%xmm7
unpcklpd %xmm3,%xmm4
shufpd $0x2,0xe8f(%rip),%xmm2
mulpd  %xmm4,%xmm2
unpcklpd %xmm5,%xmm0
addpd  %xmm2,%xmm0
unpcklpd %xmm6,%xmm7
shufpd $0x2,0xe86(%rip),%xmm1
mulpd  %xmm7,%xmm1
addpd  %xmm0,%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
divsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @L_LC(i32 %0, i32 %1, i32 %2, double* %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double*
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store double* %3, double** %9
store double 1.575420e+09, double* %10
store double 1.227600e+09, double* %11
store double 1.176450e+09, double* %12
%16 = load i32, i32* %6
%17 = icmp ne i32 %16, 0
br i1 %17, label %18, label %23
18: ; preds = %4
%19 = load double*, double** %9
%20 = getelementptr inbounds double, double* %19, i64 0
%21 = load double, double* %20
%22 = fcmp une double %21, 0.000000e+00
br i1 %22, label %23, label %39
23: ; preds = %18, %4
%24 = load i32, i32* %7
%25 = icmp ne i32 %24, 0
br i1 %25, label %26, label %31
26: ; preds = %23
%27 = load double*, double** %9
%28 = getelementptr inbounds double, double* %27, i64 1
%29 = load double, double* %28
%30 = fcmp une double %29, 0.000000e+00
br i1 %30, label %31, label %39
31: ; preds = %26, %23
%32 = load i32, i32* %8
%33 = icmp ne i32 %32, 0
br i1 %33, label %34, label %40
34: ; preds = %31
%35 = load double*, double** %9
%36 = getelementptr inbounds double, double* %35, i64 2
%37 = load double, double* %36
%38 = fcmp une double %37, 0.000000e+00
br i1 %38, label %40, label %39
39: ; preds = %34, %26, %18
store double 0.000000e+00, double* %5
br label %78
40: ; preds = %34, %31
%41 = load double*, double** %9
%42 = getelementptr inbounds double, double* %41, i64 0
%43 = load double, double* %42
%44 = fmul double 0x3FC85B8B06A70079, %43
store double %44, double* %13
%45 = load double*, double** %9
%46 = getelementptr inbounds double, double* %45, i64 1
%47 = load double, double* %46
%48 = fmul double 0x3FCF4247C000FC57, %47
store double %48, double* %14
%49 = load double*, double** %9
%50 = getelementptr inbounds double, double* %49, i64 2
%51 = load double, double* %50
%52 = fmul double 0x3FD04F1A4DEA40E0, %51
store double %52, double* %15
%53 = load i32, i32* %6
%54 = sitofp i32 %53 to double
%55 = fmul double %54, 1.575420e+09
%56 = load double, double* %13
%57 = load i32, i32* %7
%58 = sitofp i32 %57 to double
%59 = fmul double %58, 1.227600e+09
%60 = load double, double* %14
%61 = fmul double %59, %60
%62 = call double @llvm.fmuladd.f64(double %55, double %56, double %61)
%63 = load i32, i32* %8
%64 = sitofp i32 %63 to double
%65 = fmul double %64, 1.176450e+09
%66 = load double, double* %15
%67 = call double @llvm.fmuladd.f64(double %65, double %66, double %62)
%68 = load i32, i32* %6
%69 = sitofp i32 %68 to double
%70 = load i32, i32* %7
%71 = sitofp i32 %70 to double
%72 = fmul double %71, 1.227600e+09
%73 = call double @llvm.fmuladd.f64(double %69, double 1.575420e+09, double %72)
%74 = load i32, i32* %8
%75 = sitofp i32 %74 to double
%76 = call double @llvm.fmuladd.f64(double %75, double 1.176450e+09, double %73)
%77 = fdiv double %67, %76
store double %77, double* %5
br label %78
78: ; preds = %40, %39
%79 = load double, double* %5
ret double %79
}

LLVM IR (-O2):
define double @L_LC(i32 %0, i32 %1, i32 %2, double* nocapture %3) {
%5 = icmp eq i32 %0, 0
br i1 %5, label %9, label %6
6: ; preds = %4
%7 = load double, double* %3
%8 = fcmp une double %7, 0.000000e+00
br i1 %8, label %9, label %48
9: ; preds = %6, %4
%10 = icmp eq i32 %1, 0
br i1 %10, label %15, label %11
11: ; preds = %9
%12 = getelementptr inbounds double, double* %3, i64 1
%13 = load double, double* %12
%14 = fcmp une double %13, 0.000000e+00
br i1 %14, label %15, label %48
15: ; preds = %11, %9
%16 = icmp eq i32 %2, 0
%17 = getelementptr inbounds double, double* %3, i64 2
%18 = load double, double* %17
%19 = fcmp une double %18, 0.000000e+00
%20 = select i1 %16, i1 true, i1 %19
br i1 %20, label %21, label %48
21: ; preds = %15
%22 = load double, double* %3
%23 = fmul double %22, 0x3FC85B8B06A70079
%24 = getelementptr inbounds double, double* %3, i64 1
%25 = load double, double* %24
%26 = fmul double %25, 0x3FCF4247C000FC57
%27 = fmul double %18, 0x3FD04F1A4DEA40E0
%28 = sitofp i32 %0 to double
%29 = fmul double %28, 1.575420e+09
%30 = sitofp i32 %1 to double
%31 = fmul double %30, 1.227600e+09
%32 = fmul double %31, %26
%33 = sitofp i32 %2 to double
%34 = fmul double %33, 1.176450e+09
%35 = insertelement <2 x double> poison, double %29, i64 0
%36 = insertelement <2 x double> %35, double %28, i64 1
%37 = insertelement <2 x double> <double poison, double 1.575420e+09>, double %23, i64 0
%38 = insertelement <2 x double> poison, double %32, i64 0
%39 = insertelement <2 x double> %38, double %31, i64 1
%40 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %37, <2 x double> %39)
%41 = insertelement <2 x double> poison, double %34, i64 0
%42 = insertelement <2 x double> %41, double %33, i64 1
%43 = insertelement <2 x double> <double poison, double 1.176450e+09>, double %27, i64 0
%44 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %42, <2 x double> %43, <2 x double> %40)
%45 = extractelement <2 x double> %44, i64 0
%46 = extractelement <2 x double> %44, i64 1
%47 = fdiv double %45, %46
br label %48
48: ; preds = %15, %6, %11, %21
%49 = phi double [ %47, %21 ], [ 0.000000e+00, %11 ], [ 0.000000e+00, %6 ], [ 0.000000e+00, %15 ]
ret double %49
}