unsigned char map_color(double amount, double comp_amount, float color,
                        float luma, float minColor, float maxColor) {
  double val = (comp_amount * color) +
               amount * (luma * (maxColor - minColor) + minColor);
  return (unsigned char)(255 * (val < 0 ? 0 : (val > 1 ? 1 : val)));
}


x86 assembly (clang, -O0):
<map_color>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movss  %xmm2,-0x14(%rbp)
movss  %xmm3,-0x18(%rbp)
movss  %xmm4,-0x1c(%rbp)
movss  %xmm5,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  -0x8(%rbp),%xmm1
movss  -0x18(%rbp),%xmm3
movss  -0x20(%rbp),%xmm5
subss  -0x1c(%rbp),%xmm5
movss  -0x1c(%rbp),%xmm4
mulss  %xmm5,%xmm3
addss  %xmm4,%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    1181 <map_color+0x81>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    11be <map_color+0xbe>
movsd  -0x28(%rbp),%xmm0
movsd  0xe72(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11aa <map_color+0xaa>
movsd  0xe60(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    11b4 <map_color+0xb4>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xe3d(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<map_color>:
cvtss2sd %xmm2,%xmm2
subss  %xmm4,%xmm5
mulss  %xmm3,%xmm5
addss  %xmm4,%xmm5
xorps  %xmm3,%xmm3
cvtss2sd %xmm5,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
movsd  0xed5(%rip),%xmm0
minsd  %xmm2,%xmm0
mulsd  0xed1(%rip),%xmm0
xorpd  %xmm1,%xmm1
cmpltsd %xmm1,%xmm2
andnpd %xmm0,%xmm2
cvttsd2si %xmm2,%eax
ret

LLVM IR (-O0):
define zeroext i8 @map_color(double %0, double %1, float %2, float %3, float %4, float %5) {
%7 = alloca double
%8 = alloca double
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca double
store double %0, double* %7
store double %1, double* %8
store float %2, float* %9
store float %3, float* %10
store float %4, float* %11
store float %5, float* %12
%14 = load double, double* %8
%15 = load float, float* %9
%16 = fpext float %15 to double
%17 = load double, double* %7
%18 = load float, float* %10
%19 = load float, float* %12
%20 = load float, float* %11
%21 = fsub float %19, %20
%22 = load float, float* %11
%23 = call float @llvm.fmuladd.f32(float %18, float %21, float %22)
%24 = fpext float %23 to double
%25 = fmul double %17, %24
%26 = call double @llvm.fmuladd.f64(double %14, double %16, double %25)
store double %26, double* %13
%27 = load double, double* %13
%28 = fcmp olt double %27, 0.000000e+00
br i1 %28, label %29, label %30
29: ; preds = %6
br label %38
30: ; preds = %6
%31 = load double, double* %13
%32 = fcmp ogt double %31, 1.000000e+00
br i1 %32, label %33, label %34
33: ; preds = %30
br label %36
34: ; preds = %30
%35 = load double, double* %13
br label %36
36: ; preds = %34, %33
%37 = phi double [ 1.000000e+00, %33 ], [ %35, %34 ]
br label %38
38: ; preds = %36, %29
%39 = phi double [ 0.000000e+00, %29 ], [ %37, %36 ]
%40 = fmul double 2.550000e+02, %39
%41 = fptoui double %40 to i8
ret i8 %41
}

LLVM IR (-O2):
define zeroext i8 @map_color(double %0, double %1, float %2, float %3, float %4, float %5) {
%7 = fpext float %2 to double
%8 = fsub float %5, %4
%9 = tail call float @llvm.fmuladd.f32(float %3, float %8, float %4)
%10 = fpext float %9 to double
%11 = fmul double %10, %0
%12 = tail call double @llvm.fmuladd.f64(double %1, double %7, double %11)
%13 = fcmp olt double %12, 0.000000e+00
%14 = fcmp ogt double %12, 1.000000e+00
%15 = select i1 %14, double 1.000000e+00, double %12
%16 = fmul double %15, 2.550000e+02
%17 = select i1 %13, double 0.000000e+00, double %16
%18 = fptoui double %17 to i8
ret i8 %18
}