void RGB2HSV(float r, float g, float b, float *h, float *s, float *v) {
  float min, max;
  float delta;
  min = (r > g ? g : r);
  min = (min > b ? b : min);
  max = (r > g ? r : g);
  max = (max > b ? max : b);
  *v = (float)max;
  delta = (float)max - (float)min;
  if (max == 0) {
    *s = 0.0;
    *h = 0;
    *v = 0;
    return;
  }
  if (delta == 0) {
    *h = 0;
    *v = max;
    *s = 0;
    return;
  }
  *s = delta / (float)max;
  if (r == max) {
    if (g >= b)
      *h = ((float)g - (float)b) / delta;
    else
      *h = 6 + ((float)g - (float)b) / delta;
  } else if (g == max)
    *h = 2 + ((float)b - (float)r) / delta;
  else
    *h = 4 + ((float)r - (float)g) / delta;
  *h *= 60;
  return;
}


x86 assembly (clang, -O0):
<RGB2HSV>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    113d <RGB2HSV+0x3d>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
jmp    1147 <RGB2HSV+0x47>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x2c(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    116f <RGB2HSV+0x6f>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
jmp    1179 <RGB2HSV+0x79>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x4(%rbp),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11a1 <RGB2HSV+0xa1>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
jmp    11ab <RGB2HSV+0xab>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jbe    11d3 <RGB2HSV+0xd3>
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    11dd <RGB2HSV+0xdd>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1240 <RGB2HSV+0x140>
jp     1240 <RGB2HSV+0x140>
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    1372 <RGB2HSV+0x272>
movss  -0x34(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    127f <RGB2HSV+0x17f>
jp     127f <RGB2HSV+0x17f>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    1372 <RGB2HSV+0x272>
movss  -0x34(%rbp),%xmm0
divss  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x4(%rbp),%xmm0
ucomiss -0x30(%rbp),%xmm0
jne    12f9 <RGB2HSV+0x1f9>
jp     12f9 <RGB2HSV+0x1f9>
movss  -0x8(%rbp),%xmm0
ucomiss -0xc(%rbp),%xmm0
jb     12d1 <RGB2HSV+0x1d1>
movss  -0x8(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
divss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12f4 <RGB2HSV+0x1f4>
movss  -0x8(%rbp),%xmm1
subss  -0xc(%rbp),%xmm1
divss  -0x34(%rbp),%xmm1
movss  0xd20(%rip),%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    135e <RGB2HSV+0x25e>
movss  -0x8(%rbp),%xmm0
ucomiss -0x30(%rbp),%xmm0
jne    1336 <RGB2HSV+0x236>
jp     1336 <RGB2HSV+0x236>
movss  -0xc(%rbp),%xmm1
subss  -0x4(%rbp),%xmm1
divss  -0x34(%rbp),%xmm1
movss  0xcdf(%rip),%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1359 <RGB2HSV+0x259>
movss  -0x4(%rbp),%xmm1
subss  -0x8(%rbp),%xmm1
divss  -0x34(%rbp),%xmm1
movss  0xcb3(%rip),%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    135e <RGB2HSV+0x25e>
mov    -0x18(%rbp),%rax
movss  0xca2(%rip),%xmm0
mulss  (%rax),%xmm0
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<RGB2HSV>:
movaps %xmm0,%xmm4
maxss  %xmm1,%xmm4
maxss  %xmm2,%xmm4
movss  %xmm4,(%rdx)
xorps  %xmm5,%xmm5
ucomiss %xmm5,%xmm4
jne    112c <RGB2HSV+0x2c>
jp     112c <RGB2HSV+0x2c>
movl   $0x0,(%rsi)
movl   $0x0,(%rdi)
movl   $0x0,(%rdx)
ret
movaps %xmm1,%xmm3
minss  %xmm0,%xmm3
movaps %xmm2,%xmm6
minss  %xmm3,%xmm6
movaps %xmm4,%xmm3
subss  %xmm6,%xmm3
ucomiss %xmm5,%xmm3
jne    1159 <RGB2HSV+0x59>
jp     1159 <RGB2HSV+0x59>
movl   $0x0,(%rdi)
movss  %xmm4,(%rdx)
movl   $0x0,(%rsi)
ret
movaps %xmm3,%xmm5
divss  %xmm4,%xmm5
movss  %xmm5,(%rsi)
ucomiss %xmm0,%xmm4
jne    1182 <RGB2HSV+0x82>
jp     1182 <RGB2HSV+0x82>
ucomiss %xmm2,%xmm1
subss  %xmm2,%xmm1
divss  %xmm3,%xmm1
jae    11b1 <RGB2HSV+0xb1>
addss  0xe88(%rip),%xmm1
jmp    11b1 <RGB2HSV+0xb1>
ucomiss %xmm1,%xmm4
jne    119e <RGB2HSV+0x9e>
jp     119e <RGB2HSV+0x9e>
subss  %xmm0,%xmm2
divss  %xmm3,%xmm2
addss  0xe6b(%rip),%xmm2
movaps %xmm2,%xmm1
jmp    11b1 <RGB2HSV+0xb1>
subss  %xmm1,%xmm0
divss  %xmm3,%xmm0
addss  0xe52(%rip),%xmm0
movaps %xmm0,%xmm1
mulss  0xe53(%rip),%xmm1
movss  %xmm1,(%rdi)
ret

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

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