void rgb_to_hsl(unsigned char R, unsigned char G, unsigned char B, float *H,
                float *S, float *L) {
  float var_R = R / 255.0f;
  float var_G = G / 255.0f;
  float var_B = B / 255.0f;
  float var_Min, var_Max, del_Max, del_R, del_G, del_B;
  var_Min = var_R;
  if (var_G < var_Min)
    var_Min = var_G;
  if (var_B < var_Min)
    var_Min = var_B;
  var_Max = var_R;
  if (var_G > var_Max)
    var_Max = var_G;
  if (var_B > var_Max)
    var_Max = var_B;
  del_Max = var_Max - var_Min;
  *L = (var_Max + var_Min) * 0.5f;
  if (del_Max == 0) {
    *H = 0;
    *S = 0;
  } else {
    if (*L < 0.5f) {
      *S = del_Max / (var_Max + var_Min);
    } else {
      *S = del_Max / (2.0f - var_Max - var_Min);
    }
    del_R = (((var_Max - var_R) / 6.0f) + (del_Max / 2.0f)) / del_Max;
    del_G = (((var_Max - var_G) / 6.0f) + (del_Max / 2.0f)) / del_Max;
    del_B = (((var_Max - var_B) / 6.0f) + (del_Max / 2.0f)) / del_Max;
    if (var_R == var_Max) {
      *H = del_B - del_G;
    } else if (var_G == var_Max) {
      *H = (1 / 3.0f) + del_R - del_B;
    } else if (var_B == var_Max) {
      *H = (2.0f / 3.0f) + del_G - del_R;
    }
    if (*H < 0)
      *H += 1;
    if (*H > 1)
      *H -= 1;
  }
}


x86 assembly (clang, -O0):
<rgb_to_hsl>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%dl
mov    %dil,%sil
mov    %sil,-0x1(%rbp)
mov    %dl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
mov    %rcx,-0x10(%rbp)
mov    %r8,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
movzbl -0x1(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  0xece(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
movzbl -0x2(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  0xeb5(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movzbl -0x3(%rbp),%eax
cvtsi2ss %eax,%xmm0
movss  0xe9c(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x28(%rbp),%xmm1
movss  -0x30(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1194 <rgb_to_hsl+0x94>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x2c(%rbp),%xmm1
movss  -0x30(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    11b1 <rgb_to_hsl+0xb1>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x28(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jbe    11d4 <rgb_to_hsl+0xd4>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x2c(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jbe    11ed <rgb_to_hsl+0xed>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
subss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x34(%rbp),%xmm0
addss  -0x30(%rbp),%xmm0
movss  0xdf6(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    124c <rgb_to_hsl+0x14c>
jp     124c <rgb_to_hsl+0x14c>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    1436 <rgb_to_hsl+0x336>
mov    -0x20(%rbp),%rax
movss  0xdac(%rip),%xmm0
ucomiss (%rax),%xmm0
jbe    1281 <rgb_to_hsl+0x181>
movss  -0x38(%rbp),%xmm0
movss  -0x34(%rbp),%xmm1
addss  -0x30(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    12a4 <rgb_to_hsl+0x1a4>
movss  -0x38(%rbp),%xmm0
movss  0xd7a(%rip),%xmm1
subss  -0x34(%rbp),%xmm1
subss  -0x30(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
subss  -0x24(%rbp),%xmm0
movss  0xd56(%rip),%xmm1
divss  %xmm1,%xmm0
movss  -0x38(%rbp),%xmm1
movss  0xd41(%rip),%xmm2
divss  %xmm2,%xmm1
addss  %xmm1,%xmm0
divss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x34(%rbp),%xmm0
subss  -0x28(%rbp),%xmm0
movss  0xd21(%rip),%xmm1
divss  %xmm1,%xmm0
movss  -0x38(%rbp),%xmm1
movss  0xd0c(%rip),%xmm2
divss  %xmm2,%xmm1
addss  %xmm1,%xmm0
divss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x34(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
movss  0xcec(%rip),%xmm1
divss  %xmm1,%xmm0
movss  -0x38(%rbp),%xmm1
movss  0xcd7(%rip),%xmm2
divss  %xmm2,%xmm1
addss  %xmm1,%xmm0
divss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x24(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jne    136f <rgb_to_hsl+0x26f>
jp     136f <rgb_to_hsl+0x26f>
movss  -0x44(%rbp),%xmm0
subss  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13dc <rgb_to_hsl+0x2dc>
movss  -0x28(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jne    13a3 <rgb_to_hsl+0x2a3>
jp     13a3 <rgb_to_hsl+0x2a3>
movss  0xc88(%rip),%xmm0
addss  -0x3c(%rbp),%xmm0
subss  -0x44(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d7 <rgb_to_hsl+0x2d7>
movss  -0x2c(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jne    13d2 <rgb_to_hsl+0x2d2>
jp     13d2 <rgb_to_hsl+0x2d2>
movss  0xc50(%rip),%xmm0
addss  -0x40(%rbp),%xmm0
subss  -0x3c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d7 <rgb_to_hsl+0x2d7>
jmp    13dc <rgb_to_hsl+0x2dc>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
ucomiss (%rax),%xmm0
jbe    1400 <rgb_to_hsl+0x300>
mov    -0x10(%rbp),%rax
movss  0xc20(%rip),%xmm0
addss  (%rax),%xmm0
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  0xc08(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    1431 <rgb_to_hsl+0x331>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  0xbef(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,(%rax)
jmp    1436 <rgb_to_hsl+0x336>
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgb_to_hsl>:
movd   %esi,%xmm0
pinsrw $0x2,%edi,%xmm0
cvtdq2ps %xmm0,%xmm1
divps  0xeed(%rip),%xmm1
cvtsi2ss %edx,%xmm11
divss  0xeef(%rip),%xmm11
movaps %xmm1,%xmm3
shufps $0x55,%xmm1,%xmm3
movaps %xmm1,%xmm0
minss  %xmm3,%xmm0
movaps %xmm11,%xmm6
minss  %xmm0,%xmm6
movaps %xmm1,%xmm2
maxss  %xmm3,%xmm2
movaps %xmm11,%xmm0
maxss  %xmm2,%xmm0
movaps %xmm0,%xmm4
subss  %xmm6,%xmm4
movaps %xmm0,%xmm2
addss  %xmm6,%xmm2
movss  0xeb8(%rip),%xmm5
mulss  %xmm2,%xmm5
movss  %xmm5,(%r9)
xorps  %xmm7,%xmm7
ucomiss %xmm7,%xmm4
jne    117d <rgb_to_hsl+0x7d>
jp     117d <rgb_to_hsl+0x7d>
movl   $0x0,(%rcx)
movl   $0x0,(%r8)
ret
movss  0xe93(%rip),%xmm7
subss  %xmm0,%xmm7
subss  %xmm6,%xmm7
movss  0xe7e(%rip),%xmm10
cmpltss %xmm10,%xmm5
movaps %xmm5,%xmm6
andnps %xmm7,%xmm6
andps  %xmm2,%xmm5
orps   %xmm6,%xmm5
movaps %xmm4,%xmm2
divss  %xmm5,%xmm2
movss  %xmm2,(%r8)
movss  0xe5f(%rip),%xmm9
mulss  %xmm4,%xmm10
movaps %xmm0,%xmm6
subss  %xmm1,%xmm6
divss  %xmm9,%xmm6
addss  %xmm10,%xmm6
divss  %xmm4,%xmm6
movaps %xmm0,%xmm5
subss  %xmm11,%xmm5
divss  %xmm9,%xmm5
addss  %xmm10,%xmm5
divss  %xmm4,%xmm5
ucomiss %xmm0,%xmm3
jne    11fe <rgb_to_hsl+0xfe>
jp     11fe <rgb_to_hsl+0xfe>
subss  %xmm6,%xmm5
movss  %xmm5,(%rcx)
jmp    1258 <rgb_to_hsl+0x158>
movaps %xmm0,%xmm8
subss  %xmm3,%xmm8
divss  %xmm9,%xmm8
addss  %xmm10,%xmm8
divss  %xmm4,%xmm8
ucomiss %xmm0,%xmm1
jne    1236 <rgb_to_hsl+0x136>
jp     1236 <rgb_to_hsl+0x136>
addss  0xdfe(%rip),%xmm8
subss  %xmm5,%xmm8
movss  %xmm8,(%rcx)
movaps %xmm8,%xmm5
jmp    1258 <rgb_to_hsl+0x158>
ucomiss %xmm0,%xmm11
jne    1254 <rgb_to_hsl+0x154>
jp     1254 <rgb_to_hsl+0x154>
addss  0xdda(%rip),%xmm6
subss  %xmm8,%xmm6
movss  %xmm6,(%rcx)
movaps %xmm6,%xmm5
jmp    1258 <rgb_to_hsl+0x158>
movss  (%rcx),%xmm5
xorps  %xmm1,%xmm1
ucomiss %xmm5,%xmm1
movss  0xdc2(%rip),%xmm2
addss  %xmm5,%xmm2
movaps %xmm5,%xmm0
cmpltss %xmm1,%xmm0
andps  %xmm0,%xmm2
andnps %xmm5,%xmm0
orps   %xmm2,%xmm0
ja     1287 <rgb_to_hsl+0x187>
ucomiss 0xda4(%rip),%xmm0
ja     1287 <rgb_to_hsl+0x187>
ret
movss  0xd9d(%rip),%xmm1
addss  %xmm0,%xmm1
movss  0xd8d(%rip),%xmm2
cmpltss %xmm0,%xmm2
andps  %xmm2,%xmm1
andnps %xmm0,%xmm2
orps   %xmm1,%xmm2
movss  %xmm2,(%rcx)
ret

LLVM IR (-O0):
define void @rgb_to_hsl(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2, float* %3, float* %4, float* %5) {
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
store i8 %0, i8* %7
store i8 %1, i8* %8
store i8 %2, i8* %9
store float* %3, float** %10
store float* %4, float** %11
store float* %5, float** %12
%22 = load i8, i8* %7
%23 = zext i8 %22 to i32
%24 = sitofp i32 %23 to float
%25 = fdiv float %24, 2.550000e+02
store float %25, float* %13
%26 = load i8, i8* %8
%27 = zext i8 %26 to i32
%28 = sitofp i32 %27 to float
%29 = fdiv float %28, 2.550000e+02
store float %29, float* %14
%30 = load i8, i8* %9
%31 = zext i8 %30 to i32
%32 = sitofp i32 %31 to float
%33 = fdiv float %32, 2.550000e+02
store float %33, float* %15
%34 = load float, float* %13
store float %34, float* %16
%35 = load float, float* %14
%36 = load float, float* %16
%37 = fcmp olt float %35, %36
br i1 %37, label %38, label %40
38: ; preds = %6
%39 = load float, float* %14
store float %39, float* %16
br label %40
40: ; preds = %38, %6
%41 = load float, float* %15
%42 = load float, float* %16
%43 = fcmp olt float %41, %42
br i1 %43, label %44, label %46
44: ; preds = %40
%45 = load float, float* %15
store float %45, float* %16
br label %46
46: ; preds = %44, %40
%47 = load float, float* %13
store float %47, float* %17
%48 = load float, float* %14
%49 = load float, float* %17
%50 = fcmp ogt float %48, %49
br i1 %50, label %51, label %53
51: ; preds = %46
%52 = load float, float* %14
store float %52, float* %17
br label %53
53: ; preds = %51, %46
%54 = load float, float* %15
%55 = load float, float* %17
%56 = fcmp ogt float %54, %55
br i1 %56, label %57, label %59
57: ; preds = %53
%58 = load float, float* %15
store float %58, float* %17
br label %59
59: ; preds = %57, %53
%60 = load float, float* %17
%61 = load float, float* %16
%62 = fsub float %60, %61
store float %62, float* %18
%63 = load float, float* %17
%64 = load float, float* %16
%65 = fadd float %63, %64
%66 = fmul float %65, 5.000000e-01
%67 = load float*, float** %12
store float %66, float* %67
%68 = load float, float* %18
%69 = fcmp oeq float %68, 0.000000e+00
br i1 %69, label %70, label %73
70: ; preds = %59
%71 = load float*, float** %10
store float 0.000000e+00, float* %71
%72 = load float*, float** %11
store float 0.000000e+00, float* %72
br label %167
73: ; preds = %59
%74 = load float*, float** %12
%75 = load float, float* %74
%76 = fcmp olt float %75, 5.000000e-01
br i1 %76, label %77, label %84
77: ; preds = %73
%78 = load float, float* %18
%79 = load float, float* %17
%80 = load float, float* %16
%81 = fadd float %79, %80
%82 = fdiv float %78, %81
%83 = load float*, float** %11
store float %82, float* %83
br label %92
84: ; preds = %73
%85 = load float, float* %18
%86 = load float, float* %17
%87 = fsub float 2.000000e+00, %86
%88 = load float, float* %16
%89 = fsub float %87, %88
%90 = fdiv float %85, %89
%91 = load float*, float** %11
store float %90, float* %91
br label %92
92: ; preds = %84, %77
%93 = load float, float* %17
%94 = load float, float* %13
%95 = fsub float %93, %94
%96 = fdiv float %95, 6.000000e+00
%97 = load float, float* %18
%98 = fdiv float %97, 2.000000e+00
%99 = fadd float %96, %98
%100 = load float, float* %18
%101 = fdiv float %99, %100
store float %101, float* %19
%102 = load float, float* %17
%103 = load float, float* %14
%104 = fsub float %102, %103
%105 = fdiv float %104, 6.000000e+00
%106 = load float, float* %18
%107 = fdiv float %106, 2.000000e+00
%108 = fadd float %105, %107
%109 = load float, float* %18
%110 = fdiv float %108, %109
store float %110, float* %20
%111 = load float, float* %17
%112 = load float, float* %15
%113 = fsub float %111, %112
%114 = fdiv float %113, 6.000000e+00
%115 = load float, float* %18
%116 = fdiv float %115, 2.000000e+00
%117 = fadd float %114, %116
%118 = load float, float* %18
%119 = fdiv float %117, %118
store float %119, float* %21
%120 = load float, float* %13
%121 = load float, float* %17
%122 = fcmp oeq float %120, %121
br i1 %122, label %123, label %128
123: ; preds = %92
%124 = load float, float* %21
%125 = load float, float* %20
%126 = fsub float %124, %125
%127 = load float*, float** %10
store float %126, float* %127
br label %150
128: ; preds = %92
%129 = load float, float* %14
%130 = load float, float* %17
%131 = fcmp oeq float %129, %130
br i1 %131, label %132, label %138
132: ; preds = %128
%133 = load float, float* %19
%134 = fadd float 0x3FD5555560000000, %133
%135 = load float, float* %21
%136 = fsub float %134, %135
%137 = load float*, float** %10
store float %136, float* %137
br label %149
138: ; preds = %128
%139 = load float, float* %15
%140 = load float, float* %17
%141 = fcmp oeq float %139, %140
br i1 %141, label %142, label %148
142: ; preds = %138
%143 = load float, float* %20
%144 = fadd float 0x3FE5555560000000, %143
%145 = load float, float* %19
%146 = fsub float %144, %145
%147 = load float*, float** %10
store float %146, float* %147
br label %148
148: ; preds = %142, %138
br label %149
149: ; preds = %148, %132
br label %150
150: ; preds = %149, %123
%151 = load float*, float** %10
%152 = load float, float* %151
%153 = fcmp olt float %152, 0.000000e+00
br i1 %153, label %154, label %158
154: ; preds = %150
%155 = load float*, float** %10
%156 = load float, float* %155
%157 = fadd float %156, 1.000000e+00
store float %157, float* %155
br label %158
158: ; preds = %154, %150
%159 = load float*, float** %10
%160 = load float, float* %159
%161 = fcmp ogt float %160, 1.000000e+00
br i1 %161, label %162, label %166
162: ; preds = %158
%163 = load float*, float** %10
%164 = load float, float* %163
%165 = fsub float %164, 1.000000e+00
store float %165, float* %163
br label %166
166: ; preds = %162, %158
br label %167
167: ; preds = %166, %70
ret void
}

LLVM IR (-O2):
define void @rgb_to_hsl(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2, float* nocapture %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = insertelement <2 x i8> poison, i8 %1, i64 0
%8 = insertelement <2 x i8> %7, i8 %0, i64 1
%9 = uitofp <2 x i8> %8 to <2 x float>
%10 = fdiv <2 x float> %9, <float 2.550000e+02, float 2.550000e+02>
%11 = uitofp i8 %2 to float
%12 = fdiv float %11, 2.550000e+02
%13 = extractelement <2 x float> %10, i64 0
%14 = extractelement <2 x float> %10, i64 1
%15 = fcmp olt float %13, %14
%16 = select i1 %15, float %13, float %14
%17 = fcmp olt float %12, %16
%18 = select i1 %17, float %12, float %16
%19 = fcmp ogt float %13, %14
%20 = select i1 %19, float %13, float %14
%21 = fcmp ogt float %12, %20
%22 = select i1 %21, float %12, float %20
%23 = fsub float %22, %18
%24 = fadd float %22, %18
%25 = fmul float %24, 5.000000e-01
store float %25, float* %5
%26 = fcmp oeq float %23, 0.000000e+00
br i1 %26, label %27, label %28
27: ; preds = %6
store float 0.000000e+00, float* %3
store float 0.000000e+00, float* %4
br label %72
28: ; preds = %6
%29 = fcmp olt float %25, 5.000000e-01
%30 = fsub float 2.000000e+00, %22
%31 = fsub float %30, %18
%32 = select i1 %29, float %24, float %31
%33 = fdiv float %23, %32
store float %33, float* %4
%34 = fsub float %22, %14
%35 = fdiv float %34, 6.000000e+00
%36 = fmul float %23, 5.000000e-01
%37 = fadd float %35, %36
%38 = fdiv float %37, %23
%39 = fsub float %22, %13
%40 = fdiv float %39, 6.000000e+00
%41 = fadd float %40, %36
%42 = fdiv float %41, %23
%43 = fsub float %22, %12
%44 = fdiv float %43, 6.000000e+00
%45 = fadd float %44, %36
%46 = fdiv float %45, %23
%47 = fcmp oeq float %14, %22
br i1 %47, label %48, label %50
48: ; preds = %28
%49 = fsub float %46, %42
store float %49, float* %3
br label %62
50: ; preds = %28
%51 = fcmp oeq float %13, %22
br i1 %51, label %52, label %55
52: ; preds = %50
%53 = fadd float %38, 0x3FD5555560000000
%54 = fsub float %53, %46
store float %54, float* %3
br label %62
55: ; preds = %50
%56 = fcmp oeq float %12, %22
br i1 %56, label %57, label %60
57: ; preds = %55
%58 = fadd float %42, 0x3FE5555560000000
%59 = fsub float %58, %38
store float %59, float* %3
br label %62
60: ; preds = %55
%61 = load float, float* %3
br label %62
62: ; preds = %60, %52, %57, %48
%63 = phi float [ %61, %60 ], [ %54, %52 ], [ %59, %57 ], [ %49, %48 ]
%64 = fcmp olt float %63, 0.000000e+00
%65 = fadd float %63, 1.000000e+00
%66 = select i1 %64, float %65, float %63
%67 = fcmp ogt float %66, 1.000000e+00
%68 = or i1 %64, %67
br i1 %68, label %69, label %72
69: ; preds = %62
%70 = fadd float %66, -1.000000e+00
%71 = select i1 %67, float %70, float %66
store float %71, float* %3
br label %72
72: ; preds = %69, %62, %27
ret void
}