double sn_small(double u, double rk) {
  double m, u2, sn;
  double s0, s2, s4, s6;
  m = (rk * rk) / (1.0 + rk * rk);
  s0 = 1.0;
  s2 = -(1.0 + m) / 6.0;
  s4 = (1.0 + 14.0 * m + m * m) / 120.0;
  s6 = -(1.0 + 135.0 * m * (1.0 + m) + m * m * m) / 5040.0;
  u2 = u * u;
  sn = s4 + s6 * u2;
  sn = s2 + sn * u2;
  sn = s0 + sn * u2;
  return sn * u;
}


x86 assembly (clang, -O0):
<sn_small>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xeda(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xec5(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xeb8(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xeb4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  0xe96(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe72(%rip),%xmm0
addsd  %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xe64(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe4b(%rip),%xmm1
mulsd  -0x18(%rbp),%xmm1
movsd  0xe36(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe25(%rip),%xmm0
addsd  %xmm0,%xmm1
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xde3(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sn_small>:
mulsd  %xmm1,%xmm1
movsd  0xef4(%rip),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
divsd  %xmm3,%xmm1
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
movapd %xmm3,%xmm4
divsd  0xedc(%rip),%xmm4
movsd  0xedc(%rip),%xmm5
mulsd  %xmm1,%xmm5
addsd  %xmm2,%xmm5
movapd %xmm1,%xmm6
mulsd  %xmm1,%xmm6
addsd  %xmm6,%xmm5
divsd  0xec8(%rip),%xmm5
mulsd  %xmm1,%xmm6
mulsd  0xec4(%rip),%xmm1
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm6,%xmm3
divsd  0xeb8(%rip),%xmm3
movapd %xmm0,%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm1,%xmm3
addsd  %xmm5,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm3,%xmm0
ret

LLVM IR (-O0):
define double @sn_small(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
store double %0, double* %3
store double %1, double* %4
%12 = load double, double* %4
%13 = load double, double* %4
%14 = fmul double %12, %13
%15 = load double, double* %4
%16 = load double, double* %4
%17 = call double @llvm.fmuladd.f64(double %15, double %16, double 1.000000e+00)
%18 = fdiv double %14, %17
store double %18, double* %5
store double 1.000000e+00, double* %8
%19 = load double, double* %5
%20 = fadd double 1.000000e+00, %19
%21 = fneg double %20
%22 = fdiv double %21, 6.000000e+00
store double %22, double* %9
%23 = load double, double* %5
%24 = call double @llvm.fmuladd.f64(double 1.400000e+01, double %23, double 1.000000e+00)
%25 = load double, double* %5
%26 = load double, double* %5
%27 = call double @llvm.fmuladd.f64(double %25, double %26, double %24)
%28 = fdiv double %27, 1.200000e+02
store double %28, double* %10
%29 = load double, double* %5
%30 = fmul double 1.350000e+02, %29
%31 = load double, double* %5
%32 = fadd double 1.000000e+00, %31
%33 = call double @llvm.fmuladd.f64(double %30, double %32, double 1.000000e+00)
%34 = load double, double* %5
%35 = load double, double* %5
%36 = fmul double %34, %35
%37 = load double, double* %5
%38 = call double @llvm.fmuladd.f64(double %36, double %37, double %33)
%39 = fneg double %38
%40 = fdiv double %39, 5.040000e+03
store double %40, double* %11
%41 = load double, double* %3
%42 = load double, double* %3
%43 = fmul double %41, %42
store double %43, double* %6
%44 = load double, double* %10
%45 = load double, double* %11
%46 = load double, double* %6
%47 = call double @llvm.fmuladd.f64(double %45, double %46, double %44)
store double %47, double* %7
%48 = load double, double* %9
%49 = load double, double* %7
%50 = load double, double* %6
%51 = call double @llvm.fmuladd.f64(double %49, double %50, double %48)
store double %51, double* %7
%52 = load double, double* %8
%53 = load double, double* %7
%54 = load double, double* %6
%55 = call double @llvm.fmuladd.f64(double %53, double %54, double %52)
store double %55, double* %7
%56 = load double, double* %7
%57 = load double, double* %3
%58 = fmul double %56, %57
ret double %58
}

LLVM IR (-O2):
define double @sn_small(double %0, double %1) {
%3 = fmul double %1, %1
%4 = tail call double @llvm.fmuladd.f64(double %1, double %1, double 1.000000e+00)
%5 = fdiv double %3, %4
%6 = fadd double %5, 1.000000e+00
%7 = fdiv double %6, -6.000000e+00
%8 = tail call double @llvm.fmuladd.f64(double %5, double 1.400000e+01, double 1.000000e+00)
%9 = tail call double @llvm.fmuladd.f64(double %5, double %5, double %8)
%10 = fdiv double %9, 1.200000e+02
%11 = fmul double %5, 1.350000e+02
%12 = tail call double @llvm.fmuladd.f64(double %11, double %6, double 1.000000e+00)
%13 = fmul double %5, %5
%14 = tail call double @llvm.fmuladd.f64(double %13, double %5, double %12)
%15 = fdiv double %14, -5.040000e+03
%16 = fmul double %0, %0
%17 = tail call double @llvm.fmuladd.f64(double %15, double %16, double %10)
%18 = tail call double @llvm.fmuladd.f64(double %17, double %16, double %7)
%19 = tail call double @llvm.fmuladd.f64(double %18, double %16, double 1.000000e+00)
%20 = fmul double %19, %0
ret double %20
}