void ftg_getrgb(float h, float s, float v, float *restrict r, float *restrict g,
                float *restrict b) {
  ((void)0);
  ((void)0);
  ((void)0);
  if (s == 0.0f) {
    if (h == 360.f * 2) {
      *r = *g = *b = v;
    } else {
      ((void)0);
      return;
    }
  } else {
    float f, p, q, t;
    int i;
    if (h == 360.0f)
      h = 0.0f;
    h /= 60.0f;
    i = (int)h;
    f = h - i;
    p = v * (1.0f - s);
    q = v * (1.0f - (s * f));
    t = v * (1.0f - (s * (1.0f - f)));
    switch (i) {
    case 0:
      *r = v;
      *g = t;
      *b = p;
      break;
    case 1:
      *r = q;
      *g = v;
      *b = p;
      break;
    case 2:
      *r = p;
      *g = v;
      *b = t;
      break;
    case 3:
      *r = p;
      *g = q;
      *b = v;
      break;
    case 4:
      *r = t;
      *g = p;
      *b = v;
      break;
    case 5:
      *r = v;
      *g = p;
      *b = q;
      break;
    }
  }
}


x86 assembly (clang, -O0):
<ftg_getrgb>:
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  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    117e <ftg_getrgb+0x7e>
jp     117e <ftg_getrgb+0x7e>
movss  -0x4(%rbp),%xmm0
movss  0xec9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    1174 <ftg_getrgb+0x74>
jp     1174 <ftg_getrgb+0x74>
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1179 <ftg_getrgb+0x79>
jmp    136c <ftg_getrgb+0x26c>
jmp    136c <ftg_getrgb+0x26c>
movss  -0x4(%rbp),%xmm0
movss  0xe75(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    11a2 <ftg_getrgb+0xa2>
jp     11a2 <ftg_getrgb+0xa2>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xe55(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
cvttss2si -0x4(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movss  -0x4(%rbp),%xmm0
cvtsi2ssl -0x3c(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm3
movss  0xe23(%rip),%xmm1
movaps %xmm1,%xmm2
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm3
movss  -0x2c(%rbp),%xmm2
mulss  %xmm2,%xmm3
movaps %xmm1,%xmm2
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0x2c(%rbp),%xmm4
movaps %xmm1,%xmm3
subss  %xmm4,%xmm3
mulss  %xmm3,%xmm2
subss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
mov    %rax,-0x48(%rbp)
sub    $0x5,%rax
ja     1367 <ftg_getrgb+0x267>
mov    -0x48(%rbp),%rax
lea    0xdb5(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1367 <ftg_getrgb+0x267>
movss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1367 <ftg_getrgb+0x267>
movss  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1367 <ftg_getrgb+0x267>
movss  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1367 <ftg_getrgb+0x267>
movss  -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1367 <ftg_getrgb+0x267>
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    136c <ftg_getrgb+0x26c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ftg_getrgb>:
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm1
jne    112a <ftg_getrgb+0x2a>
jp     112a <ftg_getrgb+0x2a>
ucomiss 0xefb(%rip),%xmm0
jne    11ed <ftg_getrgb+0xed>
jp     11ed <ftg_getrgb+0xed>
movss  %xmm2,(%rdx)
movss  %xmm2,(%rsi)
movss  %xmm2,(%rdi)
ret
ucomiss 0xecf(%rip),%xmm0
jne    1135 <ftg_getrgb+0x35>
jnp    1140 <ftg_getrgb+0x40>
divss  0xec7(%rip),%xmm0
movaps %xmm0,%xmm3
cvttss2si %xmm3,%eax
cmp    $0x5,%eax
ja     11ed <ftg_getrgb+0xed>
cvttps2dq %xmm3,%xmm0
cvtdq2ps %xmm0,%xmm0
subss  %xmm0,%xmm3
movss  0xea8(%rip),%xmm4
movaps %xmm4,%xmm0
subss  %xmm1,%xmm0
mulss  %xmm2,%xmm0
movaps %xmm1,%xmm6
mulss  %xmm3,%xmm6
movaps %xmm4,%xmm5
subss  %xmm6,%xmm5
mulss  %xmm2,%xmm5
movaps %xmm4,%xmm6
subss  %xmm3,%xmm6
mulss  %xmm1,%xmm6
subss  %xmm6,%xmm4
mulss  %xmm2,%xmm4
lea    0xe79(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  %xmm2,(%rdi)
movss  %xmm4,(%rsi)
movss  %xmm0,(%rdx)
ret
movss  %xmm5,(%rdi)
movss  %xmm2,(%rsi)
movss  %xmm0,(%rdx)
ret
movss  %xmm0,(%rdi)
movss  %xmm2,(%rsi)
movss  %xmm4,(%rdx)
ret
movss  %xmm0,(%rdi)
movss  %xmm5,(%rsi)
movss  %xmm2,(%rdx)
ret
movss  %xmm4,(%rdi)
movss  %xmm0,(%rsi)
movss  %xmm2,(%rdx)
ret
movss  %xmm2,(%rdi)
movss  %xmm0,(%rsi)
movss  %xmm5,(%rdx)
ret

LLVM IR (-O0):
define void @ftg_getrgb(float %0, float %1, float %2, float* noalias %3, float* noalias %4, float* noalias %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
%16 = alloca float
%17 = alloca i32
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
%18 = load float, float* %8
%19 = fcmp oeq float %18, 0.000000e+00
br i1 %19, label %20, label %30
20: ; preds = %6
%21 = load float, float* %7
%22 = fcmp oeq float %21, 7.200000e+02
br i1 %22, label %23, label %28
23: ; preds = %20
%24 = load float, float* %9
%25 = load float*, float** %12
store float %24, float* %25
%26 = load float*, float** %11
store float %24, float* %26
%27 = load float*, float** %10
store float %24, float* %27
br label %29
28: ; preds = %20
br label %104
29: ; preds = %23
br label %104
30: ; preds = %6
%31 = load float, float* %7
%32 = fcmp oeq float %31, 3.600000e+02
br i1 %32, label %33, label %34
33: ; preds = %30
store float 0.000000e+00, float* %7
br label %34
34: ; preds = %33, %30
%35 = load float, float* %7
%36 = fdiv float %35, 6.000000e+01
store float %36, float* %7
%37 = load float, float* %7
%38 = fptosi float %37 to i32
store i32 %38, i32* %17
%39 = load float, float* %7
%40 = load i32, i32* %17
%41 = sitofp i32 %40 to float
%42 = fsub float %39, %41
store float %42, float* %13
%43 = load float, float* %9
%44 = load float, float* %8
%45 = fsub float 1.000000e+00, %44
%46 = fmul float %43, %45
store float %46, float* %14
%47 = load float, float* %9
%48 = load float, float* %8
%49 = load float, float* %13
%50 = fneg float %48
%51 = call float @llvm.fmuladd.f32(float %50, float %49, float 1.000000e+00)
%52 = fmul float %47, %51
store float %52, float* %15
%53 = load float, float* %9
%54 = load float, float* %8
%55 = load float, float* %13
%56 = fsub float 1.000000e+00, %55
%57 = fneg float %54
%58 = call float @llvm.fmuladd.f32(float %57, float %56, float 1.000000e+00)
%59 = fmul float %53, %58
store float %59, float* %16
%60 = load i32, i32* %17
switch i32 %60, label %103 [
i32 0, label %61
i32 1, label %68
i32 2, label %75
i32 3, label %82
i32 4, label %89
i32 5, label %96
]
61: ; preds = %34
%62 = load float, float* %9
%63 = load float*, float** %10
store float %62, float* %63
%64 = load float, float* %16
%65 = load float*, float** %11
store float %64, float* %65
%66 = load float, float* %14
%67 = load float*, float** %12
store float %66, float* %67
br label %103
68: ; preds = %34
%69 = load float, float* %15
%70 = load float*, float** %10
store float %69, float* %70
%71 = load float, float* %9
%72 = load float*, float** %11
store float %71, float* %72
%73 = load float, float* %14
%74 = load float*, float** %12
store float %73, float* %74
br label %103
75: ; preds = %34
%76 = load float, float* %14
%77 = load float*, float** %10
store float %76, float* %77
%78 = load float, float* %9
%79 = load float*, float** %11
store float %78, float* %79
%80 = load float, float* %16
%81 = load float*, float** %12
store float %80, float* %81
br label %103
82: ; preds = %34
%83 = load float, float* %14
%84 = load float*, float** %10
store float %83, float* %84
%85 = load float, float* %15
%86 = load float*, float** %11
store float %85, float* %86
%87 = load float, float* %9
%88 = load float*, float** %12
store float %87, float* %88
br label %103
89: ; preds = %34
%90 = load float, float* %16
%91 = load float*, float** %10
store float %90, float* %91
%92 = load float, float* %14
%93 = load float*, float** %11
store float %92, float* %93
%94 = load float, float* %9
%95 = load float*, float** %12
store float %94, float* %95
br label %103
96: ; preds = %34
%97 = load float, float* %9
%98 = load float*, float** %10
store float %97, float* %98
%99 = load float, float* %14
%100 = load float*, float** %11
store float %99, float* %100
%101 = load float, float* %15
%102 = load float*, float** %12
store float %101, float* %102
br label %103
103: ; preds = %34, %96, %89, %82, %75, %68, %61
br label %104
104: ; preds = %28, %103, %29
ret void
}

LLVM IR (-O2):
define void @ftg_getrgb(float %0, float %1, float %2, float* noalias nocapture writeonly %3, float* noalias nocapture writeonly %4, float* noalias nocapture writeonly %5) {
%7 = fcmp oeq float %1, 0.000000e+00
br i1 %7, label %8, label %11
8: ; preds = %6
%9 = fcmp oeq float %0, 7.200000e+02
br i1 %9, label %10, label %32
10: ; preds = %8
store float %2, float* %5
store float %2, float* %4
store float %2, float* %3
br label %32
11: ; preds = %6
%12 = fcmp oeq float %0, 3.600000e+02
%13 = fdiv float %0, 6.000000e+01
%14 = select i1 %12, float 0.000000e+00, float %13
%15 = fptosi float %14 to i32
%16 = sitofp i32 %15 to float
%17 = fsub float %14, %16
%18 = fsub float 1.000000e+00, %1
%19 = fmul float %18, %2
%20 = fneg float %1
%21 = tail call float @llvm.fmuladd.f32(float %20, float %17, float 1.000000e+00)
%22 = fmul float %21, %2
%23 = fsub float 1.000000e+00, %17
%24 = tail call float @llvm.fmuladd.f32(float %20, float %23, float 1.000000e+00)
%25 = fmul float %24, %2
switch i32 %15, label %32 [
i32 0, label %26
i32 1, label %27
i32 2, label %28
i32 3, label %29
i32 4, label %30
i32 5, label %31
]
26: ; preds = %11
store float %2, float* %3
store float %25, float* %4
store float %19, float* %5
br label %32
27: ; preds = %11
store float %22, float* %3
store float %2, float* %4
store float %19, float* %5
br label %32
28: ; preds = %11
store float %19, float* %3
store float %2, float* %4
store float %25, float* %5
br label %32
29: ; preds = %11
store float %19, float* %3
store float %22, float* %4
store float %2, float* %5
br label %32
30: ; preds = %11
store float %25, float* %3
store float %19, float* %4
store float %2, float* %5
br label %32
31: ; preds = %11
store float %2, float* %3
store float %19, float* %4
store float %22, float* %5
br label %32
32: ; preds = %26, %27, %28, %29, %30, %31, %11, %8, %10
ret void
}