float expf(float x) {
  if (x <= -4.f)
    return 0.f;
  x -= -2.f;
  float x2 = x * x;
  float x3 = x2 * x;
  float x4 = x2 * x2;
  float x5 = x2 * x3;
  return 0.1353352832366127f *
         (1.f + x + x2 / 2.f + x3 / 6.f + x4 / 24.f + x5 / 120.f);
}


x86 assembly (clang, -O0):
<expf>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  0xeef(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jb     1128 <expf+0x28>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11ec <expf+0xec>
movss  -0x8(%rbp),%xmm0
movss  0xee7(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0xc(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  0xe96(%rip),%xmm1
addss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
movss  0xe80(%rip),%xmm2
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
movss  -0x10(%rbp),%xmm0
movss  0xe67(%rip),%xmm2
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
movss  0xe4e(%rip),%xmm2
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
movss  -0x18(%rbp),%xmm0
movss  0xe35(%rip),%xmm2
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
movss  0xe21(%rip),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<expf>:
xorps  %xmm1,%xmm1
movss  0xef5(%rip),%xmm2
ucomiss %xmm0,%xmm2
jae    1174 <expf+0x74>
addss  0xeec(%rip),%xmm0
movaps %xmm0,%xmm1
mulss  %xmm0,%xmm1
movaps %xmm0,%xmm2
mulss  %xmm1,%xmm2
movaps %xmm1,%xmm3
shufps $0x0,%xmm1,%xmm3
movaps %xmm2,%xmm4
unpcklps %xmm1,%xmm4
addss  0xecd(%rip),%xmm0
mulss  0xec9(%rip),%xmm1
mulps  %xmm3,%xmm4
addss  %xmm0,%xmm1
divss  0xebe(%rip),%xmm2
addss  %xmm1,%xmm2
divps  0xec3(%rip),%xmm4
movaps %xmm4,%xmm1
shufps $0x55,%xmm4,%xmm1
addss  %xmm2,%xmm1
addss  %xmm4,%xmm1
mulss  0xea0(%rip),%xmm1
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @expf(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
store float %0, float* %3
%8 = load float, float* %3
%9 = fcmp ole float %8, -4.000000e+00
br i1 %9, label %10, label %11
10: ; preds = %1
store float 0.000000e+00, float* %2
br label %41
11: ; preds = %1
%12 = load float, float* %3
%13 = fsub float %12, -2.000000e+00
store float %13, float* %3
%14 = load float, float* %3
%15 = load float, float* %3
%16 = fmul float %14, %15
store float %16, float* %4
%17 = load float, float* %4
%18 = load float, float* %3
%19 = fmul float %17, %18
store float %19, float* %5
%20 = load float, float* %4
%21 = load float, float* %4
%22 = fmul float %20, %21
store float %22, float* %6
%23 = load float, float* %4
%24 = load float, float* %5
%25 = fmul float %23, %24
store float %25, float* %7
%26 = load float, float* %3
%27 = fadd float 1.000000e+00, %26
%28 = load float, float* %4
%29 = fdiv float %28, 2.000000e+00
%30 = fadd float %27, %29
%31 = load float, float* %5
%32 = fdiv float %31, 6.000000e+00
%33 = fadd float %30, %32
%34 = load float, float* %6
%35 = fdiv float %34, 2.400000e+01
%36 = fadd float %33, %35
%37 = load float, float* %7
%38 = fdiv float %37, 1.200000e+02
%39 = fadd float %36, %38
%40 = fmul float 0x3FC152AAA0000000, %39
store float %40, float* %2
br label %41
41: ; preds = %11, %10
%42 = load float, float* %2
ret float %42
}

LLVM IR (-O2):
define float @expf(float %0) {
%2 = fcmp ugt float %0, -4.000000e+00
br i1 %2, label %3, label %23
3: ; preds = %1
%4 = fadd float %0, 2.000000e+00
%5 = fmul float %4, %4
%6 = fmul float %4, %5
%7 = insertelement <2 x float> poison, float %5, i64 0
%8 = shufflevector <2 x float> %7, <2 x float> poison, <2 x i32> zeroinitializer
%9 = insertelement <2 x float> poison, float %6, i64 0
%10 = insertelement <2 x float> %9, float %5, i64 1
%11 = fmul <2 x float> %8, %10
%12 = fadd float %4, 1.000000e+00
%13 = fmul float %5, 5.000000e-01
%14 = fadd float %12, %13
%15 = fdiv float %6, 6.000000e+00
%16 = fadd float %14, %15
%17 = fdiv <2 x float> %11, <float 1.200000e+02, float 2.400000e+01>
%18 = extractelement <2 x float> %17, i64 1
%19 = fadd float %18, %16
%20 = extractelement <2 x float> %17, i64 0
%21 = fadd float %20, %19
%22 = fmul float %21, 0x3FC152AAA0000000
br label %23
23: ; preds = %1, %3
%24 = phi float [ %22, %3 ], [ 0.000000e+00, %1 ]
ret float %24
}