#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);
int triplet(int, int, int);
int HSV2RGB(int vi) {
  float h = (float)((vi >> 16) & 0xff), s = (float)((vi >> 8) & 0xff),
        v = (float)(vi & 0xff), m, n, f;
  float a[3] = {0, 0, 0};
  int i;
  h /= 255.0 / 6.0;
  s /= 255.0;
  v /= 255.0;
  if (s == 0.0) {
    a[0] = a[1] = a[2] = v;
  } else {
    i = (int)floor(h);
    f = h - (float)i;
    if (!(i & 1))
      f = 1 - f;
    m = v * (1 - s);
    n = v * (1 - s * f);
    switch (i) {
    case 6:
    case 0:
      a[0] = v;
      a[1] = n;
      a[2] = m;
      break;
    case 1:
      a[0] = n;
      a[1] = v;
      a[2] = m;
      break;
    case 2:
      a[0] = m;
      a[1] = v;
      a[2] = n;
      break;
    case 3:
      a[0] = m;
      a[1] = n;
      a[2] = v;
      break;
    case 4:
      a[0] = n;
      a[1] = m;
      a[2] = v;
      break;
    case 5:
      a[0] = v;
      a[1] = m;
      a[2] = n;
      break;
    }
  }
  for (i = 0; i < 3; i++)
    a[i] *= 255;
  return (triplet((int)a[0], (int)a[1], (int)a[2]));
}


x86 assembly (clang, -O0):
<HSV2RGB>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x10,%eax
and    $0xff,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x8,%eax
and    $0xff,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x4(%rbp),%eax
and    $0xff,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x10(%rbp)
lea    -0x28(%rbp),%rdi
xor    %esi,%esi
mov    $0xc,%edx
call   1030 <memset@plt>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe73(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4d(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe2f(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1213 <HSV2RGB+0xe3>
jp     1213 <HSV2RGB+0xe3>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  %xmm0,-0x24(%rbp)
movss  %xmm0,-0x28(%rbp)
jmp    138d <HSV2RGB+0x25d>
movss  -0x8(%rbp),%xmm0
call   1040 <floor@plt>
mov    %eax,-0x2c(%rbp)
movss  -0x8(%rbp),%xmm0
cvtsi2ssl -0x2c(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x2c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    1254 <HSV2RGB+0x124>
movss  0xdc6(%rip),%xmm0
subss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
movss  -0xc(%rbp),%xmm3
movss  0xdaa(%rip),%xmm1
movaps %xmm1,%xmm2
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x1c(%rbp),%xmm3
mulss  %xmm3,%xmm2
subss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
mov    %rax,-0x38(%rbp)
sub    $0x6,%rax
ja     1388 <HSV2RGB+0x258>
mov    -0x38(%rbp),%rax
lea    0xd66(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1388 <HSV2RGB+0x258>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1388 <HSV2RGB+0x258>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1388 <HSV2RGB+0x258>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1388 <HSV2RGB+0x258>
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1388 <HSV2RGB+0x258>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    138d <HSV2RGB+0x25d>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x3,-0x2c(%rbp)
jge    13c4 <HSV2RGB+0x294>
movslq -0x2c(%rbp),%rax
movss  0xc6a(%rip),%xmm0
mulss  -0x28(%rbp,%rax,4),%xmm0
movss  %xmm0,-0x28(%rbp,%rax,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1394 <HSV2RGB+0x264>
cvttss2si -0x28(%rbp),%edi
cvttss2si -0x24(%rbp),%esi
cvttss2si -0x20(%rbp),%edx
call   1050 <triplet@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<HSV2RGB>:
sub    $0x18,%rsp
mov    %edi,%eax
movzbl %ah,%ecx
cvtsi2ss %ecx,%xmm2
movzbl %al,%ecx
cvtsi2ss %ecx,%xmm4
movss  0xec8(%rip),%xmm1
divss  %xmm1,%xmm2
divss  %xmm1,%xmm4
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
jne    115c <HSV2RGB+0x3c>
jp     115c <HSV2RGB+0x3c>
movaps %xmm4,%xmm2
movaps %xmm4,%xmm3
movaps %xmm4,%xmm0
jmp    1230 <HSV2RGB+0x110>
movss  %xmm2,0x10(%rsp)
movss  %xmm4,0x14(%rsp)
shr    $0x10,%eax
movzbl %al,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
divss  0xe83(%rip),%xmm0
movss  %xmm0,0xc(%rsp)
call   1030 <floor@plt>
movss  0xc(%rsp),%xmm3
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
subss  %xmm0,%xmm3
movss  0xe67(%rip),%xmm1
test   $0x1,%al
jne    11af <HSV2RGB+0x8f>
movaps %xmm1,%xmm0
subss  %xmm3,%xmm0
movaps %xmm0,%xmm3
cmp    $0x6,%eax
movss  0x14(%rsp),%xmm4
movss  0x10(%rsp),%xmm2
ja     11f1 <HSV2RGB+0xd1>
movaps %xmm1,%xmm0
subss  %xmm2,%xmm0
mulss  %xmm4,%xmm0
mulss  %xmm2,%xmm3
subss  %xmm3,%xmm1
mulss  %xmm4,%xmm1
mov    %eax,%eax
lea    0xe2c(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movaps %xmm4,%xmm2
movaps %xmm1,%xmm3
jmp    1228 <HSV2RGB+0x108>
xorps  %xmm2,%xmm2
xorps  %xmm3,%xmm3
xorps  %xmm0,%xmm0
jmp    1228 <HSV2RGB+0x108>
movaps %xmm1,%xmm2
movaps %xmm4,%xmm3
jmp    1228 <HSV2RGB+0x108>
movaps %xmm0,%xmm2
movaps %xmm4,%xmm3
jmp    121a <HSV2RGB+0xfa>
movaps %xmm1,%xmm2
movaps %xmm0,%xmm3
jmp    1225 <HSV2RGB+0x105>
movaps %xmm4,%xmm2
movaps %xmm0,%xmm3
movaps %xmm1,%xmm0
jmp    1228 <HSV2RGB+0x108>
movaps %xmm0,%xmm2
movaps %xmm1,%xmm3
movaps %xmm4,%xmm0
movss  0xdd4(%rip),%xmm1
mulss  %xmm1,%xmm2
mulss  %xmm1,%xmm3
mulss  %xmm1,%xmm0
cvttss2si %xmm2,%edi
cvttss2si %xmm3,%esi
cvttss2si %xmm0,%edx
add    $0x18,%rsp
jmp    1040 <triplet@plt>

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

LLVM IR (-O2):
define i32 @HSV2RGB(i32 %0) {
%2 = lshr i32 %0, 16
%3 = and i32 %2, 255
%4 = sitofp i32 %3 to float
%5 = lshr i32 %0, 8
%6 = and i32 %5, 255
%7 = sitofp i32 %6 to float
%8 = and i32 %0, 255
%9 = sitofp i32 %8 to float
%10 = fdiv float %4, 4.250000e+01
%11 = fdiv float %7, 2.550000e+02
%12 = fdiv float %9, 2.550000e+02
%13 = fcmp oeq float %11, 0.000000e+00
br i1 %13, label %34, label %14
14: ; preds = %1
%15 = tail call i64 @floor(float %10)
%16 = trunc i64 %15 to i32
%17 = sitofp i32 %16 to float
%18 = fsub float %10, %17
%19 = and i32 %16, 1
%20 = icmp eq i32 %19, 0
%21 = fsub float 1.000000e+00, %18
%22 = select i1 %20, float %21, float %18
%23 = fsub float 1.000000e+00, %11
%24 = fmul float %12, %23
%25 = fneg float %11
%26 = tail call float @llvm.fmuladd.f32(float %25, float %22, float 1.000000e+00)
%27 = fmul float %12, %26
switch i32 %16, label %34 [
i32 6, label %28
i32 0, label %28
i32 1, label %29
i32 2, label %30
i32 3, label %31
i32 4, label %32
i32 5, label %33
]
28: ; preds = %14, %14
br label %34
29: ; preds = %14
br label %34
30: ; preds = %14
br label %34
31: ; preds = %14
br label %34
32: ; preds = %14
br label %34
33: ; preds = %14
br label %34
34: ; preds = %1, %28, %29, %30, %31, %32, %33, %14
%35 = phi float [ 0.000000e+00, %14 ], [ %12, %33 ], [ %27, %32 ], [ %24, %31 ], [ %24, %30 ], [ %27, %29 ], [ %12, %28 ], [ %12, %1 ]
%36 = phi float [ 0.000000e+00, %14 ], [ %24, %33 ], [ %24, %32 ], [ %27, %31 ], [ %12, %30 ], [ %12, %29 ], [ %27, %28 ], [ %12, %1 ]
%37 = phi float [ 0.000000e+00, %14 ], [ %27, %33 ], [ %12, %32 ], [ %12, %31 ], [ %27, %30 ], [ %24, %29 ], [ %24, %28 ], [ %12, %1 ]
%38 = fmul float %35, 2.550000e+02
%39 = fmul float %36, 2.550000e+02
%40 = fmul float %37, 2.550000e+02
%41 = fptosi float %38 to i32
%42 = fptosi float %39 to i32
%43 = fptosi float %40 to i32
%44 = tail call i32 @triplet(i32 %41, i32 %42, i32 %43)
ret i32 %44
}