#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 */
int fabs(float);
int floor(float);
int hsv2rgb(float h, float s, float v) {
  float c, x, m;
  float r = 0, g = 0, b = 0;
  h *= 6;
  c = s * v;
  x = c * (1 - fabs(h - 2 * floor(h / 2) - 1));
  if (0 <= h && h < 1)
    r = c, g = x, b = 0;
  else if (1 <= h && h < 2)
    r = x, g = c, b = 0;
  else if (2 <= h && h < 3)
    r = 0, g = c, b = x;
  else if (3 <= h && h < 4)
    r = 0, g = x, b = c;
  else if (4 <= h && h < 5)
    r = x, g = 0, b = c;
  else if (5 <= h && h <= 6)
    r = c, g = 0, b = x;
  m = v - c;
  r += m, g += m, b += m;
  return ((int)floor(r * 255) << 16) + ((int)floor(g * 255) << 8) +
         (int)floor(b * 255);
}


x86 assembly (clang, -O0):
<hsv2rgb>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  0xeb1(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xe73(%rip),%xmm1
divss  %xmm1,%xmm0
call   1040 <floor@plt>
movss  -0x2c(%rbp),%xmm0
shl    $0x1,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
movss  0xe4e(%rip),%xmm1
subss  %xmm1,%xmm0
call   1030 <fabs@plt>
movss  -0x28(%rbp),%xmm0
mov    %eax,%ecx
mov    $0x1,%eax
sub    %ecx,%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     121a <hsv2rgb+0xfa>
movss  0xe11(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    121a <hsv2rgb+0xfa>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    139b <hsv2rgb+0x27b>
movss  -0x4(%rbp),%xmm0
movss  0xdd9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1263 <hsv2rgb+0x143>
movss  0xdcc(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    1263 <hsv2rgb+0x143>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1396 <hsv2rgb+0x276>
movss  -0x4(%rbp),%xmm0
movss  0xd94(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     12ac <hsv2rgb+0x18c>
movss  0xd8b(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    12ac <hsv2rgb+0x18c>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1391 <hsv2rgb+0x271>
movss  -0x4(%rbp),%xmm0
movss  0xd53(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     12f5 <hsv2rgb+0x1d5>
movss  0xd46(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    12f5 <hsv2rgb+0x1d5>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    138c <hsv2rgb+0x26c>
movss  -0x4(%rbp),%xmm0
movss  0xd0e(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     133e <hsv2rgb+0x21e>
movss  0xd01(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    133e <hsv2rgb+0x21e>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1387 <hsv2rgb+0x267>
movss  -0x4(%rbp),%xmm0
movss  0xcc9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1382 <hsv2rgb+0x262>
movss  0xcac(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jb     1382 <hsv2rgb+0x262>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1387 <hsv2rgb+0x267>
jmp    138c <hsv2rgb+0x26c>
jmp    1391 <hsv2rgb+0x271>
jmp    1396 <hsv2rgb+0x276>
jmp    139b <hsv2rgb+0x27b>
movss  -0xc(%rbp),%xmm0
subss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
addss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x18(%rbp),%xmm0
addss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  0xc39(%rip),%xmm0
mulss  -0x1c(%rbp),%xmm0
call   1040 <floor@plt>
shl    $0x10,%eax
mov    %eax,-0x34(%rbp)
movss  0xc21(%rip),%xmm0
mulss  -0x20(%rbp),%xmm0
call   1040 <floor@plt>
mov    %eax,%ecx
mov    -0x34(%rbp),%eax
shl    $0x8,%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
movss  0xc02(%rip),%xmm0
mulss  -0x24(%rbp),%xmm0
call   1040 <floor@plt>
mov    %eax,%ecx
mov    -0x30(%rbp),%eax
add    %ecx,%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hsv2rgb>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
movaps %xmm0,%xmm3
mulss  0xecf(%rip),%xmm3
movss  %xmm3,0xc(%rsp)
movss  %xmm2,0x10(%rsp)
mulss  %xmm2,%xmm1
movss  %xmm1,0x14(%rsp)
movss  0xeb5(%rip),%xmm0
mulss  %xmm3,%xmm0
call   1040 <floor@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
movss  0xc(%rsp),%xmm0
subss  %xmm1,%xmm0
addss  0xe95(%rip),%xmm0
call   1030 <fabs@plt>
movss  0xc(%rsp),%xmm4
movss  0x14(%rsp),%xmm3
mov    $0x1,%ecx
sub    %eax,%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
mulss  %xmm3,%xmm1
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm4
jb     11b3 <hsv2rgb+0x93>
movss  0xe66(%rip),%xmm0
ucomiss %xmm4,%xmm0
jbe    11b3 <hsv2rgb+0x93>
movaps %xmm3,%xmm0
movaps %xmm1,%xmm5
jmp    1230 <hsv2rgb+0x110>
ucomiss 0xe52(%rip),%xmm4
jb     11d1 <hsv2rgb+0xb1>
movss  0xe4c(%rip),%xmm0
ucomiss %xmm4,%xmm0
jbe    11d1 <hsv2rgb+0xb1>
movaps %xmm1,%xmm0
movaps %xmm3,%xmm5
jmp    1230 <hsv2rgb+0x110>
ucomiss 0xe38(%rip),%xmm4
xorps  %xmm0,%xmm0
jb     11f2 <hsv2rgb+0xd2>
movss  0xe2f(%rip),%xmm2
ucomiss %xmm4,%xmm2
jbe    11f2 <hsv2rgb+0xd2>
movaps %xmm3,%xmm5
movaps %xmm1,%xmm2
jmp    1230 <hsv2rgb+0x110>
ucomiss 0xe1b(%rip),%xmm4
jb     120d <hsv2rgb+0xed>
movss  0xe15(%rip),%xmm2
ucomiss %xmm4,%xmm2
jbe    120d <hsv2rgb+0xed>
movaps %xmm1,%xmm5
jmp    122d <hsv2rgb+0x10d>
ucomiss 0xe04(%rip),%xmm4
jb     129a <hsv2rgb+0x17a>
xorps  %xmm5,%xmm5
movss  0xdf7(%rip),%xmm0
ucomiss %xmm4,%xmm0
jbe    129a <hsv2rgb+0x17a>
movaps %xmm1,%xmm0
movaps %xmm3,%xmm2
movss  0x10(%rsp),%xmm1
subss  %xmm3,%xmm1
addss  %xmm1,%xmm0
addss  %xmm1,%xmm5
movss  %xmm5,0xc(%rsp)
addss  %xmm2,%xmm1
movss  %xmm1,0x10(%rsp)
mulss  0xdc6(%rip),%xmm0
call   1040 <floor@plt>
mov    %eax,%ebx
shl    $0x10,%ebx
movss  0xc(%rsp),%xmm0
mulss  0xdae(%rip),%xmm0
call   1040 <floor@plt>
mov    %eax,%ebp
shl    $0x8,%ebp
add    %ebx,%ebp
movss  0x10(%rsp),%xmm0
mulss  0xd94(%rip),%xmm0
call   1040 <floor@plt>
add    %ebp,%eax
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret
ucomiss 0xd7b(%rip),%xmm4
setae  %al
movss  0xd54(%rip),%xmm0
ucomiss %xmm4,%xmm0
setae  %cl
xorps  %xmm5,%xmm5
movaps %xmm3,%xmm0
test   %cl,%al
jne    11ed <hsv2rgb+0xcd>
xorps  %xmm0,%xmm0
xorps  %xmm1,%xmm1
jmp    11ed <hsv2rgb+0xcd>

LLVM IR (-O0):
define i32 @hsv2rgb(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
store float %0, float* %4
store float %1, float* %5
store float %2, float* %6
store float 0.000000e+00, float* %10
store float 0.000000e+00, float* %11
store float 0.000000e+00, float* %12
%13 = load float, float* %4
%14 = fmul float %13, 6.000000e+00
store float %14, float* %4
%15 = load float, float* %5
%16 = load float, float* %6
%17 = fmul float %15, %16
store float %17, float* %7
%18 = load float, float* %7
%19 = load float, float* %4
%20 = load float, float* %4
%21 = fdiv float %20, 2.000000e+00
%22 = call i32 @floor(float %21)
%23 = mul nsw i32 2, %22
%24 = sitofp i32 %23 to float
%25 = fsub float %19, %24
%26 = fsub float %25, 1.000000e+00
%27 = call i32 @fabs(float %26)
%28 = sub nsw i32 1, %27
%29 = sitofp i32 %28 to float
%30 = fmul float %18, %29
store float %30, float* %8
%31 = load float, float* %4
%32 = fcmp ole float 0.000000e+00, %31
br i1 %32, label %33, label %39
33: ; preds = %3
%34 = load float, float* %4
%35 = fcmp olt float %34, 1.000000e+00
br i1 %35, label %36, label %39
36: ; preds = %33
%37 = load float, float* %7
store float %37, float* %10
%38 = load float, float* %8
store float %38, float* %11
store float 0.000000e+00, float* %12
br label %89
39: ; preds = %33, %3
%40 = load float, float* %4
%41 = fcmp ole float 1.000000e+00, %40
br i1 %41, label %42, label %48
42: ; preds = %39
%43 = load float, float* %4
%44 = fcmp olt float %43, 2.000000e+00
br i1 %44, label %45, label %48
45: ; preds = %42
%46 = load float, float* %8
store float %46, float* %10
%47 = load float, float* %7
store float %47, float* %11
store float 0.000000e+00, float* %12
br label %88
48: ; preds = %42, %39
%49 = load float, float* %4
%50 = fcmp ole float 2.000000e+00, %49
br i1 %50, label %51, label %57
51: ; preds = %48
%52 = load float, float* %4
%53 = fcmp olt float %52, 3.000000e+00
br i1 %53, label %54, label %57
54: ; preds = %51
store float 0.000000e+00, float* %10
%55 = load float, float* %7
store float %55, float* %11
%56 = load float, float* %8
store float %56, float* %12
br label %87
57: ; preds = %51, %48
%58 = load float, float* %4
%59 = fcmp ole float 3.000000e+00, %58
br i1 %59, label %60, label %66
60: ; preds = %57
%61 = load float, float* %4
%62 = fcmp olt float %61, 4.000000e+00
br i1 %62, label %63, label %66
63: ; preds = %60
store float 0.000000e+00, float* %10
%64 = load float, float* %8
store float %64, float* %11
%65 = load float, float* %7
store float %65, float* %12
br label %86
66: ; preds = %60, %57
%67 = load float, float* %4
%68 = fcmp ole float 4.000000e+00, %67
br i1 %68, label %69, label %75
69: ; preds = %66
%70 = load float, float* %4
%71 = fcmp olt float %70, 5.000000e+00
br i1 %71, label %72, label %75
72: ; preds = %69
%73 = load float, float* %8
store float %73, float* %10
store float 0.000000e+00, float* %11
%74 = load float, float* %7
store float %74, float* %12
br label %85
75: ; preds = %69, %66
%76 = load float, float* %4
%77 = fcmp ole float 5.000000e+00, %76
br i1 %77, label %78, label %84
78: ; preds = %75
%79 = load float, float* %4
%80 = fcmp ole float %79, 6.000000e+00
br i1 %80, label %81, label %84
81: ; preds = %78
%82 = load float, float* %7
store float %82, float* %10
store float 0.000000e+00, float* %11
%83 = load float, float* %8
store float %83, float* %12
br label %84
84: ; preds = %81, %78, %75
br label %85
85: ; preds = %84, %72
br label %86
86: ; preds = %85, %63
br label %87
87: ; preds = %86, %54
br label %88
88: ; preds = %87, %45
br label %89
89: ; preds = %88, %36
%90 = load float, float* %6
%91 = load float, float* %7
%92 = fsub float %90, %91
store float %92, float* %9
%93 = load float, float* %9
%94 = load float, float* %10
%95 = fadd float %94, %93
store float %95, float* %10
%96 = load float, float* %9
%97 = load float, float* %11
%98 = fadd float %97, %96
store float %98, float* %11
%99 = load float, float* %9
%100 = load float, float* %12
%101 = fadd float %100, %99
store float %101, float* %12
%102 = load float, float* %10
%103 = fmul float %102, 2.550000e+02
%104 = call i32 @floor(float %103)
%105 = shl i32 %104, 16
%106 = load float, float* %11
%107 = fmul float %106, 2.550000e+02
%108 = call i32 @floor(float %107)
%109 = shl i32 %108, 8
%110 = add nsw i32 %105, %109
%111 = load float, float* %12
%112 = fmul float %111, 2.550000e+02
%113 = call i32 @floor(float %112)
%114 = add nsw i32 %110, %113
ret i32 %114
}

LLVM IR (-O2):
define i32 @hsv2rgb(float %0, float %1, float %2) {
%4 = fmul float %0, 6.000000e+00
%5 = fmul float %1, %2
%6 = fmul float %4, 5.000000e-01
%7 = tail call i32 @floor(float %6)
%8 = shl nsw i32 %7, 1
%9 = sitofp i32 %8 to float
%10 = fsub float %4, %9
%11 = fadd float %10, -1.000000e+00
%12 = tail call i32 @fabs(float %11)
%13 = sub nsw i32 1, %12
%14 = sitofp i32 %13 to float
%15 = fmul float %5, %14
%16 = fcmp oge float %4, 0.000000e+00
%17 = fcmp olt float %4, 1.000000e+00
%18 = and i1 %16, %17
br i1 %18, label %41, label %19
19: ; preds = %3
%20 = fcmp oge float %4, 1.000000e+00
%21 = fcmp olt float %4, 2.000000e+00
%22 = and i1 %20, %21
br i1 %22, label %41, label %23
23: ; preds = %19
%24 = fcmp oge float %4, 2.000000e+00
%25 = fcmp olt float %4, 3.000000e+00
%26 = and i1 %24, %25
br i1 %26, label %41, label %27
27: ; preds = %23
%28 = fcmp oge float %4, 3.000000e+00
%29 = fcmp olt float %4, 4.000000e+00
%30 = and i1 %28, %29
br i1 %30, label %41, label %31
31: ; preds = %27
%32 = fcmp oge float %4, 4.000000e+00
%33 = fcmp olt float %4, 5.000000e+00
%34 = and i1 %32, %33
br i1 %34, label %41, label %35
35: ; preds = %31
%36 = fcmp oge float %4, 5.000000e+00
%37 = fcmp ole float %4, 6.000000e+00
%38 = and i1 %36, %37
%39 = select i1 %38, float %5, float 0.000000e+00
%40 = select i1 %38, float %15, float 0.000000e+00
br label %41
41: ; preds = %35, %31, %27, %23, %19, %3
%42 = phi float [ %5, %3 ], [ %15, %19 ], [ 0.000000e+00, %23 ], [ 0.000000e+00, %27 ], [ %15, %31 ], [ %39, %35 ]
%43 = phi float [ %15, %3 ], [ %5, %19 ], [ %5, %23 ], [ %15, %27 ], [ 0.000000e+00, %31 ], [ 0.000000e+00, %35 ]
%44 = phi float [ 0.000000e+00, %3 ], [ 0.000000e+00, %19 ], [ %15, %23 ], [ %5, %27 ], [ %5, %31 ], [ %40, %35 ]
%45 = fsub float %2, %5
%46 = fadd float %45, %42
%47 = fadd float %45, %43
%48 = fadd float %45, %44
%49 = fmul float %46, 2.550000e+02
%50 = tail call i32 @floor(float %49)
%51 = shl i32 %50, 16
%52 = fmul float %47, 2.550000e+02
%53 = tail call i32 @floor(float %52)
%54 = shl i32 %53, 8
%55 = add nsw i32 %54, %51
%56 = fmul float %48, 2.550000e+02
%57 = tail call i32 @floor(float %56)
%58 = add nsw i32 %55, %57
ret i32 %58
}