float Hue2RGB(float a, float b, float h) {
  if (h < 0.0)
    h += 1;
  if (h > 1.0)
    h -= 1;
  if ((6 * h) < 1.0)
    return (a + (b - a) * 6 * h);
  if ((2 * h) < 1.0)
    return (b);
  if ((3 * h) < 2.0)
    return (a + (b - a) * ((2 / 3.0) - h) * 6);
  return a;
}


x86 assembly (clang, -O0):
<Hue2RGB>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  %xmm2,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    113b <Hue2RGB+0x3b>
movss  0xecf(%rip),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec4(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    116c <Hue2RGB+0x6c>
movss  -0x10(%rbp),%xmm0
movss  0xe9d(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xe90(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe8b(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11c1 <Hue2RGB+0xc1>
movss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
movss  0xe5e(%rip),%xmm2
mulss  %xmm2,%xmm0
movss  -0x10(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    126e <Hue2RGB+0x16e>
movss  0xe3f(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe36(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11f3 <Hue2RGB+0xf3>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    126e <Hue2RGB+0x16e>
movss  0xe11(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe0c(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1264 <Hue2RGB+0x164>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x10(%rbp),%xmm2
cvtss2sd %xmm2,%xmm3
movsd  0xdea(%rip),%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
movsd  0xdd2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    126e <Hue2RGB+0x16e>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Hue2RGB>:
movss  0xef8(%rip),%xmm3
movaps %xmm2,%xmm4
addss  %xmm3,%xmm4
xorps  %xmm5,%xmm5
movaps %xmm2,%xmm6
cmpltss %xmm5,%xmm6
andps  %xmm6,%xmm4
andnps %xmm2,%xmm6
orps   %xmm4,%xmm6
movaps %xmm3,%xmm2
movaps %xmm6,%xmm4
addss  0xed3(%rip),%xmm4
cmpltss %xmm6,%xmm2
andps  %xmm2,%xmm4
andnps %xmm6,%xmm2
orps   %xmm4,%xmm2
movaps %xmm2,%xmm4
mulss  0xebe(%rip),%xmm4
ucomiss %xmm4,%xmm3
jbe    1167 <Hue2RGB+0x67>
subss  %xmm0,%xmm1
mulss  0xead(%rip),%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movaps %xmm1,%xmm0
ret
movaps %xmm2,%xmm4
addss  %xmm2,%xmm4
ucomiss %xmm4,%xmm3
ja     11bf <Hue2RGB+0xbf>
movss  0xe91(%rip),%xmm3
mulss  %xmm2,%xmm3
movss  0xe89(%rip),%xmm4
ucomiss %xmm3,%xmm4
jbe    11c2 <Hue2RGB+0xc2>
subss  %xmm0,%xmm1
cvtss2sd %xmm1,%xmm1
cvtss2sd %xmm2,%xmm2
movsd  0xe78(%rip),%xmm3
subsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm3
mulsd  0xe70(%rip),%xmm3
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm3
xorps  %xmm1,%xmm1
cvtsd2ss %xmm3,%xmm1
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @Hue2RGB(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
store float %0, float* %5
store float %1, float* %6
store float %2, float* %7
%8 = load float, float* %7
%9 = fpext float %8 to double
%10 = fcmp olt double %9, 0.000000e+00
br i1 %10, label %11, label %14
11: ; preds = %3
%12 = load float, float* %7
%13 = fadd float %12, 1.000000e+00
store float %13, float* %7
br label %14
14: ; preds = %11, %3
%15 = load float, float* %7
%16 = fpext float %15 to double
%17 = fcmp ogt double %16, 1.000000e+00
br i1 %17, label %18, label %21
18: ; preds = %14
%19 = load float, float* %7
%20 = fsub float %19, 1.000000e+00
store float %20, float* %7
br label %21
21: ; preds = %18, %14
%22 = load float, float* %7
%23 = fmul float 6.000000e+00, %22
%24 = fpext float %23 to double
%25 = fcmp olt double %24, 1.000000e+00
br i1 %25, label %26, label %34
26: ; preds = %21
%27 = load float, float* %5
%28 = load float, float* %6
%29 = load float, float* %5
%30 = fsub float %28, %29
%31 = fmul float %30, 6.000000e+00
%32 = load float, float* %7
%33 = call float @llvm.fmuladd.f32(float %31, float %32, float %27)
store float %33, float* %4
br label %61
34: ; preds = %21
%35 = load float, float* %7
%36 = fmul float 2.000000e+00, %35
%37 = fpext float %36 to double
%38 = fcmp olt double %37, 1.000000e+00
br i1 %38, label %39, label %41
39: ; preds = %34
%40 = load float, float* %6
store float %40, float* %4
br label %61
41: ; preds = %34
%42 = load float, float* %7
%43 = fmul float 3.000000e+00, %42
%44 = fpext float %43 to double
%45 = fcmp olt double %44, 2.000000e+00
br i1 %45, label %46, label %59
46: ; preds = %41
%47 = load float, float* %5
%48 = fpext float %47 to double
%49 = load float, float* %6
%50 = load float, float* %5
%51 = fsub float %49, %50
%52 = fpext float %51 to double
%53 = load float, float* %7
%54 = fpext float %53 to double
%55 = fsub double 0x3FE5555555555555, %54
%56 = fmul double %52, %55
%57 = call double @llvm.fmuladd.f64(double %56, double 6.000000e+00, double %48)
%58 = fptrunc double %57 to float
store float %58, float* %4
br label %61
59: ; preds = %41
%60 = load float, float* %5
store float %60, float* %4
br label %61
61: ; preds = %59, %46, %39, %26
%62 = load float, float* %4
ret float %62
}

LLVM IR (-O2):
define float @Hue2RGB(float %0, float %1, float %2) {
%4 = fcmp olt float %2, 0.000000e+00
%5 = fadd float %2, 1.000000e+00
%6 = select i1 %4, float %5, float %2
%7 = fcmp ogt float %6, 1.000000e+00
%8 = fadd float %6, -1.000000e+00
%9 = select i1 %7, float %8, float %6
%10 = fmul float %9, 6.000000e+00
%11 = fcmp olt float %10, 1.000000e+00
br i1 %11, label %12, label %16
12: ; preds = %3
%13 = fsub float %1, %0
%14 = fmul float %13, 6.000000e+00
%15 = tail call float @llvm.fmuladd.f32(float %14, float %9, float %0)
br label %31
16: ; preds = %3
%17 = fmul float %9, 2.000000e+00
%18 = fcmp olt float %17, 1.000000e+00
br i1 %18, label %31, label %19
19: ; preds = %16
%20 = fmul float %9, 3.000000e+00
%21 = fcmp olt float %20, 2.000000e+00
br i1 %21, label %22, label %31
22: ; preds = %19
%23 = fpext float %0 to double
%24 = fsub float %1, %0
%25 = fpext float %24 to double
%26 = fpext float %9 to double
%27 = fsub double 0x3FE5555555555555, %26
%28 = fmul double %27, %25
%29 = tail call double @llvm.fmuladd.f64(double %28, double 6.000000e+00, double %23)
%30 = fptrunc double %29 to float
br label %31
31: ; preds = %19, %16, %22, %12
%32 = phi float [ %15, %12 ], [ %30, %22 ], [ %1, %16 ], [ %0, %19 ]
ret float %32
}