float filt_quadratic(float x) {
  if (x < -1.5)
    return 0.0;
  if (x < -0.5)
    return 0.5 * (x + 1.5) * (x + 1.5);
  if (x < 0.5)
    return 0.75 - (x * x);
  if (x < 1.5)
    return 0.5 * (x - 1.5) * (x - 1.5);
  return 0.0;
}


x86 assembly (clang, -O0):
<filt_quadratic>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xee6(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1131 <filt_quadratic+0x31>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1242 <filt_quadratic+0x142>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xec6(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1194 <filt_quadratic+0x94>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xebb(%rip),%xmm0
addsd  %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe9a(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1242 <filt_quadratic+0x142>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe6b(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11d7 <filt_quadratic+0xd7>
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe5b(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1242 <filt_quadratic+0x142>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe30(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    123a <filt_quadratic+0x13a>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe15(%rip),%xmm0
subsd  %xmm0,%xmm1
movsd  0xe01(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xdf4(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1242 <filt_quadratic+0x142>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<filt_quadratic>:
movaps %xmm0,%xmm1
xorps  %xmm0,%xmm0
movss  0xef2(%rip),%xmm2
ucomiss %xmm1,%xmm2
ja     1178 <filt_quadratic+0x78>
xorps  %xmm2,%xmm2
cvtss2sd %xmm1,%xmm2
movss  0xee2(%rip),%xmm3
ucomiss %xmm1,%xmm3
jbe    1131 <filt_quadratic+0x31>
addsd  0xef9(%rip),%xmm2
jmp    1164 <filt_quadratic+0x64>
movss  0xecf(%rip),%xmm3
ucomiss %xmm1,%xmm3
jbe    114f <filt_quadratic+0x4f>
mulss  %xmm1,%xmm1
movss  0xec6(%rip),%xmm0
subss  %xmm1,%xmm0
ret
movss  0xeb5(%rip),%xmm3
ucomiss %xmm1,%xmm3
jbe    1178 <filt_quadratic+0x78>
addsd  0xeb4(%rip),%xmm2
movsd  0xeb4(%rip),%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
cvtsd2ss %xmm0,%xmm0
ret

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

LLVM IR (-O2):
define float @filt_quadratic(float %0) {
%2 = fpext float %0 to double
%3 = fcmp olt float %0, -1.500000e+00
br i1 %3, label %23, label %4
4: ; preds = %1
%5 = fcmp olt float %0, -5.000000e-01
br i1 %5, label %6, label %11
6: ; preds = %4
%7 = fadd double %2, 1.500000e+00
%8 = fmul double %7, 5.000000e-01
%9 = fmul double %7, %8
%10 = fptrunc double %9 to float
br label %23
11: ; preds = %4
%12 = fcmp olt float %0, 5.000000e-01
br i1 %12, label %13, label %16
13: ; preds = %11
%14 = fmul float %0, %0
%15 = fsub float 7.500000e-01, %14
br label %23
16: ; preds = %11
%17 = fcmp olt float %0, 1.500000e+00
br i1 %17, label %18, label %23
18: ; preds = %16
%19 = fadd double %2, -1.500000e+00
%20 = fmul double %19, 5.000000e-01
%21 = fmul double %19, %20
%22 = fptrunc double %21 to float
br label %23
23: ; preds = %16, %1, %18, %13, %6
%24 = phi float [ %10, %6 ], [ %15, %13 ], [ %22, %18 ], [ 0.000000e+00, %1 ], [ 0.000000e+00, %16 ]
ret float %24
}