int hslValue(float m1, float m2, int hue) {
  float value;
  if (hue > 255)
    hue -= 255;
  else if (hue < 0)
    hue += 255;
  if (hue < 42.5) {
    value = m1 + (m2 - m1) * (hue / 42.5);
  } else if (hue < 127.5) {
    value = m2;
  } else if (hue < 170) {
    value = m1 + (m2 - m1) * ((170 - hue) / 42.5);
  } else {
    value = m1;
  }
  return value * 255.f;
}


x86 assembly (clang, -O0):
<hslValue>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
cmpl   $0xff,-0xc(%rbp)
jle    112e <hslValue+0x2e>
mov    -0xc(%rbp),%eax
sub    $0xff,%eax
mov    %eax,-0xc(%rbp)
jmp    1148 <hslValue+0x48>
cmpl   $0x0,-0xc(%rbp)
jge    1143 <hslValue+0x43>
mov    -0xc(%rbp),%eax
add    $0xff,%eax
mov    %eax,-0xc(%rbp)
jmp    1148 <hslValue+0x48>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xeab(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    119d <hslValue+0x9d>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
subss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm2
movsd  0xe7d(%rip),%xmm3
divsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1229 <hslValue+0x129>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xe5e(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11c3 <hslValue+0xc3>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1224 <hslValue+0x124>
cmpl   $0xaa,-0xc(%rbp)
jge    1215 <hslValue+0x115>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
subss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    $0xaa,%eax
sub    -0xc(%rbp),%eax
cvtsi2sd %eax,%xmm2
movsd  0xe05(%rip),%xmm3
divsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    121f <hslValue+0x11f>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    1224 <hslValue+0x124>
jmp    1229 <hslValue+0x129>
movss  0xddf(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
cvttss2si %xmm0,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hslValue>:
lea    -0xff(%rdi),%ecx
lea    0xff(%rdi),%eax
test   %edi,%edi
cmovns %edi,%eax
cmp    $0x100,%edi
cmovge %ecx,%eax
cmp    $0x2a,%eax
jg     114b <hslValue+0x4b>
cvtsi2sd %eax,%xmm2
cvtss2sd %xmm0,%xmm3
subss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
divsd  0xec6(%rip),%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm3,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
jmp    118f <hslValue+0x8f>
cmp    $0x80,%eax
jb     118f <hslValue+0x8f>
cmp    $0xa9,%eax
ja     118c <hslValue+0x8c>
cvtss2sd %xmm0,%xmm2
subss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
mov    $0xaa,%ecx
sub    %eax,%ecx
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
divsd  0xe82(%rip),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
jmp    118f <hslValue+0x8f>
movaps %xmm0,%xmm1
mulss  0xe71(%rip),%xmm1
cvttss2si %xmm1,%eax
ret

LLVM IR (-O0):
define i32 @hslValue(float %0, float %1, i32 %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca i32
%7 = alloca float
store float %0, float* %4
store float %1, float* %5
store i32 %2, i32* %6
%8 = load i32, i32* %6
%9 = icmp sgt i32 %8, 255
br i1 %9, label %10, label %13
10: ; preds = %3
%11 = load i32, i32* %6
%12 = sub nsw i32 %11, 255
store i32 %12, i32* %6
br label %20
13: ; preds = %3
%14 = load i32, i32* %6
%15 = icmp slt i32 %14, 0
br i1 %15, label %16, label %19
16: ; preds = %13
%17 = load i32, i32* %6
%18 = add nsw i32 %17, 255
store i32 %18, i32* %6
br label %19
19: ; preds = %16, %13
br label %20
20: ; preds = %19, %10
%21 = load i32, i32* %6
%22 = sitofp i32 %21 to double
%23 = fcmp olt double %22, 4.250000e+01
br i1 %23, label %24, label %36
24: ; preds = %20
%25 = load float, float* %4
%26 = fpext float %25 to double
%27 = load float, float* %5
%28 = load float, float* %4
%29 = fsub float %27, %28
%30 = fpext float %29 to double
%31 = load i32, i32* %6
%32 = sitofp i32 %31 to double
%33 = fdiv double %32, 4.250000e+01
%34 = call double @llvm.fmuladd.f64(double %30, double %33, double %26)
%35 = fptrunc double %34 to float
store float %35, float* %7
br label %62
36: ; preds = %20
%37 = load i32, i32* %6
%38 = sitofp i32 %37 to double
%39 = fcmp olt double %38, 1.275000e+02
br i1 %39, label %40, label %42
40: ; preds = %36
%41 = load float, float* %5
store float %41, float* %7
br label %61
42: ; preds = %36
%43 = load i32, i32* %6
%44 = icmp slt i32 %43, 170
br i1 %44, label %45, label %58
45: ; preds = %42
%46 = load float, float* %4
%47 = fpext float %46 to double
%48 = load float, float* %5
%49 = load float, float* %4
%50 = fsub float %48, %49
%51 = fpext float %50 to double
%52 = load i32, i32* %6
%53 = sub nsw i32 170, %52
%54 = sitofp i32 %53 to double
%55 = fdiv double %54, 4.250000e+01
%56 = call double @llvm.fmuladd.f64(double %51, double %55, double %47)
%57 = fptrunc double %56 to float
store float %57, float* %7
br label %60
58: ; preds = %42
%59 = load float, float* %4
store float %59, float* %7
br label %60
60: ; preds = %58, %45
br label %61
61: ; preds = %60, %40
br label %62
62: ; preds = %61, %24
%63 = load float, float* %7
%64 = fmul float %63, 2.550000e+02
%65 = fptosi float %64 to i32
ret i32 %65
}

LLVM IR (-O2):
define i32 @hslValue(float %0, float %1, i32 %2) {
%4 = icmp sgt i32 %2, 255
%5 = add nsw i32 %2, -255
%6 = icmp slt i32 %2, 0
%7 = add nsw i32 %2, 255
%8 = select i1 %6, i32 %7, i32 %2
%9 = select i1 %4, i32 %5, i32 %8
%10 = icmp slt i32 %9, 43
br i1 %10, label %11, label %19
11: ; preds = %3
%12 = sitofp i32 %9 to double
%13 = fpext float %0 to double
%14 = fsub float %1, %0
%15 = fpext float %14 to double
%16 = fdiv double %12, 4.250000e+01
%17 = tail call double @llvm.fmuladd.f64(double %15, double %16, double %13)
%18 = fptrunc double %17 to float
br label %32
19: ; preds = %3
%20 = icmp ult i32 %9, 128
br i1 %20, label %32, label %21
21: ; preds = %19
%22 = icmp ult i32 %9, 170
br i1 %22, label %23, label %32
23: ; preds = %21
%24 = fpext float %0 to double
%25 = fsub float %1, %0
%26 = fpext float %25 to double
%27 = sub nuw nsw i32 170, %9
%28 = sitofp i32 %27 to double
%29 = fdiv double %28, 4.250000e+01
%30 = tail call double @llvm.fmuladd.f64(double %26, double %29, double %24)
%31 = fptrunc double %30 to float
br label %32
32: ; preds = %21, %19, %23, %11
%33 = phi float [ %18, %11 ], [ %31, %23 ], [ %1, %19 ], [ %0, %21 ]
%34 = fmul float %33, 2.550000e+02
%35 = fptosi float %34 to i32
ret i32 %35
}