unsigned char colour(v, minV, scl)
float v, minV, scl;
{
  float val;
  int iVal;
  val = (v - minV) * scl;
  iVal = ((val) < 0.0 ? -((int)(-(val) + 0.5)) : ((int)((val) + 0.5)));
  iVal = ((255) < (iVal) ? (255) : (iVal));
  iVal = ((0) < (iVal) ? (iVal) : (0));
  return ((unsigned char)iVal);
}


x86 assembly (clang, -O0):
<colour>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm2,-0x20(%rbp)
movaps %xmm0,%xmm2
movsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
movss  %xmm2,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1188 <colour+0x88>
movss  -0x10(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8c(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
jmp    11a4 <colour+0xa4>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe67(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    $0xff,%eax
cmp    -0x14(%rbp),%eax
jge    11c5 <colour+0xc5>
mov    $0xff,%eax
mov    %eax,-0x28(%rbp)
jmp    11cb <colour+0xcb>
mov    -0x14(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
cmp    -0x14(%rbp),%eax
jge    11e7 <colour+0xe7>
mov    -0x14(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    11f1 <colour+0xf1>
xor    %eax,%eax
mov    %eax,-0x2c(%rbp)
jmp    11f1 <colour+0xf1>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<colour>:
cvtsd2ss %xmm0,%xmm3
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
subss  %xmm0,%xmm3
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
mulss  %xmm3,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    113a <colour+0x3a>
cvtss2sd %xmm0,%xmm0
movsd  0xed2(%rip),%xmm1
subsd  %xmm0,%xmm1
cvttsd2si %xmm1,%eax
neg    %eax
jmp    114a <colour+0x4a>
cvtss2sd %xmm0,%xmm0
addsd  0xeba(%rip),%xmm0
cvttsd2si %xmm0,%eax
cmp    $0xff,%eax
mov    $0xff,%ecx
cmovl  %eax,%ecx
xor    %eax,%eax
test   %ecx,%ecx
cmovg  %ecx,%eax
ret

LLVM IR (-O0):
define zeroext i8 @colour(double %0, double %1, double %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca i32
%9 = fptrunc double %0 to float
%10 = fptrunc double %1 to float
%11 = fptrunc double %2 to float
store float %9, float* %4
store float %10, float* %5
store float %11, float* %6
%12 = load float, float* %4
%13 = load float, float* %5
%14 = fsub float %12, %13
%15 = load float, float* %6
%16 = fmul float %14, %15
store float %16, float* %7
%17 = load float, float* %7
%18 = fpext float %17 to double
%19 = fcmp olt double %18, 0.000000e+00
br i1 %19, label %20, label %27
20: ; preds = %3
%21 = load float, float* %7
%22 = fneg float %21
%23 = fpext float %22 to double
%24 = fadd double %23, 5.000000e-01
%25 = fptosi double %24 to i32
%26 = sub nsw i32 0, %25
br label %32
27: ; preds = %3
%28 = load float, float* %7
%29 = fpext float %28 to double
%30 = fadd double %29, 5.000000e-01
%31 = fptosi double %30 to i32
br label %32
32: ; preds = %27, %20
%33 = phi i32 [ %26, %20 ], [ %31, %27 ]
store i32 %33, i32* %8
%34 = load i32, i32* %8
%35 = icmp slt i32 255, %34
br i1 %35, label %36, label %37
36: ; preds = %32
br label %39
37: ; preds = %32
%38 = load i32, i32* %8
br label %39
39: ; preds = %37, %36
%40 = phi i32 [ 255, %36 ], [ %38, %37 ]
store i32 %40, i32* %8
%41 = load i32, i32* %8
%42 = icmp slt i32 0, %41
br i1 %42, label %43, label %45
43: ; preds = %39
%44 = load i32, i32* %8
br label %46
45: ; preds = %39
br label %46
46: ; preds = %45, %43
%47 = phi i32 [ %44, %43 ], [ 0, %45 ]
store i32 %47, i32* %8
%48 = load i32, i32* %8
%49 = trunc i32 %48 to i8
ret i8 %49
}

LLVM IR (-O2):
define zeroext i8 @colour(double %0, double %1, double %2) {
%4 = fptrunc double %0 to float
%5 = fptrunc double %1 to float
%6 = fptrunc double %2 to float
%7 = fsub float %4, %5
%8 = fmul float %7, %6
%9 = fcmp olt float %8, 0.000000e+00
br i1 %9, label %10, label %16
10: ; preds = %3
%11 = fneg float %8
%12 = fpext float %11 to double
%13 = fadd double %12, 5.000000e-01
%14 = fptosi double %13 to i32
%15 = sub nsw i32 0, %14
br label %20
16: ; preds = %3
%17 = fpext float %8 to double
%18 = fadd double %17, 5.000000e-01
%19 = fptosi double %18 to i32
br label %20
20: ; preds = %16, %10
%21 = phi i32 [ %15, %10 ], [ %19, %16 ]
%22 = icmp slt i32 %21, 255
%23 = select i1 %22, i32 %21, i32 255
%24 = icmp sgt i32 %23, 0
%25 = select i1 %24, i32 %23, i32 0
%26 = trunc i32 %25 to i8
ret i8 %26
}