extern int rgbD_to_hsvD(const double rgbD[3], double hsvD[3]) {
  double min, max;
  double r, g, b, h, s, v;
  r = rgbD[0];
  g = rgbD[1];
  b = rgbD[2];
  h = 0.0;
  if (r > g) {
    max = (((r) > (b)) ? (r) : (b));
    min = (((g) > (b)) ? (b) : (g));
  } else {
    max = (((g) > (b)) ? (g) : (b));
    min = (((r) > (b)) ? (b) : (r));
  }
  v = max;
  if (max != 0.0)
    s = (max - min) / max;
  else
    s = 0.0;
  if (s == 0.0) {
    h = 0.0;
  } else {
    double delta = max - min;
    if (r == max)
      h = (g - b) / delta;
    else if (g == max)
      h = 2 + (b - r) / delta;
    else if (b == max)
      h = 4 + (r - g) / delta;
    h /= 6.0;
    if (h < 0.0)
      h += 1.0;
    else if (h > 1.0)
      h -= 1.0;
  }
  hsvD[0] = h;
  hsvD[1] = s;
  hsvD[2] = v;
  return 0;
}


x86 assembly (clang, -O0):
<rgbD_to_hsvD>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x28(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    11b8 <rgbD_to_hsvD+0xb8>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    116c <rgbD_to_hsvD+0x6c>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1176 <rgbD_to_hsvD+0x76>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x30(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    119f <rgbD_to_hsvD+0x9f>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    11a9 <rgbD_to_hsvD+0xa9>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    121e <rgbD_to_hsvD+0x11e>
movsd  -0x30(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    11d7 <rgbD_to_hsvD+0xd7>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    11e1 <rgbD_to_hsvD+0xe1>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    120a <rgbD_to_hsvD+0x10a>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
jmp    1214 <rgbD_to_hsvD+0x114>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1245 <rgbD_to_hsvD+0x145>
jp     1245 <rgbD_to_hsvD+0x145>
jmp    125e <rgbD_to_hsvD+0x15e>
movsd  -0x20(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    1266 <rgbD_to_hsvD+0x166>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    128b <rgbD_to_hsvD+0x18b>
jp     128b <rgbD_to_hsvD+0x18b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    13b6 <rgbD_to_hsvD+0x2b6>
movsd  -0x20(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x28(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    12c9 <rgbD_to_hsvD+0x1c9>
jp     12c9 <rgbD_to_hsvD+0x1c9>
movsd  -0x30(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1344 <rgbD_to_hsvD+0x244>
movsd  -0x30(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    1304 <rgbD_to_hsvD+0x204>
jp     1304 <rgbD_to_hsvD+0x204>
movsd  -0x38(%rbp),%xmm1
subsd  -0x28(%rbp),%xmm1
divsd  -0x58(%rbp),%xmm1
movsd  0xd12(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    133f <rgbD_to_hsvD+0x23f>
movsd  -0x38(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    133a <rgbD_to_hsvD+0x23a>
jp     133a <rgbD_to_hsvD+0x23a>
movsd  -0x28(%rbp),%xmm1
subsd  -0x30(%rbp),%xmm1
divsd  -0x58(%rbp),%xmm1
movsd  0xccf(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    133f <rgbD_to_hsvD+0x23f>
jmp    1344 <rgbD_to_hsvD+0x244>
movsd  -0x40(%rbp),%xmm0
movsd  0xcbf(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    137f <rgbD_to_hsvD+0x27f>
movsd  0xca8(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    13b1 <rgbD_to_hsvD+0x2b1>
movsd  -0x40(%rbp),%xmm0
movsd  0xc8c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    13ac <rgbD_to_hsvD+0x2ac>
movsd  -0x40(%rbp),%xmm0
movsd  0xc75(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    13b1 <rgbD_to_hsvD+0x2b1>
jmp    13b6 <rgbD_to_hsvD+0x2b6>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x50(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgbD_to_hsvD>:
movsd  (%rdi),%xmm2
movsd  0x8(%rdi),%xmm4
movsd  0x10(%rdi),%xmm5
movapd %xmm2,%xmm0
maxsd  %xmm4,%xmm0
maxsd  %xmm5,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
xorpd  %xmm3,%xmm3
jne    112e <rgbD_to_hsvD+0x2e>
jnp    11e2 <rgbD_to_hsvD+0xe2>
movapd %xmm4,%xmm1
minsd  %xmm2,%xmm1
movapd %xmm5,%xmm3
minsd  %xmm1,%xmm3
movapd %xmm0,%xmm6
subsd  %xmm3,%xmm6
movapd %xmm6,%xmm1
divsd  %xmm0,%xmm1
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm1
jne    115e <rgbD_to_hsvD+0x5e>
jnp    11e2 <rgbD_to_hsvD+0xe2>
ucomisd %xmm0,%xmm2
jne    1174 <rgbD_to_hsvD+0x74>
jp     1174 <rgbD_to_hsvD+0x74>
subsd  %xmm5,%xmm4
divsd  %xmm6,%xmm4
movapd %xmm4,%xmm3
jmp    11b4 <rgbD_to_hsvD+0xb4>
ucomisd %xmm0,%xmm4
jne    1192 <rgbD_to_hsvD+0x92>
jp     1192 <rgbD_to_hsvD+0x92>
subsd  %xmm2,%xmm5
divsd  %xmm6,%xmm5
addsd  0xe7c(%rip),%xmm5
movapd %xmm5,%xmm3
jmp    11b4 <rgbD_to_hsvD+0xb4>
ucomisd %xmm0,%xmm5
jne    11b0 <rgbD_to_hsvD+0xb0>
jp     11b0 <rgbD_to_hsvD+0xb0>
subsd  %xmm4,%xmm2
divsd  %xmm6,%xmm2
addsd  0xe56(%rip),%xmm2
movapd %xmm2,%xmm3
jmp    11b4 <rgbD_to_hsvD+0xb4>
xorpd  %xmm3,%xmm3
divsd  0xe54(%rip),%xmm3
xorpd  %xmm2,%xmm2
ucomisd %xmm3,%xmm2
jbe    11d0 <rgbD_to_hsvD+0xd0>
addsd  0xe4a(%rip),%xmm3
jmp    11e2 <rgbD_to_hsvD+0xe2>
ucomisd 0xe40(%rip),%xmm3
jbe    11e2 <rgbD_to_hsvD+0xe2>
addsd  0xe3e(%rip),%xmm3
movsd  %xmm3,(%rsi)
movsd  %xmm1,0x8(%rsi)
movsd  %xmm0,0x10(%rsi)
xor    %eax,%eax
ret

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

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