double rgb_to_wheel(double red, double green, double blue) {
  double wheel;
  if (red == green && green == blue)
    wheel = 0.0;
  else if (red <= green && red <= blue)
    wheel = 240.0 * green / (green + blue) + 360.0 * blue / (green + blue);
  else if (green <= red && green <= blue)
    wheel = 120.0 * red / (red + blue) + 0.0 * blue / (red + blue);
  else
    wheel = 240.0 * green / (green + red) + 120.0 * red / (green + red);
  return (wheel);
}


x86 assembly (clang, -O0):
<rgb_to_wheel>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jne    114c <rgb_to_wheel+0x4c>
jp     114c <rgb_to_wheel+0x4c>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    114c <rgb_to_wheel+0x4c>
jp     114c <rgb_to_wheel+0x4c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1268 <rgb_to_wheel+0x168>
movsd  -0x8(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     11b8 <rgb_to_wheel+0xb8>
movsd  -0x8(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     11b8 <rgb_to_wheel+0xb8>
movsd  0xe8c(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe79(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm2
addsd  -0x18(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1263 <rgb_to_wheel+0x163>
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     121f <rgb_to_wheel+0x11f>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     121f <rgb_to_wheel+0x11f>
movsd  0xe18(%rip),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm2
addsd  -0x18(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    125e <rgb_to_wheel+0x15e>
movsd  0xde1(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
addsd  -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  0xdbe(%rip),%xmm1
mulsd  -0x8(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm2
addsd  -0x8(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1263 <rgb_to_wheel+0x163>
jmp    1268 <rgb_to_wheel+0x168>
movsd  -0x20(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb_to_wheel>:
ucomisd %xmm1,%xmm0
jne    1117 <rgb_to_wheel+0x17>
jp     1117 <rgb_to_wheel+0x17>
xorps  %xmm3,%xmm3
ucomisd %xmm2,%xmm1
jne    1117 <rgb_to_wheel+0x17>
jp     1117 <rgb_to_wheel+0x17>
movaps %xmm3,%xmm0
ret
ucomisd %xmm0,%xmm1
jb     1141 <rgb_to_wheel+0x41>
ucomisd %xmm0,%xmm2
jb     1141 <rgb_to_wheel+0x41>
movapd %xmm1,%xmm0
addsd  %xmm2,%xmm0
unpcklpd %xmm2,%xmm1
mulpd  0xec9(%rip),%xmm1
unpcklpd %xmm0,%xmm0
divpd  %xmm0,%xmm1
jmp    119a <rgb_to_wheel+0x9a>
ucomisd %xmm1,%xmm0
jb     117e <rgb_to_wheel+0x7e>
ucomisd %xmm1,%xmm2
jb     117e <rgb_to_wheel+0x7e>
movapd %xmm0,%xmm1
addsd  %xmm2,%xmm1
unpcklpd %xmm2,%xmm0
movsd  0xebf(%rip),%xmm2
mulpd  %xmm0,%xmm2
unpcklpd %xmm1,%xmm1
divpd  %xmm1,%xmm2
movapd %xmm2,%xmm3
unpckhpd %xmm2,%xmm3
addsd  %xmm2,%xmm3
movapd %xmm3,%xmm0
ret
movapd %xmm0,%xmm2
addsd  %xmm1,%xmm2
unpcklpd %xmm0,%xmm1
mulpd  0xe7e(%rip),%xmm1
unpcklpd %xmm2,%xmm2
divpd  %xmm2,%xmm1
movapd %xmm1,%xmm3
unpckhpd %xmm1,%xmm3
addsd  %xmm1,%xmm3
movapd %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @rgb_to_wheel(double %0, double %1, double %2) {
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
store double %0, double* %4
store double %1, double* %5
store double %2, double* %6
%8 = load double, double* %4
%9 = load double, double* %5
%10 = fcmp oeq double %8, %9
br i1 %10, label %11, label %16
11: ; preds = %3
%12 = load double, double* %5
%13 = load double, double* %6
%14 = fcmp oeq double %12, %13
br i1 %14, label %15, label %16
15: ; preds = %11
store double 0.000000e+00, double* %7
br label %76
16: ; preds = %11, %3
%17 = load double, double* %4
%18 = load double, double* %5
%19 = fcmp ole double %17, %18
br i1 %19, label %20, label %38
20: ; preds = %16
%21 = load double, double* %4
%22 = load double, double* %6
%23 = fcmp ole double %21, %22
br i1 %23, label %24, label %38
24: ; preds = %20
%25 = load double, double* %5
%26 = fmul double 2.400000e+02, %25
%27 = load double, double* %5
%28 = load double, double* %6
%29 = fadd double %27, %28
%30 = fdiv double %26, %29
%31 = load double, double* %6
%32 = fmul double 3.600000e+02, %31
%33 = load double, double* %5
%34 = load double, double* %6
%35 = fadd double %33, %34
%36 = fdiv double %32, %35
%37 = fadd double %30, %36
store double %37, double* %7
br label %75
38: ; preds = %20, %16
%39 = load double, double* %5
%40 = load double, double* %4
%41 = fcmp ole double %39, %40
br i1 %41, label %42, label %60
42: ; preds = %38
%43 = load double, double* %5
%44 = load double, double* %6
%45 = fcmp ole double %43, %44
br i1 %45, label %46, label %60
46: ; preds = %42
%47 = load double, double* %4
%48 = fmul double 1.200000e+02, %47
%49 = load double, double* %4
%50 = load double, double* %6
%51 = fadd double %49, %50
%52 = fdiv double %48, %51
%53 = load double, double* %6
%54 = fmul double 0.000000e+00, %53
%55 = load double, double* %4
%56 = load double, double* %6
%57 = fadd double %55, %56
%58 = fdiv double %54, %57
%59 = fadd double %52, %58
store double %59, double* %7
br label %74
60: ; preds = %42, %38
%61 = load double, double* %5
%62 = fmul double 2.400000e+02, %61
%63 = load double, double* %5
%64 = load double, double* %4
%65 = fadd double %63, %64
%66 = fdiv double %62, %65
%67 = load double, double* %4
%68 = fmul double 1.200000e+02, %67
%69 = load double, double* %5
%70 = load double, double* %4
%71 = fadd double %69, %70
%72 = fdiv double %68, %71
%73 = fadd double %66, %72
store double %73, double* %7
br label %74
74: ; preds = %60, %46
br label %75
75: ; preds = %74, %24
br label %76
76: ; preds = %75, %15
%77 = load double, double* %7
ret double %77
}

LLVM IR (-O2):
define double @rgb_to_wheel(double %0, double %1, double %2) {
%4 = fcmp oeq double %0, %1
%5 = fcmp oeq double %1, %2
%6 = and i1 %4, %5
br i1 %6, label %48, label %7
7: ; preds = %3
%8 = fcmp ugt double %0, %1
%9 = fcmp ugt double %0, %2
%10 = or i1 %8, %9
br i1 %10, label %22, label %11
11: ; preds = %7
%12 = fadd double %1, %2
%13 = insertelement <2 x double> poison, double %1, i64 0
%14 = insertelement <2 x double> %13, double %2, i64 1
%15 = fmul <2 x double> %14, <double 2.400000e+02, double 3.600000e+02>
%16 = insertelement <2 x double> poison, double %12, i64 0
%17 = shufflevector <2 x double> %16, <2 x double> poison, <2 x i32> zeroinitializer
%18 = fdiv <2 x double> %15, %17
%19 = shufflevector <2 x double> %18, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%20 = fadd <2 x double> %18, %19
%21 = extractelement <2 x double> %20, i64 0
br label %48
22: ; preds = %7
%23 = fcmp ugt double %1, %0
%24 = fcmp ugt double %1, %2
%25 = or i1 %23, %24
br i1 %25, label %37, label %26
26: ; preds = %22
%27 = fadd double %0, %2
%28 = insertelement <2 x double> poison, double %0, i64 0
%29 = insertelement <2 x double> %28, double %2, i64 1
%30 = fmul <2 x double> %29, <double 1.200000e+02, double 0.000000e+00>
%31 = insertelement <2 x double> poison, double %27, i64 0
%32 = shufflevector <2 x double> %31, <2 x double> poison, <2 x i32> zeroinitializer
%33 = fdiv <2 x double> %30, %32
%34 = shufflevector <2 x double> %33, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%35 = fadd <2 x double> %33, %34
%36 = extractelement <2 x double> %35, i64 0
br label %48
37: ; preds = %22
%38 = fadd double %0, %1
%39 = insertelement <2 x double> poison, double %1, i64 0
%40 = insertelement <2 x double> %39, double %0, i64 1
%41 = fmul <2 x double> %40, <double 2.400000e+02, double 1.200000e+02>
%42 = insertelement <2 x double> poison, double %38, i64 0
%43 = shufflevector <2 x double> %42, <2 x double> poison, <2 x i32> zeroinitializer
%44 = fdiv <2 x double> %41, %43
%45 = shufflevector <2 x double> %44, <2 x double> poison, <2 x i32> <i32 1, i32 undef>
%46 = fadd <2 x double> %44, %45
%47 = extractelement <2 x double> %46, i64 0
br label %48
48: ; preds = %3, %11, %37, %26
%49 = phi double [ %21, %11 ], [ %36, %26 ], [ %47, %37 ], [ 0.000000e+00, %3 ]
ret double %49
}