float quintic_ease_in_out(float p) {
  float f = 0.0f;
  if (p < 0.5f) {
    f = 16.0f * p * p * p * p * p;
  } else {
    f = ((2.0f * p) - 2.0f);
    f = 0.5f * f * f * f * f * f + 1.0f;
  }
  return f;
}


x86 assembly (clang, -O0):
<quintic_ease_in_out>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xee7(%rip),%xmm0
ucomiss -0x4(%rbp),%xmm0
jbe    114e <quintic_ease_in_out+0x4e>
movss  0xee1(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    119e <quintic_ease_in_out+0x9e>
movss  -0x4(%rbp),%xmm0
addss  %xmm0,%xmm0
movss  0xea9(%rip),%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xe90(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  0xe6f(%rip),%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<quintic_ease_in_out>:
movss  0xef8(%rip),%xmm1
ucomiss %xmm0,%xmm1
jbe    112d <quintic_ease_in_out+0x2d>
movss  0xef7(%rip),%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
movaps %xmm1,%xmm0
ret
addss  %xmm0,%xmm0
addss  0xecb(%rip),%xmm0
movss  0xebf(%rip),%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
mulss  %xmm0,%xmm1
addss  0xeab(%rip),%xmm1
movaps %xmm1,%xmm0
ret

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

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