float catrom(float x) {
  if (x < 1) {
    return (3 * x * x * x - 5 * x * x + 2) / 2;
  }
  return (-1 * x * x * x + 5 * x * x - 8 * x + 4) / 2;
}


x86 assembly (clang, -O0):
<catrom>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  0xeef(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    117b <catrom+0x7b>
movss  0xef5(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  0xed6(%rip),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xea3(%rip),%xmm1
addss  %xmm1,%xmm0
movss  0xe97(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11de <catrom+0xde>
movss  0xe91(%rip),%xmm1
mulss  -0x8(%rbp),%xmm1
mulss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm2
movss  0xe76(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
movss  0xe53(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe3f(%rip),%xmm1
addss  %xmm1,%xmm0
movss  0xe2f(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<catrom>:
movss  0xef8(%rip),%xmm1
ucomiss %xmm0,%xmm1
jbe    113f <catrom+0x3f>
movss  0xefb(%rip),%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
movss  0xeef(%rip),%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm0,%xmm1
addss  %xmm2,%xmm1
addss  0xedb(%rip),%xmm1
jmp    1175 <catrom+0x75>
movaps %xmm0,%xmm1
mulss  %xmm0,%xmm1
movss  0xeb6(%rip),%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm0,%xmm1
mulss  0xea6(%rip),%xmm0
subss  %xmm1,%xmm2
addss  %xmm2,%xmm0
addss  0xe9a(%rip),%xmm0
movaps %xmm0,%xmm1
mulss  0xe9f(%rip),%xmm1
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @catrom(float %0) {
%2 = alloca float
%3 = alloca float
store float %0, float* %3
%4 = load float, float* %3
%5 = fcmp olt float %4, 1.000000e+00
br i1 %5, label %6, label %20
6: ; preds = %1
%7 = load float, float* %3
%8 = fmul float 3.000000e+00, %7
%9 = load float, float* %3
%10 = fmul float %8, %9
%11 = load float, float* %3
%12 = load float, float* %3
%13 = fmul float 5.000000e+00, %12
%14 = load float, float* %3
%15 = fmul float %13, %14
%16 = fneg float %15
%17 = call float @llvm.fmuladd.f32(float %10, float %11, float %16)
%18 = fadd float %17, 2.000000e+00
%19 = fdiv float %18, 2.000000e+00
store float %19, float* %2
br label %35
20: ; preds = %1
%21 = load float, float* %3
%22 = fmul float -1.000000e+00, %21
%23 = load float, float* %3
%24 = fmul float %22, %23
%25 = load float, float* %3
%26 = load float, float* %3
%27 = fmul float 5.000000e+00, %26
%28 = load float, float* %3
%29 = fmul float %27, %28
%30 = call float @llvm.fmuladd.f32(float %24, float %25, float %29)
%31 = load float, float* %3
%32 = call float @llvm.fmuladd.f32(float -8.000000e+00, float %31, float %30)
%33 = fadd float %32, 4.000000e+00
%34 = fdiv float %33, 2.000000e+00
store float %34, float* %2
br label %35
35: ; preds = %20, %6
%36 = load float, float* %2
ret float %36
}

LLVM IR (-O2):
define float @catrom(float %0) {
%2 = fcmp olt float %0, 1.000000e+00
br i1 %2, label %3, label %10
3: ; preds = %1
%4 = fmul float %0, 3.000000e+00
%5 = fmul float %4, %0
%6 = fmul float %0, -5.000000e+00
%7 = fmul float %6, %0
%8 = tail call float @llvm.fmuladd.f32(float %5, float %0, float %7)
%9 = fadd float %8, 2.000000e+00
br label %18
10: ; preds = %1
%11 = fneg float %0
%12 = fmul float %11, %0
%13 = fmul float %0, 5.000000e+00
%14 = fmul float %13, %0
%15 = tail call float @llvm.fmuladd.f32(float %12, float %0, float %14)
%16 = tail call float @llvm.fmuladd.f32(float %0, float -8.000000e+00, float %15)
%17 = fadd float %16, 4.000000e+00
br label %18
18: ; preds = %10, %3
%19 = phi float [ %9, %3 ], [ %17, %10 ]
%20 = fmul float %19, 5.000000e-01
ret float %20
}