void linear_color_interpolation(float x, float *c0, float *c1, float *c) {
  int i;
  if (x > 1.0) {
    for (i = 0; i < 3; i++)
      c[i] = c1[i];
    return;
  }
  if (x < 0.0) {
    for (i = 0; i < 3; i++)
      c[i] = c0[i];
    return;
  }
  for (i = 0; i < 3; i++)
    c[i] = c0[i] * (1.0 - x) + c1[i] * x;
}


x86 assembly (clang, -O0):
<linear_color_interpolation>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeda(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    116e <linear_color_interpolation+0x6e>
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1169 <linear_color_interpolation+0x69>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1137 <linear_color_interpolation+0x37>
jmp    1236 <linear_color_interpolation+0x136>
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11c2 <linear_color_interpolation+0xc2>
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    11bd <linear_color_interpolation+0xbd>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    118b <linear_color_interpolation+0x8b>
jmp    1236 <linear_color_interpolation+0x136>
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1236 <linear_color_interpolation+0x136>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe0b(%rip),%xmm2
subsd  %xmm1,%xmm2
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11c9 <linear_color_interpolation+0xc9>
pop    %rbp
ret

x86 assembly (clang, -O2):
<linear_color_interpolation>:
ucomiss 0xef9(%rip),%xmm0
jbe    1126 <linear_color_interpolation+0x26>
movss  (%rsi),%xmm0
movss  %xmm0,(%rdx)
movss  0x4(%rsi),%xmm0
movss  %xmm0,0x4(%rdx)
movss  0x8(%rsi),%xmm0
movss  %xmm0,0x8(%rdx)
ret
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
jbe    114b <linear_color_interpolation+0x4b>
movss  (%rdi),%xmm0
movss  %xmm0,(%rdx)
movss  0x4(%rdi),%xmm0
movss  %xmm0,0x4(%rdx)
movss  0x8(%rdi),%xmm0
movss  %xmm0,0x8(%rdx)
ret
cvtss2sd %xmm0,%xmm2
movsd  0xeb1(%rip),%xmm1
subsd  %xmm2,%xmm1
movss  (%rdi),%xmm2
cvtss2sd %xmm2,%xmm2
movss  (%rsi),%xmm3
mulss  %xmm0,%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,(%rdx)
movss  0x4(%rdi),%xmm2
cvtss2sd %xmm2,%xmm2
movss  0x4(%rsi),%xmm3
mulss  %xmm0,%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
cvtsd2ss %xmm2,%xmm2
movss  %xmm2,0x4(%rdx)
movss  0x8(%rdi),%xmm2
cvtss2sd %xmm2,%xmm2
mulss  0x8(%rsi),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
movss  %xmm0,0x8(%rdx)
ret

LLVM IR (-O0):
define void @linear_color_interpolation(float %0, float* %1, float* %2, float* %3) {
%5 = alloca float
%6 = alloca float*
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
store float %0, float* %5
store float* %1, float** %6
store float* %2, float** %7
store float* %3, float** %8
%10 = load float, float* %5
%11 = fpext float %10 to double
%12 = fcmp ogt double %11, 1.000000e+00
br i1 %12, label %13, label %31
13: ; preds = %4
store i32 0, i32* %9
br label %14
14: ; preds = %27, %13
%15 = load i32, i32* %9
%16 = icmp slt i32 %15, 3
br i1 %16, label %17, label %30
17: ; preds = %14
%18 = load float*, float** %7
%19 = load i32, i32* %9
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds float, float* %18, i64 %20
%22 = load float, float* %21
%23 = load float*, float** %8
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds float, float* %23, i64 %25
store float %22, float* %26
br label %27
27: ; preds = %17
%28 = load i32, i32* %9
%29 = add nsw i32 %28, 1
store i32 %29, i32* %9
br label %14
30: ; preds = %14
br label %84
31: ; preds = %4
%32 = load float, float* %5
%33 = fpext float %32 to double
%34 = fcmp olt double %33, 0.000000e+00
br i1 %34, label %35, label %53
35: ; preds = %31
store i32 0, i32* %9
br label %36
36: ; preds = %49, %35
%37 = load i32, i32* %9
%38 = icmp slt i32 %37, 3
br i1 %38, label %39, label %52
39: ; preds = %36
%40 = load float*, float** %6
%41 = load i32, i32* %9
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds float, float* %40, i64 %42
%44 = load float, float* %43
%45 = load float*, float** %8
%46 = load i32, i32* %9
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds float, float* %45, i64 %47
store float %44, float* %48
br label %49
49: ; preds = %39
%50 = load i32, i32* %9
%51 = add nsw i32 %50, 1
store i32 %51, i32* %9
br label %36
52: ; preds = %36
br label %84
53: ; preds = %31
store i32 0, i32* %9
br label %54
54: ; preds = %81, %53
%55 = load i32, i32* %9
%56 = icmp slt i32 %55, 3
br i1 %56, label %57, label %84
57: ; preds = %54
%58 = load float*, float** %6
%59 = load i32, i32* %9
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds float, float* %58, i64 %60
%62 = load float, float* %61
%63 = fpext float %62 to double
%64 = load float, float* %5
%65 = fpext float %64 to double
%66 = fsub double 1.000000e+00, %65
%67 = load float*, float** %7
%68 = load i32, i32* %9
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds float, float* %67, i64 %69
%71 = load float, float* %70
%72 = load float, float* %5
%73 = fmul float %71, %72
%74 = fpext float %73 to double
%75 = call double @llvm.fmuladd.f64(double %63, double %66, double %74)
%76 = fptrunc double %75 to float
%77 = load float*, float** %8
%78 = load i32, i32* %9
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds float, float* %77, i64 %79
store float %76, float* %80
br label %81
81: ; preds = %57
%82 = load i32, i32* %9
%83 = add nsw i32 %82, 1
store i32 %83, i32* %9
br label %54
84: ; preds = %30, %52, %54
ret void
}

LLVM IR (-O2):
define void @linear_color_interpolation(float %0, float* nocapture %1, float* nocapture %2, float* nocapture writeonly %3) {
%5 = fpext float %0 to double
%6 = fcmp ogt float %0, 1.000000e+00
br i1 %6, label %7, label %14
7: ; preds = %4
%8 = load float, float* %2
store float %8, float* %3
%9 = getelementptr inbounds float, float* %2, i64 1
%10 = load float, float* %9
%11 = getelementptr inbounds float, float* %3, i64 1
store float %10, float* %11
%12 = getelementptr inbounds float, float* %2, i64 2
%13 = load float, float* %12
br label %51
14: ; preds = %4
%15 = fcmp olt float %0, 0.000000e+00
br i1 %15, label %16, label %23
16: ; preds = %14
%17 = load float, float* %1
store float %17, float* %3
%18 = getelementptr inbounds float, float* %1, i64 1
%19 = load float, float* %18
%20 = getelementptr inbounds float, float* %3, i64 1
store float %19, float* %20
%21 = getelementptr inbounds float, float* %1, i64 2
%22 = load float, float* %21
br label %51
23: ; preds = %14
%24 = fsub double 1.000000e+00, %5
%25 = load float, float* %1
%26 = fpext float %25 to double
%27 = load float, float* %2
%28 = fmul float %27, %0
%29 = fpext float %28 to double
%30 = tail call double @llvm.fmuladd.f64(double %26, double %24, double %29)
%31 = fptrunc double %30 to float
store float %31, float* %3
%32 = getelementptr inbounds float, float* %1, i64 1
%33 = load float, float* %32
%34 = fpext float %33 to double
%35 = getelementptr inbounds float, float* %2, i64 1
%36 = load float, float* %35
%37 = fmul float %36, %0
%38 = fpext float %37 to double
%39 = tail call double @llvm.fmuladd.f64(double %34, double %24, double %38)
%40 = fptrunc double %39 to float
%41 = getelementptr inbounds float, float* %3, i64 1
store float %40, float* %41
%42 = getelementptr inbounds float, float* %1, i64 2
%43 = load float, float* %42
%44 = fpext float %43 to double
%45 = getelementptr inbounds float, float* %2, i64 2
%46 = load float, float* %45
%47 = fmul float %46, %0
%48 = fpext float %47 to double
%49 = tail call double @llvm.fmuladd.f64(double %44, double %24, double %48)
%50 = fptrunc double %49 to float
br label %51
51: ; preds = %23, %16, %7
%52 = phi float [ %50, %23 ], [ %22, %16 ], [ %13, %7 ]
%53 = getelementptr inbounds float, float* %3, i64 2
store float %52, float* %53
ret void
}