void __imlib_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v) {
  float min, max, delta;
  min = (((r < g) ? r : g) < b) ? ((r < g) ? r : g) : b;
  max = (((r > g) ? r : g) > b) ? ((r > g) ? r : g) : b;
  *v = max / 255.0;
  delta = (max - min);
  if (delta == 0) {
    *h = 0.0;
    *s = 0.0;
    return;
  }
  *s = delta / max;
  if (r == max)
    *h = (g - b) / delta;
  else if (g == max)
    *h = 2.0 + (b - r) / delta;
  else
    *h = 4.0 + (r - g) / delta;
  *h *= 60.0;
  if (*h < 0)
    *h += 360.0;
}


x86 assembly (clang, -O0):
<__imlib_rgb_to_hsv>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1130 <__imlib_rgb_to_hsv+0x30>
mov    -0x4(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1136 <__imlib_rgb_to_hsv+0x36>
mov    -0x8(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    116a <__imlib_rgb_to_hsv+0x6a>
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1159 <__imlib_rgb_to_hsv+0x59>
mov    -0x4(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    115f <__imlib_rgb_to_hsv+0x5f>
mov    -0x8(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    1170 <__imlib_rgb_to_hsv+0x70>
mov    -0xc(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1193 <__imlib_rgb_to_hsv+0x93>
mov    -0x4(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    1199 <__imlib_rgb_to_hsv+0x99>
mov    -0x8(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    11cd <__imlib_rgb_to_hsv+0xcd>
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    11bc <__imlib_rgb_to_hsv+0xbc>
mov    -0x4(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    11c2 <__imlib_rgb_to_hsv+0xc2>
mov    -0x8(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x4c(%rbp)
jmp    11d3 <__imlib_rgb_to_hsv+0xd3>
mov    -0xc(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe10(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1241 <__imlib_rgb_to_hsv+0x141>
jp     1241 <__imlib_rgb_to_hsv+0x141>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    1349 <__imlib_rgb_to_hsv+0x249>
movss  -0x34(%rbp),%xmm0
divss  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
cvtsi2ssl -0x4(%rbp),%xmm0
ucomiss -0x30(%rbp),%xmm0
jne    1284 <__imlib_rgb_to_hsv+0x184>
jp     1284 <__imlib_rgb_to_hsv+0x184>
mov    -0x8(%rbp),%eax
sub    -0xc(%rbp),%eax
cvtsi2ss %eax,%xmm0
divss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12f9 <__imlib_rgb_to_hsv+0x1f9>
cvtsi2ssl -0x8(%rbp),%xmm0
ucomiss -0x30(%rbp),%xmm0
jne    12c9 <__imlib_rgb_to_hsv+0x1c9>
jp     12c9 <__imlib_rgb_to_hsv+0x1c9>
mov    -0xc(%rbp),%eax
sub    -0x4(%rbp),%eax
cvtsi2ss %eax,%xmm0
divss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd5c(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12f4 <__imlib_rgb_to_hsv+0x1f4>
mov    -0x4(%rbp),%eax
sub    -0x8(%rbp),%eax
cvtsi2ss %eax,%xmm0
divss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd24(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12f9 <__imlib_rgb_to_hsv+0x1f9>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd0b(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
ucomiss (%rax),%xmm0
jbe    1349 <__imlib_rgb_to_hsv+0x249>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xce3(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<__imlib_rgb_to_hsv>:
mov    %edi,%r10d
sub    %esi,%r10d
mov    %esi,%eax
cmovl  %edi,%eax
mov    %esi,%r11d
cmovg  %edi,%r11d
cmp    %edx,%eax
cmovge %edx,%eax
cvtsi2ss %eax,%xmm2
cmp    %edx,%r11d
cmovle %edx,%r11d
cvtsi2ss %r11d,%xmm1
movaps %xmm1,%xmm0
divss  0xece(%rip),%xmm0
movss  %xmm0,(%r9)
movaps %xmm1,%xmm0
subss  %xmm2,%xmm0
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jne    1156 <__imlib_rgb_to_hsv+0x56>
jp     1156 <__imlib_rgb_to_hsv+0x56>
movl   $0x0,(%rcx)
movl   $0x0,(%r8)
ret
movaps %xmm0,%xmm2
cvtsi2ss %edi,%xmm3
divss  %xmm1,%xmm2
movss  %xmm2,(%r8)
ucomiss %xmm1,%xmm3
jne    117c <__imlib_rgb_to_hsv+0x7c>
jp     117c <__imlib_rgb_to_hsv+0x7c>
sub    %edx,%esi
xorps  %xmm1,%xmm1
cvtsi2ss %esi,%xmm1
divss  %xmm0,%xmm1
jmp    11b5 <__imlib_rgb_to_hsv+0xb5>
xorps  %xmm2,%xmm2
cvtsi2ss %esi,%xmm2
ucomiss %xmm1,%xmm2
jne    11a1 <__imlib_rgb_to_hsv+0xa1>
jp     11a1 <__imlib_rgb_to_hsv+0xa1>
sub    %edi,%edx
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
divss  %xmm0,%xmm1
addss  0xe69(%rip),%xmm1
jmp    11b5 <__imlib_rgb_to_hsv+0xb5>
xorps  %xmm1,%xmm1
cvtsi2ss %r10d,%xmm1
divss  %xmm0,%xmm1
addss  0xe4f(%rip),%xmm1
mulss  0xe4f(%rip),%xmm1
movss  0xe4b(%rip),%xmm0
addss  %xmm1,%xmm0
xorps  %xmm2,%xmm2
movaps %xmm1,%xmm3
cmpltss %xmm2,%xmm3
andps  %xmm3,%xmm0
andnps %xmm1,%xmm3
orps   %xmm0,%xmm3
movss  %xmm3,(%rcx)
ret

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

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