void nonlinear_color_interpolation_3(float *x, float *c) {
  int i;
  float xmax = 0.0;
  for (i = 0; i < 3; i++) {
    if (x[i] > xmax)
      xmax = x[i];
  }
  if (xmax <= 1.0 || xmax == 0.0) {
    for (i = 0; i < 3; i++)
      c[i] = x[i];
    return;
  } else {
    for (i = 0; i < 3; i++)
      c[i] = x[i] / xmax;
  }
}


x86 assembly (clang, -O0):
<nonlinear_color_interpolation_3>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jge    1161 <nonlinear_color_interpolation_3+0x61>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x18(%rbp),%xmm0
jbe    114e <nonlinear_color_interpolation_3+0x4e>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x18(%rbp)
jmp    1153 <nonlinear_color_interpolation_3+0x53>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111b <nonlinear_color_interpolation_3+0x1b>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe8e(%rip),%xmm0
ucomisd %xmm1,%xmm0
jae    1198 <nonlinear_color_interpolation_3+0x98>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11d6 <nonlinear_color_interpolation_3+0xd6>
jp     11d6 <nonlinear_color_interpolation_3+0xd6>
movl   $0x0,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jge    11d1 <nonlinear_color_interpolation_3+0xd1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    119f <nonlinear_color_interpolation_3+0x9f>
jmp    1219 <nonlinear_color_interpolation_3+0x119>
movl   $0x0,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jge    1214 <nonlinear_color_interpolation_3+0x114>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11dd <nonlinear_color_interpolation_3+0xdd>
jmp    1219 <nonlinear_color_interpolation_3+0x119>
pop    %rbp
ret

x86 assembly (clang, -O2):
<nonlinear_color_interpolation_3>:
movss  (%rdi),%xmm0
movss  0x4(%rdi),%xmm3
xorps  %xmm2,%xmm2
movaps %xmm0,%xmm1
maxss  %xmm2,%xmm1
maxss  %xmm1,%xmm3
movss  0x8(%rdi),%xmm1
maxss  %xmm3,%xmm1
movss  0xed8(%rip),%xmm3
ucomiss %xmm1,%xmm3
jae    1159 <nonlinear_color_interpolation_3+0x59>
ucomiss %xmm2,%xmm1
jne    1134 <nonlinear_color_interpolation_3+0x34>
jnp    1159 <nonlinear_color_interpolation_3+0x59>
divss  %xmm1,%xmm0
movss  %xmm0,(%rsi)
movss  0x4(%rdi),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0x4(%rsi)
movss  0x8(%rdi),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0x8(%rsi)
ret
movss  %xmm0,(%rsi)
movss  0x4(%rdi),%xmm0
movss  %xmm0,0x4(%rsi)
movss  0x8(%rdi),%xmm0
movss  %xmm0,0x8(%rsi)
ret

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

LLVM IR (-O2):
define void @nonlinear_color_interpolation_3(float* nocapture %0, float* nocapture writeonly %1) {
%3 = load float, float* %0
%4 = fcmp ogt float %3, 0.000000e+00
%5 = select i1 %4, float %3, float 0.000000e+00
%6 = getelementptr inbounds float, float* %0, i64 1
%7 = load float, float* %6
%8 = fcmp ogt float %7, %5
%9 = select i1 %8, float %7, float %5
%10 = getelementptr inbounds float, float* %0, i64 2
%11 = load float, float* %10
%12 = fcmp ogt float %11, %9
%13 = select i1 %12, float %11, float %9
%14 = fcmp ole float %13, 1.000000e+00
%15 = fcmp oeq float %13, 0.000000e+00
%16 = or i1 %14, %15
br i1 %16, label %24, label %17
17: ; preds = %2
%18 = fdiv float %3, %13
store float %18, float* %1
%19 = load float, float* %6
%20 = fdiv float %19, %13
%21 = getelementptr inbounds float, float* %1, i64 1
store float %20, float* %21
%22 = load float, float* %10
%23 = fdiv float %22, %13
br label %28
24: ; preds = %2
store float %3, float* %1
%25 = load float, float* %6
%26 = getelementptr inbounds float, float* %1, i64 1
store float %25, float* %26
%27 = load float, float* %10
br label %28
28: ; preds = %17, %24
%29 = phi float [ %23, %17 ], [ %27, %24 ]
%30 = getelementptr inbounds float, float* %1, i64 2
store float %29, float* %30
ret void
}