void hls2rgb(hue_light_sat, rgb) int hue_light_sat[3];
int rgb[3];
{
  double r, g, b, h, l, s;
  double m1, m2;
  h = (double)hue_light_sat[0] / 10.0;
  l = (double)hue_light_sat[1] / 1000.0;
  s = (double)hue_light_sat[2] / 1000.0;
  if (l < 0.5) {
    m2 = l * (1.0 + s);
  } else {
    m2 = l + s - (l * s);
  }
  m1 = (2.0 * l) - m2;
  if ((s + 1.0) == 1.0) {
    if ((h + 1.0) < 1.0) {
      r = g = b = l;
    } else {
      r = g = b = 0.0;
    }
  } else {
    r = hue_value(m1, m2, h - 120.0);
    g = hue_value(m1, m2, h);
    b = hue_value(m1, m2, h + 120.0);
  }
  rgb[0] = 65535.0 * r;
  rgb[1] = 65535.0 * g;
  rgb[2] = 65535.0 * b;
  if (rgb[0] > 65535)
    rgb[0] = 65535;
  else if (rgb[0] < 0)
    rgb[0] = 0;
  if (rgb[1] > 65535)
    rgb[1] = 65535;
  else if (rgb[1] < 0)
    rgb[1] = 0;
  if (rgb[2] > 65535)
    rgb[2] = 65535;
  else if (rgb[2] < 0)
    rgb[2] = 0;
  return;
}


x86 assembly (clang, -O0):
<hls2rgb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
cvtsi2sdl (%rax),%xmm0
movsd  0xee0(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
cvtsi2sdl 0x4(%rax),%xmm0
movsd  0xebe(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
cvtsi2sdl 0x8(%rax),%xmm0
movsd  0xea4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe8b(%rip),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    11a0 <hls2rgb+0x90>
movsd  -0x38(%rbp),%xmm0
movsd  0xe8b(%rip),%xmm1
addsd  -0x40(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    11d8 <hls2rgb+0xc8>
movsd  -0x38(%rbp),%xmm1
addsd  -0x40(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xe0a(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  0xdfd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1280 <hls2rgb+0x170>
jp     1280 <hls2rgb+0x170>
movsd  0xde5(%rip),%xmm1
addsd  -0x30(%rbp),%xmm1
movsd  0xdd8(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1263 <hls2rgb+0x153>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm0,-0x18(%rbp)
jmp    127b <hls2rgb+0x16b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    12f1 <hls2rgb+0x1e1>
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
movsd  0xd89(%rip),%xmm3
subsd  %xmm3,%xmm2
mov    $0x3,%al
call   1030 <hue_value@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
mov    $0x3,%al
call   1030 <hue_value@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movsd  0xd44(%rip),%xmm2
addsd  -0x30(%rbp),%xmm2
mov    $0x3,%al
call   1030 <hue_value@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xd2f(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
cvttsd2si %xmm0,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movsd  0xd18(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
cvttsd2si %xmm0,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
movsd  0xd00(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
cvttsd2si %xmm0,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x10(%rbp),%rax
cmpl   $0xffff,(%rax)
jle    1357 <hls2rgb+0x247>
mov    -0x10(%rbp),%rax
movl   $0xffff,(%rax)
jmp    1373 <hls2rgb+0x263>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
jge    136e <hls2rgb+0x25e>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
jmp    1373 <hls2rgb+0x263>
mov    -0x10(%rbp),%rax
cmpl   $0xffff,0x4(%rax)
jle    1394 <hls2rgb+0x284>
mov    -0x10(%rbp),%rax
movl   $0xffff,0x4(%rax)
jmp    13b2 <hls2rgb+0x2a2>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0x4(%rax)
jge    13ad <hls2rgb+0x29d>
mov    -0x10(%rbp),%rax
movl   $0x0,0x4(%rax)
jmp    13b2 <hls2rgb+0x2a2>
mov    -0x10(%rbp),%rax
cmpl   $0xffff,0x8(%rax)
jle    13d3 <hls2rgb+0x2c3>
mov    -0x10(%rbp),%rax
movl   $0xffff,0x8(%rax)
jmp    13f1 <hls2rgb+0x2e1>
mov    -0x10(%rbp),%rax
cmpl   $0x0,0x8(%rax)
jge    13ec <hls2rgb+0x2dc>
mov    -0x10(%rbp),%rax
movl   $0x0,0x8(%rax)
jmp    13f1 <hls2rgb+0x2e1>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hls2rgb>:
push   %rbx
sub    $0x40,%rsp
mov    %rsi,%rbx
cvtsi2sdl (%rdi),%xmm3
cvtsi2sdl 0x4(%rdi),%xmm2
movsd  0xedf(%rip),%xmm1
divsd  %xmm1,%xmm2
cvtsi2sdl 0x8(%rdi),%xmm0
divsd  %xmm1,%xmm0
movsd  0xed2(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    1156 <hls2rgb+0x46>
addsd  0xecc(%rip),%xmm0
movapd %xmm2,%xmm1
mulsd  %xmm0,%xmm1
jmp    1172 <hls2rgb+0x62>
movapd %xmm2,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm2,%xmm4
mulsd  %xmm0,%xmm4
subsd  %xmm4,%xmm1
addsd  0xea6(%rip),%xmm0
divsd  0xe86(%rip),%xmm3
ucomisd 0xe96(%rip),%xmm0
jne    11a8 <hls2rgb+0x98>
jp     11a8 <hls2rgb+0x98>
movsd  0xe8a(%rip),%xmm0
addsd  %xmm0,%xmm3
cmpltsd %xmm0,%xmm3
andpd  %xmm2,%xmm3
movapd %xmm3,%xmm2
movapd %xmm3,%xmm1
jmp    123a <hls2rgb+0x12a>
addsd  %xmm2,%xmm2
subsd  %xmm1,%xmm2
movapd %xmm2,%xmm0
movapd %xmm2,0x30(%rsp)
movsd  0xe5e(%rip),%xmm2
addsd  %xmm3,%xmm2
mov    $0x3,%al
movapd %xmm3,0x10(%rsp)
movapd %xmm1,0x20(%rsp)
call   1030 <hue_value@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,0x8(%rsp)
movaps 0x30(%rsp),%xmm0
movaps 0x20(%rsp),%xmm1
movaps 0x10(%rsp),%xmm2
mov    $0x3,%al
call   1030 <hue_value@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rsp)
movapd 0x10(%rsp),%xmm2
addsd  0xe12(%rip),%xmm2
movapd 0x30(%rsp),%xmm0
movaps 0x20(%rsp),%xmm1
mov    $0x3,%al
call   1030 <hue_value@plt>
movsd  (%rsp),%xmm2
movsd  0x8(%rsp),%xmm1
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
movsd  0xdee(%rip),%xmm0
mulsd  %xmm0,%xmm1
cvttsd2si %xmm1,%edx
mulsd  %xmm0,%xmm2
cvttsd2si %xmm2,%ecx
mov    %edx,(%rbx)
mulsd  %xmm0,%xmm3
cvttsd2si %xmm3,%eax
mov    %ecx,0x4(%rbx)
mov    %eax,0x8(%rbx)
mov    $0xffff,%esi
cmp    $0xffff,%edx
jg     1275 <hls2rgb+0x165>
test   %edx,%edx
jns    1277 <hls2rgb+0x167>
xor    %esi,%esi
mov    %esi,(%rbx)
mov    $0xffff,%edx
cmp    $0xffff,%ecx
jg     128a <hls2rgb+0x17a>
test   %ecx,%ecx
jns    128d <hls2rgb+0x17d>
xor    %edx,%edx
mov    %edx,0x4(%rbx)
mov    $0xffff,%ecx
cmp    $0xffff,%eax
jg     129f <hls2rgb+0x18f>
test   %eax,%eax
jns    12a2 <hls2rgb+0x192>
xor    %ecx,%ecx
mov    %ecx,0x8(%rbx)
add    $0x40,%rsp
pop    %rbx
ret

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

LLVM IR (-O2):
define void @hls2rgb(i32* nocapture %0, i32* nocapture %1) {
%3 = load i32, i32* %0
%4 = sitofp i32 %3 to double
%5 = fdiv double %4, 1.000000e+01
%6 = getelementptr inbounds i32, i32* %0, i64 1
%7 = load i32, i32* %6
%8 = sitofp i32 %7 to double
%9 = fdiv double %8, 1.000000e+03
%10 = getelementptr inbounds i32, i32* %0, i64 2
%11 = load i32, i32* %10
%12 = sitofp i32 %11 to double
%13 = fdiv double %12, 1.000000e+03
%14 = fcmp olt double %9, 5.000000e-01
br i1 %14, label %15, label %18
15: ; preds = %2
%16 = fadd double %13, 1.000000e+00
%17 = fmul double %9, %16
br label %23
18: ; preds = %2
%19 = fadd double %9, %13
%20 = fneg double %9
%21 = tail call double @llvm.fmuladd.f64(double %20, double %13, double %19)
%22 = fadd double %13, 1.000000e+00
br label %23
23: ; preds = %18, %15
%24 = phi double [ %22, %18 ], [ %16, %15 ]
%25 = phi double [ %21, %18 ], [ %17, %15 ]
%26 = fneg double %25
%27 = tail call double @llvm.fmuladd.f64(double %9, double 2.000000e+00, double %26)
%28 = fcmp oeq double %24, 1.000000e+00
br i1 %28, label %29, label %33
29: ; preds = %23
%30 = fadd double %5, 1.000000e+00
%31 = fcmp olt double %30, 1.000000e+00
%32 = select i1 %31, double %9, double 0.000000e+00
br label %42
33: ; preds = %23
%34 = fadd double %5, -1.200000e+02
%35 = tail call i32 (double, double, double, ...) bitcast (i32 (...)* @hue_value to i32 (double, double, double, ...)*)(double %27, double %25, double %34)
%36 = sitofp i32 %35 to double
%37 = tail call i32 (double, double, double, ...) bitcast (i32 (...)* @hue_value to i32 (double, double, double, ...)*)(double %27, double %25, double %5)
%38 = sitofp i32 %37 to double
%39 = fadd double %5, 1.200000e+02
%40 = tail call i32 (double, double, double, ...) bitcast (i32 (...)* @hue_value to i32 (double, double, double, ...)*)(double %27, double %25, double %39)
%41 = sitofp i32 %40 to double
br label %42
42: ; preds = %29, %33
%43 = phi double [ %41, %33 ], [ %32, %29 ]
%44 = phi double [ %38, %33 ], [ %32, %29 ]
%45 = phi double [ %36, %33 ], [ %32, %29 ]
%46 = fmul double %45, 6.553500e+04
%47 = fptosi double %46 to i32
store i32 %47, i32* %1
%48 = fmul double %44, 6.553500e+04
%49 = fptosi double %48 to i32
%50 = getelementptr inbounds i32, i32* %1, i64 1
store i32 %49, i32* %50
%51 = fmul double %43, 6.553500e+04
%52 = fptosi double %51 to i32
%53 = getelementptr inbounds i32, i32* %1, i64 2
store i32 %52, i32* %53
%54 = icmp sgt i32 %47, 65535
br i1 %54, label %57, label %55
55: ; preds = %42
%56 = icmp slt i32 %47, 0
br i1 %56, label %57, label %59
57: ; preds = %55, %42
%58 = phi i32 [ 65535, %42 ], [ 0, %55 ]
store i32 %58, i32* %1
br label %59
59: ; preds = %57, %55
%60 = icmp sgt i32 %49, 65535
br i1 %60, label %63, label %61
61: ; preds = %59
%62 = icmp slt i32 %49, 0
br i1 %62, label %63, label %65
63: ; preds = %61, %59
%64 = phi i32 [ 65535, %59 ], [ 0, %61 ]
store i32 %64, i32* %50
br label %65
65: ; preds = %63, %61
%66 = icmp sgt i32 %52, 65535
br i1 %66, label %69, label %67
67: ; preds = %65
%68 = icmp slt i32 %52, 0
br i1 %68, label %69, label %71
69: ; preds = %67, %65
%70 = phi i32 [ 65535, %65 ], [ 0, %67 ]
store i32 %70, i32* %53
br label %71
71: ; preds = %69, %67
ret void
}