void HoBluish(int R, int G, int B, double *HR, double *HG, double *HB) {
  double TmpH;
  double TmpS;
  double TmpI;
  int MinC;
  TmpH = 240.0;
  if (R <= G)
    MinC = R;
  else
    MinC = G;
  if (MinC <= B)
    MinC = MinC;
  else
    MinC = B;
  if (R == 0 && G == 0 && B == 0) {
    TmpS = 0.0;
  } else {
    TmpS = 1.0 - (((double)3 / (double)(R + G + B)) * (double)MinC);
  }
  TmpI = (double)(R + G + B) / (double)3;
  TmpI += (double)100;
  *HG = TmpI * (1 - TmpS);
  *HB = TmpI * (1 + (TmpS * 2));
  *HR = 3 * TmpI - (*HG + *HB);
  if (*HR > 255)
    *HR = 255.0;
  else if (*HR < 0)
    *HR = 0;
  if (*HG > 255)
    *HG = 255.0;
  else if (*HG < 0)
    *HG = 0;
  if (*HB > 255)
    *HB = 255.0;
  else if (*HB < 0)
    *HB = 0;
  return;
}


x86 assembly (clang, -O0):
<HoBluish>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movsd  0xedf(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     113d <HoBluish+0x3d>
mov    -0x4(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    1143 <HoBluish+0x43>
mov    -0x8(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     115a <HoBluish+0x5a>
mov    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    1160 <HoBluish+0x60>
mov    -0xc(%rbp),%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x4(%rbp)
jne    118b <HoBluish+0x8b>
cmpl   $0x0,-0x8(%rbp)
jne    118b <HoBluish+0x8b>
cmpl   $0x0,-0xc(%rbp)
jne    118b <HoBluish+0x8b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    11d5 <HoBluish+0xd5>
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xe70(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsi2sdl -0x44(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe3c(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe26(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe25(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  0xdf6(%rip),%xmm1
subsd  -0x38(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
addsd  %xmm1,%xmm1
movsd  0xdcf(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x28(%rbp),%rax
addsd  (%rax),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xd93(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xd7b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12bc <HoBluish+0x1bc>
mov    -0x18(%rbp),%rax
movsd  0xd65(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    12dd <HoBluish+0x1dd>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    12d8 <HoBluish+0x1d8>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    12dd <HoBluish+0x1dd>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xd2b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    130c <HoBluish+0x20c>
mov    -0x20(%rbp),%rax
movsd  0xd15(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    132d <HoBluish+0x22d>
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    1328 <HoBluish+0x228>
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    132d <HoBluish+0x22d>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xcdb(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    135c <HoBluish+0x25c>
mov    -0x28(%rbp),%rax
movsd  0xcc5(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    137d <HoBluish+0x27d>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    1378 <HoBluish+0x278>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    137d <HoBluish+0x27d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<HoBluish>:
cmp    %esi,%edi
mov    %edi,%r10d
cmovg  %esi,%r10d
mov    %esi,%eax
or     %edi,%eax
or     %edx,%eax
je     113f <HoBluish+0x3f>
cmp    %edx,%r10d
cmovg  %edx,%r10d
add    %edi,%esi
add    %edx,%esi
cvtsi2sd %esi,%xmm0
cvtsi2sd %r10d,%xmm2
movsd  0xed3(%rip),%xmm1
divsd  %xmm0,%xmm1
mulsd  %xmm2,%xmm1
addsd  0xecb(%rip),%xmm1
jmp    114b <HoBluish+0x4b>
add    %edi,%esi
add    %edx,%esi
cvtsi2sd %esi,%xmm0
xorpd  %xmm1,%xmm1
movsd  0xebd(%rip),%xmm2
divsd  %xmm2,%xmm0
addsd  0xeb9(%rip),%xmm0
movsd  0xea1(%rip),%xmm3
movapd %xmm3,%xmm4
subsd  %xmm1,%xmm4
mulsd  %xmm0,%xmm4
movsd  %xmm4,(%r8)
addsd  %xmm1,%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r9)
addsd  (%r8),%xmm1
mulsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rcx)
movsd  0xe7e(%rip),%xmm1
ucomisd %xmm1,%xmm0
ja     11b2 <HoBluish+0xb2>
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    11b6 <HoBluish+0xb6>
movsd  %xmm1,(%rcx)
movsd  (%r8),%xmm1
movsd  0xe5d(%rip),%xmm0
ucomisd %xmm0,%xmm1
ja     11d3 <HoBluish+0xd3>
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11d8 <HoBluish+0xd8>
movsd  %xmm0,(%r8)
movsd  (%r9),%xmm1
movsd  0xe3b(%rip),%xmm0
ucomisd %xmm0,%xmm1
ja     11f5 <HoBluish+0xf5>
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11fa <HoBluish+0xfa>
movsd  %xmm0,(%r9)
ret

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

LLVM IR (-O2):
define void @HoBluish(i32 %0, i32 %1, i32 %2, double* nocapture writeonly %3, double* nocapture %4, double* nocapture %5) {
%7 = icmp sgt i32 %0, %1
%8 = select i1 %7, i32 %1, i32 %0
%9 = or i32 %1, %0
%10 = or i32 %9, %2
%11 = icmp eq i32 %10, 0
br i1 %11, label %12, label %16
12: ; preds = %6
%13 = add nsw i32 %1, %0
%14 = add nsw i32 %13, %2
%15 = sitofp i32 %14 to double
br label %25
16: ; preds = %6
%17 = icmp sgt i32 %8, %2
%18 = select i1 %17, i32 %2, i32 %8
%19 = add nsw i32 %1, %0
%20 = add nsw i32 %19, %2
%21 = sitofp i32 %20 to double
%22 = sitofp i32 %18 to double
%23 = fdiv double -3.000000e+00, %21
%24 = tail call double @llvm.fmuladd.f64(double %23, double %22, double 1.000000e+00)
br label %25
25: ; preds = %12, %16
%26 = phi double [ %15, %12 ], [ %21, %16 ]
%27 = phi double [ 0.000000e+00, %12 ], [ %24, %16 ]
%28 = fdiv double %26, 3.000000e+00
%29 = fadd double %28, 1.000000e+02
%30 = fsub double 1.000000e+00, %27
%31 = fmul double %29, %30
store double %31, double* %4
%32 = tail call double @llvm.fmuladd.f64(double %27, double 2.000000e+00, double 1.000000e+00)
%33 = fmul double %29, %32
store double %33, double* %5
%34 = load double, double* %4
%35 = fadd double %33, %34
%36 = fneg double %35
%37 = tail call double @llvm.fmuladd.f64(double %29, double 3.000000e+00, double %36)
store double %37, double* %3
%38 = fcmp ogt double %37, 2.550000e+02
br i1 %38, label %41, label %39
39: ; preds = %25
%40 = fcmp olt double %37, 0.000000e+00
br i1 %40, label %41, label %43
41: ; preds = %39, %25
%42 = phi double [ 2.550000e+02, %25 ], [ 0.000000e+00, %39 ]
store double %42, double* %3
br label %43
43: ; preds = %41, %39
%44 = load double, double* %4
%45 = fcmp ogt double %44, 2.550000e+02
br i1 %45, label %48, label %46
46: ; preds = %43
%47 = fcmp olt double %44, 0.000000e+00
br i1 %47, label %48, label %50
48: ; preds = %46, %43
%49 = phi double [ 2.550000e+02, %43 ], [ 0.000000e+00, %46 ]
store double %49, double* %4
br label %50
50: ; preds = %48, %46
%51 = load double, double* %5
%52 = fcmp ogt double %51, 2.550000e+02
br i1 %52, label %55, label %53
53: ; preds = %50
%54 = fcmp olt double %51, 0.000000e+00
br i1 %54, label %55, label %57
55: ; preds = %53, %50
%56 = phi double [ 2.550000e+02, %50 ], [ 0.000000e+00, %53 ]
store double %56, double* %5
br label %57
57: ; preds = %55, %53
ret void
}