#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ floor(float);
void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b) {
  int i;
  float f, p, q, t;
  h *= 360.0;
  if (s == 0) {
    *r = v;
    *g = v;
    *b = v;
  } else {
    if (h == 360)
      h = 0;
    h /= 60;
    i = ((float)floor((h)));
    f = h - i;
    p = v * (1.0 - s);
    q = v * (1.0 - (s * f));
    t = v * (1.0 - (s * (1.0 - 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):
<hsv_to_rgb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
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
cvtss2sd %xmm0,%xmm0
movsd  0xebc(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1194 <hsv_to_rgb+0x84>
jp     1194 <hsv_to_rgb+0x84>
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b8 <hsv_to_rgb+0x2a8>
movss  -0x4(%rbp),%xmm0
movss  0xe6f(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    11b8 <hsv_to_rgb+0xa8>
jp     11b8 <hsv_to_rgb+0xa8>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xe4f(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
call   1030 <floor@plt>
cvtsi2ss %rax,%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x2c(%rbp)
movss  -0x4(%rbp),%xmm0
cvtsi2ssl -0x2c(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm3
movsd  0xdf7(%rip),%xmm1
movaps %xmm1,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0x30(%rbp),%xmm3
mulss  %xmm3,%xmm2
cvtss2sd %xmm2,%xmm3
movaps %xmm1,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x30(%rbp),%xmm3
cvtss2sd %xmm3,%xmm4
movaps %xmm1,%xmm3
subsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %rax,-0x48(%rbp)
sub    $0x5,%rax
ja     13b3 <hsv_to_rgb+0x2a3>
mov    -0x48(%rbp),%rax
lea    0xd71(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x3c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b3 <hsv_to_rgb+0x2a3>
movss  -0x38(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b3 <hsv_to_rgb+0x2a3>
movss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x3c(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b3 <hsv_to_rgb+0x2a3>
movss  -0x34(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b3 <hsv_to_rgb+0x2a3>
movss  -0x3c(%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    13b3 <hsv_to_rgb+0x2a3>
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x34(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13b8 <hsv_to_rgb+0x2a8>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hsv_to_rgb>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rdx,%r14
mov    %rsi,%r15
mov    %rdi,%rbx
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm1
jne    114d <hsv_to_rgb+0x3d>
jp     114d <hsv_to_rgb+0x3d>
movaps %xmm2,%xmm1
movaps %xmm2,%xmm3
movaps %xmm2,%xmm0
movss  %xmm1,(%rbx)
movss  %xmm3,(%r15)
movss  %xmm0,(%r14)
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret
movss  %xmm1,0x8(%rsp)
movss  %xmm2,0xc(%rsp)
mulss  0xe9f(%rip),%xmm0
ucomiss 0xe98(%rip),%xmm0
jne    116c <hsv_to_rgb+0x5c>
jnp    1177 <hsv_to_rgb+0x67>
divss  0xe90(%rip),%xmm0
movaps %xmm0,%xmm3
movss  %xmm3,0x4(%rsp)
movaps %xmm3,%xmm0
call   1030 <floor@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
cvttss2si %xmm0,%eax
cmp    $0x5,%eax
ja     1143 <hsv_to_rgb+0x33>
cvttps2dq %xmm0,%xmm0
cvtdq2ps %xmm0,%xmm0
movss  0x4(%rsp),%xmm6
subss  %xmm0,%xmm6
movss  0xc(%rsp),%xmm7
xorps  %xmm1,%xmm1
cvtss2sd %xmm7,%xmm1
movss  0x8(%rsp),%xmm2
xorps  %xmm3,%xmm3
cvtss2sd %xmm2,%xmm3
movsd  0xe3f(%rip),%xmm4
movapd %xmm4,%xmm0
subsd  %xmm3,%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  %xmm6,%xmm2
cvtss2sd %xmm2,%xmm2
movapd %xmm4,%xmm5
subsd  %xmm2,%xmm5
mulsd  %xmm1,%xmm5
xorps  %xmm2,%xmm2
cvtsd2ss %xmm5,%xmm2
xorps  %xmm5,%xmm5
cvtss2sd %xmm6,%xmm5
movapd %xmm4,%xmm6
subsd  %xmm5,%xmm6
mulsd  %xmm3,%xmm6
subsd  %xmm6,%xmm4
mulsd  %xmm1,%xmm4
cvtsd2ss %xmm4,%xmm4
lea    0xdf6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
movaps %xmm7,%xmm1
movaps %xmm4,%xmm3
jmp    *%rax
movaps %xmm2,%xmm1
movaps %xmm7,%xmm3
jmp    1135 <hsv_to_rgb+0x25>
movaps %xmm0,%xmm1
movaps %xmm7,%xmm3
movaps %xmm4,%xmm0
jmp    1135 <hsv_to_rgb+0x25>
movaps %xmm0,%xmm1
movaps %xmm2,%xmm3
movaps %xmm7,%xmm0
jmp    1135 <hsv_to_rgb+0x25>
movaps %xmm4,%xmm1
movaps %xmm0,%xmm3
movaps %xmm7,%xmm0
jmp    1135 <hsv_to_rgb+0x25>
movaps %xmm7,%xmm1
movaps %xmm0,%xmm3
jmp    1132 <hsv_to_rgb+0x22>

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

LLVM IR (-O2):
define void @hsv_to_rgb(float %0, float %1, float %2, float* nocapture writeonly %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = fmul float %0, 3.600000e+02
%8 = fcmp oeq float %1, 0.000000e+00
br i1 %8, label %39, label %9
9: ; preds = %6
%10 = fcmp oeq float %7, 3.600000e+02
%11 = fdiv float %7, 6.000000e+01
%12 = select i1 %10, float 0.000000e+00, float %11
%13 = tail call i64 @floor(float %12)
%14 = sitofp i64 %13 to float
%15 = fptosi float %14 to i32
%16 = sitofp i32 %15 to float
%17 = fsub float %12, %16
%18 = fpext float %2 to double
%19 = fpext float %1 to double
%20 = fsub double 1.000000e+00, %19
%21 = fmul double %20, %18
%22 = fptrunc double %21 to float
%23 = fmul float %17, %1
%24 = fpext float %23 to double
%25 = fsub double 1.000000e+00, %24
%26 = fmul double %25, %18
%27 = fptrunc double %26 to float
%28 = fpext float %17 to double
%29 = fsub double 1.000000e+00, %28
%30 = fneg double %19
%31 = tail call double @llvm.fmuladd.f64(double %30, double %29, double 1.000000e+00)
%32 = fmul double %31, %18
%33 = fptrunc double %32 to float
switch i32 %15, label %43 [
i32 0, label %39
i32 1, label %34
i32 2, label %35
i32 3, label %36
i32 4, label %37
i32 5, label %38
]
34: ; preds = %9
br label %39
35: ; preds = %9
br label %39
36: ; preds = %9
br label %39
37: ; preds = %9
br label %39
38: ; preds = %9
br label %39
39: ; preds = %9, %6, %38, %37, %36, %35, %34
%40 = phi float [ %27, %34 ], [ %22, %35 ], [ %22, %36 ], [ %33, %37 ], [ %2, %38 ], [ %2, %6 ], [ %2, %9 ]
%41 = phi float [ %2, %34 ], [ %2, %35 ], [ %27, %36 ], [ %22, %37 ], [ %22, %38 ], [ %2, %6 ], [ %33, %9 ]
%42 = phi float [ %22, %34 ], [ %33, %35 ], [ %2, %36 ], [ %2, %37 ], [ %27, %38 ], [ %2, %6 ], [ %22, %9 ]
store float %40, float* %3
store float %41, float* %4
store float %42, float* %5
br label %43
43: ; preds = %39, %9
ret void
}