float cubic_float(float x) {
  if (x < 0)
    x = -x;
  if (x < 1)
    return (2 - 0.5) * x * x * x + (0.5 - 3) * x * x + 1;
  if (x < 2)
    return -0.5 * x * x * x + 5 * 0.5 * x * x - 8 * 0.5 * x + 4 * 0.5;
  return 0;
}


x86 assembly (clang, -O0):
<cubic_float>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    112d <cubic_float+0x2d>
movss  -0x8(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xecb(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11ae <cubic_float+0xae>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xee8(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm3
movsd  0xeb5(%rip),%xmm1
mulsd  %xmm3,%xmm1
movss  -0x8(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe8c(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1250 <cubic_float+0x150>
movss  0xe4e(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    1248 <cubic_float+0x148>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4f(%rip),%xmm1
mulsd  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm2
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm3
movsd  0xe1c(%rip),%xmm0
mulsd  %xmm3,%xmm0
movss  -0x8(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
mulsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdea(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xdd2(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1250 <cubic_float+0x150>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cubic_float>:
movaps %xmm0,%xmm1
movaps 0xef6(%rip),%xmm3
xorps  %xmm0,%xmm3
xorps  %xmm0,%xmm0
movaps %xmm1,%xmm2
cmpltss %xmm0,%xmm2
andps  %xmm2,%xmm3
andnps %xmm1,%xmm2
orps   %xmm3,%xmm2
movss  0xee7(%rip),%xmm1
ucomiss %xmm2,%xmm1
jbe    116d <cubic_float+0x6d>
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
movsd  0xefb(%rip),%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  0xef3(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
addsd  0xee3(%rip),%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
ret
movss  0xe9f(%rip),%xmm1
ucomiss %xmm2,%xmm1
jbe    11c1 <cubic_float+0xc1>
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
movsd  0xe8f(%rip),%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  0xe87(%rip),%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
mulsd  0xe77(%rip),%xmm0
addsd  %xmm1,%xmm0
addsd  0xe73(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @cubic_float(float %0) {
%2 = alloca float
%3 = alloca float
store float %0, float* %3
%4 = load float, float* %3
%5 = fcmp olt float %4, 0.000000e+00
br i1 %5, label %6, label %9
6: ; preds = %1
%7 = load float, float* %3
%8 = fneg float %7
store float %8, float* %3
br label %9
9: ; preds = %6, %1
%10 = load float, float* %3
%11 = fcmp olt float %10, 1.000000e+00
br i1 %11, label %12, label %30
12: ; preds = %9
%13 = load float, float* %3
%14 = fpext float %13 to double
%15 = fmul double 1.500000e+00, %14
%16 = load float, float* %3
%17 = fpext float %16 to double
%18 = fmul double %15, %17
%19 = load float, float* %3
%20 = fpext float %19 to double
%21 = load float, float* %3
%22 = fpext float %21 to double
%23 = fmul double -2.500000e+00, %22
%24 = load float, float* %3
%25 = fpext float %24 to double
%26 = fmul double %23, %25
%27 = call double @llvm.fmuladd.f64(double %18, double %20, double %26)
%28 = fadd double %27, 1.000000e+00
%29 = fptrunc double %28 to float
store float %29, float* %2
br label %55
30: ; preds = %9
%31 = load float, float* %3
%32 = fcmp olt float %31, 2.000000e+00
br i1 %32, label %33, label %54
33: ; preds = %30
%34 = load float, float* %3
%35 = fpext float %34 to double
%36 = fmul double -5.000000e-01, %35
%37 = load float, float* %3
%38 = fpext float %37 to double
%39 = fmul double %36, %38
%40 = load float, float* %3
%41 = fpext float %40 to double
%42 = load float, float* %3
%43 = fpext float %42 to double
%44 = fmul double 2.500000e+00, %43
%45 = load float, float* %3
%46 = fpext float %45 to double
%47 = fmul double %44, %46
%48 = call double @llvm.fmuladd.f64(double %39, double %41, double %47)
%49 = load float, float* %3
%50 = fpext float %49 to double
%51 = call double @llvm.fmuladd.f64(double -4.000000e+00, double %50, double %48)
%52 = fadd double %51, 2.000000e+00
%53 = fptrunc double %52 to float
store float %53, float* %2
br label %55
54: ; preds = %30
store float 0.000000e+00, float* %2
br label %55
55: ; preds = %54, %33, %12
%56 = load float, float* %2
ret float %56
}

LLVM IR (-O2):
define float @cubic_float(float %0) {
%2 = fcmp olt float %0, 0.000000e+00
%3 = fneg float %0
%4 = select i1 %2, float %3, float %0
%5 = fcmp olt float %4, 1.000000e+00
br i1 %5, label %6, label %15
6: ; preds = %1
%7 = fpext float %4 to double
%8 = fmul double %7, 1.500000e+00
%9 = fmul double %8, %7
%10 = fmul double %7, -2.500000e+00
%11 = fmul double %10, %7
%12 = tail call double @llvm.fmuladd.f64(double %9, double %7, double %11)
%13 = fadd double %12, 1.000000e+00
%14 = fptrunc double %13 to float
br label %27
15: ; preds = %1
%16 = fcmp olt float %4, 2.000000e+00
br i1 %16, label %17, label %27
17: ; preds = %15
%18 = fpext float %4 to double
%19 = fmul double %18, -5.000000e-01
%20 = fmul double %19, %18
%21 = fmul double %18, 2.500000e+00
%22 = fmul double %21, %18
%23 = tail call double @llvm.fmuladd.f64(double %20, double %18, double %22)
%24 = tail call double @llvm.fmuladd.f64(double %18, double -4.000000e+00, double %23)
%25 = fadd double %24, 2.000000e+00
%26 = fptrunc double %25 to float
br label %27
27: ; preds = %15, %17, %6
%28 = phi float [ %14, %6 ], [ %26, %17 ], [ 0.000000e+00, %15 ]
ret float %28
}