void RGBtoHSV(double r, double g, double b, double *h, double *s, double *v) {
  double min = ((r < g && r < b) ? r : (g < b ? g : b));
  double max = ((r > g && r > b) ? r : (g > b ? g : b));
  *v = max / 255.;
  double delta = max - min;
  if (delta != 0) {
    *s = delta / max;
  } else {
    *s = 0;
    *h = -1;
    return;
  }
  if (r == max)
    *h = (g - b) / delta;
  else if (g == max)
    *h = 2 + (b - r) / delta;
  else
    *h = 4 + (r - g) / delta;
  *h *= 60;
  if (*h < 0)
    *h += 360;
}


x86 assembly (clang, -O0):
<RGBtoHSV>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
mov    %rdi,-0x20(%rbp)
mov    %rsi,-0x28(%rbp)
mov    %rdx,-0x30(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1156 <RGBtoHSV+0x56>
movsd  -0x8(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1156 <RGBtoHSV+0x56>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    118d <RGBtoHSV+0x8d>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1179 <RGBtoHSV+0x79>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1183 <RGBtoHSV+0x83>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x8(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11c6 <RGBtoHSV+0xc6>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    11c6 <RGBtoHSV+0xc6>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    11f9 <RGBtoHSV+0xf9>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    11e5 <RGBtoHSV+0xe5>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    11ef <RGBtoHSV+0xef>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  0xdf0(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1248 <RGBtoHSV+0x148>
jp     1248 <RGBtoHSV+0x148>
jmp    125f <RGBtoHSV+0x15f>
movsd  -0x48(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    127f <RGBtoHSV+0x17f>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movsd  0xd92(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    1350 <RGBtoHSV+0x250>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jne    12b1 <RGBtoHSV+0x1b1>
jp     12b1 <RGBtoHSV+0x1b1>
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1317 <RGBtoHSV+0x217>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jne    12ef <RGBtoHSV+0x1ef>
jp     12ef <RGBtoHSV+0x1ef>
movsd  -0x18(%rbp),%xmm1
subsd  -0x8(%rbp),%xmm1
divsd  -0x48(%rbp),%xmm1
movsd  0xd3a(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1312 <RGBtoHSV+0x212>
movsd  -0x8(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
divsd  -0x48(%rbp),%xmm1
movsd  0xd0a(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1317 <RGBtoHSV+0x217>
mov    -0x20(%rbp),%rax
movsd  0xcfd(%rip),%xmm0
mulsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    1350 <RGBtoHSV+0x250>
mov    -0x20(%rbp),%rax
movsd  0xce0(%rip),%xmm0
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<RGBtoHSV>:
movapd %xmm1,%xmm4
minsd  %xmm2,%xmm4
movapd %xmm0,%xmm5
cmpltsd %xmm1,%xmm5
movapd %xmm0,%xmm3
cmpltsd %xmm2,%xmm3
movapd %xmm3,%xmm6
andnpd %xmm4,%xmm6
andpd  %xmm0,%xmm3
orpd   %xmm6,%xmm3
andpd  %xmm5,%xmm3
andnpd %xmm4,%xmm5
orpd   %xmm5,%xmm3
movapd %xmm1,%xmm4
maxsd  %xmm2,%xmm4
movapd %xmm1,%xmm6
cmpltsd %xmm0,%xmm6
movapd %xmm2,%xmm5
cmpltsd %xmm0,%xmm5
movapd %xmm5,%xmm7
andnpd %xmm4,%xmm7
andpd  %xmm0,%xmm5
orpd   %xmm7,%xmm5
andpd  %xmm6,%xmm5
andnpd %xmm4,%xmm6
orpd   %xmm6,%xmm5
movapd %xmm5,%xmm4
divsd  0xe88(%rip),%xmm4
movsd  %xmm4,(%rdx)
movapd %xmm5,%xmm4
subsd  %xmm3,%xmm4
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm4
jne    1190 <RGBtoHSV+0x90>
jnp    11ae <RGBtoHSV+0xae>
movapd %xmm4,%xmm3
divsd  %xmm5,%xmm3
movsd  %xmm3,(%rsi)
ucomisd %xmm0,%xmm5
jne    11c2 <RGBtoHSV+0xc2>
jp     11c2 <RGBtoHSV+0xc2>
subsd  %xmm2,%xmm1
divsd  %xmm4,%xmm1
jmp    11f4 <RGBtoHSV+0xf4>
movq   $0x0,(%rsi)
movsd  0xe4b(%rip),%xmm0
movsd  %xmm0,(%rdi)
ret
ucomisd %xmm1,%xmm5
jne    11e0 <RGBtoHSV+0xe0>
jp     11e0 <RGBtoHSV+0xe0>
subsd  %xmm0,%xmm2
divsd  %xmm4,%xmm2
addsd  0xe3e(%rip),%xmm2
movapd %xmm2,%xmm1
jmp    11f4 <RGBtoHSV+0xf4>
subsd  %xmm1,%xmm0
divsd  %xmm4,%xmm0
addsd  0xe20(%rip),%xmm0
movapd %xmm0,%xmm1
mulsd  0xe24(%rip),%xmm1
movsd  0xe24(%rip),%xmm2
addsd  %xmm1,%xmm2
xorpd  %xmm3,%xmm3
movapd %xmm1,%xmm0
cmpltsd %xmm3,%xmm0
andpd  %xmm0,%xmm2
andnpd %xmm1,%xmm0
orpd   %xmm2,%xmm0
movsd  %xmm0,(%rdi)
ret

LLVM IR (-O0):
define void @RGBtoHSV(double %0, double %1, double %2, double* %3, double* %4, double* %5) {
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double
%14 = alloca double
%15 = alloca double
store double %0, double* %7
store double %1, double* %8
store double %2, double* %9
store double* %3, double** %10
store double* %4, double** %11
store double* %5, double** %12
%16 = load double, double* %7
%17 = load double, double* %8
%18 = fcmp olt double %16, %17
br i1 %18, label %19, label %25
19: ; preds = %6
%20 = load double, double* %7
%21 = load double, double* %9
%22 = fcmp olt double %20, %21
br i1 %22, label %23, label %25
23: ; preds = %19
%24 = load double, double* %7
br label %35
25: ; preds = %19, %6
%26 = load double, double* %8
%27 = load double, double* %9
%28 = fcmp olt double %26, %27
br i1 %28, label %29, label %31
29: ; preds = %25
%30 = load double, double* %8
br label %33
31: ; preds = %25
%32 = load double, double* %9
br label %33
33: ; preds = %31, %29
%34 = phi double [ %30, %29 ], [ %32, %31 ]
br label %35
35: ; preds = %33, %23
%36 = phi double [ %24, %23 ], [ %34, %33 ]
store double %36, double* %13
%37 = load double, double* %7
%38 = load double, double* %8
%39 = fcmp ogt double %37, %38
br i1 %39, label %40, label %46
40: ; preds = %35
%41 = load double, double* %7
%42 = load double, double* %9
%43 = fcmp ogt double %41, %42
br i1 %43, label %44, label %46
44: ; preds = %40
%45 = load double, double* %7
br label %56
46: ; preds = %40, %35
%47 = load double, double* %8
%48 = load double, double* %9
%49 = fcmp ogt double %47, %48
br i1 %49, label %50, label %52
50: ; preds = %46
%51 = load double, double* %8
br label %54
52: ; preds = %46
%53 = load double, double* %9
br label %54
54: ; preds = %52, %50
%55 = phi double [ %51, %50 ], [ %53, %52 ]
br label %56
56: ; preds = %54, %44
%57 = phi double [ %45, %44 ], [ %55, %54 ]
store double %57, double* %14
%58 = load double, double* %14
%59 = fdiv double %58, 2.550000e+02
%60 = load double*, double** %12
store double %59, double* %60
%61 = load double, double* %14
%62 = load double, double* %13
%63 = fsub double %61, %62
store double %63, double* %15
%64 = load double, double* %15
%65 = fcmp une double %64, 0.000000e+00
br i1 %65, label %66, label %71
66: ; preds = %56
%67 = load double, double* %15
%68 = load double, double* %14
%69 = fdiv double %67, %68
%70 = load double*, double** %11
store double %69, double* %70
br label %74
71: ; preds = %56
%72 = load double*, double** %11
store double 0.000000e+00, double* %72
%73 = load double*, double** %10
store double -1.000000e+00, double* %73
br label %117
74: ; preds = %66
%75 = load double, double* %7
%76 = load double, double* %14
%77 = fcmp oeq double %75, %76
br i1 %77, label %78, label %85
78: ; preds = %74
%79 = load double, double* %8
%80 = load double, double* %9
%81 = fsub double %79, %80
%82 = load double, double* %15
%83 = fdiv double %81, %82
%84 = load double*, double** %10
store double %83, double* %84
br label %106
85: ; preds = %74
%86 = load double, double* %8
%87 = load double, double* %14
%88 = fcmp oeq double %86, %87
br i1 %88, label %89, label %97
89: ; preds = %85
%90 = load double, double* %9
%91 = load double, double* %7
%92 = fsub double %90, %91
%93 = load double, double* %15
%94 = fdiv double %92, %93
%95 = fadd double 2.000000e+00, %94
%96 = load double*, double** %10
store double %95, double* %96
br label %105
97: ; preds = %85
%98 = load double, double* %7
%99 = load double, double* %8
%100 = fsub double %98, %99
%101 = load double, double* %15
%102 = fdiv double %100, %101
%103 = fadd double 4.000000e+00, %102
%104 = load double*, double** %10
store double %103, double* %104
br label %105
105: ; preds = %97, %89
br label %106
106: ; preds = %105, %78
%107 = load double*, double** %10
%108 = load double, double* %107
%109 = fmul double %108, 6.000000e+01
store double %109, double* %107
%110 = load double*, double** %10
%111 = load double, double* %110
%112 = fcmp olt double %111, 0.000000e+00
br i1 %112, label %113, label %117
113: ; preds = %106
%114 = load double*, double** %10
%115 = load double, double* %114
%116 = fadd double %115, 3.600000e+02
store double %116, double* %114
br label %117
117: ; preds = %71, %113, %106
ret void
}

LLVM IR (-O2):
define void @RGBtoHSV(double %0, double %1, double %2, double* nocapture %3, double* nocapture writeonly %4, double* nocapture writeonly %5) {
%7 = fcmp olt double %0, %1
%8 = fcmp olt double %0, %2
%9 = and i1 %7, %8
%10 = fcmp olt double %1, %2
%11 = select i1 %10, double %1, double %2
%12 = select i1 %9, double %0, double %11
%13 = fcmp ogt double %0, %1
%14 = fcmp ogt double %0, %2
%15 = and i1 %13, %14
%16 = fcmp ogt double %1, %2
%17 = select i1 %16, double %1, double %2
%18 = select i1 %15, double %0, double %17
%19 = fdiv double %18, 2.550000e+02
store double %19, double* %5
%20 = fsub double %18, %12
%21 = fcmp une double %20, 0.000000e+00
br i1 %21, label %22, label %25
22: ; preds = %6
%23 = fdiv double %20, %18
store double %23, double* %4
%24 = fcmp oeq double %18, %0
br i1 %24, label %26, label %29
25: ; preds = %6
store double 0.000000e+00, double* %4
br label %45
26: ; preds = %22
%27 = fsub double %1, %2
%28 = fdiv double %27, %20
br label %39
29: ; preds = %22
%30 = fcmp oeq double %18, %1
br i1 %30, label %31, label %35
31: ; preds = %29
%32 = fsub double %2, %0
%33 = fdiv double %32, %20
%34 = fadd double %33, 2.000000e+00
br label %39
35: ; preds = %29
%36 = fsub double %0, %1
%37 = fdiv double %36, %20
%38 = fadd double %37, 4.000000e+00
br label %39
39: ; preds = %31, %35, %26
%40 = phi double [ %34, %31 ], [ %38, %35 ], [ %28, %26 ]
%41 = fmul double %40, 6.000000e+01
%42 = fcmp olt double %41, 0.000000e+00
%43 = fadd double %41, 3.600000e+02
%44 = select i1 %42, double %43, double %41
br label %45
45: ; preds = %39, %25
%46 = phi double [ -1.000000e+00, %25 ], [ %44, %39 ]
store double %46, double* %3
ret void
}