Project import
diff --git a/libm/Android.bp b/libm/Android.bp
new file mode 100644
index 0000000..23b9d5e
--- /dev/null
+++ b/libm/Android.bp
@@ -0,0 +1,533 @@
+bionic_coverage = false
+
+//
+// libm.so and libm.a for target.
+//
+cc_library {
+    name: "libm",
+
+    srcs: [
+        "upstream-freebsd/lib/msun/bsdsrc/b_exp.c",
+        "upstream-freebsd/lib/msun/bsdsrc/b_log.c",
+        "upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c",
+        "upstream-freebsd/lib/msun/src/catrig.c",
+        "upstream-freebsd/lib/msun/src/catrigf.c",
+        "upstream-freebsd/lib/msun/src/e_acos.c",
+        "upstream-freebsd/lib/msun/src/e_acosf.c",
+        "upstream-freebsd/lib/msun/src/e_acosh.c",
+        "upstream-freebsd/lib/msun/src/e_acoshf.c",
+        "upstream-freebsd/lib/msun/src/e_asin.c",
+        "upstream-freebsd/lib/msun/src/e_asinf.c",
+        "upstream-freebsd/lib/msun/src/e_atan2.c",
+        "upstream-freebsd/lib/msun/src/e_atan2f.c",
+        "upstream-freebsd/lib/msun/src/e_atanh.c",
+        "upstream-freebsd/lib/msun/src/e_atanhf.c",
+        "upstream-freebsd/lib/msun/src/e_cosh.c",
+        "upstream-freebsd/lib/msun/src/e_coshf.c",
+        "upstream-freebsd/lib/msun/src/e_exp.c",
+        "upstream-freebsd/lib/msun/src/e_expf.c",
+        "upstream-freebsd/lib/msun/src/e_fmod.c",
+        "upstream-freebsd/lib/msun/src/e_fmodf.c",
+        "upstream-freebsd/lib/msun/src/e_gamma.c",
+        "upstream-freebsd/lib/msun/src/e_gammaf.c",
+        "upstream-freebsd/lib/msun/src/e_gammaf_r.c",
+        "upstream-freebsd/lib/msun/src/e_gamma_r.c",
+        "upstream-freebsd/lib/msun/src/e_hypot.c",
+        "upstream-freebsd/lib/msun/src/e_hypotf.c",
+        "upstream-freebsd/lib/msun/src/e_j0.c",
+        "upstream-freebsd/lib/msun/src/e_j0f.c",
+        "upstream-freebsd/lib/msun/src/e_j1.c",
+        "upstream-freebsd/lib/msun/src/e_j1f.c",
+        "upstream-freebsd/lib/msun/src/e_jn.c",
+        "upstream-freebsd/lib/msun/src/e_jnf.c",
+        "upstream-freebsd/lib/msun/src/e_lgamma.c",
+        "upstream-freebsd/lib/msun/src/e_lgammaf.c",
+        "upstream-freebsd/lib/msun/src/e_lgammaf_r.c",
+        "upstream-freebsd/lib/msun/src/e_lgamma_r.c",
+        "upstream-freebsd/lib/msun/src/e_log10.c",
+        "upstream-freebsd/lib/msun/src/e_log10f.c",
+        "upstream-freebsd/lib/msun/src/e_log2.c",
+        "upstream-freebsd/lib/msun/src/e_log2f.c",
+        "upstream-freebsd/lib/msun/src/e_log.c",
+        "upstream-freebsd/lib/msun/src/e_logf.c",
+        "upstream-freebsd/lib/msun/src/e_pow.c",
+        "upstream-freebsd/lib/msun/src/e_powf.c",
+        "upstream-freebsd/lib/msun/src/e_remainder.c",
+        "upstream-freebsd/lib/msun/src/e_remainderf.c",
+        "upstream-freebsd/lib/msun/src/e_rem_pio2.c",
+        "upstream-freebsd/lib/msun/src/e_rem_pio2f.c",
+        "upstream-freebsd/lib/msun/src/e_scalb.c",
+        "upstream-freebsd/lib/msun/src/e_scalbf.c",
+        "upstream-freebsd/lib/msun/src/e_sinh.c",
+        "upstream-freebsd/lib/msun/src/e_sinhf.c",
+        "upstream-freebsd/lib/msun/src/e_sqrt.c",
+        "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+        "upstream-freebsd/lib/msun/src/imprecise.c",
+        "upstream-freebsd/lib/msun/src/k_cos.c",
+        "upstream-freebsd/lib/msun/src/k_cosf.c",
+        "upstream-freebsd/lib/msun/src/k_exp.c",
+        "upstream-freebsd/lib/msun/src/k_expf.c",
+        "upstream-freebsd/lib/msun/src/k_rem_pio2.c",
+        "upstream-freebsd/lib/msun/src/k_sin.c",
+        "upstream-freebsd/lib/msun/src/k_sinf.c",
+        "upstream-freebsd/lib/msun/src/k_tan.c",
+        "upstream-freebsd/lib/msun/src/k_tanf.c",
+        "upstream-freebsd/lib/msun/src/s_asinh.c",
+        "upstream-freebsd/lib/msun/src/s_asinhf.c",
+        "upstream-freebsd/lib/msun/src/s_atan.c",
+        "upstream-freebsd/lib/msun/src/s_atanf.c",
+        "upstream-freebsd/lib/msun/src/s_carg.c",
+        "upstream-freebsd/lib/msun/src/s_cargf.c",
+        "upstream-freebsd/lib/msun/src/s_cargl.c",
+        "upstream-freebsd/lib/msun/src/s_cbrt.c",
+        "upstream-freebsd/lib/msun/src/s_cbrtf.c",
+        "upstream-freebsd/lib/msun/src/s_ccosh.c",
+        "upstream-freebsd/lib/msun/src/s_ccoshf.c",
+        "upstream-freebsd/lib/msun/src/s_ceil.c",
+        "upstream-freebsd/lib/msun/src/s_ceilf.c",
+        "upstream-freebsd/lib/msun/src/s_cexp.c",
+        "upstream-freebsd/lib/msun/src/s_cexpf.c",
+        "upstream-freebsd/lib/msun/src/s_cimag.c",
+        "upstream-freebsd/lib/msun/src/s_cimagf.c",
+        "upstream-freebsd/lib/msun/src/s_cimagl.c",
+        "upstream-freebsd/lib/msun/src/s_conj.c",
+        "upstream-freebsd/lib/msun/src/s_conjf.c",
+        "upstream-freebsd/lib/msun/src/s_conjl.c",
+        "upstream-freebsd/lib/msun/src/s_copysign.c",
+        "upstream-freebsd/lib/msun/src/s_copysignf.c",
+        "upstream-freebsd/lib/msun/src/s_cos.c",
+        "upstream-freebsd/lib/msun/src/s_cosf.c",
+        "upstream-freebsd/lib/msun/src/s_cproj.c",
+        "upstream-freebsd/lib/msun/src/s_cprojf.c",
+        "upstream-freebsd/lib/msun/src/s_cprojl.c",
+        "upstream-freebsd/lib/msun/src/s_creal.c",
+        "upstream-freebsd/lib/msun/src/s_crealf.c",
+        "upstream-freebsd/lib/msun/src/s_creall.c",
+        "upstream-freebsd/lib/msun/src/s_csinh.c",
+        "upstream-freebsd/lib/msun/src/s_csinhf.c",
+        "upstream-freebsd/lib/msun/src/s_csqrt.c",
+        "upstream-freebsd/lib/msun/src/s_csqrtf.c",
+        "upstream-freebsd/lib/msun/src/s_csqrtl.c",
+        "upstream-freebsd/lib/msun/src/s_ctanh.c",
+        "upstream-freebsd/lib/msun/src/s_ctanhf.c",
+        "upstream-freebsd/lib/msun/src/s_erf.c",
+        "upstream-freebsd/lib/msun/src/s_erff.c",
+        "upstream-freebsd/lib/msun/src/s_exp2.c",
+        "upstream-freebsd/lib/msun/src/s_exp2f.c",
+        "upstream-freebsd/lib/msun/src/s_expm1.c",
+        "upstream-freebsd/lib/msun/src/s_expm1f.c",
+        "upstream-freebsd/lib/msun/src/s_fdim.c",
+        "upstream-freebsd/lib/msun/src/s_finite.c",
+        "upstream-freebsd/lib/msun/src/s_finitef.c",
+        "upstream-freebsd/lib/msun/src/s_floor.c",
+        "upstream-freebsd/lib/msun/src/s_floorf.c",
+        "upstream-freebsd/lib/msun/src/s_fma.c",
+        "upstream-freebsd/lib/msun/src/s_fmaf.c",
+        "upstream-freebsd/lib/msun/src/s_fmax.c",
+        "upstream-freebsd/lib/msun/src/s_fmaxf.c",
+        "upstream-freebsd/lib/msun/src/s_fmin.c",
+        "upstream-freebsd/lib/msun/src/s_fminf.c",
+        "upstream-freebsd/lib/msun/src/s_frexp.c",
+        "upstream-freebsd/lib/msun/src/s_frexpf.c",
+        "upstream-freebsd/lib/msun/src/s_ilogb.c",
+        "upstream-freebsd/lib/msun/src/s_ilogbf.c",
+        "upstream-freebsd/lib/msun/src/s_llrint.c",
+        "upstream-freebsd/lib/msun/src/s_llrintf.c",
+        "upstream-freebsd/lib/msun/src/s_llround.c",
+        "upstream-freebsd/lib/msun/src/s_llroundf.c",
+        "upstream-freebsd/lib/msun/src/s_log1p.c",
+        "upstream-freebsd/lib/msun/src/s_log1pf.c",
+        "upstream-freebsd/lib/msun/src/s_logb.c",
+        "upstream-freebsd/lib/msun/src/s_logbf.c",
+        "upstream-freebsd/lib/msun/src/s_lrint.c",
+        "upstream-freebsd/lib/msun/src/s_lrintf.c",
+        "upstream-freebsd/lib/msun/src/s_lround.c",
+        "upstream-freebsd/lib/msun/src/s_lroundf.c",
+        "upstream-freebsd/lib/msun/src/s_modf.c",
+        "upstream-freebsd/lib/msun/src/s_modff.c",
+        "upstream-freebsd/lib/msun/src/s_nan.c",
+        "upstream-freebsd/lib/msun/src/s_nearbyint.c",
+        "upstream-freebsd/lib/msun/src/s_nextafter.c",
+        "upstream-freebsd/lib/msun/src/s_nextafterf.c",
+        "upstream-freebsd/lib/msun/src/s_remquo.c",
+        "upstream-freebsd/lib/msun/src/s_remquof.c",
+        "upstream-freebsd/lib/msun/src/s_rint.c",
+        "upstream-freebsd/lib/msun/src/s_rintf.c",
+        "upstream-freebsd/lib/msun/src/s_round.c",
+        "upstream-freebsd/lib/msun/src/s_roundf.c",
+        "upstream-freebsd/lib/msun/src/s_scalbln.c",
+        "upstream-freebsd/lib/msun/src/s_scalbn.c",
+        "upstream-freebsd/lib/msun/src/s_scalbnf.c",
+        "upstream-freebsd/lib/msun/src/s_signgam.c",
+        "upstream-freebsd/lib/msun/src/s_significand.c",
+        "upstream-freebsd/lib/msun/src/s_significandf.c",
+        "upstream-freebsd/lib/msun/src/s_sin.c",
+        "upstream-freebsd/lib/msun/src/s_sinf.c",
+        "upstream-freebsd/lib/msun/src/s_tan.c",
+        "upstream-freebsd/lib/msun/src/s_tanf.c",
+        "upstream-freebsd/lib/msun/src/s_tanh.c",
+        "upstream-freebsd/lib/msun/src/s_tanhf.c",
+        "upstream-freebsd/lib/msun/src/s_tgammaf.c",
+        "upstream-freebsd/lib/msun/src/s_trunc.c",
+        "upstream-freebsd/lib/msun/src/s_truncf.c",
+        "upstream-freebsd/lib/msun/src/w_cabs.c",
+        "upstream-freebsd/lib/msun/src/w_cabsf.c",
+        "upstream-freebsd/lib/msun/src/w_cabsl.c",
+        "upstream-freebsd/lib/msun/src/w_drem.c",
+        "upstream-freebsd/lib/msun/src/w_dremf.c",
+
+        // The FreeBSD complex functions appear to be better, but they're incomplete.
+        // We take the FreeBSD implementations when they exist, but fill out the rest
+        // of <complex.h> from NetBSD...
+        "upstream-netbsd/lib/libm/complex/cacoshl.c",
+        "upstream-netbsd/lib/libm/complex/cacosl.c",
+        "upstream-netbsd/lib/libm/complex/casinhl.c",
+        "upstream-netbsd/lib/libm/complex/casinl.c",
+        "upstream-netbsd/lib/libm/complex/catanhl.c",
+        "upstream-netbsd/lib/libm/complex/catanl.c",
+        "upstream-netbsd/lib/libm/complex/ccoshl.c",
+        "upstream-netbsd/lib/libm/complex/ccosl.c",
+        "upstream-netbsd/lib/libm/complex/cephes_subrl.c",
+        "upstream-netbsd/lib/libm/complex/cexpl.c",
+        "upstream-netbsd/lib/libm/complex/clog.c",
+        "upstream-netbsd/lib/libm/complex/clogf.c",
+        "upstream-netbsd/lib/libm/complex/clogl.c",
+        "upstream-netbsd/lib/libm/complex/cpow.c",
+        "upstream-netbsd/lib/libm/complex/cpowf.c",
+        "upstream-netbsd/lib/libm/complex/cpowl.c",
+        "upstream-netbsd/lib/libm/complex/csinhl.c",
+        "upstream-netbsd/lib/libm/complex/csinl.c",
+        "upstream-netbsd/lib/libm/complex/ctanhl.c",
+        "upstream-netbsd/lib/libm/complex/ctanl.c",
+
+        // TODO: this comes from from upstream's libc, not libm, but it's an
+        // implementation detail that should have hidden visibility, so it needs
+        // to be in whatever library the math code is in.
+        "digittoint.c",
+
+        // Functionality not in the BSDs.
+        "significandl.c",
+        "sincos.c",
+
+        // Modified versions of BSD code.
+        "signbit.c",
+
+        // Home-grown stuff.
+        "fabs.cpp",
+    ],
+
+    multilib: {
+        lib32: {
+            srcs: ["fake_long_double.c"],
+        },
+
+        lib64: {
+            srcs: [
+                "upstream-freebsd/lib/msun/src/e_acosl.c",
+                "upstream-freebsd/lib/msun/src/e_acoshl.c",
+                "upstream-freebsd/lib/msun/src/e_asinl.c",
+                "upstream-freebsd/lib/msun/src/e_atan2l.c",
+                "upstream-freebsd/lib/msun/src/e_atanhl.c",
+                "upstream-freebsd/lib/msun/src/e_fmodl.c",
+                "upstream-freebsd/lib/msun/src/e_hypotl.c",
+                "upstream-freebsd/lib/msun/src/e_lgammal.c",
+                "upstream-freebsd/lib/msun/src/e_remainderl.c",
+                "upstream-freebsd/lib/msun/src/e_sqrtl.c",
+                "upstream-freebsd/lib/msun/src/s_asinhl.c",
+                "upstream-freebsd/lib/msun/src/s_atanl.c",
+                "upstream-freebsd/lib/msun/src/s_cbrtl.c",
+                "upstream-freebsd/lib/msun/src/s_ceill.c",
+                "upstream-freebsd/lib/msun/src/s_copysignl.c",
+                "upstream-freebsd/lib/msun/src/e_coshl.c",
+                "upstream-freebsd/lib/msun/src/s_cosl.c",
+                "upstream-freebsd/lib/msun/src/s_floorl.c",
+                "upstream-freebsd/lib/msun/src/s_fmal.c",
+                "upstream-freebsd/lib/msun/src/s_fmaxl.c",
+                "upstream-freebsd/lib/msun/src/s_fminl.c",
+                "upstream-freebsd/lib/msun/src/s_modfl.c",
+                "upstream-freebsd/lib/msun/src/s_frexpl.c",
+                "upstream-freebsd/lib/msun/src/s_ilogbl.c",
+                "upstream-freebsd/lib/msun/src/s_llrintl.c",
+                "upstream-freebsd/lib/msun/src/s_llroundl.c",
+                "upstream-freebsd/lib/msun/src/s_logbl.c",
+                "upstream-freebsd/lib/msun/src/s_lrintl.c",
+                "upstream-freebsd/lib/msun/src/s_lroundl.c",
+                "upstream-freebsd/lib/msun/src/s_nextafterl.c",
+                "upstream-freebsd/lib/msun/src/s_nexttoward.c",
+                "upstream-freebsd/lib/msun/src/s_nexttowardf.c",
+                "upstream-freebsd/lib/msun/src/s_remquol.c",
+                "upstream-freebsd/lib/msun/src/s_rintl.c",
+                "upstream-freebsd/lib/msun/src/s_roundl.c",
+                "upstream-freebsd/lib/msun/src/s_scalbnl.c",
+                "upstream-freebsd/lib/msun/src/e_sinhl.c",
+                "upstream-freebsd/lib/msun/src/s_sinl.c",
+                "upstream-freebsd/lib/msun/src/s_tanhl.c",
+                "upstream-freebsd/lib/msun/src/s_tanl.c",
+                "upstream-freebsd/lib/msun/src/s_truncl.c",
+
+                "upstream-freebsd/lib/msun/ld128/invtrig.c",
+                "upstream-freebsd/lib/msun/ld128/e_lgammal_r.c",
+                "upstream-freebsd/lib/msun/ld128/k_cosl.c",
+                "upstream-freebsd/lib/msun/ld128/k_sinl.c",
+                "upstream-freebsd/lib/msun/ld128/k_tanl.c",
+                "upstream-freebsd/lib/msun/ld128/s_erfl.c",
+                "upstream-freebsd/lib/msun/ld128/s_exp2l.c",
+                "upstream-freebsd/lib/msun/ld128/s_expl.c",
+                "upstream-freebsd/lib/msun/ld128/s_logl.c",
+                "upstream-freebsd/lib/msun/ld128/s_nanl.c",
+            ],
+            local_include_dirs: ["upstream-freebsd/lib/msun/ld128/"],
+        },
+    },
+
+    // arch-specific settings
+    arch: {
+        arm: {
+            srcs: [
+                "arm/fenv.c",
+            ],
+            armv7_a_neon: {
+                srcs: [
+                    "arm/sqrt.S",
+                    "arm/floor.S",
+                ],
+
+                exclude_srcs: [
+                    "upstream-freebsd/lib/msun/src/e_sqrt.c",
+                    "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+                    "upstream-freebsd/lib/msun/src/s_floor.c",
+                ],
+            },
+            instruction_set: "arm",
+            ldflags: ["-Wl,--hash-style=both"],
+            version_script: "libm.arm.map",
+        },
+
+        arm64: {
+            srcs: [
+                "arm64/ceil.S",
+                "arm64/fenv.c",
+                "arm64/fma.S",
+                "arm64/floor.S",
+                "arm64/lrint.S",
+                "arm64/rint.S",
+                "arm64/sqrt.S",
+                "arm64/trunc.S",
+            ],
+            exclude_srcs: [
+                "upstream-freebsd/lib/msun/src/e_sqrt.c",
+                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+                "upstream-freebsd/lib/msun/src/s_ceil.c",
+                "upstream-freebsd/lib/msun/src/s_ceilf.c",
+                "upstream-freebsd/lib/msun/src/s_fma.c",
+                "upstream-freebsd/lib/msun/src/s_fmaf.c",
+                "upstream-freebsd/lib/msun/src/s_floor.c",
+                "upstream-freebsd/lib/msun/src/s_floorf.c",
+                "upstream-freebsd/lib/msun/src/s_llrint.c",
+                "upstream-freebsd/lib/msun/src/s_llrintf.c",
+                "upstream-freebsd/lib/msun/src/s_lrint.c",
+                "upstream-freebsd/lib/msun/src/s_lrintf.c",
+                "upstream-freebsd/lib/msun/src/s_rint.c",
+                "upstream-freebsd/lib/msun/src/s_rintf.c",
+                "upstream-freebsd/lib/msun/src/s_trunc.c",
+                "upstream-freebsd/lib/msun/src/s_truncf.c",
+            ],
+            version_script: "libm.arm64.map",
+        },
+
+        mips: {
+            srcs: ["mips/fenv.c"],
+            version_script: "libm.mips.map",
+        },
+
+        mips64: {
+            srcs: ["mips/fenv.c"],
+            version_script: "libm.mips64.map",
+        },
+
+        x86: {
+            srcs: [
+                "i387/fenv.c",
+                "x86/sqrt.S",
+                "x86/sqrtf.S",
+                "x86/e_acos.S",
+                "x86/e_asin.S",
+                "x86/e_atan2.S",
+                "x86/e_cosh.S",
+                "x86/e_exp.S",
+                "x86/e_hypot.S",
+                "x86/e_log10.S",
+                "x86/e_log.S",
+                "x86/e_pow.S",
+                "x86/e_sinh.S",
+                "x86/libm_reduce_pi04l.S",
+                "x86/libm_sincos_huge.S",
+                "x86/libm_tancot_huge.S",
+                "x86/lrint.S",
+                "x86/lrintf.S",
+                "x86/s_atan.S",
+                "x86/s_cbrt.S",
+                "x86/s_cos.S",
+                "x86/s_expm1.S",
+                "x86/s_log1p.S",
+                "x86/s_sin.S",
+                "x86/s_tanh.S",
+                "x86/s_tan.S",
+            ],
+            exclude_srcs: [
+                "upstream-freebsd/lib/msun/src/e_acos.c",
+                "upstream-freebsd/lib/msun/src/e_asin.c",
+                "upstream-freebsd/lib/msun/src/e_atan2.c",
+                "upstream-freebsd/lib/msun/src/e_cosh.c",
+                "upstream-freebsd/lib/msun/src/e_exp.c",
+                "upstream-freebsd/lib/msun/src/e_hypot.c",
+                "upstream-freebsd/lib/msun/src/e_log.c",
+                "upstream-freebsd/lib/msun/src/e_log10.c",
+                "upstream-freebsd/lib/msun/src/e_pow.c",
+                "upstream-freebsd/lib/msun/src/e_sinh.c",
+                "upstream-freebsd/lib/msun/src/e_sqrt.c",
+                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+                "upstream-freebsd/lib/msun/src/s_atan.c",
+                "upstream-freebsd/lib/msun/src/s_cbrt.c",
+                "upstream-freebsd/lib/msun/src/s_cos.c",
+                "upstream-freebsd/lib/msun/src/s_expm1.c",
+                "upstream-freebsd/lib/msun/src/s_log1p.c",
+                "upstream-freebsd/lib/msun/src/s_lrint.c",
+                "upstream-freebsd/lib/msun/src/s_lrintf.c",
+                "upstream-freebsd/lib/msun/src/s_sin.c",
+                "upstream-freebsd/lib/msun/src/s_tan.c",
+                "upstream-freebsd/lib/msun/src/s_tanh.c",
+            ],
+            sse4_1: {
+                srcs: [
+                    "x86/ceil.S",
+                    "x86/ceilf.S",
+                    "x86/floor.S",
+                    "x86/floorf.S",
+                    "x86/rint.S",
+                    "x86/rintf.S",
+                    "x86/trunc.S",
+                    "x86/truncf.S",
+                ],
+                exclude_srcs: [
+                    "upstream-freebsd/lib/msun/src/s_ceil.c",
+                    "upstream-freebsd/lib/msun/src/s_ceilf.c",
+                    "upstream-freebsd/lib/msun/src/s_floor.c",
+                    "upstream-freebsd/lib/msun/src/s_floorf.c",
+                    "upstream-freebsd/lib/msun/src/s_rint.c",
+                    "upstream-freebsd/lib/msun/src/s_rintf.c",
+                    "upstream-freebsd/lib/msun/src/s_trunc.c",
+                    "upstream-freebsd/lib/msun/src/s_truncf.c",
+                ],
+            },
+            local_include_dirs: ["i387"],
+            ldflags: ["-Wl,--hash-style=both"],
+            version_script: "libm.x86.map",
+        },
+
+        x86_64: {
+            srcs: [
+                "amd64/fenv.c",
+                "x86_64/sqrt.S",
+                "x86_64/sqrtf.S",
+                "x86_64/e_acos.S",
+                "x86_64/e_asin.S",
+                "x86_64/e_atan2.S",
+                "x86_64/e_cosh.S",
+                "x86_64/e_exp.S",
+                "x86_64/e_hypot.S",
+                "x86_64/e_log10.S",
+                "x86_64/e_log.S",
+                "x86_64/e_pow.S",
+                "x86_64/e_sinh.S",
+                "x86_64/lrint.S",
+                "x86_64/lrintf.S",
+                "x86_64/s_atan.S",
+                "x86_64/s_cbrt.S",
+                "x86_64/s_cos.S",
+                "x86_64/s_expm1.S",
+                "x86_64/s_log1p.S",
+                "x86_64/s_sin.S",
+                "x86_64/s_tanh.S",
+                "x86_64/s_tan.S",
+            ],
+            exclude_srcs: [
+                "upstream-freebsd/lib/msun/src/e_acos.c",
+                "upstream-freebsd/lib/msun/src/e_asin.c",
+                "upstream-freebsd/lib/msun/src/e_atan2.c",
+                "upstream-freebsd/lib/msun/src/e_cosh.c",
+                "upstream-freebsd/lib/msun/src/e_exp.c",
+                "upstream-freebsd/lib/msun/src/e_hypot.c",
+                "upstream-freebsd/lib/msun/src/e_log.c",
+                "upstream-freebsd/lib/msun/src/e_log10.c",
+                "upstream-freebsd/lib/msun/src/e_pow.c",
+                "upstream-freebsd/lib/msun/src/e_sinh.c",
+                "upstream-freebsd/lib/msun/src/e_sqrt.c",
+                "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+                "upstream-freebsd/lib/msun/src/s_atan.c",
+                "upstream-freebsd/lib/msun/src/s_cbrt.c",
+                "upstream-freebsd/lib/msun/src/s_cos.c",
+                "upstream-freebsd/lib/msun/src/s_expm1.c",
+                "upstream-freebsd/lib/msun/src/s_log1p.c",
+                "upstream-freebsd/lib/msun/src/s_llrint.c",
+                "upstream-freebsd/lib/msun/src/s_llrintf.c",
+                "upstream-freebsd/lib/msun/src/s_lrint.c",
+                "upstream-freebsd/lib/msun/src/s_lrintf.c",
+                "upstream-freebsd/lib/msun/src/s_sin.c",
+                "upstream-freebsd/lib/msun/src/s_tan.c",
+                "upstream-freebsd/lib/msun/src/s_tanh.c",
+            ],
+            sse4_1: {
+                srcs: [
+                    "x86_64/ceil.S",
+                    "x86_64/ceilf.S",
+                    "x86_64/floor.S",
+                    "x86_64/floorf.S",
+                    "x86_64/rint.S",
+                    "x86_64/rintf.S",
+                    "x86_64/trunc.S",
+                    "x86_64/truncf.S",
+                ],
+                exclude_srcs: [
+                    "upstream-freebsd/lib/msun/src/s_ceil.c",
+                    "upstream-freebsd/lib/msun/src/s_ceilf.c",
+                    "upstream-freebsd/lib/msun/src/s_floor.c",
+                    "upstream-freebsd/lib/msun/src/s_floorf.c",
+                    "upstream-freebsd/lib/msun/src/s_rint.c",
+                    "upstream-freebsd/lib/msun/src/s_rintf.c",
+                    "upstream-freebsd/lib/msun/src/s_trunc.c",
+                    "upstream-freebsd/lib/msun/src/s_truncf.c",
+                ],
+            },
+            version_script: "libm.x86_64.map",
+        },
+    },
+
+    local_include_dirs: [
+        "upstream-freebsd/android/include/",
+        "upstream-freebsd/lib/msun/src/",
+    ],
+
+    cflags: [
+        "-D__BIONIC_NO_MATH_INLINES",
+        "-D_BSD_SOURCE",
+        "-DFLT_EVAL_METHOD=0",
+        "-include freebsd-compat.h",
+        "-Werror",
+        "-Wno-missing-braces",
+        "-Wno-parentheses",
+        "-Wno-sign-compare",
+        "-Wno-uninitialized",
+        "-Wno-unknown-pragmas",
+    ],
+    conlyflags: ["-std=gnu11"],
+
+    include_dirs: ["bionic/libc"],
+    system_shared_libs: ["libc"],
+
+    native_coverage: bionic_coverage,
+    sanitize: {
+        never: true,
+    },
+    stl: "none",
+}
diff --git a/libm/MODULE_LICENSE_BSD_LIKE b/libm/MODULE_LICENSE_BSD_LIKE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libm/MODULE_LICENSE_BSD_LIKE
diff --git a/libm/NOTICE b/libm/NOTICE
new file mode 100644
index 0000000..085c210
--- /dev/null
+++ b/libm/NOTICE
@@ -0,0 +1,1062 @@
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+====================================================
+
+Optimized by Bruce D. Evans.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+====================================================
+
+Optimized by Bruce D. Evans.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+====================================================
+
+Optimized by Bruce D. Evans.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+====================================================
+
+The argument reduction and testing for exceptional cases was
+written by Steven G. Kargl with input from Bruce D. Evans
+and David A. Schultz.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
+
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+====================================================
+Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+Copyright (C) 2010 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (C) 2013 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-------------------------------------------------------------------
+
+Copyright (C) 2014 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (C) 2015 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-------------------------------------------------------------------
+
+Copyright (c) 1985, 1993
+   The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+   This product includes software developed by the University of
+   California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 1988, 1993
+   The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+   This product includes software developed by the University of
+   California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 1992, 1993
+   The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement:
+   This product includes software developed by the University of
+   California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2003 Dag-Erling Smørgrav
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer
+   in this position and unchanged.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+Copyright (c) 2002 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2003, Steven G. Kargl
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2004 Stefan Farfeleder
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2004-2005 David Schultz <das (at) FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007 David Schultz
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+Derived from s_modf.c, which has the following Copyright:
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007 Steven G. Kargl
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code is derived from software written by Stephen L. Moshier.
+It is redistributed by the NetBSD Foundation by permission of the author.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007-2008 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2007-2013 Bruce D. Evans
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2009-2013 Steven G. Kargl
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Optimized by Bruce D. Evans.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2011 David Schultz
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice unmodified, this list of conditions, and the following
+   disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2012 Stephen Montgomery-Smith <stephen@FreeBSD.ORG>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2013 David Chisnall
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
+Johnny Qiu <joqiu@nvidia.com>
+Shu Zhang <chazhang@nvidia.com>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of The Linux Foundation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+From: @(#)s_ilogb.c 5.1 93/09/24
+====================================================
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+-------------------------------------------------------------------
+
diff --git a/libm/amd64/fenv.c b/libm/amd64/fenv.c
new file mode 100755
index 0000000..9edaf88
--- /dev/null
+++ b/libm/amd64/fenv.c
@@ -0,0 +1,424 @@
+/*  $OpenBSD: fenv.c,v 1.3 2012/12/05 23:20:02 deraadt Exp $  */
+/*  $NetBSD: fenv.c,v 1.1 2010/07/31 21:47:53 joerg Exp $ */
+
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das (at) FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <fenv.h>
+
+/*
+ * The i387 defaults to Intel extended precision mode and round to nearest,
+ * with all exceptions masked.
+ */
+#define	__INITIAL_NPXCW__	0x037f
+#define __INITIAL_MXCSR__ 	0x1f80
+#define __INITIAL_MXCSR_MASK__	0xffbf
+
+#define SSE_MASK_SHIFT 7
+
+/*
+ * The following symbol is simply the bitwise-inclusive OR of all floating-point
+ * rounding direction constants defined above.
+ */
+#define X87_ROUND_MASK  (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
+#define SSE_ROUND_SHIFT 3
+
+/*
+ * The following constant represents the default floating-point environment
+ * (that is, the one installed at program startup) and has type pointer to
+ * const-qualified fenv_t.
+ *
+ * It can be used as an argument to the functions within the <fenv.h> header
+ * that manage the floating-point environment, namely fesetenv() and
+ * feupdateenv().
+ *
+ * x87 fpu registers are 16bit wide. The upper bits, 31-16, are marked as
+ * RESERVED.
+ */
+const fenv_t __fe_dfl_env = {
+  {
+    0xffff0000 | __INITIAL_NPXCW__, /* Control word register */
+    0xffff0000,                     /* Status word register */
+    0xffffffff,                     /* Tag word register */
+    {
+      0x00000000,
+      0x00000000,
+      0x00000000,
+      0xffff0000
+    }
+  },
+  __INITIAL_MXCSR__                 /* MXCSR register */
+};
+
+
+/*
+ * The feclearexcept() function clears the supported floating-point exceptions
+ * represented by `excepts'.
+ */
+int
+feclearexcept(int excepts)
+{
+  fenv_t fenv;
+  unsigned int mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Store the current x87 floating-point environment */
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (fenv));
+
+  /* Clear the requested floating-point exceptions */
+  fenv.__x87.__status &= ~excepts;
+
+  /* Load the x87 floating-point environent */
+  __asm__ __volatile__ ("fldenv %0" : : "m" (fenv));
+
+  /* Same for SSE environment */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+  mxcsr &= ~excepts;
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (0);
+}
+
+/*
+ * The fegetexceptflag() function stores an implementation-defined
+ * representation of the states of the floating-point status flags indicated by
+ * the argument excepts in the object pointed to by the argument flagp.
+ */
+int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+  unsigned short status;
+  unsigned int mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Store the current x87 status register */
+  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));
+
+  /* Store the MXCSR register */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+
+  /* Store the results in flagp */
+  *flagp = (status | mxcsr) & excepts;
+
+  return (0);
+}
+
+/*
+ * The feraiseexcept() function raises the supported floating-point exceptions
+ * represented by the argument `excepts'.
+ *
+ * The standard explicitly allows us to execute an instruction that has the
+ * exception as a side effect, but we choose to manipulate the status register
+ * directly.
+ *
+ * The validation of input is being deferred to fesetexceptflag().
+ */
+int
+feraiseexcept(int excepts)
+{
+  excepts &= FE_ALL_EXCEPT;
+
+  fesetexceptflag((fexcept_t *)&excepts, excepts);
+  __asm__ __volatile__ ("fwait");
+
+  return (0);
+}
+
+/*
+ * This function sets the floating-point status flags indicated by the argument
+ * `excepts' to the states stored in the object pointed to by `flagp'. It does
+ * NOT raise any floating-point exceptions, but only sets the state of the flags.
+ */
+int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+  fenv_t fenv;
+  unsigned int mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Store the current x87 floating-point environment */
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (fenv));
+
+  /* Set the requested status flags */
+  fenv.__x87.__status &= ~excepts;
+  fenv.__x87.__status |= *flagp & excepts;
+
+  /* Load the x87 floating-point environent */
+  __asm__ __volatile__ ("fldenv %0" : : "m" (fenv));
+
+  /* Same for SSE environment */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+  mxcsr &= ~excepts;
+  mxcsr |= *flagp & excepts;
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (0);
+}
+
+/*
+ * The fetestexcept() function determines which of a specified subset of the
+ * floating-point exception flags are currently set. The `excepts' argument
+ * specifies the floating-point status flags to be queried.
+ */
+int
+fetestexcept(int excepts)
+{
+  unsigned short status;
+  unsigned int mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Store the current x87 status register */
+  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));
+
+  /* Store the MXCSR register state */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+
+  return ((status | mxcsr) & excepts);
+}
+
+/*
+ * The fegetround() function gets the current rounding direction.
+ */
+int
+fegetround(void)
+{
+  unsigned short control;
+
+  /*
+   * We assume that the x87 and the SSE unit agree on the
+   * rounding mode.  Reading the control word on the x87 turns
+   * out to be about 5 times faster than reading it on the SSE
+   * unit on an Opteron 244.
+   */
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
+
+  return (control & X87_ROUND_MASK);
+}
+
+/*
+ * The fesetround() function establishes the rounding direction represented by
+ * its argument `round'. If the argument is not equal to the value of a rounding
+ * direction macro, the rounding direction is not changed.
+ */
+int
+fesetround(int round)
+{
+  unsigned short control;
+  unsigned int mxcsr;
+
+  /* Check whether requested rounding direction is supported */
+  if (round & ~X87_ROUND_MASK)
+    return (-1);
+
+  /* Store the current x87 control word register */
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
+
+  /* Set the rounding direction */
+  control &= ~X87_ROUND_MASK;
+  control |= round;
+
+  /* Load the x87 control word register */
+  __asm__ __volatile__ ("fldcw %0" : : "m" (control));
+
+  /* Same for the SSE environment */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+  mxcsr &= ~(X87_ROUND_MASK << SSE_ROUND_SHIFT);
+  mxcsr |= round << SSE_ROUND_SHIFT;
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (0);
+}
+
+/*
+ * The fegetenv() function attempts to store the current floating-point
+ * environment in the object pointed to by envp.
+ */
+int
+fegetenv(fenv_t *envp)
+{
+  /* Store the current x87 floating-point environment */
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (*envp));
+
+  /* Store the MXCSR register state */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (envp->__mxcsr));
+
+  /*
+   * When an FNSTENV instruction is executed, all pending exceptions are
+   * essentially lost (either the x87 FPU status register is cleared or
+   * all exceptions are masked).
+   *
+   * 8.6 X87 FPU EXCEPTION SYNCHRONIZATION -
+   * Intel(R) 64 and IA-32 Architectures Softare Developer's Manual - Vol1
+   */
+  __asm__ __volatile__ ("fldcw %0" : : "m" (envp->__x87.__control));
+
+  return (0);
+}
+
+/*
+ * The feholdexcept() function saves the current floating-point environment
+ * in the object pointed to by envp, clears the floating-point status flags, and
+ * then installs a non-stop (continue on floating-point exceptions) mode, if
+ * available, for all floating-point exceptions.
+ */
+int
+feholdexcept(fenv_t *envp)
+{
+  unsigned int mxcsr;
+
+  /* Store the current x87 floating-point environment */
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (*envp));
+
+  /* Clear all exception flags in FPU */
+  __asm__ __volatile__ ("fnclex");
+
+  /* Store the MXCSR register state */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (envp->__mxcsr));
+
+  /* Clear exception flags in MXCSR */
+  mxcsr = envp->__mxcsr;
+  mxcsr &= ~FE_ALL_EXCEPT;
+
+  /* Mask all exceptions */
+  mxcsr |= FE_ALL_EXCEPT << SSE_MASK_SHIFT;
+
+  /* Store the MXCSR register */
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (0);
+}
+
+/*
+ * The fesetenv() function attempts to establish the floating-point environment
+ * represented by the object pointed to by envp. The argument `envp' points
+ * to an object set by a call to fegetenv() or feholdexcept(), or equal a
+ * floating-point environment macro. The fesetenv() function does not raise
+ * floating-point exceptions, but only installs the state of the floating-point
+ * status flags represented through its argument.
+ */
+int
+fesetenv(const fenv_t *envp)
+{
+  /* Load the x87 floating-point environent */
+  __asm__ __volatile__ ("fldenv %0" : : "m" (*envp));
+
+  /* Store the MXCSR register */
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (envp->__mxcsr));
+
+  return (0);
+}
+
+/*
+ * The feupdateenv() function saves the currently raised floating-point
+ * exceptions in its automatic storage, installs the floating-point environment
+ * represented by the object pointed to by `envp', and then raises the saved
+ * floating-point exceptions. The argument `envp' shall point to an object set
+ * by a call to feholdexcept() or fegetenv(), or equal a floating-point
+ * environment macro.
+ */
+int
+feupdateenv(const fenv_t *envp)
+{
+  unsigned short status;
+  unsigned int mxcsr;
+
+  /* Store the x87 status register */
+  __asm__ __volatile__ ("fnstsw %0" : "=am" (status));
+
+  /* Store the MXCSR register */
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+
+  /* Install new floating-point environment */
+  fesetenv(envp);
+
+  /* Raise any previously accumulated exceptions */
+  feraiseexcept(status | mxcsr);
+
+  return (0);
+}
+
+/*
+ * The following functions are extentions to the standard
+ */
+int
+feenableexcept(int mask)
+{
+  unsigned int mxcsr, omask;
+  unsigned short control;
+
+  mask &= FE_ALL_EXCEPT;
+
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+
+  omask = ~(control | (mxcsr >> SSE_MASK_SHIFT)) & FE_ALL_EXCEPT;
+  control &= ~mask;
+  __asm__ __volatile__ ("fldcw %0" : : "m" (control));
+
+  mxcsr &= ~(mask << SSE_MASK_SHIFT);
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (omask);
+}
+
+int
+fedisableexcept(int mask)
+{
+  unsigned int mxcsr, omask;
+  unsigned short control;
+
+  mask &= FE_ALL_EXCEPT;
+
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (mxcsr));
+
+  omask = ~(control | (mxcsr >> SSE_MASK_SHIFT)) & FE_ALL_EXCEPT;
+  control |= mask;
+  __asm__ __volatile__ ("fldcw %0" : : "m" (control));
+
+  mxcsr |= mask << SSE_MASK_SHIFT;
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (mxcsr));
+
+  return (omask);
+}
+
+int
+fegetexcept(void)
+{
+  unsigned short control;
+
+  /*
+   * We assume that the masks for the x87 and the SSE unit are
+   * the same.
+   */
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (control));
+
+  return (~control & FE_ALL_EXCEPT);
+}
diff --git a/libm/arm/fenv.c b/libm/arm/fenv.c
new file mode 100644
index 0000000..2124730
--- /dev/null
+++ b/libm/arm/fenv.c
@@ -0,0 +1,139 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/msun/arm/fenv.c,v 1.1 2004/06/06 10:03:59 das Exp $
+ */
+
+#include <fenv.h>
+
+#define FPSCR_ENABLE_SHIFT 8
+#define FPSCR_ENABLE_MASK  (FE_ALL_EXCEPT << FPSCR_ENABLE_SHIFT)
+
+#define FPSCR_RMODE_SHIFT 22
+
+const fenv_t __fe_dfl_env = 0;
+
+int fegetenv(fenv_t* __envp) {
+  fenv_t _fpscr;
+  __asm__ __volatile__("vmrs %0,fpscr" : "=r" (_fpscr));
+  *__envp = _fpscr;
+  return 0;
+}
+
+int fesetenv(const fenv_t* __envp) {
+  fenv_t _fpscr = *__envp;
+  __asm__ __volatile__("vmsr fpscr,%0" : :"ri" (_fpscr));
+  return 0;
+}
+
+int feclearexcept(int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  __fpscr &= ~__excepts;
+  fesetenv(&__fpscr);
+  return 0;
+}
+
+int fegetexceptflag(fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  *__flagp = __fpscr & __excepts;
+  return 0;
+}
+
+int fesetexceptflag(const fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  __fpscr &= ~__excepts;
+  __fpscr |= *__flagp & __excepts;
+  fesetenv(&__fpscr);
+  return 0;
+}
+
+int feraiseexcept(int __excepts) {
+  fexcept_t __ex = __excepts;
+  fesetexceptflag(&__ex, __excepts);
+  return 0;
+}
+
+int fetestexcept(int __excepts) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  return (__fpscr & __excepts);
+}
+
+int fegetround(void) {
+  fenv_t _fpscr;
+  fegetenv(&_fpscr);
+  return ((_fpscr >> FPSCR_RMODE_SHIFT) & 0x3);
+}
+
+int fesetround(int __round) {
+  fenv_t _fpscr;
+  fegetenv(&_fpscr);
+  _fpscr &= ~(0x3 << FPSCR_RMODE_SHIFT);
+  _fpscr |= (__round << FPSCR_RMODE_SHIFT);
+  fesetenv(&_fpscr);
+  return 0;
+}
+
+int feholdexcept(fenv_t* __envp) {
+  fenv_t __env;
+  fegetenv(&__env);
+  *__envp = __env;
+  __env &= ~(FE_ALL_EXCEPT | FPSCR_ENABLE_MASK);
+  fesetenv(&__env);
+  return 0;
+}
+
+int feupdateenv(const fenv_t* __envp) {
+  fexcept_t __fpscr;
+  fegetenv(&__fpscr);
+  fesetenv(__envp);
+  feraiseexcept(__fpscr & FE_ALL_EXCEPT);
+  return 0;
+}
+
+int feenableexcept(int __mask) {
+  fenv_t __old_fpscr, __new_fpscr;
+  fegetenv(&__old_fpscr);
+  __new_fpscr = __old_fpscr | (__mask & FE_ALL_EXCEPT) << FPSCR_ENABLE_SHIFT;
+  fesetenv(&__new_fpscr);
+  return ((__old_fpscr >> FPSCR_ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fedisableexcept(int __mask) {
+  fenv_t __old_fpscr, __new_fpscr;
+  fegetenv(&__old_fpscr);
+  __new_fpscr = __old_fpscr & ~((__mask & FE_ALL_EXCEPT) << FPSCR_ENABLE_SHIFT);
+  fesetenv(&__new_fpscr);
+  return ((__old_fpscr >> FPSCR_ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fegetexcept(void) {
+  fenv_t __fpscr;
+  fegetenv(&__fpscr);
+  return ((__fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT);
+}
diff --git a/libm/arm/floor.S b/libm/arm/floor.S
new file mode 100644
index 0000000..3af8f76
--- /dev/null
+++ b/libm/arm/floor.S
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
+ * Johnny Qiu <joqiu@nvidia.com>
+ * Shu Zhang <chazhang@nvidia.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <float.h>
+#include <private/bionic_asm.h>
+
+ENTRY(floor)    /* x in r0, r1 */
+
+        and             r3, r1, #0x80000000     /* sign(x) */
+        bic             r1, r1, #0x80000000     /* x = abs(x) */
+
+        /* extract exp of x */
+        lsr             r2, r1, #20
+        sub             r2, r2, #0x3fc
+        subs            r2, r2, #0x3            /* r2 <- exp */
+
+        /* |x| < 1.0? */
+        blt             .Lx_lt_one
+
+        /* x < 0? */
+        cmp             r3, #0
+        bne             .Lclr_frac_neg
+
+        /* |x| <= 2^20? */
+        cmp             r2, #20
+        ble             .Lclr_frac_r1
+
+        /* |x| < 2^52? */
+        cmp             r2, #52
+        blt             .Lclr_frac_r0
+
+        /* return x */
+        bx              lr
+
+.Lclr_frac_r1:
+        rsb             r2, r2, #20
+        lsr             r1, r1, r2
+        lsl             r1, r1, r2
+        mov             r0, #0
+        bx              lr
+
+.Lclr_frac_r0:
+        rsb             r2, r2, #52
+        lsr             r0, r0, r2
+        lsl             r0, r0, r2
+        bx              lr
+
+.Lclr_frac_neg:
+        /* |x| <= 2^20? */
+        cmp             r2, #20
+        ble             .Lclr_frac_r1_neg
+
+        /* |x| < 2^52? */
+        cmp             r2, #52
+        blt             .Lclr_frac_r0_neg
+
+        /* return x */
+        orr             r1, r1, #0x80000000
+        bx              lr
+
+.Lclr_frac_r1_neg:
+        rsb             r2, r2, #20
+        mov             r3, #1
+        lsl             r3, r3, r2
+        sub             r3, r3, #1
+        and             r3, r1, r3
+        orr             r3, r3, r0
+        lsr             r1, r1, r2
+        lsl             r1, r1, r2
+        mov             r0, #0
+        b               .Lreturn_x_neg
+
+.Lclr_frac_r0_neg:
+        rsb             r2, r2, #52
+        mov             r3, #1
+        lsl             r3, r3, r2
+        sub             r3, r3, #1
+        and             r3, r0, r3
+        lsr             r0, r0, r2
+        lsl             r0, r0, r2
+        b               .Lreturn_x_neg
+
+.Lx_lt_one:
+        /* x == +-0? */
+        cmp             r0, #0
+        cmpeq           r1, #0
+        orreq           r1, r1, r3
+        bxeq            lr
+
+        /* (x > 0) ? 0 : -1 */
+        mov             r1, #0x00100000
+        mov             r0, #0
+        cmp             r3, #0
+        movne           r1, #0xc0000000
+        sub             r1, r1, #0x00100000
+        bx              lr
+
+.Lreturn_x_neg:
+        cmp             r3, #0
+        orr             r1, r1, #0x80000000
+        bxeq            lr
+
+        vmov            d16, r0, r1
+        vmov.f64        d18, #1.0
+        vsub.f64        d16, d16, d18
+        vmov            r0, r1, d16
+        bx              lr
+
+END(floor)
+
+ALIAS_SYMBOL(floorl, floor);
diff --git a/libm/arm/sqrt.S b/libm/arm/sqrt.S
new file mode 100644
index 0000000..f2981f4
--- /dev/null
+++ b/libm/arm/sqrt.S
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA Corporation.  All rights reserved.
+ * Johnny Qiu <joqiu@nvidia.com>
+ * Shu Zhang <chazhang@nvidia.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <float.h>
+#include <private/bionic_asm.h>
+
+ENTRY(sqrt)
+    vmov.f64    d0, r0, r1
+    vsqrt.f64   d0, d0
+    vmov.f64    r0, r1, d0
+    bx          lr
+END(sqrt)
+
+ENTRY(sqrtf)
+    vmov.f32    s0, r0
+    vsqrt.f32   s0, s0
+    vmov.f32    r0, s0
+    bx          lr
+END(sqrtf)
+
+ALIAS_SYMBOL(sqrtl, sqrt);
diff --git a/libm/arm64/ceil.S b/libm/arm64/ceil.S
new file mode 100644
index 0000000..7217d57
--- /dev/null
+++ b/libm/arm64/ceil.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(ceil)
+  frintP d0, d0
+  ret
+END(ceil)
+
+ENTRY(ceilf)
+  frintP s0, s0
+  ret
+END(ceilf)
diff --git a/libm/arm64/fenv.c b/libm/arm64/fenv.c
new file mode 100644
index 0000000..19a2393
--- /dev/null
+++ b/libm/arm64/fenv.c
@@ -0,0 +1,206 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: libm/aarch64/fenv.c $
+ */
+
+#include <stdint.h>
+#include <fenv.h>
+
+#define FPCR_EXCEPT_SHIFT 8
+#define FPCR_EXCEPT_MASK  (FE_ALL_EXCEPT << FPCR_EXCEPT_SHIFT)
+
+#define FPCR_RMODE_SHIFT 22
+
+const fenv_t __fe_dfl_env = { 0 /* control */, 0 /* status */};
+
+typedef __uint32_t fpu_control_t;   // FPCR, Floating-point Control Register.
+typedef __uint32_t fpu_status_t;    // FPSR, Floating-point Status Register.
+
+#define __get(REGISTER, __value) { \
+  uint64_t __value64; \
+  __asm__ __volatile__("mrs %0," REGISTER : "=r" (__value64)); \
+  __value = (__uint32_t) __value64; \
+}
+#define __get_fpcr(__fpcr) __get("fpcr", __fpcr)
+#define __get_fpsr(__fpsr) __get("fpsr", __fpsr)
+
+#define __set(REGISTER, __value) { \
+  uint64_t __value64 = __value; \
+  __asm__ __volatile__("msr " REGISTER ",%0" : : "ri" (__value64)); \
+}
+#define __set_fpcr(__fpcr) __set("fpcr", __fpcr)
+#define __set_fpsr(__fpsr) __set("fpsr", __fpsr)
+
+int fegetenv(fenv_t* envp) {
+  __get_fpcr(envp->__control);
+  __get_fpsr(envp->__status);
+  return 0;
+}
+
+int fesetenv(const fenv_t* envp) {
+  fpu_control_t fpcr;
+
+  __get_fpcr(fpcr);
+  if (envp->__control != fpcr) {
+    __set_fpcr(envp->__control);
+  }
+  __set_fpsr(envp->__status);
+  return 0;
+}
+
+int feclearexcept(int excepts) {
+  fpu_status_t fpsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  __get_fpsr(fpsr);
+  fpsr &= ~excepts;
+  __set_fpsr(fpsr);
+  return 0;
+}
+
+int fegetexceptflag(fexcept_t* flagp, int excepts) {
+  fpu_status_t fpsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  __get_fpsr(fpsr);
+  *flagp = fpsr & excepts;
+  return 0;
+}
+
+int fesetexceptflag(const fexcept_t* flagp, int excepts) {
+  fpu_status_t fpsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  __get_fpsr(fpsr);
+  fpsr &= ~excepts;
+  fpsr |= *flagp & excepts;
+  __set_fpsr(fpsr);
+  return 0;
+}
+
+int feraiseexcept(int excepts) {
+  fexcept_t ex = excepts;
+
+  fesetexceptflag(&ex, excepts);
+  return 0;
+}
+
+int fetestexcept(int excepts) {
+  fpu_status_t fpsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  __get_fpsr(fpsr);
+  return (fpsr & excepts);
+}
+
+int fegetround(void) {
+  fpu_control_t fpcr;
+
+  __get_fpcr(fpcr);
+  return ((fpcr >> FPCR_RMODE_SHIFT) & FE_TOWARDZERO);
+}
+
+int fesetround(int round) {
+  fpu_control_t fpcr, new_fpcr;
+
+  round &= FE_TOWARDZERO;
+  __get_fpcr(fpcr);
+  new_fpcr = fpcr & ~(FE_TOWARDZERO << FPCR_RMODE_SHIFT);
+  new_fpcr |= (round << FPCR_RMODE_SHIFT);
+  if (new_fpcr != fpcr) {
+    __set_fpcr(new_fpcr);
+  }
+  return 0;
+}
+
+int feholdexcept(fenv_t* envp) {
+  fenv_t env;
+  fpu_status_t fpsr;
+  fpu_control_t fpcr, new_fpcr;
+
+  __get_fpsr(fpsr);
+  __get_fpcr(fpcr);
+  env.__status = fpsr;
+  env.__control = fpcr;
+  *envp = env;
+
+  // Set exceptions to untrapped.
+  new_fpcr = fpcr & ~(FE_ALL_EXCEPT << FPCR_EXCEPT_SHIFT);
+  if (new_fpcr != fpcr) {
+    __set_fpcr(new_fpcr);
+  }
+
+  // Clear all exceptions.
+  fpsr &= ~FE_ALL_EXCEPT;
+  __set_fpsr(fpsr);
+  return 0;
+}
+
+int feupdateenv(const fenv_t* envp) {
+  fpu_status_t fpsr;
+  fpu_control_t fpcr;
+
+  // Set FPU Control register.
+  __get_fpcr(fpcr);
+  if (envp->__control != fpcr) {
+    __set_fpcr(envp->__control);
+  }
+
+  // Set FPU Status register to status | currently raised exceptions.
+  __get_fpsr(fpsr);
+  fpsr = envp->__status | (fpsr & FE_ALL_EXCEPT);
+  __set_fpsr(fpsr);
+  return 0;
+}
+
+int feenableexcept(int mask) {
+  fpu_control_t old_fpcr, new_fpcr;
+
+  __get_fpcr(old_fpcr);
+  new_fpcr = old_fpcr | ((mask & FE_ALL_EXCEPT) << FPCR_EXCEPT_SHIFT);
+  if (new_fpcr != old_fpcr) {
+    __set_fpcr(new_fpcr);
+  }
+  return ((old_fpcr >> FPCR_EXCEPT_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fedisableexcept(int mask) {
+  fpu_control_t old_fpcr, new_fpcr;
+
+  __get_fpcr(old_fpcr);
+  new_fpcr = old_fpcr & ~((mask & FE_ALL_EXCEPT) << FPCR_EXCEPT_SHIFT);
+  if (new_fpcr != old_fpcr) {
+    __set_fpcr(new_fpcr);
+  }
+  return ((old_fpcr >> FPCR_EXCEPT_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fegetexcept(void) {
+  fpu_control_t fpcr;
+
+  __get_fpcr(fpcr);
+  return ((fpcr & FPCR_EXCEPT_MASK) >> FPCR_EXCEPT_SHIFT);
+}
diff --git a/libm/arm64/floor.S b/libm/arm64/floor.S
new file mode 100644
index 0000000..ca106bd
--- /dev/null
+++ b/libm/arm64/floor.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(floor)
+  frintM d0, d0
+  ret
+END(floor)
+
+ENTRY(floorf)
+  frintM s0, s0
+  ret
+END(floorf)
diff --git a/libm/arm64/fma.S b/libm/arm64/fma.S
new file mode 100644
index 0000000..1a8a158
--- /dev/null
+++ b/libm/arm64/fma.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(fma)
+  fmadd d0, d0, d1, d2
+  ret
+END(fma)
+
+ENTRY(fmaf)
+  fmadd s0, s0, s1, s2
+  ret
+END(fmaf)
diff --git a/libm/arm64/lrint.S b/libm/arm64/lrint.S
new file mode 100644
index 0000000..5f95ae8
--- /dev/null
+++ b/libm/arm64/lrint.S
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrint)
+  frintX d0, d0
+  fcvtzs x0, d0
+  ret
+END(lrint)
+
+ENTRY(lrintf)
+  frintX s0, s0
+  fcvtzs x0, s0
+  ret
+END(lrintf)
+
+// sizeof(long) and sizeof(long long) are the same for aarch64
+ALIAS_SYMBOL(llrint, lrint);
+
+ALIAS_SYMBOL(llrintf, lrintf);
diff --git a/libm/arm64/rint.S b/libm/arm64/rint.S
new file mode 100644
index 0000000..bf49f5b
--- /dev/null
+++ b/libm/arm64/rint.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(rint)
+  frintX d0, d0
+  ret
+END(rint)
+
+ENTRY(rintf)
+  frintX s0, s0
+  ret
+END(rintf)
diff --git a/libm/arm64/sqrt.S b/libm/arm64/sqrt.S
new file mode 100644
index 0000000..3a58ef3
--- /dev/null
+++ b/libm/arm64/sqrt.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(sqrt)
+  fsqrt d0, d0
+  ret
+END(sqrt)
+
+ENTRY(sqrtf)
+  fsqrt s0, s0
+  ret
+END(sqrtf)
diff --git a/libm/arm64/trunc.S b/libm/arm64/trunc.S
new file mode 100644
index 0000000..aa0d4bd
--- /dev/null
+++ b/libm/arm64/trunc.S
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(trunc)
+  frintZ d0, d0
+  ret
+END(trunc)
+
+ENTRY(truncf)
+  frintZ s0, s0
+  ret
+END(truncf)
diff --git a/libm/digittoint.c b/libm/digittoint.c
new file mode 100644
index 0000000..1824788
--- /dev/null
+++ b/libm/digittoint.c
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2007 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+
+/* digittoint is in the FreeBSD C library, but implemented in terms of locale stuff. */
+__LIBC_HIDDEN__ int digittoint(char ch) {
+  int d = ch - '0';
+  if ((unsigned) d < 10) {
+    return d;
+  }
+  d = ch - 'a';
+  if ((unsigned) d < 6) {
+    return d + 10;
+  }
+  d = ch - 'A';
+  if ((unsigned) d < 6) {
+    return d + 10;
+  }
+  return -1;
+}
diff --git a/libm/fabs.cpp b/libm/fabs.cpp
new file mode 100644
index 0000000..add73fe
--- /dev/null
+++ b/libm/fabs.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double fabs(double x) {
+#if __arm__
+  // Both Clang and GCC insist on moving r0/r1 into a double register
+  // and using fabs where bit-twiddling would be a better choice.
+  // They get fabsf right, but we need to be careful in fabsl too.
+  IEEEd2bits u;
+  u.d = x;
+  u.bits.sign = 0;
+  return u.d;
+#else
+  return __builtin_fabs(x);
+#endif
+}
+
+float fabsf(float x) {
+  return __builtin_fabsf(x);
+}
+
+#if defined(__LP64__)
+long double fabsl(long double x) { return __builtin_fabsl(x); }
+#else
+long double fabsl(long double x) {
+  // Don't use __builtin_fabs here because of ARM. (See fabs above.)
+  return fabs(x);
+}
+#endif
diff --git a/libm/fake_long_double.c b/libm/fake_long_double.c
new file mode 100644
index 0000000..20148a3
--- /dev/null
+++ b/libm/fake_long_double.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <float.h>
+#include <math.h>
+
+#ifndef __LP64__
+/*
+ * The BSD "long double" functions are broken when sizeof(long double) == sizeof(double).
+ * Android works around those cases by replacing the broken functions with our own trivial stubs
+ * that call the regular "double" function.
+ */
+
+long double copysignl(long double a1, long double a2) { return copysign(a1, a2); }
+long double fmaxl(long double a1, long double a2) { return fmax(a1, a2); }
+long double fmodl(long double a1, long double a2) { return fmod(a1, a2); }
+long double fminl(long double a1, long double a2) { return fmin(a1, a2); }
+int ilogbl(long double a1) { return ilogb(a1); }
+long long llrintl(long double a1) { return llrint(a1); }
+#if !defined(__i386__) // x86 has an assembler lrint/lrintl.
+long lrintl(long double a1) { return lrint(a1); }
+#endif
+long long llroundl(long double a1) { return llround(a1); }
+long lroundl(long double a1) { return lround(a1); }
+long double modfl(long double a1, long double* a2) { double i; double f = modf(a1, &i); *a2 = i; return f; }
+float nexttowardf(float a1, long double a2) { return nextafterf(a1, (float) a2); }
+long double roundl(long double a1) { return round(a1); }
+
+#endif // __LP64__
diff --git a/libm/fpmath.h b/libm/fpmath.h
new file mode 100644
index 0000000..80420e5
--- /dev/null
+++ b/libm/fpmath.h
@@ -0,0 +1,96 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+// ANDROID changed:
+// - keep only little endian variants as they're the only one supported.
+// - add long double structures here instead of _fpmath.h.
+// - android uses 128 bits long doubles for LP64, so the structure and macros
+//   were reworked for the quad precision ieee representation.
+
+#ifndef _FPMATH_
+#define _FPMATH_
+
+#include <endian.h>
+
+union IEEEf2bits {
+  float f;
+  struct {
+    unsigned int man   :23;
+    unsigned int exp   :8;
+    unsigned int sign  :1;
+  } bits;
+};
+
+#define DBL_MANH_SIZE  20
+#define DBL_MANL_SIZE  32
+
+union IEEEd2bits {
+  double  d;
+  struct {
+    unsigned int manl  :32;
+    unsigned int manh  :20;
+    unsigned int exp   :11;
+    unsigned int sign  :1;
+  } bits;
+};
+
+#ifdef __LP64__
+
+union IEEEl2bits {
+  long double e;
+  struct {
+    unsigned long manl  :64;
+    unsigned long manh  :48;
+    unsigned int  exp   :15;
+    unsigned int  sign  :1;
+  } bits;
+  struct {
+    unsigned long manl     :64;
+    unsigned long manh     :48;
+    unsigned int  expsign  :16;
+  } xbits;
+};
+
+#define LDBL_NBIT  0
+#define LDBL_IMPLICIT_NBIT
+#define mask_nbit_l(u)  ((void)0)
+
+#define LDBL_MANH_SIZE  48
+#define LDBL_MANL_SIZE  64
+
+#define LDBL_TO_ARRAY32(u, a) do {           \
+  (a)[0] = (uint32_t)(u).bits.manl;          \
+  (a)[1] = (uint32_t)((u).bits.manl >> 32);  \
+  (a)[2] = (uint32_t)(u).bits.manh;          \
+  (a)[3] = (uint32_t)((u).bits.manh >> 32);  \
+} while(0)
+
+#endif // __LP64__
+
+#endif // _FPMATH_
diff --git a/libm/freebsd-compat.h b/libm/freebsd-compat.h
new file mode 100644
index 0000000..a4dd6c2
--- /dev/null
+++ b/libm/freebsd-compat.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _BIONIC_LIBM_FREEBSD_COMPAT_H_included
+#define _BIONIC_LIBM_FREEBSD_COMPAT_H_included
+
+#include <float.h>
+
+#define __weak_reference(sym,alias)     \
+    __asm__(".weak " #alias);           \
+    __asm__(".equ "  #alias ", " #sym)
+
+#define __strong_reference(sym,aliassym) \
+    extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym)))
+
+#define __warn_references(sym,msg) /* ignored */
+
+/* digittoint is in BSD's <ctype.h>. */
+int digittoint(char ch);
+
+#endif
diff --git a/libm/i387/fenv.c b/libm/i387/fenv.c
new file mode 100644
index 0000000..09b4386
--- /dev/null
+++ b/libm/i387/fenv.c
@@ -0,0 +1,412 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/msun/i387/fenv.c,v 1.2 2005/03/17 22:21:46 das Exp $
+ */
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include "fenv.h"
+
+#define ROUND_MASK   (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
+
+/*
+ * The hardware default control word for i387's and later coprocessors is
+ * 0x37F, giving:
+ *
+ *	round to nearest
+ *	64-bit precision
+ *	all exceptions masked.
+ *
+ * We modify the affine mode bit and precision bits in this to give:
+ *
+ *	affine mode for 287's (if they work at all) (1 in bitfield 1<<12)
+ *	53-bit precision (2 in bitfield 3<<8)
+ *
+ * 64-bit precision often gives bad results with high level languages
+ * because it makes the results of calculations depend on whether
+ * intermediate values are stored in memory or in FPU registers.
+ */
+#define	__INITIAL_NPXCW__	0x127F
+#define	__INITIAL_MXCSR__	0x1F80
+
+/*
+ * As compared to the x87 control word, the SSE unit's control word
+ * has the rounding control bits offset by 3 and the exception mask
+ * bits offset by 7.
+ */
+#define _SSE_ROUND_SHIFT 3
+#define _SSE_EMASK_SHIFT 7
+
+const fenv_t __fe_dfl_env = {
+  __INITIAL_NPXCW__, /*__control*/
+  0x0000,            /*__mxcsr_hi*/
+  0x0000,            /*__status*/
+  0x1f80,            /*__mxcsr_lo*/
+  0xffffffff,        /*__tag*/
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff } /*__other*/
+};
+
+#define __fldcw(__cw)           __asm volatile("fldcw %0" : : "m" (__cw))
+#define __fldenv(__env)         __asm volatile("fldenv %0" : : "m" (__env))
+#define __fldenvx(__env)        __asm volatile("fldenv %0" : : "m" (__env)  \
+                                : "st", "st(1)", "st(2)", "st(3)", "st(4)",   \
+                                "st(5)", "st(6)", "st(7)")
+#define __fnclex()              __asm volatile("fnclex")
+#define __fnstenv(__env)        __asm volatile("fnstenv %0" : "=m" (*(__env)))
+#define __fnstcw(__cw)          __asm volatile("fnstcw %0" : "=m" (*(__cw)))
+#define __fnstsw(__sw)          __asm volatile("fnstsw %0" : "=am" (*(__sw)))
+#define __fwait()               __asm volatile("fwait")
+#define __ldmxcsr(__csr)        __asm volatile("ldmxcsr %0" : : "m" (__csr))
+#define __stmxcsr(__csr)        __asm volatile("stmxcsr %0" : "=m" (*(__csr)))
+
+/* After testing for SSE support once, we cache the result in __has_sse. */
+enum __sse_support { __SSE_YES, __SSE_NO, __SSE_UNK };
+#ifdef __SSE__
+#define __HAS_SSE()     1
+#else
+#define __HAS_SSE()     (__has_sse == __SSE_YES ||                      \
+                        (__has_sse == __SSE_UNK && __test_sse()))
+#endif
+
+enum __sse_support __has_sse =
+#ifdef __SSE__
+  __SSE_YES;
+#else
+  __SSE_UNK;
+#endif
+
+#ifndef __SSE__
+#define getfl(x)    __asm volatile("pushfl\n\tpopl %0" : "=mr" (*(x)))
+#define setfl(x)    __asm volatile("pushl %0\n\tpopfl" : : "g" (x))
+#define cpuid_dx(x) __asm volatile("pushl %%ebx\n\tmovl $1, %%eax\n\t"  \
+                    "cpuid\n\tpopl %%ebx"          \
+                    : "=d" (*(x)) : : "eax", "ecx")
+
+/*
+ * Test for SSE support on this processor.  We need to do this because
+ * we need to use ldmxcsr/stmxcsr to get correct results if any part
+ * of the program was compiled to use SSE floating-point, but we can't
+ * use SSE on older processors.
+ */
+int
+__test_sse(void)
+{
+  int flag, nflag;
+  int dx_features;
+
+  /* Am I a 486? */
+  getfl(&flag);
+  nflag = flag ^ 0x200000;
+  setfl(nflag);
+  getfl(&nflag);
+  if (flag != nflag) {
+    /* Not a 486, so CPUID should work. */
+    cpuid_dx(&dx_features);
+    if (dx_features & 0x2000000) {
+      __has_sse = __SSE_YES;
+      return (1);
+    }
+  }
+  __has_sse = __SSE_NO;
+  return (0);
+}
+#endif /* __SSE__ */
+
+int
+fesetexceptflag(const fexcept_t *flagp, int excepts)
+{
+  fenv_t env;
+  __uint32_t mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  if (excepts) { /* Do nothing if excepts is 0 */
+    __fnstenv(&env);
+    env.__status &= ~excepts;
+    env.__status |= *flagp & excepts;
+    __fnclex();
+    __fldenv(env);
+    if (__HAS_SSE()) {
+      __stmxcsr(&mxcsr);
+      mxcsr &= ~excepts;
+      mxcsr |= *flagp & excepts;
+      __ldmxcsr(mxcsr);
+    }
+  }
+
+  return (0);
+}
+
+int
+feraiseexcept(int excepts)
+{
+  fexcept_t ex = excepts;
+
+  fesetexceptflag(&ex, excepts);
+  __fwait();
+  return (0);
+}
+
+int
+fegetenv(fenv_t *envp)
+{
+  __uint32_t mxcsr;
+
+  __fnstenv(envp);
+  /*
+   * fnstenv masks all exceptions, so we need to restore
+   * the old control word to avoid this side effect.
+   */
+  __fldcw(envp->__control);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+    envp->__mxcsr_hi = mxcsr >> 16;
+    envp->__mxcsr_lo = mxcsr & 0xffff;
+  }
+  return (0);
+}
+
+int
+feholdexcept(fenv_t *envp)
+{
+  __uint32_t mxcsr;
+  fenv_t env;
+
+  __fnstenv(&env);
+  *envp = env;
+  env.__status &= ~FE_ALL_EXCEPT;
+  env.__control |= FE_ALL_EXCEPT;
+  __fnclex();
+  __fldenv(env);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+    envp->__mxcsr_hi = mxcsr >> 16;
+    envp->__mxcsr_lo = mxcsr & 0xffff;
+    mxcsr &= ~FE_ALL_EXCEPT;
+    mxcsr |= FE_ALL_EXCEPT << _SSE_EMASK_SHIFT;
+    __ldmxcsr(mxcsr);
+  }
+  return (0);
+}
+
+int
+feupdateenv(const fenv_t *envp)
+{
+  __uint32_t mxcsr;
+  __uint16_t status;
+
+  __fnstsw(&status);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+  } else {
+    mxcsr = 0;
+  }
+  fesetenv(envp);
+  feraiseexcept((mxcsr | status) & FE_ALL_EXCEPT);
+  return (0);
+}
+
+int
+feenableexcept(int mask)
+{
+  __uint32_t mxcsr;
+  __uint16_t control, omask;
+
+  mask &= FE_ALL_EXCEPT;
+  __fnstcw(&control);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+  } else {
+    mxcsr = 0;
+  }
+  omask = ~(control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+  if (mask) {
+    control &= ~mask;
+    __fldcw(control);
+    if (__HAS_SSE()) {
+      mxcsr &= ~(mask << _SSE_EMASK_SHIFT);
+      __ldmxcsr(mxcsr);
+    }
+  }
+  return (omask);
+}
+
+int
+fedisableexcept(int mask)
+{
+  __uint32_t mxcsr;
+  __uint16_t control, omask;
+
+  mask &= FE_ALL_EXCEPT;
+  __fnstcw(&control);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+  } else {
+    mxcsr = 0;
+  }
+  omask = ~(control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+  if (mask) {
+    control |= mask;
+    __fldcw(control);
+    if (__HAS_SSE()) {
+      mxcsr |= mask << _SSE_EMASK_SHIFT;
+      __ldmxcsr(mxcsr);
+    }
+  }
+  return (omask);
+}
+
+int
+feclearexcept(int excepts)
+{
+  fenv_t env;
+  __uint32_t mxcsr;
+
+  excepts &= FE_ALL_EXCEPT;
+  if (excepts) { /* Do nothing if excepts is 0 */
+    __fnstenv(&env);
+    env.__status &= ~excepts;
+    __fnclex();
+    __fldenv(env);
+    if (__HAS_SSE()) {
+      __stmxcsr(&mxcsr);
+      mxcsr &= ~excepts;
+      __ldmxcsr(mxcsr);
+    }
+  }
+  return (0);
+}
+
+int
+fegetexceptflag(fexcept_t *flagp, int excepts)
+{
+  __uint32_t mxcsr;
+  __uint16_t status;
+
+  excepts &= FE_ALL_EXCEPT;
+  __fnstsw(&status);
+  if (__HAS_SSE()) {
+    __stmxcsr(&mxcsr);
+  } else {
+    mxcsr = 0;
+  }
+  *flagp = (status | mxcsr) & excepts;
+  return (0);
+}
+
+int
+fetestexcept(int excepts)
+{
+  __uint32_t mxcsr;
+  __uint16_t status;
+
+  excepts &= FE_ALL_EXCEPT;
+  if (excepts) { /* Do nothing if excepts is 0 */
+    __fnstsw(&status);
+    if (__HAS_SSE()) {
+      __stmxcsr(&mxcsr);
+    } else {
+      mxcsr = 0;
+    }
+    return ((status | mxcsr) & excepts);
+  }
+  return (0);
+}
+
+int
+fegetround(void)
+{
+  __uint16_t control;
+
+  /*
+   * We assume that the x87 and the SSE unit agree on the
+   * rounding mode.  Reading the control word on the x87 turns
+   * out to be about 5 times faster than reading it on the SSE
+   * unit on an Opteron 244.
+   */
+  __fnstcw(&control);
+  return (control & ROUND_MASK);
+}
+
+int
+fesetround(int round)
+{
+  __uint32_t mxcsr;
+  __uint16_t control;
+
+  if (round & ~ROUND_MASK) {
+    return (-1);
+  } else {
+    __fnstcw(&control);
+    control &= ~ROUND_MASK;
+    control |= round;
+    __fldcw(control);
+    if (__HAS_SSE()) {
+      __stmxcsr(&mxcsr);
+      mxcsr &= ~(ROUND_MASK << _SSE_ROUND_SHIFT);
+      mxcsr |= round << _SSE_ROUND_SHIFT;
+      __ldmxcsr(mxcsr);
+    }
+    return (0);
+  }
+}
+
+int
+fesetenv(const fenv_t *envp)
+{
+  fenv_t env = *envp;
+  __uint32_t mxcsr;
+
+  mxcsr = (env.__mxcsr_hi << 16) | (env.__mxcsr_lo);
+  env.__mxcsr_hi = 0xffff;
+  env.__mxcsr_lo = 0xffff;
+  /*
+   * XXX Using fldenvx() instead of fldenv() tells the compiler that this
+   * instruction clobbers the i387 register stack.  This happens because
+   * we restore the tag word from the saved environment.  Normally, this
+   * would happen anyway and we wouldn't care, because the ABI allows
+   * function calls to clobber the i387 regs.  However, fesetenv() is
+   * inlined, so we need to be more careful.
+   */
+  __fldenvx(env);
+  if (__HAS_SSE()) {
+    __ldmxcsr(mxcsr);
+  }
+  return (0);
+}
+
+int
+fegetexcept(void)
+{
+  __uint16_t control;
+
+  /*
+   * We assume that the masks for the x87 and the SSE unit are
+   * the same.
+   */
+  __fnstcw(&control);
+  return (~control & FE_ALL_EXCEPT);
+}
diff --git a/libm/libm.arm.map b/libm/libm.arm.map
new file mode 100644
index 0000000..a61dc2e
--- /dev/null
+++ b/libm/libm.arm.map
@@ -0,0 +1,401 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
+LIBC_DEPRECATED { # arm mips
+  global: # arm mips
+    ___Unwind_Backtrace; # arm
+    ___Unwind_ForcedUnwind; # arm
+    ___Unwind_RaiseException; # arm
+    ___Unwind_Resume; # arm
+    ___Unwind_Resume_or_Rethrow; # arm
+    __adddf3; # arm
+    __aeabi_cdcmpeq; # arm
+    __aeabi_cdcmple; # arm
+    __aeabi_cdrcmple; # arm
+    __aeabi_cfcmpeq; # arm
+    __aeabi_cfcmple; # arm
+    __aeabi_cfrcmple; # arm
+    __aeabi_d2lz; # arm
+    __aeabi_d2uiz; # arm
+    __aeabi_d2ulz; # arm
+    __aeabi_dadd; # arm
+    __aeabi_dcmpeq; # arm
+    __aeabi_dcmpge; # arm
+    __aeabi_dcmpgt; # arm
+    __aeabi_dcmple; # arm
+    __aeabi_dcmplt; # arm
+    __aeabi_ddiv; # arm
+    __aeabi_dmul; # arm
+    __aeabi_drsub; # arm
+    __aeabi_dsub; # arm
+    __aeabi_f2d; # arm
+    __aeabi_f2lz; # arm
+    __aeabi_f2ulz; # arm
+    __aeabi_fcmpeq; # arm
+    __aeabi_fcmpge; # arm
+    __aeabi_fcmpgt; # arm
+    __aeabi_fcmple; # arm
+    __aeabi_fcmplt; # arm
+    __aeabi_i2d; # arm
+    __aeabi_l2d; # arm
+    __aeabi_ui2d; # arm
+    __aeabi_ul2d; # arm
+    __aeabi_unwind_cpp_pr0; # arm
+    __aeabi_unwind_cpp_pr1; # arm
+    __aeabi_unwind_cpp_pr2; # arm
+    __cmpdf2; # arm
+    __cmpsf2; # arm
+    __divdf3; # arm
+    __eqdf2; # arm
+    __eqsf2; # arm
+    __extendsfdf2; # arm
+    __fixdfdi; # arm mips
+    __fixsfdi; # arm mips
+    __fixunsdfdi; # arm mips
+    __fixunsdfsi; # arm
+    __fixunssfdi; # arm mips
+    __floatdidf; # arm
+    __floatsidf; # arm
+    __floatundidf; # arm
+    __floatunsidf; # arm
+    __gedf2; # arm
+    __gesf2; # arm
+    __gnu_Unwind_Backtrace; # arm
+    __gnu_unwind_execute; # arm
+    __gnu_Unwind_ForcedUnwind; # arm
+    __gnu_unwind_frame; # arm
+    __gnu_Unwind_RaiseException; # arm
+    __gnu_Unwind_Restore_VFP; # arm
+    __gnu_Unwind_Restore_VFP_D; # arm
+    __gnu_Unwind_Restore_VFP_D_16_to_31; # arm
+    __gnu_Unwind_Restore_WMMXC; # arm
+    __gnu_Unwind_Restore_WMMXD; # arm
+    __gnu_Unwind_Resume; # arm
+    __gnu_Unwind_Resume_or_Rethrow; # arm
+    __gnu_Unwind_Save_VFP; # arm
+    __gnu_Unwind_Save_VFP_D; # arm
+    __gnu_Unwind_Save_VFP_D_16_to_31; # arm
+    __gnu_Unwind_Save_WMMXC; # arm
+    __gnu_Unwind_Save_WMMXD; # arm
+    __gtdf2; # arm
+    __gtsf2; # arm
+    __ledf2; # arm
+    __lesf2; # arm
+    __ltdf2; # arm
+    __ltsf2; # arm
+    __muldf3; # arm
+    __nedf2; # arm
+    __nesf2; # arm
+    __restore_core_regs; # arm
+    __subdf3; # arm
+    _Unwind_Backtrace; # arm
+    _Unwind_Complete; # arm
+    _Unwind_DeleteException; # arm
+    _Unwind_ForcedUnwind; # arm
+    _Unwind_GetCFA; # arm
+    _Unwind_GetDataRelBase; # arm
+    _Unwind_GetLanguageSpecificData; # arm
+    _Unwind_GetRegionStart; # arm
+    _Unwind_GetTextRelBase; # arm
+    _Unwind_RaiseException; # arm
+    _Unwind_Resume; # arm
+    _Unwind_Resume_or_Rethrow; # arm
+    _Unwind_VRS_Get; # arm
+    _Unwind_VRS_Pop; # arm
+    _Unwind_VRS_Set; # arm
+    restore_core_regs; # arm
+} LIBC_O; # arm mips
diff --git a/libm/libm.arm64.map b/libm/libm.arm64.map
new file mode 100644
index 0000000..11032ca
--- /dev/null
+++ b/libm/libm.arm64.map
@@ -0,0 +1,297 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
diff --git a/libm/libm.map.txt b/libm/libm.map.txt
new file mode 100644
index 0000000..66dfd19
--- /dev/null
+++ b/libm/libm.map.txt
@@ -0,0 +1,400 @@
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
+LIBC_DEPRECATED { # arm mips
+  global: # arm mips
+    ___Unwind_Backtrace; # arm
+    ___Unwind_ForcedUnwind; # arm
+    ___Unwind_RaiseException; # arm
+    ___Unwind_Resume; # arm
+    ___Unwind_Resume_or_Rethrow; # arm
+    __adddf3; # arm
+    __aeabi_cdcmpeq; # arm
+    __aeabi_cdcmple; # arm
+    __aeabi_cdrcmple; # arm
+    __aeabi_cfcmpeq; # arm
+    __aeabi_cfcmple; # arm
+    __aeabi_cfrcmple; # arm
+    __aeabi_d2lz; # arm
+    __aeabi_d2uiz; # arm
+    __aeabi_d2ulz; # arm
+    __aeabi_dadd; # arm
+    __aeabi_dcmpeq; # arm
+    __aeabi_dcmpge; # arm
+    __aeabi_dcmpgt; # arm
+    __aeabi_dcmple; # arm
+    __aeabi_dcmplt; # arm
+    __aeabi_ddiv; # arm
+    __aeabi_dmul; # arm
+    __aeabi_drsub; # arm
+    __aeabi_dsub; # arm
+    __aeabi_f2d; # arm
+    __aeabi_f2lz; # arm
+    __aeabi_f2ulz; # arm
+    __aeabi_fcmpeq; # arm
+    __aeabi_fcmpge; # arm
+    __aeabi_fcmpgt; # arm
+    __aeabi_fcmple; # arm
+    __aeabi_fcmplt; # arm
+    __aeabi_i2d; # arm
+    __aeabi_l2d; # arm
+    __aeabi_ui2d; # arm
+    __aeabi_ul2d; # arm
+    __aeabi_unwind_cpp_pr0; # arm
+    __aeabi_unwind_cpp_pr1; # arm
+    __aeabi_unwind_cpp_pr2; # arm
+    __cmpdf2; # arm
+    __cmpsf2; # arm
+    __divdf3; # arm
+    __eqdf2; # arm
+    __eqsf2; # arm
+    __extendsfdf2; # arm
+    __fixdfdi; # arm mips
+    __fixsfdi; # arm mips
+    __fixunsdfdi; # arm mips
+    __fixunsdfsi; # arm
+    __fixunssfdi; # arm mips
+    __floatdidf; # arm
+    __floatsidf; # arm
+    __floatundidf; # arm
+    __floatunsidf; # arm
+    __gedf2; # arm
+    __gesf2; # arm
+    __gnu_Unwind_Backtrace; # arm
+    __gnu_unwind_execute; # arm
+    __gnu_Unwind_ForcedUnwind; # arm
+    __gnu_unwind_frame; # arm
+    __gnu_Unwind_RaiseException; # arm
+    __gnu_Unwind_Restore_VFP; # arm
+    __gnu_Unwind_Restore_VFP_D; # arm
+    __gnu_Unwind_Restore_VFP_D_16_to_31; # arm
+    __gnu_Unwind_Restore_WMMXC; # arm
+    __gnu_Unwind_Restore_WMMXD; # arm
+    __gnu_Unwind_Resume; # arm
+    __gnu_Unwind_Resume_or_Rethrow; # arm
+    __gnu_Unwind_Save_VFP; # arm
+    __gnu_Unwind_Save_VFP_D; # arm
+    __gnu_Unwind_Save_VFP_D_16_to_31; # arm
+    __gnu_Unwind_Save_WMMXC; # arm
+    __gnu_Unwind_Save_WMMXD; # arm
+    __gtdf2; # arm
+    __gtsf2; # arm
+    __ledf2; # arm
+    __lesf2; # arm
+    __ltdf2; # arm
+    __ltsf2; # arm
+    __muldf3; # arm
+    __nedf2; # arm
+    __nesf2; # arm
+    __restore_core_regs; # arm
+    __subdf3; # arm
+    _Unwind_Backtrace; # arm
+    _Unwind_Complete; # arm
+    _Unwind_DeleteException; # arm
+    _Unwind_ForcedUnwind; # arm
+    _Unwind_GetCFA; # arm
+    _Unwind_GetDataRelBase; # arm
+    _Unwind_GetLanguageSpecificData; # arm
+    _Unwind_GetRegionStart; # arm
+    _Unwind_GetTextRelBase; # arm
+    _Unwind_RaiseException; # arm
+    _Unwind_Resume; # arm
+    _Unwind_Resume_or_Rethrow; # arm
+    _Unwind_VRS_Get; # arm
+    _Unwind_VRS_Pop; # arm
+    _Unwind_VRS_Set; # arm
+    restore_core_regs; # arm
+} LIBC_O; # arm mips
diff --git a/libm/libm.mips.map b/libm/libm.mips.map
new file mode 100644
index 0000000..8353627
--- /dev/null
+++ b/libm/libm.mips.map
@@ -0,0 +1,304 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
+LIBC_DEPRECATED { # arm mips
+  global: # arm mips
+    __fixdfdi; # arm mips
+    __fixsfdi; # arm mips
+    __fixunsdfdi; # arm mips
+    __fixunssfdi; # arm mips
+} LIBC_O; # arm mips
diff --git a/libm/libm.mips64.map b/libm/libm.mips64.map
new file mode 100644
index 0000000..11032ca
--- /dev/null
+++ b/libm/libm.mips64.map
@@ -0,0 +1,297 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
diff --git a/libm/libm.x86.map b/libm/libm.x86.map
new file mode 100644
index 0000000..11032ca
--- /dev/null
+++ b/libm/libm.x86.map
@@ -0,0 +1,297 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
diff --git a/libm/libm.x86_64.map b/libm/libm.x86_64.map
new file mode 100644
index 0000000..11032ca
--- /dev/null
+++ b/libm/libm.x86_64.map
@@ -0,0 +1,297 @@
+# Generated by genversion-scripts.py. Do not edit.
+LIBC {
+  global:
+    __fe_dfl_env;
+    __signbit;
+    __signbitf;
+    __signbitl;
+    acos;
+    acosf;
+    acosh;
+    acoshf;
+    acoshl;
+    acosl;
+    asin;
+    asinf;
+    asinh;
+    asinhf;
+    asinhl;
+    asinl;
+    atan;
+    atan2;
+    atan2f;
+    atan2l;
+    atanf;
+    atanh;
+    atanhf;
+    atanhl;
+    atanl;
+    cabs;
+    cabsf;
+    cabsl;
+    cacos;
+    cacosf;
+    cacosh;
+    cacoshf;
+    carg;
+    cargf;
+    cargl;
+    casin;
+    casinf;
+    casinh;
+    casinhf;
+    catan;
+    catanf;
+    catanh;
+    catanhf;
+    cbrt;
+    cbrtf;
+    cbrtl;
+    ccos;
+    ccosf;
+    ccosh;
+    ccoshf;
+    ceil;
+    ceilf;
+    ceill;
+    cexp;
+    cexpf;
+    cimag;
+    cimagf;
+    cimagl;
+    conj;
+    conjf;
+    conjl;
+    copysign;
+    copysignf;
+    copysignl;
+    cos;
+    cosf;
+    cosh;
+    coshf;
+    coshl;
+    cosl;
+    cproj;
+    cprojf;
+    cprojl;
+    creal;
+    crealf;
+    creall;
+    csin;
+    csinf;
+    csinh;
+    csinhf;
+    csqrt;
+    csqrtf;
+    csqrtl;
+    ctan;
+    ctanf;
+    ctanh;
+    ctanhf;
+    drem;
+    dremf;
+    erf;
+    erfc;
+    erfcf;
+    erfcl;
+    erff;
+    erfl;
+    exp;
+    exp2;
+    exp2f;
+    exp2l;
+    expf;
+    expl;
+    expm1;
+    expm1f;
+    expm1l;
+    fabs;
+    fabsf;
+    fabsl;
+    fdim;
+    fdimf;
+    fdiml;
+    feclearexcept;
+    fedisableexcept;
+    feenableexcept;
+    fegetenv;
+    fegetexcept;
+    fegetexceptflag;
+    fegetround;
+    feholdexcept;
+    feraiseexcept;
+    fesetenv;
+    fesetexceptflag;
+    fesetround;
+    fetestexcept;
+    feupdateenv;
+    finite;
+    finitef;
+    floor;
+    floorf;
+    floorl;
+    fma;
+    fmaf;
+    fmal;
+    fmax;
+    fmaxf;
+    fmaxl;
+    fmin;
+    fminf;
+    fminl;
+    fmod;
+    fmodf;
+    fmodl;
+    frexp;
+    frexpf;
+    frexpl;
+    gamma;
+    gamma_r;
+    gammaf;
+    gammaf_r;
+    hypot;
+    hypotf;
+    hypotl;
+    ilogb;
+    ilogbf;
+    ilogbl;
+    j0;
+    j0f;
+    j1;
+    j1f;
+    jn;
+    jnf;
+    ldexpf;
+    ldexpl;
+    lgamma;
+    lgamma_r;
+    lgammaf;
+    lgammaf_r;
+    lgammal;
+    lgammal_r;
+    llrint;
+    llrintf;
+    llrintl;
+    llround;
+    llroundf;
+    llroundl;
+    log;
+    log10;
+    log10f;
+    log10l;
+    log1p;
+    log1pf;
+    log1pl;
+    log2;
+    log2f;
+    log2l;
+    logb;
+    logbf;
+    logbl;
+    logf;
+    logl;
+    lrint;
+    lrintf;
+    lrintl;
+    lround;
+    lroundf;
+    lroundl;
+    modf;
+    modff;
+    modfl;
+    nan;
+    nanf;
+    nanl;
+    nearbyint;
+    nearbyintf;
+    nearbyintl;
+    nextafter;
+    nextafterf;
+    nextafterl;
+    nexttoward;
+    nexttowardf;
+    nexttowardl;
+    pow;
+    powf;
+    powl;
+    remainder;
+    remainderf;
+    remainderl;
+    remquo;
+    remquof;
+    remquol;
+    rint;
+    rintf;
+    rintl;
+    round;
+    roundf;
+    roundl;
+    scalb;
+    scalbf;
+    scalbln;
+    scalblnf;
+    scalblnl;
+    scalbn;
+    scalbnf;
+    scalbnl;
+    signgam;
+    significand;
+    significandf;
+    significandl;
+    sin;
+    sincos;
+    sincosf;
+    sincosl;
+    sinf;
+    sinh;
+    sinhf;
+    sinhl;
+    sinl;
+    sqrt;
+    sqrtf;
+    sqrtl;
+    tan;
+    tanf;
+    tanh;
+    tanhf;
+    tanhl;
+    tanl;
+    tgamma;
+    tgammaf;
+    tgammal;
+    trunc;
+    truncf;
+    truncl;
+    y0;
+    y0f;
+    y1;
+    y1f;
+    yn;
+    ynf;
+  local:
+    *;
+};
+
+LIBC_O {
+  global:
+    cacoshl;
+    cacosl;
+    casinhl;
+    casinl;
+    catanhl;
+    catanl;
+    ccoshl;
+    ccosl;
+    cexpl;
+    clog;
+    clogf;
+    clogl;
+    cpow;
+    cpowf;
+    cpowl;
+    csinhl;
+    csinl;
+    ctanhl;
+    ctanl;
+} LIBC;
+
diff --git a/libm/mips/fenv.c b/libm/mips/fenv.c
new file mode 100644
index 0000000..aacd526
--- /dev/null
+++ b/libm/mips/fenv.c
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/msun/mips/fenv.c,v 1.1 2008/04/26 12:20:29 imp Exp $
+ */
+
+#include <fenv.h>
+
+#define FCSR_CAUSE_SHIFT 10
+#define FCSR_ENABLE_SHIFT 5
+#define FCSR_ENABLE_MASK (FE_ALL_EXCEPT << FCSR_ENABLE_SHIFT)
+
+#define FCSR_RMASK       0x3
+
+/*
+ * Hopefully the system ID byte is immutable, so it's valid to use
+ * this as a default environment.
+ */
+const fenv_t __fe_dfl_env = 0;
+
+int fegetenv(fenv_t* __envp) {
+  fenv_t _fcsr = 0;
+#ifdef  __mips_hard_float
+  __asm__ __volatile__("cfc1 %0,$31" : "=r" (_fcsr));
+#endif
+  *__envp = _fcsr;
+  return 0;
+}
+
+int fesetenv(const fenv_t* __envp) {
+  fenv_t _fcsr = *__envp;
+#ifdef  __mips_hard_float
+  __asm__ __volatile__("ctc1 %0,$31" : : "r" (_fcsr));
+#endif
+  return 0;
+}
+
+int feclearexcept(int __excepts) {
+  fexcept_t __fcsr;
+  fegetenv(&__fcsr);
+  __excepts &= FE_ALL_EXCEPT;
+  __fcsr &= ~(__excepts | (__excepts << FCSR_CAUSE_SHIFT));
+  fesetenv(&__fcsr);
+  return 0;
+}
+
+int fegetexceptflag(fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fcsr;
+  fegetenv(&__fcsr);
+  *__flagp = __fcsr & __excepts & FE_ALL_EXCEPT;
+  return 0;
+}
+
+int fesetexceptflag(const fexcept_t* __flagp, int __excepts) {
+  fexcept_t __fcsr;
+  fegetenv(&__fcsr);
+  /* Ensure that flags are all legal */
+  __excepts &= FE_ALL_EXCEPT;
+  __fcsr &= ~__excepts;
+  __fcsr |= *__flagp & __excepts;
+  fesetenv(&__fcsr);
+  return 0;
+}
+
+int feraiseexcept(int __excepts) {
+  fexcept_t __fcsr;
+  fegetenv(&__fcsr);
+  /* Ensure that flags are all legal */
+  __excepts &= FE_ALL_EXCEPT;
+  /* Cause bit needs to be set as well for generating the exception*/
+  __fcsr |= __excepts | (__excepts << FCSR_CAUSE_SHIFT);
+  fesetenv(&__fcsr);
+  return 0;
+}
+
+int fetestexcept(int __excepts) {
+  fexcept_t __FCSR;
+  fegetenv(&__FCSR);
+  return (__FCSR & __excepts & FE_ALL_EXCEPT);
+}
+
+int fegetround(void) {
+  fenv_t _fcsr;
+  fegetenv(&_fcsr);
+  return (_fcsr & FCSR_RMASK);
+}
+
+int fesetround(int __round) {
+  fenv_t _fcsr;
+  fegetenv(&_fcsr);
+  _fcsr &= ~FCSR_RMASK;
+  _fcsr |= (__round & FCSR_RMASK);
+  fesetenv(&_fcsr);
+  return 0;
+}
+
+int feholdexcept(fenv_t* __envp) {
+  fenv_t __env;
+  fegetenv(&__env);
+  *__envp = __env;
+  __env &= ~(FE_ALL_EXCEPT | FCSR_ENABLE_MASK);
+  fesetenv(&__env);
+  return 0;
+}
+
+int feupdateenv(const fenv_t* __envp) {
+  fexcept_t __fcsr;
+  fegetenv(&__fcsr);
+  fesetenv(__envp);
+  feraiseexcept(__fcsr & FE_ALL_EXCEPT);
+  return 0;
+}
+
+int feenableexcept(int __mask) {
+  fenv_t __old_fcsr, __new_fcsr;
+  fegetenv(&__old_fcsr);
+  __new_fcsr = __old_fcsr | (__mask & FE_ALL_EXCEPT) << FCSR_ENABLE_SHIFT;
+  fesetenv(&__new_fcsr);
+  return ((__old_fcsr >> FCSR_ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fedisableexcept(int __mask) {
+  fenv_t __old_fcsr, __new_fcsr;
+  fegetenv(&__old_fcsr);
+  __new_fcsr = __old_fcsr & ~((__mask & FE_ALL_EXCEPT) << FCSR_ENABLE_SHIFT);
+  fesetenv(&__new_fcsr);
+  return ((__old_fcsr >> FCSR_ENABLE_SHIFT) & FE_ALL_EXCEPT);
+}
+
+int fegetexcept(void) {
+  fenv_t __fcsr;
+  fegetenv(&__fcsr);
+  return ((__fcsr & FCSR_ENABLE_MASK) >> FCSR_ENABLE_SHIFT);
+}
diff --git a/libm/signbit.c b/libm/signbit.c
new file mode 100644
index 0000000..b98bf45
--- /dev/null
+++ b/libm/signbit.c
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+int __signbit(double d)
+{
+  union IEEEd2bits u;
+
+  u.d = d;
+  return (u.bits.sign);
+}
+
+int __signbitf(float f)
+{
+  union IEEEf2bits u;
+
+  u.f = f;
+  return (u.bits.sign);
+}
+
+#ifdef __LP64__
+int __signbitl(long double e)
+{
+  union IEEEl2bits u;
+
+  u.e = e;
+  return (u.bits.sign);
+}
+#else // __LP32__
+__weak_reference(__signbit, __signbitl);
+#endif // __LP64__
diff --git a/libm/significandl.c b/libm/significandl.c
new file mode 100644
index 0000000..c5d7dd4
--- /dev/null
+++ b/libm/significandl.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <math.h>
+
+long double significandl(long double x) {
+  return scalbnl(x, -ilogbl(x));
+}
diff --git a/libm/sincos.c b/libm/sincos.c
new file mode 100644
index 0000000..a5608cf
--- /dev/null
+++ b/libm/sincos.c
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (C) 2010 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define _GNU_SOURCE 1
+#include <math.h>
+
+// Disable sincos optimization for all functions in this file,
+// otherwise gcc would generate infinite calls.
+// Refer to gcc PR46926.
+// -fno-builtin-sin or -fno-builtin-cos can disable sincos optimization,
+// but these two options do not work inside optimize pragma in-file.
+// Thus we just enforce -O0 when compiling this file.
+#pragma GCC optimize ("O0")
+
+void sincos(double x, double* p_sin, double* p_cos) {
+  *p_sin = sin(x);
+  *p_cos = cos(x);
+}
+
+void sincosf(float x, float* p_sinf, float* p_cosf) {
+  *p_sinf = sinf(x);
+  *p_cosf = cosf(x);
+}
+
+void sincosl(long double x, long double* p_sinl, long double* p_cosl) {
+  *p_sinl = sinl(x);
+  *p_cosl = cosl(x);
+}
diff --git a/libm/upstream-freebsd/android/include/machine/endian.h b/libm/upstream-freebsd/android/include/machine/endian.h
new file mode 100644
index 0000000..2dc4d83
--- /dev/null
+++ b/libm/upstream-freebsd/android/include/machine/endian.h
@@ -0,0 +1 @@
+#include <endian.h>
diff --git a/libm/upstream-freebsd/lib/msun/bsdsrc/b_exp.c b/libm/upstream-freebsd/lib/msun/bsdsrc/b_exp.c
new file mode 100644
index 0000000..4400992
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/bsdsrc/b_exp.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 1985, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* @(#)exp.c	8.1 (Berkeley) 6/4/93 */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+
+/* EXP(X)
+ * RETURN THE EXPONENTIAL OF X
+ * DOUBLE PRECISION (IEEE 53 bits, VAX D FORMAT 56 BITS)
+ * CODED IN C BY K.C. NG, 1/19/85;
+ * REVISED BY K.C. NG on 2/6/85, 2/15/85, 3/7/85, 3/24/85, 4/16/85, 6/14/86.
+ *
+ * Required system supported functions:
+ *	scalb(x,n)
+ *	copysign(x,y)
+ *	finite(x)
+ *
+ * Method:
+ *	1. Argument Reduction: given the input x, find r and integer k such
+ *	   that
+ *	                   x = k*ln2 + r,  |r| <= 0.5*ln2 .
+ *	   r will be represented as r := z+c for better accuracy.
+ *
+ *	2. Compute exp(r) by
+ *
+ *		exp(r) = 1 + r + r*R1/(2-R1),
+ *	   where
+ *		R1 = x - x^2*(p1+x^2*(p2+x^2*(p3+x^2*(p4+p5*x^2)))).
+ *
+ *	3. exp(x) = 2^k * exp(r) .
+ *
+ * Special cases:
+ *	exp(INF) is INF, exp(NaN) is NaN;
+ *	exp(-INF)=  0;
+ *	for finite argument, only exp(0)=1 is exact.
+ *
+ * Accuracy:
+ *	exp(x) returns the exponential of x nearly rounded. In a test run
+ *	with 1,156,000 random arguments on a VAX, the maximum observed
+ *	error was 0.869 ulps (units in the last place).
+ */
+
+#include "mathimpl.h"
+
+static const double p1 = 0x1.555555555553ep-3;
+static const double p2 = -0x1.6c16c16bebd93p-9;
+static const double p3 = 0x1.1566aaf25de2cp-14;
+static const double p4 = -0x1.bbd41c5d26bf1p-20;
+static const double p5 = 0x1.6376972bea4d0p-25;
+static const double ln2hi = 0x1.62e42fee00000p-1;
+static const double ln2lo = 0x1.a39ef35793c76p-33;
+static const double lnhuge = 0x1.6602b15b7ecf2p9;
+static const double lntiny = -0x1.77af8ebeae354p9;
+static const double invln2 = 0x1.71547652b82fep0;
+
+#if 0
+double exp(x)
+double x;
+{
+	double  z,hi,lo,c;
+	int k;
+
+#if !defined(vax)&&!defined(tahoe)
+	if(x!=x) return(x);	/* x is NaN */
+#endif	/* !defined(vax)&&!defined(tahoe) */
+	if( x <= lnhuge ) {
+		if( x >= lntiny ) {
+
+		    /* argument reduction : x --> x - k*ln2 */
+
+			k=invln2*x+copysign(0.5,x);	/* k=NINT(x/ln2) */
+
+		    /* express x-k*ln2 as hi-lo and let x=hi-lo rounded */
+
+			hi=x-k*ln2hi;
+			x=hi-(lo=k*ln2lo);
+
+		    /* return 2^k*[1+x+x*c/(2+c)]  */
+			z=x*x;
+			c= x - z*(p1+z*(p2+z*(p3+z*(p4+z*p5))));
+			return  scalb(1.0+(hi-(lo-(x*c)/(2.0-c))),k);
+
+		}
+		/* end of x > lntiny */
+
+		else
+		     /* exp(-big#) underflows to zero */
+		     if(finite(x))  return(scalb(1.0,-5000));
+
+		     /* exp(-INF) is zero */
+		     else return(0.0);
+	}
+	/* end of x < lnhuge */
+
+	else
+	/* exp(INF) is INF, exp(+big#) overflows to INF */
+	    return( finite(x) ?  scalb(1.0,5000)  : x);
+}
+#endif
+
+/* returns exp(r = x + c) for |c| < |x| with no overlap.  */
+
+double __exp__D(x, c)
+double x, c;
+{
+	double  z,hi,lo;
+	int k;
+
+	if (x != x)	/* x is NaN */
+		return(x);
+	if ( x <= lnhuge ) {
+		if ( x >= lntiny ) {
+
+		    /* argument reduction : x --> x - k*ln2 */
+			z = invln2*x;
+			k = z + copysign(.5, x);
+
+		    /* express (x+c)-k*ln2 as hi-lo and let x=hi-lo rounded */
+
+			hi=(x-k*ln2hi);			/* Exact. */
+			x= hi - (lo = k*ln2lo-c);
+		    /* return 2^k*[1+x+x*c/(2+c)]  */
+			z=x*x;
+			c= x - z*(p1+z*(p2+z*(p3+z*(p4+z*p5))));
+			c = (x*c)/(2.0-c);
+
+			return  scalb(1.+(hi-(lo - c)), k);
+		}
+		/* end of x > lntiny */
+
+		else
+		     /* exp(-big#) underflows to zero */
+		     if(finite(x))  return(scalb(1.0,-5000));
+
+		     /* exp(-INF) is zero */
+		     else return(0.0);
+	}
+	/* end of x < lnhuge */
+
+	else
+	/* exp(INF) is INF, exp(+big#) overflows to INF */
+	    return( finite(x) ?  scalb(1.0,5000)  : x);
+}
diff --git a/libm/upstream-freebsd/lib/msun/bsdsrc/b_log.c b/libm/upstream-freebsd/lib/msun/bsdsrc/b_log.c
new file mode 100644
index 0000000..5a4b964
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/bsdsrc/b_log.c
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* @(#)log.c	8.2 (Berkeley) 11/30/93 */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+#include <errno.h>
+
+#include "mathimpl.h"
+
+/* Table-driven natural logarithm.
+ *
+ * This code was derived, with minor modifications, from:
+ *	Peter Tang, "Table-Driven Implementation of the
+ *	Logarithm in IEEE Floating-Point arithmetic." ACM Trans.
+ *	Math Software, vol 16. no 4, pp 378-400, Dec 1990).
+ *
+ * Calculates log(2^m*F*(1+f/F)), |f/j| <= 1/256,
+ * where F = j/128 for j an integer in [0, 128].
+ *
+ * log(2^m) = log2_hi*m + log2_tail*m
+ * since m is an integer, the dominant term is exact.
+ * m has at most 10 digits (for subnormal numbers),
+ * and log2_hi has 11 trailing zero bits.
+ *
+ * log(F) = logF_hi[j] + logF_lo[j] is in tabular form in log_table.h
+ * logF_hi[] + 512 is exact.
+ *
+ * log(1+f/F) = 2*f/(2*F + f) + 1/12 * (2*f/(2*F + f))**3 + ...
+ * the leading term is calculated to extra precision in two
+ * parts, the larger of which adds exactly to the dominant
+ * m and F terms.
+ * There are two cases:
+ *	1. when m, j are non-zero (m | j), use absolute
+ *	   precision for the leading term.
+ *	2. when m = j = 0, |1-x| < 1/256, and log(x) ~= (x-1).
+ *	   In this case, use a relative precision of 24 bits.
+ * (This is done differently in the original paper)
+ *
+ * Special cases:
+ *	0	return signalling -Inf
+ *	neg	return signalling NaN
+ *	+Inf	return +Inf
+*/
+
+#define N 128
+
+/* Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128.
+ * Used for generation of extend precision logarithms.
+ * The constant 35184372088832 is 2^45, so the divide is exact.
+ * It ensures correct reading of logF_head, even for inaccurate
+ * decimal-to-binary conversion routines.  (Everybody gets the
+ * right answer for integers less than 2^53.)
+ * Values for log(F) were generated using error < 10^-57 absolute
+ * with the bc -l package.
+*/
+static double	A1 = 	  .08333333333333178827;
+static double	A2 = 	  .01250000000377174923;
+static double	A3 =	 .002232139987919447809;
+static double	A4 =	.0004348877777076145742;
+
+static double logF_head[N+1] = {
+	0.,
+	.007782140442060381246,
+	.015504186535963526694,
+	.023167059281547608406,
+	.030771658666765233647,
+	.038318864302141264488,
+	.045809536031242714670,
+	.053244514518837604555,
+	.060624621816486978786,
+	.067950661908525944454,
+	.075223421237524235039,
+	.082443669210988446138,
+	.089612158689760690322,
+	.096729626458454731618,
+	.103796793681567578460,
+	.110814366340264314203,
+	.117783035656430001836,
+	.124703478501032805070,
+	.131576357788617315236,
+	.138402322859292326029,
+	.145182009844575077295,
+	.151916042025732167530,
+	.158605030176659056451,
+	.165249572895390883786,
+	.171850256926518341060,
+	.178407657472689606947,
+	.184922338493834104156,
+	.191394852999565046047,
+	.197825743329758552135,
+	.204215541428766300668,
+	.210564769107350002741,
+	.216873938300523150246,
+	.223143551314024080056,
+	.229374101064877322642,
+	.235566071312860003672,
+	.241719936886966024758,
+	.247836163904594286577,
+	.253915209980732470285,
+	.259957524436686071567,
+	.265963548496984003577,
+	.271933715484010463114,
+	.277868451003087102435,
+	.283768173130738432519,
+	.289633292582948342896,
+	.295464212893421063199,
+	.301261330578199704177,
+	.307025035294827830512,
+	.312755710004239517729,
+	.318453731118097493890,
+	.324119468654316733591,
+	.329753286372579168528,
+	.335355541920762334484,
+	.340926586970454081892,
+	.346466767346100823488,
+	.351976423156884266063,
+	.357455888922231679316,
+	.362905493689140712376,
+	.368325561158599157352,
+	.373716409793814818840,
+	.379078352934811846353,
+	.384411698910298582632,
+	.389716751140440464951,
+	.394993808240542421117,
+	.400243164127459749579,
+	.405465108107819105498,
+	.410659924985338875558,
+	.415827895143593195825,
+	.420969294644237379543,
+	.426084395310681429691,
+	.431173464818130014464,
+	.436236766774527495726,
+	.441274560805140936281,
+	.446287102628048160113,
+	.451274644139630254358,
+	.456237433481874177232,
+	.461175715122408291790,
+	.466089729924533457960,
+	.470979715219073113985,
+	.475845904869856894947,
+	.480688529345570714212,
+	.485507815781602403149,
+	.490303988045525329653,
+	.495077266798034543171,
+	.499827869556611403822,
+	.504556010751912253908,
+	.509261901790523552335,
+	.513945751101346104405,
+	.518607764208354637958,
+	.523248143765158602036,
+	.527867089620485785417,
+	.532464798869114019908,
+	.537041465897345915436,
+	.541597282432121573947,
+	.546132437597407260909,
+	.550647117952394182793,
+	.555141507540611200965,
+	.559615787935399566777,
+	.564070138285387656651,
+	.568504735352689749561,
+	.572919753562018740922,
+	.577315365035246941260,
+	.581691739635061821900,
+	.586049045003164792433,
+	.590387446602107957005,
+	.594707107746216934174,
+	.599008189645246602594,
+	.603290851438941899687,
+	.607555250224322662688,
+	.611801541106615331955,
+	.616029877215623855590,
+	.620240409751204424537,
+	.624433288012369303032,
+	.628608659422752680256,
+	.632766669570628437213,
+	.636907462236194987781,
+	.641031179420679109171,
+	.645137961373620782978,
+	.649227946625615004450,
+	.653301272011958644725,
+	.657358072709030238911,
+	.661398482245203922502,
+	.665422632544505177065,
+	.669430653942981734871,
+	.673422675212350441142,
+	.677398823590920073911,
+	.681359224807238206267,
+	.685304003098281100392,
+	.689233281238557538017,
+	.693147180560117703862
+};
+
+static double logF_tail[N+1] = {
+	0.,
+	-.00000000000000543229938420049,
+	 .00000000000000172745674997061,
+	-.00000000000001323017818229233,
+	-.00000000000001154527628289872,
+	-.00000000000000466529469958300,
+	 .00000000000005148849572685810,
+	-.00000000000002532168943117445,
+	-.00000000000005213620639136504,
+	-.00000000000001819506003016881,
+	 .00000000000006329065958724544,
+	 .00000000000008614512936087814,
+	-.00000000000007355770219435028,
+	 .00000000000009638067658552277,
+	 .00000000000007598636597194141,
+	 .00000000000002579999128306990,
+	-.00000000000004654729747598444,
+	-.00000000000007556920687451336,
+	 .00000000000010195735223708472,
+	-.00000000000017319034406422306,
+	-.00000000000007718001336828098,
+	 .00000000000010980754099855238,
+	-.00000000000002047235780046195,
+	-.00000000000008372091099235912,
+	 .00000000000014088127937111135,
+	 .00000000000012869017157588257,
+	 .00000000000017788850778198106,
+	 .00000000000006440856150696891,
+	 .00000000000016132822667240822,
+	-.00000000000007540916511956188,
+	-.00000000000000036507188831790,
+	 .00000000000009120937249914984,
+	 .00000000000018567570959796010,
+	-.00000000000003149265065191483,
+	-.00000000000009309459495196889,
+	 .00000000000017914338601329117,
+	-.00000000000001302979717330866,
+	 .00000000000023097385217586939,
+	 .00000000000023999540484211737,
+	 .00000000000015393776174455408,
+	-.00000000000036870428315837678,
+	 .00000000000036920375082080089,
+	-.00000000000009383417223663699,
+	 .00000000000009433398189512690,
+	 .00000000000041481318704258568,
+	-.00000000000003792316480209314,
+	 .00000000000008403156304792424,
+	-.00000000000034262934348285429,
+	 .00000000000043712191957429145,
+	-.00000000000010475750058776541,
+	-.00000000000011118671389559323,
+	 .00000000000037549577257259853,
+	 .00000000000013912841212197565,
+	 .00000000000010775743037572640,
+	 .00000000000029391859187648000,
+	-.00000000000042790509060060774,
+	 .00000000000022774076114039555,
+	 .00000000000010849569622967912,
+	-.00000000000023073801945705758,
+	 .00000000000015761203773969435,
+	 .00000000000003345710269544082,
+	-.00000000000041525158063436123,
+	 .00000000000032655698896907146,
+	-.00000000000044704265010452446,
+	 .00000000000034527647952039772,
+	-.00000000000007048962392109746,
+	 .00000000000011776978751369214,
+	-.00000000000010774341461609578,
+	 .00000000000021863343293215910,
+	 .00000000000024132639491333131,
+	 .00000000000039057462209830700,
+	-.00000000000026570679203560751,
+	 .00000000000037135141919592021,
+	-.00000000000017166921336082431,
+	-.00000000000028658285157914353,
+	-.00000000000023812542263446809,
+	 .00000000000006576659768580062,
+	-.00000000000028210143846181267,
+	 .00000000000010701931762114254,
+	 .00000000000018119346366441110,
+	 .00000000000009840465278232627,
+	-.00000000000033149150282752542,
+	-.00000000000018302857356041668,
+	-.00000000000016207400156744949,
+	 .00000000000048303314949553201,
+	-.00000000000071560553172382115,
+	 .00000000000088821239518571855,
+	-.00000000000030900580513238244,
+	-.00000000000061076551972851496,
+	 .00000000000035659969663347830,
+	 .00000000000035782396591276383,
+	-.00000000000046226087001544578,
+	 .00000000000062279762917225156,
+	 .00000000000072838947272065741,
+	 .00000000000026809646615211673,
+	-.00000000000010960825046059278,
+	 .00000000000002311949383800537,
+	-.00000000000058469058005299247,
+	-.00000000000002103748251144494,
+	-.00000000000023323182945587408,
+	-.00000000000042333694288141916,
+	-.00000000000043933937969737844,
+	 .00000000000041341647073835565,
+	 .00000000000006841763641591466,
+	 .00000000000047585534004430641,
+	 .00000000000083679678674757695,
+	-.00000000000085763734646658640,
+	 .00000000000021913281229340092,
+	-.00000000000062242842536431148,
+	-.00000000000010983594325438430,
+	 .00000000000065310431377633651,
+	-.00000000000047580199021710769,
+	-.00000000000037854251265457040,
+	 .00000000000040939233218678664,
+	 .00000000000087424383914858291,
+	 .00000000000025218188456842882,
+	-.00000000000003608131360422557,
+	-.00000000000050518555924280902,
+	 .00000000000078699403323355317,
+	-.00000000000067020876961949060,
+	 .00000000000016108575753932458,
+	 .00000000000058527188436251509,
+	-.00000000000035246757297904791,
+	-.00000000000018372084495629058,
+	 .00000000000088606689813494916,
+	 .00000000000066486268071468700,
+	 .00000000000063831615170646519,
+	 .00000000000025144230728376072,
+	-.00000000000017239444525614834
+};
+
+#if 0
+double
+#ifdef _ANSI_SOURCE
+log(double x)
+#else
+log(x) double x;
+#endif
+{
+	int m, j;
+	double F, f, g, q, u, u2, v, zero = 0.0, one = 1.0;
+	volatile double u1;
+
+	/* Catch special cases */
+	if (x <= 0)
+		if (x == zero)	/* log(0) = -Inf */
+			return (-one/zero);
+		else		/* log(neg) = NaN */
+			return (zero/zero);
+	else if (!finite(x))
+		return (x+x);		/* x = NaN, Inf */
+
+	/* Argument reduction: 1 <= g < 2; x/2^m = g;	*/
+	/* y = F*(1 + f/F) for |f| <= 2^-8		*/
+
+	m = logb(x);
+	g = ldexp(x, -m);
+	if (m == -1022) {
+		j = logb(g), m += j;
+		g = ldexp(g, -j);
+	}
+	j = N*(g-1) + .5;
+	F = (1.0/N) * j + 1;	/* F*128 is an integer in [128, 512] */
+	f = g - F;
+
+	/* Approximate expansion for log(1+f/F) ~= u + q */
+	g = 1/(2*F+f);
+	u = 2*f*g;
+	v = u*u;
+	q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
+
+    /* case 1: u1 = u rounded to 2^-43 absolute.  Since u < 2^-8,
+     * 	       u1 has at most 35 bits, and F*u1 is exact, as F has < 8 bits.
+     *         It also adds exactly to |m*log2_hi + log_F_head[j] | < 750
+    */
+	if (m | j)
+		u1 = u + 513, u1 -= 513;
+
+    /* case 2:	|1-x| < 1/256. The m- and j- dependent terms are zero;
+     * 		u1 = u to 24 bits.
+    */
+	else
+		u1 = u, TRUNC(u1);
+	u2 = (2.0*(f - F*u1) - u1*f) * g;
+			/* u1 + u2 = 2f/(2F+f) to extra precision.	*/
+
+	/* log(x) = log(2^m*F*(1+f/F)) =				*/
+	/* (m*log2_hi+logF_head[j]+u1) + (m*log2_lo+logF_tail[j]+q);	*/
+	/* (exact) + (tiny)						*/
+
+	u1 += m*logF_head[N] + logF_head[j];		/* exact */
+	u2 = (u2 + logF_tail[j]) + q;			/* tiny */
+	u2 += logF_tail[N]*m;
+	return (u1 + u2);
+}
+#endif
+
+/*
+ * Extra precision variant, returning struct {double a, b;};
+ * log(x) = a+b to 63 bits, with a rounded to 26 bits.
+ */
+struct Double
+#ifdef _ANSI_SOURCE
+__log__D(double x)
+#else
+__log__D(x) double x;
+#endif
+{
+	int m, j;
+	double F, f, g, q, u, v, u2;
+	volatile double u1;
+	struct Double r;
+
+	/* Argument reduction: 1 <= g < 2; x/2^m = g;	*/
+	/* y = F*(1 + f/F) for |f| <= 2^-8		*/
+
+	m = logb(x);
+	g = ldexp(x, -m);
+	if (m == -1022) {
+		j = logb(g), m += j;
+		g = ldexp(g, -j);
+	}
+	j = N*(g-1) + .5;
+	F = (1.0/N) * j + 1;
+	f = g - F;
+
+	g = 1/(2*F+f);
+	u = 2*f*g;
+	v = u*u;
+	q = u*v*(A1 + v*(A2 + v*(A3 + v*A4)));
+	if (m | j)
+		u1 = u + 513, u1 -= 513;
+	else
+		u1 = u, TRUNC(u1);
+	u2 = (2.0*(f - F*u1) - u1*f) * g;
+
+	u1 += m*logF_head[N] + logF_head[j];
+
+	u2 +=  logF_tail[j]; u2 += q;
+	u2 += logF_tail[N]*m;
+	r.a = u1 + u2;			/* Only difference is here */
+	TRUNC(r.a);
+	r.b = (u1 - r.a) + u2;
+	return (r);
+}
diff --git a/libm/upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c b/libm/upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c
new file mode 100644
index 0000000..1d0af44
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c
@@ -0,0 +1,317 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* @(#)gamma.c	8.1 (Berkeley) 6/4/93 */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * This code by P. McIlroy, Oct 1992;
+ *
+ * The financial support of UUNET Communications Services is greatfully
+ * acknowledged.
+ */
+
+#include <math.h>
+#include "mathimpl.h"
+
+/* METHOD:
+ * x < 0: Use reflection formula, G(x) = pi/(sin(pi*x)*x*G(x))
+ * 	At negative integers, return NaN and raise invalid.
+ *
+ * x < 6.5:
+ *	Use argument reduction G(x+1) = xG(x) to reach the
+ *	range [1.066124,2.066124].  Use a rational
+ *	approximation centered at the minimum (x0+1) to
+ *	ensure monotonicity.
+ *
+ * x >= 6.5: Use the asymptotic approximation (Stirling's formula)
+ *	adjusted for equal-ripples:
+ *
+ *	log(G(x)) ~= (x-.5)*(log(x)-1) + .5(log(2*pi)-1) + 1/x*P(1/(x*x))
+ *
+ *	Keep extra precision in multiplying (x-.5)(log(x)-1), to
+ *	avoid premature round-off.
+ *
+ * Special values:
+ *	-Inf:			return NaN and raise invalid;
+ *	negative integer:	return NaN and raise invalid;
+ *	other x ~< 177.79:	return +-0 and raise underflow;
+ *	+-0:			return +-Inf and raise divide-by-zero;
+ *	finite x ~> 171.63:	return +Inf and raise overflow;
+ *	+Inf:			return +Inf;
+ *	NaN: 			return NaN.
+ *
+ * Accuracy: tgamma(x) is accurate to within
+ *	x > 0:  error provably < 0.9ulp.
+ *	Maximum observed in 1,000,000 trials was .87ulp.
+ *	x < 0:
+ *	Maximum observed error < 4ulp in 1,000,000 trials.
+ */
+
+static double neg_gam(double);
+static double small_gam(double);
+static double smaller_gam(double);
+static struct Double large_gam(double);
+static struct Double ratfun_gam(double, double);
+
+/*
+ * Rational approximation, A0 + x*x*P(x)/Q(x), on the interval
+ * [1.066.., 2.066..] accurate to 4.25e-19.
+ */
+#define LEFT -.3955078125	/* left boundary for rat. approx */
+#define x0 .461632144968362356785	/* xmin - 1 */
+
+#define a0_hi 0.88560319441088874992
+#define a0_lo -.00000000000000004996427036469019695
+#define P0	 6.21389571821820863029017800727e-01
+#define P1	 2.65757198651533466104979197553e-01
+#define P2	 5.53859446429917461063308081748e-03
+#define P3	 1.38456698304096573887145282811e-03
+#define P4	 2.40659950032711365819348969808e-03
+#define Q0	 1.45019531250000000000000000000e+00
+#define Q1	 1.06258521948016171343454061571e+00
+#define Q2	-2.07474561943859936441469926649e-01
+#define Q3	-1.46734131782005422506287573015e-01
+#define Q4	 3.07878176156175520361557573779e-02
+#define Q5	 5.12449347980666221336054633184e-03
+#define Q6	-1.76012741431666995019222898833e-03
+#define Q7	 9.35021023573788935372153030556e-05
+#define Q8	 6.13275507472443958924745652239e-06
+/*
+ * Constants for large x approximation (x in [6, Inf])
+ * (Accurate to 2.8*10^-19 absolute)
+ */
+#define lns2pi_hi 0.418945312500000
+#define lns2pi_lo -.000006779295327258219670263595
+#define Pa0	 8.33333333333333148296162562474e-02
+#define Pa1	-2.77777777774548123579378966497e-03
+#define Pa2	 7.93650778754435631476282786423e-04
+#define Pa3	-5.95235082566672847950717262222e-04
+#define Pa4	 8.41428560346653702135821806252e-04
+#define Pa5	-1.89773526463879200348872089421e-03
+#define Pa6	 5.69394463439411649408050664078e-03
+#define Pa7	-1.44705562421428915453880392761e-02
+
+static const double zero = 0., one = 1.0, tiny = 1e-300;
+
+double
+tgamma(x)
+	double x;
+{
+	struct Double u;
+
+	if (x >= 6) {
+		if(x > 171.63)
+			return (x / zero);
+		u = large_gam(x);
+		return(__exp__D(u.a, u.b));
+	} else if (x >= 1.0 + LEFT + x0)
+		return (small_gam(x));
+	else if (x > 1.e-17)
+		return (smaller_gam(x));
+	else if (x > -1.e-17) {
+		if (x != 0.0)
+			u.a = one - tiny;	/* raise inexact */
+		return (one/x);
+	} else if (!finite(x))
+		return (x - x);		/* x is NaN or -Inf */
+	else
+		return (neg_gam(x));
+}
+/*
+ * Accurate to max(ulp(1/128) absolute, 2^-66 relative) error.
+ */
+static struct Double
+large_gam(x)
+	double x;
+{
+	double z, p;
+	struct Double t, u, v;
+
+	z = one/(x*x);
+	p = Pa0+z*(Pa1+z*(Pa2+z*(Pa3+z*(Pa4+z*(Pa5+z*(Pa6+z*Pa7))))));
+	p = p/x;
+
+	u = __log__D(x);
+	u.a -= one;
+	v.a = (x -= .5);
+	TRUNC(v.a);
+	v.b = x - v.a;
+	t.a = v.a*u.a;			/* t = (x-.5)*(log(x)-1) */
+	t.b = v.b*u.a + x*u.b;
+	/* return t.a + t.b + lns2pi_hi + lns2pi_lo + p */
+	t.b += lns2pi_lo; t.b += p;
+	u.a = lns2pi_hi + t.b; u.a += t.a;
+	u.b = t.a - u.a;
+	u.b += lns2pi_hi; u.b += t.b;
+	return (u);
+}
+/*
+ * Good to < 1 ulp.  (provably .90 ulp; .87 ulp on 1,000,000 runs.)
+ * It also has correct monotonicity.
+ */
+static double
+small_gam(x)
+	double x;
+{
+	double y, ym1, t;
+	struct Double yy, r;
+	y = x - one;
+	ym1 = y - one;
+	if (y <= 1.0 + (LEFT + x0)) {
+		yy = ratfun_gam(y - x0, 0);
+		return (yy.a + yy.b);
+	}
+	r.a = y;
+	TRUNC(r.a);
+	yy.a = r.a - one;
+	y = ym1;
+	yy.b = r.b = y - yy.a;
+	/* Argument reduction: G(x+1) = x*G(x) */
+	for (ym1 = y-one; ym1 > LEFT + x0; y = ym1--, yy.a--) {
+		t = r.a*yy.a;
+		r.b = r.a*yy.b + y*r.b;
+		r.a = t;
+		TRUNC(r.a);
+		r.b += (t - r.a);
+	}
+	/* Return r*tgamma(y). */
+	yy = ratfun_gam(y - x0, 0);
+	y = r.b*(yy.a + yy.b) + r.a*yy.b;
+	y += yy.a*r.a;
+	return (y);
+}
+/*
+ * Good on (0, 1+x0+LEFT].  Accurate to 1ulp.
+ */
+static double
+smaller_gam(x)
+	double x;
+{
+	double t, d;
+	struct Double r, xx;
+	if (x < x0 + LEFT) {
+		t = x, TRUNC(t);
+		d = (t+x)*(x-t);
+		t *= t;
+		xx.a = (t + x), TRUNC(xx.a);
+		xx.b = x - xx.a; xx.b += t; xx.b += d;
+		t = (one-x0); t += x;
+		d = (one-x0); d -= t; d += x;
+		x = xx.a + xx.b;
+	} else {
+		xx.a =  x, TRUNC(xx.a);
+		xx.b = x - xx.a;
+		t = x - x0;
+		d = (-x0 -t); d += x;
+	}
+	r = ratfun_gam(t, d);
+	d = r.a/x, TRUNC(d);
+	r.a -= d*xx.a; r.a -= d*xx.b; r.a += r.b;
+	return (d + r.a/x);
+}
+/*
+ * returns (z+c)^2 * P(z)/Q(z) + a0
+ */
+static struct Double
+ratfun_gam(z, c)
+	double z, c;
+{
+	double p, q;
+	struct Double r, t;
+
+	q = Q0 +z*(Q1+z*(Q2+z*(Q3+z*(Q4+z*(Q5+z*(Q6+z*(Q7+z*Q8)))))));
+	p = P0 + z*(P1 + z*(P2 + z*(P3 + z*P4)));
+
+	/* return r.a + r.b = a0 + (z+c)^2*p/q, with r.a truncated to 26 bits. */
+	p = p/q;
+	t.a = z, TRUNC(t.a);		/* t ~= z + c */
+	t.b = (z - t.a) + c;
+	t.b *= (t.a + z);
+	q = (t.a *= t.a);		/* t = (z+c)^2 */
+	TRUNC(t.a);
+	t.b += (q - t.a);
+	r.a = p, TRUNC(r.a);		/* r = P/Q */
+	r.b = p - r.a;
+	t.b = t.b*p + t.a*r.b + a0_lo;
+	t.a *= r.a;			/* t = (z+c)^2*(P/Q) */
+	r.a = t.a + a0_hi, TRUNC(r.a);
+	r.b = ((a0_hi-r.a) + t.a) + t.b;
+	return (r);			/* r = a0 + t */
+}
+
+static double
+neg_gam(x)
+	double x;
+{
+	int sgn = 1;
+	struct Double lg, lsine;
+	double y, z;
+
+	y = ceil(x);
+	if (y == x)		/* Negative integer. */
+		return ((x - x) / zero);
+	z = y - x;
+	if (z > 0.5)
+		z = one - z;
+	y = 0.5 * y;
+	if (y == ceil(y))
+		sgn = -1;
+	if (z < .25)
+		z = sin(M_PI*z);
+	else
+		z = cos(M_PI*(0.5-z));
+	/* Special case: G(1-x) = Inf; G(x) may be nonzero. */
+	if (x < -170) {
+		if (x < -190)
+			return ((double)sgn*tiny*tiny);
+		y = one - x;		/* exact: 128 < |x| < 255 */
+		lg = large_gam(y);
+		lsine = __log__D(M_PI/z);	/* = TRUNC(log(u)) + small */
+		lg.a -= lsine.a;		/* exact (opposite signs) */
+		lg.b -= lsine.b;
+		y = -(lg.a + lg.b);
+		z = (y + lg.a) + lg.b;
+		y = __exp__D(y, z);
+		if (sgn < 0) y = -y;
+		return (y);
+	}
+	y = one-x;
+	if (one-y == x)
+		y = tgamma(y);
+	else		/* 1-x is inexact */
+		y = -x*tgamma(-x);
+	if (sgn < 0) y = -y;
+	return (M_PI / (y*z));
+}
diff --git a/libm/upstream-freebsd/lib/msun/bsdsrc/mathimpl.h b/libm/upstream-freebsd/lib/msun/bsdsrc/mathimpl.h
new file mode 100644
index 0000000..04a4b6e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/bsdsrc/mathimpl.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1988, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)mathimpl.h	8.1 (Berkeley) 6/4/93
+ * $FreeBSD$
+ */
+
+#ifndef _MATHIMPL_H_
+#define	_MATHIMPL_H_
+
+#include <sys/cdefs.h>
+#include <math.h>
+
+#include "../src/math_private.h"
+
+/*
+ * TRUNC() is a macro that sets the trailing 27 bits in the mantissa of an
+ * IEEE double variable to zero.  It must be expression-like for syntactic
+ * reasons, and we implement this expression using an inline function
+ * instead of a pure macro to avoid depending on the gcc feature of
+ * statement-expressions.
+ */
+#define	TRUNC(d)	(_b_trunc(&(d)))
+
+static __inline void
+_b_trunc(volatile double *_dp)
+{
+	uint32_t _lw;
+
+	GET_LOW_WORD(_lw, *_dp);
+	SET_LOW_WORD(*_dp, _lw & 0xf8000000);
+}
+
+struct Double {
+	double	a;
+	double	b;
+};
+
+/*
+ * Functions internal to the math package, yet not static.
+ */
+double	__exp__D(double, double);
+struct Double __log__D(double);
+
+#endif /* !_MATHIMPL_H_ */
diff --git a/libm/upstream-freebsd/lib/msun/ld128/e_lgammal_r.c b/libm/upstream-freebsd/lib/msun/ld128/e_lgammal_r.c
new file mode 100644
index 0000000..53d3af1
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/e_lgammal_r.c
@@ -0,0 +1,330 @@
+/* @(#)e_lgamma_r.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_lgamma_r.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double vzero = 0;
+
+static const double
+zero=  0,
+half=  0.5,
+one =  1;
+
+static const long double
+pi  =  3.14159265358979323846264338327950288e+00L;
+/*
+ * Domain y in [0x1p-119, 0.28], range ~[-1.4065e-36, 1.4065e-36]:
+ * |(lgamma(2 - y) + y / 2) / y - a(y)| < 2**-119.1
+ */
+static const long double
+a0  =  7.72156649015328606065120900824024296e-02L,
+a1  =  3.22467033424113218236207583323018498e-01L,
+a2  =  6.73523010531980951332460538330282217e-02L,
+a3  =  2.05808084277845478790009252803463129e-02L,
+a4  =  7.38555102867398526627292839296001626e-03L,
+a5  =  2.89051033074152328576829509522483468e-03L,
+a6  =  1.19275391170326097618357349881842913e-03L,
+a7  =  5.09669524743042462515256340206203019e-04L,
+a8  =  2.23154758453578096143609255559576017e-04L,
+a9  =  9.94575127818397632126978731542755129e-05L,
+a10 =  4.49262367375420471287545895027098145e-05L,
+a11 =  2.05072127845117995426519671481628849e-05L,
+a12 =  9.43948816959096748454087141447939513e-06L,
+a13 =  4.37486780697359330303852050718287419e-06L,
+a14 =  2.03920783892362558276037363847651809e-06L,
+a15 =  9.55191070057967287877923073200324649e-07L,
+a16 =  4.48993286185740853170657139487620560e-07L,
+a17 =  2.13107543597620911675316728179563522e-07L,
+a18 =  9.70745379855304499867546549551023473e-08L,
+a19 =  5.61889970390290257926487734695402075e-08L,
+a20 =  6.42739653024130071866684358960960951e-09L,
+a21 =  3.34491062143649291746195612991870119e-08L,
+a22 = -1.57068547394315223934653011440641472e-08L,
+a23 =  1.30812825422415841213733487745200632e-08L;
+/*
+ * Domain x in [tc-0.24, tc+0.28], range ~[-6.3201e-37, 6.3201e-37]:
+ * |(lgamma(x) - tf) - t(x - tc)| < 2**-120.3.
+ */
+static const long double
+tc  =  1.46163214496836234126265954232572133e+00L,
+tf  = -1.21486290535849608095514557177691584e-01L,
+tt  =  1.57061739945077675484237837992951704e-36L,
+t0  = -1.99238329499314692728655623767019240e-36L,
+t1  = -6.08453430711711404116887457663281416e-35L,
+t2  =  4.83836122723810585213722380854828904e-01L,
+t3  = -1.47587722994530702030955093950668275e-01L,
+t4  =  6.46249402389127526561003464202671923e-02L,
+t5  = -3.27885410884813055008502586863748063e-02L,
+t6  =  1.79706751152103942928638276067164935e-02L,
+t7  = -1.03142230366363872751602029672767978e-02L,
+t8  =  6.10053602051788840313573150785080958e-03L,
+t9  = -3.68456960831637325470641021892968954e-03L,
+t10 =  2.25976482322181046611440855340968560e-03L,
+t11 = -1.40225144590445082933490395950664961e-03L,
+t12 =  8.78232634717681264035014878172485575e-04L,
+t13 = -5.54194952796682301220684760591403899e-04L,
+t14 =  3.51912956837848209220421213975000298e-04L,
+t15 = -2.24653443695947456542669289367055542e-04L,
+t16 =  1.44070395420840737695611929680511823e-04L,
+t17 = -9.27609865550394140067059487518862512e-05L,
+t18 =  5.99347334438437081412945428365433073e-05L,
+t19 = -3.88458388854572825603964274134801009e-05L,
+t20 =  2.52476631610328129217896436186551043e-05L,
+t21 = -1.64508584981658692556994212457518536e-05L,
+t22 =  1.07434583475987007495523340296173839e-05L,
+t23 = -7.03070407519397260929482550448878399e-06L,
+t24 =  4.60968590693753579648385629003100469e-06L,
+t25 = -3.02765473778832036018438676945512661e-06L,
+t26 =  1.99238771545503819972741288511303401e-06L,
+t27 = -1.31281299822614084861868817951788579e-06L,
+t28 =  8.60844432267399655055574642052370223e-07L,
+t29 = -5.64535486432397413273248363550536374e-07L,
+t30 =  3.99357783676275660934903139592727737e-07L,
+t31 = -2.95849029193433121795495215869311610e-07L,
+t32 =  1.37790144435073124976696250804940384e-07L;
+/*
+ * Domain y in [-0.1, 0.232], range ~[-1.4046e-37, 1.4181e-37]:
+ * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-122.8
+ */
+static const long double
+u0  = -7.72156649015328606065120900824024311e-02L,
+u1  =  4.24082772271938167430983113242482656e-01L,
+u2  =  2.96194003481457101058321977413332171e+00L,
+u3  =  6.49503267711258043997790983071543710e+00L,
+u4  =  7.40090051288150177152835698948644483e+00L,
+u5  =  4.94698036296756044610805900340723464e+00L,
+u6  =  2.00194224610796294762469550684947768e+00L,
+u7  =  4.82073087750608895996915051568834949e-01L,
+u8  =  6.46694052280506568192333848437585427e-02L,
+u9  =  4.17685526755100259316625348933108810e-03L,
+u10 =  9.06361003550314327144119307810053410e-05L,
+v1  =  5.15937098592887275994320496999951947e+00L,
+v2  =  1.14068418766251486777604403304717558e+01L,
+v3  =  1.41164839437524744055723871839748489e+01L,
+v4  =  1.07170702656179582805791063277960532e+01L,
+v5  =  5.14448694179047879915042998453632434e+00L,
+v6  =  1.55210088094585540637493826431170289e+00L,
+v7  =  2.82975732849424562719893657416365673e-01L,
+v8  =  2.86424622754753198010525786005443539e-02L,
+v9  =  1.35364253570403771005922441442688978e-03L,
+v10 =  1.91514173702398375346658943749580666e-05L,
+v11 = -3.25364686890242327944584691466034268e-08L;
+/*
+ * Domain x in (2, 3], range ~[-1.3341e-36, 1.3536e-36]:
+ * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-120.1
+ * with y = x - 2.
+ */
+static const long double
+s0  = -7.72156649015328606065120900824024297e-02L,
+s1  =  1.23221687850916448903914170805852253e-01L,
+s2  =  5.43673188699937239808255378293820020e-01L,
+s3  =  6.31998137119005233383666791176301800e-01L,
+s4  =  3.75885340179479850993811501596213763e-01L,
+s5  =  1.31572908743275052623410195011261575e-01L,
+s6  =  2.82528453299138685507186287149699749e-02L,
+s7  =  3.70262021550340817867688714880797019e-03L,
+s8  =  2.83374000312371199625774129290973648e-04L,
+s9  =  1.15091830239148290758883505582343691e-05L,
+s10 =  2.04203474281493971326506384646692446e-07L,
+s11 =  9.79544198078992058548607407635645763e-10L,
+r1  =  2.58037466655605285937112832039537492e+00L,
+r2  =  2.86289413392776399262513849911531180e+00L,
+r3  =  1.78691044735267497452847829579514367e+00L,
+r4  =  6.89400381446725342846854215600008055e-01L,
+r5  =  1.70135865462567955867134197595365343e-01L,
+r6  =  2.68794816183964420375498986152766763e-02L,
+r7  =  2.64617234244861832870088893332006679e-03L,
+r8  =  1.52881761239180800640068128681725702e-04L,
+r9  =  4.63264813762296029824851351257638558e-06L,
+r10 =  5.89461519146957343083848967333671142e-08L,
+r11 =  1.79027678176582527798327441636552968e-10L;
+/*
+ * Domain z in [8, 0x1p70], range ~[-9.8214e-35, 9.8214e-35]:
+ * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-113.0
+ */
+static const long double
+w0  =  4.18938533204672741780329736405617738e-01L,
+w1  =  8.33333333333333333333333333332852026e-02L,
+w2  = -2.77777777777777777777777727810123528e-03L,
+w3  =  7.93650793650793650791708939493907380e-04L,
+w4  = -5.95238095238095234390450004444370959e-04L,
+w5  =  8.41750841750837633887817658848845695e-04L,
+w6  = -1.91752691752396849943172337347259743e-03L,
+w7  =  6.41025640880333069429106541459015557e-03L,
+w8  = -2.95506530801732133437990433080327074e-02L,
+w9  =  1.79644237328444101596766586979576927e-01L,
+w10 = -1.39240539108367641920172649259736394e+00L,
+w11 =  1.33987701479007233325288857758641761e+01L,
+w12 = -1.56363596431084279780966590116006255e+02L,
+w13 =  2.14830978044410267201172332952040777e+03L,
+w14 = -3.28636067474227378352761516589092334e+04L,
+w15 =  5.06201257747865138432663574251462485e+05L,
+w16 = -6.79720123352023636706247599728048344e+06L,
+w17 =  6.57556601705472106989497289465949255e+07L,
+w18 = -3.26229058141181783534257632389415580e+08L;
+
+static long double
+sin_pil(long double x)
+{
+	volatile long double vz;
+	long double y,z;
+	uint64_t lx, n;
+	uint16_t hx;
+
+	y = -x;
+
+	vz = y+0x1.p112;
+	z = vz-0x1.p112;
+	if (z == y)
+	    return zero;
+
+	vz = y+0x1.p110;
+	EXTRACT_LDBL128_WORDS(hx,lx,n,vz);
+	z = vz-0x1.p110;
+	if (z > y) {
+	    z -= 0.25;
+	    n--;
+	}
+	n &= 7;
+	y = y - z + n * 0.25;
+
+	switch (n) {
+	    case 0:   y =  __kernel_sinl(pi*y,zero,0); break;
+	    case 1:
+	    case 2:   y =  __kernel_cosl(pi*(0.5-y),zero); break;
+	    case 3:
+	    case 4:   y =  __kernel_sinl(pi*(one-y),zero,0); break;
+	    case 5:
+	    case 6:   y = -__kernel_cosl(pi*(y-1.5),zero); break;
+	    default:  y =  __kernel_sinl(pi*(y-2.0),zero,0); break;
+	    }
+	return -y;
+}
+
+long double
+lgammal_r(long double x, int *signgamp)
+{
+	long double nadj,p,p1,p2,p3,q,r,t,w,y,z;
+	uint64_t llx,lx;
+	int i;
+	uint16_t hx,ix;
+
+	EXTRACT_LDBL128_WORDS(hx,lx,llx,x);
+
+    /* purge +-Inf and NaNs */
+	*signgamp = 1;
+	ix = hx&0x7fff;
+	if(ix==0x7fff) return x*x;
+
+   /* purge +-0 and tiny arguments */
+	*signgamp = 1-2*(hx>>15);
+	if(ix<0x3fff-116) {		/* |x|<2**-(p+3), return -log(|x|) */
+	    if((ix|lx|llx)==0)
+		return one/vzero;
+	    return -logl(fabsl(x));
+	}
+
+    /* purge negative integers and start evaluation for other x < 0 */
+	if(hx&0x8000) {
+	    *signgamp = 1;
+	    if(ix>=0x3fff+112) 		/* |x|>=2**(p-1), must be -integer */
+		return one/vzero;
+	    t = sin_pil(x);
+	    if(t==zero) return one/vzero;
+	    nadj = logl(pi/fabsl(t*x));
+	    if(t<zero) *signgamp = -1;
+	    x = -x;
+	}
+
+    /* purge 1 and 2 */
+	if((ix==0x3fff || ix==0x4000) && (lx|llx)==0) r = 0;
+    /* for x < 2.0 */
+	else if(ix<0x4000) {
+	    if(x<=8.9999961853027344e-01) {
+		r = -logl(x);
+		if(x>=7.3159980773925781e-01) {y = 1-x; i= 0;}
+		else if(x>=2.3163998126983643e-01) {y= x-(tc-1); i=1;}
+	  	else {y = x; i=2;}
+	    } else {
+		r = 0;
+	        if(x>=1.7316312789916992e+00) {y=2-x;i=0;}
+	        else if(x>=1.2316322326660156e+00) {y=x-tc;i=1;}
+		else {y=x-1;i=2;}
+	    }
+	    switch(i) {
+	      case 0:
+		z = y*y;
+		p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*(a10+z*(a12+z*(a14+z*(a16+
+		    z*(a18+z*(a20+z*a22))))))))));
+		p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*(a11+z*(a13+z*(a15+
+		    z*(a17+z*(a19+z*(a21+z*a23)))))))))));
+		p  = y*p1+p2;
+		r  += p-y/2; break;
+	      case 1:
+		p = t0+y*t1+tt+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*(t7+y*(t8+
+		    y*(t9+y*(t10+y*(t11+y*(t12+y*(t13+y*(t14+y*(t15+y*(t16+
+		    y*(t17+y*(t18+y*(t19+y*(t20+y*(t21+y*(t22+y*(t23+
+		    y*(t24+y*(t25+y*(t26+y*(t27+y*(t28+y*(t29+y*(t30+
+		    y*(t31+y*t32))))))))))))))))))))))))))))));
+		r += tf + p; break;
+	      case 2:
+		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*(u5+y*(u6+y*(u7+
+		    y*(u8+y*(u9+y*u10))))))))));
+		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*(v5+y*(v6+y*(v7+
+		    y*(v8+y*(v9+y*(v10+y*v11))))))))));
+		r += p1/p2-y/2;
+	    }
+	}
+    /* x < 8.0 */
+	else if(ix<0x4002) {
+	    i = x;
+	    y = x-i;
+	    p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*(s6+y*(s7+y*(s8+
+		y*(s9+y*(s10+y*s11)))))))))));
+	    q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*(r6+y*(r7+y*(r8+
+		y*(r9+y*(r10+y*r11))))))))));
+	    r = y/2+p/q;
+	    z = 1;	/* lgamma(1+s) = log(s) + lgamma(s) */
+	    switch(i) {
+	    case 7: z *= (y+6);		/* FALLTHRU */
+	    case 6: z *= (y+5);		/* FALLTHRU */
+	    case 5: z *= (y+4);		/* FALLTHRU */
+	    case 4: z *= (y+3);		/* FALLTHRU */
+	    case 3: z *= (y+2);		/* FALLTHRU */
+		    r += logl(z); break;
+	    }
+    /* 8.0 <= x < 2**(p+3) */
+	} else if (ix<0x3fff+116) {
+	    t = logl(x);
+	    z = one/x;
+	    y = z*z;
+	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*(w6+y*(w7+y*(w8+
+		y*(w9+y*(w10+y*(w11+y*(w12+y*(w13+y*(w14+y*(w15+y*(w16+
+		y*(w17+y*w18)))))))))))))))));
+	    r = (x-half)*(t-one)+w;
+    /* 2**(p+3) <= x <= inf */
+	} else 
+	    r =  x*(logl(x)-1);
+	if(hx&0x8000) r = nadj - r;
+	return r;
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/e_rem_pio2l.h b/libm/upstream-freebsd/lib/msun/ld128/e_rem_pio2l.h
new file mode 100644
index 0000000..5d78c4d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/e_rem_pio2l.h
@@ -0,0 +1,140 @@
+/* From: @(#)e_rem_pio2.c 1.4 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* ld128 version of __ieee754_rem_pio2l(x,y)
+ * 
+ * return the remainder of x rem pi/2 in y[0]+y[1] 
+ * use __kernel_rem_pio2()
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+#include "fpmath.h"
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+/*
+ * XXX need to verify that nonzero integer multiples of pi/2 within the
+ * range get no closer to a long double than 2**-140, or that
+ * ilogb(x) + ilogb(min_delta) < 45 - -140.
+ */
+/*
+ * invpio2:  113 bits of 2/pi
+ * pio2_1:   first  68 bits of pi/2
+ * pio2_1t:  pi/2 - pio2_1
+ * pio2_2:   second 68 bits of pi/2
+ * pio2_2t:  pi/2 - (pio2_1+pio2_2)
+ * pio2_3:   third  68 bits of pi/2
+ * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const double
+zero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+two24 =  1.67772160000000000000e+07; /* 0x41700000, 0x00000000 */
+
+static const long double
+invpio2 =  6.3661977236758134307553505349005747e-01L,	/*  0x145f306dc9c882a53f84eafa3ea6a.0p-113 */
+pio2_1  =  1.5707963267948966192292994253909555e+00L,	/*  0x1921fb54442d18469800000000000.0p-112 */
+pio2_1t =  2.0222662487959507323996846200947577e-21L,	/*  0x13198a2e03707344a4093822299f3.0p-181 */
+pio2_2  =  2.0222662487959507323994779168837751e-21L,	/*  0x13198a2e03707344a400000000000.0p-181 */
+pio2_2t =  2.0670321098263988236496903051604844e-43L,	/*  0x127044533e63a0105df531d89cd91.0p-254 */
+pio2_3  =  2.0670321098263988236499468110329591e-43L,	/*  0x127044533e63a0105e00000000000.0p-254 */
+pio2_3t = -2.5650587247459238361625433492959285e-65L;	/* -0x159c4ec64ddaeb5f78671cbfb2210.0p-327 */
+
+static inline __always_inline int
+__ieee754_rem_pio2l(long double x, long double *y)
+{
+	union IEEEl2bits u,u1;
+	long double z,w,t,r,fn;
+	double tx[5],ty[3];
+	int64_t n;
+	int e0,ex,i,j,nx;
+	int16_t expsign;
+
+	u.e = x;
+	expsign = u.xbits.expsign;
+	ex = expsign & 0x7fff;
+	if (ex < BIAS + 45 || ex == BIAS + 45 &&
+	    u.bits.manh < 0x921fb54442d1LL) {
+	    /* |x| ~< 2^45*(pi/2), medium size */
+	    /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
+	    fn = x*invpio2+0x1.8p112;
+	    fn = fn-0x1.8p112;
+#ifdef HAVE_EFFICIENT_I64RINT
+	    n  = i64rint(fn);
+#else
+	    n  = fn;
+#endif
+	    r  = x-fn*pio2_1;
+	    w  = fn*pio2_1t;	/* 1st round good to 180 bit */
+	    {
+		union IEEEl2bits u2;
+	        int ex1;
+	        j  = ex;
+	        y[0] = r-w; 
+		u2.e = y[0];
+		ex1 = u2.xbits.expsign & 0x7fff;
+	        i = j-ex1;
+	        if(i>51) {  /* 2nd iteration needed, good to 248 */
+		    t  = r;
+		    w  = fn*pio2_2;	
+		    r  = t-w;
+		    w  = fn*pio2_2t-((t-r)-w);	
+		    y[0] = r-w;
+		    u2.e = y[0];
+		    ex1 = u2.xbits.expsign & 0x7fff;
+		    i = j-ex1;
+		    if(i>119) {	/* 3rd iteration need, 316 bits acc */
+		    	t  = r;	/* will cover all possible cases */
+		    	w  = fn*pio2_3;	
+		    	r  = t-w;
+		    	w  = fn*pio2_3t-((t-r)-w);	
+		    	y[0] = r-w;
+		    }
+		}
+	    }
+	    y[1] = (r-y[0])-w;
+	    return n;
+	}
+    /* 
+     * all other (large) arguments
+     */
+	if(ex==0x7fff) {		/* x is inf or NaN */
+	    y[0]=y[1]=x-x; return 0;
+	}
+    /* set z = scalbn(|x|,ilogb(x)-23) */
+	u1.e = x;
+	e0 = ex - BIAS - 23;		/* e0 = ilogb(|x|)-23; */
+	u1.xbits.expsign = ex - e0;
+	z = u1.e;
+	for(i=0;i<4;i++) {
+		tx[i] = (double)((int32_t)(z));
+		z     = (z-tx[i])*two24;
+	}
+	tx[4] = z;
+	nx = 5;
+	while(tx[nx-1]==zero) nx--;	/* skip zero term */
+	n  =  __kernel_rem_pio2(tx,ty,e0,nx,3);
+	t = (long double)ty[2] + ty[1];
+	r = t + ty[0];
+	w = ty[0] - (r - t);
+	if(expsign<0) {y[0] = -r; y[1] = -w; return -n;}
+	y[0] = r; y[1] = w; return n;
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/invtrig.c b/libm/upstream-freebsd/lib/msun/ld128/invtrig.c
new file mode 100644
index 0000000..4ceca8a
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/invtrig.c
@@ -0,0 +1,100 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "invtrig.h"
+
+/*
+ * asinl() and acosl()
+ */
+const long double
+pS0 =  1.66666666666666666666666666666700314e-01L,
+pS1 = -7.32816946414566252574527475428622708e-01L,
+pS2 =  1.34215708714992334609030036562143589e+00L,
+pS3 = -1.32483151677116409805070261790752040e+00L,
+pS4 =  7.61206183613632558824485341162121989e-01L,
+pS5 = -2.56165783329023486777386833928147375e-01L,
+pS6 =  4.80718586374448793411019434585413855e-02L,
+pS7 = -4.42523267167024279410230886239774718e-03L,
+pS8 =  1.44551535183911458253205638280410064e-04L,
+pS9 = -2.10558957916600254061591040482706179e-07L,
+qS1 = -4.84690167848739751544716485245697428e+00L,
+qS2 =  9.96619113536172610135016921140206980e+00L,
+qS3 = -1.13177895428973036660836798461641458e+01L,
+qS4 =  7.74004374389488266169304117714658761e+00L,
+qS5 = -3.25871986053534084709023539900339905e+00L,
+qS6 =  8.27830318881232209752469022352928864e-01L,
+qS7 = -1.18768052702942805423330715206348004e-01L,
+qS8 =  8.32600764660522313269101537926539470e-03L,
+qS9 = -1.99407384882605586705979504567947007e-04L;
+
+/*
+ * atanl()
+ */
+const long double atanhi[] = {
+	 4.63647609000806116214256231461214397e-01L,
+	 7.85398163397448309615660845819875699e-01L,       
+	 9.82793723247329067985710611014666038e-01L,       
+	 1.57079632679489661923132169163975140e+00L,
+};
+
+const long double atanlo[] = {
+	 4.89509642257333492668618435220297706e-36L,
+	 2.16795253253094525619926100651083806e-35L,
+	-2.31288434538183565909319952098066272e-35L,
+	 4.33590506506189051239852201302167613e-35L,
+};
+
+const long double aT[] = {
+	 3.33333333333333333333333333333333125e-01L,
+	-1.99999999999999999999999999999180430e-01L,
+	 1.42857142857142857142857142125269827e-01L,
+	-1.11111111111111111111110834490810169e-01L,
+	 9.09090909090909090908522355708623681e-02L,
+	-7.69230769230769230696553844935357021e-02L,
+	 6.66666666666666660390096773046256096e-02L,
+	-5.88235294117646671706582985209643694e-02L,
+	 5.26315789473666478515847092020327506e-02L,
+	-4.76190476189855517021024424991436144e-02L,
+	 4.34782608678695085948531993458097026e-02L,
+	-3.99999999632663469330634215991142368e-02L,
+	 3.70370363987423702891250829918659723e-02L,
+	-3.44827496515048090726669907612335954e-02L,
+	 3.22579620681420149871973710852268528e-02L,
+	-3.03020767654269261041647570626778067e-02L,
+	 2.85641979882534783223403715930946138e-02L,
+	-2.69824879726738568189929461383741323e-02L,
+	 2.54194698498808542954187110873675769e-02L,
+	-2.35083879708189059926183138130183215e-02L,
+	 2.04832358998165364349957325067131428e-02L,
+	-1.54489555488544397858507248612362957e-02L,
+	 8.64492360989278761493037861575248038e-03L,
+	-2.58521121597609872727919154569765469e-03L,
+};
+
+const long double pi_lo = 8.67181013012378102479704402604335225e-35L;
diff --git a/libm/upstream-freebsd/lib/msun/ld128/invtrig.h b/libm/upstream-freebsd/lib/msun/ld128/invtrig.h
new file mode 100644
index 0000000..12f598b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/invtrig.h
@@ -0,0 +1,113 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+
+#define	BIAS		(LDBL_MAX_EXP - 1)
+#define	MANH_SIZE	(LDBL_MANH_SIZE + 1)
+
+/* Approximation thresholds. */
+#define	ASIN_LINEAR	(BIAS - 56)	/* 2**-56 */
+#define	ACOS_CONST	(BIAS - 113)	/* 2**-113 */
+#define	ATAN_CONST	(BIAS + 113)	/* 2**113 */
+#define	ATAN_LINEAR	(BIAS - 56)	/* 2**-56 */
+
+/* 0.95 */
+#define	THRESH	((0xe666666666666666ULL>>(64-(MANH_SIZE-1)))|LDBL_NBIT)
+
+/* Constants shared by the long double inverse trig functions. */
+#define	pS0	_ItL_pS0
+#define	pS1	_ItL_pS1
+#define	pS2	_ItL_pS2
+#define	pS3	_ItL_pS3
+#define	pS4	_ItL_pS4
+#define	pS5	_ItL_pS5
+#define	pS6	_ItL_pS6
+#define	pS7	_ItL_pS7
+#define	pS8	_ItL_pS8
+#define	pS9	_ItL_pS9
+#define	qS1	_ItL_qS1
+#define	qS2	_ItL_qS2
+#define	qS3	_ItL_qS3
+#define	qS4	_ItL_qS4
+#define	qS5	_ItL_qS5
+#define	qS6	_ItL_qS6
+#define	qS7	_ItL_qS7
+#define	qS8	_ItL_qS8
+#define	qS9	_ItL_qS9
+#define	atanhi	_ItL_atanhi
+#define	atanlo	_ItL_atanlo
+#define	aT	_ItL_aT
+#define	pi_lo	_ItL_pi_lo
+
+#define	pio2_hi	atanhi[3]
+#define	pio2_lo	atanlo[3]
+#define	pio4_hi	atanhi[1]
+
+/* Constants shared by the long double inverse trig functions. */
+extern const long double pS0, pS1, pS2, pS3, pS4, pS5, pS6, pS7, pS8, pS9;
+extern const long double qS1, qS2, qS3, qS4, qS5, qS6, qS7, qS8, qS9;
+extern const long double atanhi[], atanlo[], aT[];
+extern const long double pi_lo;
+
+static inline long double
+P(long double x)
+{
+
+	return (x * (pS0 + x * (pS1 + x * (pS2 + x * (pS3 + x * \
+		(pS4 + x * (pS5 + x * (pS6 + x * (pS7 + x * (pS8 + x * \
+		pS9))))))))));
+}
+
+static inline long double
+Q(long double x)
+{
+
+	return (1.0 + x * (qS1 + x * (qS2 + x * (qS3 + x * (qS4 + x * \
+		(qS5 + x * (qS6 + x * (qS7 + x * (qS8 + x * qS9)))))))));
+}
+
+static inline long double
+T_even(long double x)
+{
+
+	return (aT[0] + x * (aT[2] + x * (aT[4] + x * (aT[6] + x * \
+		(aT[8] + x * (aT[10] + x * (aT[12] + x * (aT[14] + x * \
+		(aT[16] + x * (aT[18] + x * (aT[20] + x * aT[22])))))))))));
+}
+
+static inline long double
+T_odd(long double x)
+{
+
+	return (aT[1] + x * (aT[3] + x * (aT[5] + x * (aT[7] + x * \
+		(aT[9] + x * (aT[11] + x * (aT[13] + x * (aT[15] + x * \
+		(aT[17] + x * (aT[19] + x * (aT[21] + x * aT[23])))))))))));
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/k_cosl.c b/libm/upstream-freebsd/lib/msun/ld128/k_cosl.c
new file mode 100644
index 0000000..fe57773
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/k_cosl.c
@@ -0,0 +1,61 @@
+/* From: @(#)k_cos.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_cos.c.  See ../src/k_cos.c for most comments.
+ */
+
+#include "math_private.h"
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.80e-37, 1.79e-37]:
+ * |cos(x) - c(x))| < 2**-122.0
+ *
+ * 113-bit precision requires more care than 64-bit precision, since
+ * simple methods give a minimax polynomial with coefficient for x^2
+ * that is 1 ulp below 0.5, but we want it to be precisely 0.5.  See
+ * ../ld80/k_cosl.c for more details.
+ */
+static const double
+one = 1.0;
+
+static const long double
+C1 =  0.04166666666666666666666666666666658424671L,
+C2 = -0.001388888888888888888888888888863490893732L,
+C3 =  0.00002480158730158730158730158600795304914210L,
+C4 = -0.2755731922398589065255474947078934284324e-6L,
+C5 =  0.2087675698786809897659225313136400793948e-8L,
+C6 = -0.1147074559772972315817149986812031204775e-10L,
+C7 =  0.4779477332386808976875457937252120293400e-13L;
+
+static const double
+C8 = -0.1561920696721507929516718307820958119868e-15,
+C9 =  0.4110317413744594971475941557607804508039e-18,
+C10 = -0.8896592467191938803288521958313920156409e-21,
+C11 =  0.1601061435794535138244346256065192782581e-23;
+
+long double
+__kernel_cosl(long double x, long double y)
+{
+	long double hz,z,r,w;
+
+	z  = x*x;
+	r  = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*(C6+z*(C7+
+	    z*(C8+z*(C9+z*(C10+z*C11))))))))));
+	hz = 0.5*z;
+	w  = one-hz;
+	return w + (((one-w)-hz) + (z*r-x*y));
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/k_expl.h b/libm/upstream-freebsd/lib/msun/ld128/k_expl.h
new file mode 100644
index 0000000..e843d43
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/k_expl.h
@@ -0,0 +1,328 @@
+/* from: FreeBSD: head/lib/msun/ld128/s_expl.c 251345 2013-06-03 20:09:22Z kargl */
+
+/*-
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/ld128/k_expl.h 275819 2014-12-16 09:21:56Z ed $");
+
+/*
+ * ld128 version of k_expl.h.  See ../ld80/s_expl.c for most comments.
+ *
+ * See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
+ * about the secondary kernels.
+ */
+
+#define	INTERVALS	128
+#define	LOG2_INTERVALS	7
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const double
+/*
+ * ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication).  L1 must
+ * have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
+ * bits zero so that multiplication of it by n is exact.
+ */
+INV_L = 1.8466496523378731e+2,		/*  0x171547652b82fe.0p-45 */
+L2 = -1.0253670638894731e-29;		/* -0x1.9ff0342542fc3p-97 */
+static const long double
+/* 0x1.62e42fefa39ef35793c768000000p-8 */
+L1 =  5.41521234812457272982212595914567508e-3L;
+
+/*
+ * XXX values in hex in comments have been lost (or were never present)
+ * from here.
+ */
+static const long double
+/*
+ * Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
+ * |exp(x) - p(x)| < 2**-124.9
+ * (0.002708 is ln2/(2*INTERVALS) rounded up a little).
+ *
+ * XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
+ */
+A2  =  0.5,
+A3  =  1.66666666666666666666666666651085500e-1L,
+A4  =  4.16666666666666666666666666425885320e-2L,
+A5  =  8.33333333333333333334522877160175842e-3L,
+A6  =  1.38888888888888888889971139751596836e-3L;
+
+static const double
+A7  =  1.9841269841269470e-4,		/*  0x1.a01a01a019f91p-13 */
+A8  =  2.4801587301585286e-5,		/*  0x1.71de3ec75a967p-19 */
+A9  =  2.7557324277411235e-6,		/*  0x1.71de3ec75a967p-19 */
+A10 =  2.7557333722375069e-7;		/*  0x1.27e505ab56259p-22 */
+
+static const struct {
+	/*
+	 * hi must be rounded to at most 106 bits so that multiplication
+	 * by r1 in expm1l() is exact, but it is rounded to 88 bits due to
+	 * historical accidents.
+	 *
+	 * XXX it is wasteful to use long double for both hi and lo.  ld128
+	 * exp2l() uses only float for lo (in a very differently organized
+	 * table; ld80 exp2l() is different again.  It uses 2 doubles in a
+	 * table organized like this one.  1 double and 1 float would
+	 * suffice).  There are different packing/locality/alignment/caching
+	 * problems with these methods.
+	 *
+	 * XXX C's bad %a format makes the bits unreadable.  They happen
+	 * to all line up for the hi values 1 before the point and 88
+	 * in 22 nybbles, but for the low values the nybbles are shifted
+	 * randomly.
+	 */
+	long double	hi;
+	long double	lo;
+} tbl[INTERVALS] = {
+	0x1p0L, 0x0p0L,
+	0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L,
+	0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L,
+	0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L,
+	0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L,
+	0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L,
+	0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L,
+	0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L,
+	0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L,
+	0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L,
+	0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L,
+	0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L,
+	0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L,
+	0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L,
+	0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L,
+	0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L,
+	0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L,
+	0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L,
+	0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L,
+	0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L,
+	0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L,
+	0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L,
+	0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L,
+	0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L,
+	0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L,
+	0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L,
+	0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L,
+	0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L,
+	0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L,
+	0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L,
+	0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L,
+	0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L,
+	0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L,
+	0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L,
+	0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L,
+	0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L,
+	0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L,
+	0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L,
+	0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L,
+	0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L,
+	0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L,
+	0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L,
+	0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L,
+	0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L,
+	0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L,
+	0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L,
+	0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L,
+	0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L,
+	0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L,
+	0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L,
+	0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L,
+	0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L,
+	0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L,
+	0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L,
+	0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L,
+	0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L,
+	0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L,
+	0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L,
+	0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L,
+	0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L,
+	0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L,
+	0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L,
+	0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L,
+	0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L,
+	0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L,
+	0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L,
+	0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L,
+	0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L,
+	0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L,
+	0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L,
+	0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L,
+	0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L,
+	0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L,
+	0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L,
+	0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L,
+	0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L,
+	0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L,
+	0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L,
+	0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L,
+	0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L,
+	0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L,
+	0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L,
+	0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L,
+	0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L,
+	0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L,
+	0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L,
+	0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L,
+	0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L,
+	0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L,
+	0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L,
+	0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L,
+	0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L,
+	0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L,
+	0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L,
+	0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L,
+	0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L,
+	0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L,
+	0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L,
+	0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L,
+	0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L,
+	0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L,
+	0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L,
+	0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L,
+	0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L,
+	0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L,
+	0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L,
+	0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L,
+	0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L,
+	0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L,
+	0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L,
+	0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L,
+	0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L,
+	0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L,
+	0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L,
+	0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L,
+	0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L,
+	0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L,
+	0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L,
+	0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L,
+	0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L,
+	0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L,
+	0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L,
+	0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L,
+	0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L,
+	0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L,
+	0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L,
+	0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L,
+	0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L
+};
+
+/*
+ * Kernel for expl(x).  x must be finite and not tiny or huge.
+ * "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
+ * "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
+ */
+static inline void
+__k_expl(long double x, long double *hip, long double *lop, int *kp)
+{
+	long double q, r, r1, t;
+	double dr, fn, r2;
+	int n, n2;
+
+	/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+	/* Use a specialized rint() to get fn.  Assume round-to-nearest. */
+	/* XXX assume no extra precision for the additions, as for trig fns. */
+	/* XXX this set of comments is now quadruplicated. */
+	/* XXX but see ../src/e_exp.c for a fix using double_t. */
+	fn = (double)x * INV_L + 0x1.8p52 - 0x1.8p52;
+#if defined(HAVE_EFFICIENT_IRINT)
+	n = irint(fn);
+#else
+	n = (int)fn;
+#endif
+	n2 = (unsigned)n % INTERVALS;
+	/* Depend on the sign bit being propagated: */
+	*kp = n >> LOG2_INTERVALS;
+	r1 = x - fn * L1;
+	r2 = fn * -L2;
+	r = r1 + r2;
+
+	/* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
+	dr = r;
+	q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
+	    dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
+	t = tbl[n2].lo + tbl[n2].hi;
+	*hip = tbl[n2].hi;
+	*lop = tbl[n2].lo + t * (q + r1);
+}
+
+/*
+ * XXX: the rest of the functions are identical for ld80 and ld128.
+ * However, we should use scalbnl() for ld128, since long double
+ * multiplication is very slow on the only supported ld128 arch (sparc64).
+ */
+
+static inline void
+k_hexpl(long double x, long double *hip, long double *lop)
+{
+	float twopkm1;
+	int k;
+
+	__k_expl(x, hip, lop, &k);
+	SET_FLOAT_WORD(twopkm1, 0x3f800000 + ((k - 1) << 23));
+	*hip *= twopkm1;
+	*lop *= twopkm1;
+}
+
+static inline long double
+hexpl(long double x)
+{
+	long double hi, lo, twopkm2;
+	int k;
+
+	twopkm2 = 1;
+	__k_expl(x, &hi, &lo, &k);
+	SET_LDBL_EXPSIGN(twopkm2, BIAS + k - 2);
+	return (lo + hi) * 2 * twopkm2;
+}
+
+#ifdef _COMPLEX_H
+/*
+ * See ../src/k_exp.c for details.
+ */
+static inline long double complex
+__ldexp_cexpl(long double complex z, int expt)
+{
+	long double exp_x, hi, lo;
+	long double x, y, scale1, scale2;
+	int half_expt, k;
+
+	x = creall(z);
+	y = cimagl(z);
+	__k_expl(x, &hi, &lo, &k);
+
+	exp_x = (lo + hi) * 0x1p16382;
+	expt += k - 16382;
+
+	scale1 = 1;
+	half_expt = expt / 2;
+	SET_LDBL_EXPSIGN(scale1, BIAS + half_expt);
+	scale2 = 1;
+	SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
+
+	return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
+	    sinl(y) * exp_x * scale1 * scale2));
+}
+#endif /* _COMPLEX_H */
diff --git a/libm/upstream-freebsd/lib/msun/ld128/k_sinl.c b/libm/upstream-freebsd/lib/msun/ld128/k_sinl.c
new file mode 100644
index 0000000..09472d6
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/k_sinl.c
@@ -0,0 +1,59 @@
+/* From: @(#)k_sin.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_sin.c.  See ../src/k_sin.c for most comments.
+ */
+
+#include "math_private.h"
+
+static const double
+half =  0.5;
+
+/*
+ * Domain [-0.7854, 0.7854], range ~[-1.53e-37, 1.659e-37]
+ * |sin(x)/x - s(x)| < 2**-122.1
+ *
+ * See ../ld80/k_cosl.c for more details about the polynomial.
+ */
+static const long double
+S1 = -0.16666666666666666666666666666666666606732416116558L,
+S2 =  0.0083333333333333333333333333333331135404851288270047L,
+S3 = -0.00019841269841269841269841269839935785325638310428717L,
+S4 =  0.27557319223985890652557316053039946268333231205686e-5L,
+S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
+S6 =  0.16059043836821614596571832194524392581082444805729e-9L,
+S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
+S8 =  0.28114572543451292625024967174638477283187397621303e-14L;
+
+static const double
+S9  = -0.82206352458348947812512122163446202498005154296863e-17,
+S10 =  0.19572940011906109418080609928334380560135358385256e-19,
+S11 = -0.38680813379701966970673724299207480965452616911420e-22,
+S12 =  0.64038150078671872796678569586315881020659912139412e-25;
+
+long double
+__kernel_sinl(long double x, long double y, int iy)
+{
+	long double z,r,v;
+
+	z	=  x*x;
+	v	=  z*x;
+	r	=  S2+z*(S3+z*(S4+z*(S5+z*(S6+z*(S7+z*(S8+
+	    z*(S9+z*(S10+z*(S11+z*S12)))))))));
+	if(iy==0) return x+v*(S1+z*r);
+	else      return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/k_tanl.c b/libm/upstream-freebsd/lib/msun/ld128/k_tanl.c
new file mode 100644
index 0000000..d7ec0b9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/k_tanl.c
@@ -0,0 +1,119 @@
+/* From: @(#)k_tan.c 1.5 04/04/22 SMI */
+
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of k_tan.c.  See ../src/k_tan.c for most comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * Domain [-0.67434, 0.67434], range ~[-3.37e-36, 1.982e-37]
+ * |tan(x)/x - t(x)| < 2**-117.8 (XXX should be ~1e-37)
+ *
+ * See ../ld80/k_cosl.c for more details about the polynomial.
+ */
+static const long double
+T3 = 0x1.5555555555555555555555555553p-2L,
+T5 = 0x1.1111111111111111111111111eb5p-3L,
+T7 = 0x1.ba1ba1ba1ba1ba1ba1ba1b694cd6p-5L,
+T9 = 0x1.664f4882c10f9f32d6bbe09d8bcdp-6L,
+T11 = 0x1.226e355e6c23c8f5b4f5762322eep-7L,
+T13 = 0x1.d6d3d0e157ddfb5fed8e84e27b37p-9L,
+T15 = 0x1.7da36452b75e2b5fce9ee7c2c92ep-10L,
+T17 = 0x1.355824803674477dfcf726649efep-11L,
+T19 = 0x1.f57d7734d1656e0aceb716f614c2p-13L,
+T21 = 0x1.967e18afcb180ed942dfdc518d6cp-14L,
+T23 = 0x1.497d8eea21e95bc7e2aa79b9f2cdp-15L,
+T25 = 0x1.0b132d39f055c81be49eff7afd50p-16L,
+T27 = 0x1.b0f72d33eff7bfa2fbc1059d90b6p-18L,
+T29 = 0x1.5ef2daf21d1113df38d0fbc00267p-19L,
+T31 = 0x1.1c77d6eac0234988cdaa04c96626p-20L,
+T33 = 0x1.cd2a5a292b180e0bdd701057dfe3p-22L,
+T35 = 0x1.75c7357d0298c01a31d0a6f7d518p-23L,
+T37 = 0x1.2f3190f4718a9a520f98f50081fcp-24L,
+pio4 = 0x1.921fb54442d18469898cc51701b8p-1L,
+pio4lo = 0x1.cd129024e088a67cc74020bbea60p-116L;
+
+static const double
+T39 =  0.000000028443389121318352,	/*  0x1e8a7592977938.0p-78 */
+T41 =  0.000000011981013102001973,	/*  0x19baa1b1223219.0p-79 */
+T43 =  0.0000000038303578044958070,	/*  0x107385dfb24529.0p-80 */
+T45 =  0.0000000034664378216909893,	/*  0x1dc6c702a05262.0p-81 */
+T47 = -0.0000000015090641701997785,	/* -0x19ecef3569ebb6.0p-82 */
+T49 =  0.0000000029449552300483952,	/*  0x194c0668da786a.0p-81 */
+T51 = -0.0000000022006995706097711,	/* -0x12e763b8845268.0p-81 */
+T53 =  0.0000000015468200913196612,	/*  0x1a92fc98c29554.0p-82 */
+T55 = -0.00000000061311613386849674,	/* -0x151106cbc779a9.0p-83 */
+T57 =  1.4912469681508012e-10;		/*  0x147edbdba6f43a.0p-85 */
+
+long double
+__kernel_tanl(long double x, long double y, int iy) {
+	long double z, r, v, w, s;
+	long double osign;
+	int i;
+
+	iy = (iy == 1 ? -1 : 1);	/* XXX recover original interface */
+	osign = (x >= 0 ? 1.0 : -1.0);	/* XXX slow, probably wrong for -0 */
+	if (fabsl(x) >= 0.67434) {
+		if (x < 0) {
+			x = -x;
+			y = -y;
+		}
+		z = pio4 - x;
+		w = pio4lo - y;
+		x = z + w;
+		y = 0.0;
+		i = 1;
+	} else
+		i = 0;
+	z = x * x;
+	w = z * z;
+	r = T5 + w * (T9 + w * (T13 + w * (T17 + w * (T21 +
+	    w * (T25 + w * (T29 + w * (T33 +
+	    w * (T37 + w * (T41 + w * (T45 + w * (T49 + w * (T53 +
+	    w * T57))))))))))));
+	v = z * (T7 + w * (T11 + w * (T15 + w * (T19 + w * (T23 +
+	    w * (T27 + w * (T31 + w * (T35 +
+	    w * (T39 + w * (T43 + w * (T47 + w * (T51 + w * T55))))))))))));
+	s = z * x;
+	r = y + z * (s * (r + v) + y);
+	r += T3 * s;
+	w = x + r;
+	if (i == 1) {
+		v = (long double) iy;
+		return osign *
+			(v - 2.0 * (x - (w * w / (w + v) - r)));
+	}
+	if (iy == 1)
+		return w;
+	else {
+		/*
+		 * if allow error up to 2 ulp, simply return
+		 * -1.0 / (x+r) here
+		 */
+		/* compute -1.0 / (x+r) accurately */
+		long double a, t;
+		z = w;
+		z = z + 0x1p32 - 0x1p32;
+		v = r - (z - x);	/* z+v = r+x */
+		t = a = -1.0 / w;	/* a = -1.0/w */
+		t = t + 0x1p32 - 0x1p32;
+		s = 1.0 + t * z;
+		return t + a * (s + t * v);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/s_erfl.c b/libm/upstream-freebsd/lib/msun/ld128/s_erfl.c
new file mode 100644
index 0000000..e29c969
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/s_erfl.c
@@ -0,0 +1,329 @@
+/* @(#)s_erf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_erf.c for complete comments.
+ *
+ * Converted to long double by Steven G. Kargl.
+ */
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* XXX Prevent compilers from erroneously constant folding these: */
+static const volatile long double tiny = 0x1p-10000L;
+
+static const double
+half= 0.5,
+one = 1,
+two = 2;
+/*
+ * In the domain [0, 2**-40], only the first term in the power series
+ * expansion of erf(x) is used.  The magnitude of the first neglected
+ * terms is less than 2**-120.
+ */
+static const long double
+efx  =  1.28379167095512573896158903121545167e-01L,	/* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06fc3f */
+efx8 =  1.02703333676410059116927122497236133e+00L,	/* 0xecbff6a7, 0x481dd788, 0xb64d21a8, 0xeb06ff3f */
+/*
+ * Domain [0, 0.84375], range ~[-1.919e-38, 1.919e-38]:
+ * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-125.29
+ */
+pp0  =  1.28379167095512573896158903121545167e-01L,	/* 0x3ffc06eb, 0xa8214db6, 0x88d71d48, 0xa7f6bfec */
+pp1  = -3.14931554396568573802046931159683404e-01L,	/* 0xbffd427d, 0x6ada7263, 0x547eb096, 0x95f37463 */
+pp2  = -5.27514920282183487103576956956725309e-02L,	/* 0xbffab023, 0xe5a271e3, 0xb0e79b01, 0x2f7ac962 */
+pp3  = -1.13202828509005281355609495523452713e-02L,	/* 0xbff872f1, 0x6a5023a1, 0xe08b3884, 0x326af20f */
+pp4  = -9.18626155872522453865998391206048506e-04L,	/* 0xbff4e19f, 0xea5fb024, 0x43247a37, 0xe430b06c */
+pp5  = -7.87518862406176274922506447157284230e-05L,	/* 0xbff14a4f, 0x31a85fe0, 0x7fff2204, 0x09c49b37 */
+pp6  = -3.42357944472240436548115331090560881e-06L,	/* 0xbfeccb81, 0x4b43c336, 0xcd2eb6c2, 0x903f2d87 */
+pp7  = -1.37317432573890412634717890726745428e-07L,	/* 0xbfe826e3, 0x0e915eb6, 0x42aee414, 0xf7e36805 */
+pp8  = -2.71115170113861755855049008732113726e-09L,	/* 0xbfe2749e, 0x2b94fd00, 0xecb4d166, 0x0efb91f8 */
+pp9  = -3.37925756196555959454018189718117864e-11L,	/* 0xbfdc293e, 0x1d9060cb, 0xd043204a, 0x314cd7f0 */
+qq1  =  4.76672625471551170489978555182449450e-01L,	/* 0x3ffde81c, 0xde6531f0, 0x76803bee, 0x526e29e9 */
+qq2  =  1.06713144672281502058807525850732240e-01L,	/* 0x3ffbb518, 0xd7a6bb74, 0xcd9bdd33, 0x7601eee5 */
+qq3  =  1.47747613127513761102189201923147490e-02L,	/* 0x3ff8e423, 0xae527e18, 0xf12cb447, 0x723b4749 */
+qq4  =  1.39939377672028671891148770908874816e-03L,	/* 0x3ff56ed7, 0xba055d84, 0xc21b45c4, 0x388d1812 */
+qq5  =  9.44302939359455241271983309378738276e-05L,	/* 0x3ff18c11, 0xc18c99a4, 0x86d0fe09, 0x46387b4c */
+qq6  =  4.56199342312522842161301671745365650e-06L,	/* 0x3fed3226, 0x73421d05, 0x08875300, 0x32fa1432 */
+qq7  =  1.53019260483764773845294600092361197e-07L,	/* 0x3fe8489b, 0x3a63f627, 0x2b9ad2ce, 0x26516e57 */
+qq8  =  3.25542691121324805094777901250005508e-09L,	/* 0x3fe2bf6c, 0x26d93a29, 0x9142be7c, 0x9f1dd043 */
+qq9  =  3.37405581964478060434410167262684979e-11L;	/* 0x3fdc28c8, 0xfb8fa1be, 0x10e57eec, 0xaa19e49f */
+
+static const long double
+erx  =  8.42700792949714894142232424201210961e-01L,	/* 0x3ffeaf76, 0x7a741088, 0xb0000000, 0x00000000 */
+/*
+ * Domain [0.84375, 1.25], range ~[-2.521e-36, 2.523e-36]:
+ * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-120.15
+ */
+pa0  = -2.48010117891186017024438233323795897e-17L,	/* 0xbfc7c97f, 0x77812279, 0x6c877f22, 0xef4bfb2e */
+pa1  =  4.15107497420594680894327969504526489e-01L,	/* 0x3ffda911, 0xf096fbc2, 0x55662005, 0x2337fa64 */
+pa2  = -3.94180628087084846724448515851892609e-02L,	/* 0xbffa42e9, 0xab54528c, 0xad529da1, 0x6efc2af3 */
+pa3  =  4.48897599625192107295954790681677462e-02L,	/* 0x3ffa6fbc, 0xa65edba1, 0x0e4cbcea, 0x73ef9a31 */
+pa4  =  8.02069252143016600110972019232995528e-02L,	/* 0x3ffb4887, 0x0e8b548e, 0x3230b417, 0x11b553b3 */
+pa5  = -1.02729816533435279443621120242391295e-02L,	/* 0xbff850a0, 0x041de3ee, 0xd5bca6c9, 0x4ef5f9f2 */
+pa6  =  5.70777694530755634864821094419982095e-03L,	/* 0x3ff77610, 0x9b501e10, 0x4c978382, 0x742df68f */
+pa7  =  1.22635150233075521018231779267077071e-03L,	/* 0x3ff5417b, 0x0e623682, 0x60327da0, 0x96b9219e */
+pa8  =  5.36100234820204569428412542856666503e-04L,	/* 0x3ff41912, 0x27ceb4c1, 0x1d3298ec, 0x84ced627 */
+pa9  = -1.97753571846365167177187858667583165e-04L,	/* 0xbff29eb8, 0x23f5bcf3, 0x15c83c46, 0xe4fda98b */
+pa10 =  6.19333039900846970674794789568415105e-05L,	/* 0x3ff103c4, 0x60f88e46, 0xc0c9fb02, 0x13cc7fc1 */
+pa11 = -5.40531400436645861492290270311751349e-06L,	/* 0xbfed6abe, 0x9665f8a8, 0xdd0ad3ba, 0xe5dc0ee3 */
+qa1  =  9.05041313265490487793231810291907851e-01L,	/* 0x3ffecf61, 0x93340222, 0xe9930620, 0xc4e61168 */
+qa2  =  6.79848064708886864767240880834868092e-01L,	/* 0x3ffe5c15, 0x0ba858dc, 0xf7900ae9, 0xfea1e09a */
+qa3  =  4.04720609926471677581066689316516445e-01L,	/* 0x3ffd9e6f, 0x145e9b00, 0x6d8c1749, 0xd2928623 */
+qa4  =  1.69183273898369996364661075664302225e-01L,	/* 0x3ffc5a7c, 0xc2a363c1, 0xd6c19097, 0xef9b4063 */
+qa5  =  7.44476185988067992342479750486764248e-02L,	/* 0x3ffb30ef, 0xfc7259ef, 0x1bcbb089, 0x686dd62d */
+qa6  =  2.02981172725892407200420389604788573e-02L,	/* 0x3ff94c90, 0x7976cb0e, 0x21e1d36b, 0x0f09ca2b */
+qa7  =  6.94281866271607668268269403102277234e-03L,	/* 0x3ff7c701, 0x2b193250, 0xc5d46ecc, 0x374843d8 */
+qa8  =  1.12952275469171559611651594706820034e-03L,	/* 0x3ff52818, 0xfd2a7c06, 0xd13e38fd, 0xda4b34f5 */
+qa9  =  3.13736683241992737197226578597710179e-04L,	/* 0x3ff348fa, 0x0cb48d18, 0x051f849b, 0x135ccf74 */
+qa10 =  1.17037675204033225470121134087771410e-05L,	/* 0x3fee88b6, 0x98f47704, 0xa5d8f8f2, 0xc6422e11 */
+qa11 =  4.61312518293853991439362806880973592e-06L,	/* 0x3fed3594, 0xe31db94f, 0x3592b693, 0xed4386b4 */
+qa12 = -1.02158572037456893687737553657431771e-06L;	/* 0xbfeb123a, 0xd60d9b1e, 0x1f6fdeb9, 0x7dc8410a */
+/*
+ * Domain [1.25,2.85715], range ~[-2.922e-37,2.922e-37]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-121.36
+ */
+static const long double
+ra0  = -9.86494292470069009555706994426014461e-03L,	/* 0xbff84341, 0x239e8709, 0xe941b06a, 0xcb4b6ec5 */
+ra1  = -1.13580436992565640457579040117568870e+00L,	/* 0xbfff22c4, 0x133f7c0d, 0x72d5e231, 0x2eb1ee3f */
+ra2  = -4.89744330295291950661185707066921755e+01L,	/* 0xc00487cb, 0xa38b4fc2, 0xc136695b, 0xc1df8047 */
+ra3  = -1.10766149300215937173768072715352140e+03L,	/* 0xc00914ea, 0x55e6beb3, 0xabc50e07, 0xb6e5664d */
+ra4  = -1.49991031232170934967642795601952100e+04L,	/* 0xc00cd4b8, 0xd33243e6, 0xffbf6545, 0x3c57ef6e */
+ra5  = -1.29805749738318462882524181556996692e+05L,	/* 0xc00ffb0d, 0xbfeed9b6, 0x5b2a3ff4, 0xe245bd3c */
+ra6  = -7.42828497044940065828871976644647850e+05L,	/* 0xc0126ab5, 0x8fe7caca, 0x473352d9, 0xcd4e0c90 */
+ra7  = -2.85637299581890734287995171242421106e+06L,	/* 0xc0145cad, 0xa7f76fe7, 0x3e358051, 0x1799f927 */
+ra8  = -7.40674797129824999383748865571026084e+06L,	/* 0xc015c412, 0x6fe29c02, 0x298ad158, 0x7d24e45c */
+ra9  = -1.28653420911930973914078724204151759e+07L,	/* 0xc016889e, 0x7c2eb0dc, 0x95d5863b, 0x0aa34dc3 */
+ra10 = -1.47198163599330179552932489109452638e+07L,	/* 0xc016c136, 0x90b84923, 0xf9bcb497, 0x19bbd0f5 */
+ra11 = -1.07812992258382800318665248311522624e+07L,	/* 0xc0164904, 0xe673a113, 0x35d7f079, 0xe13701f3 */
+ra12 = -4.83545565681708642630419905537756076e+06L,	/* 0xc0152721, 0xfea094a8, 0x869eb39d, 0x413d6f13 */
+ra13 = -1.23956521201673964822976917356685286e+06L,	/* 0xc0132ea0, 0xd3646baa, 0x2fe62b0d, 0xbae5ce85 */
+ra14 = -1.62289333553652417591275333240371812e+05L,	/* 0xc0103cf8, 0xaab1e2d6, 0x4c25e014, 0x248d76ab */
+ra15 = -8.82890392601176969729168894389833110e+03L,	/* 0xc00c13e7, 0x3b3d8f94, 0x6fbda6f6, 0xe7049a82 */
+ra16 = -1.22591866337261720023681535568334619e+02L,	/* 0xc005ea5e, 0x12358891, 0xcfa712c5, 0x77f050d4 */
+sa1  =  6.44508918884710829371852723353794047e+01L,	/* 0x400501cd, 0xb69a6c0f, 0x5716de14, 0x47161af6 */
+sa2  =  1.76118475473171481523704824327358534e+03L,	/* 0x4009b84b, 0xd305829f, 0xc4c771b0, 0xbf1f7f9b */
+sa3  =  2.69448346969488374857087646131950188e+04L,	/* 0x400da503, 0x56bacc05, 0x4fdba68d, 0x2cca27e6 */
+sa4  =  2.56826633369941456778326497384543763e+05L,	/* 0x4010f59d, 0x51124428, 0x69c41de6, 0xbd0d5753 */
+sa5  =  1.60647413092257206847700054645905859e+06L,	/* 0x40138834, 0xa2184244, 0x557a1bed, 0x68c9d556 */
+sa6  =  6.76963075165099718574753447122393797e+06L,	/* 0x40159d2f, 0x7b01b0cc, 0x8bac9e95, 0x5d35d56e */
+sa7  =  1.94295690905361884290986932493647741e+07L,	/* 0x40172878, 0xc1172d61, 0x3068501e, 0x2f3c71da */
+sa8  =  3.79774781017759149060839255547073541e+07L,	/* 0x401821be, 0xc30d06fe, 0x410563d7, 0x032111fd */
+sa9  =  5.00659831846029484248302236457727397e+07L,	/* 0x40187df9, 0x1f97a111, 0xc51d6ac2, 0x4b389793 */
+sa10 =  4.36486287620506484276130525941972541e+07L,	/* 0x40184d03, 0x3a618ae0, 0x2a723357, 0xfa45c60a */
+sa11 =  2.43779678791333894255510508253951934e+07L,	/* 0x401773fa, 0x6fe10ee2, 0xc467850d, 0xc6b7ff30 */
+sa12 =  8.30732360384443202039372372212966542e+06L,	/* 0x4015fb09, 0xee6a5631, 0xdd98de7e, 0x8b00461a */
+sa13 =  1.60160846942050515734192397495105693e+06L,	/* 0x40138704, 0x8782bf13, 0x5b8fb315, 0xa898abe5 */
+sa14 =  1.54255505242533291014555153757001825e+05L,	/* 0x40102d47, 0xc0abc98e, 0x843c9490, 0xb4352440 */
+sa15 =  5.87949220002375547561467275493888824e+03L,	/* 0x400b6f77, 0xe00d21d1, 0xec4d41e8, 0x2f8e1673 */
+sa16 =  4.97272976346793193860385983372237710e+01L;	/* 0x40048dd1, 0x816c1b3f, 0x24f540a6, 0x4cfe03cc */
+/*
+ * Domain [2.85715,9], range ~[-7.886e-37,7.918e-37]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-120
+ */
+static const long double
+rb0  = -9.86494292470008707171371994479162369e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e561, 0xf4469360 */
+rb1  = -1.57047326624110727986326503729442830L,    /* 0xbfff920a, 0x8935bf73, 0x8803b894, 0x4656482d */
+rb2  = -1.03228196364885474342132255440317065e2L,  /* 0xc0059ce9, 0xac4ed0ff, 0x2cff0ff7, 0x5e70d1ab */
+rb3  = -3.74000570653418227179358710865224376e3L,  /* 0xc00ad380, 0x2ebf7835, 0xf6b07ed2, 0x861242f7 */
+rb4  = -8.35435477739098044190860390632813956e4L,  /* 0xc00f4657, 0x8c3ae934, 0x3647d7b3, 0x80e76fb7 */
+rb5  = -1.21398672055223642118716640216747152e6L,  /* 0xc0132862, 0x2b8761c8, 0x27d18c0f, 0x137c9463 */
+rb6  = -1.17669175877248796101665344873273970e7L,  /* 0xc0166719, 0x0b2cea46, 0x81f14174, 0x11602ea5 */
+rb7  = -7.66108006086998253606773064264599615e7L,  /* 0xc019243f, 0x3c26f4f0, 0x1cc05241, 0x3b953728 */
+rb8  = -3.32547117558141845968704725353130804e8L,  /* 0xc01b3d24, 0x42d8ee26, 0x24ef6f3b, 0x604a8c65 */
+rb9  = -9.41561252426350696802167711221739746e8L,  /* 0xc01cc0f8, 0xad23692a, 0x8ddb2310, 0xe9937145 */
+rb10 = -1.67157110805390944549427329626281063e9L,  /* 0xc01d8e88, 0x9a903734, 0x09a55fa3, 0xd205c903 */
+rb11 = -1.74339631004410841337645931421427373e9L,  /* 0xc01d9fa8, 0x77582d2a, 0xc183b8ab, 0x7e00cb05 */
+rb12 = -9.57655233596934915727573141357471703e8L,  /* 0xc01cc8a5, 0x460cc685, 0xd0271fa0, 0x6a70e3da */
+rb13 = -2.26320062731339353035254704082495066e8L,  /* 0xc01aafab, 0xd7d76721, 0xc9720e11, 0x6a8bd489 */
+rb14 = -1.42777302996263256686002973851837039e7L,  /* 0xc016b3b8, 0xc499689f, 0x2b88d965, 0xc32414f9 */
+sb1  =  1.08512869705594540211033733976348506e2L,  /* 0x4005b20d, 0x2db7528d, 0x00d20dcb, 0x858f6191 */
+sb2  =  5.02757713761390460534494530537572834e3L,  /* 0x400b3a39, 0x3bf4a690, 0x3025d28d, 0xfd40a891 */
+sb3  =  1.31019107205412870059331647078328430e5L,  /* 0x400fffcb, 0x1b71d05e, 0x3b28361d, 0x2a3c3690 */
+sb4  =  2.13021555152296846166736757455018030e6L,  /* 0x40140409, 0x3c6984df, 0xc4491d7c, 0xb04aa08d */
+sb5  =  2.26649105281820861953868568619768286e7L,  /* 0x401759d6, 0xce8736f0, 0xf28ad037, 0x2a901e0c */
+sb6  =  1.61071939490875921812318684143076081e8L,  /* 0x401a3338, 0x686fb541, 0x6bd27d06, 0x4f95c9ac */
+sb7  =  7.66895673844301852676056750497991966e8L,  /* 0x401c6daf, 0x31cec121, 0x54699126, 0x4bd9bf9e */
+sb8  =  2.41884450436101936436023058196042526e9L,  /* 0x401e2059, 0x46b0b8d7, 0x87b64cbf, 0x78bc296d */
+sb9  =  4.92403055884071695093305291535107666e9L,  /* 0x401f257e, 0xbe5ed739, 0x39e17346, 0xcadd2e55 */
+sb10 =  6.18627786365587486459633615573786416e9L,  /* 0x401f70bb, 0x1be7a7e7, 0x6a45b5ae, 0x607c70f0 */
+sb11 =  4.45898013426501378097430226324743199e9L,  /* 0x401f09c6, 0xa32643d7, 0xf1724620, 0x9ea46c32 */
+sb12 =  1.63006115763329848117160344854224975e9L,  /* 0x401d84a3, 0x0996887f, 0x65a4f43b, 0x978c1d74 */
+sb13 =  2.39216717012421697446304015847567721e8L,  /* 0x401ac845, 0x09a065c2, 0x30095da7, 0x9d72d6ae */
+sb14 =  7.84837329009278694937250358810225609e6L;  /* 0x4015df06, 0xd5290e15, 0x63031fac, 0x4d9c894c */
+/*
+ * Domain [9,108], range ~[-5.324e-38,5.340e-38]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - r(x)/s(x)| < 2**-124
+ */
+static const long double
+rc0  = -9.86494292470008707171367567652935673e-3L, /* 0xbff84341, 0x239e86f4, 0x2f57e55b, 0x1aa10fd3 */
+rc1  = -1.26229447747315096406518846411562266L,    /* 0xbfff4325, 0xbb1aab28, 0xda395cd9, 0xfb861c15 */
+rc2  = -6.13742634438922591780742637728666162e1L,  /* 0xc004eafe, 0x7dd51cd8, 0x3c7c5928, 0x751e50cf */
+rc3  = -1.50455835478908280402912854338421517e3L,  /* 0xc0097823, 0xbc15b9ab, 0x3d60745c, 0x523e80a5 */
+rc4  = -2.04415631865861549920184039902945685e4L,  /* 0xc00d3f66, 0x40b3fc04, 0x5388f2ec, 0xb009e1f0 */
+rc5  = -1.57625662981714582753490610560037638e5L,  /* 0xc01033dc, 0xd4dc95b6, 0xfd4da93b, 0xf355b4a9 */
+rc6  = -6.73473451616752528402917538033283794e5L,  /* 0xc01248d8, 0x2e73a4f9, 0xcded49c5, 0xfa3bfeb7 */
+rc7  = -1.47433165421387483167186683764364857e6L,  /* 0xc01367f1, 0xba77a8f7, 0xcfdd0dbb, 0x25d554b3 */
+rc8  = -1.38811981807868828563794929997744139e6L,  /* 0xc01352e5, 0x7d16d9ad, 0xbbdcbf38, 0x38fbc5ea */
+rc9  = -3.59659700530831825640766479698155060e5L,  /* 0xc0115f3a, 0xecd57f45, 0x21f8ad6c, 0x910a5958 */
+sc1  =  7.72730753022908298637508998072635696e1L,  /* 0x40053517, 0xa10d52bc, 0xdabb55b6, 0xbd0328cd */
+sc2  =  2.36825757341694050500333261769082182e3L,  /* 0x400a2808, 0x3e0a9b42, 0x82977842, 0x9c5de29e */
+sc3  =  3.72210540173034735352888847134073099e4L,  /* 0x400e22ca, 0x1ba827ef, 0xac8390d7, 0x1fc39a41 */
+sc4  =  3.24136032646418336712461033591393412e5L,  /* 0x40113c8a, 0x0216e100, 0xc59d1e44, 0xf0e68d9d */
+sc5  =  1.57836135851134393802505823370009175e6L,  /* 0x40138157, 0x95bc7664, 0x17575961, 0xdbe58eeb */
+sc6  =  4.12881981392063738026679089714182355e6L,  /* 0x4014f801, 0x9e82e8d2, 0xb8b3a70e, 0xfd84185d */
+sc7  =  5.24438427289213488410596395361544142e6L,  /* 0x40154017, 0x81177109, 0x2aa6c3b0, 0x1f106625 */
+sc8  =  2.59909544563616121735963429710382149e6L,  /* 0x40143d45, 0xbb90a9b1, 0x12bf9390, 0xa827a700 */
+sc9  =  2.80930665169282501639651995082335693e5L;  /* 0x40111258, 0xaa92222e, 0xa97e3216, 0xa237fa6c */
+
+long double
+erfl(long double x)
+{
+	long double ax,R,S,P,Q,s,y,z,r;
+	uint64_t lx, llx;
+	int32_t i;
+	uint16_t hx;
+
+	EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+
+	if((hx & 0x7fff) == 0x7fff) {	/* erfl(nan)=nan */
+		i = (hx>>15)<<1;
+		return (1-i)+one/x;	/* erfl(+-inf)=+-1 */
+	}
+
+	ax = fabsl(x);
+	if(ax < 0.84375) {
+	    if(ax < 0x1p-40L) {
+	        if(ax < 0x1p-16373L)	
+		    return (8*x+efx8*x)/8;	/* avoid spurious underflow */
+		return x + efx*x;
+	    }
+	    z = x*x;
+	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
+		z*(pp8+z*pp9))))))));
+	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
+		z*(qq8+z*qq9))))))));
+	    y = r/s;
+	    return x + x*y;
+	}
+	if(ax < 1.25) {
+	    s = ax-one;
+	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
+		s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
+	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
+		s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
+	    if(x>=0) return (erx + P/Q); else return (-erx - P/Q);
+	}
+	if (ax >= 9) {			/* inf>|x|>= 9 */
+	    if(x>=0) return (one-tiny); else return (tiny-one);
+	}
+	s = one/(ax*ax);
+	if(ax < 2.85715) {	/* |x| < 2.85715 */
+	    R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+		s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
+		s*(ra15+s*ra16)))))))))))))));
+	    S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+		s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
+		s*(sa15+s*sa16)))))))))))))));
+	} else {	/* |x| >= 2.85715 */
+	    R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
+		s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
+		s*rb14)))))))))))));
+	    S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
+		s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
+		s*sb14)))))))))))));
+	}
+	z = (float)ax;
+	r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+	if(x>=0) return (one-r/ax); else return (r/ax-one);
+}
+
+long double
+erfcl(long double x)
+{
+	long double ax,R,S,P,Q,s,y,z,r;
+	uint64_t lx, llx;
+	uint16_t hx;
+
+	EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+
+	if((hx & 0x7fff) == 0x7fff) {	/* erfcl(nan)=nan */
+					/* erfcl(+-inf)=0,2 */
+	    return ((hx>>15)<<1)+one/x;
+	}
+
+	ax = fabsl(x);
+	if(ax < 0.84375L) {
+	    if(ax < 0x1p-34L)
+		return one-x;
+	    z = x*x;
+	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*(pp4+z*(pp5+z*(pp6+z*(pp7+
+		z*(pp8+z*pp9))))))));
+	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*(qq5+z*(qq6+z*(qq7+
+		z*(qq8+z*qq9))))))));
+	    y = r/s;
+	    if(ax < 0.25L) {  	/* x<1/4 */
+		return one-(x+x*y);
+	    } else {
+		r = x*y;
+		r += (x-half);
+	       return half - r;
+	    }
+	}
+	if(ax < 1.25L) {
+	    s = ax-one;
+	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*(pa6+s*(pa7+
+		    s*(pa8+s*(pa9+s*(pa10+s*pa11))))))))));
+	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*(qa6+s*(qa7+
+		    s*(qa8+s*(qa9+s*(qa10+s*(qa11+s*qa12)))))))))));
+	    if(x>=0) {
+	        z  = one-erx; return z - P/Q;
+	    } else {
+		z = erx+P/Q; return one+z;
+	    }
+	}
+
+	if(ax < 108) {			/* |x| < 108 */
+ 	    s = one/(ax*ax);
+	    if(ax < 2.85715) {		/* |x| < 2.85715 */
+	        R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*(ra7+
+		    s*(ra8+s*(ra9+s*(ra10+s*(ra11+s*(ra12+s*(ra13+s*(ra14+
+		    s*(ra15+s*ra16)))))))))))))));
+	        S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+		    s*(sa8+s*(sa9+s*(sa10+s*(sa11+s*(sa12+s*(sa13+s*(sa14+
+		    s*(sa15+s*sa16)))))))))))))));
+	    } else if(ax < 9) {
+		R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*(rb6+s*(rb7+
+		    s*(rb8+s*(rb9+s*(rb10+s*(rb11+s*(rb12+s*(rb13+
+		    s*rb14)))))))))))));
+		S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*(sb7+
+		    s*(sb8+s*(sb9+s*(sb10+s*(sb11+s*(sb12+s*(sb13+
+		    s*sb14)))))))))))));
+	    } else {
+		if(x < -9) return two-tiny;	/* x < -9 */
+		R=rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+s*(rc6+s*(rc7+
+		    s*(rc8+s*rc9))))))));
+		S=one+s*(sc1+s*(sc2+s*(sc3+s*(sc4+s*(sc5+s*(sc6+s*(sc7+
+		    s*(sc8+s*sc9))))))));
+	    }
+	    z = (float)ax;
+	    r = expl(-z*z-0.5625)*expl((z-ax)*(z+ax)+R/S);
+	    if(x>0) return r/ax; else return two-r/ax;
+	} else {
+	    if(x>0) return tiny*tiny; else return two-tiny;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/s_exp2l.c b/libm/upstream-freebsd/lib/msun/ld128/s_exp2l.c
new file mode 100644
index 0000000..5afa37e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/s_exp2l.c
@@ -0,0 +1,427 @@
+/*-
+ * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+
+#define	TBLBITS	7
+#define	TBLSIZE	(1 << TBLBITS)
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+#define	EXPMASK	(BIAS + LDBL_MAX_EXP)
+
+static volatile long double
+    huge      = 0x1p10000L,
+    twom10000 = 0x1p-10000L;
+
+static const long double
+    P1        = 0x1.62e42fefa39ef35793c7673007e6p-1L,
+    P2	      = 0x1.ebfbdff82c58ea86f16b06ec9736p-3L,
+    P3        = 0x1.c6b08d704a0bf8b33a762bad3459p-5L,
+    P4        = 0x1.3b2ab6fba4e7729ccbbe0b4f3fc2p-7L,
+    P5        = 0x1.5d87fe78a67311071dee13fd11d9p-10L,
+    P6        = 0x1.430912f86c7876f4b663b23c5fe5p-13L;
+
+static const double
+    P7        = 0x1.ffcbfc588b041p-17,
+    P8        = 0x1.62c0223a5c7c7p-20,
+    P9        = 0x1.b52541ff59713p-24,
+    P10       = 0x1.e4cf56a391e22p-28,
+    redux     = 0x1.8p112 / TBLSIZE;
+
+static const long double tbl[TBLSIZE] = {
+	0x1.6a09e667f3bcc908b2fb1366dfeap-1L,
+	0x1.6c012750bdabeed76a99800f4edep-1L,
+	0x1.6dfb23c651a2ef220e2cbe1bc0d4p-1L,
+	0x1.6ff7df9519483cf87e1b4f3e1e98p-1L,
+	0x1.71f75e8ec5f73dd2370f2ef0b148p-1L,
+	0x1.73f9a48a58173bd5c9a4e68ab074p-1L,
+	0x1.75feb564267c8bf6e9aa33a489a8p-1L,
+	0x1.780694fde5d3f619ae02808592a4p-1L,
+	0x1.7a11473eb0186d7d51023f6ccb1ap-1L,
+	0x1.7c1ed0130c1327c49334459378dep-1L,
+	0x1.7e2f336cf4e62105d02ba1579756p-1L,
+	0x1.80427543e1a11b60de67649a3842p-1L,
+	0x1.82589994cce128acf88afab34928p-1L,
+	0x1.8471a4623c7acce52f6b97c6444cp-1L,
+	0x1.868d99b4492ec80e41d90ac2556ap-1L,
+	0x1.88ac7d98a669966530bcdf2d4cc0p-1L,
+	0x1.8ace5422aa0db5ba7c55a192c648p-1L,
+	0x1.8cf3216b5448bef2aa1cd161c57ap-1L,
+	0x1.8f1ae991577362b982745c72eddap-1L,
+	0x1.9145b0b91ffc588a61b469f6b6a0p-1L,
+	0x1.93737b0cdc5e4f4501c3f2540ae8p-1L,
+	0x1.95a44cbc8520ee9b483695a0e7fep-1L,
+	0x1.97d829fde4e4f8b9e920f91e8eb6p-1L,
+	0x1.9a0f170ca07b9ba3109b8c467844p-1L,
+	0x1.9c49182a3f0901c7c46b071f28dep-1L,
+	0x1.9e86319e323231824ca78e64c462p-1L,
+	0x1.a0c667b5de564b29ada8b8cabbacp-1L,
+	0x1.a309bec4a2d3358c171f770db1f4p-1L,
+	0x1.a5503b23e255c8b424491caf88ccp-1L,
+	0x1.a799e1330b3586f2dfb2b158f31ep-1L,
+	0x1.a9e6b5579fdbf43eb243bdff53a2p-1L,
+	0x1.ac36bbfd3f379c0db966a3126988p-1L,
+	0x1.ae89f995ad3ad5e8734d17731c80p-1L,
+	0x1.b0e07298db66590842acdfc6fb4ep-1L,
+	0x1.b33a2b84f15faf6bfd0e7bd941b0p-1L,
+	0x1.b59728de559398e3881111648738p-1L,
+	0x1.b7f76f2fb5e46eaa7b081ab53ff6p-1L,
+	0x1.ba5b030a10649840cb3c6af5b74cp-1L,
+	0x1.bcc1e904bc1d2247ba0f45b3d06cp-1L,
+	0x1.bf2c25bd71e088408d7025190cd0p-1L,
+	0x1.c199bdd85529c2220cb12a0916bap-1L,
+	0x1.c40ab5fffd07a6d14df820f17deap-1L,
+	0x1.c67f12e57d14b4a2137fd20f2a26p-1L,
+	0x1.c8f6d9406e7b511acbc48805c3f6p-1L,
+	0x1.cb720dcef90691503cbd1e949d0ap-1L,
+	0x1.cdf0b555dc3f9c44f8958fac4f12p-1L,
+	0x1.d072d4a07897b8d0f22f21a13792p-1L,
+	0x1.d2f87080d89f18ade123989ea50ep-1L,
+	0x1.d5818dcfba48725da05aeb66dff8p-1L,
+	0x1.d80e316c98397bb84f9d048807a0p-1L,
+	0x1.da9e603db3285708c01a5b6d480cp-1L,
+	0x1.dd321f301b4604b695de3c0630c0p-1L,
+	0x1.dfc97337b9b5eb968cac39ed284cp-1L,
+	0x1.e264614f5a128a12761fa17adc74p-1L,
+	0x1.e502ee78b3ff6273d130153992d0p-1L,
+	0x1.e7a51fbc74c834b548b2832378a4p-1L,
+	0x1.ea4afa2a490d9858f73a18f5dab4p-1L,
+	0x1.ecf482d8e67f08db0312fb949d50p-1L,
+	0x1.efa1bee615a27771fd21a92dabb6p-1L,
+	0x1.f252b376bba974e8696fc3638f24p-1L,
+	0x1.f50765b6e4540674f84b762861a6p-1L,
+	0x1.f7bfdad9cbe138913b4bfe72bd78p-1L,
+	0x1.fa7c1819e90d82e90a7e74b26360p-1L,
+	0x1.fd3c22b8f71f10975ba4b32bd006p-1L,
+	0x1.0000000000000000000000000000p+0L,
+	0x1.0163da9fb33356d84a66ae336e98p+0L,
+	0x1.02c9a3e778060ee6f7caca4f7a18p+0L,
+	0x1.04315e86e7f84bd738f9a20da442p+0L,
+	0x1.059b0d31585743ae7c548eb68c6ap+0L,
+	0x1.0706b29ddf6ddc6dc403a9d87b1ep+0L,
+	0x1.0874518759bc808c35f25d942856p+0L,
+	0x1.09e3ecac6f3834521e060c584d5cp+0L,
+	0x1.0b5586cf9890f6298b92b7184200p+0L,
+	0x1.0cc922b7247f7407b705b893dbdep+0L,
+	0x1.0e3ec32d3d1a2020742e4f8af794p+0L,
+	0x1.0fb66affed31af232091dd8a169ep+0L,
+	0x1.11301d0125b50a4ebbf1aed9321cp+0L,
+	0x1.12abdc06c31cbfb92bad324d6f84p+0L,
+	0x1.1429aaea92ddfb34101943b2588ep+0L,
+	0x1.15a98c8a58e512480d573dd562aep+0L,
+	0x1.172b83c7d517adcdf7c8c50eb162p+0L,
+	0x1.18af9388c8de9bbbf70b9a3c269cp+0L,
+	0x1.1a35beb6fcb753cb698f692d2038p+0L,
+	0x1.1bbe084045cd39ab1e72b442810ep+0L,
+	0x1.1d4873168b9aa7805b8028990be8p+0L,
+	0x1.1ed5022fcd91cb8819ff61121fbep+0L,
+	0x1.2063b88628cd63b8eeb0295093f6p+0L,
+	0x1.21f49917ddc962552fd29294bc20p+0L,
+	0x1.2387a6e75623866c1fadb1c159c0p+0L,
+	0x1.251ce4fb2a63f3582ab7de9e9562p+0L,
+	0x1.26b4565e27cdd257a673281d3068p+0L,
+	0x1.284dfe1f5638096cf15cf03c9fa0p+0L,
+	0x1.29e9df51fdee12c25d15f5a25022p+0L,
+	0x1.2b87fd0dad98ffddea46538fca24p+0L,
+	0x1.2d285a6e4030b40091d536d0733ep+0L,
+	0x1.2ecafa93e2f5611ca0f45d5239a4p+0L,
+	0x1.306fe0a31b7152de8d5a463063bep+0L,
+	0x1.32170fc4cd8313539cf1c3009330p+0L,
+	0x1.33c08b26416ff4c9c8610d96680ep+0L,
+	0x1.356c55f929ff0c94623476373be4p+0L,
+	0x1.371a7373aa9caa7145502f45452ap+0L,
+	0x1.38cae6d05d86585a9cb0d9bed530p+0L,
+	0x1.3a7db34e59ff6ea1bc9299e0a1fep+0L,
+	0x1.3c32dc313a8e484001f228b58cf0p+0L,
+	0x1.3dea64c12342235b41223e13d7eep+0L,
+	0x1.3fa4504ac801ba0bf701aa417b9cp+0L,
+	0x1.4160a21f72e29f84325b8f3dbacap+0L,
+	0x1.431f5d950a896dc704439410b628p+0L,
+	0x1.44e086061892d03136f409df0724p+0L,
+	0x1.46a41ed1d005772512f459229f0ap+0L,
+	0x1.486a2b5c13cd013c1a3b69062f26p+0L,
+	0x1.4a32af0d7d3de672d8bcf46f99b4p+0L,
+	0x1.4bfdad5362a271d4397afec42e36p+0L,
+	0x1.4dcb299fddd0d63b36ef1a9e19dep+0L,
+	0x1.4f9b2769d2ca6ad33d8b69aa0b8cp+0L,
+	0x1.516daa2cf6641c112f52c84d6066p+0L,
+	0x1.5342b569d4f81df0a83c49d86bf4p+0L,
+	0x1.551a4ca5d920ec52ec620243540cp+0L,
+	0x1.56f4736b527da66ecb004764e61ep+0L,
+	0x1.58d12d497c7fd252bc2b7343d554p+0L,
+	0x1.5ab07dd48542958c93015191e9a8p+0L,
+	0x1.5c9268a5946b701c4b1b81697ed4p+0L,
+	0x1.5e76f15ad21486e9be4c20399d12p+0L,
+	0x1.605e1b976dc08b076f592a487066p+0L,
+	0x1.6247eb03a5584b1f0fa06fd2d9eap+0L,
+	0x1.6434634ccc31fc76f8714c4ee122p+0L,
+	0x1.66238825522249127d9e29b92ea2p+0L,
+	0x1.68155d44ca973081c57227b9f69ep+0L,
+};
+
+static const float eps[TBLSIZE] = {
+	-0x1.5c50p-101,
+	-0x1.5d00p-106,
+	 0x1.8e90p-102,
+	-0x1.5340p-103,
+	 0x1.1bd0p-102,
+	-0x1.4600p-105,
+	-0x1.7a40p-104,
+	 0x1.d590p-102,
+	-0x1.d590p-101,
+	 0x1.b100p-103,
+	-0x1.0d80p-105,
+	 0x1.6b00p-103,
+	-0x1.9f00p-105,
+	 0x1.c400p-103,
+	 0x1.e120p-103,
+	-0x1.c100p-104,
+	-0x1.9d20p-103,
+	 0x1.a800p-108,
+	 0x1.4c00p-106,
+	-0x1.9500p-106,
+	 0x1.6900p-105,
+	-0x1.29d0p-100,
+	 0x1.4c60p-103,
+	 0x1.13a0p-102,
+	-0x1.5b60p-103,
+	-0x1.1c40p-103,
+	 0x1.db80p-102,
+	 0x1.91a0p-102,
+	 0x1.dc00p-105,
+	 0x1.44c0p-104,
+	 0x1.9710p-102,
+	 0x1.8760p-103,
+	-0x1.a720p-103,
+	 0x1.ed20p-103,
+	-0x1.49c0p-102,
+	-0x1.e000p-111,
+	 0x1.86a0p-103,
+	 0x1.2b40p-103,
+	-0x1.b400p-108,
+	 0x1.1280p-99,
+	-0x1.02d8p-102,
+	-0x1.e3d0p-103,
+	-0x1.b080p-105,
+	-0x1.f100p-107,
+	-0x1.16c0p-105,
+	-0x1.1190p-103,
+	-0x1.a7d2p-100,
+	 0x1.3450p-103,
+	-0x1.67c0p-105,
+	 0x1.4b80p-104,
+	-0x1.c4e0p-103,
+	 0x1.6000p-108,
+	-0x1.3f60p-105,
+	 0x1.93f0p-104,
+	 0x1.5fe0p-105,
+	 0x1.6f80p-107,
+	-0x1.7600p-106,
+	 0x1.21e0p-106,
+	-0x1.3a40p-106,
+	-0x1.40c0p-104,
+	-0x1.9860p-105,
+	-0x1.5d40p-108,
+	-0x1.1d70p-106,
+	 0x1.2760p-105,
+	 0x0.0000p+0,
+	 0x1.21e2p-104,
+	-0x1.9520p-108,
+	-0x1.5720p-106,
+	-0x1.4810p-106,
+	-0x1.be00p-109,
+	 0x1.0080p-105,
+	-0x1.5780p-108,
+	-0x1.d460p-105,
+	-0x1.6140p-105,
+	 0x1.4630p-104,
+	 0x1.ad50p-103,
+	 0x1.82e0p-105,
+	 0x1.1d3cp-101,
+	 0x1.6100p-107,
+	 0x1.ec30p-104,
+	 0x1.f200p-108,
+	 0x1.0b40p-103,
+	 0x1.3660p-102,
+	 0x1.d9d0p-103,
+	-0x1.02d0p-102,
+	 0x1.b070p-103,
+	 0x1.b9c0p-104,
+	-0x1.01c0p-103,
+	-0x1.dfe0p-103,
+	 0x1.1b60p-104,
+	-0x1.ae94p-101,
+	-0x1.3340p-104,
+	 0x1.b3d8p-102,
+	-0x1.6e40p-105,
+	-0x1.3670p-103,
+	 0x1.c140p-104,
+	 0x1.1840p-101,
+	 0x1.1ab0p-102,
+	-0x1.a400p-104,
+	 0x1.1f00p-104,
+	-0x1.7180p-103,
+	 0x1.4ce0p-102,
+	 0x1.9200p-107,
+	-0x1.54c0p-103,
+	 0x1.1b80p-105,
+	-0x1.1828p-101,
+	 0x1.5720p-102,
+	-0x1.a060p-100,
+	 0x1.9160p-102,
+	 0x1.a280p-104,
+	 0x1.3400p-107,
+	 0x1.2b20p-102,
+	 0x1.7800p-108,
+	 0x1.cfd0p-101,
+	 0x1.2ef0p-102,
+	-0x1.2760p-99,
+	 0x1.b380p-104,
+	 0x1.0048p-101,
+	-0x1.60b0p-102,
+	 0x1.a1ccp-100,
+	-0x1.a640p-104,
+	-0x1.08a0p-101,
+	 0x1.7e60p-102,
+	 0x1.22c0p-103,
+	-0x1.7200p-106,
+	 0x1.f0f0p-102,
+	 0x1.eb4ep-99,
+	 0x1.c6e0p-103,
+};
+
+/*
+ * exp2l(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.502 ulp.
+ *
+ * Method: (accurate tables)
+ *
+ *   Reduce x:
+ *     x = 2**k + y, for integer k and |y| <= 1/2.
+ *     Thus we have exp2(x) = 2**k * exp2(y).
+ *
+ *   Reduce y:
+ *     y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
+ *     Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
+ *     with |z - eps[i]| <= 2**-8 + 2**-98 for the table used.
+ *
+ *   We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
+ *   a degree-10 minimax polynomial with maximum error under 2**-120.
+ *   The values in exp2t[] and eps[] are chosen such that
+ *   exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
+ *   that exp2t[i] is accurate to 2**-122.
+ *
+ *   Note that the range of i is +-TBLSIZE/2, so we actually index the tables
+ *   by i0 = i + TBLSIZE/2.
+ *
+ *   This method is due to Gal, with many details due to Gal and Bachelis:
+ *
+ *	Gal, S. and Bachelis, B.  An Accurate Elementary Mathematical Library
+ *	for the IEEE Floating Point Standard.  TOMS 17(1), 26-46 (1991).
+ */
+long double
+exp2l(long double x)
+{
+	union IEEEl2bits u, v;
+	long double r, t, twopk, twopkp10000, z;
+	uint32_t hx, ix, i0;
+	int k;
+
+	u.e = x;
+
+	/* Filter out exceptional cases. */
+	hx = u.xbits.expsign;
+	ix = hx & EXPMASK;
+	if (ix >= BIAS + 14) {		/* |x| >= 16384 */
+		if (ix == BIAS + LDBL_MAX_EXP) {
+			if (u.xbits.manh != 0
+			    || u.xbits.manl != 0
+			    || (hx & 0x8000) == 0)
+				return (x + x);	/* x is NaN or +Inf */
+			else 
+				return (0.0);	/* x is -Inf */
+		}
+		if (x >= 16384)
+			return (huge * huge); /* overflow */
+		if (x <= -16495)
+			return (twom10000 * twom10000); /* underflow */
+	} else if (ix <= BIAS - 115) {		/* |x| < 0x1p-115 */
+		return (1.0 + x);
+	}
+
+	/*
+	 * Reduce x, computing z, i0, and k. The low bits of x + redux
+	 * contain the 16-bit integer part of the exponent (k) followed by
+	 * TBLBITS fractional bits (i0). We use bit tricks to extract these
+	 * as integers, then set z to the remainder.
+	 *
+	 * Example: Suppose x is 0xabc.123456p0 and TBLBITS is 8.
+	 * Then the low-order word of x + redux is 0x000abc12,
+	 * We split this into k = 0xabc and i0 = 0x12 (adjusted to
+	 * index into the table), then we compute z = 0x0.003456p0.
+	 *
+	 * XXX If the exponent is negative, the computation of k depends on
+	 *     '>>' doing sign extension.
+	 */
+	u.e = x + redux;
+	i0 = (u.bits.manl & 0xffffffff) + TBLSIZE / 2;
+	k = (int)i0 >> TBLBITS;
+	i0 = i0 & (TBLSIZE - 1);
+	u.e -= redux;
+	z = x - u.e;
+	v.xbits.manh = 0;
+	v.xbits.manl = 0;
+	if (k >= LDBL_MIN_EXP) {
+		v.xbits.expsign = LDBL_MAX_EXP - 1 + k;
+		twopk = v.e;
+	} else {
+		v.xbits.expsign = LDBL_MAX_EXP - 1 + k + 10000;
+		twopkp10000 = v.e;
+	}
+
+	/* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
+	t = tbl[i0];		/* exp2t[i0] */
+	z -= eps[i0];		/* eps[i0]   */
+	r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * (P5 + z * (P6
+	    + z * (P7 + z * (P8 + z * (P9 + z * P10)))))))));
+
+	/* Scale by 2**k. */
+	if(k >= LDBL_MIN_EXP) {
+		if (k == LDBL_MAX_EXP)
+			return (r * 2.0 * 0x1p16383L);
+		return (r * twopk);
+	} else {
+		return (r * twopkp10000 * twom10000);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/s_expl.c b/libm/upstream-freebsd/lib/msun/ld128/s_expl.c
new file mode 100644
index 0000000..a6a9676
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/s_expl.c
@@ -0,0 +1,326 @@
+/*-
+ * Copyright (c) 2009-2013 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ld128 version of s_expl.c.  See ../ld80/s_expl.c for most comments.
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+/* XXX Prevent compilers from erroneously constant folding these: */
+static const volatile long double
+huge = 0x1p10000L,
+tiny = 0x1p-10000L;
+
+static const long double
+twom10000 = 0x1p-10000L;
+
+static const long double
+/* log(2**16384 - 0.5) rounded towards zero: */
+/* log(2**16384 - 0.5 + 1) rounded towards zero for expm1l() is the same: */
+o_threshold =  11356.523406294143949491931077970763428L,
+/* log(2**(-16381-64-1)) rounded towards zero: */
+u_threshold = -11433.462743336297878837243843452621503L;
+
+long double
+expl(long double x)
+{
+	union IEEEl2bits u;
+	long double hi, lo, t, twopk;
+	int k;
+	uint16_t hx, ix;
+
+	DOPRINT_START(&x);
+
+	/* Filter out exceptional cases. */
+	u.e = x;
+	hx = u.xbits.expsign;
+	ix = hx & 0x7fff;
+	if (ix >= BIAS + 13) {		/* |x| >= 8192 or x is NaN */
+		if (ix == BIAS + LDBL_MAX_EXP) {
+			if (hx & 0x8000)  /* x is -Inf or -NaN */
+				RETURNP(-1 / x);
+			RETURNP(x + x);	/* x is +Inf or +NaN */
+		}
+		if (x > o_threshold)
+			RETURNP(huge * huge);
+		if (x < u_threshold)
+			RETURNP(tiny * tiny);
+	} else if (ix < BIAS - 114) {	/* |x| < 0x1p-114 */
+		RETURN2P(1, x);		/* 1 with inexact iff x != 0 */
+	}
+
+	ENTERI();
+
+	twopk = 1;
+	__k_expl(x, &hi, &lo, &k);
+	t = SUM2P(hi, lo);
+
+	/* Scale by 2**k. */
+	/* XXX sparc64 multiplication is so slow that scalbnl() is faster. */
+	if (k >= LDBL_MIN_EXP) {
+		if (k == LDBL_MAX_EXP)
+			RETURNI(t * 2 * 0x1p16383L);
+		SET_LDBL_EXPSIGN(twopk, BIAS + k);
+		RETURNI(t * twopk);
+	} else {
+		SET_LDBL_EXPSIGN(twopk, BIAS + k + 10000);
+		RETURNI(t * twopk * twom10000);
+	}
+}
+
+/*
+ * Our T1 and T2 are chosen to be approximately the points where method
+ * A and method B have the same accuracy.  Tang's T1 and T2 are the
+ * points where method A's accuracy changes by a full bit.  For Tang,
+ * this drop in accuracy makes method A immediately less accurate than
+ * method B, but our larger INTERVALS makes method A 2 bits more
+ * accurate so it remains the most accurate method significantly
+ * closer to the origin despite losing the full bit in our extended
+ * range for it.
+ *
+ * Split the interval [T1, T2] into two intervals [T1, T3] and [T3, T2].
+ * Setting T3 to 0 would require the |x| < 0x1p-113 condition to appear
+ * in both subintervals, so set T3 = 2**-5, which places the condition
+ * into the [T1, T3] interval.
+ *
+ * XXX we now do this more to (partially) balance the number of terms
+ * in the C and D polys than to avoid checking the condition in both
+ * intervals.
+ *
+ * XXX these micro-optimizations are excessive.
+ */
+static const double
+T1 = -0.1659,				/* ~-30.625/128 * log(2) */
+T2 =  0.1659,				/* ~30.625/128 * log(2) */
+T3 =  0.03125;
+
+/*
+ * Domain [-0.1659, 0.03125], range ~[2.9134e-44, 1.8404e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-122.03
+ *
+ * XXX none of the long double C or D coeffs except C10 is correctly printed.
+ * If you re-print their values in %.35Le format, the result is always
+ * different.  For example, the last 2 digits in C3 should be 59, not 67.
+ * 67 is apparently from rounding an extra-precision value to 36 decimal
+ * places.
+ */
+static const long double
+C3  =  1.66666666666666666666666666666666667e-1L,
+C4  =  4.16666666666666666666666666666666645e-2L,
+C5  =  8.33333333333333333333333333333371638e-3L,
+C6  =  1.38888888888888888888888888891188658e-3L,
+C7  =  1.98412698412698412698412697235950394e-4L,
+C8  =  2.48015873015873015873015112487849040e-5L,
+C9  =  2.75573192239858906525606685484412005e-6L,
+C10 =  2.75573192239858906612966093057020362e-7L,
+C11 =  2.50521083854417203619031960151253944e-8L,
+C12 =  2.08767569878679576457272282566520649e-9L,
+C13 =  1.60590438367252471783548748824255707e-10L;
+
+/*
+ * XXX this has 1 more coeff than needed.
+ * XXX can start the double coeffs but not the double mults at C10.
+ * With my coeffs (C10-C17 double; s = best_s):
+ * Domain [-0.1659, 0.03125], range ~[-1.1976e-37, 1.1976e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
+ */
+static const double
+C14 =  1.1470745580491932e-11,		/*  0x1.93974a81dae30p-37 */
+C15 =  7.6471620181090468e-13,		/*  0x1.ae7f3820adab1p-41 */
+C16 =  4.7793721460260450e-14,		/*  0x1.ae7cd18a18eacp-45 */
+C17 =  2.8074757356658877e-15,		/*  0x1.949992a1937d9p-49 */
+C18 =  1.4760610323699476e-16;		/*  0x1.545b43aabfbcdp-53 */
+
+/*
+ * Domain [0.03125, 0.1659], range ~[-2.7676e-37, -1.0367e-38]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| < 2**-121.44
+ */
+static const long double
+D3  =  1.66666666666666666666666666666682245e-1L,
+D4  =  4.16666666666666666666666666634228324e-2L,
+D5  =  8.33333333333333333333333364022244481e-3L,
+D6  =  1.38888888888888888888887138722762072e-3L,
+D7  =  1.98412698412698412699085805424661471e-4L,
+D8  =  2.48015873015873015687993712101479612e-5L,
+D9  =  2.75573192239858944101036288338208042e-6L,
+D10 =  2.75573192239853161148064676533754048e-7L,
+D11 =  2.50521083855084570046480450935267433e-8L,
+D12 =  2.08767569819738524488686318024854942e-9L,
+D13 =  1.60590442297008495301927448122499313e-10L;
+
+/*
+ * XXX this has 1 more coeff than needed.
+ * XXX can start the double coeffs but not the double mults at D11.
+ * With my coeffs (D11-D16 double):
+ * Domain [0.03125, 0.1659], range ~[-1.1980e-37, 1.1980e-37]:
+ * |(exp(x)-1-x-x**2/2)/x - p(x)| ~< 2**-122.65
+ */
+static const double
+D14 =  1.1470726176204336e-11,		/*  0x1.93971dc395d9ep-37 */
+D15 =  7.6478532249581686e-13,		/*  0x1.ae892e3D16fcep-41 */
+D16 =  4.7628892832607741e-14,		/*  0x1.ad00Dfe41feccp-45 */
+D17 =  3.0524857220358650e-15;		/*  0x1.D7e8d886Df921p-49 */
+
+long double
+expm1l(long double x)
+{
+	union IEEEl2bits u, v;
+	long double hx2_hi, hx2_lo, q, r, r1, t, twomk, twopk, x_hi;
+	long double x_lo, x2;
+	double dr, dx, fn, r2;
+	int k, n, n2;
+	uint16_t hx, ix;
+
+	DOPRINT_START(&x);
+
+	/* Filter out exceptional cases. */
+	u.e = x;
+	hx = u.xbits.expsign;
+	ix = hx & 0x7fff;
+	if (ix >= BIAS + 7) {		/* |x| >= 128 or x is NaN */
+		if (ix == BIAS + LDBL_MAX_EXP) {
+			if (hx & 0x8000)  /* x is -Inf or -NaN */
+				RETURNP(-1 / x - 1);
+			RETURNP(x + x);	/* x is +Inf or +NaN */
+		}
+		if (x > o_threshold)
+			RETURNP(huge * huge);
+		/*
+		 * expm1l() never underflows, but it must avoid
+		 * unrepresentable large negative exponents.  We used a
+		 * much smaller threshold for large |x| above than in
+		 * expl() so as to handle not so large negative exponents
+		 * in the same way as large ones here.
+		 */
+		if (hx & 0x8000)	/* x <= -128 */
+			RETURN2P(tiny, -1);	/* good for x < -114ln2 - eps */
+	}
+
+	ENTERI();
+
+	if (T1 < x && x < T2) {
+		x2 = x * x;
+		dx = x;
+
+		if (x < T3) {
+			if (ix < BIAS - 113) {	/* |x| < 0x1p-113 */
+				/* x (rounded) with inexact if x != 0: */
+				RETURNPI(x == 0 ? x :
+				    (0x1p200 * x + fabsl(x)) * 0x1p-200);
+			}
+			q = x * x2 * C3 + x2 * x2 * (C4 + x * (C5 + x * (C6 +
+			    x * (C7 + x * (C8 + x * (C9 + x * (C10 +
+			    x * (C11 + x * (C12 + x * (C13 +
+			    dx * (C14 + dx * (C15 + dx * (C16 +
+			    dx * (C17 + dx * C18))))))))))))));
+		} else {
+			q = x * x2 * D3 + x2 * x2 * (D4 + x * (D5 + x * (D6 +
+			    x * (D7 + x * (D8 + x * (D9 + x * (D10 +
+			    x * (D11 + x * (D12 + x * (D13 +
+			    dx * (D14 + dx * (D15 + dx * (D16 +
+			    dx * D17)))))))))))));
+		}
+
+		x_hi = (float)x;
+		x_lo = x - x_hi;
+		hx2_hi = x_hi * x_hi / 2;
+		hx2_lo = x_lo * (x + x_hi) / 2;
+		if (ix >= BIAS - 7)
+			RETURN2PI(hx2_hi + x_hi, hx2_lo + x_lo + q);
+		else
+			RETURN2PI(x, hx2_lo + q + hx2_hi);
+	}
+
+	/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
+	/* Use a specialized rint() to get fn.  Assume round-to-nearest. */
+	fn = (double)x * INV_L + 0x1.8p52 - 0x1.8p52;
+#if defined(HAVE_EFFICIENT_IRINT)
+	n = irint(fn);
+#else
+	n = (int)fn;
+#endif
+	n2 = (unsigned)n % INTERVALS;
+	k = n >> LOG2_INTERVALS;
+	r1 = x - fn * L1;
+	r2 = fn * -L2;
+	r = r1 + r2;
+
+	/* Prepare scale factor. */
+	v.e = 1;
+	v.xbits.expsign = BIAS + k;
+	twopk = v.e;
+
+	/*
+	 * Evaluate lower terms of
+	 * expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
+	 */
+	dr = r;
+	q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
+	    dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
+
+	t = tbl[n2].lo + tbl[n2].hi;
+
+	if (k == 0) {
+		t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
+		    tbl[n2].hi * r1);
+		RETURNI(t);
+	}
+	if (k == -1) {
+		t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
+		    tbl[n2].hi * r1);
+		RETURNI(t / 2);
+	}
+	if (k < -7) {
+		t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+		RETURNI(t * twopk - 1);
+	}
+	if (k > 2 * LDBL_MANT_DIG - 1) {
+		t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
+		if (k == LDBL_MAX_EXP)
+			RETURNI(t * 2 * 0x1p16383L - 1);
+		RETURNI(t * twopk - 1);
+	}
+
+	v.xbits.expsign = BIAS - k;
+	twomk = v.e;
+
+	if (k > LDBL_MANT_DIG - 1)
+		t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
+	else
+		t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
+	RETURNI(t * twopk);
+}
diff --git a/libm/upstream-freebsd/lib/msun/ld128/s_logl.c b/libm/upstream-freebsd/lib/msun/ld128/s_logl.c
new file mode 100644
index 0000000..391d623
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/s_logl.c
@@ -0,0 +1,737 @@
+/*-
+ * Copyright (c) 2007-2013 Bruce D. Evans
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/**
+ * Implementation of the natural logarithm of x for 128-bit format.
+ *
+ * First decompose x into its base 2 representation:
+ *
+ *    log(x) = log(X * 2**k), where X is in [1, 2)
+ *           = log(X) + k * log(2).
+ *
+ * Let X = X_i + e, where X_i is the center of one of the intervals
+ * [-1.0/256, 1.0/256), [1.0/256, 3.0/256), .... [2.0-1.0/256, 2.0+1.0/256)
+ * and X is in this interval.  Then
+ *
+ *    log(X) = log(X_i + e)
+ *           = log(X_i * (1 + e / X_i))
+ *           = log(X_i) + log(1 + e / X_i).
+ *
+ * The values log(X_i) are tabulated below.  Let d = e / X_i and use
+ *
+ *    log(1 + d) = p(d)
+ *
+ * where p(d) = d - 0.5*d*d + ... is a special minimax polynomial of
+ * suitably high degree.
+ *
+ * To get sufficiently small roundoff errors, k * log(2), log(X_i), and
+ * sometimes (if |k| is not large) the first term in p(d) must be evaluated
+ * and added up in extra precision.  Extra precision is not needed for the
+ * rest of p(d).  In the worst case when k = 0 and log(X_i) is 0, the final
+ * error is controlled mainly by the error in the second term in p(d).  The
+ * error in this term itself is at most 0.5 ulps from the d*d operation in
+ * it.  The error in this term relative to the first term is thus at most
+ * 0.5 * |-0.5| * |d| < 1.0/1024 ulps.  We aim for an accumulated error of
+ * at most twice this at the point of the final rounding step.  Thus the
+ * final error should be at most 0.5 + 1.0/512 = 0.5020 ulps.  Exhaustive
+ * testing of a float variant of this function showed a maximum final error
+ * of 0.5008 ulps.  Non-exhaustive testing of a double variant of this
+ * function showed a maximum final error of 0.5078 ulps (near 1+1.0/256).
+ *
+ * We made the maximum of |d| (and thus the total relative error and the
+ * degree of p(d)) small by using a large number of intervals.  Using
+ * centers of intervals instead of endpoints reduces this maximum by a
+ * factor of 2 for a given number of intervals.  p(d) is special only
+ * in beginning with the Taylor coefficients 0 + 1*d, which tends to happen
+ * naturally.  The most accurate minimax polynomial of a given degree might
+ * be different, but then we wouldn't want it since we would have to do
+ * extra work to avoid roundoff error (especially for P0*d instead of d).
+ */
+
+#ifdef DEBUG
+#include <assert.h>
+#include <fenv.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#ifndef NO_STRUCT_RETURN
+#define	STRUCT_RETURN
+#endif
+#include "math_private.h"
+
+#if !defined(NO_UTAB) && !defined(NO_UTABL)
+#define	USE_UTAB
+#endif
+
+/*
+ * Domain [-0.005280, 0.004838], range ~[-1.1577e-37, 1.1582e-37]:
+ * |log(1 + d)/d - p(d)| < 2**-122.7
+ */
+static const long double
+P2 = -0.5L,
+P3 =  3.33333333333333333333333333333233795e-1L,	/*  0x15555555555555555555555554d42.0p-114L */
+P4 = -2.49999999999999999999999999941139296e-1L,	/* -0x1ffffffffffffffffffffffdab14e.0p-115L */
+P5 =  2.00000000000000000000000085468039943e-1L,	/*  0x19999999999999999999a6d3567f4.0p-115L */
+P6 = -1.66666666666666666666696142372698408e-1L,	/* -0x15555555555555555567267a58e13.0p-115L */
+P7 =  1.42857142857142857119522943477166120e-1L,	/*  0x1249249249249248ed79a0ae434de.0p-115L */
+P8 = -1.24999999999999994863289015033581301e-1L;	/* -0x1fffffffffffffa13e91765e46140.0p-116L */
+/* Double precision gives ~ 53 + log2(P9 * max(|d|)**8) ~= 120 bits. */
+static const double
+P9 =  1.1111111111111401e-1,		/*  0x1c71c71c71c7ed.0p-56 */
+P10 = -1.0000000000040135e-1,		/* -0x199999999a0a92.0p-56 */
+P11 =  9.0909090728136258e-2,		/*  0x1745d173962111.0p-56 */
+P12 = -8.3333318851855284e-2,		/* -0x1555551722c7a3.0p-56 */
+P13 =  7.6928634666404178e-2,		/*  0x13b1985204a4ae.0p-56 */
+P14 = -7.1626810078462499e-2;		/* -0x12562276cdc5d0.0p-56 */
+
+static volatile const double zero = 0;
+
+#define	INTERVALS	128
+#define	LOG2_INTERVALS	7
+#define	TSIZE		(INTERVALS + 1)
+#define	G(i)		(T[(i)].G)
+#define	F_hi(i)		(T[(i)].F_hi)
+#define	F_lo(i)		(T[(i)].F_lo)
+#define	ln2_hi		F_hi(TSIZE - 1)
+#define	ln2_lo		F_lo(TSIZE - 1)
+#define	E(i)		(U[(i)].E)
+#define	H(i)		(U[(i)].H)
+
+static const struct {
+	float	G;			/* 1/(1 + i/128) rounded to 8/9 bits */
+	float	F_hi;			/* log(1 / G_i) rounded (see below) */
+	/* The compiler will insert 8 bytes of padding here. */
+	long double F_lo;		/* next 113 bits for log(1 / G_i) */
+} T[TSIZE] = {
+	/*
+	 * ln2_hi and each F_hi(i) are rounded to a number of bits that
+	 * makes F_hi(i) + dk*ln2_hi exact for all i and all dk.
+	 *
+	 * The last entry (for X just below 2) is used to define ln2_hi
+	 * and ln2_lo, to ensure that F_hi(i) and F_lo(i) cancel exactly
+	 * with dk*ln2_hi and dk*ln2_lo, respectively, when dk = -1.
+	 * This is needed for accuracy when x is just below 1.  (To avoid
+	 * special cases, such x are "reduced" strangely to X just below
+	 * 2 and dk = -1, and then the exact cancellation is needed
+	 * because any the error from any non-exactness would be too
+	 * large).
+	 *
+	 * The relevant range of dk is [-16445, 16383].  The maximum number
+	 * of bits in F_hi(i) that works is very dependent on i but has
+	 * a minimum of 93.  We only need about 12 bits in F_hi(i) for
+	 * it to provide enough extra precision.
+	 *
+	 * We round F_hi(i) to 24 bits so that it can have type float,
+	 * mainly to minimize the size of the table.  Using all 24 bits
+	 * in a float for it automatically satisfies the above constraints.
+	 */
+     0x800000.0p-23,  0,               0,
+     0xfe0000.0p-24,  0x8080ac.0p-30, -0x14ee431dae6674afa0c4bfe16e8fd.0p-144L,
+     0xfc0000.0p-24,  0x8102b3.0p-29, -0x1db29ee2d83717be918e1119642ab.0p-144L,
+     0xfa0000.0p-24,  0xc24929.0p-29,  0x1191957d173697cf302cc9476f561.0p-143L,
+     0xf80000.0p-24,  0x820aec.0p-28,  0x13ce8888e02e78eba9b1113bc1c18.0p-142L,
+     0xf60000.0p-24,  0xa33577.0p-28, -0x17a4382ce6eb7bfa509bec8da5f22.0p-142L,
+     0xf48000.0p-24,  0xbc42cb.0p-28, -0x172a21161a107674986dcdca6709c.0p-143L,
+     0xf30000.0p-24,  0xd57797.0p-28, -0x1e09de07cb958897a3ea46e84abb3.0p-142L,
+     0xf10000.0p-24,  0xf7518e.0p-28,  0x1ae1eec1b036c484993c549c4bf40.0p-151L,
+     0xef0000.0p-24,  0x8cb9df.0p-27, -0x1d7355325d560d9e9ab3d6ebab580.0p-141L,
+     0xed8000.0p-24,  0x999ec0.0p-27, -0x1f9f02d256d5037108f4ec21e48cd.0p-142L,
+     0xec0000.0p-24,  0xa6988b.0p-27, -0x16fc0a9d12c17a70f7a684c596b12.0p-143L,
+     0xea0000.0p-24,  0xb80698.0p-27,  0x15d581c1e8da99ded322fb08b8462.0p-141L,
+     0xe80000.0p-24,  0xc99af3.0p-27, -0x1535b3ba8f150ae09996d7bb4653e.0p-143L,
+     0xe70000.0p-24,  0xd273b2.0p-27,  0x163786f5251aefe0ded34c8318f52.0p-145L,
+     0xe50000.0p-24,  0xe442c0.0p-27,  0x1bc4b2368e32d56699c1799a244d4.0p-144L,
+     0xe38000.0p-24,  0xf1b83f.0p-27,  0x1c6090f684e6766abceccab1d7174.0p-141L,
+     0xe20000.0p-24,  0xff448a.0p-27, -0x1890aa69ac9f4215f93936b709efb.0p-142L,
+     0xe08000.0p-24,  0x8673f6.0p-26,  0x1b9985194b6affd511b534b72a28e.0p-140L,
+     0xdf0000.0p-24,  0x8d515c.0p-26, -0x1dc08d61c6ef1d9b2ef7e68680598.0p-143L,
+     0xdd8000.0p-24,  0x943a9e.0p-26, -0x1f72a2dac729b3f46662238a9425a.0p-142L,
+     0xdc0000.0p-24,  0x9b2fe6.0p-26, -0x1fd4dfd3a0afb9691aed4d5e3df94.0p-140L,
+     0xda8000.0p-24,  0xa2315d.0p-26, -0x11b26121629c46c186384993e1c93.0p-142L,
+     0xd90000.0p-24,  0xa93f2f.0p-26,  0x1286d633e8e5697dc6a402a56fce1.0p-141L,
+     0xd78000.0p-24,  0xb05988.0p-26,  0x16128eba9367707ebfa540e45350c.0p-144L,
+     0xd60000.0p-24,  0xb78094.0p-26,  0x16ead577390d31ef0f4c9d43f79b2.0p-140L,
+     0xd50000.0p-24,  0xbc4c6c.0p-26,  0x151131ccf7c7b75e7d900b521c48d.0p-141L,
+     0xd38000.0p-24,  0xc3890a.0p-26, -0x115e2cd714bd06508aeb00d2ae3e9.0p-140L,
+     0xd20000.0p-24,  0xcad2d7.0p-26, -0x1847f406ebd3af80485c2f409633c.0p-142L,
+     0xd10000.0p-24,  0xcfb620.0p-26,  0x1c2259904d686581799fbce0b5f19.0p-141L,
+     0xcf8000.0p-24,  0xd71653.0p-26,  0x1ece57a8d5ae54f550444ecf8b995.0p-140L,
+     0xce0000.0p-24,  0xde843a.0p-26, -0x1f109d4bc4595412b5d2517aaac13.0p-141L,
+     0xcd0000.0p-24,  0xe37fde.0p-26,  0x1bc03dc271a74d3a85b5b43c0e727.0p-141L,
+     0xcb8000.0p-24,  0xeb050c.0p-26, -0x1bf2badc0df841a71b79dd5645b46.0p-145L,
+     0xca0000.0p-24,  0xf29878.0p-26, -0x18efededd89fbe0bcfbe6d6db9f66.0p-147L,
+     0xc90000.0p-24,  0xf7ad6f.0p-26,  0x1373ff977baa6911c7bafcb4d84fb.0p-141L,
+     0xc80000.0p-24,  0xfcc8e3.0p-26,  0x196766f2fb328337cc050c6d83b22.0p-140L,
+     0xc68000.0p-24,  0x823f30.0p-25,  0x19bd076f7c434e5fcf1a212e2a91e.0p-139L,
+     0xc58000.0p-24,  0x84d52c.0p-25, -0x1a327257af0f465e5ecab5f2a6f81.0p-139L,
+     0xc40000.0p-24,  0x88bc74.0p-25,  0x113f23def19c5a0fe396f40f1dda9.0p-141L,
+     0xc30000.0p-24,  0x8b5ae6.0p-25,  0x1759f6e6b37de945a049a962e66c6.0p-139L,
+     0xc20000.0p-24,  0x8dfccb.0p-25,  0x1ad35ca6ed5147bdb6ddcaf59c425.0p-141L,
+     0xc10000.0p-24,  0x90a22b.0p-25,  0x1a1d71a87deba46bae9827221dc98.0p-139L,
+     0xbf8000.0p-24,  0x94a0d8.0p-25, -0x139e5210c2b730e28aba001a9b5e0.0p-140L,
+     0xbe8000.0p-24,  0x974f16.0p-25, -0x18f6ebcff3ed72e23e13431adc4a5.0p-141L,
+     0xbd8000.0p-24,  0x9a00f1.0p-25, -0x1aa268be39aab7148e8d80caa10b7.0p-139L,
+     0xbc8000.0p-24,  0x9cb672.0p-25, -0x14c8815839c5663663d15faed7771.0p-139L,
+     0xbb0000.0p-24,  0xa0cda1.0p-25,  0x1eaf46390dbb2438273918db7df5c.0p-141L,
+     0xba0000.0p-24,  0xa38c6e.0p-25,  0x138e20d831f698298adddd7f32686.0p-141L,
+     0xb90000.0p-24,  0xa64f05.0p-25, -0x1e8d3c41123615b147a5d47bc208f.0p-142L,
+     0xb80000.0p-24,  0xa91570.0p-25,  0x1ce28f5f3840b263acb4351104631.0p-140L,
+     0xb70000.0p-24,  0xabdfbb.0p-25, -0x186e5c0a42423457e22d8c650b355.0p-139L,
+     0xb60000.0p-24,  0xaeadef.0p-25, -0x14d41a0b2a08a465dc513b13f567d.0p-143L,
+     0xb50000.0p-24,  0xb18018.0p-25,  0x16755892770633947ffe651e7352f.0p-139L,
+     0xb40000.0p-24,  0xb45642.0p-25, -0x16395ebe59b15228bfe8798d10ff0.0p-142L,
+     0xb30000.0p-24,  0xb73077.0p-25,  0x1abc65c8595f088b61a335f5b688c.0p-140L,
+     0xb20000.0p-24,  0xba0ec4.0p-25, -0x1273089d3dad88e7d353e9967d548.0p-139L,
+     0xb10000.0p-24,  0xbcf133.0p-25,  0x10f9f67b1f4bbf45de06ecebfaf6d.0p-139L,
+     0xb00000.0p-24,  0xbfd7d2.0p-25, -0x109fab904864092b34edda19a831e.0p-140L,
+     0xaf0000.0p-24,  0xc2c2ac.0p-25, -0x1124680aa43333221d8a9b475a6ba.0p-139L,
+     0xae8000.0p-24,  0xc439b3.0p-25, -0x1f360cc4710fbfe24b633f4e8d84d.0p-140L,
+     0xad8000.0p-24,  0xc72afd.0p-25, -0x132d91f21d89c89c45003fc5d7807.0p-140L,
+     0xac8000.0p-24,  0xca20a2.0p-25, -0x16bf9b4d1f8da8002f2449e174504.0p-139L,
+     0xab8000.0p-24,  0xcd1aae.0p-25,  0x19deb5ce6a6a8717d5626e16acc7d.0p-141L,
+     0xaa8000.0p-24,  0xd0192f.0p-25,  0x1a29fb48f7d3ca87dabf351aa41f4.0p-139L,
+     0xaa0000.0p-24,  0xd19a20.0p-25,  0x1127d3c6457f9d79f51dcc73014c9.0p-141L,
+     0xa90000.0p-24,  0xd49f6a.0p-25, -0x1ba930e486a0ac42d1bf9199188e7.0p-141L,
+     0xa80000.0p-24,  0xd7a94b.0p-25, -0x1b6e645f31549dd1160bcc45c7e2c.0p-139L,
+     0xa70000.0p-24,  0xdab7d0.0p-25,  0x1118a425494b610665377f15625b6.0p-140L,
+     0xa68000.0p-24,  0xdc40d5.0p-25,  0x1966f24d29d3a2d1b2176010478be.0p-140L,
+     0xa58000.0p-24,  0xdf566d.0p-25, -0x1d8e52eb2248f0c95dd83626d7333.0p-142L,
+     0xa48000.0p-24,  0xe270ce.0p-25, -0x1ee370f96e6b67ccb006a5b9890ea.0p-140L,
+     0xa40000.0p-24,  0xe3ffce.0p-25,  0x1d155324911f56db28da4d629d00a.0p-140L,
+     0xa30000.0p-24,  0xe72179.0p-25, -0x1fe6e2f2f867d8f4d60c713346641.0p-140L,
+     0xa20000.0p-24,  0xea4812.0p-25,  0x1b7be9add7f4d3b3d406b6cbf3ce5.0p-140L,
+     0xa18000.0p-24,  0xebdd3d.0p-25,  0x1b3cfb3f7511dd73692609040ccc2.0p-139L,
+     0xa08000.0p-24,  0xef0b5b.0p-25, -0x1220de1f7301901b8ad85c25afd09.0p-139L,
+     0xa00000.0p-24,  0xf0a451.0p-25, -0x176364c9ac81cc8a4dfb804de6867.0p-140L,
+     0x9f0000.0p-24,  0xf3da16.0p-25,  0x1eed6b9aafac8d42f78d3e65d3727.0p-141L,
+     0x9e8000.0p-24,  0xf576e9.0p-25,  0x1d593218675af269647b783d88999.0p-139L,
+     0x9d8000.0p-24,  0xf8b47c.0p-25, -0x13e8eb7da053e063714615f7cc91d.0p-144L,
+     0x9d0000.0p-24,  0xfa553f.0p-25,  0x1c063259bcade02951686d5373aec.0p-139L,
+     0x9c0000.0p-24,  0xfd9ac5.0p-25,  0x1ef491085fa3c1649349630531502.0p-139L,
+     0x9b8000.0p-24,  0xff3f8c.0p-25,  0x1d607a7c2b8c5320619fb9433d841.0p-139L,
+     0x9a8000.0p-24,  0x814697.0p-24, -0x12ad3817004f3f0bdff99f932b273.0p-138L,
+     0x9a0000.0p-24,  0x821b06.0p-24, -0x189fc53117f9e54e78103a2bc1767.0p-141L,
+     0x990000.0p-24,  0x83c5f8.0p-24,  0x14cf15a048907b7d7f47ddb45c5a3.0p-139L,
+     0x988000.0p-24,  0x849c7d.0p-24,  0x1cbb1d35fb82873b04a9af1dd692c.0p-138L,
+     0x978000.0p-24,  0x864ba6.0p-24,  0x1128639b814f9b9770d8cb6573540.0p-138L,
+     0x970000.0p-24,  0x87244c.0p-24,  0x184733853300f002e836dfd47bd41.0p-139L,
+     0x968000.0p-24,  0x87fdaa.0p-24,  0x109d23aef77dd5cd7cc94306fb3ff.0p-140L,
+     0x958000.0p-24,  0x89b293.0p-24, -0x1a81ef367a59de2b41eeebd550702.0p-138L,
+     0x950000.0p-24,  0x8a8e20.0p-24, -0x121ad3dbb2f45275c917a30df4ac9.0p-138L,
+     0x948000.0p-24,  0x8b6a6a.0p-24, -0x1cfb981628af71a89df4e6df2e93b.0p-139L,
+     0x938000.0p-24,  0x8d253a.0p-24, -0x1d21730ea76cfdec367828734cae5.0p-139L,
+     0x930000.0p-24,  0x8e03c2.0p-24,  0x135cc00e566f76b87333891e0dec4.0p-138L,
+     0x928000.0p-24,  0x8ee30d.0p-24, -0x10fcb5df257a263e3bf446c6e3f69.0p-140L,
+     0x918000.0p-24,  0x90a3ee.0p-24, -0x16e171b15433d723a4c7380a448d8.0p-139L,
+     0x910000.0p-24,  0x918587.0p-24, -0x1d050da07f3236f330972da2a7a87.0p-139L,
+     0x908000.0p-24,  0x9267e7.0p-24,  0x1be03669a5268d21148c6002becd3.0p-139L,
+     0x8f8000.0p-24,  0x942f04.0p-24,  0x10b28e0e26c336af90e00533323ba.0p-139L,
+     0x8f0000.0p-24,  0x9513c3.0p-24,  0x1a1d820da57cf2f105a89060046aa.0p-138L,
+     0x8e8000.0p-24,  0x95f950.0p-24, -0x19ef8f13ae3cf162409d8ea99d4c0.0p-139L,
+     0x8e0000.0p-24,  0x96dfab.0p-24, -0x109e417a6e507b9dc10dac743ad7a.0p-138L,
+     0x8d0000.0p-24,  0x98aed2.0p-24,  0x10d01a2c5b0e97c4990b23d9ac1f5.0p-139L,
+     0x8c8000.0p-24,  0x9997a2.0p-24, -0x1d6a50d4b61ea74540bdd2aa99a42.0p-138L,
+     0x8c0000.0p-24,  0x9a8145.0p-24,  0x1b3b190b83f9527e6aba8f2d783c1.0p-138L,
+     0x8b8000.0p-24,  0x9b6bbf.0p-24,  0x13a69fad7e7abe7ba81c664c107e0.0p-138L,
+     0x8b0000.0p-24,  0x9c5711.0p-24, -0x11cd12316f576aad348ae79867223.0p-138L,
+     0x8a8000.0p-24,  0x9d433b.0p-24,  0x1c95c444b807a246726b304ccae56.0p-139L,
+     0x898000.0p-24,  0x9f1e22.0p-24, -0x1b9c224ea698c2f9b47466d6123fe.0p-139L,
+     0x890000.0p-24,  0xa00ce1.0p-24,  0x125ca93186cf0f38b4619a2483399.0p-141L,
+     0x888000.0p-24,  0xa0fc80.0p-24, -0x1ee38a7bc228b3597043be78eaf49.0p-139L,
+     0x880000.0p-24,  0xa1ed00.0p-24, -0x1a0db876613d204147dc69a07a649.0p-138L,
+     0x878000.0p-24,  0xa2de62.0p-24,  0x193224e8516c008d3602a7b41c6e8.0p-139L,
+     0x870000.0p-24,  0xa3d0a9.0p-24,  0x1fa28b4d2541aca7d5844606b2421.0p-139L,
+     0x868000.0p-24,  0xa4c3d6.0p-24,  0x1c1b5760fb4571acbcfb03f16daf4.0p-138L,
+     0x858000.0p-24,  0xa6acea.0p-24,  0x1fed5d0f65949c0a345ad743ae1ae.0p-140L,
+     0x850000.0p-24,  0xa7a2d4.0p-24,  0x1ad270c9d749362382a7688479e24.0p-140L,
+     0x848000.0p-24,  0xa899ab.0p-24,  0x199ff15ce532661ea9643a3a2d378.0p-139L,
+     0x840000.0p-24,  0xa99171.0p-24,  0x1a19e15ccc45d257530a682b80490.0p-139L,
+     0x838000.0p-24,  0xaa8a28.0p-24, -0x121a14ec532b35ba3e1f868fd0b5e.0p-140L,
+     0x830000.0p-24,  0xab83d1.0p-24,  0x1aee319980bff3303dd481779df69.0p-139L,
+     0x828000.0p-24,  0xac7e6f.0p-24, -0x18ffd9e3900345a85d2d86161742e.0p-140L,
+     0x820000.0p-24,  0xad7a03.0p-24, -0x1e4db102ce29f79b026b64b42caa1.0p-140L,
+     0x818000.0p-24,  0xae768f.0p-24,  0x17c35c55a04a82ab19f77652d977a.0p-141L,
+     0x810000.0p-24,  0xaf7415.0p-24,  0x1448324047019b48d7b98c1cf7234.0p-138L,
+     0x808000.0p-24,  0xb07298.0p-24, -0x1750ee3915a197e9c7359dd94152f.0p-138L,
+     0x800000.0p-24,  0xb17218.0p-24, -0x105c610ca86c3898cff81a12a17e2.0p-141L,
+};
+
+#ifdef USE_UTAB
+static const struct {
+	float	H;			/* 1 + i/INTERVALS (exact) */
+	float	E;			/* H(i) * G(i) - 1 (exact) */
+} U[TSIZE] = {
+	 0x800000.0p-23,  0,
+	 0x810000.0p-23, -0x800000.0p-37,
+	 0x820000.0p-23, -0x800000.0p-35,
+	 0x830000.0p-23, -0x900000.0p-34,
+	 0x840000.0p-23, -0x800000.0p-33,
+	 0x850000.0p-23, -0xc80000.0p-33,
+	 0x860000.0p-23, -0xa00000.0p-36,
+	 0x870000.0p-23,  0x940000.0p-33,
+	 0x880000.0p-23,  0x800000.0p-35,
+	 0x890000.0p-23, -0xc80000.0p-34,
+	 0x8a0000.0p-23,  0xe00000.0p-36,
+	 0x8b0000.0p-23,  0x900000.0p-33,
+	 0x8c0000.0p-23, -0x800000.0p-35,
+	 0x8d0000.0p-23, -0xe00000.0p-33,
+	 0x8e0000.0p-23,  0x880000.0p-33,
+	 0x8f0000.0p-23, -0xa80000.0p-34,
+	 0x900000.0p-23, -0x800000.0p-35,
+	 0x910000.0p-23,  0x800000.0p-37,
+	 0x920000.0p-23,  0x900000.0p-35,
+	 0x930000.0p-23,  0xd00000.0p-35,
+	 0x940000.0p-23,  0xe00000.0p-35,
+	 0x950000.0p-23,  0xc00000.0p-35,
+	 0x960000.0p-23,  0xe00000.0p-36,
+	 0x970000.0p-23, -0x800000.0p-38,
+	 0x980000.0p-23, -0xc00000.0p-35,
+	 0x990000.0p-23, -0xd00000.0p-34,
+	 0x9a0000.0p-23,  0x880000.0p-33,
+	 0x9b0000.0p-23,  0xe80000.0p-35,
+	 0x9c0000.0p-23, -0x800000.0p-35,
+	 0x9d0000.0p-23,  0xb40000.0p-33,
+	 0x9e0000.0p-23,  0x880000.0p-34,
+	 0x9f0000.0p-23, -0xe00000.0p-35,
+	 0xa00000.0p-23,  0x800000.0p-33,
+	 0xa10000.0p-23, -0x900000.0p-36,
+	 0xa20000.0p-23, -0xb00000.0p-33,
+	 0xa30000.0p-23, -0xa00000.0p-36,
+	 0xa40000.0p-23,  0x800000.0p-33,
+	 0xa50000.0p-23, -0xf80000.0p-35,
+	 0xa60000.0p-23,  0x880000.0p-34,
+	 0xa70000.0p-23, -0x900000.0p-33,
+	 0xa80000.0p-23, -0x800000.0p-35,
+	 0xa90000.0p-23,  0x900000.0p-34,
+	 0xaa0000.0p-23,  0xa80000.0p-33,
+	 0xab0000.0p-23, -0xac0000.0p-34,
+	 0xac0000.0p-23, -0x800000.0p-37,
+	 0xad0000.0p-23,  0xf80000.0p-35,
+	 0xae0000.0p-23,  0xf80000.0p-34,
+	 0xaf0000.0p-23, -0xac0000.0p-33,
+	 0xb00000.0p-23, -0x800000.0p-33,
+	 0xb10000.0p-23, -0xb80000.0p-34,
+	 0xb20000.0p-23, -0x800000.0p-34,
+	 0xb30000.0p-23, -0xb00000.0p-35,
+	 0xb40000.0p-23, -0x800000.0p-35,
+	 0xb50000.0p-23, -0xe00000.0p-36,
+	 0xb60000.0p-23, -0x800000.0p-35,
+	 0xb70000.0p-23, -0xb00000.0p-35,
+	 0xb80000.0p-23, -0x800000.0p-34,
+	 0xb90000.0p-23, -0xb80000.0p-34,
+	 0xba0000.0p-23, -0x800000.0p-33,
+	 0xbb0000.0p-23, -0xac0000.0p-33,
+	 0xbc0000.0p-23,  0x980000.0p-33,
+	 0xbd0000.0p-23,  0xbc0000.0p-34,
+	 0xbe0000.0p-23,  0xe00000.0p-36,
+	 0xbf0000.0p-23, -0xb80000.0p-35,
+	 0xc00000.0p-23, -0x800000.0p-33,
+	 0xc10000.0p-23,  0xa80000.0p-33,
+	 0xc20000.0p-23,  0x900000.0p-34,
+	 0xc30000.0p-23, -0x800000.0p-35,
+	 0xc40000.0p-23, -0x900000.0p-33,
+	 0xc50000.0p-23,  0x820000.0p-33,
+	 0xc60000.0p-23,  0x800000.0p-38,
+	 0xc70000.0p-23, -0x820000.0p-33,
+	 0xc80000.0p-23,  0x800000.0p-33,
+	 0xc90000.0p-23, -0xa00000.0p-36,
+	 0xca0000.0p-23, -0xb00000.0p-33,
+	 0xcb0000.0p-23,  0x840000.0p-34,
+	 0xcc0000.0p-23, -0xd00000.0p-34,
+	 0xcd0000.0p-23,  0x800000.0p-33,
+	 0xce0000.0p-23, -0xe00000.0p-35,
+	 0xcf0000.0p-23,  0xa60000.0p-33,
+	 0xd00000.0p-23, -0x800000.0p-35,
+	 0xd10000.0p-23,  0xb40000.0p-33,
+	 0xd20000.0p-23, -0x800000.0p-35,
+	 0xd30000.0p-23,  0xaa0000.0p-33,
+	 0xd40000.0p-23, -0xe00000.0p-35,
+	 0xd50000.0p-23,  0x880000.0p-33,
+	 0xd60000.0p-23, -0xd00000.0p-34,
+	 0xd70000.0p-23,  0x9c0000.0p-34,
+	 0xd80000.0p-23, -0xb00000.0p-33,
+	 0xd90000.0p-23, -0x800000.0p-38,
+	 0xda0000.0p-23,  0xa40000.0p-33,
+	 0xdb0000.0p-23, -0xdc0000.0p-34,
+	 0xdc0000.0p-23,  0xc00000.0p-35,
+	 0xdd0000.0p-23,  0xca0000.0p-33,
+	 0xde0000.0p-23, -0xb80000.0p-34,
+	 0xdf0000.0p-23,  0xd00000.0p-35,
+	 0xe00000.0p-23,  0xc00000.0p-33,
+	 0xe10000.0p-23, -0xf40000.0p-34,
+	 0xe20000.0p-23,  0x800000.0p-37,
+	 0xe30000.0p-23,  0x860000.0p-33,
+	 0xe40000.0p-23, -0xc80000.0p-33,
+	 0xe50000.0p-23, -0xa80000.0p-34,
+	 0xe60000.0p-23,  0xe00000.0p-36,
+	 0xe70000.0p-23,  0x880000.0p-33,
+	 0xe80000.0p-23, -0xe00000.0p-33,
+	 0xe90000.0p-23, -0xfc0000.0p-34,
+	 0xea0000.0p-23, -0x800000.0p-35,
+	 0xeb0000.0p-23,  0xe80000.0p-35,
+	 0xec0000.0p-23,  0x900000.0p-33,
+	 0xed0000.0p-23,  0xe20000.0p-33,
+	 0xee0000.0p-23, -0xac0000.0p-33,
+	 0xef0000.0p-23, -0xc80000.0p-34,
+	 0xf00000.0p-23, -0x800000.0p-35,
+	 0xf10000.0p-23,  0x800000.0p-35,
+	 0xf20000.0p-23,  0xb80000.0p-34,
+	 0xf30000.0p-23,  0x940000.0p-33,
+	 0xf40000.0p-23,  0xc80000.0p-33,
+	 0xf50000.0p-23, -0xf20000.0p-33,
+	 0xf60000.0p-23, -0xc80000.0p-33,
+	 0xf70000.0p-23, -0xa20000.0p-33,
+	 0xf80000.0p-23, -0x800000.0p-33,
+	 0xf90000.0p-23, -0xc40000.0p-34,
+	 0xfa0000.0p-23, -0x900000.0p-34,
+	 0xfb0000.0p-23, -0xc80000.0p-35,
+	 0xfc0000.0p-23, -0x800000.0p-35,
+	 0xfd0000.0p-23, -0x900000.0p-36,
+	 0xfe0000.0p-23, -0x800000.0p-37,
+	 0xff0000.0p-23, -0x800000.0p-39,
+	 0x800000.0p-22,  0,
+};
+#endif /* USE_UTAB */
+
+#ifdef STRUCT_RETURN
+#define	RETURN1(rp, v) do {	\
+	(rp)->hi = (v);		\
+	(rp)->lo_set = 0;	\
+	return;			\
+} while (0)
+
+#define	RETURN2(rp, h, l) do {	\
+	(rp)->hi = (h);		\
+	(rp)->lo = (l);		\
+	(rp)->lo_set = 1;	\
+	return;			\
+} while (0)
+
+struct ld {
+	long double hi;
+	long double lo;
+	int	lo_set;
+};
+#else
+#define	RETURN1(rp, v)	RETURNF(v)
+#define	RETURN2(rp, h, l)	RETURNI((h) + (l))
+#endif
+
+#ifdef STRUCT_RETURN
+static inline __always_inline void
+k_logl(long double x, struct ld *rp)
+#else
+long double
+logl(long double x)
+#endif
+{
+	long double d, val_hi, val_lo;
+	double dd, dk;
+	uint64_t lx, llx;
+	int i, k;
+	uint16_t hx;
+
+	EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+	k = -16383;
+#if 0 /* Hard to do efficiently.  Don't do it until we support all modes. */
+	if (x == 1)
+		RETURN1(rp, 0);		/* log(1) = +0 in all rounding modes */
+#endif
+	if (hx == 0 || hx >= 0x8000) {	/* zero, negative or subnormal? */
+		if (((hx & 0x7fff) | lx | llx) == 0)
+			RETURN1(rp, -1 / zero);	/* log(+-0) = -Inf */
+		if (hx != 0)
+			/* log(neg or NaN) = qNaN: */
+			RETURN1(rp, (x - x) / zero);
+		x *= 0x1.0p113;		/* subnormal; scale up x */
+		EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+		k = -16383 - 113;
+	} else if (hx >= 0x7fff)
+		RETURN1(rp, x + x);	/* log(Inf or NaN) = Inf or qNaN */
+#ifndef STRUCT_RETURN
+	ENTERI();
+#endif
+	k += hx;
+	dk = k;
+
+	/* Scale x to be in [1, 2). */
+	SET_LDBL_EXPSIGN(x, 0x3fff);
+
+	/* 0 <= i <= INTERVALS: */
+#define	L2I	(49 - LOG2_INTERVALS)
+	i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
+
+	/*
+	 * -0.005280 < d < 0.004838.  In particular, the infinite-
+	 * precision |d| is <= 2**-7.  Rounding of G(i) to 8 bits
+	 * ensures that d is representable without extra precision for
+	 * this bound on |d| (since when this calculation is expressed
+	 * as x*G(i)-1, the multiplication needs as many extra bits as
+	 * G(i) has and the subtraction cancels 8 bits).  But for
+	 * most i (107 cases out of 129), the infinite-precision |d|
+	 * is <= 2**-8.  G(i) is rounded to 9 bits for such i to give
+	 * better accuracy (this works by improving the bound on |d|,
+	 * which in turn allows rounding to 9 bits in more cases).
+	 * This is only important when the original x is near 1 -- it
+	 * lets us avoid using a special method to give the desired
+	 * accuracy for such x.
+	 */
+	if (0)
+		d = x * G(i) - 1;
+	else {
+#ifdef USE_UTAB
+		d = (x - H(i)) * G(i) + E(i);
+#else
+		long double x_hi;
+		double x_lo;
+
+		/*
+		 * Split x into x_hi + x_lo to calculate x*G(i)-1 exactly.
+		 * G(i) has at most 9 bits, so the splitting point is not
+		 * critical.
+		 */
+		INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
+		    llx & 0xffffffffff000000ULL);
+		x_lo = x - x_hi;
+		d = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+	}
+
+	/*
+	 * Our algorithm depends on exact cancellation of F_lo(i) and
+	 * F_hi(i) with dk*ln_2_lo and dk*ln2_hi when k is -1 and i is
+	 * at the end of the table.  This and other technical complications
+	 * make it difficult to avoid the double scaling in (dk*ln2) *
+	 * log(base) for base != e without losing more accuracy and/or
+	 * efficiency than is gained.
+	 */
+	/*
+	 * Use double precision operations wherever possible, since long
+	 * double operations are emulated and are very slow on the only
+	 * known machines that support ld128 (sparc64).  Also, don't try
+	 * to improve parallelism by increasing the number of operations,
+	 * since any parallelism on such machines is needed for the
+	 * emulation.  Horner's method is good for this, and is also good
+	 * for accuracy.  Horner's method doesn't handle the `lo' term
+	 * well, either for efficiency or accuracy.  However, for accuracy
+	 * we evaluate d * d * P2 separately to take advantage of
+	 * by P2 being exact, and this gives a good place to sum the 'lo'
+	 * term too.
+	 */
+	dd = (double)d;
+	val_lo = d * d * d * (P3 +
+	    d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
+	    dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
+	    dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo) + d * d * P2;
+	val_hi = d;
+#ifdef DEBUG
+	if (fetestexcept(FE_UNDERFLOW))
+		breakpoint();
+#endif
+
+	_3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+	RETURN2(rp, val_hi, val_lo);
+}
+
+long double
+log1pl(long double x)
+{
+	long double d, d_hi, f_lo, val_hi, val_lo;
+	long double f_hi, twopminusk;
+	double d_lo, dd, dk;
+	uint64_t lx, llx;
+	int i, k;
+	int16_t ax, hx;
+
+	DOPRINT_START(&x);
+	EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+	if (hx < 0x3fff) {		/* x < 1, or x neg NaN */
+		ax = hx & 0x7fff;
+		if (ax >= 0x3fff) {	/* x <= -1, or x neg NaN */
+			if (ax == 0x3fff && (lx | llx) == 0)
+				RETURNP(-1 / zero);	/* log1p(-1) = -Inf */
+			/* log1p(x < 1, or x NaN) = qNaN: */
+			RETURNP((x - x) / (x - x));
+		}
+		if (ax <= 0x3f8d) {	/* |x| < 2**-113 */
+			if ((int)x == 0)
+				RETURNP(x);	/* x with inexact if x != 0 */
+		}
+		f_hi = 1;
+		f_lo = x;
+	} else if (hx >= 0x7fff) {	/* x +Inf or non-neg NaN */
+		RETURNP(x + x);		/* log1p(Inf or NaN) = Inf or qNaN */
+	} else if (hx < 0x40e1) {	/* 1 <= x < 2**226 */
+		f_hi = x;
+		f_lo = 1;
+	} else {			/* 2**226 <= x < +Inf */
+		f_hi = x;
+		f_lo = 0;		/* avoid underflow of the P3 term */
+	}
+	ENTERI();
+	x = f_hi + f_lo;
+	f_lo = (f_hi - x) + f_lo;
+
+	EXTRACT_LDBL128_WORDS(hx, lx, llx, x);
+	k = -16383;
+
+	k += hx;
+	dk = k;
+
+	SET_LDBL_EXPSIGN(x, 0x3fff);
+	twopminusk = 1;
+	SET_LDBL_EXPSIGN(twopminusk, 0x7ffe - (hx & 0x7fff));
+	f_lo *= twopminusk;
+
+	i = (lx + (1LL << (L2I - 2))) >> (L2I - 1);
+
+	/*
+	 * x*G(i)-1 (with a reduced x) can be represented exactly, as
+	 * above, but now we need to evaluate the polynomial on d =
+	 * (x+f_lo)*G(i)-1 and extra precision is needed for that.
+	 * Since x+x_lo is a hi+lo decomposition and subtracting 1
+	 * doesn't lose too many bits, an inexact calculation for
+	 * f_lo*G(i) is good enough.
+	 */
+	if (0)
+		d_hi = x * G(i) - 1;
+	else {
+#ifdef USE_UTAB
+		d_hi = (x - H(i)) * G(i) + E(i);
+#else
+		long double x_hi;
+		double x_lo;
+
+		INSERT_LDBL128_WORDS(x_hi, 0x3fff, lx,
+		    llx & 0xffffffffff000000ULL);
+		x_lo = x - x_hi;
+		d_hi = x_hi * G(i) - 1 + x_lo * G(i);
+#endif
+	}
+	d_lo = f_lo * G(i);
+
+	/*
+	 * This is _2sumF(d_hi, d_lo) inlined.  The condition
+	 * (d_hi == 0 || |d_hi| >= |d_lo|) for using _2sumF() is not
+	 * always satisifed, so it is not clear that this works, but
+	 * it works in practice.  It works even if it gives a wrong
+	 * normalized d_lo, since |d_lo| > |d_hi| implies that i is
+	 * nonzero and d is tiny, so the F(i) term dominates d_lo.
+	 * In float precision:
+	 * (By exhaustive testing, the worst case is d_hi = 0x1.bp-25.
+	 * And if d is only a little tinier than that, we would have
+	 * another underflow problem for the P3 term; this is also ruled
+	 * out by exhaustive testing.)
+	 */
+	d = d_hi + d_lo;
+	d_lo = d_hi - d + d_lo;
+	d_hi = d;
+
+	dd = (double)d;
+	val_lo = d * d * d * (P3 +
+	    d * (P4 + d * (P5 + d * (P6 + d * (P7 + d * (P8 +
+	    dd * (P9 + dd * (P10 + dd * (P11 + dd * (P12 + dd * (P13 +
+	    dd * P14))))))))))) + (F_lo(i) + dk * ln2_lo + d_lo) + d * d * P2;
+	val_hi = d_hi;
+#ifdef DEBUG
+	if (fetestexcept(FE_UNDERFLOW))
+		breakpoint();
+#endif
+
+	_3sumF(val_hi, val_lo, F_hi(i) + dk * ln2_hi);
+	RETURN2PI(val_hi, val_lo);
+}
+
+#ifdef STRUCT_RETURN
+
+long double
+logl(long double x)
+{
+	struct ld r;
+
+	ENTERI();
+	DOPRINT_START(&x);
+	k_logl(x, &r);
+	RETURNSPI(&r);
+}
+
+/*
+ * 29+113 bit decompositions.  The bits are distributed so that the products
+ * of the hi terms are exact in double precision.  The types are chosen so
+ * that the products of the hi terms are done in at least double precision,
+ * without any explicit conversions.  More natural choices would require a
+ * slow long double precision multiplication.
+ */
+static const double
+invln10_hi =  4.3429448176175356e-1,		/*  0x1bcb7b15000000.0p-54 */
+invln2_hi =  1.4426950402557850e0;		/*  0x17154765000000.0p-52 */
+static const long double
+invln10_lo =  1.41498268538580090791605082294397000e-10L,	/*  0x137287195355baaafad33dc323ee3.0p-145L */
+invln2_lo =  6.33178418956604368501892137426645911e-10L;	/*  0x15c17f0bbbe87fed0691d3e88eb57.0p-143L */
+
+long double
+log10l(long double x)
+{
+	struct ld r;
+	long double lo;
+	float hi;
+
+	ENTERI();
+	DOPRINT_START(&x);
+	k_logl(x, &r);
+	if (!r.lo_set)
+		RETURNPI(r.hi);
+	_2sumF(r.hi, r.lo);
+	hi = r.hi;
+	lo = r.lo + (r.hi - hi);
+	RETURN2PI(invln10_hi * hi,
+	    (invln10_lo + invln10_hi) * lo + invln10_lo * hi);
+}
+
+long double
+log2l(long double x)
+{
+	struct ld r;
+	long double lo;
+	float hi;
+
+	ENTERI();
+	DOPRINT_START(&x);
+	k_logl(x, &r);
+	if (!r.lo_set)
+		RETURNPI(r.hi);
+	_2sumF(r.hi, r.lo);
+	hi = r.hi;
+	lo = r.lo + (r.hi - hi);
+	RETURN2PI(invln2_hi * hi,
+	    (invln2_lo + invln2_hi) * lo + invln2_lo * hi);
+}
+
+#endif /* STRUCT_RETURN */
diff --git a/libm/upstream-freebsd/lib/msun/ld128/s_nanl.c b/libm/upstream-freebsd/lib/msun/ld128/s_nanl.c
new file mode 100644
index 0000000..0f74a13
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/ld128/s_nanl.c
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2007 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+#include "../src/math_private.h"
+
+long double
+nanl(const char *s)
+{
+	union {
+		union IEEEl2bits ieee;
+		uint32_t bits[4];
+	} u;
+
+	_scan_nan(u.bits, 4, s);
+	u.ieee.bits.exp = 0x7fff;
+	u.ieee.bits.manh |= 1ULL << 47;	/* make it a quiet NaN */
+	return (u.ieee.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/catrig.c b/libm/upstream-freebsd/lib/msun/src/catrig.c
new file mode 100644
index 0000000..050a88b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/catrig.c
@@ -0,0 +1,639 @@
+/*-
+ * Copyright (c) 2012 Stephen Montgomery-Smith <stephen@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/catrig.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#undef isinf
+#define isinf(x)	(fabs(x) == INFINITY)
+#undef isnan
+#define isnan(x)	((x) != (x))
+#define	raise_inexact()	do { volatile float junk = 1 + tiny; } while(0)
+#undef signbit
+#define signbit(x)	(__builtin_signbit(x))
+
+/* We need that DBL_EPSILON^2/128 is larger than FOUR_SQRT_MIN. */
+static const double
+A_crossover =		10, /* Hull et al suggest 1.5, but 10 works better */
+B_crossover =		0.6417,			/* suggested by Hull et al */
+FOUR_SQRT_MIN =		0x1p-509,		/* >= 4 * sqrt(DBL_MIN) */
+QUARTER_SQRT_MAX =	0x1p509,		/* <= sqrt(DBL_MAX) / 4 */
+m_e =			2.7182818284590452e0,	/*  0x15bf0a8b145769.0p-51 */
+m_ln2 =			6.9314718055994531e-1,	/*  0x162e42fefa39ef.0p-53 */
+pio2_hi =		1.5707963267948966e0,	/*  0x1921fb54442d18.0p-52 */
+RECIP_EPSILON =		1 / DBL_EPSILON,
+SQRT_3_EPSILON =	2.5809568279517849e-8,	/*  0x1bb67ae8584caa.0p-78 */
+SQRT_6_EPSILON =	3.6500241499888571e-8,	/*  0x13988e1409212e.0p-77 */
+SQRT_MIN =		0x1p-511;		/* >= sqrt(DBL_MIN) */
+
+static const volatile double
+pio2_lo =		6.1232339957367659e-17;	/*  0x11a62633145c07.0p-106 */
+static const volatile float
+tiny =			0x1p-100; 
+
+static double complex clog_for_large_values(double complex z);
+
+/*
+ * Testing indicates that all these functions are accurate up to 4 ULP.
+ * The functions casin(h) and cacos(h) are about 2.5 times slower than asinh.
+ * The functions catan(h) are a little under 2 times slower than atanh.
+ *
+ * The code for casinh, casin, cacos, and cacosh comes first.  The code is
+ * rather complicated, and the four functions are highly interdependent.
+ *
+ * The code for catanh and catan comes at the end.  It is much simpler than
+ * the other functions, and the code for these can be disconnected from the
+ * rest of the code.
+ */
+
+/*
+ *			================================
+ *			| casinh, casin, cacos, cacosh |
+ *			================================
+ */
+
+/*
+ * The algorithm is very close to that in "Implementing the complex arcsine
+ * and arccosine functions using exception handling" by T. E. Hull, Thomas F.
+ * Fairgrieve, and Ping Tak Peter Tang, published in ACM Transactions on
+ * Mathematical Software, Volume 23 Issue 3, 1997, Pages 299-335,
+ * http://dl.acm.org/citation.cfm?id=275324.
+ *
+ * Throughout we use the convention z = x + I*y.
+ *
+ * casinh(z) = sign(x)*log(A+sqrt(A*A-1)) + I*asin(B)
+ * where
+ * A = (|z+I| + |z-I|) / 2
+ * B = (|z+I| - |z-I|) / 2 = y/A
+ *
+ * These formulas become numerically unstable:
+ *   (a) for Re(casinh(z)) when z is close to the line segment [-I, I] (that
+ *       is, Re(casinh(z)) is close to 0);
+ *   (b) for Im(casinh(z)) when z is close to either of the intervals
+ *       [I, I*infinity) or (-I*infinity, -I] (that is, |Im(casinh(z))| is
+ *       close to PI/2).
+ *
+ * These numerical problems are overcome by defining
+ * f(a, b) = (hypot(a, b) - b) / 2 = a*a / (hypot(a, b) + b) / 2
+ * Then if A < A_crossover, we use
+ *   log(A + sqrt(A*A-1)) = log1p((A-1) + sqrt((A-1)*(A+1)))
+ *   A-1 = f(x, 1+y) + f(x, 1-y)
+ * and if B > B_crossover, we use
+ *   asin(B) = atan2(y, sqrt(A*A - y*y)) = atan2(y, sqrt((A+y)*(A-y)))
+ *   A-y = f(x, y+1) + f(x, y-1)
+ * where without loss of generality we have assumed that x and y are
+ * non-negative.
+ *
+ * Much of the difficulty comes because the intermediate computations may
+ * produce overflows or underflows.  This is dealt with in the paper by Hull
+ * et al by using exception handling.  We do this by detecting when
+ * computations risk underflow or overflow.  The hardest part is handling the
+ * underflows when computing f(a, b).
+ *
+ * Note that the function f(a, b) does not appear explicitly in the paper by
+ * Hull et al, but the idea may be found on pages 308 and 309.  Introducing the
+ * function f(a, b) allows us to concentrate many of the clever tricks in this
+ * paper into one function.
+ */
+
+/*
+ * Function f(a, b, hypot_a_b) = (hypot(a, b) - b) / 2.
+ * Pass hypot(a, b) as the third argument.
+ */
+static inline double
+f(double a, double b, double hypot_a_b)
+{
+	if (b < 0)
+		return ((hypot_a_b - b) / 2);
+	if (b == 0)
+		return (a / 2);
+	return (a * a / (hypot_a_b + b) / 2);
+}
+
+/*
+ * All the hard work is contained in this function.
+ * x and y are assumed positive or zero, and less than RECIP_EPSILON.
+ * Upon return:
+ * rx = Re(casinh(z)) = -Im(cacos(y + I*x)).
+ * B_is_usable is set to 1 if the value of B is usable.
+ * If B_is_usable is set to 0, sqrt_A2my2 = sqrt(A*A - y*y), and new_y = y.
+ * If returning sqrt_A2my2 has potential to result in an underflow, it is
+ * rescaled, and new_y is similarly rescaled.
+ */
+static inline void
+do_hard_work(double x, double y, double *rx, int *B_is_usable, double *B,
+    double *sqrt_A2my2, double *new_y)
+{
+	double R, S, A; /* A, B, R, and S are as in Hull et al. */
+	double Am1, Amy; /* A-1, A-y. */
+
+	R = hypot(x, y + 1);		/* |z+I| */
+	S = hypot(x, y - 1);		/* |z-I| */
+
+	/* A = (|z+I| + |z-I|) / 2 */
+	A = (R + S) / 2;
+	/*
+	 * Mathematically A >= 1.  There is a small chance that this will not
+	 * be so because of rounding errors.  So we will make certain it is
+	 * so.
+	 */
+	if (A < 1)
+		A = 1;
+
+	if (A < A_crossover) {
+		/*
+		 * Am1 = fp + fm, where fp = f(x, 1+y), and fm = f(x, 1-y).
+		 * rx = log1p(Am1 + sqrt(Am1*(A+1)))
+		 */
+		if (y == 1 && x < DBL_EPSILON * DBL_EPSILON / 128) {
+			/*
+			 * fp is of order x^2, and fm = x/2.
+			 * A = 1 (inexactly).
+			 */
+			*rx = sqrt(x);
+		} else if (x >= DBL_EPSILON * fabs(y - 1)) {
+			/*
+			 * Underflow will not occur because
+			 * x >= DBL_EPSILON^2/128 >= FOUR_SQRT_MIN
+			 */
+			Am1 = f(x, 1 + y, R) + f(x, 1 - y, S);
+			*rx = log1p(Am1 + sqrt(Am1 * (A + 1)));
+		} else if (y < 1) {
+			/*
+			 * fp = x*x/(1+y)/4, fm = x*x/(1-y)/4, and
+			 * A = 1 (inexactly).
+			 */
+			*rx = x / sqrt((1 - y) * (1 + y));
+		} else {		/* if (y > 1) */
+			/*
+			 * A-1 = y-1 (inexactly).
+			 */
+			*rx = log1p((y - 1) + sqrt((y - 1) * (y + 1)));
+		}
+	} else {
+		*rx = log(A + sqrt(A * A - 1));
+	}
+
+	*new_y = y;
+
+	if (y < FOUR_SQRT_MIN) {
+		/*
+		 * Avoid a possible underflow caused by y/A.  For casinh this
+		 * would be legitimate, but will be picked up by invoking atan2
+		 * later on.  For cacos this would not be legitimate.
+		 */
+		*B_is_usable = 0;
+		*sqrt_A2my2 = A * (2 / DBL_EPSILON);
+		*new_y = y * (2 / DBL_EPSILON);
+		return;
+	}
+
+	/* B = (|z+I| - |z-I|) / 2 = y/A */
+	*B = y / A;
+	*B_is_usable = 1;
+
+	if (*B > B_crossover) {
+		*B_is_usable = 0;
+		/*
+		 * Amy = fp + fm, where fp = f(x, y+1), and fm = f(x, y-1).
+		 * sqrt_A2my2 = sqrt(Amy*(A+y))
+		 */
+		if (y == 1 && x < DBL_EPSILON / 128) {
+			/*
+			 * fp is of order x^2, and fm = x/2.
+			 * A = 1 (inexactly).
+			 */
+			*sqrt_A2my2 = sqrt(x) * sqrt((A + y) / 2);
+		} else if (x >= DBL_EPSILON * fabs(y - 1)) {
+			/*
+			 * Underflow will not occur because
+			 * x >= DBL_EPSILON/128 >= FOUR_SQRT_MIN
+			 * and
+			 * x >= DBL_EPSILON^2 >= FOUR_SQRT_MIN
+			 */
+			Amy = f(x, y + 1, R) + f(x, y - 1, S);
+			*sqrt_A2my2 = sqrt(Amy * (A + y));
+		} else if (y > 1) {
+			/*
+			 * fp = x*x/(y+1)/4, fm = x*x/(y-1)/4, and
+			 * A = y (inexactly).
+			 *
+			 * y < RECIP_EPSILON.  So the following
+			 * scaling should avoid any underflow problems.
+			 */
+			*sqrt_A2my2 = x * (4 / DBL_EPSILON / DBL_EPSILON) * y /
+			    sqrt((y + 1) * (y - 1));
+			*new_y = y * (4 / DBL_EPSILON / DBL_EPSILON);
+		} else {		/* if (y < 1) */
+			/*
+			 * fm = 1-y >= DBL_EPSILON, fp is of order x^2, and
+			 * A = 1 (inexactly).
+			 */
+			*sqrt_A2my2 = sqrt((1 - y) * (1 + y));
+		}
+	}
+}
+
+/*
+ * casinh(z) = z + O(z^3)   as z -> 0
+ *
+ * casinh(z) = sign(x)*clog(sign(x)*z) + O(1/z^2)   as z -> infinity
+ * The above formula works for the imaginary part as well, because
+ * Im(casinh(z)) = sign(x)*atan2(sign(x)*y, fabs(x)) + O(y/z^3)
+ *    as z -> infinity, uniformly in y
+ */
+double complex
+casinh(double complex z)
+{
+	double x, y, ax, ay, rx, ry, B, sqrt_A2my2, new_y;
+	int B_is_usable;
+	double complex w;
+
+	x = creal(z);
+	y = cimag(z);
+	ax = fabs(x);
+	ay = fabs(y);
+
+	if (isnan(x) || isnan(y)) {
+		/* casinh(+-Inf + I*NaN) = +-Inf + I*NaN */
+		if (isinf(x))
+			return (CMPLX(x, y + y));
+		/* casinh(NaN + I*+-Inf) = opt(+-)Inf + I*NaN */
+		if (isinf(y))
+			return (CMPLX(y, x + x));
+		/* casinh(NaN + I*0) = NaN + I*0 */
+		if (y == 0)
+			return (CMPLX(x + x, y));
+		/*
+		 * All other cases involving NaN return NaN + I*NaN.
+		 * C99 leaves it optional whether to raise invalid if one of
+		 * the arguments is not NaN, so we opt not to raise it.
+		 */
+		return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
+		/* clog...() will raise inexact unless x or y is infinite. */
+		if (signbit(x) == 0)
+			w = clog_for_large_values(z) + m_ln2;
+		else
+			w = clog_for_large_values(-z) + m_ln2;
+		return (CMPLX(copysign(creal(w), x), copysign(cimag(w), y)));
+	}
+
+	/* Avoid spuriously raising inexact for z = 0. */
+	if (x == 0 && y == 0)
+		return (z);
+
+	/* All remaining cases are inexact. */
+	raise_inexact();
+
+	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
+		return (z);
+
+	do_hard_work(ax, ay, &rx, &B_is_usable, &B, &sqrt_A2my2, &new_y);
+	if (B_is_usable)
+		ry = asin(B);
+	else
+		ry = atan2(new_y, sqrt_A2my2);
+	return (CMPLX(copysign(rx, x), copysign(ry, y)));
+}
+
+/*
+ * casin(z) = reverse(casinh(reverse(z)))
+ * where reverse(x + I*y) = y + I*x = I*conj(z).
+ */
+double complex
+casin(double complex z)
+{
+	double complex w = casinh(CMPLX(cimag(z), creal(z)));
+
+	return (CMPLX(cimag(w), creal(w)));
+}
+
+/*
+ * cacos(z) = PI/2 - casin(z)
+ * but do the computation carefully so cacos(z) is accurate when z is
+ * close to 1.
+ *
+ * cacos(z) = PI/2 - z + O(z^3)   as z -> 0
+ *
+ * cacos(z) = -sign(y)*I*clog(z) + O(1/z^2)   as z -> infinity
+ * The above formula works for the real part as well, because
+ * Re(cacos(z)) = atan2(fabs(y), x) + O(y/z^3)
+ *    as z -> infinity, uniformly in y
+ */
+double complex
+cacos(double complex z)
+{
+	double x, y, ax, ay, rx, ry, B, sqrt_A2mx2, new_x;
+	int sx, sy;
+	int B_is_usable;
+	double complex w;
+
+	x = creal(z);
+	y = cimag(z);
+	sx = signbit(x);
+	sy = signbit(y);
+	ax = fabs(x);
+	ay = fabs(y);
+
+	if (isnan(x) || isnan(y)) {
+		/* cacos(+-Inf + I*NaN) = NaN + I*opt(-)Inf */
+		if (isinf(x))
+			return (CMPLX(y + y, -INFINITY));
+		/* cacos(NaN + I*+-Inf) = NaN + I*-+Inf */
+		if (isinf(y))
+			return (CMPLX(x + x, -y));
+		/* cacos(0 + I*NaN) = PI/2 + I*NaN with inexact */
+		if (x == 0)
+			return (CMPLX(pio2_hi + pio2_lo, y + y));
+		/*
+		 * All other cases involving NaN return NaN + I*NaN.
+		 * C99 leaves it optional whether to raise invalid if one of
+		 * the arguments is not NaN, so we opt not to raise it.
+		 */
+		return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
+		/* clog...() will raise inexact unless x or y is infinite. */
+		w = clog_for_large_values(z);
+		rx = fabs(cimag(w));
+		ry = creal(w) + m_ln2;
+		if (sy == 0)
+			ry = -ry;
+		return (CMPLX(rx, ry));
+	}
+
+	/* Avoid spuriously raising inexact for z = 1. */
+	if (x == 1 && y == 0)
+		return (CMPLX(0, -y));
+
+	/* All remaining cases are inexact. */
+	raise_inexact();
+
+	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
+		return (CMPLX(pio2_hi - (x - pio2_lo), -y));
+
+	do_hard_work(ay, ax, &ry, &B_is_usable, &B, &sqrt_A2mx2, &new_x);
+	if (B_is_usable) {
+		if (sx == 0)
+			rx = acos(B);
+		else
+			rx = acos(-B);
+	} else {
+		if (sx == 0)
+			rx = atan2(sqrt_A2mx2, new_x);
+		else
+			rx = atan2(sqrt_A2mx2, -new_x);
+	}
+	if (sy == 0)
+		ry = -ry;
+	return (CMPLX(rx, ry));
+}
+
+/*
+ * cacosh(z) = I*cacos(z) or -I*cacos(z)
+ * where the sign is chosen so Re(cacosh(z)) >= 0.
+ */
+double complex
+cacosh(double complex z)
+{
+	double complex w;
+	double rx, ry;
+
+	w = cacos(z);
+	rx = creal(w);
+	ry = cimag(w);
+	/* cacosh(NaN + I*NaN) = NaN + I*NaN */
+	if (isnan(rx) && isnan(ry))
+		return (CMPLX(ry, rx));
+	/* cacosh(NaN + I*+-Inf) = +Inf + I*NaN */
+	/* cacosh(+-Inf + I*NaN) = +Inf + I*NaN */
+	if (isnan(rx))
+		return (CMPLX(fabs(ry), rx));
+	/* cacosh(0 + I*NaN) = NaN + I*NaN */
+	if (isnan(ry))
+		return (CMPLX(ry, ry));
+	return (CMPLX(fabs(ry), copysign(rx, cimag(z))));
+}
+
+/*
+ * Optimized version of clog() for |z| finite and larger than ~RECIP_EPSILON.
+ */
+static double complex
+clog_for_large_values(double complex z)
+{
+	double x, y;
+	double ax, ay, t;
+
+	x = creal(z);
+	y = cimag(z);
+	ax = fabs(x);
+	ay = fabs(y);
+	if (ax < ay) {
+		t = ax;
+		ax = ay;
+		ay = t;
+	}
+
+	/*
+	 * Avoid overflow in hypot() when x and y are both very large.
+	 * Divide x and y by E, and then add 1 to the logarithm.  This depends
+	 * on E being larger than sqrt(2).
+	 * Dividing by E causes an insignificant loss of accuracy; however
+	 * this method is still poor since it is uneccessarily slow.
+	 */
+	if (ax > DBL_MAX / 2)
+		return (CMPLX(log(hypot(x / m_e, y / m_e)) + 1, atan2(y, x)));
+
+	/*
+	 * Avoid overflow when x or y is large.  Avoid underflow when x or
+	 * y is small.
+	 */
+	if (ax > QUARTER_SQRT_MAX || ay < SQRT_MIN)
+		return (CMPLX(log(hypot(x, y)), atan2(y, x)));
+
+	return (CMPLX(log(ax * ax + ay * ay) / 2, atan2(y, x)));
+}
+
+/*
+ *				=================
+ *				| catanh, catan |
+ *				=================
+ */
+
+/*
+ * sum_squares(x,y) = x*x + y*y (or just x*x if y*y would underflow).
+ * Assumes x*x and y*y will not overflow.
+ * Assumes x and y are finite.
+ * Assumes y is non-negative.
+ * Assumes fabs(x) >= DBL_EPSILON.
+ */
+static inline double
+sum_squares(double x, double y)
+{
+
+	/* Avoid underflow when y is small. */
+	if (y < SQRT_MIN)
+		return (x * x);
+
+	return (x * x + y * y);
+}
+
+/*
+ * real_part_reciprocal(x, y) = Re(1/(x+I*y)) = x/(x*x + y*y).
+ * Assumes x and y are not NaN, and one of x and y is larger than
+ * RECIP_EPSILON.  We avoid unwarranted underflow.  It is important to not use
+ * the code creal(1/z), because the imaginary part may produce an unwanted
+ * underflow.
+ * This is only called in a context where inexact is always raised before
+ * the call, so no effort is made to avoid or force inexact.
+ */
+static inline double
+real_part_reciprocal(double x, double y)
+{
+	double scale;
+	uint32_t hx, hy;
+	int32_t ix, iy;
+
+	/*
+	 * This code is inspired by the C99 document n1124.pdf, Section G.5.1,
+	 * example 2.
+	 */
+	GET_HIGH_WORD(hx, x);
+	ix = hx & 0x7ff00000;
+	GET_HIGH_WORD(hy, y);
+	iy = hy & 0x7ff00000;
+#define	BIAS	(DBL_MAX_EXP - 1)
+/* XXX more guard digits are useful iff there is extra precision. */
+#define	CUTOFF	(DBL_MANT_DIG / 2 + 1)	/* just half or 1 guard digit */
+	if (ix - iy >= CUTOFF << 20 || isinf(x))
+		return (1 / x);		/* +-Inf -> +-0 is special */
+	if (iy - ix >= CUTOFF << 20)
+		return (x / y / y);	/* should avoid double div, but hard */
+	if (ix <= (BIAS + DBL_MAX_EXP / 2 - CUTOFF) << 20)
+		return (x / (x * x + y * y));
+	scale = 1;
+	SET_HIGH_WORD(scale, 0x7ff00000 - ix);	/* 2**(1-ilogb(x)) */
+	x *= scale;
+	y *= scale;
+	return (x / (x * x + y * y) * scale);
+}
+
+/*
+ * catanh(z) = log((1+z)/(1-z)) / 2
+ *           = log1p(4*x / |z-1|^2) / 4
+ *             + I * atan2(2*y, (1-x)*(1+x)-y*y) / 2
+ *
+ * catanh(z) = z + O(z^3)   as z -> 0
+ *
+ * catanh(z) = 1/z + sign(y)*I*PI/2 + O(1/z^3)   as z -> infinity
+ * The above formula works for the real part as well, because
+ * Re(catanh(z)) = x/|z|^2 + O(x/z^4)
+ *    as z -> infinity, uniformly in x
+ */
+double complex
+catanh(double complex z)
+{
+	double x, y, ax, ay, rx, ry;
+
+	x = creal(z);
+	y = cimag(z);
+	ax = fabs(x);
+	ay = fabs(y);
+
+	/* This helps handle many cases. */
+	if (y == 0 && ax <= 1)
+		return (CMPLX(atanh(x), y));
+
+	/* To ensure the same accuracy as atan(), and to filter out z = 0. */
+	if (x == 0)
+		return (CMPLX(x, atan(y)));
+
+	if (isnan(x) || isnan(y)) {
+		/* catanh(+-Inf + I*NaN) = +-0 + I*NaN */
+		if (isinf(x))
+			return (CMPLX(copysign(0, x), y + y));
+		/* catanh(NaN + I*+-Inf) = sign(NaN)0 + I*+-PI/2 */
+		if (isinf(y))
+			return (CMPLX(copysign(0, x),
+			    copysign(pio2_hi + pio2_lo, y)));
+		/*
+		 * All other cases involving NaN return NaN + I*NaN.
+		 * C99 leaves it optional whether to raise invalid if one of
+		 * the arguments is not NaN, so we opt not to raise it.
+		 */
+		return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON)
+		return (CMPLX(real_part_reciprocal(x, y),
+		    copysign(pio2_hi + pio2_lo, y)));
+
+	if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
+		/*
+		 * z = 0 was filtered out above.  All other cases must raise
+		 * inexact, but this is the only only that needs to do it
+		 * explicitly.
+		 */
+		raise_inexact();
+		return (z);
+	}
+
+	if (ax == 1 && ay < DBL_EPSILON)
+		rx = (m_ln2 - log(ay)) / 2;
+	else
+		rx = log1p(4 * ax / sum_squares(ax - 1, ay)) / 4;
+
+	if (ax == 1)
+		ry = atan2(2, -ay) / 2;
+	else if (ay < DBL_EPSILON)
+		ry = atan2(2 * ay, (1 - ax) * (1 + ax)) / 2;
+	else
+		ry = atan2(2 * ay, (1 - ax) * (1 + ax) - ay * ay) / 2;
+
+	return (CMPLX(copysign(rx, x), copysign(ry, y)));
+}
+
+/*
+ * catan(z) = reverse(catanh(reverse(z)))
+ * where reverse(x + I*y) = y + I*x = I*conj(z).
+ */
+double complex
+catan(double complex z)
+{
+	double complex w = catanh(CMPLX(cimag(z), creal(z)));
+
+	return (CMPLX(cimag(w), creal(w)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/catrigf.c b/libm/upstream-freebsd/lib/msun/src/catrigf.c
new file mode 100644
index 0000000..e057d31
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/catrigf.c
@@ -0,0 +1,393 @@
+/*-
+ * Copyright (c) 2012 Stephen Montgomery-Smith <stephen@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * The algorithm is very close to that in "Implementing the complex arcsine
+ * and arccosine functions using exception handling" by T. E. Hull, Thomas F.
+ * Fairgrieve, and Ping Tak Peter Tang, published in ACM Transactions on
+ * Mathematical Software, Volume 23 Issue 3, 1997, Pages 299-335,
+ * http://dl.acm.org/citation.cfm?id=275324.
+ *
+ * See catrig.c for complete comments.
+ *
+ * XXX comments were removed automatically, and even short ones on the right
+ * of statements were removed (all of them), contrary to normal style.  Only
+ * a few comments on the right of declarations remain.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/catrigf.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#undef isinf
+#define isinf(x)	(fabsf(x) == INFINITY)
+#undef isnan
+#define isnan(x)	((x) != (x))
+#define	raise_inexact()	do { volatile float junk = 1 + tiny; } while(0)
+#undef signbit
+#define signbit(x)	(__builtin_signbitf(x))
+
+static const float
+A_crossover =		10,
+B_crossover =		0.6417,
+FOUR_SQRT_MIN =		0x1p-61,
+QUARTER_SQRT_MAX =	0x1p61,
+m_e =			2.7182818285e0,		/*  0xadf854.0p-22 */
+m_ln2 =			6.9314718056e-1,	/*  0xb17218.0p-24 */
+pio2_hi =		1.5707962513e0,		/*  0xc90fda.0p-23 */
+RECIP_EPSILON =		1 / FLT_EPSILON,
+SQRT_3_EPSILON =	5.9801995673e-4,	/*  0x9cc471.0p-34 */
+SQRT_6_EPSILON =	8.4572793338e-4,	/*  0xddb3d7.0p-34 */
+SQRT_MIN =		0x1p-63;
+
+static const volatile float
+pio2_lo =		7.5497899549e-8,	/*  0xa22169.0p-47 */
+tiny =			0x1p-100;
+
+static float complex clog_for_large_values(float complex z);
+
+static inline float
+f(float a, float b, float hypot_a_b)
+{
+	if (b < 0)
+		return ((hypot_a_b - b) / 2);
+	if (b == 0)
+		return (a / 2);
+	return (a * a / (hypot_a_b + b) / 2);
+}
+
+static inline void
+do_hard_work(float x, float y, float *rx, int *B_is_usable, float *B,
+    float *sqrt_A2my2, float *new_y)
+{
+	float R, S, A;
+	float Am1, Amy;
+
+	R = hypotf(x, y + 1);
+	S = hypotf(x, y - 1);
+
+	A = (R + S) / 2;
+	if (A < 1)
+		A = 1;
+
+	if (A < A_crossover) {
+		if (y == 1 && x < FLT_EPSILON * FLT_EPSILON / 128) {
+			*rx = sqrtf(x);
+		} else if (x >= FLT_EPSILON * fabsf(y - 1)) {
+			Am1 = f(x, 1 + y, R) + f(x, 1 - y, S);
+			*rx = log1pf(Am1 + sqrtf(Am1 * (A + 1)));
+		} else if (y < 1) {
+			*rx = x / sqrtf((1 - y) * (1 + y));
+		} else {
+			*rx = log1pf((y - 1) + sqrtf((y - 1) * (y + 1)));
+		}
+	} else {
+		*rx = logf(A + sqrtf(A * A - 1));
+	}
+
+	*new_y = y;
+
+	if (y < FOUR_SQRT_MIN) {
+		*B_is_usable = 0;
+		*sqrt_A2my2 = A * (2 / FLT_EPSILON);
+		*new_y = y * (2 / FLT_EPSILON);
+		return;
+	}
+
+	*B = y / A;
+	*B_is_usable = 1;
+
+	if (*B > B_crossover) {
+		*B_is_usable = 0;
+		if (y == 1 && x < FLT_EPSILON / 128) {
+			*sqrt_A2my2 = sqrtf(x) * sqrtf((A + y) / 2);
+		} else if (x >= FLT_EPSILON * fabsf(y - 1)) {
+			Amy = f(x, y + 1, R) + f(x, y - 1, S);
+			*sqrt_A2my2 = sqrtf(Amy * (A + y));
+		} else if (y > 1) {
+			*sqrt_A2my2 = x * (4 / FLT_EPSILON / FLT_EPSILON) * y /
+			    sqrtf((y + 1) * (y - 1));
+			*new_y = y * (4 / FLT_EPSILON / FLT_EPSILON);
+		} else {
+			*sqrt_A2my2 = sqrtf((1 - y) * (1 + y));
+		}
+	}
+}
+
+float complex
+casinhf(float complex z)
+{
+	float x, y, ax, ay, rx, ry, B, sqrt_A2my2, new_y;
+	int B_is_usable;
+	float complex w;
+
+	x = crealf(z);
+	y = cimagf(z);
+	ax = fabsf(x);
+	ay = fabsf(y);
+
+	if (isnan(x) || isnan(y)) {
+		if (isinf(x))
+			return (CMPLXF(x, y + y));
+		if (isinf(y))
+			return (CMPLXF(y, x + x));
+		if (y == 0)
+			return (CMPLXF(x + x, y));
+		return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
+		if (signbit(x) == 0)
+			w = clog_for_large_values(z) + m_ln2;
+		else
+			w = clog_for_large_values(-z) + m_ln2;
+		return (CMPLXF(copysignf(crealf(w), x),
+		    copysignf(cimagf(w), y)));
+	}
+
+	if (x == 0 && y == 0)
+		return (z);
+
+	raise_inexact();
+
+	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
+		return (z);
+
+	do_hard_work(ax, ay, &rx, &B_is_usable, &B, &sqrt_A2my2, &new_y);
+	if (B_is_usable)
+		ry = asinf(B);
+	else
+		ry = atan2f(new_y, sqrt_A2my2);
+	return (CMPLXF(copysignf(rx, x), copysignf(ry, y)));
+}
+
+float complex
+casinf(float complex z)
+{
+	float complex w = casinhf(CMPLXF(cimagf(z), crealf(z)));
+
+	return (CMPLXF(cimagf(w), crealf(w)));
+}
+
+float complex
+cacosf(float complex z)
+{
+	float x, y, ax, ay, rx, ry, B, sqrt_A2mx2, new_x;
+	int sx, sy;
+	int B_is_usable;
+	float complex w;
+
+	x = crealf(z);
+	y = cimagf(z);
+	sx = signbit(x);
+	sy = signbit(y);
+	ax = fabsf(x);
+	ay = fabsf(y);
+
+	if (isnan(x) || isnan(y)) {
+		if (isinf(x))
+			return (CMPLXF(y + y, -INFINITY));
+		if (isinf(y))
+			return (CMPLXF(x + x, -y));
+		if (x == 0)
+			return (CMPLXF(pio2_hi + pio2_lo, y + y));
+		return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
+		w = clog_for_large_values(z);
+		rx = fabsf(cimagf(w));
+		ry = crealf(w) + m_ln2;
+		if (sy == 0)
+			ry = -ry;
+		return (CMPLXF(rx, ry));
+	}
+
+	if (x == 1 && y == 0)
+		return (CMPLXF(0, -y));
+
+	raise_inexact();
+
+	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
+		return (CMPLXF(pio2_hi - (x - pio2_lo), -y));
+
+	do_hard_work(ay, ax, &ry, &B_is_usable, &B, &sqrt_A2mx2, &new_x);
+	if (B_is_usable) {
+		if (sx == 0)
+			rx = acosf(B);
+		else
+			rx = acosf(-B);
+	} else {
+		if (sx == 0)
+			rx = atan2f(sqrt_A2mx2, new_x);
+		else
+			rx = atan2f(sqrt_A2mx2, -new_x);
+	}
+	if (sy == 0)
+		ry = -ry;
+	return (CMPLXF(rx, ry));
+}
+
+float complex
+cacoshf(float complex z)
+{
+	float complex w;
+	float rx, ry;
+
+	w = cacosf(z);
+	rx = crealf(w);
+	ry = cimagf(w);
+	if (isnan(rx) && isnan(ry))
+		return (CMPLXF(ry, rx));
+	if (isnan(rx))
+		return (CMPLXF(fabsf(ry), rx));
+	if (isnan(ry))
+		return (CMPLXF(ry, ry));
+	return (CMPLXF(fabsf(ry), copysignf(rx, cimagf(z))));
+}
+
+static float complex
+clog_for_large_values(float complex z)
+{
+	float x, y;
+	float ax, ay, t;
+
+	x = crealf(z);
+	y = cimagf(z);
+	ax = fabsf(x);
+	ay = fabsf(y);
+	if (ax < ay) {
+		t = ax;
+		ax = ay;
+		ay = t;
+	}
+
+	if (ax > FLT_MAX / 2)
+		return (CMPLXF(logf(hypotf(x / m_e, y / m_e)) + 1,
+		    atan2f(y, x)));
+
+	if (ax > QUARTER_SQRT_MAX || ay < SQRT_MIN)
+		return (CMPLXF(logf(hypotf(x, y)), atan2f(y, x)));
+
+	return (CMPLXF(logf(ax * ax + ay * ay) / 2, atan2f(y, x)));
+}
+
+static inline float
+sum_squares(float x, float y)
+{
+
+	if (y < SQRT_MIN)
+		return (x * x);
+
+	return (x * x + y * y);
+}
+
+static inline float
+real_part_reciprocal(float x, float y)
+{
+	float scale;
+	uint32_t hx, hy;
+	int32_t ix, iy;
+
+	GET_FLOAT_WORD(hx, x);
+	ix = hx & 0x7f800000;
+	GET_FLOAT_WORD(hy, y);
+	iy = hy & 0x7f800000;
+#define	BIAS	(FLT_MAX_EXP - 1)
+#define	CUTOFF	(FLT_MANT_DIG / 2 + 1)
+	if (ix - iy >= CUTOFF << 23 || isinf(x))
+		return (1 / x);
+	if (iy - ix >= CUTOFF << 23)
+		return (x / y / y);
+	if (ix <= (BIAS + FLT_MAX_EXP / 2 - CUTOFF) << 23)
+		return (x / (x * x + y * y));
+	SET_FLOAT_WORD(scale, 0x7f800000 - ix);
+	x *= scale;
+	y *= scale;
+	return (x / (x * x + y * y) * scale);
+}
+
+float complex
+catanhf(float complex z)
+{
+	float x, y, ax, ay, rx, ry;
+
+	x = crealf(z);
+	y = cimagf(z);
+	ax = fabsf(x);
+	ay = fabsf(y);
+
+	if (y == 0 && ax <= 1)
+		return (CMPLXF(atanhf(x), y));
+
+	if (x == 0)
+		return (CMPLXF(x, atanf(y)));
+
+	if (isnan(x) || isnan(y)) {
+		if (isinf(x))
+			return (CMPLXF(copysignf(0, x), y + y));
+		if (isinf(y))
+			return (CMPLXF(copysignf(0, x),
+			    copysignf(pio2_hi + pio2_lo, y)));
+		return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+	}
+
+	if (ax > RECIP_EPSILON || ay > RECIP_EPSILON)
+		return (CMPLXF(real_part_reciprocal(x, y),
+		    copysignf(pio2_hi + pio2_lo, y)));
+
+	if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
+		raise_inexact();
+		return (z);
+	}
+
+	if (ax == 1 && ay < FLT_EPSILON)
+		rx = (m_ln2 - logf(ay)) / 2;
+	else
+		rx = log1pf(4 * ax / sum_squares(ax - 1, ay)) / 4;
+
+	if (ax == 1)
+		ry = atan2f(2, -ay) / 2;
+	else if (ay < FLT_EPSILON)
+		ry = atan2f(2 * ay, (1 - ax) * (1 + ax)) / 2;
+	else
+		ry = atan2f(2 * ay, (1 - ax) * (1 + ax) - ay * ay) / 2;
+
+	return (CMPLXF(copysignf(rx, x), copysignf(ry, y)));
+}
+
+float complex
+catanf(float complex z)
+{
+	float complex w = catanhf(CMPLXF(cimagf(z), crealf(z)));
+
+	return (CMPLXF(cimagf(w), crealf(w)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acos.c b/libm/upstream-freebsd/lib/msun/src/e_acos.c
new file mode 100644
index 0000000..1f6dca5
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acos.c
@@ -0,0 +1,111 @@
+
+/* @(#)e_acos.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_acos(x)
+ * Method :                  
+ *	acos(x)  = pi/2 - asin(x)
+ *	acos(-x) = pi/2 + asin(x)
+ * For |x|<=0.5
+ *	acos(x) = pi/2 - (x + x*x^2*R(x^2))	(see asin.c)
+ * For x>0.5
+ * 	acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
+ *		= 2asin(sqrt((1-x)/2))  
+ *		= 2s + 2s*z*R(z) 	...z=(1-x)/2, s=sqrt(z)
+ *		= 2f + (2c + 2s*z*R(z))
+ *     where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
+ *     for f so that f+c ~ sqrt(z).
+ * For x<-0.5
+ *	acos(x) = pi - 2asin(sqrt((1-|x|)/2))
+ *		= pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
+ *
+ * Special cases:
+ *	if x is NaN, return x itself;
+ *	if |x|>1, return NaN with invalid signal.
+ *
+ * Function needed: sqrt
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one=  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+pi =  3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
+pio2_hi =  1.57079632679489655800e+00; /* 0x3FF921FB, 0x54442D18 */
+static volatile double
+pio2_lo =  6.12323399573676603587e-17; /* 0x3C91A626, 0x33145C07 */
+static const double
+pS0 =  1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 =  2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 =  7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 =  3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 =  2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 =  7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+double
+__ieee754_acos(double x)
+{
+	double z,p,q,r,w,s,c,df;
+	int32_t hx,ix;
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x3ff00000) {	/* |x| >= 1 */
+	    u_int32_t lx;
+	    GET_LOW_WORD(lx,x);
+	    if(((ix-0x3ff00000)|lx)==0) {	/* |x|==1 */
+		if(hx>0) return 0.0;		/* acos(1) = 0  */
+		else return pi+2.0*pio2_lo;	/* acos(-1)= pi */
+	    }
+	    return (x-x)/(x-x);		/* acos(|x|>1) is NaN */
+	}
+	if(ix<0x3fe00000) {	/* |x| < 0.5 */
+	    if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
+	    z = x*x;
+	    p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+	    q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+	    r = p/q;
+	    return pio2_hi - (x - (pio2_lo-x*r));
+	} else  if (hx<0) {		/* x < -0.5 */
+	    z = (one+x)*0.5;
+	    p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+	    q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+	    s = sqrt(z);
+	    r = p/q;
+	    w = r*s-pio2_lo;
+	    return pi - 2.0*(s+w);
+	} else {			/* x > 0.5 */
+	    z = (one-x)*0.5;
+	    s = sqrt(z);
+	    df = s;
+	    SET_LOW_WORD(df,0);
+	    c  = (z-df*df)/(s+df);
+	    p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
+	    q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
+	    r = p/q;
+	    w = r*s+c;
+	    return 2.0*(df+w);
+	}
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(acos, acosl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acosf.c b/libm/upstream-freebsd/lib/msun/src/e_acosf.c
new file mode 100644
index 0000000..c9f62cc
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acosf.c
@@ -0,0 +1,77 @@
+/* e_acosf.c -- float version of e_acos.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+pi =  3.1415925026e+00, /* 0x40490fda */
+pio2_hi =  1.5707962513e+00; /* 0x3fc90fda */
+static volatile float
+pio2_lo =  7.5497894159e-08; /* 0x33a22168 */
+static const float
+pS0 =  1.6666586697e-01,
+pS1 = -4.2743422091e-02,
+pS2 = -8.6563630030e-03,
+qS1 = -7.0662963390e-01;
+
+float
+__ieee754_acosf(float x)
+{
+	float z,p,q,r,w,s,c,df;
+	int32_t hx,ix;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x3f800000) {		/* |x| >= 1 */
+	    if(ix==0x3f800000) {	/* |x| == 1 */
+		if(hx>0) return 0.0;	/* acos(1) = 0 */
+		else return pi+(float)2.0*pio2_lo;	/* acos(-1)= pi */
+	    }
+	    return (x-x)/(x-x);		/* acos(|x|>1) is NaN */
+	}
+	if(ix<0x3f000000) {	/* |x| < 0.5 */
+	    if(ix<=0x32800000) return pio2_hi+pio2_lo;/*if|x|<2**-26*/
+	    z = x*x;
+	    p = z*(pS0+z*(pS1+z*pS2));
+	    q = one+z*qS1;
+	    r = p/q;
+	    return pio2_hi - (x - (pio2_lo-x*r));
+	} else  if (hx<0) {		/* x < -0.5 */
+	    z = (one+x)*(float)0.5;
+	    p = z*(pS0+z*(pS1+z*pS2));
+	    q = one+z*qS1;
+	    s = sqrtf(z);
+	    r = p/q;
+	    w = r*s-pio2_lo;
+	    return pi - (float)2.0*(s+w);
+	} else {			/* x > 0.5 */
+	    int32_t idf;
+	    z = (one-x)*(float)0.5;
+	    s = sqrtf(z);
+	    df = s;
+	    GET_FLOAT_WORD(idf,df);
+	    SET_FLOAT_WORD(df,idf&0xfffff000);
+	    c  = (z-df*df)/(s+df);
+	    p = z*(pS0+z*(pS1+z*pS2));
+	    q = one+z*qS1;
+	    r = p/q;
+	    w = r*s+c;
+	    return (float)2.0*(df+w);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acosh.c b/libm/upstream-freebsd/lib/msun/src/e_acosh.c
new file mode 100644
index 0000000..358c8bd
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acosh.c
@@ -0,0 +1,68 @@
+
+/* @(#)e_acosh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_acosh(x)
+ * Method :
+ *	Based on 
+ *		acosh(x) = log [ x + sqrt(x*x-1) ]
+ *	we have
+ *		acosh(x) := log(x)+ln2,	if x is large; else
+ *		acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
+ *		acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
+ *
+ * Special cases:
+ *	acosh(x) is NaN with signal if x<1.
+ *	acosh(NaN) is NaN without signal.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one	= 1.0,
+ln2	= 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
+
+double
+__ieee754_acosh(double x)
+{
+	double t;
+	int32_t hx;
+	u_int32_t lx;
+	EXTRACT_WORDS(hx,lx,x);
+	if(hx<0x3ff00000) {		/* x < 1 */
+	    return (x-x)/(x-x);
+	} else if(hx >=0x41b00000) {	/* x > 2**28 */
+	    if(hx >=0x7ff00000) {	/* x is inf of NaN */
+	        return x+x;
+	    } else 
+		return __ieee754_log(x)+ln2;	/* acosh(huge)=log(2x) */
+	} else if(((hx-0x3ff00000)|lx)==0) {
+	    return 0.0;			/* acosh(1) = 0 */
+	} else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
+	    t=x*x;
+	    return __ieee754_log(2.0*x-one/(x+sqrt(t-one)));
+	} else {			/* 1<x<2 */
+	    t = x-one;
+	    return log1p(t+sqrt(2.0*t+t*t));
+	}
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(acosh, acoshl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acoshf.c b/libm/upstream-freebsd/lib/msun/src/e_acoshf.c
new file mode 100644
index 0000000..f529b20
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acoshf.c
@@ -0,0 +1,48 @@
+/* e_acoshf.c -- float version of e_acosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one	= 1.0,
+ln2	= 6.9314718246e-01;  /* 0x3f317218 */
+
+float
+__ieee754_acoshf(float x)
+{
+	float t;
+	int32_t hx;
+	GET_FLOAT_WORD(hx,x);
+	if(hx<0x3f800000) {		/* x < 1 */
+	    return (x-x)/(x-x);
+	} else if(hx >=0x4d800000) {	/* x > 2**28 */
+	    if(hx >=0x7f800000) {	/* x is inf of NaN */
+	        return x+x;
+	    } else
+		return __ieee754_logf(x)+ln2;	/* acosh(huge)=log(2x) */
+	} else if (hx==0x3f800000) {
+	    return 0.0;			/* acosh(1) = 0 */
+	} else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
+	    t=x*x;
+	    return __ieee754_logf((float)2.0*x-one/(x+__ieee754_sqrtf(t-one)));
+	} else {			/* 1<x<2 */
+	    t = x-one;
+	    return log1pf(t+__ieee754_sqrtf((float)2.0*t+t*t));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acoshl.c b/libm/upstream-freebsd/lib/msun/src/e_acoshl.c
new file mode 100644
index 0000000..b9f3aed
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acoshl.c
@@ -0,0 +1,89 @@
+/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)e_acosh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_acosh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_LARGE is the threshold above which we use acosh(x) ~= log(2x). */
+#if LDBL_MANT_DIG == 64
+#define	EXP_LARGE	34
+#elif LDBL_MANT_DIG == 113
+#define	EXP_LARGE	58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const double
+one	= 1.0;
+
+#if LDBL_MANT_DIG == 64
+static const union IEEEl2bits
+u_ln2 =  LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
+#define	ln2	u_ln2.e
+#elif LDBL_MANT_DIG == 113
+static const long double
+ln2 =  6.93147180559945309417232121458176568e-1L;	/* 0x162e42fefa39ef35793c7673007e6.0p-113 */
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+acoshl(long double x)
+{
+	long double t;
+	int16_t hx;
+
+	ENTERI();
+	GET_LDBL_EXPSIGN(hx, x);
+	if (hx < 0x3fff) {		/* x < 1, or misnormal */
+	    RETURNI((x-x)/(x-x));
+	} else if (hx >= BIAS + EXP_LARGE) { /* x >= LARGE */
+	    if (hx >= 0x7fff) {		/* x is inf, NaN or misnormal */
+	        RETURNI(x+x);
+	    } else 
+		RETURNI(logl(x)+ln2);	/* acosh(huge)=log(2x), or misnormal */
+	} else if (hx == 0x3fff && x == 1) {
+	    RETURNI(0.0);		/* acosh(1) = 0 */
+	} else if (hx >= 0x4000) {	/* LARGE > x >= 2, or misnormal */
+	    t=x*x;
+	    RETURNI(logl(2.0*x-one/(x+sqrtl(t-one))));
+	} else {			/* 1<x<2 */
+	    t = x-one;
+	    RETURNI(log1pl(t+sqrtl(2.0*t+t*t)));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_acosl.c b/libm/upstream-freebsd/lib/msun/src/e_acosl.c
new file mode 100644
index 0000000..d33c8fe
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_acosl.c
@@ -0,0 +1,87 @@
+
+/* @(#)e_acos.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_acos.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_acos.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one=  1.00000000000000000000e+00;
+
+#ifdef __i386__
+/* XXX Work around the fact that gcc truncates long double constants on i386 */
+static volatile double
+pi1 =  3.14159265358979311600e+00,	/*  0x1.921fb54442d18p+1  */
+pi2 =  1.22514845490862001043e-16;	/*  0x1.1a80000000000p-53 */
+#define	pi	((long double)pi1 + pi2)
+#else
+static const long double
+pi =  3.14159265358979323846264338327950280e+00L;
+#endif
+
+long double
+acosl(long double x)
+{
+	union IEEEl2bits u;
+	long double z,p,q,r,w,s,c,df;
+	int16_t expsign, expt;
+	u.e = x;
+	expsign = u.xbits.expsign;
+	expt = expsign & 0x7fff;
+	if(expt >= BIAS) {	/* |x| >= 1 */
+	    if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0) {
+		if (expsign>0) return 0.0;	/* acos(1) = 0  */
+		else return pi+2.0*pio2_lo;	/* acos(-1)= pi */
+	    }
+	    return (x-x)/(x-x);		/* acos(|x|>1) is NaN */
+	}
+	if(expt<BIAS-1) {	/* |x| < 0.5 */
+	    if(expt<ACOS_CONST) return pio2_hi+pio2_lo;/*x tiny: acosl=pi/2*/
+	    z = x*x;
+	    p = P(z);
+	    q = Q(z);
+	    r = p/q;
+	    return pio2_hi - (x - (pio2_lo-x*r));
+	} else  if (expsign<0) {	/* x < -0.5 */
+	    z = (one+x)*0.5;
+	    p = P(z);
+	    q = Q(z);
+	    s = sqrtl(z);
+	    r = p/q;
+	    w = r*s-pio2_lo;
+	    return pi - 2.0*(s+w);
+	} else {			/* x > 0.5 */
+	    z = (one-x)*0.5;
+	    s = sqrtl(z);
+	    u.e = s;
+	    u.bits.manl = 0;
+	    df = u.e;
+	    c  = (z-df*df)/(s+df);
+	    p = P(z);
+	    q = Q(z);
+	    r = p/q;
+	    w = r*s+c;
+	    return 2.0*(df+w);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_asin.c b/libm/upstream-freebsd/lib/msun/src/e_asin.c
new file mode 100644
index 0000000..27de207
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_asin.c
@@ -0,0 +1,117 @@
+
+/* @(#)e_asin.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_asin(x)
+ * Method :                  
+ *	Since  asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ *	we approximate asin(x) on [0,0.5] by
+ *		asin(x) = x + x*x^2*R(x^2)
+ *	where
+ *		R(x^2) is a rational approximation of (asin(x)-x)/x^3 
+ *	and its remez error is bounded by
+ *		|(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
+ *
+ *	For x in [0.5,1]
+ *		asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *	Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
+ *	then for x>0.98
+ *		asin(x) = pi/2 - 2*(s+s*z*R(z))
+ *			= pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
+ *	For x<=0.98, let pio4_hi = pio2_hi/2, then
+ *		f = hi part of s;
+ *		c = sqrt(z) - f = (z-f*f)/(s+f) 	...f+c=sqrt(z)
+ *	and
+ *		asin(x) = pi/2 - 2*(s+s*z*R(z))
+ *			= pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
+ *			= pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
+ *
+ * Special cases:
+ *	if x is NaN, return x itself;
+ *	if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+huge =  1.000e+300,
+pio2_hi =  1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
+pio2_lo =  6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
+pio4_hi =  7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
+	/* coefficient for R(x^2) */
+pS0 =  1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
+pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
+pS2 =  2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
+pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
+pS4 =  7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
+pS5 =  3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
+qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
+qS2 =  2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
+qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
+qS4 =  7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
+
+double
+__ieee754_asin(double x)
+{
+	double t=0.0,w,p,q,c,r,s;
+	int32_t hx,ix;
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>= 0x3ff00000) {		/* |x|>= 1 */
+	    u_int32_t lx;
+	    GET_LOW_WORD(lx,x);
+	    if(((ix-0x3ff00000)|lx)==0)
+		    /* asin(1)=+-pi/2 with inexact */
+		return x*pio2_hi+x*pio2_lo;	
+	    return (x-x)/(x-x);		/* asin(|x|>1) is NaN */   
+	} else if (ix<0x3fe00000) {	/* |x|<0.5 */
+	    if(ix<0x3e500000) {		/* if |x| < 2**-26 */
+		if(huge+x>one) return x;/* return x with inexact if x!=0*/
+	    }
+	    t = x*x;
+	    p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+	    q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+	    w = p/q;
+	    return x+x*w;
+	}
+	/* 1> |x|>= 0.5 */
+	w = one-fabs(x);
+	t = w*0.5;
+	p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
+	q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
+	s = sqrt(t);
+	if(ix>=0x3FEF3333) { 	/* if |x| > 0.975 */
+	    w = p/q;
+	    t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
+	} else {
+	    w  = s;
+	    SET_LOW_WORD(w,0);
+	    c  = (t-w*w)/(s+w);
+	    r  = p/q;
+	    p  = 2.0*s*r-(pio2_lo-2.0*c);
+	    q  = pio4_hi-2.0*w;
+	    t  = pio4_hi-(p-q);
+	}    
+	if(hx>0) return t; else return -t;    
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(asin, asinl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_asinf.c b/libm/upstream-freebsd/lib/msun/src/e_asinf.c
new file mode 100644
index 0000000..deaabb6
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_asinf.c
@@ -0,0 +1,65 @@
+/* e_asinf.c -- float version of e_asin.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+huge =  1.000e+30,
+	/* coefficient for R(x^2) */
+pS0 =  1.6666586697e-01,
+pS1 = -4.2743422091e-02,
+pS2 = -8.6563630030e-03,
+qS1 = -7.0662963390e-01;
+
+static const double
+pio2 =  1.570796326794896558e+00;
+
+float
+__ieee754_asinf(float x)
+{
+	double s;
+	float t,w,p,q;
+	int32_t hx,ix;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x3f800000) {		/* |x| >= 1 */
+	    if(ix==0x3f800000)		/* |x| == 1 */
+		return x*pio2;		/* asin(+-1) = +-pi/2 with inexact */
+	    return (x-x)/(x-x);		/* asin(|x|>1) is NaN */
+	} else if (ix<0x3f000000) {	/* |x|<0.5 */
+	    if(ix<0x39800000) {		/* |x| < 2**-12 */
+		if(huge+x>one) return x;/* return x with inexact if x!=0*/
+	    }
+	    t = x*x;
+	    p = t*(pS0+t*(pS1+t*pS2));
+	    q = one+t*qS1;
+	    w = p/q;
+	    return x+x*w;
+	}
+	/* 1> |x|>= 0.5 */
+	w = one-fabsf(x);
+	t = w*(float)0.5;
+	p = t*(pS0+t*(pS1+t*pS2));
+	q = one+t*qS1;
+	s = sqrt(t);
+	w = p/q;
+	t = pio2-2.0*(s+s*w);
+	if(hx>0) return t; else return -t;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_asinl.c b/libm/upstream-freebsd/lib/msun/src/e_asinl.c
new file mode 100644
index 0000000..a85765f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_asinl.c
@@ -0,0 +1,77 @@
+
+/* @(#)e_asin.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_asin.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_asin.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one =  1.00000000000000000000e+00,
+huge = 1.000e+300;
+
+long double
+asinl(long double x)
+{
+	union IEEEl2bits u;
+	long double t=0.0,w,p,q,c,r,s;
+	int16_t expsign, expt;
+	u.e = x;
+	expsign = u.xbits.expsign;
+	expt = expsign & 0x7fff;
+	if(expt >= BIAS) {		/* |x|>= 1 */
+		if(expt==BIAS && ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)==0)
+		    /* asin(1)=+-pi/2 with inexact */
+		    return x*pio2_hi+x*pio2_lo;	
+	    return (x-x)/(x-x);		/* asin(|x|>1) is NaN */   
+	} else if (expt<BIAS-1) {	/* |x|<0.5 */
+	    if(expt<ASIN_LINEAR) {	/* if |x| is small, asinl(x)=x */
+		if(huge+x>one) return x;/* return x with inexact if x!=0*/
+	    }
+	    t = x*x;
+	    p = P(t);
+	    q = Q(t);
+	    w = p/q;
+	    return x+x*w;
+	}
+	/* 1> |x|>= 0.5 */
+	w = one-fabsl(x);
+	t = w*0.5;
+	p = P(t);
+	q = Q(t);
+	s = sqrtl(t);
+	if(u.bits.manh>=THRESH) { 	/* if |x| is close to 1 */
+	    w = p/q;
+	    t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
+	} else {
+	    u.e = s;
+	    u.bits.manl = 0;
+	    w = u.e;
+	    c  = (t-w*w)/(s+w);
+	    r  = p/q;
+	    p  = 2.0*s*r-(pio2_lo-2.0*c);
+	    q  = pio4_hi-2.0*w;
+	    t  = pio4_hi-(p-q);
+	}    
+	if(expsign>0) return t; else return -t;    
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atan2.c b/libm/upstream-freebsd/lib/msun/src/e_atan2.c
new file mode 100644
index 0000000..a4a985b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atan2.c
@@ -0,0 +1,129 @@
+
+/* @(#)e_atan2.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_atan2(y,x)
+ * Method :
+ *	1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
+ *	2. Reduce x to positive by (if x and y are unexceptional): 
+ *		ARG (x+iy) = arctan(y/x)   	   ... if x > 0,
+ *		ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,
+ *
+ * Special cases:
+ *
+ *	ATAN2((anything), NaN ) is NaN;
+ *	ATAN2(NAN , (anything) ) is NaN;
+ *	ATAN2(+-0, +(anything but NaN)) is +-0  ;
+ *	ATAN2(+-0, -(anything but NaN)) is +-pi ;
+ *	ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
+ *	ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
+ *	ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
+ *	ATAN2(+-INF,+INF ) is +-pi/4 ;
+ *	ATAN2(+-INF,-INF ) is +-3pi/4;
+ *	ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static volatile double
+tiny  = 1.0e-300;
+static const double
+zero  = 0.0,
+pi_o_4  = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
+pi_o_2  = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
+pi      = 3.1415926535897931160E+00; /* 0x400921FB, 0x54442D18 */
+static volatile double
+pi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
+
+double
+__ieee754_atan2(double y, double x)
+{
+	double z;
+	int32_t k,m,hx,hy,ix,iy;
+	u_int32_t lx,ly;
+
+	EXTRACT_WORDS(hx,lx,x);
+	ix = hx&0x7fffffff;
+	EXTRACT_WORDS(hy,ly,y);
+	iy = hy&0x7fffffff;
+	if(((ix|((lx|-lx)>>31))>0x7ff00000)||
+	   ((iy|((ly|-ly)>>31))>0x7ff00000))	/* x or y is NaN */
+	   return x+y;
+	if((hx-0x3ff00000|lx)==0) return atan(y);   /* x=1.0 */
+	m = ((hy>>31)&1)|((hx>>30)&2);	/* 2*sign(x)+sign(y) */
+
+    /* when y = 0 */
+	if((iy|ly)==0) {
+	    switch(m) {
+		case 0: 
+		case 1: return y; 	/* atan(+-0,+anything)=+-0 */
+		case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
+		case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+	    }
+	}
+    /* when x = 0 */
+	if((ix|lx)==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;
+	    
+    /* when x is INF */
+	if(ix==0x7ff00000) {
+	    if(iy==0x7ff00000) {
+		switch(m) {
+		    case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */
+		    case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
+		    case 2: return  3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
+		    case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
+		}
+	    } else {
+		switch(m) {
+		    case 0: return  zero  ;	/* atan(+...,+INF) */
+		    case 1: return -zero  ;	/* atan(-...,+INF) */
+		    case 2: return  pi+tiny  ;	/* atan(+...,-INF) */
+		    case 3: return -pi-tiny  ;	/* atan(-...,-INF) */
+		}
+	    }
+	}
+    /* when y is INF */
+	if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* compute y/x */
+	k = (iy-ix)>>20;
+	if(k > 60) {		 	/* |y/x| >  2**60 */
+	    z=pi_o_2+0.5*pi_lo;
+	    m&=1;
+	}
+	else if(hx<0&&k<-60) z=0.0; 	/* 0 > |y|/x > -2**-60 */
+	else z=atan(fabs(y/x));		/* safe to do y/x */
+	switch (m) {
+	    case 0: return       z  ;	/* atan(+,+) */
+	    case 1: return      -z  ;	/* atan(-,+) */
+	    case 2: return  pi-(z-pi_lo);/* atan(+,-) */
+	    default: /* case 3 */
+	    	    return  (z-pi_lo)-pi;/* atan(-,-) */
+	}
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(atan2, atan2l);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atan2f.c b/libm/upstream-freebsd/lib/msun/src/e_atan2f.c
new file mode 100644
index 0000000..fc77bff
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atan2f.c
@@ -0,0 +1,96 @@
+/* e_atan2f.c -- float version of e_atan2.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static volatile float
+tiny  = 1.0e-30;
+static const float
+zero  = 0.0,
+pi_o_4  = 7.8539818525e-01, /* 0x3f490fdb */
+pi_o_2  = 1.5707963705e+00, /* 0x3fc90fdb */
+pi      = 3.1415927410e+00; /* 0x40490fdb */
+static volatile float
+pi_lo   = -8.7422776573e-08; /* 0xb3bbbd2e */
+
+float
+__ieee754_atan2f(float y, float x)
+{
+	float z;
+	int32_t k,m,hx,hy,ix,iy;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	GET_FLOAT_WORD(hy,y);
+	iy = hy&0x7fffffff;
+	if((ix>0x7f800000)||
+	   (iy>0x7f800000))	/* x or y is NaN */
+	   return x+y;
+	if(hx==0x3f800000) return atanf(y);   /* x=1.0 */
+	m = ((hy>>31)&1)|((hx>>30)&2);	/* 2*sign(x)+sign(y) */
+
+    /* when y = 0 */
+	if(iy==0) {
+	    switch(m) {
+		case 0:
+		case 1: return y; 	/* atan(+-0,+anything)=+-0 */
+		case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
+		case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+	    }
+	}
+    /* when x = 0 */
+	if(ix==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* when x is INF */
+	if(ix==0x7f800000) {
+	    if(iy==0x7f800000) {
+		switch(m) {
+		    case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */
+		    case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
+		    case 2: return  (float)3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
+		    case 3: return (float)-3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
+		}
+	    } else {
+		switch(m) {
+		    case 0: return  zero  ;	/* atan(+...,+INF) */
+		    case 1: return -zero  ;	/* atan(-...,+INF) */
+		    case 2: return  pi+tiny  ;	/* atan(+...,-INF) */
+		    case 3: return -pi-tiny  ;	/* atan(-...,-INF) */
+		}
+	    }
+	}
+    /* when y is INF */
+	if(iy==0x7f800000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
+
+    /* compute y/x */
+	k = (iy-ix)>>23;
+	if(k > 26) {			/* |y/x| >  2**26 */
+	    z=pi_o_2+(float)0.5*pi_lo;
+	    m&=1;
+	}
+	else if(k<-26&&hx<0) z=0.0; 	/* 0 > |y|/x > -2**-26 */
+	else z=atanf(fabsf(y/x));	/* safe to do y/x */
+	switch (m) {
+	    case 0: return       z  ;	/* atan(+,+) */
+	    case 1: return      -z  ;	/* atan(-,+) */
+	    case 2: return  pi-(z-pi_lo);/* atan(+,-) */
+	    default: /* case 3 */
+	    	    return  (z-pi_lo)-pi;/* atan(-,-) */
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atan2l.c b/libm/upstream-freebsd/lib/msun/src/e_atan2l.c
new file mode 100644
index 0000000..0326482
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atan2l.c
@@ -0,0 +1,120 @@
+
+/* @(#)e_atan2.c 1.3 95/01/18 */
+/* FreeBSD: head/lib/msun/src/e_atan2.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in e_atan2.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static volatile long double
+tiny  = 1.0e-300;
+static const long double
+zero  = 0.0;
+
+#ifdef __i386__
+/* XXX Work around the fact that gcc truncates long double constants on i386 */
+static volatile double
+pi1 =  3.14159265358979311600e+00,	/*  0x1.921fb54442d18p+1  */
+pi2 =  1.22514845490862001043e-16;	/*  0x1.1a80000000000p-53 */
+#define	pi	((long double)pi1 + pi2)
+#else
+static const long double
+pi =  3.14159265358979323846264338327950280e+00L;
+#endif
+
+long double
+atan2l(long double y, long double x)
+{
+	union IEEEl2bits ux, uy;
+	long double z;
+	int32_t k,m;
+	int16_t exptx, expsignx, expty, expsigny;
+
+	uy.e = y;
+	expsigny = uy.xbits.expsign;
+	expty = expsigny & 0x7fff;
+	ux.e = x;
+	expsignx = ux.xbits.expsign;
+	exptx = expsignx & 0x7fff;
+
+	if ((exptx==BIAS+LDBL_MAX_EXP &&
+	     ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)!=0) ||	/* x is NaN */
+	    (expty==BIAS+LDBL_MAX_EXP &&
+	     ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0))	/* y is NaN */
+	    return x+y;
+	if (expsignx==BIAS && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
+	    return atanl(y);					/* x=1.0 */
+	m = ((expsigny>>15)&1)|((expsignx>>14)&2);	/* 2*sign(x)+sign(y) */
+
+    /* when y = 0 */
+	if(expty==0 && ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)==0) {
+	    switch(m) {
+		case 0: 
+		case 1: return y; 	/* atan(+-0,+anything)=+-0 */
+		case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
+		case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
+	    }
+	}
+    /* when x = 0 */
+	if(exptx==0 && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl)==0)
+	    return (expsigny<0)?  -pio2_hi-tiny: pio2_hi+tiny;
+
+    /* when x is INF */
+	if(exptx==BIAS+LDBL_MAX_EXP) {
+	    if(expty==BIAS+LDBL_MAX_EXP) {
+		switch(m) {
+		    case 0: return  pio2_hi*0.5+tiny;/* atan(+INF,+INF) */
+		    case 1: return -pio2_hi*0.5-tiny;/* atan(-INF,+INF) */
+		    case 2: return  1.5*pio2_hi+tiny;/*atan(+INF,-INF)*/
+		    case 3: return -1.5*pio2_hi-tiny;/*atan(-INF,-INF)*/
+		}
+	    } else {
+		switch(m) {
+		    case 0: return  zero  ;	/* atan(+...,+INF) */
+		    case 1: return -zero  ;	/* atan(-...,+INF) */
+		    case 2: return  pi+tiny  ;	/* atan(+...,-INF) */
+		    case 3: return -pi-tiny  ;	/* atan(-...,-INF) */
+		}
+	    }
+	}
+    /* when y is INF */
+	if(expty==BIAS+LDBL_MAX_EXP)
+	    return (expsigny<0)? -pio2_hi-tiny: pio2_hi+tiny;
+
+    /* compute y/x */
+	k = expty-exptx;
+	if(k > LDBL_MANT_DIG+2) {			/* |y/x| huge */
+	    z=pio2_hi+pio2_lo;
+	    m&=1;
+	}
+	else if(expsignx<0&&k<-LDBL_MANT_DIG-2) z=0.0; 	/* |y/x| tiny, x<0 */
+	else z=atanl(fabsl(y/x));		/* safe to do y/x */
+	switch (m) {
+	    case 0: return       z  ;	/* atan(+,+) */
+	    case 1: return      -z  ;	/* atan(-,+) */
+	    case 2: return  pi-(z-pi_lo);/* atan(+,-) */
+	    default: /* case 3 */
+	    	    return  (z-pi_lo)-pi;/* atan(-,-) */
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atanh.c b/libm/upstream-freebsd/lib/msun/src/e_atanh.c
new file mode 100644
index 0000000..422ff26
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atanh.c
@@ -0,0 +1,68 @@
+
+/* @(#)e_atanh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_atanh(x)
+ * Method :
+ *    1.Reduced x to positive by atanh(-x) = -atanh(x)
+ *    2.For x>=0.5
+ *                  1              2x                          x
+ *	atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
+ *                  2             1 - x                      1 - x
+ *	
+ * 	For x<0.5
+ *	atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
+ *
+ * Special cases:
+ *	atanh(x) is NaN if |x| > 1 with signal;
+ *	atanh(NaN) is that NaN with no signal;
+ *	atanh(+-1) is +-INF with signal.
+ *
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, huge = 1e300;
+static const double zero = 0.0;
+
+double
+__ieee754_atanh(double x)
+{
+	double t;
+	int32_t hx,ix;
+	u_int32_t lx;
+	EXTRACT_WORDS(hx,lx,x);
+	ix = hx&0x7fffffff;
+	if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */
+	    return (x-x)/(x-x);
+	if(ix==0x3ff00000) 
+	    return x/zero;
+	if(ix<0x3e300000&&(huge+x)>zero) return x;	/* x<2**-28 */
+	SET_HIGH_WORD(x,ix);
+	if(ix<0x3fe00000) {		/* x < 0.5 */
+	    t = x+x;
+	    t = 0.5*log1p(t+t*x/(one-x));
+	} else 
+	    t = 0.5*log1p((x+x)/(one-x));
+	if(hx>=0) return t; else return -t;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(atanh, atanhl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atanhf.c b/libm/upstream-freebsd/lib/msun/src/e_atanhf.c
new file mode 100644
index 0000000..4bd6a8f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atanhf.c
@@ -0,0 +1,45 @@
+/* e_atanhf.c -- float version of e_atanh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, huge = 1e30;
+
+static const float zero = 0.0;
+
+float
+__ieee754_atanhf(float x)
+{
+	float t;
+	int32_t hx,ix;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if (ix>0x3f800000) 		/* |x|>1 */
+	    return (x-x)/(x-x);
+	if(ix==0x3f800000)
+	    return x/zero;
+	if(ix<0x31800000&&(huge+x)>zero) return x;	/* x<2**-28 */
+	SET_FLOAT_WORD(x,ix);
+	if(ix<0x3f000000) {		/* x < 0.5 */
+	    t = x+x;
+	    t = (float)0.5*log1pf(t+t*x/(one-x));
+	} else
+	    t = (float)0.5*log1pf((x+x)/(one-x));
+	if(hx>=0) return t; else return -t;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_atanhl.c b/libm/upstream-freebsd/lib/msun/src/e_atanhl.c
new file mode 100644
index 0000000..11d56ea
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_atanhl.c
@@ -0,0 +1,74 @@
+/* from: FreeBSD: head/lib/msun/src/e_atanh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)e_atanh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_atanh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_TINY is the threshold below which we use atanh(x) ~= x. */
+#if LDBL_MANT_DIG == 64
+#define	EXP_TINY	-34
+#elif LDBL_MANT_DIG == 113
+#define	EXP_TINY	-58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const double one = 1.0, huge = 1e300;
+static const double zero = 0.0;
+
+long double
+atanhl(long double x)
+{
+	long double t;
+	uint16_t hx, ix;
+
+	ENTERI();
+	GET_LDBL_EXPSIGN(hx, x);
+	ix = hx & 0x7fff;
+	if (ix >= 0x3fff)		/* |x| >= 1, or NaN or misnormal */
+	    RETURNI(fabsl(x) == 1 ? x / zero : (x - x) / (x - x));
+	if (ix < BIAS + EXP_TINY && (huge + x) > zero)
+	    RETURNI(x);			/* x is tiny */
+	SET_LDBL_EXPSIGN(x, ix);
+	if (ix < 0x3ffe) {		/* |x| < 0.5, or misnormal */
+	    t = x+x;
+	    t = 0.5*log1pl(t+t*x/(one-x));
+	} else 
+	    t = 0.5*log1pl((x+x)/(one-x));
+	RETURNI((hx & 0x8000) == 0 ? t : -t);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_cosh.c b/libm/upstream-freebsd/lib/msun/src/e_cosh.c
new file mode 100644
index 0000000..246b5fb
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_cosh.c
@@ -0,0 +1,85 @@
+
+/* @(#)e_cosh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_cosh(x)
+ * Method : 
+ * mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2
+ *	1. Replace x by |x| (cosh(x) = cosh(-x)). 
+ *	2. 
+ *		                                        [ exp(x) - 1 ]^2 
+ *	    0        <= x <= ln2/2  :  cosh(x) := 1 + -------------------
+ *			       			           2*exp(x)
+ *
+ *		                                  exp(x) +  1/exp(x)
+ *	    ln2/2    <= x <= 22     :  cosh(x) := -------------------
+ *			       			          2
+ *	    22       <= x <= lnovft :  cosh(x) := exp(x)/2 
+ *	    lnovft   <= x <= ln2ovft:  cosh(x) := exp(x/2)/2 * exp(x/2)
+ *	    ln2ovft  <  x	    :  cosh(x) := huge*huge (overflow)
+ *
+ * Special cases:
+ *	cosh(x) is |x| if x is +INF, -INF, or NaN.
+ *	only cosh(0)=1 is exact for finite x.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, half=0.5, huge = 1.0e300;
+
+double
+__ieee754_cosh(double x)
+{
+	double t,w;
+	int32_t ix;
+
+    /* High word of |x|. */
+	GET_HIGH_WORD(ix,x);
+	ix &= 0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7ff00000) return x*x;	
+
+    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
+	if(ix<0x3fd62e43) {
+	    t = expm1(fabs(x));
+	    w = one+t;
+	    if (ix<0x3c800000) return w;	/* cosh(tiny) = 1 */
+	    return one+(t*t)/(w+w);
+	}
+
+    /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
+	if (ix < 0x40360000) {
+		t = __ieee754_exp(fabs(x));
+		return half*t+half/t;
+	}
+
+    /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
+	if (ix < 0x40862E42)  return half*__ieee754_exp(fabs(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+	if (ix<=0x408633CE)
+	    return __ldexp_exp(fabs(x), -1);
+
+    /* |x| > overflowthresold, cosh(x) overflow */
+	return huge*huge;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(cosh, coshl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_coshf.c b/libm/upstream-freebsd/lib/msun/src/e_coshf.c
new file mode 100644
index 0000000..95a0d6e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_coshf.c
@@ -0,0 +1,59 @@
+/* e_coshf.c -- float version of e_cosh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, half=0.5, huge = 1.0e30;
+
+float
+__ieee754_coshf(float x)
+{
+	float t,w;
+	int32_t ix;
+
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7f800000) return x*x;
+
+    /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
+	if(ix<0x3eb17218) {
+	    t = expm1f(fabsf(x));
+	    w = one+t;
+	    if (ix<0x39800000) return one;	/* cosh(tiny) = 1 */
+	    return one+(t*t)/(w+w);
+	}
+
+    /* |x| in [0.5*ln2,9], return (exp(|x|)+1/exp(|x|))/2; */
+	if (ix < 0x41100000) {
+		t = __ieee754_expf(fabsf(x));
+		return half*t+half/t;
+	}
+
+    /* |x| in [9, log(maxfloat)] return half*exp(|x|) */
+	if (ix < 0x42b17217)  return half*__ieee754_expf(fabsf(x));
+
+    /* |x| in [log(maxfloat), overflowthresold] */
+	if (ix<=0x42b2d4fc)
+	    return __ldexp_expf(fabsf(x), -1);
+
+    /* |x| > overflowthresold, cosh(x) overflow */
+	return huge*huge;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_coshl.c b/libm/upstream-freebsd/lib/msun/src/e_coshl.c
new file mode 100644
index 0000000..0a21277
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_coshl.c
@@ -0,0 +1,130 @@
+/* from: FreeBSD: head/lib/msun/src/e_coshl.c XXX */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_cosh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const volatile long double huge = 0x1p10000L, tiny = 0x1p-10000L;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-1, 1], range ~[-1.8211e-21, 1.8211e-21]:
+ * |cosh(x) - c(x)| < 2**-68.8
+ */
+static const union IEEEl2bits
+C4u = LD80C(0xaaaaaaaaaaaaac78, -5,  4.16666666666666682297e-2L);
+#define	C4	C4u.e
+static const double
+C2  =  0.5,
+C6  =  1.3888888888888616e-3,		/*  0x16c16c16c16b99.0p-62 */
+C8  =  2.4801587301767953e-5,		/*  0x1a01a01a027061.0p-68 */
+C10 =  2.7557319163300398e-7,		/*  0x127e4fb6c9b55f.0p-74 */
+C12 =  2.0876768371393075e-9,		/*  0x11eed99406a3f4.0p-81 */
+C14 =  1.1469537039374480e-11,		/*  0x1938c67cd18c48.0p-89 */
+C16 =  4.8473490896852041e-14;		/*  0x1b49c429701e45.0p-97 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-1, 1], range ~[-2.3194e-37, 2.3194e-37]:
+ * |cosh(x) - c(x)| < 2**-121.69
+ */
+static const long double
+C4  =  4.16666666666666666666666666666666225e-2L,	/*  0x1555555555555555555555555554e.0p-117L */
+C6  =  1.38888888888888888888888888889434831e-3L,	/*  0x16c16c16c16c16c16c16c16c1dd7a.0p-122L */
+C8  =  2.48015873015873015873015871870962089e-5L,	/*  0x1a01a01a01a01a01a01a017af2756.0p-128L */
+C10 =  2.75573192239858906525574318600800201e-7L,	/*  0x127e4fb7789f5c72ef01c8a040640.0p-134L */
+C12 =  2.08767569878680989791444691755468269e-9L,	/*  0x11eed8eff8d897b543d0679607399.0p-141L */
+C14=  1.14707455977297247387801189650495351e-11L,	/*  0x193974a8c07c9d24ae169a7fa9b54.0p-149L */
+C16 =  4.77947733238737883626416876486279985e-14L;	/*  0x1ae7f3e733b814d4e1b90f5727fe4.0p-157L */
+static const double
+C2  =  0.5,
+C18 =  1.5619206968597871e-16,		/*  0x16827863b9900b.0p-105 */
+C20 =  4.1103176218528049e-19,		/*  0x1e542ba3d3c269.0p-114 */
+C22 =  8.8967926401641701e-22,		/*  0x10ce399542a014.0p-122 */
+C24 =  1.6116681626523904e-24,		/*  0x1f2c981d1f0cb7.0p-132 */
+C26 =  2.5022374732804632e-27;		/*  0x18c7ecf8b2c4a0.0p-141 */
+#else
+#error "Unsupported long double format"
+#endif /* LDBL_MANT_DIG == 64 */
+
+/* log(2**16385 - 0.5) rounded up: */
+static const float
+o_threshold =  1.13572168e4;		/*  0xb174de.0p-10 */
+
+long double
+coshl(long double x)
+{
+	long double hi,lo,x2,x4;
+	double dx2;
+	uint16_t ix;
+
+	GET_LDBL_EXPSIGN(ix,x);
+	ix &= 0x7fff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7fff) return x*x;
+
+	ENTERI();
+
+    /* |x| < 1, return 1 or c(x) */
+	if(ix<0x3fff) {
+	    if (ix<BIAS-(LDBL_MANT_DIG+1)/2) 	/* |x| < TINY */
+		RETURNI(1+tiny);	/* cosh(tiny) = 1(+) with inexact */
+	    x2 = x*x;
+#if LDBL_MANT_DIG == 64
+	    x4 = x2*x2;
+	    RETURNI(((C16*x2 + C14)*x4 + (C12*x2 + C10))*(x4*x4*x2) +
+		((C8*x2 + C6)*x2 + C4)*x4 + C2*x2 + 1);
+#elif LDBL_MANT_DIG == 113
+	    dx2 = x2;
+	    RETURNI((((((((((((C26*dx2 + C24)*dx2 + C22)*dx2 +
+		C20)*x2 + C18)*x2 +
+		C16)*x2 + C14)*x2 + C12)*x2 + C10)*x2 + C8)*x2 + C6)*x2 +
+		C4)*(x2*x2) + C2*x2 + 1);
+#endif
+	}
+
+    /* |x| in [1, 64), return accurate exp(|x|)/2+1/exp(|x|)/2 */
+	if (ix < 0x4005) {
+	    k_hexpl(fabsl(x), &hi, &lo);
+	    RETURNI(lo + 0.25/(hi + lo) + hi);
+	}
+
+    /* |x| in [64, o_threshold], return correctly-overflowing exp(|x|)/2 */
+	if (fabsl(x) <= o_threshold)
+	    RETURNI(hexpl(fabsl(x)));
+
+    /* |x| > o_threshold, cosh(x) overflow */
+	RETURNI(huge*huge);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_exp.c b/libm/upstream-freebsd/lib/msun/src/e_exp.c
new file mode 100644
index 0000000..94c9769
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_exp.c
@@ -0,0 +1,164 @@
+
+/* @(#)e_exp.c 1.6 04/04/22 */
+/*
+ * ====================================================
+ * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_exp(x)
+ * Returns the exponential of x.
+ *
+ * Method
+ *   1. Argument reduction:
+ *      Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
+ *	Given x, find r and integer k such that
+ *
+ *               x = k*ln2 + r,  |r| <= 0.5*ln2.  
+ *
+ *      Here r will be represented as r = hi-lo for better 
+ *	accuracy.
+ *
+ *   2. Approximation of exp(r) by a special rational function on
+ *	the interval [0,0.34658]:
+ *	Write
+ *	    R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
+ *      We use a special Remes algorithm on [0,0.34658] to generate 
+ * 	a polynomial of degree 5 to approximate R. The maximum error 
+ *	of this polynomial approximation is bounded by 2**-59. In
+ *	other words,
+ *	    R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
+ *  	(where z=r*r, and the values of P1 to P5 are listed below)
+ *	and
+ *	    |                  5          |     -59
+ *	    | 2.0+P1*z+...+P5*z   -  R(z) | <= 2 
+ *	    |                             |
+ *	The computation of exp(r) thus becomes
+ *                             2*r
+ *		exp(r) = 1 + -------
+ *		              R - r
+ *                                 r*R1(r)	
+ *		       = 1 + r + ----------- (for better accuracy)
+ *		                  2 - R1(r)
+ *	where
+ *			         2       4             10
+ *		R1(r) = r - (P1*r  + P2*r  + ... + P5*r   ).
+ *	
+ *   3. Scale back to obtain exp(x):
+ *	From step 1, we have
+ *	   exp(x) = 2^k * exp(r)
+ *
+ * Special cases:
+ *	exp(INF) is INF, exp(NaN) is NaN;
+ *	exp(-INF) is 0, and
+ *	for finite argument, only exp(0)=1 is exact.
+ *
+ * Accuracy:
+ *	according to an error analysis, the error is always less than
+ *	1 ulp (unit in the last place).
+ *
+ * Misc. info.
+ *	For IEEE double 
+ *	    if x >  7.09782712893383973096e+02 then exp(x) overflow
+ *	    if x < -7.45133219101941108420e+02 then exp(x) underflow
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one	= 1.0,
+halF[2]	= {0.5,-0.5,},
+o_threshold=  7.09782712893383973096e+02,  /* 0x40862E42, 0xFEFA39EF */
+u_threshold= -7.45133219101941108420e+02,  /* 0xc0874910, 0xD52D3051 */
+ln2HI[2]   ={ 6.93147180369123816490e-01,  /* 0x3fe62e42, 0xfee00000 */
+	     -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */
+ln2LO[2]   ={ 1.90821492927058770002e-10,  /* 0x3dea39ef, 0x35793c76 */
+	     -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */
+invln2 =  1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
+P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
+P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
+P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
+P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
+P5   =  4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
+
+static volatile double
+huge	= 1.0e+300,
+twom1000= 9.33263618503218878990e-302;     /* 2**-1000=0x01700000,0*/
+
+double
+__ieee754_exp(double x)	/* default IEEE double exp */
+{
+	double y,hi=0.0,lo=0.0,c,t,twopk;
+	int32_t k=0,xsb;
+	u_int32_t hx;
+
+	GET_HIGH_WORD(hx,x);
+	xsb = (hx>>31)&1;		/* sign bit of x */
+	hx &= 0x7fffffff;		/* high word of |x| */
+
+    /* filter out non-finite argument */
+	if(hx >= 0x40862E42) {			/* if |x|>=709.78... */
+            if(hx>=0x7ff00000) {
+	        u_int32_t lx;
+		GET_LOW_WORD(lx,x);
+		if(((hx&0xfffff)|lx)!=0)
+		     return x+x; 		/* NaN */
+		else return (xsb==0)? x:0.0;	/* exp(+-inf)={inf,0} */
+	    }
+	    if(x > o_threshold) return huge*huge; /* overflow */
+	    if(x < u_threshold) return twom1000*twom1000; /* underflow */
+	}
+
+    /* argument reduction */
+	if(hx > 0x3fd62e42) {		/* if  |x| > 0.5 ln2 */ 
+	    if(hx < 0x3FF0A2B2) {	/* and |x| < 1.5 ln2 */
+		hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
+	    } else {
+		k  = (int)(invln2*x+halF[xsb]);
+		t  = k;
+		hi = x - t*ln2HI[0];	/* t*ln2HI is exact here */
+		lo = t*ln2LO[0];
+	    }
+	    STRICT_ASSIGN(double, x, hi - lo);
+	} 
+	else if(hx < 0x3e300000)  {	/* when |x|<2**-28 */
+	    if(huge+x>one) return one+x;/* trigger inexact */
+	}
+	else k = 0;
+
+    /* x is now in primary range */
+	t  = x*x;
+	if(k >= -1021)
+	    INSERT_WORDS(twopk,0x3ff00000+(k<<20), 0);
+	else
+	    INSERT_WORDS(twopk,0x3ff00000+((k+1000)<<20), 0);
+	c  = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+	if(k==0) 	return one-((x*c)/(c-2.0)-x); 
+	else 		y = one-((lo-(x*c)/(2.0-c))-hi);
+	if(k >= -1021) {
+	    if (k==1024) return y*2.0*0x1p1023;
+	    return y*twopk;
+	} else {
+	    return y*twopk*twom1000;
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(exp, expl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_expf.c b/libm/upstream-freebsd/lib/msun/src/e_expf.c
new file mode 100644
index 0000000..b1fe2c5
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_expf.c
@@ -0,0 +1,98 @@
+/* e_expf.c -- float version of e_exp.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one	= 1.0,
+halF[2]	= {0.5,-0.5,},
+o_threshold=  8.8721679688e+01,  /* 0x42b17180 */
+u_threshold= -1.0397208405e+02,  /* 0xc2cff1b5 */
+ln2HI[2]   ={ 6.9314575195e-01,		/* 0x3f317200 */
+	     -6.9314575195e-01,},	/* 0xbf317200 */
+ln2LO[2]   ={ 1.4286067653e-06,  	/* 0x35bfbe8e */
+	     -1.4286067653e-06,},	/* 0xb5bfbe8e */
+invln2 =  1.4426950216e+00, 		/* 0x3fb8aa3b */
+/*
+ * Domain [-0.34568, 0.34568], range ~[-4.278e-9, 4.447e-9]:
+ * |x*(exp(x)+1)/(exp(x)-1) - p(x)| < 2**-27.74
+ */
+P1 =  1.6666625440e-1,		/*  0xaaaa8f.0p-26 */
+P2 = -2.7667332906e-3;		/* -0xb55215.0p-32 */
+
+static volatile float
+huge	= 1.0e+30,
+twom100 = 7.8886090522e-31;      /* 2**-100=0x0d800000 */
+
+float
+__ieee754_expf(float x)
+{
+	float y,hi=0.0,lo=0.0,c,t,twopk;
+	int32_t k=0,xsb;
+	u_int32_t hx;
+
+	GET_FLOAT_WORD(hx,x);
+	xsb = (hx>>31)&1;		/* sign bit of x */
+	hx &= 0x7fffffff;		/* high word of |x| */
+
+    /* filter out non-finite argument */
+	if(hx >= 0x42b17218) {			/* if |x|>=88.721... */
+	    if(hx>0x7f800000)
+		 return x+x;	 		/* NaN */
+            if(hx==0x7f800000)
+		return (xsb==0)? x:0.0;		/* exp(+-inf)={inf,0} */
+	    if(x > o_threshold) return huge*huge; /* overflow */
+	    if(x < u_threshold) return twom100*twom100; /* underflow */
+	}
+
+    /* argument reduction */
+	if(hx > 0x3eb17218) {		/* if  |x| > 0.5 ln2 */
+	    if(hx < 0x3F851592) {	/* and |x| < 1.5 ln2 */
+		hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
+	    } else {
+		k  = invln2*x+halF[xsb];
+		t  = k;
+		hi = x - t*ln2HI[0];	/* t*ln2HI is exact here */
+		lo = t*ln2LO[0];
+	    }
+	    STRICT_ASSIGN(float, x, hi - lo);
+	}
+	else if(hx < 0x39000000)  {	/* when |x|<2**-14 */
+	    if(huge+x>one) return one+x;/* trigger inexact */
+	}
+	else k = 0;
+
+    /* x is now in primary range */
+	t  = x*x;
+	if(k >= -125)
+	    SET_FLOAT_WORD(twopk,0x3f800000+(k<<23));
+	else
+	    SET_FLOAT_WORD(twopk,0x3f800000+((k+100)<<23));
+	c  = x - t*(P1+t*P2);
+	if(k==0) 	return one-((x*c)/(c-(float)2.0)-x);
+	else 		y = one-((lo-(x*c)/((float)2.0-c))-hi);
+	if(k >= -125) {
+	    if(k==128) return y*2.0F*0x1p127F;
+	    return y*twopk;
+	} else {
+	    return y*twopk*twom100;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_fmod.c b/libm/upstream-freebsd/lib/msun/src/e_fmod.c
new file mode 100644
index 0000000..720aa03
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_fmod.c
@@ -0,0 +1,132 @@
+
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* 
+ * __ieee754_fmod(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, Zero[] = {0.0, -0.0,};
+
+double
+__ieee754_fmod(double x, double y)
+{
+	int32_t n,hx,hy,hz,ix,iy,sx,i;
+	u_int32_t lx,ly,lz;
+
+	EXTRACT_WORDS(hx,lx,x);
+	EXTRACT_WORDS(hy,ly,y);
+	sx = hx&0x80000000;		/* sign of x */
+	hx ^=sx;		/* |x| */
+	hy &= 0x7fffffff;	/* |y| */
+
+    /* purge off exception values */
+	if((hy|ly)==0||(hx>=0x7ff00000)||	/* y=0,or x not finite */
+	  ((hy|((ly|-ly)>>31))>0x7ff00000))	/* or y is NaN */
+	    return (x*y)/(x*y);
+	if(hx<=hy) {
+	    if((hx<hy)||(lx<ly)) return x;	/* |x|<|y| return x */
+	    if(lx==ly) 
+		return Zero[(u_int32_t)sx>>31];	/* |x|=|y| return x*0*/
+	}
+
+    /* determine ix = ilogb(x) */
+	if(hx<0x00100000) {	/* subnormal x */
+	    if(hx==0) {
+		for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
+	    } else {
+		for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
+	    }
+	} else ix = (hx>>20)-1023;
+
+    /* determine iy = ilogb(y) */
+	if(hy<0x00100000) {	/* subnormal y */
+	    if(hy==0) {
+		for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
+	    } else {
+		for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
+	    }
+	} else iy = (hy>>20)-1023;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	if(ix >= -1022) 
+	    hx = 0x00100000|(0x000fffff&hx);
+	else {		/* subnormal x, shift x to normal */
+	    n = -1022-ix;
+	    if(n<=31) {
+	        hx = (hx<<n)|(lx>>(32-n));
+	        lx <<= n;
+	    } else {
+		hx = lx<<(n-32);
+		lx = 0;
+	    }
+	}
+	if(iy >= -1022) 
+	    hy = 0x00100000|(0x000fffff&hy);
+	else {		/* subnormal y, shift y to normal */
+	    n = -1022-iy;
+	    if(n<=31) {
+	        hy = (hy<<n)|(ly>>(32-n));
+	        ly <<= n;
+	    } else {
+		hy = ly<<(n-32);
+		ly = 0;
+	    }
+	}
+
+    /* fix point fmod */
+	n = ix - iy;
+	while(n--) {
+	    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	    if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
+	    else {
+	    	if((hz|lz)==0) 		/* return sign(x)*0 */
+		    return Zero[(u_int32_t)sx>>31];
+	    	hx = hz+hz+(lz>>31); lx = lz+lz;
+	    }
+	}
+	hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	if(hz>=0) {hx=hz;lx=lz;}
+
+    /* convert back to floating value and restore the sign */
+	if((hx|lx)==0) 			/* return sign(x)*0 */
+	    return Zero[(u_int32_t)sx>>31];
+	while(hx<0x00100000) {		/* normalize x */
+	    hx = hx+hx+(lx>>31); lx = lx+lx;
+	    iy -= 1;
+	}
+	if(iy>= -1022) {	/* normalize output */
+	    hx = ((hx-0x00100000)|((iy+1023)<<20));
+	    INSERT_WORDS(x,hx|sx,lx);
+	} else {		/* subnormal output */
+	    n = -1022 - iy;
+	    if(n<=20) {
+		lx = (lx>>n)|((u_int32_t)hx<<(32-n));
+		hx >>= n;
+	    } else if (n<=31) {
+		lx = (hx<<(32-n))|(lx>>n); hx = sx;
+	    } else {
+		lx = hx>>(n-32); hx = sx;
+	    }
+	    INSERT_WORDS(x,hx|sx,lx);
+	    x *= one;		/* create necessary signal */
+	}
+	return x;		/* exact output */
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_fmodf.c b/libm/upstream-freebsd/lib/msun/src/e_fmodf.c
new file mode 100644
index 0000000..52ce373
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_fmodf.c
@@ -0,0 +1,104 @@
+/* e_fmodf.c -- float version of e_fmod.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * __ieee754_fmodf(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, Zero[] = {0.0, -0.0,};
+
+float
+__ieee754_fmodf(float x, float y)
+{
+	int32_t n,hx,hy,hz,ix,iy,sx,i;
+
+	GET_FLOAT_WORD(hx,x);
+	GET_FLOAT_WORD(hy,y);
+	sx = hx&0x80000000;		/* sign of x */
+	hx ^=sx;		/* |x| */
+	hy &= 0x7fffffff;	/* |y| */
+
+    /* purge off exception values */
+	if(hy==0||(hx>=0x7f800000)||		/* y=0,or x not finite */
+	   (hy>0x7f800000))			/* or y is NaN */
+	    return (x*y)/(x*y);
+	if(hx<hy) return x;			/* |x|<|y| return x */
+	if(hx==hy)
+	    return Zero[(u_int32_t)sx>>31];	/* |x|=|y| return x*0*/
+
+    /* determine ix = ilogb(x) */
+	if(hx<0x00800000) {	/* subnormal x */
+	    for (ix = -126,i=(hx<<8); i>0; i<<=1) ix -=1;
+	} else ix = (hx>>23)-127;
+
+    /* determine iy = ilogb(y) */
+	if(hy<0x00800000) {	/* subnormal y */
+	    for (iy = -126,i=(hy<<8); i>=0; i<<=1) iy -=1;
+	} else iy = (hy>>23)-127;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	if(ix >= -126)
+	    hx = 0x00800000|(0x007fffff&hx);
+	else {		/* subnormal x, shift x to normal */
+	    n = -126-ix;
+	    hx = hx<<n;
+	}
+	if(iy >= -126)
+	    hy = 0x00800000|(0x007fffff&hy);
+	else {		/* subnormal y, shift y to normal */
+	    n = -126-iy;
+	    hy = hy<<n;
+	}
+
+    /* fix point fmod */
+	n = ix - iy;
+	while(n--) {
+	    hz=hx-hy;
+	    if(hz<0){hx = hx+hx;}
+	    else {
+	    	if(hz==0) 		/* return sign(x)*0 */
+		    return Zero[(u_int32_t)sx>>31];
+	    	hx = hz+hz;
+	    }
+	}
+	hz=hx-hy;
+	if(hz>=0) {hx=hz;}
+
+    /* convert back to floating value and restore the sign */
+	if(hx==0) 			/* return sign(x)*0 */
+	    return Zero[(u_int32_t)sx>>31];
+	while(hx<0x00800000) {		/* normalize x */
+	    hx = hx+hx;
+	    iy -= 1;
+	}
+	if(iy>= -126) {		/* normalize output */
+	    hx = ((hx-0x00800000)|((iy+127)<<23));
+	    SET_FLOAT_WORD(x,hx|sx);
+	} else {		/* subnormal output */
+	    n = -126 - iy;
+	    hx >>= n;
+	    SET_FLOAT_WORD(x,hx|sx);
+	    x *= one;		/* create necessary signal */
+	}
+	return x;		/* exact output */
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_fmodl.c b/libm/upstream-freebsd/lib/msun/src/e_fmodl.c
new file mode 100644
index 0000000..e315f76
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_fmodl.c
@@ -0,0 +1,149 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define	BIAS (LDBL_MAX_EXP - 1)
+
+#if LDBL_MANL_SIZE > 32
+typedef	uint64_t manl_t;
+#else
+typedef	uint32_t manl_t;
+#endif
+
+#if LDBL_MANH_SIZE > 32
+typedef	uint64_t manh_t;
+#else
+typedef	uint32_t manh_t;
+#endif
+
+/*
+ * These macros add and remove an explicit integer bit in front of the
+ * fractional mantissa, if the architecture doesn't have such a bit by
+ * default already.
+ */
+#ifdef LDBL_IMPLICIT_NBIT
+#define	SET_NBIT(hx)	((hx) | (1ULL << LDBL_MANH_SIZE))
+#define	HFRAC_BITS	LDBL_MANH_SIZE
+#else
+#define	SET_NBIT(hx)	(hx)
+#define	HFRAC_BITS	(LDBL_MANH_SIZE - 1)
+#endif
+
+#define	MANL_SHIFT	(LDBL_MANL_SIZE - 1)
+
+static const long double one = 1.0, Zero[] = {0.0, -0.0,};
+
+/*
+ * fmodl(x,y)
+ * Return x mod y in exact arithmetic
+ * Method: shift and subtract
+ *
+ * Assumptions:
+ * - The low part of the mantissa fits in a manl_t exactly.
+ * - The high part of the mantissa fits in an int64_t with enough room
+ *   for an explicit integer bit in front of the fractional bits.
+ */
+long double
+fmodl(long double x, long double y)
+{
+	union IEEEl2bits ux, uy;
+	int64_t hx,hz;	/* We need a carry bit even if LDBL_MANH_SIZE is 32. */
+	manh_t hy;
+	manl_t lx,ly,lz;
+	int ix,iy,n,sx;
+
+	ux.e = x;
+	uy.e = y;
+	sx = ux.bits.sign;
+
+    /* purge off exception values */
+	if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
+	   (ux.bits.exp == BIAS + LDBL_MAX_EXP) ||	 /* or x not finite */
+	   (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
+	    ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
+	    return (x*y)/(x*y);
+	if(ux.bits.exp<=uy.bits.exp) {
+	    if((ux.bits.exp<uy.bits.exp) ||
+	       (ux.bits.manh<=uy.bits.manh &&
+		(ux.bits.manh<uy.bits.manh ||
+		 ux.bits.manl<uy.bits.manl))) {
+		return x;		/* |x|<|y| return x or x-y */
+	    }
+	    if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
+		return Zero[sx];	/* |x|=|y| return x*0*/
+	    }
+	}
+
+    /* determine ix = ilogb(x) */
+	if(ux.bits.exp == 0) {	/* subnormal x */
+	    ux.e *= 0x1.0p512;
+	    ix = ux.bits.exp - (BIAS + 512);
+	} else {
+	    ix = ux.bits.exp - BIAS;
+	}
+
+    /* determine iy = ilogb(y) */
+	if(uy.bits.exp == 0) {	/* subnormal y */
+	    uy.e *= 0x1.0p512;
+	    iy = uy.bits.exp - (BIAS + 512);
+	} else {
+	    iy = uy.bits.exp - BIAS;
+	}
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	hx = SET_NBIT(ux.bits.manh);
+	hy = SET_NBIT(uy.bits.manh);
+	lx = ux.bits.manl;
+	ly = uy.bits.manl;
+
+    /* fix point fmod */
+	n = ix - iy;
+
+	while(n--) {
+	    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	    if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
+	    else {
+		if ((hz|lz)==0)		/* return sign(x)*0 */
+		    return Zero[sx];
+		hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz;
+	    }
+	}
+	hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	if(hz>=0) {hx=hz;lx=lz;}
+
+    /* convert back to floating value and restore the sign */
+	if((hx|lx)==0)			/* return sign(x)*0 */
+	    return Zero[sx];
+	while(hx<(1ULL<<HFRAC_BITS)) {	/* normalize x */
+	    hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
+	    iy -= 1;
+	}
+	ux.bits.manh = hx; /* The mantissa is truncated here if needed. */
+	ux.bits.manl = lx;
+	if (iy < LDBL_MIN_EXP) {
+	    ux.bits.exp = iy + (BIAS + 512);
+	    ux.e *= 0x1p-512;
+	} else {
+	    ux.bits.exp = iy + BIAS;
+	}
+	x = ux.e * one;		/* create necessary signal */
+	return x;		/* exact output */
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_gamma.c b/libm/upstream-freebsd/lib/msun/src/e_gamma.c
new file mode 100644
index 0000000..28fb5cc
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_gamma.c
@@ -0,0 +1,33 @@
+
+/* @(#)e_gamma.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_gamma(x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_gamma_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+double
+__ieee754_gamma(double x)
+{
+	return __ieee754_gamma_r(x,&signgam);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_gamma_r.c b/libm/upstream-freebsd/lib/msun/src/e_gamma_r.c
new file mode 100644
index 0000000..2c423dc
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_gamma_r.c
@@ -0,0 +1,32 @@
+
+/* @(#)e_gamma_r.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_gamma_r(x, signgamp)
+ * Reentrant version of the logarithm of the Gamma function 
+ * with user provide pointer for the sign of Gamma(x). 
+ *
+ * Method: See __ieee754_lgamma_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+__ieee754_gamma_r(double x, int *signgamp)
+{
+	return __ieee754_lgamma_r(x,signgamp);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_gammaf.c b/libm/upstream-freebsd/lib/msun/src/e_gammaf.c
new file mode 100644
index 0000000..c1b1668
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_gammaf.c
@@ -0,0 +1,34 @@
+/* e_gammaf.c -- float version of e_gamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_gammaf(x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_gammaf_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+float
+__ieee754_gammaf(float x)
+{
+	return __ieee754_gammaf_r(x,&signgam);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_gammaf_r.c b/libm/upstream-freebsd/lib/msun/src/e_gammaf_r.c
new file mode 100644
index 0000000..9d7831b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_gammaf_r.c
@@ -0,0 +1,33 @@
+/* e_gammaf_r.c -- float version of e_gamma_r.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_gammaf_r(x, signgamp)
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
+ *
+ * Method: See __ieee754_lgammaf_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+__ieee754_gammaf_r(float x, int *signgamp)
+{
+	return __ieee754_lgammaf_r(x,signgamp);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_hypot.c b/libm/upstream-freebsd/lib/msun/src/e_hypot.c
new file mode 100644
index 0000000..2398e98
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_hypot.c
@@ -0,0 +1,131 @@
+
+/* @(#)e_hypot.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_hypot(x,y)
+ *
+ * Method :                  
+ *	If (assume round-to-nearest) z=x*x+y*y 
+ *	has error less than sqrt(2)/2 ulp, than 
+ *	sqrt(z) has error less than 1 ulp (exercise).
+ *
+ *	So, compute sqrt(x*x+y*y) with some care as 
+ *	follows to get the error below 1 ulp:
+ *
+ *	Assume x>y>0;
+ *	(if possible, set rounding to round-to-nearest)
+ *	1. if x > 2y  use
+ *		x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y
+ *	where x1 = x with lower 32 bits cleared, x2 = x-x1; else
+ *	2. if x <= 2y use
+ *		t1*y1+((x-y)*(x-y)+(t1*y2+t2*y))
+ *	where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1, 
+ *	y1= y with lower 32 bits chopped, y2 = y-y1.
+ *		
+ *	NOTE: scaling may be necessary if some argument is too 
+ *	      large or too tiny
+ *
+ * Special cases:
+ *	hypot(x,y) is INF if x or y is +INF or -INF; else
+ *	hypot(x,y) is NAN if x or y is NAN.
+ *
+ * Accuracy:
+ * 	hypot(x,y) returns sqrt(x^2+y^2) with error less 
+ * 	than 1 ulps (units in the last place) 
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+double
+__ieee754_hypot(double x, double y)
+{
+	double a,b,t1,t2,y1,y2,w;
+	int32_t j,k,ha,hb;
+
+	GET_HIGH_WORD(ha,x);
+	ha &= 0x7fffffff;
+	GET_HIGH_WORD(hb,y);
+	hb &= 0x7fffffff;
+	if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
+	a = fabs(a);
+	b = fabs(b);
+	if((ha-hb)>0x3c00000) {return a+b;} /* x/y > 2**60 */
+	k=0;
+	if(ha > 0x5f300000) {	/* a>2**500 */
+	   if(ha >= 0x7ff00000) {	/* Inf or NaN */
+	       u_int32_t low;
+	       /* Use original arg order iff result is NaN; quieten sNaNs. */
+	       w = fabs(x+0.0)-fabs(y+0.0);
+	       GET_LOW_WORD(low,a);
+	       if(((ha&0xfffff)|low)==0) w = a;
+	       GET_LOW_WORD(low,b);
+	       if(((hb^0x7ff00000)|low)==0) w = b;
+	       return w;
+	   }
+	   /* scale a and b by 2**-600 */
+	   ha -= 0x25800000; hb -= 0x25800000;	k += 600;
+	   SET_HIGH_WORD(a,ha);
+	   SET_HIGH_WORD(b,hb);
+	}
+	if(hb < 0x20b00000) {	/* b < 2**-500 */
+	    if(hb <= 0x000fffff) {	/* subnormal b or 0 */
+	        u_int32_t low;
+		GET_LOW_WORD(low,b);
+		if((hb|low)==0) return a;
+		t1=0;
+		SET_HIGH_WORD(t1,0x7fd00000);	/* t1=2^1022 */
+		b *= t1;
+		a *= t1;
+		k -= 1022;
+	    } else {		/* scale a and b by 2^600 */
+	        ha += 0x25800000; 	/* a *= 2^600 */
+		hb += 0x25800000;	/* b *= 2^600 */
+		k -= 600;
+		SET_HIGH_WORD(a,ha);
+		SET_HIGH_WORD(b,hb);
+	    }
+	}
+    /* medium size a and b */
+	w = a-b;
+	if (w>b) {
+	    t1 = 0;
+	    SET_HIGH_WORD(t1,ha);
+	    t2 = a-t1;
+	    w  = sqrt(t1*t1-(b*(-b)-t2*(a+t1)));
+	} else {
+	    a  = a+a;
+	    y1 = 0;
+	    SET_HIGH_WORD(y1,hb);
+	    y2 = b - y1;
+	    t1 = 0;
+	    SET_HIGH_WORD(t1,ha+0x00100000);
+	    t2 = a - t1;
+	    w  = sqrt(t1*y1-(w*(-w)-(t1*y2+t2*b)));
+	}
+	if(k!=0) {
+	    u_int32_t high;
+	    t1 = 1.0;
+	    GET_HIGH_WORD(high,t1);
+	    SET_HIGH_WORD(t1,high+(k<<20));
+	    return t1*w;
+	} else return w;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(hypot, hypotl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_hypotf.c b/libm/upstream-freebsd/lib/msun/src/e_hypotf.c
new file mode 100644
index 0000000..6d083e4
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_hypotf.c
@@ -0,0 +1,83 @@
+/* e_hypotf.c -- float version of e_hypot.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+float
+__ieee754_hypotf(float x, float y)
+{
+	float a,b,t1,t2,y1,y2,w;
+	int32_t j,k,ha,hb;
+
+	GET_FLOAT_WORD(ha,x);
+	ha &= 0x7fffffff;
+	GET_FLOAT_WORD(hb,y);
+	hb &= 0x7fffffff;
+	if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
+	a = fabsf(a);
+	b = fabsf(b);
+	if((ha-hb)>0xf000000) {return a+b;} /* x/y > 2**30 */
+	k=0;
+	if(ha > 0x58800000) {	/* a>2**50 */
+	   if(ha >= 0x7f800000) {	/* Inf or NaN */
+	       /* Use original arg order iff result is NaN; quieten sNaNs. */
+	       w = fabsf(x+0.0F)-fabsf(y+0.0F);
+	       if(ha == 0x7f800000) w = a;
+	       if(hb == 0x7f800000) w = b;
+	       return w;
+	   }
+	   /* scale a and b by 2**-68 */
+	   ha -= 0x22000000; hb -= 0x22000000;	k += 68;
+	   SET_FLOAT_WORD(a,ha);
+	   SET_FLOAT_WORD(b,hb);
+	}
+	if(hb < 0x26800000) {	/* b < 2**-50 */
+	    if(hb <= 0x007fffff) {	/* subnormal b or 0 */
+	        if(hb==0) return a;
+		SET_FLOAT_WORD(t1,0x7e800000);	/* t1=2^126 */
+		b *= t1;
+		a *= t1;
+		k -= 126;
+	    } else {		/* scale a and b by 2^68 */
+	        ha += 0x22000000; 	/* a *= 2^68 */
+		hb += 0x22000000;	/* b *= 2^68 */
+		k -= 68;
+		SET_FLOAT_WORD(a,ha);
+		SET_FLOAT_WORD(b,hb);
+	    }
+	}
+    /* medium size a and b */
+	w = a-b;
+	if (w>b) {
+	    SET_FLOAT_WORD(t1,ha&0xfffff000);
+	    t2 = a-t1;
+	    w  = __ieee754_sqrtf(t1*t1-(b*(-b)-t2*(a+t1)));
+	} else {
+	    a  = a+a;
+	    SET_FLOAT_WORD(y1,hb&0xfffff000);
+	    y2 = b - y1;
+	    SET_FLOAT_WORD(t1,(ha+0x00800000)&0xfffff000);
+	    t2 = a - t1;
+	    w  = __ieee754_sqrtf(t1*y1-(w*(-w)-(t1*y2+t2*b)));
+	}
+	if(k!=0) {
+	    SET_FLOAT_WORD(t1,0x3f800000+(k<<23));
+	    return t1*w;
+	} else return w;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_hypotl.c b/libm/upstream-freebsd/lib/msun/src/e_hypotl.c
new file mode 100644
index 0000000..7b5ab89
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_hypotl.c
@@ -0,0 +1,124 @@
+/* From: @(#)e_hypot.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* long double version of hypot().  See e_hypot.c for most comments. */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define	GET_LDBL_MAN(h, l, v) do {	\
+	union IEEEl2bits uv;		\
+					\
+	uv.e = v;			\
+	h = uv.bits.manh;		\
+	l = uv.bits.manl;		\
+} while (0)
+
+#undef GET_HIGH_WORD
+#define	GET_HIGH_WORD(i, v)	GET_LDBL_EXPSIGN(i, v)
+#undef SET_HIGH_WORD
+#define	SET_HIGH_WORD(v, i)	SET_LDBL_EXPSIGN(v, i)
+
+#define	DESW(exp)	(exp)		/* delta expsign word */
+#define	ESW(exp)	(MAX_EXP - 1 + (exp))	/* expsign word */
+#define	MANT_DIG	LDBL_MANT_DIG
+#define	MAX_EXP		LDBL_MAX_EXP
+
+#if LDBL_MANL_SIZE > 32
+typedef	uint64_t man_t;
+#else
+typedef	uint32_t man_t;
+#endif
+
+long double
+hypotl(long double x, long double y)
+{
+	long double a=x,b=y,t1,t2,y1,y2,w;
+	int32_t j,k,ha,hb;
+
+	GET_HIGH_WORD(ha,x);
+	ha &= 0x7fff;
+	GET_HIGH_WORD(hb,y);
+	hb &= 0x7fff;
+	if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}
+	a = fabsl(a);
+	b = fabsl(b);
+	if((ha-hb)>DESW(MANT_DIG+7)) {return a+b;} /* x/y > 2**(MANT_DIG+7) */
+	k=0;
+	if(ha > ESW(MAX_EXP/2-12)) {	/* a>2**(MAX_EXP/2-12) */
+	   if(ha >= ESW(MAX_EXP)) {	/* Inf or NaN */
+	       man_t manh, manl;
+	       /* Use original arg order iff result is NaN; quieten sNaNs. */
+	       w = fabsl(x+0.0)-fabsl(y+0.0);
+	       GET_LDBL_MAN(manh,manl,a);
+	       if (manh == LDBL_NBIT && manl == 0) w = a;
+	       GET_LDBL_MAN(manh,manl,b);
+	       if (hb >= ESW(MAX_EXP) && manh == LDBL_NBIT && manl == 0) w = b;
+	       return w;
+	   }
+	   /* scale a and b by 2**-(MAX_EXP/2+88) */
+	   ha -= DESW(MAX_EXP/2+88); hb -= DESW(MAX_EXP/2+88);
+	   k += MAX_EXP/2+88;
+	   SET_HIGH_WORD(a,ha);
+	   SET_HIGH_WORD(b,hb);
+	}
+	if(hb < ESW(-(MAX_EXP/2-12))) {	/* b < 2**-(MAX_EXP/2-12) */
+	    if(hb <= 0) {		/* subnormal b or 0 */
+	        man_t manh, manl;
+		GET_LDBL_MAN(manh,manl,b);
+		if((manh|manl)==0) return a;
+		t1=0;
+		SET_HIGH_WORD(t1,ESW(MAX_EXP-2));	/* t1=2^(MAX_EXP-2) */
+		b *= t1;
+		a *= t1;
+		k -= MAX_EXP-2;
+	    } else {		/* scale a and b by 2^(MAX_EXP/2+88) */
+		ha += DESW(MAX_EXP/2+88);
+		hb += DESW(MAX_EXP/2+88);
+		k -= MAX_EXP/2+88;
+		SET_HIGH_WORD(a,ha);
+		SET_HIGH_WORD(b,hb);
+	    }
+	}
+    /* medium size a and b */
+	w = a-b;
+	if (w>b) {
+	    t1 = a;
+	    union IEEEl2bits uv;
+	    uv.e = t1; uv.bits.manl = 0; t1 = uv.e;
+	    t2 = a-t1;
+	    w  = sqrtl(t1*t1-(b*(-b)-t2*(a+t1)));
+	} else {
+	    a  = a+a;
+	    y1 = b;
+	    union IEEEl2bits uv;
+	    uv.e = y1; uv.bits.manl = 0; y1 = uv.e;
+	    y2 = b - y1;
+	    t1 = a;
+	    uv.e = t1; uv.bits.manl = 0; t1 = uv.e;
+	    t2 = a - t1;
+	    w  = sqrtl(t1*y1-(w*(-w)-(t1*y2+t2*b)));
+	}
+	if(k!=0) {
+	    u_int32_t high;
+	    t1 = 1.0;
+	    GET_HIGH_WORD(high,t1);
+	    SET_HIGH_WORD(t1,high+DESW(k));
+	    return t1*w;
+	} else return w;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j0.c b/libm/upstream-freebsd/lib/msun/src/e_j0.c
new file mode 100644
index 0000000..36e72c2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_j0.c
@@ -0,0 +1,391 @@
+
+/* @(#)e_j0.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j0.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/* __ieee754_j0(x), __ieee754_y0(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j0(x):
+ *	1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
+ *	2. Reduce x to |x| since j0(x)=j0(-x),  and
+ *	   for x in (0,2)
+ *		j0(x) = 1-z/4+ z^2*R0/S0,  where z = x*x;
+ *	   (precision:  |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
+ *	   for x in (2,inf)
+ * 		j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
+ * 	   where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *	   as follow:
+ *		cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+ *			= 1/sqrt(2) * (cos(x) + sin(x))
+ *		sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
+ *			= 1/sqrt(2) * (sin(x) - cos(x))
+ * 	   (To avoid cancellation, use
+ *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ * 	    to compute the worse one.)
+ *	   
+ *	3 Special cases
+ *		j0(nan)= nan
+ *		j0(0) = 1
+ *		j0(inf) = 0
+ *		
+ * Method -- y0(x):
+ *	1. For x<2.
+ *	   Since 
+ *		y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
+ *	   therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
+ *	   We use the following function to approximate y0,
+ *		y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
+ *	   where 
+ *		U(z) = u00 + u01*z + ... + u06*z^6
+ *		V(z) = 1  + v01*z + ... + v04*z^4
+ *	   with absolute approximation error bounded by 2**-72.
+ *	   Note: For tiny x, U/V = u0 and j0(x)~1, hence
+ *		y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
+ *	2. For x>=2.
+ * 		y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
+ * 	   where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
+ *	   by the method mentioned above.
+ *	3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static __inline double pzero(double), qzero(double);
+
+static const volatile double vone = 1, vzero = 0;
+
+static const double
+huge 	= 1e300,
+one	= 1.0,
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi      =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+ 		/* R0/S0 on [0, 2.00] */
+R02  =  1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */
+R03  = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */
+R04  =  1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */
+R05  = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */
+S01  =  1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */
+S02  =  1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */
+S03  =  5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */
+S04  =  1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */
+
+static const double zero = 0.0;
+
+double
+__ieee754_j0(double x)
+{
+	double z, s,c,ss,cc,r,u,v;
+	int32_t hx,ix;
+
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) return one/(x*x);
+	x = fabs(x);
+	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
+		s = sin(x);
+		c = cos(x);
+		ss = s-c;
+		cc = s+c;
+		if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+		    z = -cos(x+x);
+		    if ((s*c)<zero) cc = z/ss;
+		    else 	    ss = z/cc;
+		}
+	/*
+	 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+	 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+	 */
+		if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(x);
+		else {
+		    u = pzero(x); v = qzero(x);
+		    z = invsqrtpi*(u*cc-v*ss)/sqrt(x);
+		}
+		return z;
+	}
+	if(ix<0x3f200000) {	/* |x| < 2**-13 */
+	    if(huge+x>one) {	/* raise inexact if x != 0 */
+	        if(ix<0x3e400000) return one;	/* |x|<2**-27 */
+	        else 	      return one - x*x/4;
+	    }
+	}
+	z = x*x;
+	r =  z*(R02+z*(R03+z*(R04+z*R05)));
+	s =  one+z*(S01+z*(S02+z*(S03+z*S04)));
+	if(ix < 0x3FF00000) {	/* |x| < 1.00 */
+	    return one + z*(-0.25+(r/s));
+	} else {
+	    u = 0.5*x;
+	    return((one+u)*(one-u)+z*(r/s));
+	}
+}
+
+static const double
+u00  = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */
+u01  =  1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */
+u02  = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */
+u03  =  3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */
+u04  = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */
+u05  =  1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */
+u06  = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */
+v01  =  1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */
+v02  =  7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */
+v03  =  2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */
+v04  =  4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */
+
+double
+__ieee754_y0(double x)
+{
+	double z, s,c,ss,cc,u,v;
+	int32_t hx,ix,lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+        ix = 0x7fffffff&hx;
+	/*
+	 * y0(NaN) = NaN.
+	 * y0(Inf) = 0.
+	 * y0(-Inf) = NaN and raise invalid exception.
+	 */
+	if(ix>=0x7ff00000) return vone/(x+x*x); 
+	/* y0(+-0) = -inf and raise divide-by-zero exception. */
+	if((ix|lx)==0) return -one/vzero;
+	/* y0(x<0) = NaN and raise invalid exception. */
+	if(hx<0) return vzero/vzero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+        /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
+         * where x0 = x-pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+         *                      =  1/sqrt(2) * (sin(x) + cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                s = sin(x);
+                c = cos(x);
+                ss = s-c;
+                cc = s+c;
+	/*
+	 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+	 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+	 */
+                if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+                    z = -cos(x+x);
+                    if ((s*c)<zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x);
+                else {
+                    u = pzero(x); v = qzero(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+	}
+	if(ix<=0x3e400000) {	/* x < 2**-27 */
+	    return(u00 + tpi*__ieee754_log(x));
+	}
+	z = x*x;
+	u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+	v = one+z*(v01+z*(v02+z*(v03+z*v04)));
+	return(u/v + tpi*(__ieee754_j0(x)*__ieee754_log(x)));
+}
+
+/* The asymptotic expansions of pzero is
+ *	1 - 9/128 s^2 + 11025/98304 s^4 - ...,	where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ * 	pzero(x) = 1 + (R/S)
+ * where  R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ * 	  S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ *	| pzero(x)-1-R/S | <= 2  ** ( -60.26)
+ */
+static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */
+ -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */
+ -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */
+ -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */
+ -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */
+};
+static const double pS8[5] = {
+  1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */
+  3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */
+  4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */
+  1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */
+  4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */
+};
+
+static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */
+ -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */
+ -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */
+ -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */
+ -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */
+ -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */
+};
+static const double pS5[5] = {
+  6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */
+  1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */
+  5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */
+  9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */
+  2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */
+};
+
+static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */
+ -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */
+ -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */
+ -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */
+ -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */
+ -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */
+};
+static const double pS3[5] = {
+  3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */
+  3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */
+  1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */
+  1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */
+  1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */
+};
+
+static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */
+ -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */
+ -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */
+ -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */
+ -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */
+ -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */
+};
+static const double pS2[5] = {
+  2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */
+  1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */
+  2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */
+  1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */
+  1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
+};
+
+static __inline double
+pzero(double x)
+{
+	const double *p,*q;
+	double z,r,s;
+	int32_t ix;
+	GET_HIGH_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x40200000)     {p = pR8; q= pS8;}
+	else if(ix>=0x40122E8B){p = pR5; q= pS5;}
+	else if(ix>=0x4006DB6D){p = pR3; q= pS3;}
+	else                   {p = pR2; q= pS2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+	return one+ r/s;
+}
+		
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ *	-1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ * 	qzero(x) = s*(-1.25 + (R/S))
+ * where  R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ * 	  S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ *	| qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
+ */
+static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+  7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */
+  1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */
+  5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */
+  8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */
+  3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */
+};
+static const double qS8[6] = {
+  1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */
+  8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */
+  1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */
+  8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */
+  8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */
+ -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */
+};
+
+static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */
+  7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */
+  5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */
+  1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */
+  1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */
+  1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */
+};
+static const double qS5[6] = {
+  8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */
+  2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */
+  1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */
+  5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */
+  3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */
+ -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */
+};
+
+static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */
+  7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */
+  3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */
+  4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */
+  1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */
+  1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */
+};
+static const double qS3[6] = {
+  4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */
+  7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */
+  3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */
+  6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */
+  2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */
+ -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */
+};
+
+static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */
+  7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */
+  1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */
+  1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */
+  3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */
+  1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */
+};
+static const double qS2[6] = {
+  3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */
+  2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */
+  8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */
+  8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */
+  2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */
+ -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
+};
+
+static __inline double
+qzero(double x)
+{
+	const double *p,*q;
+	double s,r,z;
+	int32_t ix;
+	GET_HIGH_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x40200000)     {p = qR8; q= qS8;}
+	else if(ix>=0x40122E8B){p = qR5; q= qS5;}
+	else if(ix>=0x4006DB6D){p = qR3; q= qS3;}
+	else                   {p = qR2; q= qS2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+	return (-.125 + r/s)/x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j0f.c b/libm/upstream-freebsd/lib/msun/src/e_j0f.c
new file mode 100644
index 0000000..e53b218
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_j0f.c
@@ -0,0 +1,344 @@
+/* e_j0f.c -- float version of e_j0.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j0f.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/*
+ * See e_j0.c for complete comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static __inline float pzerof(float), qzerof(float);
+
+static const volatile float vone = 1,  vzero = 0;
+
+static const float
+huge 	= 1e30,
+one	= 1.0,
+invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
+tpi      =  6.3661974669e-01, /* 0x3f22f983 */
+ 		/* R0/S0 on [0, 2.00] */
+R02  =  1.5625000000e-02, /* 0x3c800000 */
+R03  = -1.8997929874e-04, /* 0xb947352e */
+R04  =  1.8295404516e-06, /* 0x35f58e88 */
+R05  = -4.6183270541e-09, /* 0xb19eaf3c */
+S01  =  1.5619102865e-02, /* 0x3c7fe744 */
+S02  =  1.1692678527e-04, /* 0x38f53697 */
+S03  =  5.1354652442e-07, /* 0x3509daa6 */
+S04  =  1.1661400734e-09; /* 0x30a045e8 */
+
+static const float zero = 0.0;
+
+float
+__ieee754_j0f(float x)
+{
+	float z, s,c,ss,cc,r,u,v;
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) return one/(x*x);
+	x = fabsf(x);
+	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
+		s = sinf(x);
+		c = cosf(x);
+		ss = s-c;
+		cc = s+c;
+		if(ix<0x7f000000) {  /* make sure x+x not overflow */
+		    z = -cosf(x+x);
+		    if ((s*c)<zero) cc = z/ss;
+		    else 	    ss = z/cc;
+		}
+	/*
+	 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+	 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+	 */
+		if(ix>0x58000000) z = (invsqrtpi*cc)/sqrtf(x); /* |x|>2**49 */
+		else {
+		    u = pzerof(x); v = qzerof(x);
+		    z = invsqrtpi*(u*cc-v*ss)/sqrtf(x);
+		}
+		return z;
+	}
+	if(ix<0x3b000000) {	/* |x| < 2**-9 */
+	    if(huge+x>one) {	/* raise inexact if x != 0 */
+	        if(ix<0x39800000) return one;	/* |x|<2**-12 */
+	        else 	      return one - x*x/4;
+	    }
+	}
+	z = x*x;
+	r =  z*(R02+z*(R03+z*(R04+z*R05)));
+	s =  one+z*(S01+z*(S02+z*(S03+z*S04)));
+	if(ix < 0x3F800000) {	/* |x| < 1.00 */
+	    return one + z*((float)-0.25+(r/s));
+	} else {
+	    u = (float)0.5*x;
+	    return((one+u)*(one-u)+z*(r/s));
+	}
+}
+
+static const float
+u00  = -7.3804296553e-02, /* 0xbd9726b5 */
+u01  =  1.7666645348e-01, /* 0x3e34e80d */
+u02  = -1.3818567619e-02, /* 0xbc626746 */
+u03  =  3.4745343146e-04, /* 0x39b62a69 */
+u04  = -3.8140706238e-06, /* 0xb67ff53c */
+u05  =  1.9559013964e-08, /* 0x32a802ba */
+u06  = -3.9820518410e-11, /* 0xae2f21eb */
+v01  =  1.2730483897e-02, /* 0x3c509385 */
+v02  =  7.6006865129e-05, /* 0x389f65e0 */
+v03  =  2.5915085189e-07, /* 0x348b216c */
+v04  =  4.4111031494e-10; /* 0x2ff280c2 */
+
+float
+__ieee754_y0f(float x)
+{
+	float z, s,c,ss,cc,u,v;
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+        ix = 0x7fffffff&hx;
+	if(ix>=0x7f800000) return  vone/(x+x*x);
+	if(ix==0) return -one/vzero;
+	if(hx<0) return vzero/vzero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+        /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
+         * where x0 = x-pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
+         *                      =  1/sqrt(2) * (sin(x) + cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                s = sinf(x);
+                c = cosf(x);
+                ss = s-c;
+                cc = s+c;
+	/*
+	 * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
+	 * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
+	 */
+                if(ix<0x7f000000) {  /* make sure x+x not overflow */
+                    z = -cosf(x+x);
+                    if ((s*c)<zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+                if(ix>0x58000000) z = (invsqrtpi*ss)/sqrtf(x); /* |x|>2**49 */
+                else {
+                    u = pzerof(x); v = qzerof(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
+                }
+                return z;
+	}
+	if(ix<=0x39000000) {	/* x < 2**-13 */
+	    return(u00 + tpi*__ieee754_logf(x));
+	}
+	z = x*x;
+	u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06)))));
+	v = one+z*(v01+z*(v02+z*(v03+z*v04)));
+	return(u/v + tpi*(__ieee754_j0f(x)*__ieee754_logf(x)));
+}
+
+/* The asymptotic expansions of pzero is
+ *	1 - 9/128 s^2 + 11025/98304 s^4 - ...,	where s = 1/x.
+ * For x >= 2, We approximate pzero by
+ * 	pzero(x) = 1 + (R/S)
+ * where  R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
+ * 	  S = 1 + pS0*s^2 + ... + pS4*s^10
+ * and
+ *	| pzero(x)-1-R/S | <= 2  ** ( -60.26)
+ */
+static const float pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+ -7.0312500000e-02, /* 0xbd900000 */
+ -8.0816707611e+00, /* 0xc1014e86 */
+ -2.5706311035e+02, /* 0xc3808814 */
+ -2.4852163086e+03, /* 0xc51b5376 */
+ -5.2530439453e+03, /* 0xc5a4285a */
+};
+static const float pS8[5] = {
+  1.1653436279e+02, /* 0x42e91198 */
+  3.8337448730e+03, /* 0x456f9beb */
+  4.0597855469e+04, /* 0x471e95db */
+  1.1675296875e+05, /* 0x47e4087c */
+  4.7627726562e+04, /* 0x473a0bba */
+};
+static const float pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -1.1412546255e-11, /* 0xad48c58a */
+ -7.0312492549e-02, /* 0xbd8fffff */
+ -4.1596107483e+00, /* 0xc0851b88 */
+ -6.7674766541e+01, /* 0xc287597b */
+ -3.3123129272e+02, /* 0xc3a59d9b */
+ -3.4643338013e+02, /* 0xc3ad3779 */
+};
+static const float pS5[5] = {
+  6.0753936768e+01, /* 0x42730408 */
+  1.0512523193e+03, /* 0x44836813 */
+  5.9789707031e+03, /* 0x45bad7c4 */
+  9.6254453125e+03, /* 0x461665c8 */
+  2.4060581055e+03, /* 0x451660ee */
+};
+
+static const float pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+ -2.5470459075e-09, /* 0xb12f081b */
+ -7.0311963558e-02, /* 0xbd8fffb8 */
+ -2.4090321064e+00, /* 0xc01a2d95 */
+ -2.1965976715e+01, /* 0xc1afba52 */
+ -5.8079170227e+01, /* 0xc2685112 */
+ -3.1447946548e+01, /* 0xc1fb9565 */
+};
+static const float pS3[5] = {
+  3.5856033325e+01, /* 0x420f6c94 */
+  3.6151397705e+02, /* 0x43b4c1ca */
+  1.1936077881e+03, /* 0x44953373 */
+  1.1279968262e+03, /* 0x448cffe6 */
+  1.7358093262e+02, /* 0x432d94b8 */
+};
+
+static const float pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -8.8753431271e-08, /* 0xb3be98b7 */
+ -7.0303097367e-02, /* 0xbd8ffb12 */
+ -1.4507384300e+00, /* 0xbfb9b1cc */
+ -7.6356959343e+00, /* 0xc0f4579f */
+ -1.1193166733e+01, /* 0xc1331736 */
+ -3.2336456776e+00, /* 0xc04ef40d */
+};
+static const float pS2[5] = {
+  2.2220300674e+01, /* 0x41b1c32d */
+  1.3620678711e+02, /* 0x430834f0 */
+  2.7047027588e+02, /* 0x43873c32 */
+  1.5387539673e+02, /* 0x4319e01a */
+  1.4657617569e+01, /* 0x416a859a */
+};
+
+static __inline float
+pzerof(float x)
+{
+	const float *p,*q;
+	float z,r,s;
+	int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x41000000)     {p = pR8; q= pS8;}
+	else if(ix>=0x409173eb){p = pR5; q= pS5;}
+	else if(ix>=0x4036d917){p = pR3; q= pS3;}
+	else                   {p = pR2; q= pS2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+	return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qzero is
+ *	-1/8 s + 75/1024 s^3 - ..., where s = 1/x.
+ * We approximate pzero by
+ * 	qzero(x) = s*(-1.25 + (R/S))
+ * where  R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
+ * 	  S = 1 + qS0*s^2 + ... + qS5*s^12
+ * and
+ *	| qzero(x)/s +1.25-R/S | <= 2  ** ( -61.22)
+ */
+static const float qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+  7.3242187500e-02, /* 0x3d960000 */
+  1.1768206596e+01, /* 0x413c4a93 */
+  5.5767340088e+02, /* 0x440b6b19 */
+  8.8591972656e+03, /* 0x460a6cca */
+  3.7014625000e+04, /* 0x471096a0 */
+};
+static const float qS8[6] = {
+  1.6377603149e+02, /* 0x4323c6aa */
+  8.0983447266e+03, /* 0x45fd12c2 */
+  1.4253829688e+05, /* 0x480b3293 */
+  8.0330925000e+05, /* 0x49441ed4 */
+  8.4050156250e+05, /* 0x494d3359 */
+ -3.4389928125e+05, /* 0xc8a7eb69 */
+};
+
+static const float qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.8408595828e-11, /* 0x2da1ec79 */
+  7.3242180049e-02, /* 0x3d95ffff */
+  5.8356351852e+00, /* 0x40babd86 */
+  1.3511157227e+02, /* 0x43071c90 */
+  1.0272437744e+03, /* 0x448067cd */
+  1.9899779053e+03, /* 0x44f8bf4b */
+};
+static const float qS5[6] = {
+  8.2776611328e+01, /* 0x42a58da0 */
+  2.0778142090e+03, /* 0x4501dd07 */
+  1.8847289062e+04, /* 0x46933e94 */
+  5.6751113281e+04, /* 0x475daf1d */
+  3.5976753906e+04, /* 0x470c88c1 */
+ -5.3543427734e+03, /* 0xc5a752be */
+};
+
+static const float qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
+  4.3774099900e-09, /* 0x3196681b */
+  7.3241114616e-02, /* 0x3d95ff70 */
+  3.3442313671e+00, /* 0x405607e3 */
+  4.2621845245e+01, /* 0x422a7cc5 */
+  1.7080809021e+02, /* 0x432acedf */
+  1.6673394775e+02, /* 0x4326bbe4 */
+};
+static const float qS3[6] = {
+  4.8758872986e+01, /* 0x42430916 */
+  7.0968920898e+02, /* 0x44316c1c */
+  3.7041481934e+03, /* 0x4567825f */
+  6.4604252930e+03, /* 0x45c9e367 */
+  2.5163337402e+03, /* 0x451d4557 */
+ -1.4924745178e+02, /* 0xc3153f59 */
+};
+
+static const float qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.5044444979e-07, /* 0x342189db */
+  7.3223426938e-02, /* 0x3d95f62a */
+  1.9981917143e+00, /* 0x3fffc4bf */
+  1.4495602608e+01, /* 0x4167edfd */
+  3.1666231155e+01, /* 0x41fd5471 */
+  1.6252708435e+01, /* 0x4182058c */
+};
+static const float qS2[6] = {
+  3.0365585327e+01, /* 0x41f2ecb8 */
+  2.6934811401e+02, /* 0x4386ac8f */
+  8.4478375244e+02, /* 0x44533229 */
+  8.8293585205e+02, /* 0x445cbbe5 */
+  2.1266638184e+02, /* 0x4354aa98 */
+ -5.3109550476e+00, /* 0xc0a9f358 */
+};
+
+static __inline float
+qzerof(float x)
+{
+	const float *p,*q;
+	float s,r,z;
+	int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x41000000)     {p = qR8; q= qS8;}
+	else if(ix>=0x409173eb){p = qR5; q= qS5;}
+	else if(ix>=0x4036d917){p = qR3; q= qS3;}
+	else                   {p = qR2; q= qS2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+	return (-(float).125 + r/s)/x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j1.c b/libm/upstream-freebsd/lib/msun/src/e_j1.c
new file mode 100644
index 0000000..b11ac2d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_j1.c
@@ -0,0 +1,386 @@
+
+/* @(#)e_j1.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j1.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/* __ieee754_j1(x), __ieee754_y1(x)
+ * Bessel function of the first and second kinds of order zero.
+ * Method -- j1(x):
+ *	1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
+ *	2. Reduce x to |x| since j1(x)=-j1(-x),  and
+ *	   for x in (0,2)
+ *		j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
+ *	   (precision:  |j1/x - 1/2 - R0/S0 |<2**-61.51 )
+ *	   for x in (2,inf)
+ * 		j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
+ * 		y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ * 	   where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *	   as follow:
+ *		cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+ *			=  1/sqrt(2) * (sin(x) - cos(x))
+ *		sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+ *			= -1/sqrt(2) * (sin(x) + cos(x))
+ * 	   (To avoid cancellation, use
+ *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ * 	    to compute the worse one.)
+ *	   
+ *	3 Special cases
+ *		j1(nan)= nan
+ *		j1(0) = 0
+ *		j1(inf) = 0
+ *		
+ * Method -- y1(x):
+ *	1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN 
+ *	2. For x<2.
+ *	   Since 
+ *		y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
+ *	   therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
+ *	   We use the following function to approximate y1,
+ *		y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
+ *	   where for x in [0,2] (abs err less than 2**-65.89)
+ *		U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
+ *		V(z) = 1  + v0[0]*z + ... + v0[4]*z^5
+ *	   Note: For tiny x, 1/x dominate y1 and hence
+ *		y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
+ *	3. For x>=2.
+ * 		y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
+ * 	   where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
+ *	   by method mentioned above.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static __inline double pone(double), qone(double);
+
+static const volatile double vone = 1, vzero = 0;
+
+static const double
+huge    = 1e300,
+one	= 1.0,
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+tpi      =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+	/* R0/S0 on [0,2] */
+r00  = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */
+r01  =  1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */
+r02  = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */
+r03  =  4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */
+s01  =  1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */
+s02  =  1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */
+s03  =  1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */
+s04  =  5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */
+s05  =  1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */
+
+static const double zero    = 0.0;
+
+double
+__ieee754_j1(double x)
+{
+	double z, s,c,ss,cc,r,u,v,y;
+	int32_t hx,ix;
+
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) return one/x;
+	y = fabs(x);
+	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
+		s = sin(y);
+		c = cos(y);
+		ss = -s-c;
+		cc = s-c;
+		if(ix<0x7fe00000) {  /* make sure y+y not overflow */
+		    z = cos(y+y);
+		    if ((s*c)>zero) cc = z/ss;
+		    else 	    ss = z/cc;
+		}
+	/*
+	 * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
+	 * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
+	 */
+		if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(y);
+		else {
+		    u = pone(y); v = qone(y);
+		    z = invsqrtpi*(u*cc-v*ss)/sqrt(y);
+		}
+		if(hx<0) return -z;
+		else  	 return  z;
+	}
+	if(ix<0x3e400000) {	/* |x|<2**-27 */
+	    if(huge+x>one) return 0.5*x;/* inexact if x!=0 necessary */
+	}
+	z = x*x;
+	r =  z*(r00+z*(r01+z*(r02+z*r03)));
+	s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+	r *= x;
+	return(x*0.5+r/s);
+}
+
+static const double U0[5] = {
+ -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */
+  5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */
+ -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */
+  2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */
+ -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */
+};
+static const double V0[5] = {
+  1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */
+  2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */
+  1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */
+  6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */
+  1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */
+};
+
+double
+__ieee754_y1(double x)
+{
+	double z, s,c,ss,cc,u,v;
+	int32_t hx,ix,lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+        ix = 0x7fffffff&hx;
+	/*
+	 * y1(NaN) = NaN.
+	 * y1(Inf) = 0.
+	 * y1(-Inf) = NaN and raise invalid exception.
+	 */
+	if(ix>=0x7ff00000) return  vone/(x+x*x); 
+	/* y1(+-0) = -inf and raise divide-by-zero exception. */
+        if((ix|lx)==0) return -one/vzero;
+	/* y1(x<0) = NaN and raise invalid exception. */
+        if(hx<0) return vzero/vzero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+                s = sin(x);
+                c = cos(x);
+                ss = -s-c;
+                cc = s-c;
+                if(ix<0x7fe00000) {  /* make sure x+x not overflow */
+                    z = cos(x+x);
+                    if ((s*c)>zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
+         * where x0 = x-3pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      = -1/sqrt(2) * (cos(x) + sin(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x);
+                else {
+                    u = pone(x); v = qone(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrt(x);
+                }
+                return z;
+        } 
+        if(ix<=0x3c900000) {    /* x < 2**-54 */
+            return(-tpi/x);
+        } 
+        z = x*x;
+        u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+        v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+        return(x*(u/v) + tpi*(__ieee754_j1(x)*__ieee754_log(x)-one/x));
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ *	1 + 15/128 s^2 - 4725/2^15 s^4 - ...,	where s = 1/x.
+ * We approximate pone by
+ * 	pone(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ * 	  S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *	| pone(x)-1-R/S | <= 2  ** ( -60.06)
+ */
+
+static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+  1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */
+  1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */
+  4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */
+  3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */
+  7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */
+};
+static const double ps8[5] = {
+  1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */
+  3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */
+  3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */
+  9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */
+  3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */
+};
+
+static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */
+  1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */
+  6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */
+  1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */
+  5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */
+  5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */
+};
+static const double ps5[5] = {
+  5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */
+  9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */
+  5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */
+  7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */
+  1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */
+};
+
+static const double pr3[6] = {
+  3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */
+  1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */
+  3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */
+  3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */
+  9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */
+  4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */
+};
+static const double ps3[5] = {
+  3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */
+  3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */
+  1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */
+  8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */
+  1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */
+};
+
+static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */
+  1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */
+  2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */
+  1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */
+  1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */
+  5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */
+};
+static const double ps2[5] = {
+  2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */
+  1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */
+  2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */
+  1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */
+  8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
+};
+
+static __inline double
+pone(double x)
+{
+	const double *p,*q;
+	double z,r,s;
+        int32_t ix;
+	GET_HIGH_WORD(ix,x);
+	ix &= 0x7fffffff;
+        if(ix>=0x40200000)     {p = pr8; q= ps8;}
+        else if(ix>=0x40122E8B){p = pr5; q= ps5;}
+        else if(ix>=0x4006DB6D){p = pr3; q= ps3;}
+	else                   {p = pr2; q= ps2;}	/* ix>=0x40000000 */
+        z = one/(x*x);
+        r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+        s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+        return one+ r/s;
+}
+		
+
+/* For x >= 8, the asymptotic expansions of qone is
+ *	3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ * 	qone(x) = s*(0.375 + (R/S))
+ * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ * 	  S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ *	| qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
+ */
+
+static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+ -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */
+ -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */
+ -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */
+ -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */
+ -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */
+};
+static const double qs8[6] = {
+  1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */
+  7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */
+  1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */
+  7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */
+  6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */
+ -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */
+};
+
+static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */
+ -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */
+ -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */
+ -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */
+ -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */
+ -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */
+};
+static const double qs5[6] = {
+  8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */
+  1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */
+  1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */
+  4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */
+  2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */
+ -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */
+};
+
+static const double qr3[6] = {
+ -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */
+ -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */
+ -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */
+ -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */
+ -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */
+ -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */
+};
+static const double qs3[6] = {
+  4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */
+  6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */
+  3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */
+  5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */
+  1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */
+ -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */
+};
+
+static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */
+ -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */
+ -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */
+ -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */
+ -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */
+ -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */
+};
+static const double qs2[6] = {
+  2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */
+  2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */
+  7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */
+  7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */
+  1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */
+ -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
+};
+
+static __inline double
+qone(double x)
+{
+	const double *p,*q;
+	double  s,r,z;
+	int32_t ix;
+	GET_HIGH_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x40200000)     {p = qr8; q= qs8;}
+	else if(ix>=0x40122E8B){p = qr5; q= qs5;}
+	else if(ix>=0x4006DB6D){p = qr3; q= qs3;}
+	else                   {p = qr2; q= qs2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+	return (.375 + r/s)/x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j1f.c b/libm/upstream-freebsd/lib/msun/src/e_j1f.c
new file mode 100644
index 0000000..0cca823
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_j1f.c
@@ -0,0 +1,340 @@
+/* e_j1f.c -- float version of e_j1.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j1f.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/*
+ * See e_j1.c for complete comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static __inline float ponef(float), qonef(float);
+
+static const volatile float vone = 1, vzero = 0;
+
+static const float
+huge    = 1e30,
+one	= 1.0,
+invsqrtpi=  5.6418961287e-01, /* 0x3f106ebb */
+tpi      =  6.3661974669e-01, /* 0x3f22f983 */
+	/* R0/S0 on [0,2] */
+r00  = -6.2500000000e-02, /* 0xbd800000 */
+r01  =  1.4070566976e-03, /* 0x3ab86cfd */
+r02  = -1.5995563444e-05, /* 0xb7862e36 */
+r03  =  4.9672799207e-08, /* 0x335557d2 */
+s01  =  1.9153760746e-02, /* 0x3c9ce859 */
+s02  =  1.8594678841e-04, /* 0x3942fab6 */
+s03  =  1.1771846857e-06, /* 0x359dffc2 */
+s04  =  5.0463624390e-09, /* 0x31ad6446 */
+s05  =  1.2354227016e-11; /* 0x2d59567e */
+
+static const float zero    = 0.0;
+
+float
+__ieee754_j1f(float x)
+{
+	float z, s,c,ss,cc,r,u,v,y;
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) return one/x;
+	y = fabsf(x);
+	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
+		s = sinf(y);
+		c = cosf(y);
+		ss = -s-c;
+		cc = s-c;
+		if(ix<0x7f000000) {  /* make sure y+y not overflow */
+		    z = cosf(y+y);
+		    if ((s*c)>zero) cc = z/ss;
+		    else 	    ss = z/cc;
+		}
+	/*
+	 * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
+	 * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
+	 */
+		if(ix>0x58000000) z = (invsqrtpi*cc)/sqrtf(y); /* |x|>2**49 */
+		else {
+		    u = ponef(y); v = qonef(y);
+		    z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
+		}
+		if(hx<0) return -z;
+		else  	 return  z;
+	}
+	if(ix<0x39000000) {	/* |x|<2**-13 */
+	    if(huge+x>one) return (float)0.5*x;/* inexact if x!=0 necessary */
+	}
+	z = x*x;
+	r =  z*(r00+z*(r01+z*(r02+z*r03)));
+	s =  one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05))));
+	r *= x;
+	return(x*(float)0.5+r/s);
+}
+
+static const float U0[5] = {
+ -1.9605709612e-01, /* 0xbe48c331 */
+  5.0443872809e-02, /* 0x3d4e9e3c */
+ -1.9125689287e-03, /* 0xbafaaf2a */
+  2.3525259166e-05, /* 0x37c5581c */
+ -9.1909917899e-08, /* 0xb3c56003 */
+};
+static const float V0[5] = {
+  1.9916731864e-02, /* 0x3ca3286a */
+  2.0255257550e-04, /* 0x3954644b */
+  1.3560879779e-06, /* 0x35b602d4 */
+  6.2274145840e-09, /* 0x31d5f8eb */
+  1.6655924903e-11, /* 0x2d9281cf */
+};
+
+float
+__ieee754_y1f(float x)
+{
+	float z, s,c,ss,cc,u,v;
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+        ix = 0x7fffffff&hx;
+	if(ix>=0x7f800000) return  vone/(x+x*x);
+	if(ix==0) return -one/vzero;
+	if(hx<0) return vzero/vzero;
+        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
+                s = sinf(x);
+                c = cosf(x);
+                ss = -s-c;
+                cc = s-c;
+                if(ix<0x7f000000) {  /* make sure x+x not overflow */
+                    z = cosf(x+x);
+                    if ((s*c)>zero) cc = z/ss;
+                    else            ss = z/cc;
+                }
+        /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
+         * where x0 = x-3pi/4
+         *      Better formula:
+         *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
+         *                      =  1/sqrt(2) * (sin(x) - cos(x))
+         *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
+         *                      = -1/sqrt(2) * (cos(x) + sin(x))
+         * To avoid cancellation, use
+         *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+         * to compute the worse one.
+         */
+                if(ix>0x58000000) z = (invsqrtpi*ss)/sqrtf(x); /* |x|>2**49 */
+                else {
+                    u = ponef(x); v = qonef(x);
+                    z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
+                }
+                return z;
+        }
+        if(ix<=0x33000000) {    /* x < 2**-25 */
+            return(-tpi/x);
+        }
+        z = x*x;
+        u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4])));
+        v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4]))));
+        return(x*(u/v) + tpi*(__ieee754_j1f(x)*__ieee754_logf(x)-one/x));
+}
+
+/* For x >= 8, the asymptotic expansions of pone is
+ *	1 + 15/128 s^2 - 4725/2^15 s^4 - ...,	where s = 1/x.
+ * We approximate pone by
+ * 	pone(x) = 1 + (R/S)
+ * where  R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
+ * 	  S = 1 + ps0*s^2 + ... + ps4*s^10
+ * and
+ *	| pone(x)-1-R/S | <= 2  ** ( -60.06)
+ */
+
+static const float pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+  1.1718750000e-01, /* 0x3df00000 */
+  1.3239480972e+01, /* 0x4153d4ea */
+  4.1205184937e+02, /* 0x43ce06a3 */
+  3.8747453613e+03, /* 0x45722bed */
+  7.9144794922e+03, /* 0x45f753d6 */
+};
+static const float ps8[5] = {
+  1.1420736694e+02, /* 0x42e46a2c */
+  3.6509309082e+03, /* 0x45642ee5 */
+  3.6956207031e+04, /* 0x47105c35 */
+  9.7602796875e+04, /* 0x47bea166 */
+  3.0804271484e+04, /* 0x46f0a88b */
+};
+
+static const float pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+  1.3199052094e-11, /* 0x2d68333f */
+  1.1718749255e-01, /* 0x3defffff */
+  6.8027510643e+00, /* 0x40d9b023 */
+  1.0830818176e+02, /* 0x42d89dca */
+  5.1763616943e+02, /* 0x440168b7 */
+  5.2871520996e+02, /* 0x44042dc6 */
+};
+static const float ps5[5] = {
+  5.9280597687e+01, /* 0x426d1f55 */
+  9.9140142822e+02, /* 0x4477d9b1 */
+  5.3532670898e+03, /* 0x45a74a23 */
+  7.8446904297e+03, /* 0x45f52586 */
+  1.5040468750e+03, /* 0x44bc0180 */
+};
+
+static const float pr3[6] = {
+  3.0250391081e-09, /* 0x314fe10d */
+  1.1718686670e-01, /* 0x3defffab */
+  3.9329774380e+00, /* 0x407bb5e7 */
+  3.5119403839e+01, /* 0x420c7a45 */
+  9.1055007935e+01, /* 0x42b61c2a */
+  4.8559066772e+01, /* 0x42423c7c */
+};
+static const float ps3[5] = {
+  3.4791309357e+01, /* 0x420b2a4d */
+  3.3676245117e+02, /* 0x43a86198 */
+  1.0468714600e+03, /* 0x4482dbe3 */
+  8.9081134033e+02, /* 0x445eb3ed */
+  1.0378793335e+02, /* 0x42cf936c */
+};
+
+static const float pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+  1.0771083225e-07, /* 0x33e74ea8 */
+  1.1717621982e-01, /* 0x3deffa16 */
+  2.3685150146e+00, /* 0x401795c0 */
+  1.2242610931e+01, /* 0x4143e1bc */
+  1.7693971634e+01, /* 0x418d8d41 */
+  5.0735230446e+00, /* 0x40a25a4d */
+};
+static const float ps2[5] = {
+  2.1436485291e+01, /* 0x41ab7dec */
+  1.2529022980e+02, /* 0x42fa9499 */
+  2.3227647400e+02, /* 0x436846c7 */
+  1.1767937469e+02, /* 0x42eb5bd7 */
+  8.3646392822e+00, /* 0x4105d590 */
+};
+
+static __inline float
+ponef(float x)
+{
+	const float *p,*q;
+	float z,r,s;
+        int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;
+        if(ix>=0x41000000)     {p = pr8; q= ps8;}
+        else if(ix>=0x409173eb){p = pr5; q= ps5;}
+        else if(ix>=0x4036d917){p = pr3; q= ps3;}
+	else                   {p = pr2; q= ps2;}	/* ix>=0x40000000 */
+        z = one/(x*x);
+        r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+        s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
+        return one+ r/s;
+}
+
+
+/* For x >= 8, the asymptotic expansions of qone is
+ *	3/8 s - 105/1024 s^3 - ..., where s = 1/x.
+ * We approximate pone by
+ * 	qone(x) = s*(0.375 + (R/S))
+ * where  R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
+ * 	  S = 1 + qs1*s^2 + ... + qs6*s^12
+ * and
+ *	| qone(x)/s -0.375-R/S | <= 2  ** ( -61.13)
+ */
+
+static const float qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */
+  0.0000000000e+00, /* 0x00000000 */
+ -1.0253906250e-01, /* 0xbdd20000 */
+ -1.6271753311e+01, /* 0xc1822c8d */
+ -7.5960174561e+02, /* 0xc43de683 */
+ -1.1849806641e+04, /* 0xc639273a */
+ -4.8438511719e+04, /* 0xc73d3683 */
+};
+static const float qs8[6] = {
+  1.6139537048e+02, /* 0x43216537 */
+  7.8253862305e+03, /* 0x45f48b17 */
+  1.3387534375e+05, /* 0x4802bcd6 */
+  7.1965775000e+05, /* 0x492fb29c */
+  6.6660125000e+05, /* 0x4922be94 */
+ -2.9449025000e+05, /* 0xc88fcb48 */
+};
+
+static const float qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */
+ -2.0897993405e-11, /* 0xadb7d219 */
+ -1.0253904760e-01, /* 0xbdd1fffe */
+ -8.0564479828e+00, /* 0xc100e736 */
+ -1.8366960144e+02, /* 0xc337ab6b */
+ -1.3731937256e+03, /* 0xc4aba633 */
+ -2.6124443359e+03, /* 0xc523471c */
+};
+static const float qs5[6] = {
+  8.1276550293e+01, /* 0x42a28d98 */
+  1.9917987061e+03, /* 0x44f8f98f */
+  1.7468484375e+04, /* 0x468878f8 */
+  4.9851425781e+04, /* 0x4742bb6d */
+  2.7948074219e+04, /* 0x46da5826 */
+ -4.7191835938e+03, /* 0xc5937978 */
+};
+
+static const float qr3[6] = {
+ -5.0783124372e-09, /* 0xb1ae7d4f */
+ -1.0253783315e-01, /* 0xbdd1ff5b */
+ -4.6101160049e+00, /* 0xc0938612 */
+ -5.7847221375e+01, /* 0xc267638e */
+ -2.2824453735e+02, /* 0xc3643e9a */
+ -2.1921012878e+02, /* 0xc35b35cb */
+};
+static const float qs3[6] = {
+  4.7665153503e+01, /* 0x423ea91e */
+  6.7386511230e+02, /* 0x4428775e */
+  3.3801528320e+03, /* 0x45534272 */
+  5.5477290039e+03, /* 0x45ad5dd5 */
+  1.9031191406e+03, /* 0x44ede3d0 */
+ -1.3520118713e+02, /* 0xc3073381 */
+};
+
+static const float qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */
+ -1.7838172539e-07, /* 0xb43f8932 */
+ -1.0251704603e-01, /* 0xbdd1f475 */
+ -2.7522056103e+00, /* 0xc0302423 */
+ -1.9663616180e+01, /* 0xc19d4f16 */
+ -4.2325313568e+01, /* 0xc2294d1f */
+ -2.1371921539e+01, /* 0xc1aaf9b2 */
+};
+static const float qs2[6] = {
+  2.9533363342e+01, /* 0x41ec4454 */
+  2.5298155212e+02, /* 0x437cfb47 */
+  7.5750280762e+02, /* 0x443d602e */
+  7.3939318848e+02, /* 0x4438d92a */
+  1.5594900513e+02, /* 0x431bf2f2 */
+ -4.9594988823e+00, /* 0xc09eb437 */
+};
+
+static __inline float
+qonef(float x)
+{
+	const float *p,*q;
+	float  s,r,z;
+	int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;
+	if(ix>=0x41000000)     {p = qr8; q= qs8;}
+	else if(ix>=0x409173eb){p = qr5; q= qs5;}
+	else if(ix>=0x4036d917){p = qr3; q= qs3;}
+	else                   {p = qr2; q= qs2;}	/* ix>=0x40000000 */
+	z = one/(x*x);
+	r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
+	s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
+	return ((float).375 + r/s)/x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_jn.c b/libm/upstream-freebsd/lib/msun/src/e_jn.c
new file mode 100644
index 0000000..a1130c5
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_jn.c
@@ -0,0 +1,274 @@
+
+/* @(#)e_jn.c 1.4 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_jn.c 279856 2015-03-10 17:10:54Z kargl $");
+
+/*
+ * __ieee754_jn(n, x), __ieee754_yn(n, x)
+ * floating point Bessel's function of the 1st and 2nd kind
+ * of order n
+ *          
+ * Special cases:
+ *	y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ *	y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
+ * Note 2. About jn(n,x), yn(n,x)
+ *	For n=0, j0(x) is called,
+ *	for n=1, j1(x) is called,
+ *	for n<x, forward recursion us used starting
+ *	from values of j0(x) and j1(x).
+ *	for n>x, a continued fraction approximation to
+ *	j(n,x)/j(n-1,x) is evaluated and then backward
+ *	recursion is used starting from a supposed value
+ *	for j(n,x). The resulting value of j(0,x) is
+ *	compared with the actual value to correct the
+ *	supposed value of j(n,x).
+ *
+ *	yn(n,x) is similar in all respects, except
+ *	that forward recursion is used for all
+ *	values of n>1.
+ *	
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double vone = 1, vzero = 0;
+
+static const double
+invsqrtpi=  5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
+two   =  2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
+one   =  1.00000000000000000000e+00; /* 0x3FF00000, 0x00000000 */
+
+static const double zero  =  0.00000000000000000000e+00;
+
+double
+__ieee754_jn(int n, double x)
+{
+	int32_t i,hx,ix,lx, sgn;
+	double a, b, temp, di;
+	double z, w;
+
+    /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+     * Thus, J(-n,x) = J(n,-x)
+     */
+	EXTRACT_WORDS(hx,lx,x);
+	ix = 0x7fffffff&hx;
+    /* if J(n,NaN) is NaN */
+	if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
+	if(n<0){		
+		n = -n;
+		x = -x;
+		hx ^= 0x80000000;
+	}
+	if(n==0) return(__ieee754_j0(x));
+	if(n==1) return(__ieee754_j1(x));
+	sgn = (n&1)&(hx>>31);	/* even n -- 0, odd n -- sign(x) */
+	x = fabs(x);
+	if((ix|lx)==0||ix>=0x7ff00000) 	/* if x is 0 or inf */
+	    b = zero;
+	else if((double)n<=x) {   
+		/* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+	    if(ix>=0x52D00000) { /* x > 2**302 */
+    /* (x >> n**2) 
+     *	    Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *	    Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *	    Let s=sin(x), c=cos(x), 
+     *		xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *		   n	sin(xn)*sqt2	cos(xn)*sqt2
+     *		----------------------------------
+     *		   0	 s-c		 c+s
+     *		   1	-s-c 		-c+s
+     *		   2	-s+c		-c-s
+     *		   3	 s+c		 c-s
+     */
+		switch(n&3) {
+		    case 0: temp =  cos(x)+sin(x); break;
+		    case 1: temp = -cos(x)+sin(x); break;
+		    case 2: temp = -cos(x)-sin(x); break;
+		    case 3: temp =  cos(x)-sin(x); break;
+		}
+		b = invsqrtpi*temp/sqrt(x);
+	    } else {	
+	        a = __ieee754_j0(x);
+	        b = __ieee754_j1(x);
+	        for(i=1;i<n;i++){
+		    temp = b;
+		    b = b*((double)(i+i)/x) - a; /* avoid underflow */
+		    a = temp;
+	        }
+	    }
+	} else {
+	    if(ix<0x3e100000) {	/* x < 2**-29 */
+    /* x is tiny, return the first Taylor expansion of J(n,x) 
+     * J(n,x) = 1/n!*(x/2)^n  - ...
+     */
+		if(n>33)	/* underflow */
+		    b = zero;
+		else {
+		    temp = x*0.5; b = temp;
+		    for (a=one,i=2;i<=n;i++) {
+			a *= (double)i;		/* a = n! */
+			b *= temp;		/* b = (x/2)^n */
+		    }
+		    b = b/a;
+		}
+	    } else {
+		/* use backward recurrence */
+		/* 			x      x^2      x^2       
+		 *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
+		 *			2n  - 2(n+1) - 2(n+2)
+		 *
+		 * 			1      1        1       
+		 *  (for large x)   =  ----  ------   ------   .....
+		 *			2n   2(n+1)   2(n+2)
+		 *			-- - ------ - ------ - 
+		 *			 x     x         x
+		 *
+		 * Let w = 2n/x and h=2/x, then the above quotient
+		 * is equal to the continued fraction:
+		 *		    1
+		 *	= -----------------------
+		 *		       1
+		 *	   w - -----------------
+		 *			  1
+		 * 	        w+h - ---------
+		 *		       w+2h - ...
+		 *
+		 * To determine how many terms needed, let
+		 * Q(0) = w, Q(1) = w(w+h) - 1,
+		 * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+		 * When Q(k) > 1e4	good for single 
+		 * When Q(k) > 1e9	good for double 
+		 * When Q(k) > 1e17	good for quadruple 
+		 */
+	    /* determine k */
+		double t,v;
+		double q0,q1,h,tmp; int32_t k,m;
+		w  = (n+n)/(double)x; h = 2.0/(double)x;
+		q0 = w;  z = w+h; q1 = w*z - 1.0; k=1;
+		while(q1<1.0e9) {
+			k += 1; z += h;
+			tmp = z*q1 - q0;
+			q0 = q1;
+			q1 = tmp;
+		}
+		m = n+n;
+		for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t);
+		a = t;
+		b = one;
+		/*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+		 *  Hence, if n*(log(2n/x)) > ...
+		 *  single 8.8722839355e+01
+		 *  double 7.09782712893383973096e+02
+		 *  long double 1.1356523406294143949491931077970765006170e+04
+		 *  then recurrent value may overflow and the result is
+		 *  likely underflow to zero
+		 */
+		tmp = n;
+		v = two/x;
+		tmp = tmp*__ieee754_log(fabs(v*tmp));
+		if(tmp<7.09782712893383973096e+02) {
+	    	    for(i=n-1,di=(double)(i+i);i>0;i--){
+		        temp = b;
+			b *= di;
+			b  = b/x - a;
+		        a = temp;
+			di -= two;
+	     	    }
+		} else {
+	    	    for(i=n-1,di=(double)(i+i);i>0;i--){
+		        temp = b;
+			b *= di;
+			b  = b/x - a;
+		        a = temp;
+			di -= two;
+		    /* scale b to avoid spurious overflow */
+			if(b>1e100) {
+			    a /= b;
+			    t /= b;
+			    b  = one;
+			}
+	     	    }
+		}
+		z = __ieee754_j0(x);
+		w = __ieee754_j1(x);
+		if (fabs(z) >= fabs(w))
+		    b = (t*z/b);
+		else
+		    b = (t*w/a);
+	    }
+	}
+	if(sgn==1) return -b; else return b;
+}
+
+double
+__ieee754_yn(int n, double x)
+{
+	int32_t i,hx,ix,lx;
+	int32_t sign;
+	double a, b, temp;
+
+	EXTRACT_WORDS(hx,lx,x);
+	ix = 0x7fffffff&hx;
+	/* yn(n,NaN) = NaN */
+	if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
+	/* yn(n,+-0) = -inf and raise divide-by-zero exception. */
+	if((ix|lx)==0) return -one/vzero;
+	/* yn(n,x<0) = NaN and raise invalid exception. */
+	if(hx<0) return vzero/vzero;
+	sign = 1;
+	if(n<0){
+		n = -n;
+		sign = 1 - ((n&1)<<1);
+	}
+	if(n==0) return(__ieee754_y0(x));
+	if(n==1) return(sign*__ieee754_y1(x));
+	if(ix==0x7ff00000) return zero;
+	if(ix>=0x52D00000) { /* x > 2**302 */
+    /* (x >> n**2) 
+     *	    Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *	    Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
+     *	    Let s=sin(x), c=cos(x), 
+     *		xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
+     *
+     *		   n	sin(xn)*sqt2	cos(xn)*sqt2
+     *		----------------------------------
+     *		   0	 s-c		 c+s
+     *		   1	-s-c 		-c+s
+     *		   2	-s+c		-c-s
+     *		   3	 s+c		 c-s
+     */
+		switch(n&3) {
+		    case 0: temp =  sin(x)-cos(x); break;
+		    case 1: temp = -sin(x)-cos(x); break;
+		    case 2: temp = -sin(x)+cos(x); break;
+		    case 3: temp =  sin(x)+cos(x); break;
+		}
+		b = invsqrtpi*temp/sqrt(x);
+	} else {
+	    u_int32_t high;
+	    a = __ieee754_y0(x);
+	    b = __ieee754_y1(x);
+	/* quit if b is -inf */
+	    GET_HIGH_WORD(high,b);
+	    for(i=1;i<n&&high!=0xfff00000;i++){
+		temp = b;
+		b = ((double)(i+i)/x)*b - a;
+		GET_HIGH_WORD(high,b);
+		a = temp;
+	    }
+	}
+	if(sign>0) return b; else return -b;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_jnf.c b/libm/upstream-freebsd/lib/msun/src/e_jnf.c
new file mode 100644
index 0000000..c82d5cf
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_jnf.c
@@ -0,0 +1,204 @@
+/* e_jnf.c -- float version of e_jn.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/e_jnf.c 279856 2015-03-10 17:10:54Z kargl $");
+
+/*
+ * See e_jn.c for complete comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile float vone = 1, vzero = 0;
+
+static const float
+two   =  2.0000000000e+00, /* 0x40000000 */
+one   =  1.0000000000e+00; /* 0x3F800000 */
+
+static const float zero  =  0.0000000000e+00;
+
+float
+__ieee754_jnf(int n, float x)
+{
+	int32_t i,hx,ix, sgn;
+	float a, b, temp, di;
+	float z, w;
+
+    /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
+     * Thus, J(-n,x) = J(n,-x)
+     */
+	GET_FLOAT_WORD(hx,x);
+	ix = 0x7fffffff&hx;
+    /* if J(n,NaN) is NaN */
+	if(ix>0x7f800000) return x+x;
+	if(n<0){
+		n = -n;
+		x = -x;
+		hx ^= 0x80000000;
+	}
+	if(n==0) return(__ieee754_j0f(x));
+	if(n==1) return(__ieee754_j1f(x));
+	sgn = (n&1)&(hx>>31);	/* even n -- 0, odd n -- sign(x) */
+	x = fabsf(x);
+	if(ix==0||ix>=0x7f800000) 	/* if x is 0 or inf */
+	    b = zero;
+	else if((float)n<=x) {
+		/* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
+	    a = __ieee754_j0f(x);
+	    b = __ieee754_j1f(x);
+	    for(i=1;i<n;i++){
+		temp = b;
+		b = b*((float)(i+i)/x) - a; /* avoid underflow */
+		a = temp;
+	    }
+	} else {
+	    if(ix<0x30800000) {	/* x < 2**-29 */
+    /* x is tiny, return the first Taylor expansion of J(n,x)
+     * J(n,x) = 1/n!*(x/2)^n  - ...
+     */
+		if(n>33)	/* underflow */
+		    b = zero;
+		else {
+		    temp = x*(float)0.5; b = temp;
+		    for (a=one,i=2;i<=n;i++) {
+			a *= (float)i;		/* a = n! */
+			b *= temp;		/* b = (x/2)^n */
+		    }
+		    b = b/a;
+		}
+	    } else {
+		/* use backward recurrence */
+		/* 			x      x^2      x^2
+		 *  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
+		 *			2n  - 2(n+1) - 2(n+2)
+		 *
+		 * 			1      1        1
+		 *  (for large x)   =  ----  ------   ------   .....
+		 *			2n   2(n+1)   2(n+2)
+		 *			-- - ------ - ------ -
+		 *			 x     x         x
+		 *
+		 * Let w = 2n/x and h=2/x, then the above quotient
+		 * is equal to the continued fraction:
+		 *		    1
+		 *	= -----------------------
+		 *		       1
+		 *	   w - -----------------
+		 *			  1
+		 * 	        w+h - ---------
+		 *		       w+2h - ...
+		 *
+		 * To determine how many terms needed, let
+		 * Q(0) = w, Q(1) = w(w+h) - 1,
+		 * Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
+		 * When Q(k) > 1e4	good for single
+		 * When Q(k) > 1e9	good for double
+		 * When Q(k) > 1e17	good for quadruple
+		 */
+	    /* determine k */
+		float t,v;
+		float q0,q1,h,tmp; int32_t k,m;
+		w  = (n+n)/(float)x; h = (float)2.0/(float)x;
+		q0 = w;  z = w+h; q1 = w*z - (float)1.0; k=1;
+		while(q1<(float)1.0e9) {
+			k += 1; z += h;
+			tmp = z*q1 - q0;
+			q0 = q1;
+			q1 = tmp;
+		}
+		m = n+n;
+		for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t);
+		a = t;
+		b = one;
+		/*  estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
+		 *  Hence, if n*(log(2n/x)) > ...
+		 *  single 8.8722839355e+01
+		 *  double 7.09782712893383973096e+02
+		 *  long double 1.1356523406294143949491931077970765006170e+04
+		 *  then recurrent value may overflow and the result is
+		 *  likely underflow to zero
+		 */
+		tmp = n;
+		v = two/x;
+		tmp = tmp*__ieee754_logf(fabsf(v*tmp));
+		if(tmp<(float)8.8721679688e+01) {
+	    	    for(i=n-1,di=(float)(i+i);i>0;i--){
+		        temp = b;
+			b *= di;
+			b  = b/x - a;
+		        a = temp;
+			di -= two;
+	     	    }
+		} else {
+	    	    for(i=n-1,di=(float)(i+i);i>0;i--){
+		        temp = b;
+			b *= di;
+			b  = b/x - a;
+		        a = temp;
+			di -= two;
+		    /* scale b to avoid spurious overflow */
+			if(b>(float)1e10) {
+			    a /= b;
+			    t /= b;
+			    b  = one;
+			}
+	     	    }
+		}
+		z = __ieee754_j0f(x);
+		w = __ieee754_j1f(x);
+		if (fabsf(z) >= fabsf(w))
+		    b = (t*z/b);
+		else
+		    b = (t*w/a);
+	    }
+	}
+	if(sgn==1) return -b; else return b;
+}
+
+float
+__ieee754_ynf(int n, float x)
+{
+	int32_t i,hx,ix,ib;
+	int32_t sign;
+	float a, b, temp;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = 0x7fffffff&hx;
+	if(ix>0x7f800000) return x+x;
+	if(ix==0) return -one/vzero;
+	if(hx<0) return vzero/vzero;
+	sign = 1;
+	if(n<0){
+		n = -n;
+		sign = 1 - ((n&1)<<1);
+	}
+	if(n==0) return(__ieee754_y0f(x));
+	if(n==1) return(sign*__ieee754_y1f(x));
+	if(ix==0x7f800000) return zero;
+
+	a = __ieee754_y0f(x);
+	b = __ieee754_y1f(x);
+	/* quit if b is -inf */
+	GET_FLOAT_WORD(ib,b);
+	for(i=1;i<n&&ib!=0xff800000;i++){
+	    temp = b;
+	    b = ((float)(i+i)/x)*b - a;
+	    GET_FLOAT_WORD(ib,b);
+	    a = temp;
+	}
+	if(sign>0) return b; else return -b;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_lgamma.c b/libm/upstream-freebsd/lib/msun/src/e_lgamma.c
new file mode 100644
index 0000000..43f5175
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_lgamma.c
@@ -0,0 +1,39 @@
+
+/* @(#)e_lgamma.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_lgamma(x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgamma_r
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+double
+__ieee754_lgamma(double x)
+{
+	return __ieee754_lgamma_r(x,&signgam);
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(lgamma, lgammal);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_lgamma_r.c b/libm/upstream-freebsd/lib/msun/src/e_lgamma_r.c
new file mode 100644
index 0000000..be70767
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_lgamma_r.c
@@ -0,0 +1,303 @@
+/* @(#)e_lgamma_r.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_lgamma_r(x, signgamp)
+ * Reentrant version of the logarithm of the Gamma function
+ * with user provide pointer for the sign of Gamma(x).
+ *
+ * Method:
+ *   1. Argument Reduction for 0 < x <= 8
+ * 	Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
+ * 	reduce x to a number in [1.5,2.5] by
+ * 		lgamma(1+s) = log(s) + lgamma(s)
+ *	for example,
+ *		lgamma(7.3) = log(6.3) + lgamma(6.3)
+ *			    = log(6.3*5.3) + lgamma(5.3)
+ *			    = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
+ *   2. Polynomial approximation of lgamma around its
+ *	minimun ymin=1.461632144968362245 to maintain monotonicity.
+ *	On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
+ *		Let z = x-ymin;
+ *		lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
+ *	where
+ *		poly(z) is a 14 degree polynomial.
+ *   2. Rational approximation in the primary interval [2,3]
+ *	We use the following approximation:
+ *		s = x-2.0;
+ *		lgamma(x) = 0.5*s + s*P(s)/Q(s)
+ *	with accuracy
+ *		|P/Q - (lgamma(x)-0.5s)| < 2**-61.71
+ *	Our algorithms are based on the following observation
+ *
+ *                             zeta(2)-1    2    zeta(3)-1    3
+ * lgamma(2+s) = s*(1-Euler) + --------- * s  -  --------- * s  + ...
+ *                                 2                 3
+ *
+ *	where Euler = 0.5771... is the Euler constant, which is very
+ *	close to 0.5.
+ *
+ *   3. For x>=8, we have
+ *	lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
+ *	(better formula:
+ *	   lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
+ *	Let z = 1/x, then we approximation
+ *		f(z) = lgamma(x) - (x-0.5)(log(x)-1)
+ *	by
+ *	  			    3       5             11
+ *		w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
+ *	where
+ *		|w - f(z)| < 2**-58.74
+ *
+ *   4. For negative x, since (G is gamma function)
+ *		-x*G(-x)*G(x) = pi/sin(pi*x),
+ * 	we have
+ * 		G(x) = pi/(sin(pi*x)*(-x)*G(-x))
+ *	since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
+ *	Hence, for x<0, signgam = sign(sin(pi*x)) and
+ *		lgamma(x) = log(|Gamma(x)|)
+ *			  = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
+ *	Note: one should avoid compute pi*(-x) directly in the
+ *	      computation of sin(pi*(-x)).
+ *
+ *   5. Special Cases
+ *		lgamma(2+s) ~ s*(1-Euler) for tiny s
+ *		lgamma(1) = lgamma(2) = 0
+ *		lgamma(x) ~ -log(|x|) for tiny x
+ *		lgamma(0) = lgamma(neg.integer) = inf and raise divide-by-zero
+ *		lgamma(inf) = inf
+ *		lgamma(-inf) = inf (bug for bug compatible with C99!?)
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double vzero = 0;
+
+static const double
+zero=  0.00000000000000000000e+00,
+half=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+pi  =  3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
+a0  =  7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */
+a1  =  3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */
+a2  =  6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */
+a3  =  2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */
+a4  =  7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */
+a5  =  2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */
+a6  =  1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */
+a7  =  5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */
+a8  =  2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */
+a9  =  1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */
+a10 =  2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */
+a11 =  4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */
+tc  =  1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */
+tf  = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */
+/* tt = -(tail of tf) */
+tt  = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */
+t0  =  4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */
+t1  = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */
+t2  =  6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */
+t3  = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */
+t4  =  1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */
+t5  = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */
+t6  =  6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */
+t7  = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */
+t8  =  2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */
+t9  = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */
+t10 =  8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */
+t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */
+t12 =  3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */
+t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */
+t14 =  3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */
+u0  = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+u1  =  6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */
+u2  =  1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */
+u3  =  9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */
+u4  =  2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */
+u5  =  1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */
+v1  =  2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */
+v2  =  2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */
+v3  =  7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */
+v4  =  1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */
+v5  =  3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */
+s0  = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
+s1  =  2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */
+s2  =  3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */
+s3  =  1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */
+s4  =  2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */
+s5  =  1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */
+s6  =  3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */
+r1  =  1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */
+r2  =  7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */
+r3  =  1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */
+r4  =  1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */
+r5  =  7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */
+r6  =  7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */
+w0  =  4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */
+w1  =  8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */
+w2  = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */
+w3  =  7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */
+w4  = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */
+w5  =  8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */
+w6  = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */
+
+/*
+ * Compute sin(pi*x) without actually doing the pi*x multiplication.
+ * sin_pi(x) is only called for x < 0 and |x| < 2**(p-1) where p is
+ * the precision of x.
+ */
+static double
+sin_pi(double x)
+{
+	volatile double vz;
+	double y,z;
+	int n;
+
+	y = -x;
+
+	vz = y+0x1p52;			/* depend on 0 <= y < 0x1p52 */
+	z = vz-0x1p52;			/* rint(y) for the above range */
+	if (z == y)
+	    return zero;
+
+	vz = y+0x1p50;
+	GET_LOW_WORD(n,vz);		/* bits for rounded y (units 0.25) */
+	z = vz-0x1p50;			/* y rounded to a multiple of 0.25 */
+	if (z > y) {
+	    z -= 0.25;			/* adjust to round down */
+	    n--;
+	}
+	n &= 7;				/* octant of y mod 2 */
+	y = y - z + n * 0.25;		/* y mod 2 */
+
+	switch (n) {
+	    case 0:   y =  __kernel_sin(pi*y,zero,0); break;
+	    case 1:
+	    case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
+	    case 3:
+	    case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
+	    case 5:
+	    case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
+	    default:  y =  __kernel_sin(pi*(y-2.0),zero,0); break;
+	    }
+	return -y;
+}
+
+
+double
+__ieee754_lgamma_r(double x, int *signgamp)
+{
+	double nadj,p,p1,p2,p3,q,r,t,w,y,z;
+	int32_t hx;
+	int i,ix,lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+
+    /* purge +-Inf and NaNs */
+	*signgamp = 1;
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) return x*x;
+
+    /* purge +-0 and tiny arguments */
+	*signgamp = 1-2*((uint32_t)hx>>31);
+	if(ix<0x3c700000) {	/* |x|<2**-56, return -log(|x|) */
+	    if((ix|lx)==0)
+	        return one/vzero;
+	    return -__ieee754_log(fabs(x));
+	}
+
+    /* purge negative integers and start evaluation for other x < 0 */
+	if(hx<0) {
+	    *signgamp = 1;
+	    if(ix>=0x43300000) 	/* |x|>=2**52, must be -integer */
+		return one/vzero;
+	    t = sin_pi(x);
+	    if(t==zero) return one/vzero; /* -integer */
+	    nadj = __ieee754_log(pi/fabs(t*x));
+	    if(t<zero) *signgamp = -1;
+	    x = -x;
+	}
+
+    /* purge 1 and 2 */
+	if((((ix-0x3ff00000)|lx)==0)||(((ix-0x40000000)|lx)==0)) r = 0;
+    /* for x < 2.0 */
+	else if(ix<0x40000000) {
+	    if(ix<=0x3feccccc) { 	/* lgamma(x) = lgamma(x+1)-log(x) */
+		r = -__ieee754_log(x);
+		if(ix>=0x3FE76944) {y = one-x; i= 0;}
+		else if(ix>=0x3FCDA661) {y= x-(tc-one); i=1;}
+	  	else {y = x; i=2;}
+	    } else {
+	  	r = zero;
+	        if(ix>=0x3FFBB4C3) {y=2.0-x;i=0;} /* [1.7316,2] */
+	        else if(ix>=0x3FF3B4C4) {y=x-tc;i=1;} /* [1.23,1.73] */
+		else {y=x-one;i=2;}
+	    }
+	    switch(i) {
+	      case 0:
+		z = y*y;
+		p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
+		p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
+		p  = y*p1+p2;
+		r  += p-y/2; break;
+	      case 1:
+		z = y*y;
+		w = z*y;
+		p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12)));	/* parallel comp */
+		p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
+		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
+		p  = z*p1-(tt-w*(p2+y*p3));
+		r += tf + p; break;
+	      case 2:
+		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
+		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
+		r += p1/p2-y/2;
+	    }
+	}
+    /* x < 8.0 */
+	else if(ix<0x40200000) {
+	    i = x;
+	    y = x-i;
+	    p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
+	    q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
+	    r = y/2+p/q;
+	    z = one;	/* lgamma(1+s) = log(s) + lgamma(s) */
+	    switch(i) {
+	    case 7: z *= (y+6);		/* FALLTHRU */
+	    case 6: z *= (y+5);		/* FALLTHRU */
+	    case 5: z *= (y+4);		/* FALLTHRU */
+	    case 4: z *= (y+3);		/* FALLTHRU */
+	    case 3: z *= (y+2);		/* FALLTHRU */
+		    r += __ieee754_log(z); break;
+	    }
+    /* 8.0 <= x < 2**56 */
+	} else if (ix < 0x43700000) {
+	    t = __ieee754_log(x);
+	    z = one/x;
+	    y = z*z;
+	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
+	    r = (x-half)*(t-one)+w;
+	} else
+    /* 2**56 <= x <= inf */
+	    r =  x*(__ieee754_log(x)-one);
+	if(hx<0) r = nadj - r;
+	return r;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(lgamma_r, lgammal_r);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_lgammaf.c b/libm/upstream-freebsd/lib/msun/src/e_lgammaf.c
new file mode 100644
index 0000000..1e2c552
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_lgammaf.c
@@ -0,0 +1,34 @@
+/* e_lgammaf.c -- float version of e_lgamma.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_lgammaf(x)
+ * Return the logarithm of the Gamma function of x.
+ *
+ * Method: call __ieee754_lgammaf_r
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+float
+__ieee754_lgammaf(float x)
+{
+	return __ieee754_lgammaf_r(x,&signgam);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_lgammaf_r.c b/libm/upstream-freebsd/lib/msun/src/e_lgammaf_r.c
new file mode 100644
index 0000000..9084e18
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_lgammaf_r.c
@@ -0,0 +1,215 @@
+/* e_lgammaf_r.c -- float version of e_lgamma_r.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Conversion to float fixed By Steven G. Kargl.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile float vzero = 0;
+
+static const float
+zero=  0,
+half=  0.5,
+one =  1,
+pi  =  3.1415927410e+00, /* 0x40490fdb */
+/*
+ * Domain y in [0x1p-27, 0.27], range ~[-3.4599e-10, 3.4590e-10]:
+ * |(lgamma(2 - y) + 0.5 * y) / y - a(y)| < 2**-31.4
+ */
+a0  =  7.72156641e-02, /* 0x3d9e233f */
+a1  =  3.22467119e-01, /* 0x3ea51a69 */
+a2  =  6.73484802e-02, /* 0x3d89ee00 */
+a3  =  2.06395667e-02, /* 0x3ca9144f */
+a4  =  6.98275631e-03, /* 0x3be4cf9b */
+a5  =  4.11768444e-03, /* 0x3b86eda4 */
+/*
+ * Domain x in [tc-0.24, tc+0.28], range ~[-5.6577e-10, 5.5677e-10]:
+ * |(lgamma(x) - tf) - t(x - tc)| < 2**-30.8.
+ */
+tc  =  1.46163213e+00, /* 0x3fbb16c3 */
+tf  = -1.21486291e-01, /* 0xbdf8cdce */
+t0  = -2.94064460e-11, /* 0xae0154b7 */
+t1  = -2.35939837e-08, /* 0xb2caabb8 */
+t2  =  4.83836412e-01, /* 0x3ef7b968 */
+t3  = -1.47586212e-01, /* 0xbe1720d7 */
+t4  =  6.46013096e-02, /* 0x3d844db1 */
+t5  = -3.28450352e-02, /* 0xbd068884 */
+t6  =  1.86483748e-02, /* 0x3c98c47a */
+t7  = -9.89206228e-03, /* 0xbc221251 */
+/*
+ * Domain y in [-0.1, 0.232], range ~[-8.4931e-10, 8.7794e-10]:
+ * |(lgamma(1 + y) + 0.5 * y) / y - u(y) / v(y)| < 2**-31.2
+ */
+u0  = -7.72156641e-02, /* 0xbd9e233f */
+u1  =  7.36789703e-01, /* 0x3f3c9e40 */
+u2  =  4.95649040e-01, /* 0x3efdc5b6 */
+v1  =  1.10958421e+00, /* 0x3f8e06db */
+v2  =  2.10598111e-01, /* 0x3e57a708 */
+v3  = -1.02995494e-02, /* 0xbc28bf71 */
+/*
+ * Domain x in (2, 3], range ~[-5.5189e-11, 5.2317e-11]:
+ * |(lgamma(y+2) - 0.5 * y) / y - s(y)/r(y)| < 2**-35.0
+ * with y = x - 2.
+ */
+s0 = -7.72156641e-02, /* 0xbd9e233f */
+s1 =  2.69987404e-01, /* 0x3e8a3bca */
+s2 =  1.42851010e-01, /* 0x3e124789 */
+s3 =  1.19389519e-02, /* 0x3c439b98 */
+r1 =  6.79650068e-01, /* 0x3f2dfd8c */
+r2 =  1.16058730e-01, /* 0x3dedb033 */
+r3 =  3.75673687e-03, /* 0x3b763396 */
+/*
+ * Domain z in [8, 0x1p24], range ~[-1.2640e-09, 1.2640e-09]:
+ * |lgamma(x) - (x - 0.5) * (log(x) - 1) - w(1/x)| < 2**-29.6.
+ */
+w0 =  4.18938547e-01, /* 0x3ed67f1d */
+w1 =  8.33332464e-02, /* 0x3daaaa9f */
+w2 = -2.76129087e-03; /* 0xbb34f6c6 */
+
+static float
+sin_pif(float x)
+{
+	volatile float vz;
+	float y,z;
+	int n;
+
+	y = -x;
+
+	vz = y+0x1p23F;			/* depend on 0 <= y < 0x1p23 */
+	z = vz-0x1p23F;			/* rintf(y) for the above range */
+	if (z == y)
+	    return zero;
+
+	vz = y+0x1p21F;
+	GET_FLOAT_WORD(n,vz);		/* bits for rounded y (units 0.25) */
+	z = vz-0x1p21F;			/* y rounded to a multiple of 0.25 */
+	if (z > y) {
+	    z -= 0.25F;			/* adjust to round down */
+	    n--;
+	}
+	n &= 7;				/* octant of y mod 2 */
+	y = y - z + n * 0.25F;		/* y mod 2 */
+
+	switch (n) {
+	    case 0:   y =  __kernel_sindf(pi*y); break;
+	    case 1:
+	    case 2:   y =  __kernel_cosdf(pi*((float)0.5-y)); break;
+	    case 3:
+	    case 4:   y =  __kernel_sindf(pi*(one-y)); break;
+	    case 5:
+	    case 6:   y = -__kernel_cosdf(pi*(y-(float)1.5)); break;
+	    default:  y =  __kernel_sindf(pi*(y-(float)2.0)); break;
+	    }
+	return -y;
+}
+
+
+float
+__ieee754_lgammaf_r(float x, int *signgamp)
+{
+	float nadj,p,p1,p2,p3,q,r,t,w,y,z;
+	int32_t hx;
+	int i,ix;
+
+	GET_FLOAT_WORD(hx,x);
+
+    /* purge +-Inf and NaNs */
+	*signgamp = 1;
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) return x*x;
+
+    /* purge +-0 and tiny arguments */
+	*signgamp = 1-2*((uint32_t)hx>>31);
+	if(ix<0x32000000) {		/* |x|<2**-27, return -log(|x|) */
+	    if(ix==0)
+	        return one/vzero;
+	    return -__ieee754_logf(fabsf(x));
+	}
+
+    /* purge negative integers and start evaluation for other x < 0 */
+	if(hx<0) {
+	    *signgamp = 1;
+	    if(ix>=0x4b000000) 		/* |x|>=2**23, must be -integer */
+		return one/vzero;
+	    t = sin_pif(x);
+	    if(t==zero) return one/vzero; /* -integer */
+	    nadj = __ieee754_logf(pi/fabsf(t*x));
+	    if(t<zero) *signgamp = -1;
+	    x = -x;
+	}
+
+    /* purge 1 and 2 */
+	if (ix==0x3f800000||ix==0x40000000) r = 0;
+    /* for x < 2.0 */
+	else if(ix<0x40000000) {
+	    if(ix<=0x3f666666) { 	/* lgamma(x) = lgamma(x+1)-log(x) */
+		r = -__ieee754_logf(x);
+		if(ix>=0x3f3b4a20) {y = one-x; i= 0;}
+		else if(ix>=0x3e6d3308) {y= x-(tc-one); i=1;}
+	  	else {y = x; i=2;}
+	    } else {
+	  	r = zero;
+	        if(ix>=0x3fdda618) {y=2-x;i=0;} /* [1.7316,2] */
+	        else if(ix>=0x3F9da620) {y=x-tc;i=1;} /* [1.23,1.73] */
+		else {y=x-one;i=2;}
+	    }
+	    switch(i) {
+	      case 0:
+		z = y*y;
+		p1 = a0+z*(a2+z*a4);
+		p2 = z*(a1+z*(a3+z*a5));
+		p  = y*p1+p2;
+		r  += p-y/2; break;
+	      case 1:
+		p = t0+y*t1+y*y*(t2+y*(t3+y*(t4+y*(t5+y*(t6+y*t7)))));
+		r += tf + p; break;
+	      case 2:
+		p1 = y*(u0+y*(u1+y*u2));
+		p2 = one+y*(v1+y*(v2+y*v3));
+		r += p1/p2-y/2;
+	    }
+	}
+    /* x < 8.0 */
+	else if(ix<0x41000000) {
+	    i = x;
+	    y = x-i;
+	    p = y*(s0+y*(s1+y*(s2+y*s3)));
+	    q = one+y*(r1+y*(r2+y*r3));
+	    r = y/2+p/q;
+	    z = one;	/* lgamma(1+s) = log(s) + lgamma(s) */
+	    switch(i) {
+	    case 7: z *= (y+6);		/* FALLTHRU */
+	    case 6: z *= (y+5);		/* FALLTHRU */
+	    case 5: z *= (y+4);		/* FALLTHRU */
+	    case 4: z *= (y+3);		/* FALLTHRU */
+	    case 3: z *= (y+2);		/* FALLTHRU */
+		    r += __ieee754_logf(z); break;
+	    }
+    /* 8.0 <= x < 2**27 */
+	} else if (ix < 0x4d000000) {
+	    t = __ieee754_logf(x);
+	    z = one/x;
+	    y = z*z;
+	    w = w0+z*(w1+y*w2);
+	    r = (x-half)*(t-one)+w;
+	} else
+    /* 2**27 <= x <= inf */
+	    r =  x*(__ieee754_logf(x)-one);
+	if(hx<0) r = nadj - r;
+	return r;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_lgammal.c b/libm/upstream-freebsd/lib/msun/src/e_lgammal.c
new file mode 100644
index 0000000..ebc2fc7
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_lgammal.c
@@ -0,0 +1,25 @@
+/* @(#)e_lgamma.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+extern int signgam;
+
+long double
+lgammal(long double x)
+{
+	return lgammal_r(x,&signgam);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_log.c b/libm/upstream-freebsd/lib/msun/src/e_log.c
new file mode 100644
index 0000000..68bc107
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_log.c
@@ -0,0 +1,147 @@
+
+/* @(#)e_log.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_log(x)
+ * Return the logrithm of x
+ *
+ * Method :                  
+ *   1. Argument Reduction: find k and f such that 
+ *			x = 2^k * (1+f), 
+ *	   where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *   2. Approximation of log(1+f).
+ *	Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *		 = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *	     	 = 2s + s*R
+ *      We use a special Reme algorithm on [0,0.1716] to generate 
+ * 	a polynomial of degree 14 to approximate R The maximum error 
+ *	of this polynomial approximation is bounded by 2**-58.45. In
+ *	other words,
+ *		        2      4      6      8      10      12      14
+ *	    R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s  +Lg6*s  +Lg7*s
+ *  	(the values of Lg1 to Lg7 are listed in the program)
+ *	and
+ *	    |      2          14          |     -58.45
+ *	    | Lg1*s +...+Lg7*s    -  R(z) | <= 2 
+ *	    |                             |
+ *	Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
+ *	In order to guarantee error in log below 1ulp, we compute log
+ *	by
+ *		log(1+f) = f - s*(f - R)	(if f is not too large)
+ *		log(1+f) = f - (hfsq - s*(hfsq+R)).	(better accuracy)
+ *	
+ *	3. Finally,  log(x) = k*ln2 + log(1+f).  
+ *			    = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
+ *	   Here ln2 is split into two floating point number: 
+ *			ln2_hi + ln2_lo,
+ *	   where n*ln2_hi is always exact for |n| < 2000.
+ *
+ * Special cases:
+ *	log(x) is NaN with signal if x < 0 (including -INF) ; 
+ *	log(+INF) is +INF; log(0) is -INF with signal;
+ *	log(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *	according to an error analysis, the error is always less than
+ *	1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+ln2_hi  =  6.93147180369123816490e-01,	/* 3fe62e42 fee00000 */
+ln2_lo  =  1.90821492927058770002e-10,	/* 3dea39ef 35793c76 */
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero   =  0.0;
+static volatile double vzero = 0.0;
+
+double
+__ieee754_log(double x)
+{
+	double hfsq,f,s,z,R,w,t1,t2,dk;
+	int32_t k,hx,i,j;
+	u_int32_t lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+
+	k=0;
+	if (hx < 0x00100000) {			/* x < 2**-1022  */
+	    if (((hx&0x7fffffff)|lx)==0) 
+		return -two54/vzero;		/* log(+-0)=-inf */
+	    if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 54; x *= two54; /* subnormal number, scale up x */
+	    GET_HIGH_WORD(hx,x);
+	} 
+	if (hx >= 0x7ff00000) return x+x;
+	k += (hx>>20)-1023;
+	hx &= 0x000fffff;
+	i = (hx+0x95f64)&0x100000;
+	SET_HIGH_WORD(x,hx|(i^0x3ff00000));	/* normalize x or x/2 */
+	k += (i>>20);
+	f = x-1.0;
+	if((0x000fffff&(2+hx))<3) {	/* -2**-20 <= f < 2**-20 */
+	    if(f==zero) {
+		if(k==0) {
+		    return zero;
+		} else {
+		    dk=(double)k;
+		    return dk*ln2_hi+dk*ln2_lo;
+		}
+	    }
+	    R = f*f*(0.5-0.33333333333333333*f);
+	    if(k==0) return f-R; else {dk=(double)k;
+	    	     return dk*ln2_hi-((R-dk*ln2_lo)-f);}
+	}
+ 	s = f/(2.0+f); 
+	dk = (double)k;
+	z = s*s;
+	i = hx-0x6147a;
+	w = z*z;
+	j = 0x6b851-hx;
+	t1= w*(Lg2+w*(Lg4+w*Lg6)); 
+	t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); 
+	i |= j;
+	R = t2+t1;
+	if(i>0) {
+	    hfsq=0.5*f*f;
+	    if(k==0) return f-(hfsq-s*(hfsq+R)); else
+		     return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
+	} else {
+	    if(k==0) return f-s*(f-R); else
+		     return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(log, logl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_log10.c b/libm/upstream-freebsd/lib/msun/src/e_log10.c
new file mode 100644
index 0000000..3c89ed2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_log10.c
@@ -0,0 +1,94 @@
+
+/* @(#)e_log10.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Return the base 10 logarithm of x.  See e_log.c and k_log.h for most
+ * comments.
+ *
+ *    log10(x) = (f - 0.5*f*f + k_log1p(f)) / ln10 + k * log10(2)
+ * in not-quite-routine extra precision.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+#include "k_log.h"
+
+static const double
+two54      =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+ivln10hi   =  4.34294481878168880939e-01, /* 0x3fdbcb7b, 0x15200000 */
+ivln10lo   =  2.50829467116452752298e-11, /* 0x3dbb9438, 0xca9aadd5 */
+log10_2hi  =  3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
+log10_2lo  =  3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */
+
+static const double zero   =  0.0;
+static volatile double vzero = 0.0;
+
+double
+__ieee754_log10(double x)
+{
+	double f,hfsq,hi,lo,r,val_hi,val_lo,w,y,y2;
+	int32_t i,k,hx;
+	u_int32_t lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+
+	k=0;
+	if (hx < 0x00100000) {			/* x < 2**-1022  */
+	    if (((hx&0x7fffffff)|lx)==0)
+		return -two54/vzero;		/* log(+-0)=-inf */
+	    if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 54; x *= two54; /* subnormal number, scale up x */
+	    GET_HIGH_WORD(hx,x);
+	}
+	if (hx >= 0x7ff00000) return x+x;
+	if (hx == 0x3ff00000 && lx == 0)
+	    return zero;			/* log(1) = +0 */
+	k += (hx>>20)-1023;
+	hx &= 0x000fffff;
+	i = (hx+0x95f64)&0x100000;
+	SET_HIGH_WORD(x,hx|(i^0x3ff00000));	/* normalize x or x/2 */
+	k += (i>>20);
+	y = (double)k;
+	f = x - 1.0;
+	hfsq = 0.5*f*f;
+	r = k_log1p(f);
+
+	/* See e_log2.c for most details. */
+	hi = f - hfsq;
+	SET_LOW_WORD(hi,0);
+	lo = (f - hi) - hfsq + r;
+	val_hi = hi*ivln10hi;
+	y2 = y*log10_2hi;
+	val_lo = y*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi;
+
+	/*
+	 * Extra precision in for adding y*log10_2hi is not strictly needed
+	 * since there is no very large cancellation near x = sqrt(2) or
+	 * x = 1/sqrt(2), but we do it anyway since it costs little on CPUs
+	 * with some parallelism and it reduces the error for many args.
+	 */
+	w = y2 + val_hi;
+	val_lo += (y2 - w) + val_hi;
+	val_hi = w;
+
+	return val_lo + val_hi;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(log10, log10l);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_log10f.c b/libm/upstream-freebsd/lib/msun/src/e_log10f.c
new file mode 100644
index 0000000..9856df2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_log10f.c
@@ -0,0 +1,72 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Float version of e_log10.c.  See the latter for most comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+#include "k_logf.h"
+
+static const float
+two25      =  3.3554432000e+07, /* 0x4c000000 */
+ivln10hi   =  4.3432617188e-01, /* 0x3ede6000 */
+ivln10lo   = -3.1689971365e-05, /* 0xb804ead9 */
+log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
+log10_2lo  =  7.9034151668e-07; /* 0x355427db */
+
+static const float zero   =  0.0;
+static volatile float vzero = 0.0;
+
+float
+__ieee754_log10f(float x)
+{
+	float f,hfsq,hi,lo,r,y;
+	int32_t i,k,hx;
+
+	GET_FLOAT_WORD(hx,x);
+
+	k=0;
+	if (hx < 0x00800000) {			/* x < 2**-126  */
+	    if ((hx&0x7fffffff)==0)
+		return -two25/vzero;		/* log(+-0)=-inf */
+	    if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 25; x *= two25; /* subnormal number, scale up x */
+	    GET_FLOAT_WORD(hx,x);
+	}
+	if (hx >= 0x7f800000) return x+x;
+	if (hx == 0x3f800000)
+	    return zero;			/* log(1) = +0 */
+	k += (hx>>23)-127;
+	hx &= 0x007fffff;
+	i = (hx+(0x4afb0d))&0x800000;
+	SET_FLOAT_WORD(x,hx|(i^0x3f800000));	/* normalize x or x/2 */
+	k += (i>>23);
+	y = (float)k;
+	f = x - (float)1.0;
+	hfsq = (float)0.5*f*f;
+	r = k_log1pf(f);
+
+	/* See e_log2f.c and e_log2.c for details. */
+	if (sizeof(float_t) > sizeof(float))
+		return (r - hfsq + f) * ((float_t)ivln10lo + ivln10hi) +
+		    y * ((float_t)log10_2lo + log10_2hi);
+	hi = f - hfsq;
+	GET_FLOAT_WORD(hx,hi);
+	SET_FLOAT_WORD(hi,hx&0xfffff000);
+	lo = (f - hi) - hfsq + r;
+	return y*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi + hi*ivln10hi +
+	    y*log10_2hi;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_log2.c b/libm/upstream-freebsd/lib/msun/src/e_log2.c
new file mode 100644
index 0000000..4766cdb
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_log2.c
@@ -0,0 +1,117 @@
+
+/* @(#)e_log10.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Return the base 2 logarithm of x.  See e_log.c and k_log.h for most
+ * comments.
+ *
+ * This reduces x to {k, 1+f} exactly as in e_log.c, then calls the kernel,
+ * then does the combining and scaling steps
+ *    log2(x) = (f - 0.5*f*f + k_log1p(f)) / ln2 + k
+ * in not-quite-routine extra precision.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+#include "k_log.h"
+
+static const double
+two54      =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+ivln2hi    =  1.44269504072144627571e+00, /* 0x3ff71547, 0x65200000 */
+ivln2lo    =  1.67517131648865118353e-10; /* 0x3de705fc, 0x2eefa200 */
+
+static const double zero   =  0.0;
+static volatile double vzero = 0.0;
+
+double
+__ieee754_log2(double x)
+{
+	double f,hfsq,hi,lo,r,val_hi,val_lo,w,y;
+	int32_t i,k,hx;
+	u_int32_t lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+
+	k=0;
+	if (hx < 0x00100000) {			/* x < 2**-1022  */
+	    if (((hx&0x7fffffff)|lx)==0)
+		return -two54/vzero;		/* log(+-0)=-inf */
+	    if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 54; x *= two54; /* subnormal number, scale up x */
+	    GET_HIGH_WORD(hx,x);
+	}
+	if (hx >= 0x7ff00000) return x+x;
+	if (hx == 0x3ff00000 && lx == 0)
+	    return zero;			/* log(1) = +0 */
+	k += (hx>>20)-1023;
+	hx &= 0x000fffff;
+	i = (hx+0x95f64)&0x100000;
+	SET_HIGH_WORD(x,hx|(i^0x3ff00000));	/* normalize x or x/2 */
+	k += (i>>20);
+	y = (double)k;
+	f = x - 1.0;
+	hfsq = 0.5*f*f;
+	r = k_log1p(f);
+
+	/*
+	 * f-hfsq must (for args near 1) be evaluated in extra precision
+	 * to avoid a large cancellation when x is near sqrt(2) or 1/sqrt(2).
+	 * This is fairly efficient since f-hfsq only depends on f, so can
+	 * be evaluated in parallel with R.  Not combining hfsq with R also
+	 * keeps R small (though not as small as a true `lo' term would be),
+	 * so that extra precision is not needed for terms involving R.
+	 *
+	 * Compiler bugs involving extra precision used to break Dekker's
+	 * theorem for spitting f-hfsq as hi+lo, unless double_t was used
+	 * or the multi-precision calculations were avoided when double_t
+	 * has extra precision.  These problems are now automatically
+	 * avoided as a side effect of the optimization of combining the
+	 * Dekker splitting step with the clear-low-bits step.
+	 *
+	 * y must (for args near sqrt(2) and 1/sqrt(2)) be added in extra
+	 * precision to avoid a very large cancellation when x is very near
+	 * these values.  Unlike the above cancellations, this problem is
+	 * specific to base 2.  It is strange that adding +-1 is so much
+	 * harder than adding +-ln2 or +-log10_2.
+	 *
+	 * This uses Dekker's theorem to normalize y+val_hi, so the
+	 * compiler bugs are back in some configurations, sigh.  And I
+	 * don't want to used double_t to avoid them, since that gives a
+	 * pessimization and the support for avoiding the pessimization
+	 * is not yet available.
+	 *
+	 * The multi-precision calculations for the multiplications are
+	 * routine.
+	 */
+	hi = f - hfsq;
+	SET_LOW_WORD(hi,0);
+	lo = (f - hi) - hfsq + r;
+	val_hi = hi*ivln2hi;
+	val_lo = (lo+hi)*ivln2lo + lo*ivln2hi;
+
+	/* spadd(val_hi, val_lo, y), except for not using double_t: */
+	w = y + val_hi;
+	val_lo += (y - w) + val_hi;
+	val_hi = w;
+
+	return val_lo + val_hi;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(log2, log2l);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_log2f.c b/libm/upstream-freebsd/lib/msun/src/e_log2f.c
new file mode 100644
index 0000000..1794484
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_log2f.c
@@ -0,0 +1,82 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Float version of e_log2.c.  See the latter for most comments.
+ */
+
+#include "math.h"
+#include "math_private.h"
+#include "k_logf.h"
+
+static const float
+two25      =  3.3554432000e+07, /* 0x4c000000 */
+ivln2hi    =  1.4428710938e+00, /* 0x3fb8b000 */
+ivln2lo    = -1.7605285393e-04; /* 0xb9389ad4 */
+
+static const float zero   =  0.0;
+static volatile float vzero = 0.0;
+
+float
+__ieee754_log2f(float x)
+{
+	float f,hfsq,hi,lo,r,y;
+	int32_t i,k,hx;
+
+	GET_FLOAT_WORD(hx,x);
+
+	k=0;
+	if (hx < 0x00800000) {			/* x < 2**-126  */
+	    if ((hx&0x7fffffff)==0)
+		return -two25/vzero;		/* log(+-0)=-inf */
+	    if (hx<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 25; x *= two25; /* subnormal number, scale up x */
+	    GET_FLOAT_WORD(hx,x);
+	}
+	if (hx >= 0x7f800000) return x+x;
+	if (hx == 0x3f800000)
+	    return zero;			/* log(1) = +0 */
+	k += (hx>>23)-127;
+	hx &= 0x007fffff;
+	i = (hx+(0x4afb0d))&0x800000;
+	SET_FLOAT_WORD(x,hx|(i^0x3f800000));	/* normalize x or x/2 */
+	k += (i>>23);
+	y = (float)k;
+	f = x - (float)1.0;
+	hfsq = (float)0.5*f*f;
+	r = k_log1pf(f);
+
+	/*
+	 * We no longer need to avoid falling into the multi-precision
+	 * calculations due to compiler bugs breaking Dekker's theorem.
+	 * Keep avoiding this as an optimization.  See e_log2.c for more
+	 * details (some details are here only because the optimization
+	 * is not yet available in double precision).
+	 *
+	 * Another compiler bug turned up.  With gcc on i386,
+	 * (ivln2lo + ivln2hi) would be evaluated in float precision
+	 * despite runtime evaluations using double precision.  So we
+	 * must cast one of its terms to float_t.  This makes the whole
+	 * expression have type float_t, so return is forced to waste
+	 * time clobbering its extra precision.
+	 */
+	if (sizeof(float_t) > sizeof(float))
+		return (r - hfsq + f) * ((float_t)ivln2lo + ivln2hi) + y;
+
+	hi = f - hfsq;
+	GET_FLOAT_WORD(hx,hi);
+	SET_FLOAT_WORD(hi,hx&0xfffff000);
+	lo = (f - hi) - hfsq + r;
+	return (lo+hi)*ivln2lo + lo*ivln2hi + hi*ivln2hi + y;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_logf.c b/libm/upstream-freebsd/lib/msun/src/e_logf.c
new file mode 100644
index 0000000..ec3985f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_logf.c
@@ -0,0 +1,89 @@
+/* e_logf.c -- float version of e_log.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+ln2_hi =   6.9313812256e-01,	/* 0x3f317180 */
+ln2_lo =   9.0580006145e-06,	/* 0x3717f7d1 */
+two25 =    3.355443200e+07,	/* 0x4c000000 */
+/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */
+Lg1 =      0xaaaaaa.0p-24,	/* 0.66666662693 */
+Lg2 =      0xccce13.0p-25,	/* 0.40000972152 */
+Lg3 =      0x91e9ee.0p-25,	/* 0.28498786688 */
+Lg4 =      0xf89e26.0p-26;	/* 0.24279078841 */
+
+static const float zero   =  0.0;
+static volatile float vzero = 0.0;
+
+float
+__ieee754_logf(float x)
+{
+	float hfsq,f,s,z,R,w,t1,t2,dk;
+	int32_t k,ix,i,j;
+
+	GET_FLOAT_WORD(ix,x);
+
+	k=0;
+	if (ix < 0x00800000) {			/* x < 2**-126  */
+	    if ((ix&0x7fffffff)==0)
+		return -two25/vzero;		/* log(+-0)=-inf */
+	    if (ix<0) return (x-x)/zero;	/* log(-#) = NaN */
+	    k -= 25; x *= two25; /* subnormal number, scale up x */
+	    GET_FLOAT_WORD(ix,x);
+	}
+	if (ix >= 0x7f800000) return x+x;
+	k += (ix>>23)-127;
+	ix &= 0x007fffff;
+	i = (ix+(0x95f64<<3))&0x800000;
+	SET_FLOAT_WORD(x,ix|(i^0x3f800000));	/* normalize x or x/2 */
+	k += (i>>23);
+	f = x-(float)1.0;
+	if((0x007fffff&(0x8000+ix))<0xc000) {	/* -2**-9 <= f < 2**-9 */
+	    if(f==zero) {
+		if(k==0) {
+		    return zero;
+		} else {
+		    dk=(float)k;
+		    return dk*ln2_hi+dk*ln2_lo;
+		}
+	    }
+	    R = f*f*((float)0.5-(float)0.33333333333333333*f);
+	    if(k==0) return f-R; else {dk=(float)k;
+	    	     return dk*ln2_hi-((R-dk*ln2_lo)-f);}
+	}
+ 	s = f/((float)2.0+f);
+	dk = (float)k;
+	z = s*s;
+	i = ix-(0x6147a<<3);
+	w = z*z;
+	j = (0x6b851<<3)-ix;
+	t1= w*(Lg2+w*Lg4);
+	t2= z*(Lg1+w*Lg3);
+	i |= j;
+	R = t2+t1;
+	if(i>0) {
+	    hfsq=(float)0.5*f*f;
+	    if(k==0) return f-(hfsq-s*(hfsq+R)); else
+		     return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
+	} else {
+	    if(k==0) return f-s*(f-R); else
+		     return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_pow.c b/libm/upstream-freebsd/lib/msun/src/e_pow.c
new file mode 100644
index 0000000..d54af9d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_pow.c
@@ -0,0 +1,306 @@
+/* @(#)e_pow.c 1.5 04/04/22 SMI */
+/*
+ * ====================================================
+ * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_pow(x,y) return x**y
+ *
+ *		      n
+ * Method:  Let x =  2   * (1+f)
+ *	1. Compute and return log2(x) in two pieces:
+ *		log2(x) = w1 + w2,
+ *	   where w1 has 53-24 = 29 bit trailing zeros.
+ *	2. Perform y*log2(x) = n+y' by simulating multi-precision 
+ *	   arithmetic, where |y'|<=0.5.
+ *	3. Return x**y = 2**n*exp(y'*log2)
+ *
+ * Special cases:
+ *	1.  (anything) ** 0  is 1
+ *	2.  (anything) ** 1  is itself
+ *	3.  (anything) ** NAN is NAN except 1 ** NAN = 1
+ *	4.  NAN ** (anything except 0) is NAN
+ *	5.  +-(|x| > 1) **  +INF is +INF
+ *	6.  +-(|x| > 1) **  -INF is +0
+ *	7.  +-(|x| < 1) **  +INF is +0
+ *	8.  +-(|x| < 1) **  -INF is +INF
+ *	9.  +-1         ** +-INF is 1
+ *	10. +0 ** (+anything except 0, NAN)               is +0
+ *	11. -0 ** (+anything except 0, NAN, odd integer)  is +0
+ *	12. +0 ** (-anything except 0, NAN)               is +INF
+ *	13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
+ *	14. -0 ** (odd integer) = -( +0 ** (odd integer) )
+ *	15. +INF ** (+anything except 0,NAN) is +INF
+ *	16. +INF ** (-anything except 0,NAN) is +0
+ *	17. -INF ** (anything)  = -0 ** (-anything)
+ *	18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
+ *	19. (-anything except 0 and inf) ** (non-integer) is NAN
+ *
+ * Accuracy:
+ *	pow(x,y) returns x**y nearly rounded. In particular
+ *			pow(integer,integer)
+ *	always returns the correct integer provided it is 
+ *	representable.
+ *
+ * Constants :
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+bp[] = {1.0, 1.5,},
+dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
+dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
+zero    =  0.0,
+one	=  1.0,
+two	=  2.0,
+two53	=  9007199254740992.0,	/* 0x43400000, 0x00000000 */
+huge	=  1.0e300,
+tiny    =  1.0e-300,
+	/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
+L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
+L2  =  4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
+L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
+L4  =  2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
+L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
+L6  =  2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
+P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
+P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
+P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
+P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
+P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
+lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
+lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
+lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
+ovt =  8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
+cp    =  9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
+cp_h  =  9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
+cp_l  = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
+ivln2    =  1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
+ivln2_h  =  1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
+ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
+
+double
+__ieee754_pow(double x, double y)
+{
+	double z,ax,z_h,z_l,p_h,p_l;
+	double y1,t1,t2,r,s,t,u,v,w;
+	int32_t i,j,k,yisint,n;
+	int32_t hx,hy,ix,iy;
+	u_int32_t lx,ly;
+
+	EXTRACT_WORDS(hx,lx,x);
+	EXTRACT_WORDS(hy,ly,y);
+	ix = hx&0x7fffffff;  iy = hy&0x7fffffff;
+
+    /* y==zero: x**0 = 1 */
+	if((iy|ly)==0) return one; 	
+
+    /* x==1: 1**y = 1, even if y is NaN */
+	if (hx==0x3ff00000 && lx == 0) return one;
+
+    /* y!=zero: result is NaN if either arg is NaN */
+	if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
+	   iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) 
+		return (x+0.0)+(y+0.0);
+
+    /* determine if y is an odd int when x < 0
+     * yisint = 0	... y is not an integer
+     * yisint = 1	... y is an odd int
+     * yisint = 2	... y is an even int
+     */
+	yisint  = 0;
+	if(hx<0) {	
+	    if(iy>=0x43400000) yisint = 2; /* even integer y */
+	    else if(iy>=0x3ff00000) {
+		k = (iy>>20)-0x3ff;	   /* exponent */
+		if(k>20) {
+		    j = ly>>(52-k);
+		    if((j<<(52-k))==ly) yisint = 2-(j&1);
+		} else if(ly==0) {
+		    j = iy>>(20-k);
+		    if((j<<(20-k))==iy) yisint = 2-(j&1);
+		}
+	    }		
+	} 
+
+    /* special value of y */
+	if(ly==0) { 	
+	    if (iy==0x7ff00000) {	/* y is +-inf */
+	        if(((ix-0x3ff00000)|lx)==0)
+		    return  one;	/* (-1)**+-inf is 1 */
+	        else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
+		    return (hy>=0)? y: zero;
+	        else			/* (|x|<1)**-,+inf = inf,0 */
+		    return (hy<0)?-y: zero;
+	    } 
+	    if(iy==0x3ff00000) {	/* y is  +-1 */
+		if(hy<0) return one/x; else return x;
+	    }
+	    if(hy==0x40000000) return x*x; /* y is  2 */
+	    if(hy==0x3fe00000) {	/* y is  0.5 */
+		if(hx>=0)	/* x >= +0 */
+		return sqrt(x);	
+	    }
+	}
+
+	ax   = fabs(x);
+    /* special value of x */
+	if(lx==0) {
+	    if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
+		z = ax;			/*x is +-0,+-inf,+-1*/
+		if(hy<0) z = one/z;	/* z = (1/|x|) */
+		if(hx<0) {
+		    if(((ix-0x3ff00000)|yisint)==0) {
+			z = (z-z)/(z-z); /* (-1)**non-int is NaN */
+		    } else if(yisint==1) 
+			z = -z;		/* (x<0)**odd = -(|x|**odd) */
+		}
+		return z;
+	    }
+	}
+    
+    /* CYGNUS LOCAL + fdlibm-5.3 fix: This used to be
+	n = (hx>>31)+1;
+       but ANSI C says a right shift of a signed negative quantity is
+       implementation defined.  */
+	n = ((u_int32_t)hx>>31)-1;
+
+    /* (x<0)**(non-int) is NaN */
+	if((n|yisint)==0) return (x-x)/(x-x);
+
+	s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
+	if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */
+
+    /* |y| is huge */
+	if(iy>0x41e00000) { /* if |y| > 2**31 */
+	    if(iy>0x43f00000){	/* if |y| > 2**64, must o/uflow */
+		if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
+		if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
+	    }
+	/* over/underflow if x is not close to one */
+	    if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny;
+	    if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny;
+	/* now |1-x| is tiny <= 2**-20, suffice to compute 
+	   log(x) by x-x^2/2+x^3/3-x^4/4 */
+	    t = ax-one;		/* t has 20 trailing zeros */
+	    w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
+	    u = ivln2_h*t;	/* ivln2_h has 21 sig. bits */
+	    v = t*ivln2_l-w*ivln2;
+	    t1 = u+v;
+	    SET_LOW_WORD(t1,0);
+	    t2 = v-(t1-u);
+	} else {
+	    double ss,s2,s_h,s_l,t_h,t_l;
+	    n = 0;
+	/* take care subnormal number */
+	    if(ix<0x00100000)
+		{ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); }
+	    n  += ((ix)>>20)-0x3ff;
+	    j  = ix&0x000fffff;
+	/* determine interval */
+	    ix = j|0x3ff00000;		/* normalize ix */
+	    if(j<=0x3988E) k=0;		/* |x|<sqrt(3/2) */
+	    else if(j<0xBB67A) k=1;	/* |x|<sqrt(3)   */
+	    else {k=0;n+=1;ix -= 0x00100000;}
+	    SET_HIGH_WORD(ax,ix);
+
+	/* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+	    u = ax-bp[k];		/* bp[0]=1.0, bp[1]=1.5 */
+	    v = one/(ax+bp[k]);
+	    ss = u*v;
+	    s_h = ss;
+	    SET_LOW_WORD(s_h,0);
+	/* t_h=ax+bp[k] High */
+	    t_h = zero;
+	    SET_HIGH_WORD(t_h,((ix>>1)|0x20000000)+0x00080000+(k<<18));
+	    t_l = ax - (t_h-bp[k]);
+	    s_l = v*((u-s_h*t_h)-s_h*t_l);
+	/* compute log(ax) */
+	    s2 = ss*ss;
+	    r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
+	    r += s_l*(s_h+ss);
+	    s2  = s_h*s_h;
+	    t_h = 3.0+s2+r;
+	    SET_LOW_WORD(t_h,0);
+	    t_l = r-((t_h-3.0)-s2);
+	/* u+v = ss*(1+...) */
+	    u = s_h*t_h;
+	    v = s_l*t_h+t_l*ss;
+	/* 2/(3log2)*(ss+...) */
+	    p_h = u+v;
+	    SET_LOW_WORD(p_h,0);
+	    p_l = v-(p_h-u);
+	    z_h = cp_h*p_h;		/* cp_h+cp_l = 2/(3*log2) */
+	    z_l = cp_l*p_h+p_l*cp+dp_l[k];
+	/* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+	    t = (double)n;
+	    t1 = (((z_h+z_l)+dp_h[k])+t);
+	    SET_LOW_WORD(t1,0);
+	    t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+	}
+
+    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
+	y1  = y;
+	SET_LOW_WORD(y1,0);
+	p_l = (y-y1)*t1+y*t2;
+	p_h = y1*t1;
+	z = p_l+p_h;
+	EXTRACT_WORDS(j,i,z);
+	if (j>=0x40900000) {				/* z >= 1024 */
+	    if(((j-0x40900000)|i)!=0)			/* if z > 1024 */
+		return s*huge*huge;			/* overflow */
+	    else {
+		if(p_l+ovt>z-p_h) return s*huge*huge;	/* overflow */
+	    }
+	} else if((j&0x7fffffff)>=0x4090cc00 ) {	/* z <= -1075 */
+	    if(((j-0xc090cc00)|i)!=0) 		/* z < -1075 */
+		return s*tiny*tiny;		/* underflow */
+	    else {
+		if(p_l<=z-p_h) return s*tiny*tiny;	/* underflow */
+	    }
+	}
+    /*
+     * compute 2**(p_h+p_l)
+     */
+	i = j&0x7fffffff;
+	k = (i>>20)-0x3ff;
+	n = 0;
+	if(i>0x3fe00000) {		/* if |z| > 0.5, set n = [z+0.5] */
+	    n = j+(0x00100000>>(k+1));
+	    k = ((n&0x7fffffff)>>20)-0x3ff;	/* new k for n */
+	    t = zero;
+	    SET_HIGH_WORD(t,n&~(0x000fffff>>k));
+	    n = ((n&0x000fffff)|0x00100000)>>(20-k);
+	    if(j<0) n = -n;
+	    p_h -= t;
+	} 
+	t = p_l+p_h;
+	SET_LOW_WORD(t,0);
+	u = t*lg2_h;
+	v = (p_l-(t-p_h))*lg2+t*lg2_l;
+	z = u+v;
+	w = v-(z-u);
+	t  = z*z;
+	t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+	r  = (z*t1)/(t1-two)-(w+z*w);
+	z  = one-(r-z);
+	GET_HIGH_WORD(j,z);
+	j += (n<<20);
+	if((j>>20)<=0) z = scalbn(z,n);	/* subnormal output */
+	else SET_HIGH_WORD(z,j);
+	return s*z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_powf.c b/libm/upstream-freebsd/lib/msun/src/e_powf.c
new file mode 100644
index 0000000..5c46478
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_powf.c
@@ -0,0 +1,249 @@
+/* e_powf.c -- float version of e_pow.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+bp[] = {1.0, 1.5,},
+dp_h[] = { 0.0, 5.84960938e-01,}, /* 0x3f15c000 */
+dp_l[] = { 0.0, 1.56322085e-06,}, /* 0x35d1cfdc */
+zero    =  0.0,
+one	=  1.0,
+two	=  2.0,
+two24	=  16777216.0,	/* 0x4b800000 */
+huge	=  1.0e30,
+tiny    =  1.0e-30,
+	/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
+L1  =  6.0000002384e-01, /* 0x3f19999a */
+L2  =  4.2857143283e-01, /* 0x3edb6db7 */
+L3  =  3.3333334327e-01, /* 0x3eaaaaab */
+L4  =  2.7272811532e-01, /* 0x3e8ba305 */
+L5  =  2.3066075146e-01, /* 0x3e6c3255 */
+L6  =  2.0697501302e-01, /* 0x3e53f142 */
+P1   =  1.6666667163e-01, /* 0x3e2aaaab */
+P2   = -2.7777778450e-03, /* 0xbb360b61 */
+P3   =  6.6137559770e-05, /* 0x388ab355 */
+P4   = -1.6533901999e-06, /* 0xb5ddea0e */
+P5   =  4.1381369442e-08, /* 0x3331bb4c */
+lg2  =  6.9314718246e-01, /* 0x3f317218 */
+lg2_h  =  6.93145752e-01, /* 0x3f317200 */
+lg2_l  =  1.42860654e-06, /* 0x35bfbe8c */
+ovt =  4.2995665694e-08, /* -(128-log2(ovfl+.5ulp)) */
+cp    =  9.6179670095e-01, /* 0x3f76384f =2/(3ln2) */
+cp_h  =  9.6191406250e-01, /* 0x3f764000 =12b cp */
+cp_l  = -1.1736857402e-04, /* 0xb8f623c6 =tail of cp_h */
+ivln2    =  1.4426950216e+00, /* 0x3fb8aa3b =1/ln2 */
+ivln2_h  =  1.4426879883e+00, /* 0x3fb8aa00 =16b 1/ln2*/
+ivln2_l  =  7.0526075433e-06; /* 0x36eca570 =1/ln2 tail*/
+
+float
+__ieee754_powf(float x, float y)
+{
+	float z,ax,z_h,z_l,p_h,p_l;
+	float y1,t1,t2,r,s,sn,t,u,v,w;
+	int32_t i,j,k,yisint,n;
+	int32_t hx,hy,ix,iy,is;
+
+	GET_FLOAT_WORD(hx,x);
+	GET_FLOAT_WORD(hy,y);
+	ix = hx&0x7fffffff;  iy = hy&0x7fffffff;
+
+    /* y==zero: x**0 = 1 */
+	if(iy==0) return one;
+
+    /* x==1: 1**y = 1, even if y is NaN */
+	if (hx==0x3f800000) return one;
+
+    /* y!=zero: result is NaN if either arg is NaN */
+	if(ix > 0x7f800000 ||
+	   iy > 0x7f800000)
+		return (x+0.0F)+(y+0.0F);
+
+    /* determine if y is an odd int when x < 0
+     * yisint = 0	... y is not an integer
+     * yisint = 1	... y is an odd int
+     * yisint = 2	... y is an even int
+     */
+	yisint  = 0;
+	if(hx<0) {
+	    if(iy>=0x4b800000) yisint = 2; /* even integer y */
+	    else if(iy>=0x3f800000) {
+		k = (iy>>23)-0x7f;	   /* exponent */
+		j = iy>>(23-k);
+		if((j<<(23-k))==iy) yisint = 2-(j&1);
+	    }
+	}
+
+    /* special value of y */
+	if (iy==0x7f800000) {	/* y is +-inf */
+	    if (ix==0x3f800000)
+	        return  one;	/* (-1)**+-inf is NaN */
+	    else if (ix > 0x3f800000)/* (|x|>1)**+-inf = inf,0 */
+	        return (hy>=0)? y: zero;
+	    else			/* (|x|<1)**-,+inf = inf,0 */
+	        return (hy<0)?-y: zero;
+	}
+	if(iy==0x3f800000) {	/* y is  +-1 */
+	    if(hy<0) return one/x; else return x;
+	}
+	if(hy==0x40000000) return x*x; /* y is  2 */
+	if(hy==0x3f000000) {	/* y is  0.5 */
+	    if(hx>=0)	/* x >= +0 */
+	    return __ieee754_sqrtf(x);
+	}
+
+	ax   = fabsf(x);
+    /* special value of x */
+	if(ix==0x7f800000||ix==0||ix==0x3f800000){
+	    z = ax;			/*x is +-0,+-inf,+-1*/
+	    if(hy<0) z = one/z;	/* z = (1/|x|) */
+	    if(hx<0) {
+		if(((ix-0x3f800000)|yisint)==0) {
+		    z = (z-z)/(z-z); /* (-1)**non-int is NaN */
+		} else if(yisint==1)
+		    z = -z;		/* (x<0)**odd = -(|x|**odd) */
+	    }
+	    return z;
+	}
+
+	n = ((u_int32_t)hx>>31)-1;
+
+    /* (x<0)**(non-int) is NaN */
+	if((n|yisint)==0) return (x-x)/(x-x);
+
+	sn = one; /* s (sign of result -ve**odd) = -1 else = 1 */
+	if((n|(yisint-1))==0) sn = -one;/* (-ve)**(odd int) */
+
+    /* |y| is huge */
+	if(iy>0x4d000000) { /* if |y| > 2**27 */
+	/* over/underflow if x is not close to one */
+	    if(ix<0x3f7ffff8) return (hy<0)? sn*huge*huge:sn*tiny*tiny;
+	    if(ix>0x3f800007) return (hy>0)? sn*huge*huge:sn*tiny*tiny;
+	/* now |1-x| is tiny <= 2**-20, suffice to compute
+	   log(x) by x-x^2/2+x^3/3-x^4/4 */
+	    t = ax-1;		/* t has 20 trailing zeros */
+	    w = (t*t)*((float)0.5-t*((float)0.333333333333-t*(float)0.25));
+	    u = ivln2_h*t;	/* ivln2_h has 16 sig. bits */
+	    v = t*ivln2_l-w*ivln2;
+	    t1 = u+v;
+	    GET_FLOAT_WORD(is,t1);
+	    SET_FLOAT_WORD(t1,is&0xfffff000);
+	    t2 = v-(t1-u);
+	} else {
+	    float s2,s_h,s_l,t_h,t_l;
+	    n = 0;
+	/* take care subnormal number */
+	    if(ix<0x00800000)
+		{ax *= two24; n -= 24; GET_FLOAT_WORD(ix,ax); }
+	    n  += ((ix)>>23)-0x7f;
+	    j  = ix&0x007fffff;
+	/* determine interval */
+	    ix = j|0x3f800000;		/* normalize ix */
+	    if(j<=0x1cc471) k=0;	/* |x|<sqrt(3/2) */
+	    else if(j<0x5db3d7) k=1;	/* |x|<sqrt(3)   */
+	    else {k=0;n+=1;ix -= 0x00800000;}
+	    SET_FLOAT_WORD(ax,ix);
+
+	/* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+	    u = ax-bp[k];		/* bp[0]=1.0, bp[1]=1.5 */
+	    v = one/(ax+bp[k]);
+	    s = u*v;
+	    s_h = s;
+	    GET_FLOAT_WORD(is,s_h);
+	    SET_FLOAT_WORD(s_h,is&0xfffff000);
+	/* t_h=ax+bp[k] High */
+	    is = ((ix>>1)&0xfffff000)|0x20000000;
+	    SET_FLOAT_WORD(t_h,is+0x00400000+(k<<21));
+	    t_l = ax - (t_h-bp[k]);
+	    s_l = v*((u-s_h*t_h)-s_h*t_l);
+	/* compute log(ax) */
+	    s2 = s*s;
+	    r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
+	    r += s_l*(s_h+s);
+	    s2  = s_h*s_h;
+	    t_h = (float)3.0+s2+r;
+	    GET_FLOAT_WORD(is,t_h);
+	    SET_FLOAT_WORD(t_h,is&0xfffff000);
+	    t_l = r-((t_h-(float)3.0)-s2);
+	/* u+v = s*(1+...) */
+	    u = s_h*t_h;
+	    v = s_l*t_h+t_l*s;
+	/* 2/(3log2)*(s+...) */
+	    p_h = u+v;
+	    GET_FLOAT_WORD(is,p_h);
+	    SET_FLOAT_WORD(p_h,is&0xfffff000);
+	    p_l = v-(p_h-u);
+	    z_h = cp_h*p_h;		/* cp_h+cp_l = 2/(3*log2) */
+	    z_l = cp_l*p_h+p_l*cp+dp_l[k];
+	/* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+	    t = (float)n;
+	    t1 = (((z_h+z_l)+dp_h[k])+t);
+	    GET_FLOAT_WORD(is,t1);
+	    SET_FLOAT_WORD(t1,is&0xfffff000);
+	    t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+	}
+
+    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
+	GET_FLOAT_WORD(is,y);
+	SET_FLOAT_WORD(y1,is&0xfffff000);
+	p_l = (y-y1)*t1+y*t2;
+	p_h = y1*t1;
+	z = p_l+p_h;
+	GET_FLOAT_WORD(j,z);
+	if (j>0x43000000)				/* if z > 128 */
+	    return sn*huge*huge;			/* overflow */
+	else if (j==0x43000000) {			/* if z == 128 */
+	    if(p_l+ovt>z-p_h) return sn*huge*huge;	/* overflow */
+	}
+	else if ((j&0x7fffffff)>0x43160000)		/* z <= -150 */
+	    return sn*tiny*tiny;			/* underflow */
+	else if (j==0xc3160000){			/* z == -150 */
+	    if(p_l<=z-p_h) return sn*tiny*tiny;		/* underflow */
+	}
+    /*
+     * compute 2**(p_h+p_l)
+     */
+	i = j&0x7fffffff;
+	k = (i>>23)-0x7f;
+	n = 0;
+	if(i>0x3f000000) {		/* if |z| > 0.5, set n = [z+0.5] */
+	    n = j+(0x00800000>>(k+1));
+	    k = ((n&0x7fffffff)>>23)-0x7f;	/* new k for n */
+	    SET_FLOAT_WORD(t,n&~(0x007fffff>>k));
+	    n = ((n&0x007fffff)|0x00800000)>>(23-k);
+	    if(j<0) n = -n;
+	    p_h -= t;
+	}
+	t = p_l+p_h;
+	GET_FLOAT_WORD(is,t);
+	SET_FLOAT_WORD(t,is&0xffff8000);
+	u = t*lg2_h;
+	v = (p_l-(t-p_h))*lg2+t*lg2_l;
+	z = u+v;
+	w = v-(z-u);
+	t  = z*z;
+	t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+	r  = (z*t1)/(t1-two)-(w+z*w);
+	z  = one-(r-z);
+	GET_FLOAT_WORD(j,z);
+	j += (n<<23);
+	if((j>>23)<=0) z = scalbnf(z,n);	/* subnormal output */
+	else SET_FLOAT_WORD(z,j);
+	return sn*z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_rem_pio2.c b/libm/upstream-freebsd/lib/msun/src/e_rem_pio2.c
new file mode 100644
index 0000000..be2630b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_rem_pio2.c
@@ -0,0 +1,186 @@
+
+/* @(#)e_rem_pio2.c 1.4 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_rem_pio2(x,y)
+ * 
+ * return the remainder of x rem pi/2 in y[0]+y[1] 
+ * use __kernel_rem_pio2()
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * invpio2:  53 bits of 2/pi
+ * pio2_1:   first  33 bit of pi/2
+ * pio2_1t:  pi/2 - pio2_1
+ * pio2_2:   second 33 bit of pi/2
+ * pio2_2t:  pi/2 - (pio2_1+pio2_2)
+ * pio2_3:   third  33 bit of pi/2
+ * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
+ */
+
+static const double
+zero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
+two24 =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+pio2_1  =  1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
+pio2_1t =  6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
+pio2_2  =  6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
+pio2_2t =  2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
+pio2_3  =  2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
+pio2_3t =  8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
+
+#ifdef INLINE_REM_PIO2
+static __inline __always_inline
+#endif
+int
+__ieee754_rem_pio2(double x, double *y)
+{
+	double z,w,t,r,fn;
+	double tx[3],ty[2];
+	int32_t e0,i,j,nx,n,ix,hx;
+	u_int32_t low;
+
+	GET_HIGH_WORD(hx,x);		/* high word of x */
+	ix = hx&0x7fffffff;
+#if 0 /* Must be handled in caller. */
+	if(ix<=0x3fe921fb)   /* |x| ~<= pi/4 , no need for reduction */
+	    {y[0] = x; y[1] = 0; return 0;}
+#endif
+	if (ix <= 0x400f6a7a) {		/* |x| ~<= 5pi/4 */
+	    if ((ix & 0xfffff) == 0x921fb)  /* |x| ~= pi/2 or 2pi/2 */
+		goto medium;		/* cancellation -- use medium case */
+	    if (ix <= 0x4002d97c) {	/* |x| ~<= 3pi/4 */
+		if (hx > 0) {
+		    z = x - pio2_1;	/* one round good to 85 bits */
+		    y[0] = z - pio2_1t;
+		    y[1] = (z-y[0])-pio2_1t;
+		    return 1;
+		} else {
+		    z = x + pio2_1;
+		    y[0] = z + pio2_1t;
+		    y[1] = (z-y[0])+pio2_1t;
+		    return -1;
+		}
+	    } else {
+		if (hx > 0) {
+		    z = x - 2*pio2_1;
+		    y[0] = z - 2*pio2_1t;
+		    y[1] = (z-y[0])-2*pio2_1t;
+		    return 2;
+		} else {
+		    z = x + 2*pio2_1;
+		    y[0] = z + 2*pio2_1t;
+		    y[1] = (z-y[0])+2*pio2_1t;
+		    return -2;
+		}
+	    }
+	}
+	if (ix <= 0x401c463b) {		/* |x| ~<= 9pi/4 */
+	    if (ix <= 0x4015fdbc) {	/* |x| ~<= 7pi/4 */
+		if (ix == 0x4012d97c)	/* |x| ~= 3pi/2 */
+		    goto medium;
+		if (hx > 0) {
+		    z = x - 3*pio2_1;
+		    y[0] = z - 3*pio2_1t;
+		    y[1] = (z-y[0])-3*pio2_1t;
+		    return 3;
+		} else {
+		    z = x + 3*pio2_1;
+		    y[0] = z + 3*pio2_1t;
+		    y[1] = (z-y[0])+3*pio2_1t;
+		    return -3;
+		}
+	    } else {
+		if (ix == 0x401921fb)	/* |x| ~= 4pi/2 */
+		    goto medium;
+		if (hx > 0) {
+		    z = x - 4*pio2_1;
+		    y[0] = z - 4*pio2_1t;
+		    y[1] = (z-y[0])-4*pio2_1t;
+		    return 4;
+		} else {
+		    z = x + 4*pio2_1;
+		    y[0] = z + 4*pio2_1t;
+		    y[1] = (z-y[0])+4*pio2_1t;
+		    return -4;
+		}
+	    }
+	}
+	if(ix<0x413921fb) {	/* |x| ~< 2^20*(pi/2), medium size */
+medium:
+	    /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
+	    STRICT_ASSIGN(double,fn,x*invpio2+0x1.8p52);
+	    fn = fn-0x1.8p52;
+#ifdef HAVE_EFFICIENT_IRINT
+	    n  = irint(fn);
+#else
+	    n  = (int32_t)fn;
+#endif
+	    r  = x-fn*pio2_1;
+	    w  = fn*pio2_1t;	/* 1st round good to 85 bit */
+	    {
+	        u_int32_t high;
+	        j  = ix>>20;
+	        y[0] = r-w; 
+		GET_HIGH_WORD(high,y[0]);
+	        i = j-((high>>20)&0x7ff);
+	        if(i>16) {  /* 2nd iteration needed, good to 118 */
+		    t  = r;
+		    w  = fn*pio2_2;	
+		    r  = t-w;
+		    w  = fn*pio2_2t-((t-r)-w);	
+		    y[0] = r-w;
+		    GET_HIGH_WORD(high,y[0]);
+		    i = j-((high>>20)&0x7ff);
+		    if(i>49)  {	/* 3rd iteration need, 151 bits acc */
+		    	t  = r;	/* will cover all possible cases */
+		    	w  = fn*pio2_3;	
+		    	r  = t-w;
+		    	w  = fn*pio2_3t-((t-r)-w);	
+		    	y[0] = r-w;
+		    }
+		}
+	    }
+	    y[1] = (r-y[0])-w;
+	    return n;
+	}
+    /* 
+     * all other (large) arguments
+     */
+	if(ix>=0x7ff00000) {		/* x is inf or NaN */
+	    y[0]=y[1]=x-x; return 0;
+	}
+    /* set z = scalbn(|x|,ilogb(x)-23) */
+	GET_LOW_WORD(low,x);
+	e0 	= (ix>>20)-1046;	/* e0 = ilogb(z)-23; */
+	INSERT_WORDS(z, ix - ((int32_t)(e0<<20)), low);
+	for(i=0;i<2;i++) {
+		tx[i] = (double)((int32_t)(z));
+		z     = (z-tx[i])*two24;
+	}
+	tx[2] = z;
+	nx = 3;
+	while(tx[nx-1]==zero) nx--;	/* skip zero term */
+	n  =  __kernel_rem_pio2(tx,ty,e0,nx,1);
+	if(hx<0) {y[0] = -ty[0]; y[1] = -ty[1]; return -n;}
+	y[0] = ty[0]; y[1] = ty[1]; return n;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_rem_pio2f.c b/libm/upstream-freebsd/lib/msun/src/e_rem_pio2f.c
new file mode 100644
index 0000000..f1ee7a0
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_rem_pio2f.c
@@ -0,0 +1,84 @@
+/* e_rem_pio2f.c -- float version of e_rem_pio2.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_rem_pio2f(x,y)
+ *
+ * return the remainder of x rem pi/2 in *y
+ * use double precision for everything except passing x
+ * use __kernel_rem_pio2() for large x
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * invpio2:  53 bits of 2/pi
+ * pio2_1:   first 25 bits of pi/2
+ * pio2_1t:  pi/2 - pio2_1
+ */
+
+static const double
+invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
+pio2_1  =  1.57079631090164184570e+00, /* 0x3FF921FB, 0x50000000 */
+pio2_1t =  1.58932547735281966916e-08; /* 0x3E5110b4, 0x611A6263 */
+
+#ifdef INLINE_REM_PIO2F
+static __inline __always_inline
+#endif
+int
+__ieee754_rem_pio2f(float x, double *y)
+{
+	double w,r,fn;
+	double tx[1],ty[1];
+	float z;
+	int32_t e0,n,ix,hx;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+    /* 33+53 bit pi is good enough for medium size */
+	if(ix<0x4dc90fdb) {		/* |x| ~< 2^28*(pi/2), medium size */
+	    /* Use a specialized rint() to get fn.  Assume round-to-nearest. */
+	    STRICT_ASSIGN(double,fn,x*invpio2+0x1.8p52);
+	    fn = fn-0x1.8p52;
+#ifdef HAVE_EFFICIENT_IRINT
+	    n  = irint(fn);
+#else
+	    n  = (int32_t)fn;
+#endif
+	    r  = x-fn*pio2_1;
+	    w  = fn*pio2_1t;
+	    *y = r-w;
+	    return n;
+	}
+    /*
+     * all other (large) arguments
+     */
+	if(ix>=0x7f800000) {		/* x is inf or NaN */
+	    *y=x-x; return 0;
+	}
+    /* set z = scalbn(|x|,ilogb(|x|)-23) */
+	e0 = (ix>>23)-150;		/* e0 = ilogb(|x|)-23; */
+	SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
+	tx[0] = z;
+	n  =  __kernel_rem_pio2(tx,ty,e0,1,0);
+	if(hx<0) {*y = -ty[0]; return -n;}
+	*y = ty[0]; return n;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_remainder.c b/libm/upstream-freebsd/lib/msun/src/e_remainder.c
new file mode 100644
index 0000000..9be513b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_remainder.c
@@ -0,0 +1,79 @@
+
+/* @(#)e_remainder.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_remainder(x,p)
+ * Return :                  
+ * 	returns  x REM p  =  x - [x/p]*p as if in infinite 
+ * 	precise arithmetic, where [x/p] is the (infinite bit) 
+ *	integer nearest x/p (in half way case choose the even one).
+ * Method : 
+ *	Based on fmod() return x-[x/p]chopped*p exactlp.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double zero = 0.0;
+
+
+double
+__ieee754_remainder(double x, double p)
+{
+	int32_t hx,hp;
+	u_int32_t sx,lx,lp;
+	double p_half;
+
+	EXTRACT_WORDS(hx,lx,x);
+	EXTRACT_WORDS(hp,lp,p);
+	sx = hx&0x80000000;
+	hp &= 0x7fffffff;
+	hx &= 0x7fffffff;
+
+    /* purge off exception values */
+	if((hp|lp)==0) return (x*p)/(x*p); 	/* p = 0 */
+	if((hx>=0x7ff00000)||			/* x not finite */
+	  ((hp>=0x7ff00000)&&			/* p is NaN */
+	  (((hp-0x7ff00000)|lp)!=0)))
+	    return ((long double)x*p)/((long double)x*p);
+
+
+	if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p);	/* now x < 2p */
+	if (((hx-hp)|(lx-lp))==0) return zero*x;
+	x  = fabs(x);
+	p  = fabs(p);
+	if (hp<0x00200000) {
+	    if(x+x>p) {
+		x-=p;
+		if(x+x>=p) x -= p;
+	    }
+	} else {
+	    p_half = 0.5*p;
+	    if(x>p_half) {
+		x-=p;
+		if(x>=p_half) x -= p;
+	    }
+	}
+	GET_HIGH_WORD(hx,x);
+	if ((hx&0x7fffffff)==0) hx = 0;
+	SET_HIGH_WORD(x,hx^sx);
+	return x;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(remainder, remainderl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_remainderf.c b/libm/upstream-freebsd/lib/msun/src/e_remainderf.c
new file mode 100644
index 0000000..b0014ae
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_remainderf.c
@@ -0,0 +1,65 @@
+/* e_remainderf.c -- float version of e_remainder.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float zero = 0.0;
+
+
+float
+__ieee754_remainderf(float x, float p)
+{
+	int32_t hx,hp;
+	u_int32_t sx;
+	float p_half;
+
+	GET_FLOAT_WORD(hx,x);
+	GET_FLOAT_WORD(hp,p);
+	sx = hx&0x80000000;
+	hp &= 0x7fffffff;
+	hx &= 0x7fffffff;
+
+    /* purge off exception values */
+	if(hp==0) return (x*p)/(x*p);	 	/* p = 0 */
+	if((hx>=0x7f800000)||			/* x not finite */
+	  ((hp>0x7f800000)))			/* p is NaN */
+	    return ((long double)x*p)/((long double)x*p);
+
+
+	if (hp<=0x7effffff) x = __ieee754_fmodf(x,p+p);	/* now x < 2p */
+	if ((hx-hp)==0) return zero*x;
+	x  = fabsf(x);
+	p  = fabsf(p);
+	if (hp<0x01000000) {
+	    if(x+x>p) {
+		x-=p;
+		if(x+x>=p) x -= p;
+	    }
+	} else {
+	    p_half = (float)0.5*p;
+	    if(x>p_half) {
+		x-=p;
+		if(x>=p_half) x -= p;
+	    }
+	}
+	GET_FLOAT_WORD(hx,x);
+	if ((hx&0x7fffffff)==0) hx = 0;
+	SET_FLOAT_WORD(x,hx^sx);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_remainderl.c b/libm/upstream-freebsd/lib/msun/src/e_remainderl.c
new file mode 100644
index 0000000..03327b8
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_remainderl.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+long double
+remainderl(long double x, long double y)
+{
+	int quo;
+
+	return (remquol(x, y, &quo));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_scalb.c b/libm/upstream-freebsd/lib/msun/src/e_scalb.c
new file mode 100644
index 0000000..c0a7b5b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_scalb.c
@@ -0,0 +1,47 @@
+
+/* @(#)e_scalb.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * __ieee754_scalb(x, fn) is provide for
+ * passing various standard test suite. One 
+ * should use scalbn() instead.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef _SCALB_INT
+double
+__ieee754_scalb(double x, int fn)
+#else
+double
+__ieee754_scalb(double x, double fn)
+#endif
+{
+#ifdef _SCALB_INT
+	return scalbn(x,fn);
+#else
+	if (isnan(x)||isnan(fn)) return x*fn;
+	if (!finite(fn)) {
+	    if(fn>0.0) return x*fn;
+	    else       return x/(-fn);
+	}
+	if (rint(fn)!=fn) return (fn-fn)/(fn-fn);
+	if ( fn > 65000.0) return scalbn(x, 65000);
+	if (-fn > 65000.0) return scalbn(x,-65000);
+	return scalbn(x,(int)fn);
+#endif
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_scalbf.c b/libm/upstream-freebsd/lib/msun/src/e_scalbf.c
new file mode 100644
index 0000000..d49e904
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_scalbf.c
@@ -0,0 +1,43 @@
+/* e_scalbf.c -- float version of e_scalb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef _SCALB_INT
+float
+__ieee754_scalbf(float x, int fn)
+#else
+float
+__ieee754_scalbf(float x, float fn)
+#endif
+{
+#ifdef _SCALB_INT
+	return scalbnf(x,fn);
+#else
+	if ((isnanf)(x)||(isnanf)(fn)) return x*fn;
+	if (!finitef(fn)) {
+	    if(fn>(float)0.0) return x*fn;
+	    else       return x/(-fn);
+	}
+	if (rintf(fn)!=fn) return (fn-fn)/(fn-fn);
+	if ( fn > (float)65000.0) return scalbnf(x, 65000);
+	if (-fn > (float)65000.0) return scalbnf(x,-65000);
+	return scalbnf(x,(int)fn);
+#endif
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sinh.c b/libm/upstream-freebsd/lib/msun/src/e_sinh.c
new file mode 100644
index 0000000..6c01f4a
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sinh.c
@@ -0,0 +1,79 @@
+
+/* @(#)e_sinh.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_sinh(x)
+ * Method : 
+ * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2
+ *	1. Replace x by |x| (sinh(-x) = -sinh(x)). 
+ *	2. 
+ *		                                    E + E/(E+1)
+ *	    0        <= x <= 22     :  sinh(x) := --------------, E=expm1(x)
+ *			       			        2
+ *
+ *	    22       <= x <= lnovft :  sinh(x) := exp(x)/2 
+ *	    lnovft   <= x <= ln2ovft:  sinh(x) := exp(x/2)/2 * exp(x/2)
+ *	    ln2ovft  <  x	    :  sinh(x) := x*shuge (overflow)
+ *
+ * Special cases:
+ *	sinh(x) is |x| if x is +INF, -INF, or NaN.
+ *	only sinh(0)=0 is exact for finite x.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0, shuge = 1.0e307;
+
+double
+__ieee754_sinh(double x)
+{
+	double t,h;
+	int32_t ix,jx;
+
+    /* High word of |x|. */
+	GET_HIGH_WORD(jx,x);
+	ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7ff00000) return x+x;	
+
+	h = 0.5;
+	if (jx<0) h = -h;
+    /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
+	if (ix < 0x40360000) {		/* |x|<22 */
+	    if (ix<0x3e300000) 		/* |x|<2**-28 */
+		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
+	    t = expm1(fabs(x));
+	    if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one));
+	    return h*(t+t/(t+one));
+	}
+
+    /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
+	if (ix < 0x40862E42)  return h*__ieee754_exp(fabs(x));
+
+    /* |x| in [log(maxdouble), overflowthresold] */
+	if (ix<=0x408633CE)
+	    return h*2.0*__ldexp_exp(fabs(x), -1);
+
+    /* |x| > overflowthresold, sinh(x) overflow */
+	return x*shuge;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(sinh, sinhl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sinhf.c b/libm/upstream-freebsd/lib/msun/src/e_sinhf.c
new file mode 100644
index 0000000..1be2dc3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sinhf.c
@@ -0,0 +1,56 @@
+/* e_sinhf.c -- float version of e_sinh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0, shuge = 1.0e37;
+
+float
+__ieee754_sinhf(float x)
+{
+	float t,h;
+	int32_t ix,jx;
+
+	GET_FLOAT_WORD(jx,x);
+	ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7f800000) return x+x;
+
+	h = 0.5;
+	if (jx<0) h = -h;
+    /* |x| in [0,9], return sign(x)*0.5*(E+E/(E+1))) */
+	if (ix < 0x41100000) {		/* |x|<9 */
+	    if (ix<0x39800000) 		/* |x|<2**-12 */
+		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
+	    t = expm1f(fabsf(x));
+	    if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
+	    return h*(t+t/(t+one));
+	}
+
+    /* |x| in [9, logf(maxfloat)] return 0.5*exp(|x|) */
+	if (ix < 0x42b17217)  return h*__ieee754_expf(fabsf(x));
+
+    /* |x| in [logf(maxfloat), overflowthresold] */
+	if (ix<=0x42b2d4fc)
+	    return h*2.0F*__ldexp_expf(fabsf(x), -1);
+
+    /* |x| > overflowthresold, sinh(x) overflow */
+	return x*shuge;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sinhl.c b/libm/upstream-freebsd/lib/msun/src/e_sinhl.c
new file mode 100644
index 0000000..ce7e333
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sinhl.c
@@ -0,0 +1,131 @@
+/* from: FreeBSD: head/lib/msun/src/e_sinhl.c XXX */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See e_sinh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const long double shuge = 0x1p16383L;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-1, 1], range ~[-6.6749e-22, 6.6749e-22]:
+ * |sinh(x)/x - s(x)| < 2**-70.3
+ */
+static const union IEEEl2bits
+S3u = LD80C(0xaaaaaaaaaaaaaaaa, -3,  1.66666666666666666658e-1L);
+#define	S3	S3u.e
+static const double
+S5  =  8.3333333333333332e-3,		/*  0x11111111111111.0p-59 */
+S7  =  1.9841269841270074e-4,		/*  0x1a01a01a01a070.0p-65 */
+S9  =  2.7557319223873889e-6,		/*  0x171de3a5565fe6.0p-71 */
+S11 =  2.5052108406704084e-8,		/*  0x1ae6456857530f.0p-78 */
+S13 =  1.6059042748655297e-10,		/*  0x161245fa910697.0p-85 */
+S15 =  7.6470006914396920e-13,		/*  0x1ae7ce4eff2792.0p-93 */
+S17 =  2.8346142308424267e-15;		/*  0x19882ce789ffc6.0p-101 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-1, 1], range ~[-2.9673e-36, 2.9673e-36]:
+ * |sinh(x)/x - s(x)| < 2**-118.0
+ */
+static const long double
+S3  =  1.66666666666666666666666666666666033e-1L,	/*  0x1555555555555555555555555553b.0p-115L */
+S5  =  8.33333333333333333333333333337643193e-3L,	/*  0x111111111111111111111111180f5.0p-119L */
+S7  =  1.98412698412698412698412697391263199e-4L,	/*  0x1a01a01a01a01a01a01a0176aad11.0p-125L */
+S9  =  2.75573192239858906525574406205464218e-6L,	/*  0x171de3a556c7338faac243aaa9592.0p-131L */
+S11 =  2.50521083854417187749675637460977997e-8L,	/*  0x1ae64567f544e38fe59b3380d7413.0p-138L */
+S13 =  1.60590438368216146368737762431552702e-10L,	/*  0x16124613a86d098059c7620850fc2.0p-145L */
+S15 =  7.64716373181980539786802470969096440e-13L,	/*  0x1ae7f3e733b814193af09ce723043.0p-153L */
+S17 =  2.81145725434775409870584280722701574e-15L;	/*  0x1952c77030c36898c3fd0b6dfc562.0p-161L */
+static const double
+S19=  8.2206352435411005e-18,		/*  0x12f49b4662b86d.0p-109 */
+S21=  1.9572943931418891e-20,		/*  0x171b8f2fab9628.0p-118 */
+S23 =  3.8679983530666939e-23,		/*  0x17617002b73afc.0p-127 */
+S25 =  6.5067867911512749e-26;		/*  0x1423352626048a.0p-136 */
+#else
+#error "Unsupported long double format"
+#endif /* LDBL_MANT_DIG == 64 */
+
+/* log(2**16385 - 0.5) rounded up: */
+static const float
+o_threshold =  1.13572168e4;		/*  0xb174de.0p-10 */
+
+long double
+sinhl(long double x)
+{
+	long double hi,lo,x2,x4;
+	double dx2,s;
+	int16_t ix,jx;
+
+	GET_LDBL_EXPSIGN(jx,x);
+	ix = jx&0x7fff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7fff) return x+x;
+
+	ENTERI();
+
+	s = 1;
+	if (jx<0) s = -1;
+
+    /* |x| < 64, return x, s(x), or accurate s*(exp(|x|)/2-1/exp(|x|)/2) */
+	if (ix<0x4005) {		/* |x|<64 */
+	    if (ix<BIAS-(LDBL_MANT_DIG+1)/2) 	/* |x|<TINY */
+		if(shuge+x>1) RETURNI(x);  /* sinh(tiny) = tiny with inexact */
+	    if (ix<0x3fff) {		/* |x|<1 */
+		x2 = x*x;
+#if LDBL_MANT_DIG == 64
+		x4 = x2*x2;
+		RETURNI(((S17*x2 + S15)*x4 + (S13*x2 + S11))*(x2*x*x4*x4) +
+		    ((S9*x2 + S7)*x2 + S5)*(x2*x*x2) + S3*(x2*x) + x);
+#elif LDBL_MANT_DIG == 113
+		dx2 = x2;
+		RETURNI(((((((((((S25*dx2 + S23)*dx2 +
+		    S21)*x2 + S19)*x2 +
+		    S17)*x2 + S15)*x2 + S13)*x2 + S11)*x2 + S9)*x2 + S7)*x2 +
+		    S5)* (x2*x*x2) +
+		    S3*(x2*x) + x);
+#endif
+	    }
+	    k_hexpl(fabsl(x), &hi, &lo);
+	    RETURNI(s*(lo - 0.25/(hi + lo) + hi));
+	}
+
+    /* |x| in [64, o_threshold], return correctly-overflowing s*exp(|x|)/2 */
+	if (fabsl(x) <= o_threshold)
+	    RETURNI(s*hexpl(fabsl(x)));
+
+    /* |x| > o_threshold, sinh(x) overflow */
+	return x*shuge;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sqrt.c b/libm/upstream-freebsd/lib/msun/src/e_sqrt.c
new file mode 100644
index 0000000..12fb56e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sqrt.c
@@ -0,0 +1,451 @@
+
+/* @(#)e_sqrt.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __ieee754_sqrt(x)
+ * Return correctly rounded sqrt.
+ *           ------------------------------------------
+ *	     |  Use the hardware sqrt if you have one |
+ *           ------------------------------------------
+ * Method: 
+ *   Bit by bit method using integer arithmetic. (Slow, but portable) 
+ *   1. Normalization
+ *	Scale x to y in [1,4) with even powers of 2: 
+ *	find an integer k such that  1 <= (y=x*2^(2k)) < 4, then
+ *		sqrt(x) = 2^k * sqrt(y)
+ *   2. Bit by bit computation
+ *	Let q  = sqrt(y) truncated to i bit after binary point (q = 1),
+ *	     i							 0
+ *                                     i+1         2
+ *	    s  = 2*q , and	y  =  2   * ( y - q  ).		(1)
+ *	     i      i            i                 i
+ *                                                        
+ *	To compute q    from q , one checks whether 
+ *		    i+1       i                       
+ *
+ *			      -(i+1) 2
+ *			(q + 2      ) <= y.			(2)
+ *     			  i
+ *							      -(i+1)
+ *	If (2) is false, then q   = q ; otherwise q   = q  + 2      .
+ *		 	       i+1   i             i+1   i
+ *
+ *	With some algebric manipulation, it is not difficult to see
+ *	that (2) is equivalent to 
+ *                             -(i+1)
+ *			s  +  2       <= y			(3)
+ *			 i                i
+ *
+ *	The advantage of (3) is that s  and y  can be computed by 
+ *				      i      i
+ *	the following recurrence formula:
+ *	    if (3) is false
+ *
+ *	    s     =  s  ,	y    = y   ;			(4)
+ *	     i+1      i		 i+1    i
+ *
+ *	    otherwise,
+ *                         -i                     -(i+1)
+ *	    s	  =  s  + 2  ,  y    = y  -  s  - 2  		(5)
+ *           i+1      i          i+1    i     i
+ *				
+ *	One may easily use induction to prove (4) and (5). 
+ *	Note. Since the left hand side of (3) contain only i+2 bits,
+ *	      it does not necessary to do a full (53-bit) comparison 
+ *	      in (3).
+ *   3. Final rounding
+ *	After generating the 53 bits result, we compute one more bit.
+ *	Together with the remainder, we can decide whether the
+ *	result is exact, bigger than 1/2ulp, or less than 1/2ulp
+ *	(it will never equal to 1/2ulp).
+ *	The rounding mode can be detected by checking whether
+ *	huge + tiny is equal to huge, and whether huge - tiny is
+ *	equal to huge for some floating point number "huge" and "tiny".
+ *		
+ * Special cases:
+ *	sqrt(+-0) = +-0 	... exact
+ *	sqrt(inf) = inf
+ *	sqrt(-ve) = NaN		... with invalid signal
+ *	sqrt(NaN) = NaN		... with invalid signal for signaling NaN
+ *
+ * Other methods : see the appended file at the end of the program below.
+ *---------------
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static	const double	one	= 1.0, tiny=1.0e-300;
+
+double
+__ieee754_sqrt(double x)
+{
+	double z;
+	int32_t sign = (int)0x80000000;
+	int32_t ix0,s0,q,m,t,i;
+	u_int32_t r,t1,s1,ix1,q1;
+
+	EXTRACT_WORDS(ix0,ix1,x);
+
+    /* take care of Inf and NaN */
+	if((ix0&0x7ff00000)==0x7ff00000) {			
+	    return x*x+x;		/* sqrt(NaN)=NaN, sqrt(+inf)=+inf
+					   sqrt(-inf)=sNaN */
+	} 
+    /* take care of zero */
+	if(ix0<=0) {
+	    if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
+	    else if(ix0<0)
+		return (x-x)/(x-x);		/* sqrt(-ve) = sNaN */
+	}
+    /* normalize x */
+	m = (ix0>>20);
+	if(m==0) {				/* subnormal x */
+	    while(ix0==0) {
+		m -= 21;
+		ix0 |= (ix1>>11); ix1 <<= 21;
+	    }
+	    for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
+	    m -= i-1;
+	    ix0 |= (ix1>>(32-i));
+	    ix1 <<= i;
+	}
+	m -= 1023;	/* unbias exponent */
+	ix0 = (ix0&0x000fffff)|0x00100000;
+	if(m&1){	/* odd m, double x to make it even */
+	    ix0 += ix0 + ((ix1&sign)>>31);
+	    ix1 += ix1;
+	}
+	m >>= 1;	/* m = [m/2] */
+
+    /* generate sqrt(x) bit by bit */
+	ix0 += ix0 + ((ix1&sign)>>31);
+	ix1 += ix1;
+	q = q1 = s0 = s1 = 0;	/* [q,q1] = sqrt(x) */
+	r = 0x00200000;		/* r = moving bit from right to left */
+
+	while(r!=0) {
+	    t = s0+r; 
+	    if(t<=ix0) { 
+		s0   = t+r; 
+		ix0 -= t; 
+		q   += r; 
+	    } 
+	    ix0 += ix0 + ((ix1&sign)>>31);
+	    ix1 += ix1;
+	    r>>=1;
+	}
+
+	r = sign;
+	while(r!=0) {
+	    t1 = s1+r; 
+	    t  = s0;
+	    if((t<ix0)||((t==ix0)&&(t1<=ix1))) { 
+		s1  = t1+r;
+		if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1;
+		ix0 -= t;
+		if (ix1 < t1) ix0 -= 1;
+		ix1 -= t1;
+		q1  += r;
+	    }
+	    ix0 += ix0 + ((ix1&sign)>>31);
+	    ix1 += ix1;
+	    r>>=1;
+	}
+
+    /* use floating add to find out rounding direction */
+	if((ix0|ix1)!=0) {
+	    z = one-tiny; /* trigger inexact flag */
+	    if (z>=one) {
+	        z = one+tiny;
+	        if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;}
+		else if (z>one) {
+		    if (q1==(u_int32_t)0xfffffffe) q+=1;
+		    q1+=2; 
+		} else
+	            q1 += (q1&1);
+	    }
+	}
+	ix0 = (q>>1)+0x3fe00000;
+	ix1 =  q1>>1;
+	if ((q&1)==1) ix1 |= sign;
+	ix0 += (m <<20);
+	INSERT_WORDS(z,ix0,ix1);
+	return z;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(sqrt, sqrtl);
+#endif
+
+/*
+Other methods  (use floating-point arithmetic)
+-------------
+(This is a copy of a drafted paper by Prof W. Kahan 
+and K.C. Ng, written in May, 1986)
+
+	Two algorithms are given here to implement sqrt(x) 
+	(IEEE double precision arithmetic) in software.
+	Both supply sqrt(x) correctly rounded. The first algorithm (in
+	Section A) uses newton iterations and involves four divisions.
+	The second one uses reciproot iterations to avoid division, but
+	requires more multiplications. Both algorithms need the ability
+	to chop results of arithmetic operations instead of round them, 
+	and the INEXACT flag to indicate when an arithmetic operation
+	is executed exactly with no roundoff error, all part of the 
+	standard (IEEE 754-1985). The ability to perform shift, add,
+	subtract and logical AND operations upon 32-bit words is needed
+	too, though not part of the standard.
+
+A.  sqrt(x) by Newton Iteration
+
+   (1)	Initial approximation
+
+	Let x0 and x1 be the leading and the trailing 32-bit words of
+	a floating point number x (in IEEE double format) respectively 
+
+	    1    11		     52				  ...widths
+	   ------------------------------------------------------
+	x: |s|	  e     |	      f				|
+	   ------------------------------------------------------
+	      msb    lsb  msb				      lsb ...order
+
+ 
+	     ------------------------  	     ------------------------
+	x0:  |s|   e    |    f1     |	 x1: |          f2           |
+	     ------------------------  	     ------------------------
+
+	By performing shifts and subtracts on x0 and x1 (both regarded
+	as integers), we obtain an 8-bit approximation of sqrt(x) as
+	follows.
+
+		k  := (x0>>1) + 0x1ff80000;
+		y0 := k - T1[31&(k>>15)].	... y ~ sqrt(x) to 8 bits
+	Here k is a 32-bit integer and T1[] is an integer array containing
+	correction terms. Now magically the floating value of y (y's
+	leading 32-bit word is y0, the value of its trailing word is 0)
+	approximates sqrt(x) to almost 8-bit.
+
+	Value of T1:
+	static int T1[32]= {
+	0,	1024,	3062,	5746,	9193,	13348,	18162,	23592,
+	29598,	36145,	43202,	50740,	58733,	67158,	75992,	85215,
+	83599,	71378,	60428,	50647,	41945,	34246,	27478,	21581,
+	16499,	12183,	8588,	5674,	3403,	1742,	661,	130,};
+
+    (2)	Iterative refinement
+
+	Apply Heron's rule three times to y, we have y approximates 
+	sqrt(x) to within 1 ulp (Unit in the Last Place):
+
+		y := (y+x/y)/2		... almost 17 sig. bits
+		y := (y+x/y)/2		... almost 35 sig. bits
+		y := y-(y-x/y)/2	... within 1 ulp
+
+
+	Remark 1.
+	    Another way to improve y to within 1 ulp is:
+
+		y := (y+x/y)		... almost 17 sig. bits to 2*sqrt(x)
+		y := y - 0x00100006	... almost 18 sig. bits to sqrt(x)
+
+				2
+			    (x-y )*y
+		y := y + 2* ----------	...within 1 ulp
+			       2
+			     3y  + x
+
+
+	This formula has one division fewer than the one above; however,
+	it requires more multiplications and additions. Also x must be
+	scaled in advance to avoid spurious overflow in evaluating the
+	expression 3y*y+x. Hence it is not recommended uless division
+	is slow. If division is very slow, then one should use the 
+	reciproot algorithm given in section B.
+
+    (3) Final adjustment
+
+	By twiddling y's last bit it is possible to force y to be 
+	correctly rounded according to the prevailing rounding mode
+	as follows. Let r and i be copies of the rounding mode and
+	inexact flag before entering the square root program. Also we
+	use the expression y+-ulp for the next representable floating
+	numbers (up and down) of y. Note that y+-ulp = either fixed
+	point y+-1, or multiply y by nextafter(1,+-inf) in chopped
+	mode.
+
+		I := FALSE;	... reset INEXACT flag I
+		R := RZ;	... set rounding mode to round-toward-zero
+		z := x/y;	... chopped quotient, possibly inexact
+		If(not I) then {	... if the quotient is exact
+		    if(z=y) {
+		        I := i;	 ... restore inexact flag
+		        R := r;  ... restore rounded mode
+		        return sqrt(x):=y.
+		    } else {
+			z := z - ulp;	... special rounding
+		    }
+		}
+		i := TRUE;		... sqrt(x) is inexact
+		If (r=RN) then z=z+ulp	... rounded-to-nearest
+		If (r=RP) then {	... round-toward-+inf
+		    y = y+ulp; z=z+ulp;
+		}
+		y := y+z;		... chopped sum
+		y0:=y0-0x00100000;	... y := y/2 is correctly rounded.
+	        I := i;	 		... restore inexact flag
+	        R := r;  		... restore rounded mode
+	        return sqrt(x):=y.
+		    
+    (4)	Special cases
+
+	Square root of +inf, +-0, or NaN is itself;
+	Square root of a negative number is NaN with invalid signal.
+
+
+B.  sqrt(x) by Reciproot Iteration
+
+   (1)	Initial approximation
+
+	Let x0 and x1 be the leading and the trailing 32-bit words of
+	a floating point number x (in IEEE double format) respectively
+	(see section A). By performing shifs and subtracts on x0 and y0,
+	we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
+
+	    k := 0x5fe80000 - (x0>>1);
+	    y0:= k - T2[63&(k>>14)].	... y ~ 1/sqrt(x) to 7.8 bits
+
+	Here k is a 32-bit integer and T2[] is an integer array 
+	containing correction terms. Now magically the floating
+	value of y (y's leading 32-bit word is y0, the value of
+	its trailing word y1 is set to zero) approximates 1/sqrt(x)
+	to almost 7.8-bit.
+
+	Value of T2:
+	static int T2[64]= {
+	0x1500,	0x2ef8,	0x4d67,	0x6b02,	0x87be,	0xa395,	0xbe7a,	0xd866,
+	0xf14a,	0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
+	0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
+	0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
+	0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
+	0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
+	0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
+	0x1527f,0x1334a,0x11051,0xe951,	0xbe01,	0x8e0d,	0x5924,	0x1edd,};
+
+    (2)	Iterative refinement
+
+	Apply Reciproot iteration three times to y and multiply the
+	result by x to get an approximation z that matches sqrt(x)
+	to about 1 ulp. To be exact, we will have 
+		-1ulp < sqrt(x)-z<1.0625ulp.
+	
+	... set rounding mode to Round-to-nearest
+	   y := y*(1.5-0.5*x*y*y)	... almost 15 sig. bits to 1/sqrt(x)
+	   y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
+	... special arrangement for better accuracy
+	   z := x*y			... 29 bits to sqrt(x), with z*y<1
+	   z := z + 0.5*z*(1-z*y)	... about 1 ulp to sqrt(x)
+
+	Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
+	(a) the term z*y in the final iteration is always less than 1; 
+	(b) the error in the final result is biased upward so that
+		-1 ulp < sqrt(x) - z < 1.0625 ulp
+	    instead of |sqrt(x)-z|<1.03125ulp.
+
+    (3)	Final adjustment
+
+	By twiddling y's last bit it is possible to force y to be 
+	correctly rounded according to the prevailing rounding mode
+	as follows. Let r and i be copies of the rounding mode and
+	inexact flag before entering the square root program. Also we
+	use the expression y+-ulp for the next representable floating
+	numbers (up and down) of y. Note that y+-ulp = either fixed
+	point y+-1, or multiply y by nextafter(1,+-inf) in chopped
+	mode.
+
+	R := RZ;		... set rounding mode to round-toward-zero
+	switch(r) {
+	    case RN:		... round-to-nearest
+	       if(x<= z*(z-ulp)...chopped) z = z - ulp; else
+	       if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
+	       break;
+	    case RZ:case RM:	... round-to-zero or round-to--inf
+	       R:=RP;		... reset rounding mod to round-to-+inf
+	       if(x<z*z ... rounded up) z = z - ulp; else
+	       if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
+	       break;
+	    case RP:		... round-to-+inf
+	       if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
+	       if(x>z*z ...chopped) z = z+ulp;
+	       break;
+	}
+
+	Remark 3. The above comparisons can be done in fixed point. For
+	example, to compare x and w=z*z chopped, it suffices to compare
+	x1 and w1 (the trailing parts of x and w), regarding them as
+	two's complement integers.
+
+	...Is z an exact square root?
+	To determine whether z is an exact square root of x, let z1 be the
+	trailing part of z, and also let x0 and x1 be the leading and
+	trailing parts of x.
+
+	If ((z1&0x03ffffff)!=0)	... not exact if trailing 26 bits of z!=0
+	    I := 1;		... Raise Inexact flag: z is not exact
+	else {
+	    j := 1 - [(x0>>20)&1]	... j = logb(x) mod 2
+	    k := z1 >> 26;		... get z's 25-th and 26-th 
+					    fraction bits
+	    I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
+	}
+	R:= r		... restore rounded mode
+	return sqrt(x):=z.
+
+	If multiplication is cheaper then the foregoing red tape, the 
+	Inexact flag can be evaluated by
+
+	    I := i;
+	    I := (z*z!=x) or I.
+
+	Note that z*z can overwrite I; this value must be sensed if it is 
+	True.
+
+	Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
+	zero.
+
+		    --------------------
+		z1: |        f2        | 
+		    --------------------
+		bit 31		   bit 0
+
+	Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
+	or even of logb(x) have the following relations:
+
+	-------------------------------------------------
+	bit 27,26 of z1		bit 1,0 of x1	logb(x)
+	-------------------------------------------------
+	00			00		odd and even
+	01			01		even
+	10			10		odd
+	10			00		even
+	11			01		even
+	-------------------------------------------------
+
+    (4)	Special cases (see (4) of Section A).	
+ 
+ */
+ 
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c b/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c
new file mode 100644
index 0000000..7eba4d0
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sqrtf.c
@@ -0,0 +1,89 @@
+/* e_sqrtf.c -- float version of e_sqrt.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+static	const float	one	= 1.0, tiny=1.0e-30;
+
+float
+__ieee754_sqrtf(float x)
+{
+	float z;
+	int32_t sign = (int)0x80000000;
+	int32_t ix,s,q,m,t,i;
+	u_int32_t r;
+
+	GET_FLOAT_WORD(ix,x);
+
+    /* take care of Inf and NaN */
+	if((ix&0x7f800000)==0x7f800000) {
+	    return x*x+x;		/* sqrt(NaN)=NaN, sqrt(+inf)=+inf
+					   sqrt(-inf)=sNaN */
+	}
+    /* take care of zero */
+	if(ix<=0) {
+	    if((ix&(~sign))==0) return x;/* sqrt(+-0) = +-0 */
+	    else if(ix<0)
+		return (x-x)/(x-x);		/* sqrt(-ve) = sNaN */
+	}
+    /* normalize x */
+	m = (ix>>23);
+	if(m==0) {				/* subnormal x */
+	    for(i=0;(ix&0x00800000)==0;i++) ix<<=1;
+	    m -= i-1;
+	}
+	m -= 127;	/* unbias exponent */
+	ix = (ix&0x007fffff)|0x00800000;
+	if(m&1)	/* odd m, double x to make it even */
+	    ix += ix;
+	m >>= 1;	/* m = [m/2] */
+
+    /* generate sqrt(x) bit by bit */
+	ix += ix;
+	q = s = 0;		/* q = sqrt(x) */
+	r = 0x01000000;		/* r = moving bit from right to left */
+
+	while(r!=0) {
+	    t = s+r;
+	    if(t<=ix) {
+		s    = t+r;
+		ix  -= t;
+		q   += r;
+	    }
+	    ix += ix;
+	    r>>=1;
+	}
+
+    /* use floating add to find out rounding direction */
+	if(ix!=0) {
+	    z = one-tiny; /* trigger inexact flag */
+	    if (z>=one) {
+	        z = one+tiny;
+		if (z>one)
+		    q += 2;
+		else
+		    q += (q&1);
+	    }
+	}
+	ix = (q>>1)+0x3f000000;
+	ix += (m <<23);
+	SET_FLOAT_WORD(z,ix);
+	return z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_sqrtl.c b/libm/upstream-freebsd/lib/msun/src/e_sqrtl.c
new file mode 100644
index 0000000..92b84de
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/e_sqrtl.c
@@ -0,0 +1,159 @@
+/*-
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+
+/* Return (x + ulp) for normal positive x. Assumes no overflow. */
+static inline long double
+inc(long double x)
+{
+	union IEEEl2bits u;
+
+	u.e = x;
+	if (++u.bits.manl == 0) {
+		if (++u.bits.manh == 0) {
+			u.bits.exp++;
+			u.bits.manh |= LDBL_NBIT;
+		}
+	}
+	return (u.e);
+}
+
+/* Return (x - ulp) for normal positive x. Assumes no underflow. */
+static inline long double
+dec(long double x)
+{
+	union IEEEl2bits u;
+
+	u.e = x;
+	if (u.bits.manl-- == 0) {
+		if (u.bits.manh-- == LDBL_NBIT) {
+			u.bits.exp--;
+			u.bits.manh |= LDBL_NBIT;
+		}
+	}
+	return (u.e);
+}
+
+#pragma STDC FENV_ACCESS ON
+
+/*
+ * This is slow, but simple and portable. You should use hardware sqrt
+ * if possible.
+ */
+
+long double
+sqrtl(long double x)
+{
+	union IEEEl2bits u;
+	int k, r;
+	long double lo, xn;
+	fenv_t env;
+
+	u.e = x;
+
+	/* If x = NaN, then sqrt(x) = NaN. */
+	/* If x = Inf, then sqrt(x) = Inf. */
+	/* If x = -Inf, then sqrt(x) = NaN. */
+	if (u.bits.exp == LDBL_MAX_EXP * 2 - 1)
+		return (x * x + x);
+
+	/* If x = +-0, then sqrt(x) = +-0. */
+	if ((u.bits.manh | u.bits.manl | u.bits.exp) == 0)
+		return (x);
+
+	/* If x < 0, then raise invalid and return NaN */
+	if (u.bits.sign)
+		return ((x - x) / (x - x));
+
+	feholdexcept(&env);
+
+	if (u.bits.exp == 0) {
+		/* Adjust subnormal numbers. */
+		u.e *= 0x1.0p514;
+		k = -514;
+	} else {
+		k = 0;
+	}
+	/*
+	 * u.e is a normal number, so break it into u.e = e*2^n where
+	 * u.e = (2*e)*2^2k for odd n and u.e = (4*e)*2^2k for even n.
+	 */
+	if ((u.bits.exp - 0x3ffe) & 1) {	/* n is odd.     */
+		k += u.bits.exp - 0x3fff;	/* 2k = n - 1.   */
+		u.bits.exp = 0x3fff;		/* u.e in [1,2). */
+	} else {
+		k += u.bits.exp - 0x4000;	/* 2k = n - 2.   */
+		u.bits.exp = 0x4000;		/* u.e in [2,4). */
+	}
+
+	/*
+	 * Newton's iteration.
+	 * Split u.e into a high and low part to achieve additional precision.
+	 */
+	xn = sqrt(u.e);			/* 53-bit estimate of sqrtl(x). */
+#if LDBL_MANT_DIG > 100
+	xn = (xn + (u.e / xn)) * 0.5;	/* 106-bit estimate. */
+#endif
+	lo = u.e;
+	u.bits.manl = 0;		/* Zero out lower bits. */
+	lo = (lo - u.e) / xn;		/* Low bits divided by xn. */
+	xn = xn + (u.e / xn);		/* High portion of estimate. */
+	u.e = xn + lo;			/* Combine everything. */
+	u.bits.exp += (k >> 1) - 1;
+
+	feclearexcept(FE_INEXACT);
+	r = fegetround();
+	fesetround(FE_TOWARDZERO);	/* Set to round-toward-zero. */
+	xn = x / u.e;			/* Chopped quotient (inexact?). */
+
+	if (!fetestexcept(FE_INEXACT)) { /* Quotient is exact. */
+		if (xn == u.e) {
+			fesetenv(&env);
+			return (u.e);
+		}
+		/* Round correctly for inputs like x = y**2 - ulp. */
+		xn = dec(xn);		/* xn = xn - ulp. */
+	}
+
+	if (r == FE_TONEAREST) {
+		xn = inc(xn);		/* xn = xn + ulp. */
+	} else if (r == FE_UPWARD) {
+		u.e = inc(u.e);		/* u.e = u.e + ulp. */
+		xn = inc(xn);		/* xn  = xn + ulp. */
+	}
+	u.e = u.e + xn;				/* Chopped sum. */
+	feupdateenv(&env);	/* Restore env and raise inexact */
+	u.bits.exp--;
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/imprecise.c b/libm/upstream-freebsd/lib/msun/src/imprecise.c
new file mode 100644
index 0000000..08cd239
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/imprecise.c
@@ -0,0 +1,63 @@
+/*-
+ * Copyright (c) 2013 David Chisnall
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+
+/*
+ * If long double is not the same size as double, then these will lose
+ * precision and we should emit a warning whenever something links against
+ * them.
+ */
+#if (LDBL_MANT_DIG > 53)
+#define WARN_IMPRECISE(x) \
+	__warn_references(x, # x " has lower than advertised precision");
+#else
+#define WARN_IMPRECISE(x)
+#endif
+/*
+ * Declare the functions as weak variants so that other libraries providing
+ * real versions can override them.
+ */
+#define	DECLARE_WEAK(x)\
+	__weak_reference(imprecise_## x, x);\
+	WARN_IMPRECISE(x)
+
+long double
+imprecise_powl(long double x, long double y)
+{
+
+	return pow(x, y);
+}
+DECLARE_WEAK(powl);
+
+#define DECLARE_IMPRECISE(f) \
+	long double imprecise_ ## f ## l(long double v) { return f(v); }\
+	DECLARE_WEAK(f ## l)
+
+DECLARE_IMPRECISE(tgamma);
diff --git a/libm/upstream-freebsd/lib/msun/src/k_cos.c b/libm/upstream-freebsd/lib/msun/src/k_cos.c
new file mode 100644
index 0000000..c4702e6
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_cos.c
@@ -0,0 +1,79 @@
+
+/* @(#)k_cos.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * __kernel_cos( x,  y )
+ * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x. 
+ *
+ * Algorithm
+ *	1. Since cos(-x) = cos(x), we need only to consider positive x.
+ *	2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
+ *	3. cos(x) is approximated by a polynomial of degree 14 on
+ *	   [0,pi/4]
+ *		  	                 4            14
+ *	   	cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
+ *	   where the remez error is
+ *	
+ * 	|              2     4     6     8     10    12     14 |     -58
+ * 	|cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  )| <= 2
+ * 	|    					               | 
+ * 
+ * 	               4     6     8     10    12     14 
+ *	4. let r = C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  , then
+ *	       cos(x) ~ 1 - x*x/2 + r
+ *	   since cos(x+y) ~ cos(x) - sin(x)*y 
+ *			  ~ cos(x) - x*y,
+ *	   a correction term is necessary in cos(x) and hence
+ *		cos(x+y) = 1 - (x*x/2 - (r - x*y))
+ *	   For better accuracy, rearrange to
+ *		cos(x+y) ~ w + (tmp + (r-x*y))
+ *	   where w = 1 - x*x/2 and tmp is a tiny correction term
+ *	   (1 - x*x/2 == w + tmp exactly in infinite precision).
+ *	   The exactness of w + tmp in infinite precision depends on w
+ *	   and tmp having the same precision as x.  If they have extra
+ *	   precision due to compiler bugs, then the extra precision is
+ *	   only good provided it is retained in all terms of the final
+ *	   expression for cos().  Retention happens in all cases tested
+ *	   under FreeBSD, so don't pessimize things by forcibly clipping
+ *	   any extra precision in w.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+C1  =  4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
+C2  = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
+C3  =  2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
+C4  = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
+C5  =  2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
+C6  = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
+
+double
+__kernel_cos(double x, double y)
+{
+	double hz,z,r,w;
+
+	z  = x*x;
+	w  = z*z;
+	r  = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6));
+	hz = 0.5*z;
+	w  = one-hz;
+	return w + (((one-w)-hz) + (z*r-x*y));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_cosf.c b/libm/upstream-freebsd/lib/msun/src/k_cosf.c
new file mode 100644
index 0000000..f7a2c0a
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_cosf.c
@@ -0,0 +1,46 @@
+/* k_cosf.c -- float version of k_cos.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef INLINE_KERNEL_COSDF
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+/* |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]). */
+static const double
+one =  1.0,
+C0  = -0x1ffffffd0c5e81.0p-54,	/* -0.499999997251031003120 */
+C1  =  0x155553e1053a42.0p-57,	/*  0.0416666233237390631894 */
+C2  = -0x16c087e80f1e27.0p-62,	/* -0.00138867637746099294692 */
+C3  =  0x199342e0ee5069.0p-68;	/*  0.0000243904487962774090654 */
+
+#ifdef INLINE_KERNEL_COSDF
+static __inline
+#endif
+float
+__kernel_cosdf(double x)
+{
+	double r, w, z;
+
+	/* Try to optimize for parallel evaluation as in k_tanf.c. */
+	z = x*x;
+	w = z*z;
+	r = C2+z*C3;
+	return ((one+z*C0) + w*C1) + (w*z)*r;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_exp.c b/libm/upstream-freebsd/lib/msun/src/k_exp.c
new file mode 100644
index 0000000..5aa3ef3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_exp.c
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/k_exp.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const uint32_t k = 1799;		/* constant for reduction */
+static const double kln2 =  1246.97177782734161156;	/* k * ln2 */
+
+/*
+ * Compute exp(x), scaled to avoid spurious overflow.  An exponent is
+ * returned separately in 'expt'.
+ *
+ * Input:  ln(DBL_MAX) <= x < ln(2 * DBL_MAX / DBL_MIN_DENORM) ~= 1454.91
+ * Output: 2**1023 <= y < 2**1024
+ */
+static double
+__frexp_exp(double x, int *expt)
+{
+	double exp_x;
+	uint32_t hx;
+
+	/*
+	 * We use exp(x) = exp(x - kln2) * 2**k, carefully chosen to
+	 * minimize |exp(kln2) - 2**k|.  We also scale the exponent of
+	 * exp_x to MAX_EXP so that the result can be multiplied by
+	 * a tiny number without losing accuracy due to denormalization.
+	 */
+	exp_x = exp(x - kln2);
+	GET_HIGH_WORD(hx, exp_x);
+	*expt = (hx >> 20) - (0x3ff + 1023) + k;
+	SET_HIGH_WORD(exp_x, (hx & 0xfffff) | ((0x3ff + 1023) << 20));
+	return (exp_x);
+}
+
+/*
+ * __ldexp_exp(x, expt) and __ldexp_cexp(x, expt) compute exp(x) * 2**expt.
+ * They are intended for large arguments (real part >= ln(DBL_MAX))
+ * where care is needed to avoid overflow.
+ *
+ * The present implementation is narrowly tailored for our hyperbolic and
+ * exponential functions.  We assume expt is small (0 or -1), and the caller
+ * has filtered out very large x, for which overflow would be inevitable.
+ */
+
+double
+__ldexp_exp(double x, int expt)
+{
+	double exp_x, scale;
+	int ex_expt;
+
+	exp_x = __frexp_exp(x, &ex_expt);
+	expt += ex_expt;
+	INSERT_WORDS(scale, (0x3ff + expt) << 20, 0);
+	return (exp_x * scale);
+}
+
+double complex
+__ldexp_cexp(double complex z, int expt)
+{
+	double x, y, exp_x, scale1, scale2;
+	int ex_expt, half_expt;
+
+	x = creal(z);
+	y = cimag(z);
+	exp_x = __frexp_exp(x, &ex_expt);
+	expt += ex_expt;
+
+	/*
+	 * Arrange so that scale1 * scale2 == 2**expt.  We use this to
+	 * compensate for scalbn being horrendously slow.
+	 */
+	half_expt = expt / 2;
+	INSERT_WORDS(scale1, (0x3ff + half_expt) << 20, 0);
+	half_expt = expt - half_expt;
+	INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0);
+
+	return (CMPLX(cos(y) * exp_x * scale1 * scale2,
+	    sin(y) * exp_x * scale1 * scale2));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_expf.c b/libm/upstream-freebsd/lib/msun/src/k_expf.c
new file mode 100644
index 0000000..8fe8c46
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_expf.c
@@ -0,0 +1,87 @@
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/k_expf.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const uint32_t k = 235;			/* constant for reduction */
+static const float kln2 =  162.88958740F;	/* k * ln2 */
+
+/*
+ * See k_exp.c for details.
+ *
+ * Input:  ln(FLT_MAX) <= x < ln(2 * FLT_MAX / FLT_MIN_DENORM) ~= 192.7
+ * Output: 2**127 <= y < 2**128
+ */
+static float
+__frexp_expf(float x, int *expt)
+{
+	float exp_x;
+	uint32_t hx;
+
+	exp_x = expf(x - kln2);
+	GET_FLOAT_WORD(hx, exp_x);
+	*expt = (hx >> 23) - (0x7f + 127) + k;
+	SET_FLOAT_WORD(exp_x, (hx & 0x7fffff) | ((0x7f + 127) << 23));
+	return (exp_x);
+}
+
+float
+__ldexp_expf(float x, int expt)
+{
+	float exp_x, scale;
+	int ex_expt;
+
+	exp_x = __frexp_expf(x, &ex_expt);
+	expt += ex_expt;
+	SET_FLOAT_WORD(scale, (0x7f + expt) << 23);
+	return (exp_x * scale);
+}
+
+float complex
+__ldexp_cexpf(float complex z, int expt)
+{
+	float x, y, exp_x, scale1, scale2;
+	int ex_expt, half_expt;
+
+	x = crealf(z);
+	y = cimagf(z);
+	exp_x = __frexp_expf(x, &ex_expt);
+	expt += ex_expt;
+
+	half_expt = expt / 2;
+	SET_FLOAT_WORD(scale1, (0x7f + half_expt) << 23);
+	half_expt = expt - half_expt;
+	SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23);
+
+	return (CMPLXF(cosf(y) * exp_x * scale1 * scale2,
+	    sinf(y) * exp_x * scale1 * scale2));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_log.h b/libm/upstream-freebsd/lib/msun/src/k_log.h
new file mode 100644
index 0000000..aaff8bd
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_log.h
@@ -0,0 +1,100 @@
+
+/* @(#)e_log.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * k_log1p(f):
+ * Return log(1+f) - f for 1+f in ~[sqrt(2)/2, sqrt(2)].
+ *
+ * The following describes the overall strategy for computing
+ * logarithms in base e.  The argument reduction and adding the final
+ * term of the polynomial are done by the caller for increased accuracy
+ * when different bases are used.
+ *
+ * Method :                  
+ *   1. Argument Reduction: find k and f such that 
+ *			x = 2^k * (1+f), 
+ *	   where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *   2. Approximation of log(1+f).
+ *	Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *		 = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *	     	 = 2s + s*R
+ *      We use a special Reme algorithm on [0,0.1716] to generate 
+ * 	a polynomial of degree 14 to approximate R The maximum error 
+ *	of this polynomial approximation is bounded by 2**-58.45. In
+ *	other words,
+ *		        2      4      6      8      10      12      14
+ *	    R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s  +Lg6*s  +Lg7*s
+ *  	(the values of Lg1 to Lg7 are listed in the program)
+ *	and
+ *	    |      2          14          |     -58.45
+ *	    | Lg1*s +...+Lg7*s    -  R(z) | <= 2 
+ *	    |                             |
+ *	Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
+ *	In order to guarantee error in log below 1ulp, we compute log
+ *	by
+ *		log(1+f) = f - s*(f - R)	(if f is not too large)
+ *		log(1+f) = f - (hfsq - s*(hfsq+R)).	(better accuracy)
+ *	
+ *	3. Finally,  log(x) = k*ln2 + log(1+f).  
+ *			    = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
+ *	   Here ln2 is split into two floating point number: 
+ *			ln2_hi + ln2_lo,
+ *	   where n*ln2_hi is always exact for |n| < 2000.
+ *
+ * Special cases:
+ *	log(x) is NaN with signal if x < 0 (including -INF) ; 
+ *	log(+INF) is +INF; log(0) is -INF with signal;
+ *	log(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *	according to an error analysis, the error is always less than
+ *	1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+static const double
+Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+/*
+ * We always inline k_log1p(), since doing so produces a
+ * substantial performance improvement (~40% on amd64).
+ */
+static inline double
+k_log1p(double f)
+{
+	double hfsq,s,z,R,w,t1,t2;
+
+ 	s = f/(2.0+f);
+	z = s*s;
+	w = z*z;
+	t1= w*(Lg2+w*(Lg4+w*Lg6));
+	t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
+	R = t2+t1;
+	hfsq=0.5*f*f;
+	return s*(hfsq+R);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_logf.h b/libm/upstream-freebsd/lib/msun/src/k_logf.h
new file mode 100644
index 0000000..71c547e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_logf.h
@@ -0,0 +1,39 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Float version of k_log.h.  See the latter for most comments.
+ */
+
+static const float
+/* |(log(1+s)-log(1-s))/s - Lg(s)| < 2**-34.24 (~[-4.95e-11, 4.97e-11]). */
+Lg1 =      0xaaaaaa.0p-24,	/* 0.66666662693 */
+Lg2 =      0xccce13.0p-25,	/* 0.40000972152 */
+Lg3 =      0x91e9ee.0p-25,	/* 0.28498786688 */
+Lg4 =      0xf89e26.0p-26;	/* 0.24279078841 */
+
+static inline float
+k_log1pf(float f)
+{
+	float hfsq,s,z,R,w,t1,t2;
+
+ 	s = f/((float)2.0+f);
+	z = s*s;
+	w = z*z;
+	t1= w*(Lg2+w*Lg4);
+	t2= z*(Lg1+w*Lg3);
+	R = t2+t1;
+	hfsq=(float)0.5*f*f;
+	return s*(hfsq+R);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_rem_pio2.c b/libm/upstream-freebsd/lib/msun/src/k_rem_pio2.c
new file mode 100644
index 0000000..3942441
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_rem_pio2.c
@@ -0,0 +1,443 @@
+
+/* @(#)k_rem_pio2.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * __kernel_rem_pio2(x,y,e0,nx,prec)
+ * double x[],y[]; int e0,nx,prec;
+ * 
+ * __kernel_rem_pio2 return the last three digits of N with 
+ *		y = x - N*pi/2
+ * so that |y| < pi/2.
+ *
+ * The method is to compute the integer (mod 8) and fraction parts of 
+ * (2/pi)*x without doing the full multiplication. In general we
+ * skip the part of the product that are known to be a huge integer (
+ * more accurately, = 0 mod 8 ). Thus the number of operations are
+ * independent of the exponent of the input.
+ *
+ * (2/pi) is represented by an array of 24-bit integers in ipio2[].
+ *
+ * Input parameters:
+ * 	x[]	The input value (must be positive) is broken into nx 
+ *		pieces of 24-bit integers in double precision format.
+ *		x[i] will be the i-th 24 bit of x. The scaled exponent 
+ *		of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 
+ *		match x's up to 24 bits.
+ *
+ *		Example of breaking a double positive z into x[0]+x[1]+x[2]:
+ *			e0 = ilogb(z)-23
+ *			z  = scalbn(z,-e0)
+ *		for i = 0,1,2
+ *			x[i] = floor(z)
+ *			z    = (z-x[i])*2**24
+ *
+ *
+ *	y[]	output result in an array of double precision numbers.
+ *		The dimension of y[] is:
+ *			24-bit  precision	1
+ *			53-bit  precision	2
+ *			64-bit  precision	2
+ *			113-bit precision	3
+ *		The actual value is the sum of them. Thus for 113-bit
+ *		precison, one may have to do something like:
+ *
+ *		long double t,w,r_head, r_tail;
+ *		t = (long double)y[2] + (long double)y[1];
+ *		w = (long double)y[0];
+ *		r_head = t+w;
+ *		r_tail = w - (r_head - t);
+ *
+ *	e0	The exponent of x[0]. Must be <= 16360 or you need to
+ *              expand the ipio2 table.
+ *
+ *	nx	dimension of x[]
+ *
+ *  	prec	an integer indicating the precision:
+ *			0	24  bits (single)
+ *			1	53  bits (double)
+ *			2	64  bits (extended)
+ *			3	113 bits (quad)
+ *
+ * External function:
+ *	double scalbn(), floor();
+ *
+ *
+ * Here is the description of some local variables:
+ *
+ * 	jk	jk+1 is the initial number of terms of ipio2[] needed
+ *		in the computation. The minimum and recommended value
+ *		for jk is 3,4,4,6 for single, double, extended, and quad.
+ *		jk+1 must be 2 larger than you might expect so that our
+ *		recomputation test works. (Up to 24 bits in the integer
+ *		part (the 24 bits of it that we compute) and 23 bits in
+ *		the fraction part may be lost to cancelation before we
+ *		recompute.)
+ *
+ * 	jz	local integer variable indicating the number of 
+ *		terms of ipio2[] used. 
+ *
+ *	jx	nx - 1
+ *
+ *	jv	index for pointing to the suitable ipio2[] for the
+ *		computation. In general, we want
+ *			( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
+ *		is an integer. Thus
+ *			e0-3-24*jv >= 0 or (e0-3)/24 >= jv
+ *		Hence jv = max(0,(e0-3)/24).
+ *
+ *	jp	jp+1 is the number of terms in PIo2[] needed, jp = jk.
+ *
+ * 	q[]	double array with integral value, representing the
+ *		24-bits chunk of the product of x and 2/pi.
+ *
+ *	q0	the corresponding exponent of q[0]. Note that the
+ *		exponent for q[i] would be q0-24*i.
+ *
+ *	PIo2[]	double precision array, obtained by cutting pi/2
+ *		into 24 bits chunks. 
+ *
+ *	f[]	ipio2[] in floating point 
+ *
+ *	iq[]	integer array by breaking up q[] in 24-bits chunk.
+ *
+ *	fq[]	final product of x*(2/pi) in fq[0],..,fq[jk]
+ *
+ *	ih	integer. If >0 it indicates q[] is >= 0.5, hence
+ *		it also indicates the *sign* of the result.
+ *
+ */
+
+
+/*
+ * Constants:
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
+
+/*
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+ *
+ *		integer array, contains the (24*i)-th to (24*i+23)-th 
+ *		bit of 2/pi after binary point. The corresponding 
+ *		floating value is
+ *
+ *			ipio2[i] * 2^(-24(i+1)).
+ *
+ * NB: This table must have at least (e0-3)/24 + jk terms.
+ *     For quad precision (e0 <= 16360, jk = 6), this is 686.
+ */
+static const int32_t ipio2[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, 
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, 
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, 
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, 
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, 
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, 
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, 
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, 
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, 
+
+#if LDBL_MAX_EXP > 1024
+#if LDBL_MAX_EXP > 16384
+#error "ipio2 table needs to be expanded"
+#endif
+0x47C419, 0xC367CD, 0xDCE809, 0x2A8359, 0xC4768B, 0x961CA6,
+0xDDAF44, 0xD15719, 0x053EA5, 0xFF0705, 0x3F7E33, 0xE832C2,
+0xDE4F98, 0x327DBB, 0xC33D26, 0xEF6B1E, 0x5EF89F, 0x3A1F35,
+0xCAF27F, 0x1D87F1, 0x21907C, 0x7C246A, 0xFA6ED5, 0x772D30,
+0x433B15, 0xC614B5, 0x9D19C3, 0xC2C4AD, 0x414D2C, 0x5D000C,
+0x467D86, 0x2D71E3, 0x9AC69B, 0x006233, 0x7CD2B4, 0x97A7B4,
+0xD55537, 0xF63ED7, 0x1810A3, 0xFC764D, 0x2A9D64, 0xABD770,
+0xF87C63, 0x57B07A, 0xE71517, 0x5649C0, 0xD9D63B, 0x3884A7,
+0xCB2324, 0x778AD6, 0x23545A, 0xB91F00, 0x1B0AF1, 0xDFCE19,
+0xFF319F, 0x6A1E66, 0x615799, 0x47FBAC, 0xD87F7E, 0xB76522,
+0x89E832, 0x60BFE6, 0xCDC4EF, 0x09366C, 0xD43F5D, 0xD7DE16,
+0xDE3B58, 0x929BDE, 0x2822D2, 0xE88628, 0x4D58E2, 0x32CAC6,
+0x16E308, 0xCB7DE0, 0x50C017, 0xA71DF3, 0x5BE018, 0x34132E,
+0x621283, 0x014883, 0x5B8EF5, 0x7FB0AD, 0xF2E91E, 0x434A48,
+0xD36710, 0xD8DDAA, 0x425FAE, 0xCE616A, 0xA4280A, 0xB499D3,
+0xF2A606, 0x7F775C, 0x83C2A3, 0x883C61, 0x78738A, 0x5A8CAF,
+0xBDD76F, 0x63A62D, 0xCBBFF4, 0xEF818D, 0x67C126, 0x45CA55,
+0x36D9CA, 0xD2A828, 0x8D61C2, 0x77C912, 0x142604, 0x9B4612,
+0xC459C4, 0x44C5C8, 0x91B24D, 0xF31700, 0xAD43D4, 0xE54929,
+0x10D5FD, 0xFCBE00, 0xCC941E, 0xEECE70, 0xF53E13, 0x80F1EC,
+0xC3E7B3, 0x28F8C7, 0x940593, 0x3E71C1, 0xB3092E, 0xF3450B,
+0x9C1288, 0x7B20AB, 0x9FB52E, 0xC29247, 0x2F327B, 0x6D550C,
+0x90A772, 0x1FE76B, 0x96CB31, 0x4A1679, 0xE27941, 0x89DFF4,
+0x9794E8, 0x84E6E2, 0x973199, 0x6BED88, 0x365F5F, 0x0EFDBB,
+0xB49A48, 0x6CA467, 0x427271, 0x325D8D, 0xB8159F, 0x09E5BC,
+0x25318D, 0x3974F7, 0x1C0530, 0x010C0D, 0x68084B, 0x58EE2C,
+0x90AA47, 0x02E774, 0x24D6BD, 0xA67DF7, 0x72486E, 0xEF169F,
+0xA6948E, 0xF691B4, 0x5153D1, 0xF20ACF, 0x339820, 0x7E4BF5,
+0x6863B2, 0x5F3EDD, 0x035D40, 0x7F8985, 0x295255, 0xC06437,
+0x10D86D, 0x324832, 0x754C5B, 0xD4714E, 0x6E5445, 0xC1090B,
+0x69F52A, 0xD56614, 0x9D0727, 0x50045D, 0xDB3BB4, 0xC576EA,
+0x17F987, 0x7D6B49, 0xBA271D, 0x296996, 0xACCCC6, 0x5414AD,
+0x6AE290, 0x89D988, 0x50722C, 0xBEA404, 0x940777, 0x7030F3,
+0x27FC00, 0xA871EA, 0x49C266, 0x3DE064, 0x83DD97, 0x973FA3,
+0xFD9443, 0x8C860D, 0xDE4131, 0x9D3992, 0x8C70DD, 0xE7B717,
+0x3BDF08, 0x2B3715, 0xA0805C, 0x93805A, 0x921110, 0xD8E80F,
+0xAF806C, 0x4BFFDB, 0x0F9038, 0x761859, 0x15A562, 0xBBCB61,
+0xB989C7, 0xBD4010, 0x04F2D2, 0x277549, 0xF6B6EB, 0xBB22DB,
+0xAA140A, 0x2F2689, 0x768364, 0x333B09, 0x1A940E, 0xAA3A51,
+0xC2A31D, 0xAEEDAF, 0x12265C, 0x4DC26D, 0x9C7A2D, 0x9756C0,
+0x833F03, 0xF6F009, 0x8C402B, 0x99316D, 0x07B439, 0x15200C,
+0x5BC3D8, 0xC492F5, 0x4BADC6, 0xA5CA4E, 0xCD37A7, 0x36A9E6,
+0x9492AB, 0x6842DD, 0xDE6319, 0xEF8C76, 0x528B68, 0x37DBFC,
+0xABA1AE, 0x3115DF, 0xA1AE00, 0xDAFB0C, 0x664D64, 0xB705ED,
+0x306529, 0xBF5657, 0x3AFF47, 0xB9F96A, 0xF3BE75, 0xDF9328,
+0x3080AB, 0xF68C66, 0x15CB04, 0x0622FA, 0x1DE4D9, 0xA4B33D,
+0x8F1B57, 0x09CD36, 0xE9424E, 0xA4BE13, 0xB52333, 0x1AAAF0,
+0xA8654F, 0xA5C1D2, 0x0F3F0B, 0xCD785B, 0x76F923, 0x048B7B,
+0x721789, 0x53A6C6, 0xE26E6F, 0x00EBEF, 0x584A9B, 0xB7DAC4,
+0xBA66AA, 0xCFCF76, 0x1D02D1, 0x2DF1B1, 0xC1998C, 0x77ADC3,
+0xDA4886, 0xA05DF7, 0xF480C6, 0x2FF0AC, 0x9AECDD, 0xBC5C3F,
+0x6DDED0, 0x1FC790, 0xB6DB2A, 0x3A25A3, 0x9AAF00, 0x9353AD,
+0x0457B6, 0xB42D29, 0x7E804B, 0xA707DA, 0x0EAA76, 0xA1597B,
+0x2A1216, 0x2DB7DC, 0xFDE5FA, 0xFEDB89, 0xFDBE89, 0x6C76E4,
+0xFCA906, 0x70803E, 0x156E85, 0xFF87FD, 0x073E28, 0x336761,
+0x86182A, 0xEABD4D, 0xAFE7B3, 0x6E6D8F, 0x396795, 0x5BBF31,
+0x48D784, 0x16DF30, 0x432DC7, 0x356125, 0xCE70C9, 0xB8CB30,
+0xFD6CBF, 0xA200A4, 0xE46C05, 0xA0DD5A, 0x476F21, 0xD21262,
+0x845CB9, 0x496170, 0xE0566B, 0x015299, 0x375550, 0xB7D51E,
+0xC4F133, 0x5F6E13, 0xE4305D, 0xA92E85, 0xC3B21D, 0x3632A1,
+0xA4B708, 0xD4B1EA, 0x21F716, 0xE4698F, 0x77FF27, 0x80030C,
+0x2D408D, 0xA0CD4F, 0x99A520, 0xD3A2B3, 0x0A5D2F, 0x42F9B4,
+0xCBDA11, 0xD0BE7D, 0xC1DB9B, 0xBD17AB, 0x81A2CA, 0x5C6A08,
+0x17552E, 0x550027, 0xF0147F, 0x8607E1, 0x640B14, 0x8D4196,
+0xDEBE87, 0x2AFDDA, 0xB6256B, 0x34897B, 0xFEF305, 0x9EBFB9,
+0x4F6A68, 0xA82A4A, 0x5AC44F, 0xBCF82D, 0x985AD7, 0x95C7F4,
+0x8D4D0D, 0xA63A20, 0x5F57A4, 0xB13F14, 0x953880, 0x0120CC,
+0x86DD71, 0xB6DEC9, 0xF560BF, 0x11654D, 0x6B0701, 0xACB08C,
+0xD0C0B2, 0x485551, 0x0EFB1E, 0xC37295, 0x3B06A3, 0x3540C0,
+0x7BDC06, 0xCC45E0, 0xFA294E, 0xC8CAD6, 0x41F3E8, 0xDE647C,
+0xD8649B, 0x31BED9, 0xC397A4, 0xD45877, 0xC5E369, 0x13DAF0,
+0x3C3ABA, 0x461846, 0x5F7555, 0xF5BDD2, 0xC6926E, 0x5D2EAC,
+0xED440E, 0x423E1C, 0x87C461, 0xE9FD29, 0xF3D6E7, 0xCA7C22,
+0x35916F, 0xC5E008, 0x8DD7FF, 0xE26A6E, 0xC6FDB0, 0xC10893,
+0x745D7C, 0xB2AD6B, 0x9D6ECD, 0x7B723E, 0x6A11C6, 0xA9CFF7,
+0xDF7329, 0xBAC9B5, 0x5100B7, 0x0DB2E2, 0x24BA74, 0x607DE5,
+0x8AD874, 0x2C150D, 0x0C1881, 0x94667E, 0x162901, 0x767A9F,
+0xBEFDFD, 0xEF4556, 0x367ED9, 0x13D9EC, 0xB9BA8B, 0xFC97C4,
+0x27A831, 0xC36EF1, 0x36C594, 0x56A8D8, 0xB5A8B4, 0x0ECCCF,
+0x2D8912, 0x34576F, 0x89562C, 0xE3CE99, 0xB920D6, 0xAA5E6B,
+0x9C2A3E, 0xCC5F11, 0x4A0BFD, 0xFBF4E1, 0x6D3B8E, 0x2C86E2,
+0x84D4E9, 0xA9B4FC, 0xD1EEEF, 0xC9352E, 0x61392F, 0x442138,
+0xC8D91B, 0x0AFC81, 0x6A4AFB, 0xD81C2F, 0x84B453, 0x8C994E,
+0xCC2254, 0xDC552A, 0xD6C6C0, 0x96190B, 0xB8701A, 0x649569,
+0x605A26, 0xEE523F, 0x0F117F, 0x11B5F4, 0xF5CBFC, 0x2DBC34,
+0xEEBC34, 0xCC5DE8, 0x605EDD, 0x9B8E67, 0xEF3392, 0xB817C9,
+0x9B5861, 0xBC57E1, 0xC68351, 0x103ED8, 0x4871DD, 0xDD1C2D,
+0xA118AF, 0x462C21, 0xD7F359, 0x987AD9, 0xC0549E, 0xFA864F,
+0xFC0656, 0xAE79E5, 0x362289, 0x22AD38, 0xDC9367, 0xAAE855,
+0x382682, 0x9BE7CA, 0xA40D51, 0xB13399, 0x0ED7A9, 0x480569,
+0xF0B265, 0xA7887F, 0x974C88, 0x36D1F9, 0xB39221, 0x4A827B,
+0x21CF98, 0xDC9F40, 0x5547DC, 0x3A74E1, 0x42EB67, 0xDF9DFE,
+0x5FD45E, 0xA4677B, 0x7AACBA, 0xA2F655, 0x23882B, 0x55BA41,
+0x086E59, 0x862A21, 0x834739, 0xE6E389, 0xD49EE5, 0x40FB49,
+0xE956FF, 0xCA0F1C, 0x8A59C5, 0x2BFA94, 0xC5C1D3, 0xCFC50F,
+0xAE5ADB, 0x86C547, 0x624385, 0x3B8621, 0x94792C, 0x876110,
+0x7B4C2A, 0x1A2C80, 0x12BF43, 0x902688, 0x893C78, 0xE4C4A8,
+0x7BDBE5, 0xC23AC4, 0xEAF426, 0x8A67F7, 0xBF920D, 0x2BA365,
+0xB1933D, 0x0B7CBD, 0xDC51A4, 0x63DD27, 0xDDE169, 0x19949A,
+0x9529A8, 0x28CE68, 0xB4ED09, 0x209F44, 0xCA984E, 0x638270,
+0x237C7E, 0x32B90F, 0x8EF5A7, 0xE75614, 0x08F121, 0x2A9DB5,
+0x4D7E6F, 0x5119A5, 0xABF9B5, 0xD6DF82, 0x61DD96, 0x023616,
+0x9F3AC4, 0xA1A283, 0x6DED72, 0x7A8D39, 0xA9B882, 0x5C326B,
+0x5B2746, 0xED3400, 0x7700D2, 0x55F4FC, 0x4D5901, 0x8071E0,
+#endif
+
+};
+
+static const double PIo2[] = {
+  1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
+  7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
+  5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
+  3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
+  1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
+  1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
+  2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
+  2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
+};
+
+static const double			
+zero   = 0.0,
+one    = 1.0,
+two24   =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+twon24  =  5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
+
+int
+__kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec)
+{
+	int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+	double z,fw,f[20],fq[20],q[20];
+
+    /* initialize jk*/
+	jk = init_jk[prec];
+	jp = jk;
+
+    /* determine jx,jv,q0, note that 3>q0 */
+	jx =  nx-1;
+	jv = (e0-3)/24; if(jv<0) jv=0;
+	q0 =  e0-24*(jv+1);
+
+    /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+	j = jv-jx; m = jx+jk;
+	for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
+
+    /* compute q[0],q[1],...q[jk] */
+	for (i=0;i<=jk;i++) {
+	    for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
+	}
+
+	jz = jk;
+recompute:
+    /* distill q[] into iq[] reversingly */
+	for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
+	    fw    =  (double)((int32_t)(twon24* z));
+	    iq[i] =  (int32_t)(z-two24*fw);
+	    z     =  q[j-1]+fw;
+	}
+
+    /* compute n */
+	z  = scalbn(z,q0);		/* actual value of z */
+	z -= 8.0*floor(z*0.125);		/* trim off integer >= 8 */
+	n  = (int32_t) z;
+	z -= (double)n;
+	ih = 0;
+	if(q0>0) {	/* need iq[jz-1] to determine n */
+	    i  = (iq[jz-1]>>(24-q0)); n += i;
+	    iq[jz-1] -= i<<(24-q0);
+	    ih = iq[jz-1]>>(23-q0);
+	} 
+	else if(q0==0) ih = iq[jz-1]>>23;
+	else if(z>=0.5) ih=2;
+
+	if(ih>0) {	/* q > 0.5 */
+	    n += 1; carry = 0;
+	    for(i=0;i<jz ;i++) {	/* compute 1-q */
+		j = iq[i];
+		if(carry==0) {
+		    if(j!=0) {
+			carry = 1; iq[i] = 0x1000000- j;
+		    }
+		} else  iq[i] = 0xffffff - j;
+	    }
+	    if(q0>0) {		/* rare case: chance is 1 in 12 */
+	        switch(q0) {
+	        case 1:
+	    	   iq[jz-1] &= 0x7fffff; break;
+	    	case 2:
+	    	   iq[jz-1] &= 0x3fffff; break;
+	        }
+	    }
+	    if(ih==2) {
+		z = one - z;
+		if(carry!=0) z -= scalbn(one,q0);
+	    }
+	}
+
+    /* check if recomputation is needed */
+	if(z==zero) {
+	    j = 0;
+	    for (i=jz-1;i>=jk;i--) j |= iq[i];
+	    if(j==0) { /* need recomputation */
+		for(k=1;iq[jk-k]==0;k++);   /* k = no. of terms needed */
+
+		for(i=jz+1;i<=jz+k;i++) {   /* add q[jz+1] to q[jz+k] */
+		    f[jx+i] = (double) ipio2[jv+i];
+		    for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
+		    q[i] = fw;
+		}
+		jz += k;
+		goto recompute;
+	    }
+	}
+
+    /* chop off zero terms */
+	if(z==0.0) {
+	    jz -= 1; q0 -= 24;
+	    while(iq[jz]==0) { jz--; q0-=24;}
+	} else { /* break z into 24-bit if necessary */
+	    z = scalbn(z,-q0);
+	    if(z>=two24) { 
+		fw = (double)((int32_t)(twon24*z));
+		iq[jz] = (int32_t)(z-two24*fw);
+		jz += 1; q0 += 24;
+		iq[jz] = (int32_t) fw;
+	    } else iq[jz] = (int32_t) z ;
+	}
+
+    /* convert integer "bit" chunk to floating-point value */
+	fw = scalbn(one,q0);
+	for(i=jz;i>=0;i--) {
+	    q[i] = fw*(double)iq[i]; fw*=twon24;
+	}
+
+    /* compute PIo2[0,...,jp]*q[jz,...,0] */
+	for(i=jz;i>=0;i--) {
+	    for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
+	    fq[jz-i] = fw;
+	}
+
+    /* compress fq[] into y[] */
+	switch(prec) {
+	    case 0:
+		fw = 0.0;
+		for (i=jz;i>=0;i--) fw += fq[i];
+		y[0] = (ih==0)? fw: -fw; 
+		break;
+	    case 1:
+	    case 2:
+		fw = 0.0;
+		for (i=jz;i>=0;i--) fw += fq[i]; 
+		STRICT_ASSIGN(double,fw,fw);
+		y[0] = (ih==0)? fw: -fw; 
+		fw = fq[0]-fw;
+		for (i=1;i<=jz;i++) fw += fq[i];
+		y[1] = (ih==0)? fw: -fw; 
+		break;
+	    case 3:	/* painful */
+		for (i=jz;i>0;i--) {
+		    fw      = fq[i-1]+fq[i]; 
+		    fq[i]  += fq[i-1]-fw;
+		    fq[i-1] = fw;
+		}
+		for (i=jz;i>1;i--) {
+		    fw      = fq[i-1]+fq[i]; 
+		    fq[i]  += fq[i-1]-fw;
+		    fq[i-1] = fw;
+		}
+		for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; 
+		if(ih==0) {
+		    y[0] =  fq[0]; y[1] =  fq[1]; y[2] =  fw;
+		} else {
+		    y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
+		}
+	}
+	return n&7;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_sin.c b/libm/upstream-freebsd/lib/msun/src/k_sin.c
new file mode 100644
index 0000000..12ee8c1
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_sin.c
@@ -0,0 +1,70 @@
+
+/* @(#)k_sin.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __kernel_sin( x, y, iy)
+ * kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). 
+ *
+ * Algorithm
+ *	1. Since sin(-x) = -sin(x), we need only to consider positive x. 
+ *	2. Callers must return sin(-0) = -0 without calling here since our
+ *	   odd polynomial is not evaluated in a way that preserves -0.
+ *	   Callers may do the optimization sin(x) ~ x for tiny x.
+ *	3. sin(x) is approximated by a polynomial of degree 13 on
+ *	   [0,pi/4]
+ *		  	         3            13
+ *	   	sin(x) ~ x + S1*x + ... + S6*x
+ *	   where
+ *	
+ * 	|sin(x)         2     4     6     8     10     12  |     -58
+ * 	|----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2
+ * 	|  x 					           | 
+ * 
+ *	4. sin(x+y) = sin(x) + sin'(x')*y
+ *		    ~ sin(x) + (1-x*x/2)*y
+ *	   For better accuracy, let 
+ *		     3      2      2      2      2
+ *		r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
+ *	   then                   3    2
+ *		sin(x) = x + (S1*x + (x *(r-y/2)+y))
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+S1  = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
+S2  =  8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
+S3  = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
+S4  =  2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
+S5  = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
+S6  =  1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
+
+double
+__kernel_sin(double x, double y, int iy)
+{
+	double z,r,v,w;
+
+	z	=  x*x;
+	w	=  z*z;
+	r	=  S2+z*(S3+z*S4) + z*w*(S5+z*S6);
+	v	=  z*x;
+	if(iy==0) return x+v*(S1+z*r);
+	else      return x-((z*(half*y-v*r)-y)-v*S1);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_sinf.c b/libm/upstream-freebsd/lib/msun/src/k_sinf.c
new file mode 100644
index 0000000..0841759
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_sinf.c
@@ -0,0 +1,46 @@
+/* k_sinf.c -- float version of k_sin.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef INLINE_KERNEL_SINDF
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+/* |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]). */
+static const double
+S1 = -0x15555554cbac77.0p-55,	/* -0.166666666416265235595 */
+S2 =  0x111110896efbb2.0p-59,	/*  0.0083333293858894631756 */
+S3 = -0x1a00f9e2cae774.0p-65,	/* -0.000198393348360966317347 */
+S4 =  0x16cd878c3b46a7.0p-71;	/*  0.0000027183114939898219064 */
+
+#ifdef INLINE_KERNEL_SINDF
+static __inline
+#endif
+float
+__kernel_sindf(double x)
+{
+	double r, s, w, z;
+
+	/* Try to optimize for parallel evaluation as in k_tanf.c. */
+	z = x*x;
+	w = z*z;
+	r = S3+z*S4;
+	s = z*x;
+	return (x + s*(S1+z*S2)) + s*w*r;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_tan.c b/libm/upstream-freebsd/lib/msun/src/k_tan.c
new file mode 100644
index 0000000..2e86c3b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_tan.c
@@ -0,0 +1,132 @@
+/* @(#)k_tan.c 1.5 04/04/22 SMI */
+
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* INDENT OFF */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* __kernel_tan( x, y, k )
+ * kernel tan function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input k indicates whether tan (if k = 1) or -1/tan (if k = -1) is returned.
+ *
+ * Algorithm
+ *	1. Since tan(-x) = -tan(x), we need only to consider positive x.
+ *	2. Callers must return tan(-0) = -0 without calling here since our
+ *	   odd polynomial is not evaluated in a way that preserves -0.
+ *	   Callers may do the optimization tan(x) ~ x for tiny x.
+ *	3. tan(x) is approximated by a odd polynomial of degree 27 on
+ *	   [0,0.67434]
+ *		  	         3             27
+ *	   	tan(x) ~ x + T1*x + ... + T13*x
+ *	   where
+ *
+ * 	        |tan(x)         2     4            26   |     -59.2
+ * 	        |----- - (1+T1*x +T2*x +.... +T13*x    )| <= 2
+ * 	        |  x 					|
+ *
+ *	   Note: tan(x+y) = tan(x) + tan'(x)*y
+ *		          ~ tan(x) + (1+x*x)*y
+ *	   Therefore, for better accuracy in computing tan(x+y), let
+ *		     3      2      2       2       2
+ *		r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
+ *	   then
+ *		 		    3    2
+ *		tan(x+y) = x + (T1*x + (x *(r+y)+y))
+ *
+ *      4. For x in [0.67434,pi/4],  let y = pi/4 - x, then
+ *		tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
+ *		       = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
+ */
+
+#include "math.h"
+#include "math_private.h"
+static const double xxx[] = {
+		 3.33333333333334091986e-01,	/* 3FD55555, 55555563 */
+		 1.33333333333201242699e-01,	/* 3FC11111, 1110FE7A */
+		 5.39682539762260521377e-02,	/* 3FABA1BA, 1BB341FE */
+		 2.18694882948595424599e-02,	/* 3F9664F4, 8406D637 */
+		 8.86323982359930005737e-03,	/* 3F8226E3, E96E8493 */
+		 3.59207910759131235356e-03,	/* 3F6D6D22, C9560328 */
+		 1.45620945432529025516e-03,	/* 3F57DBC8, FEE08315 */
+		 5.88041240820264096874e-04,	/* 3F4344D8, F2F26501 */
+		 2.46463134818469906812e-04,	/* 3F3026F7, 1A8D1068 */
+		 7.81794442939557092300e-05,	/* 3F147E88, A03792A6 */
+		 7.14072491382608190305e-05,	/* 3F12B80F, 32F0A7E9 */
+		-1.85586374855275456654e-05,	/* BEF375CB, DB605373 */
+		 2.59073051863633712884e-05,	/* 3EFB2A70, 74BF7AD4 */
+/* one */	 1.00000000000000000000e+00,	/* 3FF00000, 00000000 */
+/* pio4 */	 7.85398163397448278999e-01,	/* 3FE921FB, 54442D18 */
+/* pio4lo */	 3.06161699786838301793e-17	/* 3C81A626, 33145C07 */
+};
+#define	one	xxx[13]
+#define	pio4	xxx[14]
+#define	pio4lo	xxx[15]
+#define	T	xxx
+/* INDENT ON */
+
+double
+__kernel_tan(double x, double y, int iy) {
+	double z, r, v, w, s;
+	int32_t ix, hx;
+
+	GET_HIGH_WORD(hx,x);
+	ix = hx & 0x7fffffff;			/* high word of |x| */
+	if (ix >= 0x3FE59428) {	/* |x| >= 0.6744 */
+		if (hx < 0) {
+			x = -x;
+			y = -y;
+		}
+		z = pio4 - x;
+		w = pio4lo - y;
+		x = z + w;
+		y = 0.0;
+	}
+	z = x * x;
+	w = z * z;
+	/*
+	 * Break x^5*(T[1]+x^2*T[2]+...) into
+	 * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
+	 * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
+	 */
+	r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] +
+		w * T[11]))));
+	v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] +
+		w * T[12])))));
+	s = z * x;
+	r = y + z * (s * (r + v) + y);
+	r += T[0] * s;
+	w = x + r;
+	if (ix >= 0x3FE59428) {
+		v = (double) iy;
+		return (double) (1 - ((hx >> 30) & 2)) *
+			(v - 2.0 * (x - (w * w / (w + v) - r)));
+	}
+	if (iy == 1)
+		return w;
+	else {
+		/*
+		 * if allow error up to 2 ulp, simply return
+		 * -1.0 / (x+r) here
+		 */
+		/* compute -1.0 / (x+r) accurately */
+		double a, t;
+		z = w;
+		SET_LOW_WORD(z,0);
+		v = r - (z - x);	/* z+v = r+x */
+		t = a = -1.0 / w;	/* a = -1.0/w */
+		SET_LOW_WORD(t,0);
+		s = 1.0 + t * z;
+		return t + a * (s + t * v);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_tanf.c b/libm/upstream-freebsd/lib/msun/src/k_tanf.c
new file mode 100644
index 0000000..52f1aaa
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/k_tanf.c
@@ -0,0 +1,66 @@
+/* k_tanf.c -- float version of k_tan.c
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef INLINE_KERNEL_TANDF
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#endif
+
+#include "math.h"
+#include "math_private.h"
+
+/* |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]). */
+static const double
+T[] =  {
+  0x15554d3418c99f.0p-54,	/* 0.333331395030791399758 */
+  0x1112fd38999f72.0p-55,	/* 0.133392002712976742718 */
+  0x1b54c91d865afe.0p-57,	/* 0.0533812378445670393523 */
+  0x191df3908c33ce.0p-58,	/* 0.0245283181166547278873 */
+  0x185dadfcecf44e.0p-61,	/* 0.00297435743359967304927 */
+  0x1362b9bf971bcd.0p-59,	/* 0.00946564784943673166728 */
+};
+
+#ifdef INLINE_KERNEL_TANDF
+static __inline
+#endif
+float
+__kernel_tandf(double x, int iy)
+{
+	double z,r,w,s,t,u;
+
+	z	=  x*x;
+	/*
+	 * Split up the polynomial into small independent terms to give
+	 * opportunities for parallel evaluation.  The chosen splitting is
+	 * micro-optimized for Athlons (XP, X64).  It costs 2 multiplications
+	 * relative to Horner's method on sequential machines.
+	 *
+	 * We add the small terms from lowest degree up for efficiency on
+	 * non-sequential machines (the lowest degree terms tend to be ready
+	 * earlier).  Apart from this, we don't care about order of
+	 * operations, and don't need to to care since we have precision to
+	 * spare.  However, the chosen splitting is good for accuracy too,
+	 * and would give results as accurate as Horner's method if the
+	 * small terms were added from highest degree down.
+	 */
+	r = T[4]+z*T[5];
+	t = T[2]+z*T[3];
+	w = z*z;
+	s = z*x;
+	u = T[0]+z*T[1];
+	r = (x+s*u)+(s*w)*(t+w*r);
+	if(iy==1) return r;
+	else return -1.0/r;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/math_private.h b/libm/upstream-freebsd/lib/msun/src/math_private.h
new file mode 100644
index 0000000..1f10e8b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/math_private.h
@@ -0,0 +1,776 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD: head/lib/msun/src/math_private.h 276176 2014-12-24 10:13:53Z ed $
+ */
+
+#ifndef _MATH_PRIVATE_H_
+#define	_MATH_PRIVATE_H_
+
+#include <sys/types.h>
+#include <machine/endian.h>
+
+/*
+ * The original fdlibm code used statements like:
+ *	n0 = ((*(int*)&one)>>29)^1;		* index of high word *
+ *	ix0 = *(n0+(int*)&x);			* high word of x *
+ *	ix1 = *((1-n0)+(int*)&x);		* low word of x *
+ * to dig two 32 bit words out of the 64 bit IEEE floating point
+ * value.  That is non-ANSI, and, moreover, the gcc instruction
+ * scheduler gets it wrong.  We instead use the following macros.
+ * Unlike the original code, we determine the endianness at compile
+ * time, not at run time; I don't see much benefit to selecting
+ * endianness at run time.
+ */
+
+/*
+ * A union which permits us to convert between a double and two 32 bit
+ * ints.
+ */
+
+#ifdef __arm__
+#if defined(__VFP_FP__) || defined(__ARM_EABI__)
+#define	IEEE_WORD_ORDER	BYTE_ORDER
+#else
+#define	IEEE_WORD_ORDER	BIG_ENDIAN
+#endif
+#else /* __arm__ */
+#define	IEEE_WORD_ORDER	BYTE_ORDER
+#endif
+
+#if IEEE_WORD_ORDER == BIG_ENDIAN
+
+typedef union
+{
+  double value;
+  struct
+  {
+    u_int32_t msw;
+    u_int32_t lsw;
+  } parts;
+  struct
+  {
+    u_int64_t w;
+  } xparts;
+} ieee_double_shape_type;
+
+#endif
+
+#if IEEE_WORD_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+  double value;
+  struct
+  {
+    u_int32_t lsw;
+    u_int32_t msw;
+  } parts;
+  struct
+  {
+    u_int64_t w;
+  } xparts;
+} ieee_double_shape_type;
+
+#endif
+
+/* Get two 32 bit ints from a double.  */
+
+#define EXTRACT_WORDS(ix0,ix1,d)				\
+do {								\
+  ieee_double_shape_type ew_u;					\
+  ew_u.value = (d);						\
+  (ix0) = ew_u.parts.msw;					\
+  (ix1) = ew_u.parts.lsw;					\
+} while (0)
+
+/* Get a 64-bit int from a double. */
+#define EXTRACT_WORD64(ix,d)					\
+do {								\
+  ieee_double_shape_type ew_u;					\
+  ew_u.value = (d);						\
+  (ix) = ew_u.xparts.w;						\
+} while (0)
+
+/* Get the more significant 32 bit int from a double.  */
+
+#define GET_HIGH_WORD(i,d)					\
+do {								\
+  ieee_double_shape_type gh_u;					\
+  gh_u.value = (d);						\
+  (i) = gh_u.parts.msw;						\
+} while (0)
+
+/* Get the less significant 32 bit int from a double.  */
+
+#define GET_LOW_WORD(i,d)					\
+do {								\
+  ieee_double_shape_type gl_u;					\
+  gl_u.value = (d);						\
+  (i) = gl_u.parts.lsw;						\
+} while (0)
+
+/* Set a double from two 32 bit ints.  */
+
+#define INSERT_WORDS(d,ix0,ix1)					\
+do {								\
+  ieee_double_shape_type iw_u;					\
+  iw_u.parts.msw = (ix0);					\
+  iw_u.parts.lsw = (ix1);					\
+  (d) = iw_u.value;						\
+} while (0)
+
+/* Set a double from a 64-bit int. */
+#define INSERT_WORD64(d,ix)					\
+do {								\
+  ieee_double_shape_type iw_u;					\
+  iw_u.xparts.w = (ix);						\
+  (d) = iw_u.value;						\
+} while (0)
+
+/* Set the more significant 32 bits of a double from an int.  */
+
+#define SET_HIGH_WORD(d,v)					\
+do {								\
+  ieee_double_shape_type sh_u;					\
+  sh_u.value = (d);						\
+  sh_u.parts.msw = (v);						\
+  (d) = sh_u.value;						\
+} while (0)
+
+/* Set the less significant 32 bits of a double from an int.  */
+
+#define SET_LOW_WORD(d,v)					\
+do {								\
+  ieee_double_shape_type sl_u;					\
+  sl_u.value = (d);						\
+  sl_u.parts.lsw = (v);						\
+  (d) = sl_u.value;						\
+} while (0)
+
+/*
+ * A union which permits us to convert between a float and a 32 bit
+ * int.
+ */
+
+typedef union
+{
+  float value;
+  /* FIXME: Assumes 32 bit int.  */
+  unsigned int word;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float.  */
+
+#define GET_FLOAT_WORD(i,d)					\
+do {								\
+  ieee_float_shape_type gf_u;					\
+  gf_u.value = (d);						\
+  (i) = gf_u.word;						\
+} while (0)
+
+/* Set a float from a 32 bit int.  */
+
+#define SET_FLOAT_WORD(d,i)					\
+do {								\
+  ieee_float_shape_type sf_u;					\
+  sf_u.word = (i);						\
+  (d) = sf_u.value;						\
+} while (0)
+
+/*
+ * Get expsign and mantissa as 16 bit and 64 bit ints from an 80 bit long
+ * double.
+ */
+
+#define	EXTRACT_LDBL80_WORDS(ix0,ix1,d)				\
+do {								\
+  union IEEEl2bits ew_u;					\
+  ew_u.e = (d);							\
+  (ix0) = ew_u.xbits.expsign;					\
+  (ix1) = ew_u.xbits.man;					\
+} while (0)
+
+/*
+ * Get expsign and mantissa as one 16 bit and two 64 bit ints from a 128 bit
+ * long double.
+ */
+
+#define	EXTRACT_LDBL128_WORDS(ix0,ix1,ix2,d)			\
+do {								\
+  union IEEEl2bits ew_u;					\
+  ew_u.e = (d);							\
+  (ix0) = ew_u.xbits.expsign;					\
+  (ix1) = ew_u.xbits.manh;					\
+  (ix2) = ew_u.xbits.manl;					\
+} while (0)
+
+/* Get expsign as a 16 bit int from a long double.  */
+
+#define	GET_LDBL_EXPSIGN(i,d)					\
+do {								\
+  union IEEEl2bits ge_u;					\
+  ge_u.e = (d);							\
+  (i) = ge_u.xbits.expsign;					\
+} while (0)
+
+/*
+ * Set an 80 bit long double from a 16 bit int expsign and a 64 bit int
+ * mantissa.
+ */
+
+#define	INSERT_LDBL80_WORDS(d,ix0,ix1)				\
+do {								\
+  union IEEEl2bits iw_u;					\
+  iw_u.xbits.expsign = (ix0);					\
+  iw_u.xbits.man = (ix1);					\
+  (d) = iw_u.e;							\
+} while (0)
+
+/*
+ * Set a 128 bit long double from a 16 bit int expsign and two 64 bit ints
+ * comprising the mantissa.
+ */
+
+#define	INSERT_LDBL128_WORDS(d,ix0,ix1,ix2)			\
+do {								\
+  union IEEEl2bits iw_u;					\
+  iw_u.xbits.expsign = (ix0);					\
+  iw_u.xbits.manh = (ix1);					\
+  iw_u.xbits.manl = (ix2);					\
+  (d) = iw_u.e;							\
+} while (0)
+
+/* Set expsign of a long double from a 16 bit int.  */
+
+#define	SET_LDBL_EXPSIGN(d,v)					\
+do {								\
+  union IEEEl2bits se_u;					\
+  se_u.e = (d);							\
+  se_u.xbits.expsign = (v);					\
+  (d) = se_u.e;							\
+} while (0)
+
+#ifdef __i386__
+/* Long double constants are broken on i386. */
+#define	LD80C(m, ex, v) {						\
+	.xbits.man = __CONCAT(m, ULL),					\
+	.xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0),	\
+}
+#else
+/* The above works on non-i386 too, but we use this to check v. */
+#define	LD80C(m, ex, v)	{ .e = (v), }
+#endif
+
+#ifdef FLT_EVAL_METHOD
+/*
+ * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
+ */
+#if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
+#define	STRICT_ASSIGN(type, lval, rval)	((lval) = (rval))
+#else
+#define	STRICT_ASSIGN(type, lval, rval) do {	\
+	volatile type __lval;			\
+						\
+	if (sizeof(type) >= sizeof(long double))	\
+		(lval) = (rval);		\
+	else {					\
+		__lval = (rval);		\
+		(lval) = __lval;		\
+	}					\
+} while (0)
+#endif
+#endif /* FLT_EVAL_METHOD */
+
+/* Support switching the mode to FP_PE if necessary. */
+#if defined(__i386__) && !defined(NO_FPSETPREC)
+#define	ENTERI()				\
+	long double __retval;			\
+	fp_prec_t __oprec;			\
+						\
+	if ((__oprec = fpgetprec()) != FP_PE)	\
+		fpsetprec(FP_PE)
+#define	RETURNI(x) do {				\
+	__retval = (x);				\
+	if (__oprec != FP_PE)			\
+		fpsetprec(__oprec);		\
+	RETURNF(__retval);			\
+} while (0)
+#else
+#define	ENTERI(x)
+#define	RETURNI(x)	RETURNF(x)
+#endif
+
+/* Default return statement if hack*_t() is not used. */
+#define      RETURNF(v)      return (v)
+
+/*
+ * 2sum gives the same result as 2sumF without requiring |a| >= |b| or
+ * a == 0, but is slower.
+ */
+#define	_2sum(a, b) do {	\
+	__typeof(a) __s, __w;	\
+				\
+	__w = (a) + (b);	\
+	__s = __w - (a);	\
+	(b) = ((a) - (__w - __s)) + ((b) - __s); \
+	(a) = __w;		\
+} while (0)
+
+/*
+ * 2sumF algorithm.
+ *
+ * "Normalize" the terms in the infinite-precision expression a + b for
+ * the sum of 2 floating point values so that b is as small as possible
+ * relative to 'a'.  (The resulting 'a' is the value of the expression in
+ * the same precision as 'a' and the resulting b is the rounding error.)
+ * |a| must be >= |b| or 0, b's type must be no larger than 'a's type, and
+ * exponent overflow or underflow must not occur.  This uses a Theorem of
+ * Dekker (1971).  See Knuth (1981) 4.2.2 Theorem C.  The name "TwoSum"
+ * is apparently due to Skewchuk (1997).
+ *
+ * For this to always work, assignment of a + b to 'a' must not retain any
+ * extra precision in a + b.  This is required by C standards but broken
+ * in many compilers.  The brokenness cannot be worked around using
+ * STRICT_ASSIGN() like we do elsewhere, since the efficiency of this
+ * algorithm would be destroyed by non-null strict assignments.  (The
+ * compilers are correct to be broken -- the efficiency of all floating
+ * point code calculations would be destroyed similarly if they forced the
+ * conversions.)
+ *
+ * Fortunately, a case that works well can usually be arranged by building
+ * any extra precision into the type of 'a' -- 'a' should have type float_t,
+ * double_t or long double.  b's type should be no larger than 'a's type.
+ * Callers should use these types with scopes as large as possible, to
+ * reduce their own extra-precision and efficiciency problems.  In
+ * particular, they shouldn't convert back and forth just to call here.
+ */
+#ifdef DEBUG
+#define	_2sumF(a, b) do {				\
+	__typeof(a) __w;				\
+	volatile __typeof(a) __ia, __ib, __r, __vw;	\
+							\
+	__ia = (a);					\
+	__ib = (b);					\
+	assert(__ia == 0 || fabsl(__ia) >= fabsl(__ib));	\
+							\
+	__w = (a) + (b);				\
+	(b) = ((a) - __w) + (b);			\
+	(a) = __w;					\
+							\
+	/* The next 2 assertions are weak if (a) is already long double. */ \
+	assert((long double)__ia + __ib == (long double)(a) + (b));	\
+	__vw = __ia + __ib;				\
+	__r = __ia - __vw;				\
+	__r += __ib;					\
+	assert(__vw == (a) && __r == (b));		\
+} while (0)
+#else /* !DEBUG */
+#define	_2sumF(a, b) do {	\
+	__typeof(a) __w;	\
+				\
+	__w = (a) + (b);	\
+	(b) = ((a) - __w) + (b); \
+	(a) = __w;		\
+} while (0)
+#endif /* DEBUG */
+
+/*
+ * Set x += c, where x is represented in extra precision as a + b.
+ * x must be sufficiently normalized and sufficiently larger than c,
+ * and the result is then sufficiently normalized.
+ *
+ * The details of ordering are that |a| must be >= |c| (so that (a, c)
+ * can be normalized without extra work to swap 'a' with c).  The details of
+ * the normalization are that b must be small relative to the normalized 'a'.
+ * Normalization of (a, c) makes the normalized c tiny relative to the
+ * normalized a, so b remains small relative to 'a' in the result.  However,
+ * b need not ever be tiny relative to 'a'.  For example, b might be about
+ * 2**20 times smaller than 'a' to give about 20 extra bits of precision.
+ * That is usually enough, and adding c (which by normalization is about
+ * 2**53 times smaller than a) cannot change b significantly.  However,
+ * cancellation of 'a' with c in normalization of (a, c) may reduce 'a'
+ * significantly relative to b.  The caller must ensure that significant
+ * cancellation doesn't occur, either by having c of the same sign as 'a',
+ * or by having |c| a few percent smaller than |a|.  Pre-normalization of
+ * (a, b) may help.
+ *
+ * This is is a variant of an algorithm of Kahan (see Knuth (1981) 4.2.2
+ * exercise 19).  We gain considerable efficiency by requiring the terms to
+ * be sufficiently normalized and sufficiently increasing.
+ */
+#define	_3sumF(a, b, c) do {	\
+	__typeof(a) __tmp;	\
+				\
+	__tmp = (c);		\
+	_2sumF(__tmp, (a));	\
+	(b) += (a);		\
+	(a) = __tmp;		\
+} while (0)
+
+/*
+ * Common routine to process the arguments to nan(), nanf(), and nanl().
+ */
+void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
+
+#ifdef _COMPLEX_H
+
+/*
+ * C99 specifies that complex numbers have the same representation as
+ * an array of two elements, where the first element is the real part
+ * and the second element is the imaginary part.
+ */
+typedef union {
+	float complex f;
+	float a[2];
+} float_complex;
+typedef union {
+	double complex f;
+	double a[2];
+} double_complex;
+typedef union {
+	long double complex f;
+	long double a[2];
+} long_double_complex;
+#define	REALPART(z)	((z).a[0])
+#define	IMAGPART(z)	((z).a[1])
+
+/*
+ * Inline functions that can be used to construct complex values.
+ *
+ * The C99 standard intends x+I*y to be used for this, but x+I*y is
+ * currently unusable in general since gcc introduces many overflow,
+ * underflow, sign and efficiency bugs by rewriting I*y as
+ * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
+ * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
+ * to -0.0+I*0.0.
+ *
+ * The C11 standard introduced the macros CMPLX(), CMPLXF() and CMPLXL()
+ * to construct complex values.  Compilers that conform to the C99
+ * standard require the following functions to avoid the above issues.
+ */
+
+#ifndef CMPLXF
+static __inline float complex
+CMPLXF(float x, float y)
+{
+	float_complex z;
+
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
+}
+#endif
+
+#ifndef CMPLX
+static __inline double complex
+CMPLX(double x, double y)
+{
+	double_complex z;
+
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
+}
+#endif
+
+#ifndef CMPLXL
+static __inline long double complex
+CMPLXL(long double x, long double y)
+{
+	long_double_complex z;
+
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
+}
+#endif
+
+#endif /* _COMPLEX_H */
+ 
+#ifdef __GNUCLIKE_ASM
+
+/* Asm versions of some functions. */
+
+#ifdef __amd64__
+static __inline int
+irint(double x)
+{
+	int n;
+
+	asm("cvtsd2si %1,%0" : "=r" (n) : "x" (x));
+	return (n);
+}
+#define	HAVE_EFFICIENT_IRINT
+#endif
+
+#ifdef __i386__
+static __inline int
+irint(double x)
+{
+	int n;
+
+	asm("fistl %0" : "=m" (n) : "t" (x));
+	return (n);
+}
+#define	HAVE_EFFICIENT_IRINT
+#endif
+
+#if defined(__amd64__) || defined(__i386__)
+static __inline int
+irintl(long double x)
+{
+	int n;
+
+	asm("fistl %0" : "=m" (n) : "t" (x));
+	return (n);
+}
+#define	HAVE_EFFICIENT_IRINTL
+#endif
+
+#endif /* __GNUCLIKE_ASM */
+
+#ifdef DEBUG
+#if defined(__amd64__) || defined(__i386__)
+#define	breakpoint()	asm("int $3")
+#else
+#include <signal.h>
+
+#define	breakpoint()	raise(SIGTRAP)
+#endif
+#endif
+
+/* Write a pari script to test things externally. */
+#ifdef DOPRINT
+#include <stdio.h>
+
+#ifndef DOPRINT_SWIZZLE
+#define	DOPRINT_SWIZZLE		0
+#endif
+
+#ifdef DOPRINT_LD80
+
+#define	DOPRINT_START(xp) do {						\
+	uint64_t __lx;							\
+	uint16_t __hx;							\
+									\
+	/* Hack to give more-problematic args. */			\
+	EXTRACT_LDBL80_WORDS(__hx, __lx, *xp);				\
+	__lx ^= DOPRINT_SWIZZLE;					\
+	INSERT_LDBL80_WORDS(*xp, __hx, __lx);				\
+	printf("x = %.21Lg; ", (long double)*xp);			\
+} while (0)
+#define	DOPRINT_END1(v)							\
+	printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define	DOPRINT_END2(hi, lo)						\
+	printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n",		\
+	    (long double)(hi), (long double)(lo))
+
+#elif defined(DOPRINT_D64)
+
+#define	DOPRINT_START(xp) do {						\
+	uint32_t __hx, __lx;						\
+									\
+	EXTRACT_WORDS(__hx, __lx, *xp);					\
+	__lx ^= DOPRINT_SWIZZLE;					\
+	INSERT_WORDS(*xp, __hx, __lx);					\
+	printf("x = %.21Lg; ", (long double)*xp);			\
+} while (0)
+#define	DOPRINT_END1(v)							\
+	printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define	DOPRINT_END2(hi, lo)						\
+	printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n",		\
+	    (long double)(hi), (long double)(lo))
+
+#elif defined(DOPRINT_F32)
+
+#define	DOPRINT_START(xp) do {						\
+	uint32_t __hx;							\
+									\
+	GET_FLOAT_WORD(__hx, *xp);					\
+	__hx ^= DOPRINT_SWIZZLE;					\
+	SET_FLOAT_WORD(*xp, __hx);					\
+	printf("x = %.21Lg; ", (long double)*xp);			\
+} while (0)
+#define	DOPRINT_END1(v)							\
+	printf("y = %.21Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define	DOPRINT_END2(hi, lo)						\
+	printf("y = %.21Lg; z = %.21Lg; show(x, y, z);\n",		\
+	    (long double)(hi), (long double)(lo))
+
+#else /* !DOPRINT_LD80 && !DOPRINT_D64 (LD128 only) */
+
+#ifndef DOPRINT_SWIZZLE_HIGH
+#define	DOPRINT_SWIZZLE_HIGH	0
+#endif
+
+#define	DOPRINT_START(xp) do {						\
+	uint64_t __lx, __llx;						\
+	uint16_t __hx;							\
+									\
+	EXTRACT_LDBL128_WORDS(__hx, __lx, __llx, *xp);			\
+	__llx ^= DOPRINT_SWIZZLE;					\
+	__lx ^= DOPRINT_SWIZZLE_HIGH;					\
+	INSERT_LDBL128_WORDS(*xp, __hx, __lx, __llx);			\
+	printf("x = %.36Lg; ", (long double)*xp);					\
+} while (0)
+#define	DOPRINT_END1(v)							\
+	printf("y = %.36Lg; z = 0; show(x, y, z);\n", (long double)(v))
+#define	DOPRINT_END2(hi, lo)						\
+	printf("y = %.36Lg; z = %.36Lg; show(x, y, z);\n",		\
+	    (long double)(hi), (long double)(lo))
+
+#endif /* DOPRINT_LD80 */
+
+#else /* !DOPRINT */
+#define	DOPRINT_START(xp)
+#define	DOPRINT_END1(v)
+#define	DOPRINT_END2(hi, lo)
+#endif /* DOPRINT */
+
+#define	RETURNP(x) do {			\
+	DOPRINT_END1(x);		\
+	RETURNF(x);			\
+} while (0)
+#define	RETURNPI(x) do {		\
+	DOPRINT_END1(x);		\
+	RETURNI(x);			\
+} while (0)
+#define	RETURN2P(x, y) do {		\
+	DOPRINT_END2((x), (y));		\
+	RETURNF((x) + (y));		\
+} while (0)
+#define	RETURN2PI(x, y) do {		\
+	DOPRINT_END2((x), (y));		\
+	RETURNI((x) + (y));		\
+} while (0)
+#ifdef STRUCT_RETURN
+#define	RETURNSP(rp) do {		\
+	if (!(rp)->lo_set)		\
+		RETURNP((rp)->hi);	\
+	RETURN2P((rp)->hi, (rp)->lo);	\
+} while (0)
+#define	RETURNSPI(rp) do {		\
+	if (!(rp)->lo_set)		\
+		RETURNPI((rp)->hi);	\
+	RETURN2PI((rp)->hi, (rp)->lo);	\
+} while (0)
+#endif
+#define	SUM2P(x, y) ({			\
+	const __typeof (x) __x = (x);	\
+	const __typeof (y) __y = (y);	\
+					\
+	DOPRINT_END2(__x, __y);		\
+	__x + __y;			\
+})
+
+/*
+ * ieee style elementary functions
+ *
+ * We rename functions here to improve other sources' diffability
+ * against fdlibm.
+ */
+#define	__ieee754_sqrt	sqrt
+#define	__ieee754_acos	acos
+#define	__ieee754_acosh	acosh
+#define	__ieee754_log	log
+#define	__ieee754_log2	log2
+#define	__ieee754_atanh	atanh
+#define	__ieee754_asin	asin
+#define	__ieee754_atan2	atan2
+#define	__ieee754_exp	exp
+#define	__ieee754_cosh	cosh
+#define	__ieee754_fmod	fmod
+#define	__ieee754_pow	pow
+#define	__ieee754_lgamma lgamma
+#define	__ieee754_gamma	gamma
+#define	__ieee754_lgamma_r lgamma_r
+#define	__ieee754_gamma_r gamma_r
+#define	__ieee754_log10	log10
+#define	__ieee754_sinh	sinh
+#define	__ieee754_hypot	hypot
+#define	__ieee754_j0	j0
+#define	__ieee754_j1	j1
+#define	__ieee754_y0	y0
+#define	__ieee754_y1	y1
+#define	__ieee754_jn	jn
+#define	__ieee754_yn	yn
+#define	__ieee754_remainder remainder
+#define	__ieee754_scalb	scalb
+#define	__ieee754_sqrtf	sqrtf
+#define	__ieee754_acosf	acosf
+#define	__ieee754_acoshf acoshf
+#define	__ieee754_logf	logf
+#define	__ieee754_atanhf atanhf
+#define	__ieee754_asinf	asinf
+#define	__ieee754_atan2f atan2f
+#define	__ieee754_expf	expf
+#define	__ieee754_coshf	coshf
+#define	__ieee754_fmodf	fmodf
+#define	__ieee754_powf	powf
+#define	__ieee754_lgammaf lgammaf
+#define	__ieee754_gammaf gammaf
+#define	__ieee754_lgammaf_r lgammaf_r
+#define	__ieee754_gammaf_r gammaf_r
+#define	__ieee754_log10f log10f
+#define	__ieee754_log2f log2f
+#define	__ieee754_sinhf	sinhf
+#define	__ieee754_hypotf hypotf
+#define	__ieee754_j0f	j0f
+#define	__ieee754_j1f	j1f
+#define	__ieee754_y0f	y0f
+#define	__ieee754_y1f	y1f
+#define	__ieee754_jnf	jnf
+#define	__ieee754_ynf	ynf
+#define	__ieee754_remainderf remainderf
+#define	__ieee754_scalbf scalbf
+
+/* fdlibm kernel function */
+int	__kernel_rem_pio2(double*,double*,int,int,int);
+
+/* double precision kernel functions */
+#ifndef INLINE_REM_PIO2
+int	__ieee754_rem_pio2(double,double*);
+#endif
+double	__kernel_sin(double,double,int);
+double	__kernel_cos(double,double);
+double	__kernel_tan(double,double,int);
+double	__ldexp_exp(double,int);
+#ifdef _COMPLEX_H
+double complex __ldexp_cexp(double complex,int);
+#endif
+
+/* float precision kernel functions */
+#ifndef INLINE_REM_PIO2F
+int	__ieee754_rem_pio2f(float,double*);
+#endif
+#ifndef INLINE_KERNEL_SINDF
+float	__kernel_sindf(double);
+#endif
+#ifndef INLINE_KERNEL_COSDF
+float	__kernel_cosdf(double);
+#endif
+#ifndef INLINE_KERNEL_TANDF
+float	__kernel_tandf(double,int);
+#endif
+float	__ldexp_expf(float,int);
+#ifdef _COMPLEX_H
+float complex __ldexp_cexpf(float complex,int);
+#endif
+
+/* long double precision kernel functions */
+long double __kernel_sinl(long double, long double, int);
+long double __kernel_cosl(long double, long double);
+long double __kernel_tanl(long double, long double, int);
+
+#endif /* !_MATH_PRIVATE_H_ */
diff --git a/libm/upstream-freebsd/lib/msun/src/s_asinh.c b/libm/upstream-freebsd/lib/msun/src/s_asinh.c
new file mode 100644
index 0000000..cbb3d46
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_asinh.c
@@ -0,0 +1,62 @@
+/* @(#)s_asinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* asinh(x)
+ * Method :
+ *	Based on
+ *		asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
+ *	we have
+ *	asinh(x) := x  if  1+x*x=1,
+ *		 := sign(x)*(log(x)+ln2)) for large |x|, else
+ *		 := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
+ *		 := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+ln2 =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
+huge=  1.00000000000000000000e+300;
+
+double
+asinh(double x)
+{
+	double t,w;
+	int32_t hx,ix;
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) return x+x;	/* x is inf or NaN */
+	if(ix< 0x3e300000) {	/* |x|<2**-28 */
+	    if(huge+x>one) return x;	/* return x inexact except 0 */
+	}
+	if(ix>0x41b00000) {	/* |x| > 2**28 */
+	    w = __ieee754_log(fabs(x))+ln2;
+	} else if (ix>0x40000000) {	/* 2**28 > |x| > 2.0 */
+	    t = fabs(x);
+	    w = __ieee754_log(2.0*t+one/(__ieee754_sqrt(x*x+one)+t));
+	} else {		/* 2.0 > |x| > 2**-28 */
+	    t = x*x;
+	    w =log1p(fabs(x)+t/(one+__ieee754_sqrt(one+t)));
+	}
+	if(hx>0) return w; else return -w;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(asinh, asinhl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_asinhf.c b/libm/upstream-freebsd/lib/msun/src/s_asinhf.c
new file mode 100644
index 0000000..c1620dd
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_asinhf.c
@@ -0,0 +1,48 @@
+/* s_asinhf.c -- float version of s_asinh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one =  1.0000000000e+00, /* 0x3F800000 */
+ln2 =  6.9314718246e-01, /* 0x3f317218 */
+huge=  1.0000000000e+30;
+
+float
+asinhf(float x)
+{
+	float t,w;
+	int32_t hx,ix;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) return x+x;	/* x is inf or NaN */
+	if(ix< 0x31800000) {	/* |x|<2**-28 */
+	    if(huge+x>one) return x;	/* return x inexact except 0 */
+	}
+	if(ix>0x4d800000) {	/* |x| > 2**28 */
+	    w = __ieee754_logf(fabsf(x))+ln2;
+	} else if (ix>0x40000000) {	/* 2**28 > |x| > 2.0 */
+	    t = fabsf(x);
+	    w = __ieee754_logf((float)2.0*t+one/(__ieee754_sqrtf(x*x+one)+t));
+	} else {		/* 2.0 > |x| > 2**-28 */
+	    t = x*x;
+	    w =log1pf(fabsf(x)+t/(one+__ieee754_sqrtf(one+t)));
+	}
+	if(hx>0) return w; else return -w;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_asinhl.c b/libm/upstream-freebsd/lib/msun/src/s_asinhl.c
new file mode 100644
index 0000000..ba28f59
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_asinhl.c
@@ -0,0 +1,91 @@
+/* from: FreeBSD: head/lib/msun/src/e_acosh.c 176451 2008-02-22 02:30:36Z das */
+
+/* @(#)s_asinh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_asinh.c for complete comments.
+ *
+ * Converted to long double by David Schultz <das@FreeBSD.ORG> and
+ * Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+/* EXP_LARGE is the threshold above which we use asinh(x) ~= log(2x). */
+/* EXP_TINY is the threshold below which we use asinh(x) ~= x. */
+#if LDBL_MANT_DIG == 64
+#define	EXP_LARGE	34
+#define	EXP_TINY	-34
+#elif LDBL_MANT_DIG == 113
+#define	EXP_LARGE	58
+#define	EXP_TINY	-58
+#else
+#error "Unsupported long double format"
+#endif
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const double
+one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+huge=  1.00000000000000000000e+300;
+
+#if LDBL_MANT_DIG == 64
+static const union IEEEl2bits
+u_ln2 =  LD80C(0xb17217f7d1cf79ac, -1, 6.93147180559945309417e-1L);
+#define	ln2	u_ln2.e
+#elif LDBL_MANT_DIG == 113
+static const long double
+ln2 =  6.93147180559945309417232121458176568e-1L;	/* 0x162e42fefa39ef35793c7673007e6.0p-113 */
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+asinhl(long double x)
+{
+	long double t, w;
+	uint16_t hx, ix;
+
+	ENTERI();
+	GET_LDBL_EXPSIGN(hx, x);
+	ix = hx & 0x7fff;
+	if (ix >= 0x7fff) RETURNI(x+x);	/* x is inf, NaN or misnormal */
+	if (ix < BIAS + EXP_TINY) {	/* |x| < TINY, or misnormal */
+	    if (huge + x > one) RETURNI(x);	/* return x inexact except 0 */
+	}
+	if (ix >= BIAS + EXP_LARGE) {	/* |x| >= LARGE, or misnormal */
+	    w = logl(fabsl(x))+ln2;
+	} else if (ix >= 0x4000) {	/* LARGE > |x| >= 2.0, or misnormal */
+	    t = fabsl(x);
+	    w = logl(2.0*t+one/(sqrtl(x*x+one)+t));
+	} else {		/* 2.0 > |x| >= TINY, or misnormal */
+	    t = x*x;
+	    w =log1pl(fabsl(x)+t/(one+sqrtl(one+t)));
+	}
+	RETURNI((hx & 0x8000) == 0 ? w : -w);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_atan.c b/libm/upstream-freebsd/lib/msun/src/s_atan.c
new file mode 100644
index 0000000..566f5dc
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_atan.c
@@ -0,0 +1,124 @@
+/* @(#)s_atan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* atan(x)
+ * Method
+ *   1. Reduce x to positive by atan(x) = -atan(-x).
+ *   2. According to the integer k=4t+0.25 chopped, t=x, the argument
+ *      is further reduced to one of the following intervals and the
+ *      arctangent of t is evaluated by the corresponding formula:
+ *
+ *      [0,7/16]      atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
+ *      [7/16,11/16]  atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
+ *      [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
+ *      [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
+ *      [39/16,INF]   atan(x) = atan(INF) + atan( -1/t )
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double atanhi[] = {
+  4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
+  7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
+  9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
+  1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
+};
+
+static const double atanlo[] = {
+  2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
+  3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
+  1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
+  6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
+};
+
+static const double aT[] = {
+  3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
+ -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
+  1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
+ -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
+  9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
+ -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
+  6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
+ -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
+  4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
+ -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
+  1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
+};
+
+	static const double
+one   = 1.0,
+huge   = 1.0e300;
+
+double
+atan(double x)
+{
+	double w,s1,s2,z;
+	int32_t ix,hx,id;
+
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x44100000) {	/* if |x| >= 2^66 */
+	    u_int32_t low;
+	    GET_LOW_WORD(low,x);
+	    if(ix>0x7ff00000||
+		(ix==0x7ff00000&&(low!=0)))
+		return x+x;		/* NaN */
+	    if(hx>0) return  atanhi[3]+*(volatile double *)&atanlo[3];
+	    else     return -atanhi[3]-*(volatile double *)&atanlo[3];
+	} if (ix < 0x3fdc0000) {	/* |x| < 0.4375 */
+	    if (ix < 0x3e400000) {	/* |x| < 2^-27 */
+		if(huge+x>one) return x;	/* raise inexact */
+	    }
+	    id = -1;
+	} else {
+	x = fabs(x);
+	if (ix < 0x3ff30000) {		/* |x| < 1.1875 */
+	    if (ix < 0x3fe60000) {	/* 7/16 <=|x|<11/16 */
+		id = 0; x = (2.0*x-one)/(2.0+x);
+	    } else {			/* 11/16<=|x|< 19/16 */
+		id = 1; x  = (x-one)/(x+one);
+	    }
+	} else {
+	    if (ix < 0x40038000) {	/* |x| < 2.4375 */
+		id = 2; x  = (x-1.5)/(one+1.5*x);
+	    } else {			/* 2.4375 <= |x| < 2^66 */
+		id = 3; x  = -1.0/x;
+	    }
+	}}
+    /* end of argument reduction */
+	z = x*x;
+	w = z*z;
+    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+	s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
+	s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
+	if (id<0) return x - x*(s1+s2);
+	else {
+	    z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+	    return (hx<0)? -z:z;
+	}
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(atan, atanl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_atanf.c b/libm/upstream-freebsd/lib/msun/src/s_atanf.c
new file mode 100644
index 0000000..b3a371f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_atanf.c
@@ -0,0 +1,92 @@
+/* s_atanf.c -- float version of s_atan.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float atanhi[] = {
+  4.6364760399e-01, /* atan(0.5)hi 0x3eed6338 */
+  7.8539812565e-01, /* atan(1.0)hi 0x3f490fda */
+  9.8279368877e-01, /* atan(1.5)hi 0x3f7b985e */
+  1.5707962513e+00, /* atan(inf)hi 0x3fc90fda */
+};
+
+static const float atanlo[] = {
+  5.0121582440e-09, /* atan(0.5)lo 0x31ac3769 */
+  3.7748947079e-08, /* atan(1.0)lo 0x33222168 */
+  3.4473217170e-08, /* atan(1.5)lo 0x33140fb4 */
+  7.5497894159e-08, /* atan(inf)lo 0x33a22168 */
+};
+
+static const float aT[] = {
+  3.3333328366e-01,
+ -1.9999158382e-01,
+  1.4253635705e-01,
+ -1.0648017377e-01,
+  6.1687607318e-02,
+};
+
+static const float
+one   = 1.0,
+huge   = 1.0e30;
+
+float
+atanf(float x)
+{
+	float w,s1,s2,z;
+	int32_t ix,hx,id;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x4c800000) {	/* if |x| >= 2**26 */
+	    if(ix>0x7f800000)
+		return x+x;		/* NaN */
+	    if(hx>0) return  atanhi[3]+*(volatile float *)&atanlo[3];
+	    else     return -atanhi[3]-*(volatile float *)&atanlo[3];
+	} if (ix < 0x3ee00000) {	/* |x| < 0.4375 */
+	    if (ix < 0x39800000) {	/* |x| < 2**-12 */
+		if(huge+x>one) return x;	/* raise inexact */
+	    }
+	    id = -1;
+	} else {
+	x = fabsf(x);
+	if (ix < 0x3f980000) {		/* |x| < 1.1875 */
+	    if (ix < 0x3f300000) {	/* 7/16 <=|x|<11/16 */
+		id = 0; x = ((float)2.0*x-one)/((float)2.0+x);
+	    } else {			/* 11/16<=|x|< 19/16 */
+		id = 1; x  = (x-one)/(x+one);
+	    }
+	} else {
+	    if (ix < 0x401c0000) {	/* |x| < 2.4375 */
+		id = 2; x  = (x-(float)1.5)/(one+(float)1.5*x);
+	    } else {			/* 2.4375 <= |x| < 2**26 */
+		id = 3; x  = -(float)1.0/x;
+	    }
+	}}
+    /* end of argument reduction */
+	z = x*x;
+	w = z*z;
+    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
+	s1 = z*(aT[0]+w*(aT[2]+w*aT[4]));
+	s2 = w*(aT[1]+w*aT[3]);
+	if (id<0) return x - x*(s1+s2);
+	else {
+	    z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+	    return (hx<0)? -z:z;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_atanl.c b/libm/upstream-freebsd/lib/msun/src/s_atanl.c
new file mode 100644
index 0000000..ff29c3c
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_atanl.c
@@ -0,0 +1,85 @@
+/* @(#)s_atan.c 5.1 93/09/24 */
+/* FreeBSD: head/lib/msun/src/s_atan.c 176451 2008-02-22 02:30:36Z das */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See comments in s_atan.c.
+ * Converted to long double by David Schultz <das@FreeBSD.ORG>.
+ */
+
+#include <float.h>
+
+#include "invtrig.h"
+#include "math.h"
+#include "math_private.h"
+
+static const long double
+one   = 1.0,
+huge   = 1.0e300;
+
+long double
+atanl(long double x)
+{
+	union IEEEl2bits u;
+	long double w,s1,s2,z;
+	int id;
+	int16_t expsign, expt;
+	int32_t expman;
+
+	u.e = x;
+	expsign = u.xbits.expsign;
+	expt = expsign & 0x7fff;
+	if(expt >= ATAN_CONST) {	/* if |x| is large, atan(x)~=pi/2 */
+	    if(expt == BIAS + LDBL_MAX_EXP &&
+	       ((u.bits.manh&~LDBL_NBIT)|u.bits.manl)!=0)
+		return x+x;		/* NaN */
+	    if(expsign>0) return  atanhi[3]+atanlo[3];
+	    else     return -atanhi[3]-atanlo[3];
+	}
+	/* Extract the exponent and the first few bits of the mantissa. */
+	/* XXX There should be a more convenient way to do this. */
+	expman = (expt << 8) | ((u.bits.manh >> (MANH_SIZE - 9)) & 0xff);
+	if (expman < ((BIAS - 2) << 8) + 0xc0) {	/* |x| < 0.4375 */
+	    if (expt < ATAN_LINEAR) {	/* if |x| is small, atanl(x)~=x */
+		if(huge+x>one) return x;	/* raise inexact */
+	    }
+	    id = -1;
+	} else {
+	x = fabsl(x);
+	if (expman < (BIAS << 8) + 0x30) {		/* |x| < 1.1875 */
+	    if (expman < ((BIAS - 1) << 8) + 0x60) {	/* 7/16 <=|x|<11/16 */
+		id = 0; x = (2.0*x-one)/(2.0+x);
+	    } else {			/* 11/16<=|x|< 19/16 */
+		id = 1; x  = (x-one)/(x+one);
+	    }
+	} else {
+	    if (expman < ((BIAS + 1) << 8) + 0x38) {	/* |x| < 2.4375 */
+		id = 2; x  = (x-1.5)/(one+1.5*x);
+	    } else {			/* 2.4375 <= |x| < 2^ATAN_CONST */
+		id = 3; x  = -1.0/x;
+	    }
+	}}
+    /* end of argument reduction */
+	z = x*x;
+	w = z*z;
+    /* break sum aT[i]z**(i+1) into odd and even poly */
+	s1 = z*T_even(w);
+	s2 = w*T_odd(w);
+	if (id<0) return x - x*(s1+s2);
+	else {
+	    z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
+	    return (expsign<0)? -z:z;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_carg.c b/libm/upstream-freebsd/lib/msun/src/s_carg.c
new file mode 100644
index 0000000..ea1a0d7
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_carg.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <complex.h>
+#include <math.h>
+
+double
+carg(double complex z)
+{
+
+	return (atan2(cimag(z), creal(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cargf.c b/libm/upstream-freebsd/lib/msun/src/s_cargf.c
new file mode 100644
index 0000000..90232d0
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cargf.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <complex.h>
+#include <math.h>
+
+float
+cargf(float complex z)
+{
+
+	return (atan2f(cimagf(z), crealf(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cargl.c b/libm/upstream-freebsd/lib/msun/src/s_cargl.c
new file mode 100644
index 0000000..0555083
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cargl.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <complex.h>
+#include <math.h>
+
+long double
+cargl(long double complex z)
+{
+
+	return (atan2l(cimagl(z), creall(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cbrt.c b/libm/upstream-freebsd/lib/msun/src/s_cbrt.c
new file mode 100644
index 0000000..910f75b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cbrt.c
@@ -0,0 +1,117 @@
+/* @(#)s_cbrt.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * Optimized by Bruce D. Evans.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+/* cbrt(x)
+ * Return cube root of x
+ */
+static const u_int32_t
+	B1 = 715094163, /* B1 = (1023-1023/3-0.03306235651)*2**20 */
+	B2 = 696219795; /* B2 = (1023-1023/3-54/3-0.03306235651)*2**20 */
+
+/* |1/cbrt(x) - p(x)| < 2**-23.5 (~[-7.93e-8, 7.929e-8]). */
+static const double
+P0 =  1.87595182427177009643,		/* 0x3ffe03e6, 0x0f61e692 */
+P1 = -1.88497979543377169875,		/* 0xbffe28e0, 0x92f02420 */
+P2 =  1.621429720105354466140,		/* 0x3ff9f160, 0x4a49d6c2 */
+P3 = -0.758397934778766047437,		/* 0xbfe844cb, 0xbee751d9 */
+P4 =  0.145996192886612446982;		/* 0x3fc2b000, 0xd4e4edd7 */
+
+double
+cbrt(double x)
+{
+	int32_t	hx;
+	union {
+	    double value;
+	    uint64_t bits;
+	} u;
+	double r,s,t=0.0,w;
+	u_int32_t sign;
+	u_int32_t high,low;
+
+	EXTRACT_WORDS(hx,low,x);
+	sign=hx&0x80000000; 		/* sign= sign(x) */
+	hx  ^=sign;
+	if(hx>=0x7ff00000) return(x+x); /* cbrt(NaN,INF) is itself */
+
+    /*
+     * Rough cbrt to 5 bits:
+     *    cbrt(2**e*(1+m) ~= 2**(e/3)*(1+(e%3+m)/3)
+     * where e is integral and >= 0, m is real and in [0, 1), and "/" and
+     * "%" are integer division and modulus with rounding towards minus
+     * infinity.  The RHS is always >= the LHS and has a maximum relative
+     * error of about 1 in 16.  Adding a bias of -0.03306235651 to the
+     * (e%3+m)/3 term reduces the error to about 1 in 32. With the IEEE
+     * floating point representation, for finite positive normal values,
+     * ordinary integer divison of the value in bits magically gives
+     * almost exactly the RHS of the above provided we first subtract the
+     * exponent bias (1023 for doubles) and later add it back.  We do the
+     * subtraction virtually to keep e >= 0 so that ordinary integer
+     * division rounds towards minus infinity; this is also efficient.
+     */
+	if(hx<0x00100000) { 		/* zero or subnormal? */
+	    if((hx|low)==0)
+		return(x);		/* cbrt(0) is itself */
+	    SET_HIGH_WORD(t,0x43500000); /* set t= 2**54 */
+	    t*=x;
+	    GET_HIGH_WORD(high,t);
+	    INSERT_WORDS(t,sign|((high&0x7fffffff)/3+B2),0);
+	} else
+	    INSERT_WORDS(t,sign|(hx/3+B1),0);
+
+    /*
+     * New cbrt to 23 bits:
+     *    cbrt(x) = t*cbrt(x/t**3) ~= t*P(t**3/x)
+     * where P(r) is a polynomial of degree 4 that approximates 1/cbrt(r)
+     * to within 2**-23.5 when |r - 1| < 1/10.  The rough approximation
+     * has produced t such than |t/cbrt(x) - 1| ~< 1/32, and cubing this
+     * gives us bounds for r = t**3/x.
+     *
+     * Try to optimize for parallel evaluation as in k_tanf.c.
+     */
+	r=(t*t)*(t/x);
+	t=t*((P0+r*(P1+r*P2))+((r*r)*r)*(P3+r*P4));
+
+    /*
+     * Round t away from zero to 23 bits (sloppily except for ensuring that
+     * the result is larger in magnitude than cbrt(x) but not much more than
+     * 2 23-bit ulps larger).  With rounding towards zero, the error bound
+     * would be ~5/6 instead of ~4/6.  With a maximum error of 2 23-bit ulps
+     * in the rounded t, the infinite-precision error in the Newton
+     * approximation barely affects third digit in the final error
+     * 0.667; the error in the rounded t can be up to about 3 23-bit ulps
+     * before the final error is larger than 0.667 ulps.
+     */
+	u.value=t;
+	u.bits=(u.bits+0x80000000)&0xffffffffc0000000ULL;
+	t=u.value;
+
+    /* one step Newton iteration to 53 bits with error < 0.667 ulps */
+	s=t*t;				/* t*t is exact */
+	r=x/s;				/* error <= 0.5 ulps; |r| < |t| */
+	w=t+t;				/* t+t is exact */
+	r=(r-t)/(w+r);			/* r-t is exact; w+r ~= 3*t */
+	t=t+t*r;			/* error <= 0.5 + 0.5/3 + epsilon */
+
+	return(t);
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(cbrt, cbrtl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cbrtf.c b/libm/upstream-freebsd/lib/msun/src/s_cbrtf.c
new file mode 100644
index 0000000..454f974
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cbrtf.c
@@ -0,0 +1,73 @@
+/* s_cbrtf.c -- float version of s_cbrt.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged and optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+/* cbrtf(x)
+ * Return cube root of x
+ */
+static const unsigned
+	B1 = 709958130, /* B1 = (127-127.0/3-0.03306235651)*2**23 */
+	B2 = 642849266; /* B2 = (127-127.0/3-24/3-0.03306235651)*2**23 */
+
+float
+cbrtf(float x)
+{
+	double r,T;
+	float t;
+	int32_t hx;
+	u_int32_t sign;
+	u_int32_t high;
+
+	GET_FLOAT_WORD(hx,x);
+	sign=hx&0x80000000; 		/* sign= sign(x) */
+	hx  ^=sign;
+	if(hx>=0x7f800000) return(x+x); /* cbrt(NaN,INF) is itself */
+
+    /* rough cbrt to 5 bits */
+	if(hx<0x00800000) { 		/* zero or subnormal? */
+	    if(hx==0)
+		return(x);		/* cbrt(+-0) is itself */
+	    SET_FLOAT_WORD(t,0x4b800000); /* set t= 2**24 */
+	    t*=x;
+	    GET_FLOAT_WORD(high,t);
+	    SET_FLOAT_WORD(t,sign|((high&0x7fffffff)/3+B2));
+	} else
+	    SET_FLOAT_WORD(t,sign|(hx/3+B1));
+
+    /*
+     * First step Newton iteration (solving t*t-x/t == 0) to 16 bits.  In
+     * double precision so that its terms can be arranged for efficiency
+     * without causing overflow or underflow.
+     */
+	T=t;
+	r=T*T*T;
+	T=T*((double)x+x+r)/(x+r+r);
+
+    /*
+     * Second step Newton iteration to 47 bits.  In double precision for
+     * efficiency and accuracy.
+     */
+	r=T*T*T;
+	T=T*((double)x+x+r)/(x+r+r);
+
+    /* rounding to 24 bits is perfect in round-to-nearest mode */
+	return(T);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cbrtl.c b/libm/upstream-freebsd/lib/msun/src/s_cbrtl.c
new file mode 100644
index 0000000..2236c0f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cbrtl.c
@@ -0,0 +1,143 @@
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2009-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * The argument reduction and testing for exceptional cases was
+ * written by Steven G. Kargl with input from Bruce D. Evans
+ * and David A. Schultz.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"    
+#include "math.h"
+#include "math_private.h"
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const unsigned
+    B1 = 709958130;	/* B1 = (127-127.0/3-0.03306235651)*2**23 */
+
+long double
+cbrtl(long double x)
+{
+	union IEEEl2bits u, v;
+	long double r, s, t, w;
+	double dr, dt, dx;
+	float ft, fx;
+	uint32_t hx;
+	uint16_t expsign;
+	int k;
+
+	u.e = x;
+	expsign = u.xbits.expsign;
+	k = expsign & 0x7fff;
+
+	/*
+	 * If x = +-Inf, then cbrt(x) = +-Inf.
+	 * If x = NaN, then cbrt(x) = NaN.
+	 */
+	if (k == BIAS + LDBL_MAX_EXP)
+		return (x + x);
+
+	ENTERI();
+	if (k == 0) {
+		/* If x = +-0, then cbrt(x) = +-0. */
+		if ((u.bits.manh | u.bits.manl) == 0)
+			RETURNI(x);
+		/* Adjust subnormal numbers. */
+		u.e *= 0x1.0p514;
+		k = u.bits.exp;
+		k -= BIAS + 514;
+ 	} else
+		k -= BIAS;
+	u.xbits.expsign = BIAS;
+	v.e = 1; 
+
+	x = u.e;
+	switch (k % 3) {
+	case 1:
+	case -2:
+		x = 2*x;
+		k--;
+		break;
+	case 2:
+	case -1:
+		x = 4*x;
+		k -= 2;
+		break;
+	}
+	v.xbits.expsign = (expsign & 0x8000) | (BIAS + k / 3);
+
+	/*
+	 * The following is the guts of s_cbrtf, with the handling of
+	 * special values removed and extra care for accuracy not taken,
+	 * but with most of the extra accuracy not discarded.
+	 */
+
+	/* ~5-bit estimate: */
+	fx = x;
+	GET_FLOAT_WORD(hx, fx);
+	SET_FLOAT_WORD(ft, ((hx & 0x7fffffff) / 3 + B1));
+
+	/* ~16-bit estimate: */
+	dx = x;
+	dt = ft;
+	dr = dt * dt * dt;
+	dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+	/* ~47-bit estimate: */
+	dr = dt * dt * dt;
+	dt = dt * (dx + dx + dr) / (dx + dr + dr);
+
+#if LDBL_MANT_DIG == 64
+	/*
+	 * dt is cbrtl(x) to ~47 bits (after x has been reduced to 1 <= x < 8).
+	 * Round it away from zero to 32 bits (32 so that t*t is exact, and
+	 * away from zero for technical reasons).
+	 */
+	volatile double vd2 = 0x1.0p32;
+	volatile double vd1 = 0x1.0p-31;
+	#define vd ((long double)vd2 + vd1)
+
+	t = dt + vd - 0x1.0p32;
+#elif LDBL_MANT_DIG == 113
+	/*
+	 * Round dt away from zero to 47 bits.  Since we don't trust the 47,
+	 * add 2 47-bit ulps instead of 1 to round up.  Rounding is slow and
+	 * might be avoidable in this case, since on most machines dt will
+	 * have been evaluated in 53-bit precision and the technical reasons
+	 * for rounding up might not apply to either case in cbrtl() since
+	 * dt is much more accurate than needed.
+	 */
+	t = dt + 0x2.0p-46 + 0x1.0p60L - 0x1.0p60;
+#else
+#error "Unsupported long double format"
+#endif
+
+	/*
+     	 * Final step Newton iteration to 64 or 113 bits with
+	 * error < 0.667 ulps
+	 */
+	s=t*t;				/* t*t is exact */
+	r=x/s;				/* error <= 0.5 ulps; |r| < |t| */
+	w=t+t;				/* t+t is exact */
+	r=(r-t)/(w+r);			/* r-t is exact; w+r ~= 3*t */
+	t=t+t*r;			/* error <= 0.5 + 0.5/3 + epsilon */
+
+	t *= v.e;
+	RETURNI(t);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ccosh.c b/libm/upstream-freebsd/lib/msun/src/s_ccosh.c
new file mode 100644
index 0000000..e544e91
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ccosh.c
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Hyperbolic cosine of a complex argument z = x + i y.
+ *
+ * cosh(z) = cosh(x+iy)
+ *         = cosh(x) cos(y) + i sinh(x) sin(y).
+ *
+ * Exceptional values are noted in the comments within the source code.
+ * These values and the return value were taken from n1124.pdf.
+ * The sign of the result for some exceptional values is unspecified but
+ * must satisfy both cosh(conj(z)) == conj(cosh(z)) and cosh(-z) == cosh(z).
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ccosh.c 284423 2015-06-15 20:11:06Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const double huge = 0x1p1023;
+
+double complex
+ccosh(double complex z)
+{
+	double x, y, h;
+	int32_t hx, hy, ix, iy, lx, ly;
+
+	x = creal(z);
+	y = cimag(z);
+
+	EXTRACT_WORDS(hx, lx, x);
+	EXTRACT_WORDS(hy, ly, y);
+
+	ix = 0x7fffffff & hx;
+	iy = 0x7fffffff & hy;
+
+	/* Handle the nearly-non-exceptional cases where x and y are finite. */
+	if (ix < 0x7ff00000 && iy < 0x7ff00000) {
+		if ((iy | ly) == 0)
+			return (CMPLX(cosh(x), x * y));
+		if (ix < 0x40360000)	/* |x| < 22: normal case */
+			return (CMPLX(cosh(x) * cos(y), sinh(x) * sin(y)));
+
+		/* |x| >= 22, so cosh(x) ~= exp(|x|) */
+		if (ix < 0x40862e42) {
+			/* x < 710: exp(|x|) won't overflow */
+			h = exp(fabs(x)) * 0.5;
+			return (CMPLX(h * cos(y), copysign(h, x) * sin(y)));
+		} else if (ix < 0x4096bbaa) {
+			/* x < 1455: scale to avoid overflow */
+			z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+			return (CMPLX(creal(z), cimag(z) * copysign(1, x)));
+		} else {
+			/* x >= 1455: the result always overflows */
+			h = huge * x;
+			return (CMPLX(h * h * cos(y), h * sin(y)));
+		}
+	}
+
+	/*
+	 * cosh(+-0 +- I Inf) = dNaN + I (+-)(+-)0.
+	 * The sign of 0 in the result is unspecified.  Choice = product
+	 * of the signs of the argument.  Raise the invalid floating-point
+	 * exception.
+	 *
+	 * cosh(+-0 +- I NaN) = d(NaN) + I (+-)(+-)0.
+	 * The sign of 0 in the result is unspecified.  Choice = product
+	 * of the signs of the argument.
+	 */
+	if ((ix | lx) == 0)		/* && iy >= 0x7ff00000 */
+		return (CMPLX(y - y, x * copysign(0, y)));
+
+	/*
+	 * cosh(+-Inf +- I 0) = +Inf + I (+-)(+-)0.
+	 *
+	 * cosh(NaN +- I 0)   = d(NaN) + I (+-)(+-)0.
+	 * The sign of 0 in the result is unspecified.  Choice = product
+	 * of the signs of the argument.
+	 */
+	if ((iy | ly) == 0)		/* && ix >= 0x7ff00000 */
+		return (CMPLX(x * x, copysign(0, x) * y));
+
+	/*
+	 * cosh(x +- I Inf) = dNaN + I dNaN.
+	 * Raise the invalid floating-point exception for finite nonzero x.
+	 *
+	 * cosh(x + I NaN) = d(NaN) + I d(NaN).
+	 * Optionally raises the invalid floating-point exception for finite
+	 * nonzero x.  Choice = don't raise (except for signaling NaNs).
+	 */
+	if (ix < 0x7ff00000)		/* && iy >= 0x7ff00000 */
+		return (CMPLX(y - y, x * (y - y)));
+
+	/*
+	 * cosh(+-Inf + I NaN)  = +Inf + I d(NaN).
+	 *
+	 * cosh(+-Inf +- I Inf) = +Inf + I dNaN.
+	 * The sign of Inf in the result is unspecified.  Choice = always +.
+	 * Raise the invalid floating-point exception.
+	 *
+	 * cosh(+-Inf + I y)   = +Inf cos(y) +- I Inf sin(y)
+	 */
+	if (ix == 0x7ff00000 && lx == 0) {
+		if (iy >= 0x7ff00000)
+			return (CMPLX(INFINITY, x * (y - y)));
+		return (CMPLX(INFINITY * cos(y), x * sin(y)));
+	}
+
+	/*
+	 * cosh(NaN + I NaN)  = d(NaN) + I d(NaN).
+	 *
+	 * cosh(NaN +- I Inf) = d(NaN) + I d(NaN).
+	 * Optionally raises the invalid floating-point exception.
+	 * Choice = raise.
+	 *
+	 * cosh(NaN + I y)    = d(NaN) + I d(NaN).
+	 * Optionally raises the invalid floating-point exception for finite
+	 * nonzero y.  Choice = don't raise (except for signaling NaNs).
+	 */
+	return (CMPLX((x * x) * (y - y), (x + x) * (y - y)));
+}
+
+double complex
+ccos(double complex z)
+{
+
+	/* ccos(z) = ccosh(I * z) */
+	return (ccosh(CMPLX(-cimag(z), creal(z))));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c b/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
new file mode 100644
index 0000000..e33840a
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Float version of ccosh().  See s_ccosh.c for details.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ccoshf.c 284423 2015-06-15 20:11:06Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const float huge = 0x1p127;
+
+float complex
+ccoshf(float complex z)
+{
+	float x, y, h;
+	int32_t hx, hy, ix, iy;
+
+	x = crealf(z);
+	y = cimagf(z);
+
+	GET_FLOAT_WORD(hx, x);
+	GET_FLOAT_WORD(hy, y);
+
+	ix = 0x7fffffff & hx;
+	iy = 0x7fffffff & hy;
+
+	if (ix < 0x7f800000 && iy < 0x7f800000) {
+		if (iy == 0)
+			return (CMPLXF(coshf(x), x * y));
+		if (ix < 0x41100000)	/* |x| < 9: normal case */
+			return (CMPLXF(coshf(x) * cosf(y), sinhf(x) * sinf(y)));
+
+		/* |x| >= 9, so cosh(x) ~= exp(|x|) */
+		if (ix < 0x42b17218) {
+			/* x < 88.7: expf(|x|) won't overflow */
+			h = expf(fabsf(x)) * 0.5F;
+			return (CMPLXF(h * cosf(y), copysignf(h, x) * sinf(y)));
+		} else if (ix < 0x4340b1e7) {
+			/* x < 192.7: scale to avoid overflow */
+			z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+			return (CMPLXF(crealf(z), cimagf(z) * copysignf(1, x)));
+		} else {
+			/* x >= 192.7: the result always overflows */
+			h = huge * x;
+			return (CMPLXF(h * h * cosf(y), h * sinf(y)));
+		}
+	}
+
+	if (ix == 0)			/* && iy >= 0x7f800000 */
+		return (CMPLXF(y - y, x * copysignf(0, y)));
+
+	if (iy == 0)			/* && ix >= 0x7f800000 */
+		return (CMPLXF(x * x, copysignf(0, x) * y));
+
+	if (ix < 0x7f800000)		/* && iy >= 0x7f800000 */
+		return (CMPLXF(y - y, x * (y - y)));
+
+	if (ix == 0x7f800000) {
+		if (iy >= 0x7f800000)
+			return (CMPLXF(INFINITY, x * (y - y)));
+		return (CMPLXF(INFINITY * cosf(y), x * sinf(y)));
+	}
+
+	return (CMPLXF((x * x) * (y - y), (x + x) * (y - y)));
+}
+
+float complex
+ccosf(float complex z)
+{
+
+	return (ccoshf(CMPLXF(-cimagf(z), crealf(z))));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ceil.c b/libm/upstream-freebsd/lib/msun/src/s_ceil.c
new file mode 100644
index 0000000..929f813
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ceil.c
@@ -0,0 +1,77 @@
+/* @(#)s_ceil.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ceil(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to ceil(x).
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+ceil(double x)
+{
+	int32_t i0,i1,j0;
+	u_int32_t i,j;
+	EXTRACT_WORDS(i0,i1,x);
+	j0 = ((i0>>20)&0x7ff)-0x3ff;
+	if(j0<20) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
+		    if(i0<0) {i0=0x80000000;i1=0;}
+		    else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
+		}
+	    } else {
+		i = (0x000fffff)>>j0;
+		if(((i0&i)|i1)==0) return x; /* x is integral */
+		if(huge+x>0.0) {	/* raise inexact flag */
+		    if(i0>0) i0 += (0x00100000)>>j0;
+		    i0 &= (~i); i1=0;
+		}
+	    }
+	} else if (j0>51) {
+	    if(j0==0x400) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	} else {
+	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
+	    if((i1&i)==0) return x;	/* x is integral */
+	    if(huge+x>0.0) { 		/* raise inexact flag */
+		if(i0>0) {
+		    if(j0==20) i0+=1;
+		    else {
+			j = i1 + (1<<(52-j0));
+			if(j<i1) i0+=1;	/* got a carry */
+			i1 = j;
+		    }
+		}
+		i1 &= (~i);
+	    }
+	}
+	INSERT_WORDS(x,i0,i1);
+	return x;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(ceil, ceill);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ceilf.c b/libm/upstream-freebsd/lib/msun/src/s_ceilf.c
new file mode 100644
index 0000000..23bfe04
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ceilf.c
@@ -0,0 +1,52 @@
+/* s_ceilf.c -- float version of s_ceil.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30;
+
+float
+ceilf(float x)
+{
+	int32_t i0,j0;
+	u_int32_t i;
+
+	GET_FLOAT_WORD(i0,x);
+	j0 = ((i0>>23)&0xff)-0x7f;
+	if(j0<23) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
+		    if(i0<0) {i0=0x80000000;}
+		    else if(i0!=0) { i0=0x3f800000;}
+		}
+	    } else {
+		i = (0x007fffff)>>j0;
+		if((i0&i)==0) return x; /* x is integral */
+		if(huge+x>(float)0.0) {	/* raise inexact flag */
+		    if(i0>0) i0 += (0x00800000)>>j0;
+		    i0 &= (~i);
+		}
+	    }
+	} else {
+	    if(j0==0x80) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	}
+	SET_FLOAT_WORD(x,i0);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ceill.c b/libm/upstream-freebsd/lib/msun/src/s_ceill.c
new file mode 100644
index 0000000..2d1045f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ceill.c
@@ -0,0 +1,101 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_ceil.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * ceill(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to ceill(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define	MANH_SIZE	(LDBL_MANH_SIZE + 1)
+#define	INC_MANH(u, c)	do {					\
+	uint64_t o = u.bits.manh;				\
+	u.bits.manh += (c);					\
+	if (u.bits.manh < o)					\
+		u.bits.exp++;					\
+} while (0)
+#else
+#define	MANH_SIZE	LDBL_MANH_SIZE
+#define	INC_MANH(u, c)	do {					\
+	uint64_t o = u.bits.manh;				\
+	u.bits.manh += (c);					\
+	if (u.bits.manh < o) {					\
+		u.bits.exp++;					\
+		u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1);	\
+	}							\
+} while (0)
+#endif
+
+static const long double huge = 1.0e300;
+
+long double
+ceill(long double x)
+{
+	union IEEEl2bits u = { .e = x };
+	int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+	if (e < MANH_SIZE - 1) {
+		if (e < 0) {			/* raise inexact if x != 0 */
+			if (huge + x > 0.0)
+				if (u.bits.exp > 0 ||
+				    (u.bits.manh | u.bits.manl) != 0)
+					u.e = u.bits.sign ? -0.0 : 1.0;
+		} else {
+			uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+			if (((u.bits.manh & m) | u.bits.manl) == 0)
+				return (x);	/* x is integral */
+			if (!u.bits.sign) {
+#ifdef LDBL_IMPLICIT_NBIT
+				if (e == 0)
+					u.bits.exp++;
+				else
+#endif
+				INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
+			}
+			if (huge + x > 0.0) {	/* raise inexact flag */
+				u.bits.manh &= ~m;
+				u.bits.manl = 0;
+			}
+		}
+	} else if (e < LDBL_MANT_DIG - 1) {
+		uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+		if ((u.bits.manl & m) == 0)
+			return (x);	/* x is integral */
+		if (!u.bits.sign) {
+			if (e == MANH_SIZE - 1)
+				INC_MANH(u, 1);
+			else {
+				uint64_t o = u.bits.manl;
+				u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
+				if (u.bits.manl < o)	/* got a carry */
+					INC_MANH(u, 1);
+			}
+		}
+		if (huge + x > 0.0)		/* raise inexact flag */
+			u.bits.manl &= ~m;
+	}
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cexp.c b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
new file mode 100644
index 0000000..660a68d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cexp.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const uint32_t
+exp_ovfl  = 0x40862e42,			/* high bits of MAX_EXP * ln2 ~= 710 */
+cexp_ovfl = 0x4096b8e4;			/* (MAX_EXP - MIN_DENORM_EXP) * ln2 */
+
+double complex
+cexp(double complex z)
+{
+	double x, y, exp_x;
+	uint32_t hx, hy, lx, ly;
+
+	x = creal(z);
+	y = cimag(z);
+
+	EXTRACT_WORDS(hy, ly, y);
+	hy &= 0x7fffffff;
+
+	/* cexp(x + I 0) = exp(x) + I 0 */
+	if ((hy | ly) == 0)
+		return (CMPLX(exp(x), y));
+	EXTRACT_WORDS(hx, lx, x);
+	/* cexp(0 + I y) = cos(y) + I sin(y) */
+	if (((hx & 0x7fffffff) | lx) == 0)
+		return (CMPLX(cos(y), sin(y)));
+
+	if (hy >= 0x7ff00000) {
+		if (lx != 0 || (hx & 0x7fffffff) != 0x7ff00000) {
+			/* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
+			return (CMPLX(y - y, y - y));
+		} else if (hx & 0x80000000) {
+			/* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
+			return (CMPLX(0.0, 0.0));
+		} else {
+			/* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
+			return (CMPLX(x, y - y));
+		}
+	}
+
+	if (hx >= exp_ovfl && hx <= cexp_ovfl) {
+		/*
+		 * x is between 709.7 and 1454.3, so we must scale to avoid
+		 * overflow in exp(x).
+		 */
+		return (__ldexp_cexp(z, 0));
+	} else {
+		/*
+		 * Cases covered here:
+		 *  -  x < exp_ovfl and exp(x) won't overflow (common case)
+		 *  -  x > cexp_ovfl, so exp(x) * s overflows for all s > 0
+		 *  -  x = +-Inf (generated by exp())
+		 *  -  x = NaN (spurious inexact exception from y)
+		 */
+		exp_x = exp(x);
+		return (CMPLX(exp_x * cos(y), exp_x * sin(y)));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cexpf.c b/libm/upstream-freebsd/lib/msun/src/s_cexpf.c
new file mode 100644
index 0000000..709ad47
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cexpf.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cexpf.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const uint32_t
+exp_ovfl  = 0x42b17218,		/* MAX_EXP * ln2 ~= 88.722839355 */
+cexp_ovfl = 0x43400074;		/* (MAX_EXP - MIN_DENORM_EXP) * ln2 */
+
+float complex
+cexpf(float complex z)
+{
+	float x, y, exp_x;
+	uint32_t hx, hy;
+
+	x = crealf(z);
+	y = cimagf(z);
+
+	GET_FLOAT_WORD(hy, y);
+	hy &= 0x7fffffff;
+
+	/* cexp(x + I 0) = exp(x) + I 0 */
+	if (hy == 0)
+		return (CMPLXF(expf(x), y));
+	GET_FLOAT_WORD(hx, x);
+	/* cexp(0 + I y) = cos(y) + I sin(y) */
+	if ((hx & 0x7fffffff) == 0)
+		return (CMPLXF(cosf(y), sinf(y)));
+
+	if (hy >= 0x7f800000) {
+		if ((hx & 0x7fffffff) != 0x7f800000) {
+			/* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
+			return (CMPLXF(y - y, y - y));
+		} else if (hx & 0x80000000) {
+			/* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
+			return (CMPLXF(0.0, 0.0));
+		} else {
+			/* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
+			return (CMPLXF(x, y - y));
+		}
+	}
+
+	if (hx >= exp_ovfl && hx <= cexp_ovfl) {
+		/*
+		 * x is between 88.7 and 192, so we must scale to avoid
+		 * overflow in expf(x).
+		 */
+		return (__ldexp_cexpf(z, 0));
+	} else {
+		/*
+		 * Cases covered here:
+		 *  -  x < exp_ovfl and exp(x) won't overflow (common case)
+		 *  -  x > cexp_ovfl, so exp(x) * s overflows for all s > 0
+		 *  -  x = +-Inf (generated by exp())
+		 *  -  x = NaN (spurious inexact exception from y)
+		 */
+		exp_x = expf(x);
+		return (CMPLXF(exp_x * cosf(y), exp_x * sinf(y)));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cimag.c b/libm/upstream-freebsd/lib/msun/src/s_cimag.c
new file mode 100644
index 0000000..cbf6720
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cimag.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+#include "math_private.h"
+
+double
+cimag(double complex z)
+{
+	const double_complex z1 = { .f = z };
+
+	return (IMAGPART(z1));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cimagf.c b/libm/upstream-freebsd/lib/msun/src/s_cimagf.c
new file mode 100644
index 0000000..4e483a2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cimagf.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+#include "math_private.h"
+
+float
+cimagf(float complex z)
+{
+	const float_complex z1 = { .f = z };
+
+	return (IMAGPART(z1));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cimagl.c b/libm/upstream-freebsd/lib/msun/src/s_cimagl.c
new file mode 100644
index 0000000..c50e967
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cimagl.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+#include "math_private.h"
+
+long double
+cimagl(long double complex z)
+{
+	const long_double_complex z1 = { .f = z };
+
+	return (IMAGPART(z1));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conj.c b/libm/upstream-freebsd/lib/msun/src/s_conj.c
new file mode 100644
index 0000000..61fac63
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_conj.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/lib/msun/src/s_conj.c 275819 2014-12-16 09:21:56Z ed $
+ */
+
+#include <complex.h>
+
+#include "math_private.h"
+
+double complex
+conj(double complex z)
+{
+
+	return (CMPLX(creal(z), -cimag(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conjf.c b/libm/upstream-freebsd/lib/msun/src/s_conjf.c
new file mode 100644
index 0000000..83c9ef0
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_conjf.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/lib/msun/src/s_conjf.c 275819 2014-12-16 09:21:56Z ed $
+ */
+
+#include <complex.h>
+
+#include "math_private.h"
+
+float complex
+conjf(float complex z)
+{
+
+	return (CMPLXF(crealf(z), -cimagf(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conjl.c b/libm/upstream-freebsd/lib/msun/src/s_conjl.c
new file mode 100644
index 0000000..d9e6a16
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_conjl.c
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: head/lib/msun/src/s_conjl.c 275819 2014-12-16 09:21:56Z ed $
+ */
+
+#include <complex.h>
+
+#include "math_private.h"
+
+long double complex
+conjl(long double complex z)
+{
+
+	return (CMPLXL(creall(z), -cimagl(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_copysign.c b/libm/upstream-freebsd/lib/msun/src/s_copysign.c
new file mode 100644
index 0000000..a5f3870
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_copysign.c
@@ -0,0 +1,33 @@
+/* @(#)s_copysign.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * copysign(double x, double y)
+ * copysign(x,y) returns a value with the magnitude of x and
+ * with the sign bit of y.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+copysign(double x, double y)
+{
+	u_int32_t hx,hy;
+	GET_HIGH_WORD(hx,x);
+	GET_HIGH_WORD(hy,y);
+	SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
+        return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_copysignf.c b/libm/upstream-freebsd/lib/msun/src/s_copysignf.c
new file mode 100644
index 0000000..05ca1e3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_copysignf.c
@@ -0,0 +1,36 @@
+/* s_copysignf.c -- float version of s_copysign.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * copysignf(float x, float y)
+ * copysignf(x,y) returns a value with the magnitude of x and
+ * with the sign bit of y.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+copysignf(float x, float y)
+{
+	u_int32_t ix,iy;
+	GET_FLOAT_WORD(ix,x);
+	GET_FLOAT_WORD(iy,y);
+	SET_FLOAT_WORD(x,(ix&0x7fffffff)|(iy&0x80000000));
+        return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_copysignl.c b/libm/upstream-freebsd/lib/msun/src/s_copysignl.c
new file mode 100644
index 0000000..8d39f84
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_copysignl.c
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+copysignl(long double x, long double y)
+{
+	union IEEEl2bits ux, uy;
+
+	ux.e = x;
+	uy.e = y;
+	ux.bits.sign = uy.bits.sign;
+	return (ux.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cos.c b/libm/upstream-freebsd/lib/msun/src/s_cos.c
new file mode 100644
index 0000000..29804f4
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cos.c
@@ -0,0 +1,89 @@
+/* @(#)s_cos.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* cos(x)
+ * Return cosine function of x.
+ *
+ * kernel function:
+ *	__kernel_sin		... sine function on [-pi/4,pi/4]
+ *	__kernel_cos		... cosine function on [-pi/4,pi/4]
+ *	__ieee754_rem_pio2	... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *	in [-pi/4 , +pi/4], and let n = k mod 4.
+ *	We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *	    0	       S	   C		 T
+ *	    1	       C	  -S		-1/T
+ *	    2	      -S	  -C		 T
+ *	    3	      -C	   S		-1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *	TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include <float.h>
+
+#include "math.h"
+#define INLINE_REM_PIO2
+#include "math_private.h"
+#include "e_rem_pio2.c"
+
+double
+cos(double x)
+{
+	double y[2],z=0.0;
+	int32_t n, ix;
+
+    /* High word of x. */
+	GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+	ix &= 0x7fffffff;
+	if(ix <= 0x3fe921fb) {
+	    if(ix<0x3e46a09e)			/* if x < 2**-27 * sqrt(2) */
+		if(((int)x)==0) return 1.0;	/* generate inexact */
+	    return __kernel_cos(x,z);
+	}
+
+    /* cos(Inf or NaN) is NaN */
+	else if (ix>=0x7ff00000) return x-x;
+
+    /* argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2(x,y);
+	    switch(n&3) {
+		case 0: return  __kernel_cos(y[0],y[1]);
+		case 1: return -__kernel_sin(y[0],y[1],1);
+		case 2: return -__kernel_cos(y[0],y[1]);
+		default:
+		        return  __kernel_sin(y[0],y[1],1);
+	    }
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(cos, cosl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cosf.c b/libm/upstream-freebsd/lib/msun/src/s_cosf.c
new file mode 100644
index 0000000..b701fd2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cosf.c
@@ -0,0 +1,87 @@
+/* s_cosf.c -- float version of s_cos.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#define	INLINE_KERNEL_COSDF
+#define	INLINE_KERNEL_SINDF
+#define INLINE_REM_PIO2F
+#include "math_private.h"
+#include "e_rem_pio2f.c"
+#include "k_cosf.c"
+#include "k_sinf.c"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+c1pio2 = 1*M_PI_2,			/* 0x3FF921FB, 0x54442D18 */
+c2pio2 = 2*M_PI_2,			/* 0x400921FB, 0x54442D18 */
+c3pio2 = 3*M_PI_2,			/* 0x4012D97C, 0x7F3321D2 */
+c4pio2 = 4*M_PI_2;			/* 0x401921FB, 0x54442D18 */
+
+float
+cosf(float x)
+{
+	double y;
+	int32_t n, hx, ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx & 0x7fffffff;
+
+	if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
+	    if(ix<0x39800000)		/* |x| < 2**-12 */
+		if(((int)x)==0) return 1.0;	/* 1 with inexact if x != 0 */
+	    return __kernel_cosdf(x);
+	}
+	if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
+	    if(ix>0x4016cbe3)		/* |x|  ~> 3*pi/4 */
+		return -__kernel_cosdf(x + (hx > 0 ? -c2pio2 : c2pio2));
+	    else {
+		if(hx>0)
+		    return __kernel_sindf(c1pio2 - x);
+		else
+		    return __kernel_sindf(x + c1pio2);
+	    }
+	}
+	if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
+	    if(ix>0x40afeddf)		/* |x|  ~> 7*pi/4 */
+		return __kernel_cosdf(x + (hx > 0 ? -c4pio2 : c4pio2));
+	    else {
+		if(hx>0)
+		    return __kernel_sindf(x - c3pio2);
+		else
+		    return __kernel_sindf(-c3pio2 - x);
+	    }
+	}
+
+    /* cos(Inf or NaN) is NaN */
+	else if (ix>=0x7f800000) return x-x;
+
+    /* general argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2f(x,&y);
+	    switch(n&3) {
+		case 0: return  __kernel_cosdf(y);
+		case 1: return  __kernel_sindf(-y);
+		case 2: return -__kernel_cosdf(y);
+		default:
+		        return  __kernel_sindf(y);
+	    }
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cosl.c b/libm/upstream-freebsd/lib/msun/src/s_cosl.c
new file mode 100644
index 0000000..22e74cf
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cosl.c
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Limited testing on pseudorandom numbers drawn within [-2e8:4e8] shows
+ * an accuracy of <= 0.7412 ULP.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+cosl(long double x)
+{
+	union IEEEl2bits z;
+	int e0;
+	long double y[2];
+	long double hi, lo;
+
+	z.e = x;
+	z.bits.sign = 0;
+
+	/* If x = +-0 or x is a subnormal number, then cos(x) = 1 */
+	if (z.bits.exp == 0)
+		return (1.0);
+
+	/* If x = NaN or Inf, then cos(x) = NaN. */
+	if (z.bits.exp == 32767)
+		return ((x - x) / (x - x));
+
+	ENTERI();
+
+	/* Optimize the case where x is already within range. */
+	if (z.e < M_PI_4)
+		RETURNI(__kernel_cosl(z.e, 0));
+
+	e0 = __ieee754_rem_pio2l(x, y);
+	hi = y[0];
+	lo = y[1];
+
+	switch (e0 & 3) {
+	case 0:
+	    hi = __kernel_cosl(hi, lo);
+	    break;
+	case 1:
+	    hi = - __kernel_sinl(hi, lo, 1);
+	    break;
+	case 2:
+	    hi = - __kernel_cosl(hi, lo);
+	    break;
+	case 3:
+	    hi = __kernel_sinl(hi, lo, 1);
+	    break;
+	}
+	
+	RETURNI(hi);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cproj.c b/libm/upstream-freebsd/lib/msun/src/s_cproj.c
new file mode 100644
index 0000000..ec2266e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cproj.c
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cproj.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+double complex
+cproj(double complex z)
+{
+
+	if (!isinf(creal(z)) && !isinf(cimag(z)))
+		return (z);
+	else
+		return (CMPLX(INFINITY, copysign(0.0, cimag(z))));
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(cproj, cprojl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cprojf.c b/libm/upstream-freebsd/lib/msun/src/s_cprojf.c
new file mode 100644
index 0000000..63af75f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cprojf.c
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cprojf.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+float complex
+cprojf(float complex z)
+{
+
+	if (!isinf(crealf(z)) && !isinf(cimagf(z)))
+		return (z);
+	else
+		return (CMPLXF(INFINITY, copysignf(0.0, cimagf(z))));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cprojl.c b/libm/upstream-freebsd/lib/msun/src/s_cprojl.c
new file mode 100644
index 0000000..8386f81
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_cprojl.c
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cprojl.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+long double complex
+cprojl(long double complex z)
+{
+
+	if (!isinf(creall(z)) && !isinf(cimagl(z)))
+		return (z);
+	else
+		return (CMPLXL(INFINITY, copysignl(0.0, cimagl(z))));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_creal.c b/libm/upstream-freebsd/lib/msun/src/s_creal.c
new file mode 100644
index 0000000..3295ff2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_creal.c
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+
+double
+creal(double complex z)
+{
+	return z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_crealf.c b/libm/upstream-freebsd/lib/msun/src/s_crealf.c
new file mode 100644
index 0000000..5819b86
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_crealf.c
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+
+float
+crealf(float complex z)
+{
+	return z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_creall.c b/libm/upstream-freebsd/lib/msun/src/s_creall.c
new file mode 100644
index 0000000..e4946f9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_creall.c
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2004 Stefan Farfeleder
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <complex.h>
+
+long double
+creall(long double complex z)
+{
+	return z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csinh.c b/libm/upstream-freebsd/lib/msun/src/s_csinh.c
new file mode 100644
index 0000000..cff1402
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_csinh.c
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Hyperbolic sine of a complex argument z = x + i y.
+ *
+ * sinh(z) = sinh(x+iy)
+ *         = sinh(x) cos(y) + i cosh(x) sin(y).
+ *
+ * Exceptional values are noted in the comments within the source code.
+ * These values and the return value were taken from n1124.pdf.
+ * The sign of the result for some exceptional values is unspecified but
+ * must satisfy both sinh(conj(z)) == conj(sinh(z)) and sinh(-z) == -sinh(z).
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csinh.c 284426 2015-06-15 20:16:53Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const double huge = 0x1p1023;
+
+double complex
+csinh(double complex z)
+{
+	double x, y, h;
+	int32_t hx, hy, ix, iy, lx, ly;
+
+	x = creal(z);
+	y = cimag(z);
+
+	EXTRACT_WORDS(hx, lx, x);
+	EXTRACT_WORDS(hy, ly, y);
+
+	ix = 0x7fffffff & hx;
+	iy = 0x7fffffff & hy;
+
+	/* Handle the nearly-non-exceptional cases where x and y are finite. */
+	if (ix < 0x7ff00000 && iy < 0x7ff00000) {
+		if ((iy | ly) == 0)
+			return (CMPLX(sinh(x), y));
+		if (ix < 0x40360000)	/* |x| < 22: normal case */
+			return (CMPLX(sinh(x) * cos(y), cosh(x) * sin(y)));
+
+		/* |x| >= 22, so cosh(x) ~= exp(|x|) */
+		if (ix < 0x40862e42) {
+			/* x < 710: exp(|x|) won't overflow */
+			h = exp(fabs(x)) * 0.5;
+			return (CMPLX(copysign(h, x) * cos(y), h * sin(y)));
+		} else if (ix < 0x4096bbaa) {
+			/* x < 1455: scale to avoid overflow */
+			z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+			return (CMPLX(creal(z) * copysign(1, x), cimag(z)));
+		} else {
+			/* x >= 1455: the result always overflows */
+			h = huge * x;
+			return (CMPLX(h * cos(y), h * h * sin(y)));
+		}
+	}
+
+	/*
+	 * sinh(+-0 +- I Inf) = +-0 + I dNaN.
+	 * The sign of 0 in the result is unspecified.  Choice = same sign
+	 * as the argument.  Raise the invalid floating-point exception.
+	 *
+	 * sinh(+-0 +- I NaN) = +-0 + I d(NaN).
+	 * The sign of 0 in the result is unspecified.  Choice = same sign
+	 * as the argument.
+	 */
+	if ((ix | lx) == 0)		/* && iy >= 0x7ff00000 */
+		return (CMPLX(x, y - y));
+
+	/*
+	 * sinh(+-Inf +- I 0) = +-Inf + I +-0.
+	 *
+	 * sinh(NaN +- I 0)   = d(NaN) + I +-0.
+	 */
+	if ((iy | ly) == 0)		/* && ix >= 0x7ff00000 */
+		return (CMPLX(x + x, y));
+
+	/*
+	 * sinh(x +- I Inf) = dNaN + I dNaN.
+	 * Raise the invalid floating-point exception for finite nonzero x.
+	 *
+	 * sinh(x + I NaN) = d(NaN) + I d(NaN).
+	 * Optionally raises the invalid floating-point exception for finite
+	 * nonzero x.  Choice = don't raise (except for signaling NaNs).
+	 */
+	if (ix < 0x7ff00000)		/* && iy >= 0x7ff00000 */
+		return (CMPLX(y - y, y - y));
+
+	/*
+	 * sinh(+-Inf + I NaN)  = +-Inf + I d(NaN).
+	 * The sign of Inf in the result is unspecified.  Choice = same sign
+	 * as the argument.
+	 *
+	 * sinh(+-Inf +- I Inf) = +-Inf + I dNaN.
+	 * The sign of Inf in the result is unspecified.  Choice = same sign
+	 * as the argument.  Raise the invalid floating-point exception.
+	 *
+	 * sinh(+-Inf + I y)   = +-Inf cos(y) + I Inf sin(y)
+	 */
+	if (ix == 0x7ff00000 && lx == 0) {
+		if (iy >= 0x7ff00000)
+			return (CMPLX(x, y - y));
+		return (CMPLX(x * cos(y), INFINITY * sin(y)));
+	}
+
+	/*
+	 * sinh(NaN1 + I NaN2) = d(NaN1, NaN2) + I d(NaN1, NaN2).
+	 *
+	 * sinh(NaN +- I Inf)  = d(NaN, dNaN) + I d(NaN, dNaN).
+	 * Optionally raises the invalid floating-point exception.
+	 * Choice = raise.
+	 *
+	 * sinh(NaN + I y)     = d(NaN) + I d(NaN).
+	 * Optionally raises the invalid floating-point exception for finite
+	 * nonzero y.  Choice = don't raise (except for signaling NaNs).
+	 */
+	return (CMPLX((x + x) * (y - y), (x * x) * (y - y)));
+}
+
+double complex
+csin(double complex z)
+{
+
+	/* csin(z) = -I * csinh(I * z) = I * conj(csinh(I * conj(z))). */
+	z = csinh(CMPLX(cimag(z), creal(z)));
+	return (CMPLX(cimag(z), creal(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csinhf.c b/libm/upstream-freebsd/lib/msun/src/s_csinhf.c
new file mode 100644
index 0000000..f050890
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_csinhf.c
@@ -0,0 +1,102 @@
+/*-
+ * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Float version of csinh().  See s_csinh.c for details.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csinhf.c 284426 2015-06-15 20:16:53Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+static const float huge = 0x1p127;
+
+float complex
+csinhf(float complex z)
+{
+	float x, y, h;
+	int32_t hx, hy, ix, iy;
+
+	x = crealf(z);
+	y = cimagf(z);
+
+	GET_FLOAT_WORD(hx, x);
+	GET_FLOAT_WORD(hy, y);
+
+	ix = 0x7fffffff & hx;
+	iy = 0x7fffffff & hy;
+
+	if (ix < 0x7f800000 && iy < 0x7f800000) {
+		if (iy == 0)
+			return (CMPLXF(sinhf(x), y));
+		if (ix < 0x41100000)	/* |x| < 9: normal case */
+			return (CMPLXF(sinhf(x) * cosf(y), coshf(x) * sinf(y)));
+
+		/* |x| >= 9, so cosh(x) ~= exp(|x|) */
+		if (ix < 0x42b17218) {
+			/* x < 88.7: expf(|x|) won't overflow */
+			h = expf(fabsf(x)) * 0.5F;
+			return (CMPLXF(copysignf(h, x) * cosf(y), h * sinf(y)));
+		} else if (ix < 0x4340b1e7) {
+			/* x < 192.7: scale to avoid overflow */
+			z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+			return (CMPLXF(crealf(z) * copysignf(1, x), cimagf(z)));
+		} else {
+			/* x >= 192.7: the result always overflows */
+			h = huge * x;
+			return (CMPLXF(h * cosf(y), h * h * sinf(y)));
+		}
+	}
+
+	if (ix == 0)			/* && iy >= 0x7f800000 */
+		return (CMPLXF(x, y - y));
+
+	if (iy == 0)			/* && ix >= 0x7f800000 */
+		return (CMPLXF(x + x, y));
+
+	if (ix < 0x7f800000)		/* && iy >= 0x7f800000 */
+		return (CMPLXF(y - y, y - y));
+
+	if (ix == 0x7f800000) {
+		if (iy >= 0x7f800000)
+			return (CMPLXF(x, y - y));
+		return (CMPLXF(x * cosf(y), INFINITY * sinf(y)));
+	}
+
+	return (CMPLXF((x + x) * (y - y), (x * x) * (y - y)));
+}
+
+float complex
+csinf(float complex z)
+{
+
+	z = csinhf(CMPLXF(cimagf(z), crealf(z)));
+	return (CMPLXF(cimagf(z), crealf(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrt.c b/libm/upstream-freebsd/lib/msun/src/s_csqrt.c
new file mode 100644
index 0000000..c908a2d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrt.c
@@ -0,0 +1,112 @@
+/*-
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrt.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <float.h>
+#include <math.h>
+
+#include "math_private.h"
+
+/*
+ * gcc doesn't implement complex multiplication or division correctly,
+ * so we need to handle infinities specially. We turn on this pragma to
+ * notify conforming c99 compilers that the fast-but-incorrect code that
+ * gcc generates is acceptable, since the special cases have already been
+ * handled.
+ */
+#pragma	STDC CX_LIMITED_RANGE	ON
+
+/* We risk spurious overflow for components >= DBL_MAX / (1 + sqrt(2)). */
+#define	THRESH	0x1.a827999fcef32p+1022
+
+double complex
+csqrt(double complex z)
+{
+	double complex result;
+	double a, b;
+	double t;
+	int scale;
+
+	a = creal(z);
+	b = cimag(z);
+
+	/* Handle special cases. */
+	if (z == 0)
+		return (CMPLX(0, b));
+	if (isinf(b))
+		return (CMPLX(INFINITY, b));
+	if (isnan(a)) {
+		t = (b - b) / (b - b);	/* raise invalid if b is not a NaN */
+		return (CMPLX(a, t));	/* return NaN + NaN i */
+	}
+	if (isinf(a)) {
+		/*
+		 * csqrt(inf + NaN i)  = inf +  NaN i
+		 * csqrt(inf + y i)    = inf +  0 i
+		 * csqrt(-inf + NaN i) = NaN +- inf i
+		 * csqrt(-inf + y i)   = 0   +  inf i
+		 */
+		if (signbit(a))
+			return (CMPLX(fabs(b - b), copysign(a, b)));
+		else
+			return (CMPLX(a, copysign(b - b, b)));
+	}
+	/*
+	 * The remaining special case (b is NaN) is handled just fine by
+	 * the normal code path below.
+	 */
+
+	/* Scale to avoid overflow. */
+	if (fabs(a) >= THRESH || fabs(b) >= THRESH) {
+		a *= 0.25;
+		b *= 0.25;
+		scale = 1;
+	} else {
+		scale = 0;
+	}
+
+	/* Algorithm 312, CACM vol 10, Oct 1967. */
+	if (a >= 0) {
+		t = sqrt((a + hypot(a, b)) * 0.5);
+		result = CMPLX(t, b / (2 * t));
+	} else {
+		t = sqrt((-a + hypot(a, b)) * 0.5);
+		result = CMPLX(fabs(b) / (2 * t), copysign(t, b));
+	}
+
+	/* Rescale. */
+	if (scale)
+		return (result * 2);
+	else
+		return (result);
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(csqrt, csqrtl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c b/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
new file mode 100644
index 0000000..12a894f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
@@ -0,0 +1,88 @@
+/*-
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrtf.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+/*
+ * gcc doesn't implement complex multiplication or division correctly,
+ * so we need to handle infinities specially. We turn on this pragma to
+ * notify conforming c99 compilers that the fast-but-incorrect code that
+ * gcc generates is acceptable, since the special cases have already been
+ * handled.
+ */
+#pragma	STDC CX_LIMITED_RANGE	ON
+
+float complex
+csqrtf(float complex z)
+{
+	float a = crealf(z), b = cimagf(z);
+	double t;
+
+	/* Handle special cases. */
+	if (z == 0)
+		return (CMPLXF(0, b));
+	if (isinf(b))
+		return (CMPLXF(INFINITY, b));
+	if (isnan(a)) {
+		t = (b - b) / (b - b);	/* raise invalid if b is not a NaN */
+		return (CMPLXF(a, t));	/* return NaN + NaN i */
+	}
+	if (isinf(a)) {
+		/*
+		 * csqrtf(inf + NaN i)  = inf +  NaN i
+		 * csqrtf(inf + y i)    = inf +  0 i
+		 * csqrtf(-inf + NaN i) = NaN +- inf i
+		 * csqrtf(-inf + y i)   = 0   +  inf i
+		 */
+		if (signbit(a))
+			return (CMPLXF(fabsf(b - b), copysignf(a, b)));
+		else
+			return (CMPLXF(a, copysignf(b - b, b)));
+	}
+	/*
+	 * The remaining special case (b is NaN) is handled just fine by
+	 * the normal code path below.
+	 */
+
+	/*
+	 * We compute t in double precision to avoid overflow and to
+	 * provide correct rounding in nearly all cases.
+	 * This is Algorithm 312, CACM vol 10, Oct 1967.
+	 */
+	if (a >= 0) {
+		t = sqrt((a + hypot(a, b)) * 0.5);
+		return (CMPLXF(t, b / (2.0 * t)));
+	} else {
+		t = sqrt((-a + hypot(a, b)) * 0.5);
+		return (CMPLXF(fabsf(b) / (2.0 * t), copysignf(t, b)));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c b/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
new file mode 100644
index 0000000..7bcff59
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2007-2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrtl.c 275819 2014-12-16 09:21:56Z ed $");
+
+#include <complex.h>
+#include <float.h>
+#include <math.h>
+
+#include "math_private.h"
+
+/*
+ * gcc doesn't implement complex multiplication or division correctly,
+ * so we need to handle infinities specially. We turn on this pragma to
+ * notify conforming c99 compilers that the fast-but-incorrect code that
+ * gcc generates is acceptable, since the special cases have already been
+ * handled.
+ */
+#pragma	STDC CX_LIMITED_RANGE	ON
+
+/* We risk spurious overflow for components >= LDBL_MAX / (1 + sqrt(2)). */
+#define	THRESH	(LDBL_MAX / 2.414213562373095048801688724209698L)
+
+long double complex
+csqrtl(long double complex z)
+{
+	long double complex result;
+	long double a, b;
+	long double t;
+	int scale;
+
+	a = creall(z);
+	b = cimagl(z);
+
+	/* Handle special cases. */
+	if (z == 0)
+		return (CMPLXL(0, b));
+	if (isinf(b))
+		return (CMPLXL(INFINITY, b));
+	if (isnan(a)) {
+		t = (b - b) / (b - b);	/* raise invalid if b is not a NaN */
+		return (CMPLXL(a, t));	/* return NaN + NaN i */
+	}
+	if (isinf(a)) {
+		/*
+		 * csqrt(inf + NaN i)  = inf +  NaN i
+		 * csqrt(inf + y i)    = inf +  0 i
+		 * csqrt(-inf + NaN i) = NaN +- inf i
+		 * csqrt(-inf + y i)   = 0   +  inf i
+		 */
+		if (signbit(a))
+			return (CMPLXL(fabsl(b - b), copysignl(a, b)));
+		else
+			return (CMPLXL(a, copysignl(b - b, b)));
+	}
+	/*
+	 * The remaining special case (b is NaN) is handled just fine by
+	 * the normal code path below.
+	 */
+
+	/* Scale to avoid overflow. */
+	if (fabsl(a) >= THRESH || fabsl(b) >= THRESH) {
+		a *= 0.25;
+		b *= 0.25;
+		scale = 1;
+	} else {
+		scale = 0;
+	}
+
+	/* Algorithm 312, CACM vol 10, Oct 1967. */
+	if (a >= 0) {
+		t = sqrtl((a + hypotl(a, b)) * 0.5);
+		result = CMPLXL(t, b / (2 * t));
+	} else {
+		t = sqrtl((-a + hypotl(a, b)) * 0.5);
+		result = CMPLXL(fabsl(b) / (2 * t), copysignl(t, b));
+	}
+
+	/* Rescale. */
+	if (scale)
+		return (result * 2);
+	else
+		return (result);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ctanh.c b/libm/upstream-freebsd/lib/msun/src/s_ctanh.c
new file mode 100644
index 0000000..e5973c3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ctanh.c
@@ -0,0 +1,145 @@
+/*-
+ * Copyright (c) 2011 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Hyperbolic tangent of a complex argument z = x + I y.
+ *
+ * The algorithm is from:
+ *
+ *   W. Kahan.  Branch Cuts for Complex Elementary Functions or Much
+ *   Ado About Nothing's Sign Bit.  In The State of the Art in
+ *   Numerical Analysis, pp. 165 ff.  Iserles and Powell, eds., 1987.
+ *
+ * Method:
+ *
+ *   Let t    = tan(x)
+ *       beta = 1/cos^2(y)
+ *       s    = sinh(x)
+ *       rho  = cosh(x)
+ *
+ *   We have:
+ *
+ *   tanh(z) = sinh(z) / cosh(z)
+ *
+ *             sinh(x) cos(y) + I cosh(x) sin(y)
+ *           = ---------------------------------
+ *             cosh(x) cos(y) + I sinh(x) sin(y)
+ *
+ *             cosh(x) sinh(x) / cos^2(y) + I tan(y)
+ *           = -------------------------------------
+ *                    1 + sinh^2(x) / cos^2(y)
+ *
+ *             beta rho s + I t
+ *           = ----------------
+ *               1 + beta s^2
+ *
+ * Modifications:
+ *
+ *   I omitted the original algorithm's handling of overflow in tan(x) after
+ *   verifying with nearpi.c that this can't happen in IEEE single or double
+ *   precision.  I also handle large x differently.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ctanh.c 284427 2015-06-15 20:40:44Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+double complex
+ctanh(double complex z)
+{
+	double x, y;
+	double t, beta, s, rho, denom;
+	uint32_t hx, ix, lx;
+
+	x = creal(z);
+	y = cimag(z);
+
+	EXTRACT_WORDS(hx, lx, x);
+	ix = hx & 0x7fffffff;
+
+	/*
+	 * ctanh(NaN +- I 0) = d(NaN) +- I 0
+	 *
+	 * ctanh(NaN + I y) = d(NaN,y) + I d(NaN,y)	for y != 0
+	 *
+	 * The imaginary part has the sign of x*sin(2*y), but there's no
+	 * special effort to get this right.
+	 *
+	 * ctanh(+-Inf +- I Inf) = +-1 +- I 0
+	 *
+	 * ctanh(+-Inf + I y) = +-1 + I 0 sin(2y)	for y finite
+	 *
+	 * The imaginary part of the sign is unspecified.  This special
+	 * case is only needed to avoid a spurious invalid exception when
+	 * y is infinite.
+	 */
+	if (ix >= 0x7ff00000) {
+		if ((ix & 0xfffff) | lx)	/* x is NaN */
+			return (CMPLX((x + 0) * (y + 0),
+			    y == 0 ? y : (x + 0) * (y + 0)));
+		SET_HIGH_WORD(x, hx - 0x40000000);	/* x = copysign(1, x) */
+		return (CMPLX(x, copysign(0, isinf(y) ? y : sin(y) * cos(y))));
+	}
+
+	/*
+	 * ctanh(x + I NaN) = d(NaN) + I d(NaN)
+	 * ctanh(x +- I Inf) = dNaN + I dNaN
+	 */
+	if (!isfinite(y))
+		return (CMPLX(y - y, y - y));
+
+	/*
+	 * ctanh(+-huge +- I y) ~= +-1 +- I 2sin(2y)/exp(2x), using the
+	 * approximation sinh^2(huge) ~= exp(2*huge) / 4.
+	 * We use a modified formula to avoid spurious overflow.
+	 */
+	if (ix >= 0x40360000) {	/* |x| >= 22 */
+		double exp_mx = exp(-fabs(x));
+		return (CMPLX(copysign(1, x),
+		    4 * sin(y) * cos(y) * exp_mx * exp_mx));
+	}
+
+	/* Kahan's algorithm */
+	t = tan(y);
+	beta = 1.0 + t * t;	/* = 1 / cos^2(y) */
+	s = sinh(x);
+	rho = sqrt(1 + s * s);	/* = cosh(x) */
+	denom = 1 + beta * s * s;
+	return (CMPLX((beta * rho * s) / denom, t / denom));
+}
+
+double complex
+ctan(double complex z)
+{
+
+	/* ctan(z) = -I * ctanh(I * z) = I * conj(ctanh(I * conj(z))) */
+	z = ctanh(CMPLX(cimag(z), creal(z)));
+	return (CMPLX(cimag(z), creal(z)));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c b/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
new file mode 100644
index 0000000..e9826c0
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2011 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Hyperbolic tangent of a complex argument z.  See s_ctanh.c for details.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ctanhf.c 284428 2015-06-15 20:47:26Z tijl $");
+
+#include <complex.h>
+#include <math.h>
+
+#include "math_private.h"
+
+float complex
+ctanhf(float complex z)
+{
+	float x, y;
+	float t, beta, s, rho, denom;
+	uint32_t hx, ix;
+
+	x = crealf(z);
+	y = cimagf(z);
+
+	GET_FLOAT_WORD(hx, x);
+	ix = hx & 0x7fffffff;
+
+	if (ix >= 0x7f800000) {
+		if (ix & 0x7fffff)
+			return (CMPLXF((x + 0) * (y + 0),
+			    y == 0 ? y : (x + 0) * (y + 0)));
+		SET_FLOAT_WORD(x, hx - 0x40000000);
+		return (CMPLXF(x,
+		    copysignf(0, isinf(y) ? y : sinf(y) * cosf(y))));
+	}
+
+	if (!isfinite(y))
+		return (CMPLXF(y - y, y - y));
+
+	if (ix >= 0x41300000) {	/* |x| >= 11 */
+		float exp_mx = expf(-fabsf(x));
+		return (CMPLXF(copysignf(1, x),
+		    4 * sinf(y) * cosf(y) * exp_mx * exp_mx));
+	}
+
+	t = tanf(y);
+	beta = 1.0 + t * t;
+	s = sinhf(x);
+	rho = sqrtf(1 + s * s);
+	denom = 1 + beta * s * s;
+	return (CMPLXF((beta * rho * s) / denom, t / denom));
+}
+
+float complex
+ctanf(float complex z)
+{
+
+	z = ctanhf(CMPLXF(cimagf(z), crealf(z)));
+	return (CMPLXF(cimagf(z), crealf(z)));
+}
+
diff --git a/libm/upstream-freebsd/lib/msun/src/s_erf.c b/libm/upstream-freebsd/lib/msun/src/s_erf.c
new file mode 100644
index 0000000..e1d63bc
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_erf.c
@@ -0,0 +1,309 @@
+/* @(#)s_erf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* double erf(double x)
+ * double erfc(double x)
+ *			     x
+ *		      2      |\
+ *     erf(x)  =  ---------  | exp(-t*t)dt
+ *	 	   sqrt(pi) \|
+ *			     0
+ *
+ *     erfc(x) =  1-erf(x)
+ *  Note that
+ *		erf(-x) = -erf(x)
+ *		erfc(-x) = 2 - erfc(x)
+ *
+ * Method:
+ *	1. For |x| in [0, 0.84375]
+ *	    erf(x)  = x + x*R(x^2)
+ *          erfc(x) = 1 - erf(x)           if x in [-.84375,0.25]
+ *                  = 0.5 + ((0.5-x)-x*R)  if x in [0.25,0.84375]
+ *	   where R = P/Q where P is an odd poly of degree 8 and
+ *	   Q is an odd poly of degree 10.
+ *						 -57.90
+ *			| R - (erf(x)-x)/x | <= 2
+ *
+ *
+ *	   Remark. The formula is derived by noting
+ *          erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ *	   and that
+ *          2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ *	   is close to one. The interval is chosen because the fix
+ *	   point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ *	   near 0.6174), and by some experiment, 0.84375 is chosen to
+ * 	   guarantee the error is less than one ulp for erf.
+ *
+ *      2. For |x| in [0.84375,1.25], let s = |x| - 1, and
+ *         c = 0.84506291151 rounded to single (24 bits)
+ *         	erf(x)  = sign(x) * (c  + P1(s)/Q1(s))
+ *         	erfc(x) = (1-c)  - P1(s)/Q1(s) if x > 0
+ *			  1+(c+P1(s)/Q1(s))    if x < 0
+ *         	|P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
+ *	   Remark: here we use the taylor series expansion at x=1.
+ *		erf(1+s) = erf(1) + s*Poly(s)
+ *			 = 0.845.. + P1(s)/Q1(s)
+ *	   That is, we use rational approximation to approximate
+ *			erf(1+s) - (c = (single)0.84506291151)
+ *	   Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ *	   where
+ *		P1(s) = degree 6 poly in s
+ *		Q1(s) = degree 6 poly in s
+ *
+ *      3. For x in [1.25,1/0.35(~2.857143)],
+ *         	erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
+ *         	erf(x)  = 1 - erfc(x)
+ *	   where
+ *		R1(z) = degree 7 poly in z, (z=1/x^2)
+ *		S1(z) = degree 8 poly in z
+ *
+ *      4. For x in [1/0.35,28]
+ *         	erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
+ *			= 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
+ *			= 2.0 - tiny		(if x <= -6)
+ *         	erf(x)  = sign(x)*(1.0 - erfc(x)) if x < 6, else
+ *         	erf(x)  = sign(x)*(1.0 - tiny)
+ *	   where
+ *		R2(z) = degree 6 poly in z, (z=1/x^2)
+ *		S2(z) = degree 7 poly in z
+ *
+ *      Note1:
+ *	   To compute exp(-x*x-0.5625+R/S), let s be a single
+ *	   precision number and s := x; then
+ *		-x*x = -s*s + (s-x)*(s+x)
+ *	        exp(-x*x-0.5626+R/S) =
+ *			exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
+ *      Note2:
+ *	   Here 4 and 5 make use of the asymptotic series
+ *			  exp(-x*x)
+ *		erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
+ *			  x*sqrt(pi)
+ *	   We use rational approximation to approximate
+ *      	g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
+ *	   Here is the error bound for R1/S1 and R2/S2
+ *      	|R1/S1 - f(x)|  < 2**(-62.57)
+ *      	|R2/S2 - f(x)|  < 2**(-61.52)
+ *
+ *      5. For inf > x >= 28
+ *         	erf(x)  = sign(x) *(1 - tiny)  (raise inexact)
+ *         	erfc(x) = tiny*tiny (raise underflow) if x > 0
+ *			= 2 - tiny if x<0
+ *
+ *      7. Special case:
+ *         	erf(0)  = 0, erf(inf)  = 1, erf(-inf) = -1,
+ *         	erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ *	   	erfc/erf(NaN) is NaN
+ */
+
+
+#include "math.h"
+#include "math_private.h"
+
+/* XXX Prevent compilers from erroneously constant folding: */
+static const volatile double tiny= 1e-300;
+
+static const double
+half= 0.5,
+one = 1,
+two = 2,
+/* c = (float)0.84506291151 */
+erx =  8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */
+/*
+ * In the domain [0, 2**-28], only the first term in the power series
+ * expansion of erf(x) is used.  The magnitude of the first neglected
+ * terms is less than 2**-84.
+ */
+efx =  1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */
+efx8=  1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */
+/*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+pp0  =  1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */
+pp1  = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */
+pp2  = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */
+pp3  = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */
+pp4  = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */
+qq1  =  3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */
+qq2  =  6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */
+qq3  =  5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */
+qq4  =  1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */
+qq5  = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */
+/*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+pa0  = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */
+pa1  =  4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */
+pa2  = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */
+pa3  =  3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */
+pa4  = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */
+pa5  =  3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */
+pa6  = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */
+qa1  =  1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */
+qa2  =  5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */
+qa3  =  7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */
+qa4  =  1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */
+qa5  =  1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */
+qa6  =  1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */
+/*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ra0  = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */
+ra1  = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */
+ra2  = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */
+ra3  = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */
+ra4  = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */
+ra5  = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */
+ra6  = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */
+ra7  = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */
+sa1  =  1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */
+sa2  =  1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */
+sa3  =  4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */
+sa4  =  6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */
+sa5  =  4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */
+sa6  =  1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */
+sa7  =  6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */
+sa8  = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */
+/*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+rb0  = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */
+rb1  = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */
+rb2  = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */
+rb3  = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */
+rb4  = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */
+rb5  = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */
+rb6  = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */
+sb1  =  3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */
+sb2  =  3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */
+sb3  =  1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */
+sb4  =  3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */
+sb5  =  2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */
+sb6  =  4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */
+sb7  = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
+
+double
+erf(double x)
+{
+	int32_t hx,ix,i;
+	double R,S,P,Q,s,y,z,r;
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) {		/* erf(nan)=nan */
+	    i = ((u_int32_t)hx>>31)<<1;
+	    return (double)(1-i)+one/x;	/* erf(+-inf)=+-1 */
+	}
+
+	if(ix < 0x3feb0000) {		/* |x|<0.84375 */
+	    if(ix < 0x3e300000) { 	/* |x|<2**-28 */
+	        if (ix < 0x00800000)
+		    return (8*x+efx8*x)/8;	/* avoid spurious underflow */
+		return x + efx*x;
+	    }
+	    z = x*x;
+	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+	    y = r/s;
+	    return x + x*y;
+	}
+	if(ix < 0x3ff40000) {		/* 0.84375 <= |x| < 1.25 */
+	    s = fabs(x)-one;
+	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+	    if(hx>=0) return erx + P/Q; else return -erx - P/Q;
+	}
+	if (ix >= 0x40180000) {		/* inf>|x|>=6 */
+	    if(hx>=0) return one-tiny; else return tiny-one;
+	}
+	x = fabs(x);
+ 	s = one/(x*x);
+	if(ix< 0x4006DB6E) {	/* |x| < 1/0.35 */
+	    R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))));
+	    S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+		s*sa8)))))));
+	} else {	/* |x| >= 1/0.35 */
+	    R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))));
+	    S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
+	}
+	z  = x;
+	SET_LOW_WORD(z,0);
+	r  =  __ieee754_exp(-z*z-0.5625)*__ieee754_exp((z-x)*(z+x)+R/S);
+	if(hx>=0) return one-r/x; else return  r/x-one;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(erf, erfl);
+#endif
+
+double
+erfc(double x)
+{
+	int32_t hx,ix;
+	double R,S,P,Q,s,y,z,r;
+	GET_HIGH_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7ff00000) {			/* erfc(nan)=nan */
+						/* erfc(+-inf)=0,2 */
+	    return (double)(((u_int32_t)hx>>31)<<1)+one/x;
+	}
+
+	if(ix < 0x3feb0000) {		/* |x|<0.84375 */
+	    if(ix < 0x3c700000)  	/* |x|<2**-56 */
+		return one-x;
+	    z = x*x;
+	    r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+	    s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+	    y = r/s;
+	    if(hx < 0x3fd00000) {  	/* x<1/4 */
+		return one-(x+x*y);
+	    } else {
+		r = x*y;
+		r += (x-half);
+	        return half - r ;
+	    }
+	}
+	if(ix < 0x3ff40000) {		/* 0.84375 <= |x| < 1.25 */
+	    s = fabs(x)-one;
+	    P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+	    Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+	    if(hx>=0) {
+	        z  = one-erx; return z - P/Q;
+	    } else {
+		z = erx+P/Q; return one+z;
+	    }
+	}
+	if (ix < 0x403c0000) {		/* |x|<28 */
+	    x = fabs(x);
+ 	    s = one/(x*x);
+	    if(ix< 0x4006DB6D) {	/* |x| < 1/.35 ~ 2.857143*/
+		R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))));
+		S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+
+		    s*sa8)))))));
+	    } else {			/* |x| >= 1/.35 ~ 2.857143 */
+		if(hx<0&&ix>=0x40180000) return two-tiny;/* x < -6 */
+		R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))));
+		S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));
+	    }
+	    z  = x;
+	    SET_LOW_WORD(z,0);
+	    r  =  __ieee754_exp(-z*z-0.5625)*__ieee754_exp((z-x)*(z+x)+R/S);
+	    if(hx>0) return r/x; else return two-r/x;
+	} else {
+	    if(hx>0) return tiny*tiny; else return two-tiny;
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(erfc, erfcl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_erff.c b/libm/upstream-freebsd/lib/msun/src/s_erff.c
new file mode 100644
index 0000000..d6cfbd2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_erff.c
@@ -0,0 +1,181 @@
+/* s_erff.c -- float version of s_erf.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+/* XXX Prevent compilers from erroneously constant folding: */
+static const volatile float tiny = 1e-30;
+
+static const float
+half= 0.5,
+one = 1,
+two = 2,
+erx = 8.42697144e-01,			/* 0x3f57bb00 */
+/*
+ * In the domain [0, 2**-14], only the first term in the power series
+ * expansion of erf(x) is used.  The magnitude of the first neglected
+ * terms is less than 2**-42.
+ */
+efx = 1.28379166e-01, /* 0x3e0375d4 */
+efx8= 1.02703333e+00, /* 0x3f8375d4 */
+/*
+ * Domain [0, 0.84375], range ~[-5.4419e-10, 5.5179e-10]:
+ * |(erf(x) - x)/x - pp(x)/qq(x)| < 2**-31
+ */
+pp0  =  1.28379166e-01, /* 0x3e0375d4 */
+pp1  = -3.36030394e-01, /* 0xbeac0c2d */
+pp2  = -1.86261395e-03, /* 0xbaf422f4 */
+qq1  =  3.12324315e-01, /* 0x3e9fe8f9 */
+qq2  =  2.16070414e-02, /* 0x3cb10140 */
+qq3  = -1.98859372e-03, /* 0xbb025311 */
+/*
+ * Domain [0.84375, 1.25], range ~[-1.023e-9, 1.023e-9]:
+ * |(erf(x) - erx) - pa(x)/qa(x)| < 2**-31
+ */
+pa0  =  3.65041046e-06, /* 0x3674f993 */
+pa1  =  4.15109307e-01, /* 0x3ed48935 */
+pa2  = -2.09395722e-01, /* 0xbe566bd5 */
+pa3  =  8.67677554e-02, /* 0x3db1b34b */
+qa1  =  4.95560974e-01, /* 0x3efdba2b */
+qa2  =  3.71248513e-01, /* 0x3ebe1449 */
+qa3  =  3.92478965e-02, /* 0x3d20c267 */
+/*
+ * Domain [1.25,1/0.35], range ~[-4.821e-9, 4.927e-9]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - ra(x)/sa(x)| < 2**-28
+ */
+ra0  = -9.88156721e-03, /* 0xbc21e64c */
+ra1  = -5.43658376e-01, /* 0xbf0b2d32 */
+ra2  = -1.66828310e+00, /* 0xbfd58a4d */
+ra3  = -6.91554189e-01, /* 0xbf3109b2 */
+sa1  =  4.48581553e+00, /* 0x408f8bcd */
+sa2  =  4.10799170e+00, /* 0x408374ab */
+sa3  =  5.53855181e-01, /* 0x3f0dc974 */
+/*
+ * Domain [2.85715, 11], range ~[-1.484e-9, 1.505e-9]:
+ * |log(x*erfc(x)) + x**2 + 0.5625 - rb(x)/sb(x)| < 2**-30
+ */
+rb0  = -9.86496918e-03, /* 0xbc21a0ae */
+rb1  = -5.48049808e-01, /* 0xbf0c4cfe */
+rb2  = -1.84115684e+00, /* 0xbfebab07 */
+sb1  =  4.87132740e+00, /* 0x409be1ea */
+sb2  =  3.04982710e+00, /* 0x4043305e */
+sb3  = -7.61900663e-01; /* 0xbf430bec */
+
+float
+erff(float x)
+{
+	int32_t hx,ix,i;
+	float R,S,P,Q,s,y,z,r;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) {		/* erff(nan)=nan */
+	    i = ((u_int32_t)hx>>31)<<1;
+	    return (float)(1-i)+one/x;	/* erff(+-inf)=+-1 */
+	}
+
+	if(ix < 0x3f580000) {		/* |x|<0.84375 */
+	    if(ix < 0x38800000) { 	/* |x|<2**-14 */
+	        if (ix < 0x04000000)	/* |x|<0x1p-119 */
+		    return (8*x+efx8*x)/8;	/* avoid spurious underflow */
+		return x + efx*x;
+	    }
+	    z = x*x;
+	    r = pp0+z*(pp1+z*pp2);
+	    s = one+z*(qq1+z*(qq2+z*qq3));
+	    y = r/s;
+	    return x + x*y;
+	}
+	if(ix < 0x3fa00000) {		/* 0.84375 <= |x| < 1.25 */
+	    s = fabsf(x)-one;
+	    P = pa0+s*(pa1+s*(pa2+s*pa3));
+	    Q = one+s*(qa1+s*(qa2+s*qa3));
+	    if(hx>=0) return erx + P/Q; else return -erx - P/Q;
+	}
+	if (ix >= 0x40800000) {		/* inf>|x|>=4 */
+	    if(hx>=0) return one-tiny; else return tiny-one;
+	}
+	x = fabsf(x);
+ 	s = one/(x*x);
+	if(ix< 0x4036db8c) {	/* |x| < 2.85715 ~ 1/0.35 */
+	    R=ra0+s*(ra1+s*(ra2+s*ra3));
+	    S=one+s*(sa1+s*(sa2+s*sa3));
+	} else {	/* |x| >= 2.85715 ~ 1/0.35 */
+	    R=rb0+s*(rb1+s*rb2);
+	    S=one+s*(sb1+s*(sb2+s*sb3));
+	}
+	SET_FLOAT_WORD(z,hx&0xffffe000);
+	r  = expf(-z*z-0.5625F)*expf((z-x)*(z+x)+R/S);
+	if(hx>=0) return one-r/x; else return  r/x-one;
+}
+
+float
+erfcf(float x)
+{
+	int32_t hx,ix;
+	float R,S,P,Q,s,y,z,r;
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;
+	if(ix>=0x7f800000) {			/* erfcf(nan)=nan */
+						/* erfcf(+-inf)=0,2 */
+	    return (float)(((u_int32_t)hx>>31)<<1)+one/x;
+	}
+
+	if(ix < 0x3f580000) {		/* |x|<0.84375 */
+	    if(ix < 0x33800000)  	/* |x|<2**-24 */
+		return one-x;
+	    z = x*x;
+	    r = pp0+z*(pp1+z*pp2);
+	    s = one+z*(qq1+z*(qq2+z*qq3));
+	    y = r/s;
+	    if(hx < 0x3e800000) {  	/* x<1/4 */
+		return one-(x+x*y);
+	    } else {
+		r = x*y;
+		r += (x-half);
+	        return half - r ;
+	    }
+	}
+	if(ix < 0x3fa00000) {		/* 0.84375 <= |x| < 1.25 */
+	    s = fabsf(x)-one;
+	    P = pa0+s*(pa1+s*(pa2+s*pa3));
+	    Q = one+s*(qa1+s*(qa2+s*qa3));
+	    if(hx>=0) {
+	        z  = one-erx; return z - P/Q;
+	    } else {
+		z = erx+P/Q; return one+z;
+	    }
+	}
+	if (ix < 0x41300000) {		/* |x|<11 */
+	    x = fabsf(x);
+ 	    s = one/(x*x);
+	    if(ix< 0x4036db8c) {	/* |x| < 2.85715 ~ 1/.35 */
+		R=ra0+s*(ra1+s*(ra2+s*ra3));
+		S=one+s*(sa1+s*(sa2+s*sa3));
+	    } else {			/* |x| >= 2.85715 ~ 1/.35 */
+		if(hx<0&&ix>=0x40a00000) return two-tiny;/* x < -5 */
+		R=rb0+s*(rb1+s*rb2);
+		S=one+s*(sb1+s*(sb2+s*sb3));
+	    }
+	    SET_FLOAT_WORD(z,hx&0xffffe000);
+	    r  = expf(-z*z-0.5625F)*expf((z-x)*(z+x)+R/S);
+	    if(hx>0) return r/x; else return two-r/x;
+	} else {
+	    if(hx>0) return tiny*tiny; else return two-tiny;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_exp2.c b/libm/upstream-freebsd/lib/msun/src/s_exp2.c
new file mode 100644
index 0000000..dbef729
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_exp2.c
@@ -0,0 +1,397 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_exp2.c 286515 2015-08-09 10:00:13Z dim $");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#define	TBLBITS	8
+#define	TBLSIZE	(1 << TBLBITS)
+
+static const double
+    redux    = 0x1.8p52 / TBLSIZE,
+    P1	     = 0x1.62e42fefa39efp-1,
+    P2	     = 0x1.ebfbdff82c575p-3,
+    P3	     = 0x1.c6b08d704a0a6p-5,
+    P4	     = 0x1.3b2ab88f70400p-7,
+    P5	     = 0x1.5d88003875c74p-10;
+
+static volatile double
+    huge     = 0x1p1000,
+    twom1000 = 0x1p-1000;
+
+static const double tbl[TBLSIZE * 2] = {
+/*	exp2(z + eps)		eps	*/
+	0x1.6a09e667f3d5dp-1,	 0x1.9880p-44,
+	0x1.6b052fa751744p-1,	 0x1.8000p-50,
+	0x1.6c012750bd9fep-1,	-0x1.8780p-45,
+	0x1.6cfdcddd476bfp-1,	 0x1.ec00p-46,
+	0x1.6dfb23c651a29p-1,	-0x1.8000p-50,
+	0x1.6ef9298593ae3p-1,	-0x1.c000p-52,
+	0x1.6ff7df9519386p-1,	-0x1.fd80p-45,
+	0x1.70f7466f42da3p-1,	-0x1.c880p-45,
+	0x1.71f75e8ec5fc3p-1,	 0x1.3c00p-46,
+	0x1.72f8286eacf05p-1,	-0x1.8300p-44,
+	0x1.73f9a48a58152p-1,	-0x1.0c00p-47,
+	0x1.74fbd35d7ccfcp-1,	 0x1.f880p-45,
+	0x1.75feb564267f1p-1,	 0x1.3e00p-47,
+	0x1.77024b1ab6d48p-1,	-0x1.7d00p-45,
+	0x1.780694fde5d38p-1,	-0x1.d000p-50,
+	0x1.790b938ac1d00p-1,	 0x1.3000p-49,
+	0x1.7a11473eb0178p-1,	-0x1.d000p-49,
+	0x1.7b17b0976d060p-1,	 0x1.0400p-45,
+	0x1.7c1ed0130c133p-1,	 0x1.0000p-53,
+	0x1.7d26a62ff8636p-1,	-0x1.6900p-45,
+	0x1.7e2f336cf4e3bp-1,	-0x1.2e00p-47,
+	0x1.7f3878491c3e8p-1,	-0x1.4580p-45,
+	0x1.80427543e1b4ep-1,	 0x1.3000p-44,
+	0x1.814d2add1071ap-1,	 0x1.f000p-47,
+	0x1.82589994ccd7ep-1,	-0x1.1c00p-45,
+	0x1.8364c1eb942d0p-1,	 0x1.9d00p-45,
+	0x1.8471a4623cab5p-1,	 0x1.7100p-43,
+	0x1.857f4179f5bbcp-1,	 0x1.2600p-45,
+	0x1.868d99b4491afp-1,	-0x1.2c40p-44,
+	0x1.879cad931a395p-1,	-0x1.3000p-45,
+	0x1.88ac7d98a65b8p-1,	-0x1.a800p-45,
+	0x1.89bd0a4785800p-1,	-0x1.d000p-49,
+	0x1.8ace5422aa223p-1,	 0x1.3280p-44,
+	0x1.8be05bad619fap-1,	 0x1.2b40p-43,
+	0x1.8cf3216b54383p-1,	-0x1.ed00p-45,
+	0x1.8e06a5e08664cp-1,	-0x1.0500p-45,
+	0x1.8f1ae99157807p-1,	 0x1.8280p-45,
+	0x1.902fed0282c0ep-1,	-0x1.cb00p-46,
+	0x1.9145b0b91ff96p-1,	-0x1.5e00p-47,
+	0x1.925c353aa2ff9p-1,	 0x1.5400p-48,
+	0x1.93737b0cdc64ap-1,	 0x1.7200p-46,
+	0x1.948b82b5f98aep-1,	-0x1.9000p-47,
+	0x1.95a44cbc852cbp-1,	 0x1.5680p-45,
+	0x1.96bdd9a766f21p-1,	-0x1.6d00p-44,
+	0x1.97d829fde4e2ap-1,	-0x1.1000p-47,
+	0x1.98f33e47a23a3p-1,	 0x1.d000p-45,
+	0x1.9a0f170ca0604p-1,	-0x1.8a40p-44,
+	0x1.9b2bb4d53ff89p-1,	 0x1.55c0p-44,
+	0x1.9c49182a3f15bp-1,	 0x1.6b80p-45,
+	0x1.9d674194bb8c5p-1,	-0x1.c000p-49,
+	0x1.9e86319e3238ep-1,	 0x1.7d00p-46,
+	0x1.9fa5e8d07f302p-1,	 0x1.6400p-46,
+	0x1.a0c667b5de54dp-1,	-0x1.5000p-48,
+	0x1.a1e7aed8eb8f6p-1,	 0x1.9e00p-47,
+	0x1.a309bec4a2e27p-1,	 0x1.ad80p-45,
+	0x1.a42c980460a5dp-1,	-0x1.af00p-46,
+	0x1.a5503b23e259bp-1,	 0x1.b600p-47,
+	0x1.a674a8af46213p-1,	 0x1.8880p-44,
+	0x1.a799e1330b3a7p-1,	 0x1.1200p-46,
+	0x1.a8bfe53c12e8dp-1,	 0x1.6c00p-47,
+	0x1.a9e6b5579fcd2p-1,	-0x1.9b80p-45,
+	0x1.ab0e521356fb8p-1,	 0x1.b700p-45,
+	0x1.ac36bbfd3f381p-1,	 0x1.9000p-50,
+	0x1.ad5ff3a3c2780p-1,	 0x1.4000p-49,
+	0x1.ae89f995ad2a3p-1,	-0x1.c900p-45,
+	0x1.afb4ce622f367p-1,	 0x1.6500p-46,
+	0x1.b0e07298db790p-1,	 0x1.fd40p-45,
+	0x1.b20ce6c9a89a9p-1,	 0x1.2700p-46,
+	0x1.b33a2b84f1a4bp-1,	 0x1.d470p-43,
+	0x1.b468415b747e7p-1,	-0x1.8380p-44,
+	0x1.b59728de5593ap-1,	 0x1.8000p-54,
+	0x1.b6c6e29f1c56ap-1,	 0x1.ad00p-47,
+	0x1.b7f76f2fb5e50p-1,	 0x1.e800p-50,
+	0x1.b928cf22749b2p-1,	-0x1.4c00p-47,
+	0x1.ba5b030a10603p-1,	-0x1.d700p-47,
+	0x1.bb8e0b79a6f66p-1,	 0x1.d900p-47,
+	0x1.bcc1e904bc1ffp-1,	 0x1.2a00p-47,
+	0x1.bdf69c3f3a16fp-1,	-0x1.f780p-46,
+	0x1.bf2c25bd71db8p-1,	-0x1.0a00p-46,
+	0x1.c06286141b2e9p-1,	-0x1.1400p-46,
+	0x1.c199bdd8552e0p-1,	 0x1.be00p-47,
+	0x1.c2d1cd9fa64eep-1,	-0x1.9400p-47,
+	0x1.c40ab5fffd02fp-1,	-0x1.ed00p-47,
+	0x1.c544778fafd15p-1,	 0x1.9660p-44,
+	0x1.c67f12e57d0cbp-1,	-0x1.a100p-46,
+	0x1.c7ba88988c1b6p-1,	-0x1.8458p-42,
+	0x1.c8f6d9406e733p-1,	-0x1.a480p-46,
+	0x1.ca3405751c4dfp-1,	 0x1.b000p-51,
+	0x1.cb720dcef9094p-1,	 0x1.1400p-47,
+	0x1.ccb0f2e6d1689p-1,	 0x1.0200p-48,
+	0x1.cdf0b555dc412p-1,	 0x1.3600p-48,
+	0x1.cf3155b5bab3bp-1,	-0x1.6900p-47,
+	0x1.d072d4a0789bcp-1,	 0x1.9a00p-47,
+	0x1.d1b532b08c8fap-1,	-0x1.5e00p-46,
+	0x1.d2f87080d8a85p-1,	 0x1.d280p-46,
+	0x1.d43c8eacaa203p-1,	 0x1.1a00p-47,
+	0x1.d5818dcfba491p-1,	 0x1.f000p-50,
+	0x1.d6c76e862e6a1p-1,	-0x1.3a00p-47,
+	0x1.d80e316c9834ep-1,	-0x1.cd80p-47,
+	0x1.d955d71ff6090p-1,	 0x1.4c00p-48,
+	0x1.da9e603db32aep-1,	 0x1.f900p-48,
+	0x1.dbe7cd63a8325p-1,	 0x1.9800p-49,
+	0x1.dd321f301b445p-1,	-0x1.5200p-48,
+	0x1.de7d5641c05bfp-1,	-0x1.d700p-46,
+	0x1.dfc97337b9aecp-1,	-0x1.6140p-46,
+	0x1.e11676b197d5ep-1,	 0x1.b480p-47,
+	0x1.e264614f5a3e7p-1,	 0x1.0ce0p-43,
+	0x1.e3b333b16ee5cp-1,	 0x1.c680p-47,
+	0x1.e502ee78b3fb4p-1,	-0x1.9300p-47,
+	0x1.e653924676d68p-1,	-0x1.5000p-49,
+	0x1.e7a51fbc74c44p-1,	-0x1.7f80p-47,
+	0x1.e8f7977cdb726p-1,	-0x1.3700p-48,
+	0x1.ea4afa2a490e8p-1,	 0x1.5d00p-49,
+	0x1.eb9f4867ccae4p-1,	 0x1.61a0p-46,
+	0x1.ecf482d8e680dp-1,	 0x1.5500p-48,
+	0x1.ee4aaa2188514p-1,	 0x1.6400p-51,
+	0x1.efa1bee615a13p-1,	-0x1.e800p-49,
+	0x1.f0f9c1cb64106p-1,	-0x1.a880p-48,
+	0x1.f252b376bb963p-1,	-0x1.c900p-45,
+	0x1.f3ac948dd7275p-1,	 0x1.a000p-53,
+	0x1.f50765b6e4524p-1,	-0x1.4f00p-48,
+	0x1.f6632798844fdp-1,	 0x1.a800p-51,
+	0x1.f7bfdad9cbe38p-1,	 0x1.abc0p-48,
+	0x1.f91d802243c82p-1,	-0x1.4600p-50,
+	0x1.fa7c1819e908ep-1,	-0x1.b0c0p-47,
+	0x1.fbdba3692d511p-1,	-0x1.0e00p-51,
+	0x1.fd3c22b8f7194p-1,	-0x1.0de8p-46,
+	0x1.fe9d96b2a23eep-1,	 0x1.e430p-49,
+	0x1.0000000000000p+0,	 0x0.0000p+0,
+	0x1.00b1afa5abcbep+0,	-0x1.3400p-52,
+	0x1.0163da9fb3303p+0,	-0x1.2170p-46,
+	0x1.02168143b0282p+0,	 0x1.a400p-52,
+	0x1.02c9a3e77806cp+0,	 0x1.f980p-49,
+	0x1.037d42e11bbcap+0,	-0x1.7400p-51,
+	0x1.04315e86e7f89p+0,	 0x1.8300p-50,
+	0x1.04e5f72f65467p+0,	-0x1.a3f0p-46,
+	0x1.059b0d315855ap+0,	-0x1.2840p-47,
+	0x1.0650a0e3c1f95p+0,	 0x1.1600p-48,
+	0x1.0706b29ddf71ap+0,	 0x1.5240p-46,
+	0x1.07bd42b72a82dp+0,	-0x1.9a00p-49,
+	0x1.0874518759bd0p+0,	 0x1.6400p-49,
+	0x1.092bdf66607c8p+0,	-0x1.0780p-47,
+	0x1.09e3ecac6f383p+0,	-0x1.8000p-54,
+	0x1.0a9c79b1f3930p+0,	 0x1.fa00p-48,
+	0x1.0b5586cf988fcp+0,	-0x1.ac80p-48,
+	0x1.0c0f145e46c8ap+0,	 0x1.9c00p-50,
+	0x1.0cc922b724816p+0,	 0x1.5200p-47,
+	0x1.0d83b23395dd8p+0,	-0x1.ad00p-48,
+	0x1.0e3ec32d3d1f3p+0,	 0x1.bac0p-46,
+	0x1.0efa55fdfa9a6p+0,	-0x1.4e80p-47,
+	0x1.0fb66affed2f0p+0,	-0x1.d300p-47,
+	0x1.1073028d7234bp+0,	 0x1.1500p-48,
+	0x1.11301d0125b5bp+0,	 0x1.c000p-49,
+	0x1.11edbab5e2af9p+0,	 0x1.6bc0p-46,
+	0x1.12abdc06c31d5p+0,	 0x1.8400p-49,
+	0x1.136a814f2047dp+0,	-0x1.ed00p-47,
+	0x1.1429aaea92de9p+0,	 0x1.8e00p-49,
+	0x1.14e95934f3138p+0,	 0x1.b400p-49,
+	0x1.15a98c8a58e71p+0,	 0x1.5300p-47,
+	0x1.166a45471c3dfp+0,	 0x1.3380p-47,
+	0x1.172b83c7d5211p+0,	 0x1.8d40p-45,
+	0x1.17ed48695bb9fp+0,	-0x1.5d00p-47,
+	0x1.18af9388c8d93p+0,	-0x1.c880p-46,
+	0x1.1972658375d66p+0,	 0x1.1f00p-46,
+	0x1.1a35beb6fcba7p+0,	 0x1.0480p-46,
+	0x1.1af99f81387e3p+0,	-0x1.7390p-43,
+	0x1.1bbe084045d54p+0,	 0x1.4e40p-45,
+	0x1.1c82f95281c43p+0,	-0x1.a200p-47,
+	0x1.1d4873168b9b2p+0,	 0x1.3800p-49,
+	0x1.1e0e75eb44031p+0,	 0x1.ac00p-49,
+	0x1.1ed5022fcd938p+0,	 0x1.1900p-47,
+	0x1.1f9c18438cdf7p+0,	-0x1.b780p-46,
+	0x1.2063b88628d8fp+0,	 0x1.d940p-45,
+	0x1.212be3578a81ep+0,	 0x1.8000p-50,
+	0x1.21f49917ddd41p+0,	 0x1.b340p-45,
+	0x1.22bdda2791323p+0,	 0x1.9f80p-46,
+	0x1.2387a6e7561e7p+0,	-0x1.9c80p-46,
+	0x1.2451ffb821427p+0,	 0x1.2300p-47,
+	0x1.251ce4fb2a602p+0,	-0x1.3480p-46,
+	0x1.25e85711eceb0p+0,	 0x1.2700p-46,
+	0x1.26b4565e27d16p+0,	 0x1.1d00p-46,
+	0x1.2780e341de00fp+0,	 0x1.1ee0p-44,
+	0x1.284dfe1f5633ep+0,	-0x1.4c00p-46,
+	0x1.291ba7591bb30p+0,	-0x1.3d80p-46,
+	0x1.29e9df51fdf09p+0,	 0x1.8b00p-47,
+	0x1.2ab8a66d10e9bp+0,	-0x1.27c0p-45,
+	0x1.2b87fd0dada3ap+0,	 0x1.a340p-45,
+	0x1.2c57e39771af9p+0,	-0x1.0800p-46,
+	0x1.2d285a6e402d9p+0,	-0x1.ed00p-47,
+	0x1.2df961f641579p+0,	-0x1.4200p-48,
+	0x1.2ecafa93e2ecfp+0,	-0x1.4980p-45,
+	0x1.2f9d24abd8822p+0,	-0x1.6300p-46,
+	0x1.306fe0a31b625p+0,	-0x1.2360p-44,
+	0x1.31432edeea50bp+0,	-0x1.0df8p-40,
+	0x1.32170fc4cd7b8p+0,	-0x1.2480p-45,
+	0x1.32eb83ba8e9a2p+0,	-0x1.5980p-45,
+	0x1.33c08b2641766p+0,	 0x1.ed00p-46,
+	0x1.3496266e3fa27p+0,	-0x1.c000p-50,
+	0x1.356c55f929f0fp+0,	-0x1.0d80p-44,
+	0x1.36431a2de88b9p+0,	 0x1.2c80p-45,
+	0x1.371a7373aaa39p+0,	 0x1.0600p-45,
+	0x1.37f26231e74fep+0,	-0x1.6600p-46,
+	0x1.38cae6d05d838p+0,	-0x1.ae00p-47,
+	0x1.39a401b713ec3p+0,	-0x1.4720p-43,
+	0x1.3a7db34e5a020p+0,	 0x1.8200p-47,
+	0x1.3b57fbfec6e95p+0,	 0x1.e800p-44,
+	0x1.3c32dc313a8f2p+0,	 0x1.f800p-49,
+	0x1.3d0e544ede122p+0,	-0x1.7a00p-46,
+	0x1.3dea64c1234bbp+0,	 0x1.6300p-45,
+	0x1.3ec70df1c4eccp+0,	-0x1.8a60p-43,
+	0x1.3fa4504ac7e8cp+0,	-0x1.cdc0p-44,
+	0x1.40822c367a0bbp+0,	 0x1.5b80p-45,
+	0x1.4160a21f72e95p+0,	 0x1.ec00p-46,
+	0x1.423fb27094646p+0,	-0x1.3600p-46,
+	0x1.431f5d950a920p+0,	 0x1.3980p-45,
+	0x1.43ffa3f84b9ebp+0,	 0x1.a000p-48,
+	0x1.44e0860618919p+0,	-0x1.6c00p-48,
+	0x1.45c2042a7d201p+0,	-0x1.bc00p-47,
+	0x1.46a41ed1d0016p+0,	-0x1.2800p-46,
+	0x1.4786d668b3326p+0,	 0x1.0e00p-44,
+	0x1.486a2b5c13c00p+0,	-0x1.d400p-45,
+	0x1.494e1e192af04p+0,	 0x1.c200p-47,
+	0x1.4a32af0d7d372p+0,	-0x1.e500p-46,
+	0x1.4b17dea6db801p+0,	 0x1.7800p-47,
+	0x1.4bfdad53629e1p+0,	-0x1.3800p-46,
+	0x1.4ce41b817c132p+0,	 0x1.0800p-47,
+	0x1.4dcb299fddddbp+0,	 0x1.c700p-45,
+	0x1.4eb2d81d8ab96p+0,	-0x1.ce00p-46,
+	0x1.4f9b2769d2d02p+0,	 0x1.9200p-46,
+	0x1.508417f4531c1p+0,	-0x1.8c00p-47,
+	0x1.516daa2cf662ap+0,	-0x1.a000p-48,
+	0x1.5257de83f51eap+0,	 0x1.a080p-43,
+	0x1.5342b569d4edap+0,	-0x1.6d80p-45,
+	0x1.542e2f4f6ac1ap+0,	-0x1.2440p-44,
+	0x1.551a4ca5d94dbp+0,	 0x1.83c0p-43,
+	0x1.56070dde9116bp+0,	 0x1.4b00p-45,
+	0x1.56f4736b529dep+0,	 0x1.15a0p-43,
+	0x1.57e27dbe2c40ep+0,	-0x1.9e00p-45,
+	0x1.58d12d497c76fp+0,	-0x1.3080p-45,
+	0x1.59c0827ff0b4cp+0,	 0x1.dec0p-43,
+	0x1.5ab07dd485427p+0,	-0x1.4000p-51,
+	0x1.5ba11fba87af4p+0,	 0x1.0080p-44,
+	0x1.5c9268a59460bp+0,	-0x1.6c80p-45,
+	0x1.5d84590998e3fp+0,	 0x1.69a0p-43,
+	0x1.5e76f15ad20e1p+0,	-0x1.b400p-46,
+	0x1.5f6a320dcebcap+0,	 0x1.7700p-46,
+	0x1.605e1b976dcb8p+0,	 0x1.6f80p-45,
+	0x1.6152ae6cdf715p+0,	 0x1.1000p-47,
+	0x1.6247eb03a5531p+0,	-0x1.5d00p-46,
+	0x1.633dd1d1929b5p+0,	-0x1.2d00p-46,
+	0x1.6434634ccc313p+0,	-0x1.a800p-49,
+	0x1.652b9febc8efap+0,	-0x1.8600p-45,
+	0x1.6623882553397p+0,	 0x1.1fe0p-40,
+	0x1.671c1c708328ep+0,	-0x1.7200p-44,
+	0x1.68155d44ca97ep+0,	 0x1.6800p-49,
+	0x1.690f4b19e9471p+0,	-0x1.9780p-45,
+};
+
+/*
+ * exp2(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.503 ulp for normalized results.
+ *
+ * Method: (accurate tables)
+ *
+ *   Reduce x:
+ *     x = 2**k + y, for integer k and |y| <= 1/2.
+ *     Thus we have exp2(x) = 2**k * exp2(y).
+ *
+ *   Reduce y:
+ *     y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
+ *     Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
+ *     with |z - eps[i]| <= 2**-9 + 2**-39 for the table used.
+ *
+ *   We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
+ *   a degree-5 minimax polynomial with maximum error under 1.3 * 2**-61.
+ *   The values in exp2t[] and eps[] are chosen such that
+ *   exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
+ *   that exp2t[i] is accurate to 2**-64.
+ *
+ *   Note that the range of i is +-TBLSIZE/2, so we actually index the tables
+ *   by i0 = i + TBLSIZE/2.  For cache efficiency, exp2t[] and eps[] are
+ *   virtual tables, interleaved in the real table tbl[].
+ *
+ *   This method is due to Gal, with many details due to Gal and Bachelis:
+ *
+ *	Gal, S. and Bachelis, B.  An Accurate Elementary Mathematical Library
+ *	for the IEEE Floating Point Standard.  TOMS 17(1), 26-46 (1991).
+ */
+double
+exp2(double x)
+{
+	double r, t, twopk, twopkp1000, z;
+	uint32_t hx, ix, lx, i0;
+	int k;
+
+	/* Filter out exceptional cases. */
+	GET_HIGH_WORD(hx,x);
+	ix = hx & 0x7fffffff;		/* high word of |x| */
+	if(ix >= 0x40900000) {			/* |x| >= 1024 */
+		if(ix >= 0x7ff00000) {
+			GET_LOW_WORD(lx,x);
+			if(((ix & 0xfffff) | lx) != 0 || (hx & 0x80000000) == 0)
+				return (x + x);	/* x is NaN or +Inf */
+			else 
+				return (0.0);	/* x is -Inf */
+		}
+		if(x >= 0x1.0p10)
+			return (huge * huge); /* overflow */
+		if(x <= -0x1.0ccp10)
+			return (twom1000 * twom1000); /* underflow */
+	} else if (ix < 0x3c900000) {		/* |x| < 0x1p-54 */
+		return (1.0 + x);
+	}
+
+	/* Reduce x, computing z, i0, and k. */
+	STRICT_ASSIGN(double, t, x + redux);
+	GET_LOW_WORD(i0, t);
+	i0 += TBLSIZE / 2;
+	k = (i0 >> TBLBITS) << 20;
+	i0 = (i0 & (TBLSIZE - 1)) << 1;
+	t -= redux;
+	z = x - t;
+
+	/* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
+	t = tbl[i0];		/* exp2t[i0] */
+	z -= tbl[i0 + 1];	/* eps[i0]   */
+	if (k >= -(1021 << 20))
+		INSERT_WORDS(twopk, 0x3ff00000 + k, 0);
+	else
+		INSERT_WORDS(twopkp1000, 0x3ff00000 + k + (1000 << 20), 0);
+	r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5))));
+
+	/* Scale by 2**(k>>20). */
+	if(k >= -(1021 << 20)) {
+		if (k == 1024 << 20)
+			return (r * 2.0 * 0x1p1023);
+		return (r * twopk);
+	} else {
+		return (r * twopkp1000 * twom1000);
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(exp2, exp2l);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_exp2f.c b/libm/upstream-freebsd/lib/msun/src/s_exp2f.c
new file mode 100644
index 0000000..9ac7c1f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_exp2f.c
@@ -0,0 +1,137 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+#define	TBLBITS	4
+#define	TBLSIZE	(1 << TBLBITS)
+
+static const float
+    redux   = 0x1.8p23f / TBLSIZE,
+    P1	    = 0x1.62e430p-1f,
+    P2	    = 0x1.ebfbe0p-3f,
+    P3	    = 0x1.c6b348p-5f,
+    P4	    = 0x1.3b2c9cp-7f;
+
+static volatile float
+    huge    = 0x1p100f,
+    twom100 = 0x1p-100f;
+
+static const double exp2ft[TBLSIZE] = {
+	0x1.6a09e667f3bcdp-1,
+	0x1.7a11473eb0187p-1,
+	0x1.8ace5422aa0dbp-1,
+	0x1.9c49182a3f090p-1,
+	0x1.ae89f995ad3adp-1,
+	0x1.c199bdd85529cp-1,
+	0x1.d5818dcfba487p-1,
+	0x1.ea4afa2a490dap-1,
+	0x1.0000000000000p+0,
+	0x1.0b5586cf9890fp+0,
+	0x1.172b83c7d517bp+0,
+	0x1.2387a6e756238p+0,
+	0x1.306fe0a31b715p+0,
+	0x1.3dea64c123422p+0,
+	0x1.4bfdad5362a27p+0,
+	0x1.5ab07dd485429p+0,
+};
+	
+/*
+ * exp2f(x): compute the base 2 exponential of x
+ *
+ * Accuracy: Peak error < 0.501 ulp; location of peak: -0.030110927.
+ *
+ * Method: (equally-spaced tables)
+ *
+ *   Reduce x:
+ *     x = 2**k + y, for integer k and |y| <= 1/2.
+ *     Thus we have exp2f(x) = 2**k * exp2(y).
+ *
+ *   Reduce y:
+ *     y = i/TBLSIZE + z for integer i near y * TBLSIZE.
+ *     Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z),
+ *     with |z| <= 2**-(TBLSIZE+1).
+ *
+ *   We compute exp2(i/TBLSIZE) via table lookup and exp2(z) via a
+ *   degree-4 minimax polynomial with maximum error under 1.4 * 2**-33.
+ *   Using double precision for everything except the reduction makes
+ *   roundoff error insignificant and simplifies the scaling step.
+ *
+ *   This method is due to Tang, but I do not use his suggested parameters:
+ *
+ *	Tang, P.  Table-driven Implementation of the Exponential Function
+ *	in IEEE Floating-Point Arithmetic.  TOMS 15(2), 144-157 (1989).
+ */
+float
+exp2f(float x)
+{
+	double tv, twopk, u, z;
+	float t;
+	uint32_t hx, ix, i0;
+	int32_t k;
+
+	/* Filter out exceptional cases. */
+	GET_FLOAT_WORD(hx, x);
+	ix = hx & 0x7fffffff;		/* high word of |x| */
+	if(ix >= 0x43000000) {			/* |x| >= 128 */
+		if(ix >= 0x7f800000) {
+			if ((ix & 0x7fffff) != 0 || (hx & 0x80000000) == 0)
+				return (x + x);	/* x is NaN or +Inf */
+			else 
+				return (0.0);	/* x is -Inf */
+		}
+		if(x >= 0x1.0p7f)
+			return (huge * huge);	/* overflow */
+		if(x <= -0x1.2cp7f)
+			return (twom100 * twom100); /* underflow */
+	} else if (ix <= 0x33000000) {		/* |x| <= 0x1p-25 */
+		return (1.0f + x);
+	}
+
+	/* Reduce x, computing z, i0, and k. */
+	STRICT_ASSIGN(float, t, x + redux);
+	GET_FLOAT_WORD(i0, t);
+	i0 += TBLSIZE / 2;
+	k = (i0 >> TBLBITS) << 20;
+	i0 &= TBLSIZE - 1;
+	t -= redux;
+	z = x - t;
+	INSERT_WORDS(twopk, 0x3ff00000 + k, 0);
+
+	/* Compute r = exp2(y) = exp2ft[i0] * p(z). */
+	tv = exp2ft[i0];
+	u = tv * z;
+	tv = tv + u * (P1 + z * P2) + u * (z * z) * (P3 + z * P4);
+
+	/* Scale by 2**(k>>20). */
+	return (tv * twopk);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_expm1.c b/libm/upstream-freebsd/lib/msun/src/s_expm1.c
new file mode 100644
index 0000000..37998a3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_expm1.c
@@ -0,0 +1,222 @@
+/* @(#)s_expm1.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* expm1(x)
+ * Returns exp(x)-1, the exponential of x minus 1.
+ *
+ * Method
+ *   1. Argument reduction:
+ *	Given x, find r and integer k such that
+ *
+ *               x = k*ln2 + r,  |r| <= 0.5*ln2 ~ 0.34658
+ *
+ *      Here a correction term c will be computed to compensate
+ *	the error in r when rounded to a floating-point number.
+ *
+ *   2. Approximating expm1(r) by a special rational function on
+ *	the interval [0,0.34658]:
+ *	Since
+ *	    r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
+ *	we define R1(r*r) by
+ *	    r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
+ *	That is,
+ *	    R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
+ *		     = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
+ *		     = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
+ *      We use a special Reme algorithm on [0,0.347] to generate
+ * 	a polynomial of degree 5 in r*r to approximate R1. The
+ *	maximum error of this polynomial approximation is bounded
+ *	by 2**-61. In other words,
+ *	    R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
+ *	where 	Q1  =  -1.6666666666666567384E-2,
+ * 		Q2  =   3.9682539681370365873E-4,
+ * 		Q3  =  -9.9206344733435987357E-6,
+ * 		Q4  =   2.5051361420808517002E-7,
+ * 		Q5  =  -6.2843505682382617102E-9;
+ *		z   =  r*r,
+ *	with error bounded by
+ *	    |                  5           |     -61
+ *	    | 1.0+Q1*z+...+Q5*z   -  R1(z) | <= 2
+ *	    |                              |
+ *
+ *	expm1(r) = exp(r)-1 is then computed by the following
+ * 	specific way which minimize the accumulation rounding error:
+ *			       2     3
+ *			      r     r    [ 3 - (R1 + R1*r/2)  ]
+ *	      expm1(r) = r + --- + --- * [--------------------]
+ *		              2     2    [ 6 - r*(3 - R1*r/2) ]
+ *
+ *	To compensate the error in the argument reduction, we use
+ *		expm1(r+c) = expm1(r) + c + expm1(r)*c
+ *			   ~ expm1(r) + c + r*c
+ *	Thus c+r*c will be added in as the correction terms for
+ *	expm1(r+c). Now rearrange the term to avoid optimization
+ * 	screw up:
+ *		        (      2                                    2 )
+ *		        ({  ( r    [ R1 -  (3 - R1*r/2) ]  )  }    r  )
+ *	 expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
+ *	                ({  ( 2    [ 6 - r*(3 - R1*r/2) ]  )  }    2  )
+ *                      (                                             )
+ *
+ *		   = r - E
+ *   3. Scale back to obtain expm1(x):
+ *	From step 1, we have
+ *	   expm1(x) = either 2^k*[expm1(r)+1] - 1
+ *		    = or     2^k*[expm1(r) + (1-2^-k)]
+ *   4. Implementation notes:
+ *	(A). To save one multiplication, we scale the coefficient Qi
+ *	     to Qi*2^i, and replace z by (x^2)/2.
+ *	(B). To achieve maximum accuracy, we compute expm1(x) by
+ *	  (i)   if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
+ *	  (ii)  if k=0, return r-E
+ *	  (iii) if k=-1, return 0.5*(r-E)-0.5
+ *        (iv)	if k=1 if r < -0.25, return 2*((r+0.5)- E)
+ *	       	       else	     return  1.0+2.0*(r-E);
+ *	  (v)   if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
+ *	  (vi)  if k <= 20, return 2^k((1-2^-k)-(E-r)), else
+ *	  (vii) return 2^k(1-((E+2^-k)-r))
+ *
+ * Special cases:
+ *	expm1(INF) is INF, expm1(NaN) is NaN;
+ *	expm1(-INF) is -1, and
+ *	for finite argument, only expm1(0)=0 is exact.
+ *
+ * Accuracy:
+ *	according to an error analysis, the error is always less than
+ *	1 ulp (unit in the last place).
+ *
+ * Misc. info.
+ *	For IEEE double
+ *	    if x >  7.09782712893383973096e+02 then expm1(x) overflow
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+one		= 1.0,
+tiny		= 1.0e-300,
+o_threshold	= 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */
+ln2_hi		= 6.93147180369123816490e-01,/* 0x3fe62e42, 0xfee00000 */
+ln2_lo		= 1.90821492927058770002e-10,/* 0x3dea39ef, 0x35793c76 */
+invln2		= 1.44269504088896338700e+00,/* 0x3ff71547, 0x652b82fe */
+/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */
+Q1  =  -3.33333333333331316428e-02, /* BFA11111 111110F4 */
+Q2  =   1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
+Q3  =  -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
+Q4  =   4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
+Q5  =  -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
+
+static volatile double huge = 1.0e+300;
+
+double
+expm1(double x)
+{
+	double y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
+	int32_t k,xsb;
+	u_int32_t hx;
+
+	GET_HIGH_WORD(hx,x);
+	xsb = hx&0x80000000;		/* sign bit of x */
+	hx &= 0x7fffffff;		/* high word of |x| */
+
+    /* filter out huge and non-finite argument */
+	if(hx >= 0x4043687A) {			/* if |x|>=56*ln2 */
+	    if(hx >= 0x40862E42) {		/* if |x|>=709.78... */
+                if(hx>=0x7ff00000) {
+		    u_int32_t low;
+		    GET_LOW_WORD(low,x);
+		    if(((hx&0xfffff)|low)!=0)
+		         return x+x; 	 /* NaN */
+		    else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
+	        }
+	        if(x > o_threshold) return huge*huge; /* overflow */
+	    }
+	    if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */
+		if(x+tiny<0.0)		/* raise inexact */
+		return tiny-one;	/* return -1 */
+	    }
+	}
+
+    /* argument reduction */
+	if(hx > 0x3fd62e42) {		/* if  |x| > 0.5 ln2 */
+	    if(hx < 0x3FF0A2B2) {	/* and |x| < 1.5 ln2 */
+		if(xsb==0)
+		    {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
+		else
+		    {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
+	    } else {
+		k  = invln2*x+((xsb==0)?0.5:-0.5);
+		t  = k;
+		hi = x - t*ln2_hi;	/* t*ln2_hi is exact here */
+		lo = t*ln2_lo;
+	    }
+	    STRICT_ASSIGN(double, x, hi - lo);
+	    c  = (hi-x)-lo;
+	}
+	else if(hx < 0x3c900000) {  	/* when |x|<2**-54, return x */
+	    t = huge+x;	/* return x with inexact flags when x!=0 */
+	    return x - (t-(huge+x));
+	}
+	else k = 0;
+
+    /* x is now in primary range */
+	hfx = 0.5*x;
+	hxs = x*hfx;
+	r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
+	t  = 3.0-r1*hfx;
+	e  = hxs*((r1-t)/(6.0 - x*t));
+	if(k==0) return x - (x*e-hxs);		/* c is 0 */
+	else {
+	    INSERT_WORDS(twopk,0x3ff00000+(k<<20),0);	/* 2^k */
+	    e  = (x*(e-c)-c);
+	    e -= hxs;
+	    if(k== -1) return 0.5*(x-e)-0.5;
+	    if(k==1) {
+	       	if(x < -0.25) return -2.0*(e-(x+0.5));
+	       	else 	      return  one+2.0*(x-e);
+	    }
+	    if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
+	        y = one-(e-x);
+		if (k == 1024) y = y*2.0*0x1p1023;
+		else y = y*twopk;
+	        return y-one;
+	    }
+	    t = one;
+	    if(k<20) {
+	        SET_HIGH_WORD(t,0x3ff00000 - (0x200000>>k));  /* t=1-2^-k */
+	       	y = t-(e-x);
+		y = y*twopk;
+	   } else {
+		SET_HIGH_WORD(t,((0x3ff-k)<<20));	/* 2^-k */
+	       	y = x-(e+t);
+	       	y += one;
+		y = y*twopk;
+	    }
+	}
+	return y;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(expm1, expm1l);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_expm1f.c b/libm/upstream-freebsd/lib/msun/src/s_expm1f.c
new file mode 100644
index 0000000..c0a3934
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_expm1f.c
@@ -0,0 +1,124 @@
+/* s_expm1f.c -- float version of s_expm1.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+one		= 1.0,
+tiny		= 1.0e-30,
+o_threshold	= 8.8721679688e+01,/* 0x42b17180 */
+ln2_hi		= 6.9313812256e-01,/* 0x3f317180 */
+ln2_lo		= 9.0580006145e-06,/* 0x3717f7d1 */
+invln2		= 1.4426950216e+00,/* 0x3fb8aa3b */
+/*
+ * Domain [-0.34568, 0.34568], range ~[-6.694e-10, 6.696e-10]:
+ * |6 / x * (1 + 2 * (1 / (exp(x) - 1) - 1 / x)) - q(x)| < 2**-30.04
+ * Scaled coefficients: Qn_here = 2**n * Qn_for_q (see s_expm1.c):
+ */
+Q1 = -3.3333212137e-2,		/* -0x888868.0p-28 */
+Q2 =  1.5807170421e-3;		/*  0xcf3010.0p-33 */
+
+static volatile float huge = 1.0e+30;
+
+float
+expm1f(float x)
+{
+	float y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
+	int32_t k,xsb;
+	u_int32_t hx;
+
+	GET_FLOAT_WORD(hx,x);
+	xsb = hx&0x80000000;		/* sign bit of x */
+	hx &= 0x7fffffff;		/* high word of |x| */
+
+    /* filter out huge and non-finite argument */
+	if(hx >= 0x4195b844) {			/* if |x|>=27*ln2 */
+	    if(hx >= 0x42b17218) {		/* if |x|>=88.721... */
+                if(hx>0x7f800000)
+		    return x+x; 	 /* NaN */
+		if(hx==0x7f800000)
+		    return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
+	        if(x > o_threshold) return huge*huge; /* overflow */
+	    }
+	    if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
+		if(x+tiny<(float)0.0)	/* raise inexact */
+		return tiny-one;	/* return -1 */
+	    }
+	}
+
+    /* argument reduction */
+	if(hx > 0x3eb17218) {		/* if  |x| > 0.5 ln2 */
+	    if(hx < 0x3F851592) {	/* and |x| < 1.5 ln2 */
+		if(xsb==0)
+		    {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
+		else
+		    {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
+	    } else {
+		k  = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
+		t  = k;
+		hi = x - t*ln2_hi;	/* t*ln2_hi is exact here */
+		lo = t*ln2_lo;
+	    }
+	    STRICT_ASSIGN(float, x, hi - lo);
+	    c  = (hi-x)-lo;
+	}
+	else if(hx < 0x33000000) {  	/* when |x|<2**-25, return x */
+	    t = huge+x;	/* return x with inexact flags when x!=0 */
+	    return x - (t-(huge+x));
+	}
+	else k = 0;
+
+    /* x is now in primary range */
+	hfx = (float)0.5*x;
+	hxs = x*hfx;
+	r1 = one+hxs*(Q1+hxs*Q2);
+	t  = (float)3.0-r1*hfx;
+	e  = hxs*((r1-t)/((float)6.0 - x*t));
+	if(k==0) return x - (x*e-hxs);		/* c is 0 */
+	else {
+	    SET_FLOAT_WORD(twopk,0x3f800000+(k<<23));	/* 2^k */
+	    e  = (x*(e-c)-c);
+	    e -= hxs;
+	    if(k== -1) return (float)0.5*(x-e)-(float)0.5;
+	    if(k==1) {
+	       	if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
+	       	else 	      return  one+(float)2.0*(x-e);
+	    }
+	    if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
+	        y = one-(e-x);
+		if (k == 128) y = y*2.0F*0x1p127F;
+		else y = y*twopk;
+	        return y-one;
+	    }
+	    t = one;
+	    if(k<23) {
+	        SET_FLOAT_WORD(t,0x3f800000 - (0x1000000>>k)); /* t=1-2^-k */
+	       	y = t-(e-x);
+		y = y*twopk;
+	   } else {
+		SET_FLOAT_WORD(t,((0x7f-k)<<23));	/* 2^-k */
+	       	y = x-(e+t);
+	       	y += one;
+		y = y*twopk;
+	    }
+	}
+	return y;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fabsl.c b/libm/upstream-freebsd/lib/msun/src/s_fabsl.c
new file mode 100644
index 0000000..29831d2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fabsl.c
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2003 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer
+ *    in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fabsl(long double x)
+{
+	union IEEEl2bits u;
+
+	u.e = x;
+	u.bits.sign = 0;
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fdim.c b/libm/upstream-freebsd/lib/msun/src/s_fdim.c
new file mode 100644
index 0000000..2f347fd
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fdim.c
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#define	DECL(type, fn)			\
+type					\
+fn(type x, type y)			\
+{					\
+					\
+	if (isnan(x))			\
+		return (x);		\
+	if (isnan(y))			\
+		return (y);		\
+	return (x > y ? x - y : 0.0);	\
+}
+
+DECL(double, fdim)
+DECL(float, fdimf)
+DECL(long double, fdiml)
diff --git a/libm/upstream-freebsd/lib/msun/src/s_finite.c b/libm/upstream-freebsd/lib/msun/src/s_finite.c
new file mode 100644
index 0000000..4c51352
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_finite.c
@@ -0,0 +1,29 @@
+/* @(#)s_finite.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * finite(x) returns 1 is x is finite, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+	int finite(double x)
+{
+	int32_t hx;
+	GET_HIGH_WORD(hx,x);
+	return (int)((u_int32_t)((hx&0x7fffffff)-0x7ff00000)>>31);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_finitef.c b/libm/upstream-freebsd/lib/msun/src/s_finitef.c
new file mode 100644
index 0000000..c62239e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_finitef.c
@@ -0,0 +1,32 @@
+/* s_finitef.c -- float version of s_finite.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * finitef(x) returns 1 is x is finite, else 0;
+ * no branching!
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+	int finitef(float x)
+{
+	int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	return (int)((u_int32_t)((ix&0x7fffffff)-0x7f800000)>>31);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_floor.c b/libm/upstream-freebsd/lib/msun/src/s_floor.c
new file mode 100644
index 0000000..65f696a
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_floor.c
@@ -0,0 +1,78 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * floor(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to floor(x).
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+floor(double x)
+{
+	int32_t i0,i1,j0;
+	u_int32_t i,j;
+	EXTRACT_WORDS(i0,i1,x);
+	j0 = ((i0>>20)&0x7ff)-0x3ff;
+	if(j0<20) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
+		    if(i0>=0) {i0=i1=0;}
+		    else if(((i0&0x7fffffff)|i1)!=0)
+			{ i0=0xbff00000;i1=0;}
+		}
+	    } else {
+		i = (0x000fffff)>>j0;
+		if(((i0&i)|i1)==0) return x; /* x is integral */
+		if(huge+x>0.0) {	/* raise inexact flag */
+		    if(i0<0) i0 += (0x00100000)>>j0;
+		    i0 &= (~i); i1=0;
+		}
+	    }
+	} else if (j0>51) {
+	    if(j0==0x400) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	} else {
+	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
+	    if((i1&i)==0) return x;	/* x is integral */
+	    if(huge+x>0.0) { 		/* raise inexact flag */
+		if(i0<0) {
+		    if(j0==20) i0+=1;
+		    else {
+			j = i1+(1<<(52-j0));
+			if(j<i1) i0 +=1 ; 	/* got a carry */
+			i1=j;
+		    }
+		}
+		i1 &= (~i);
+	    }
+	}
+	INSERT_WORDS(x,i0,i1);
+	return x;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(floor, floorl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_floorf.c b/libm/upstream-freebsd/lib/msun/src/s_floorf.c
new file mode 100644
index 0000000..6b510de
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_floorf.c
@@ -0,0 +1,61 @@
+/* s_floorf.c -- float version of s_floor.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * floorf(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to floorf(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30;
+
+float
+floorf(float x)
+{
+	int32_t i0,j0;
+	u_int32_t i;
+	GET_FLOAT_WORD(i0,x);
+	j0 = ((i0>>23)&0xff)-0x7f;
+	if(j0<23) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */
+		    if(i0>=0) {i0=0;}
+		    else if((i0&0x7fffffff)!=0)
+			{ i0=0xbf800000;}
+		}
+	    } else {
+		i = (0x007fffff)>>j0;
+		if((i0&i)==0) return x; /* x is integral */
+		if(huge+x>(float)0.0) {	/* raise inexact flag */
+		    if(i0<0) i0 += (0x00800000)>>j0;
+		    i0 &= (~i);
+		}
+	    }
+	} else {
+	    if(j0==0x80) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	}
+	SET_FLOAT_WORD(x,i0);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_floorl.c b/libm/upstream-freebsd/lib/msun/src/s_floorl.c
new file mode 100644
index 0000000..6cec3e7
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_floorl.c
@@ -0,0 +1,101 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_floor.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * floorl(x)
+ * Return x rounded toward -inf to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to floorl(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define	MANH_SIZE	(LDBL_MANH_SIZE + 1)
+#define	INC_MANH(u, c)	do {					\
+	uint64_t o = u.bits.manh;				\
+	u.bits.manh += (c);					\
+	if (u.bits.manh < o)					\
+		u.bits.exp++;					\
+} while (0)
+#else
+#define	MANH_SIZE	LDBL_MANH_SIZE
+#define	INC_MANH(u, c)	do {					\
+	uint64_t o = u.bits.manh;				\
+	u.bits.manh += (c);					\
+	if (u.bits.manh < o) {					\
+		u.bits.exp++;					\
+		u.bits.manh |= 1llu << (LDBL_MANH_SIZE - 1);	\
+	}							\
+} while (0)
+#endif
+
+static const long double huge = 1.0e300;
+
+long double
+floorl(long double x)
+{
+	union IEEEl2bits u = { .e = x };
+	int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+	if (e < MANH_SIZE - 1) {
+		if (e < 0) {			/* raise inexact if x != 0 */
+			if (huge + x > 0.0)
+				if (u.bits.exp > 0 ||
+				    (u.bits.manh | u.bits.manl) != 0)
+					u.e = u.bits.sign ? -1.0 : 0.0;
+		} else {
+			uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+			if (((u.bits.manh & m) | u.bits.manl) == 0)
+				return (x);	/* x is integral */
+			if (u.bits.sign) {
+#ifdef LDBL_IMPLICIT_NBIT
+				if (e == 0)
+					u.bits.exp++;
+				else
+#endif
+				INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
+			}
+			if (huge + x > 0.0) {	/* raise inexact flag */
+				u.bits.manh &= ~m;
+				u.bits.manl = 0;
+			}
+		}
+	} else if (e < LDBL_MANT_DIG - 1) {
+		uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+		if ((u.bits.manl & m) == 0)
+			return (x);	/* x is integral */
+		if (u.bits.sign) {
+			if (e == MANH_SIZE - 1)
+				INC_MANH(u, 1);
+			else {
+				uint64_t o = u.bits.manl;
+				u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
+				if (u.bits.manl < o)	/* got a carry */
+					INC_MANH(u, 1);
+			}
+		}
+		if (huge + x > 0.0)		/* raise inexact flag */
+			u.bits.manl &= ~m;
+	}
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fma.c b/libm/upstream-freebsd/lib/msun/src/s_fma.c
new file mode 100644
index 0000000..b1066c2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fma.c
@@ -0,0 +1,288 @@
+/*-
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+
+#include "math_private.h"
+
+/*
+ * A struct dd represents a floating-point number with twice the precision
+ * of a double.  We maintain the invariant that "hi" stores the 53 high-order
+ * bits of the result.
+ */
+struct dd {
+	double hi;
+	double lo;
+};
+
+/*
+ * Compute a+b exactly, returning the exact result in a struct dd.  We assume
+ * that both a and b are finite, but make no assumptions about their relative
+ * magnitudes.
+ */
+static inline struct dd
+dd_add(double a, double b)
+{
+	struct dd ret;
+	double s;
+
+	ret.hi = a + b;
+	s = ret.hi - a;
+	ret.lo = (a - (ret.hi - s)) + (b - s);
+	return (ret);
+}
+
+/*
+ * Compute a+b, with a small tweak:  The least significant bit of the
+ * result is adjusted into a sticky bit summarizing all the bits that
+ * were lost to rounding.  This adjustment negates the effects of double
+ * rounding when the result is added to another number with a higher
+ * exponent.  For an explanation of round and sticky bits, see any reference
+ * on FPU design, e.g.,
+ *
+ *     J. Coonen.  An Implementation Guide to a Proposed Standard for
+ *     Floating-Point Arithmetic.  Computer, vol. 13, no. 1, Jan 1980.
+ */
+static inline double
+add_adjusted(double a, double b)
+{
+	struct dd sum;
+	uint64_t hibits, lobits;
+
+	sum = dd_add(a, b);
+	if (sum.lo != 0) {
+		EXTRACT_WORD64(hibits, sum.hi);
+		if ((hibits & 1) == 0) {
+			/* hibits += (int)copysign(1.0, sum.hi * sum.lo) */
+			EXTRACT_WORD64(lobits, sum.lo);
+			hibits += 1 - ((hibits ^ lobits) >> 62);
+			INSERT_WORD64(sum.hi, hibits);
+		}
+	}
+	return (sum.hi);
+}
+
+/*
+ * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
+ * that the result will be subnormal, and care is taken to ensure that
+ * double rounding does not occur.
+ */
+static inline double
+add_and_denormalize(double a, double b, int scale)
+{
+	struct dd sum;
+	uint64_t hibits, lobits;
+	int bits_lost;
+
+	sum = dd_add(a, b);
+
+	/*
+	 * If we are losing at least two bits of accuracy to denormalization,
+	 * then the first lost bit becomes a round bit, and we adjust the
+	 * lowest bit of sum.hi to make it a sticky bit summarizing all the
+	 * bits in sum.lo. With the sticky bit adjusted, the hardware will
+	 * break any ties in the correct direction.
+	 *
+	 * If we are losing only one bit to denormalization, however, we must
+	 * break the ties manually.
+	 */
+	if (sum.lo != 0) {
+		EXTRACT_WORD64(hibits, sum.hi);
+		bits_lost = -((int)(hibits >> 52) & 0x7ff) - scale + 1;
+		if ((bits_lost != 1) ^ (int)(hibits & 1)) {
+			/* hibits += (int)copysign(1.0, sum.hi * sum.lo) */
+			EXTRACT_WORD64(lobits, sum.lo);
+			hibits += 1 - (((hibits ^ lobits) >> 62) & 2);
+			INSERT_WORD64(sum.hi, hibits);
+		}
+	}
+	return (ldexp(sum.hi, scale));
+}
+
+/*
+ * Compute a*b exactly, returning the exact result in a struct dd.  We assume
+ * that both a and b are normalized, so no underflow or overflow will occur.
+ * The current rounding mode must be round-to-nearest.
+ */
+static inline struct dd
+dd_mul(double a, double b)
+{
+	static const double split = 0x1p27 + 1.0;
+	struct dd ret;
+	double ha, hb, la, lb, p, q;
+
+	p = a * split;
+	ha = a - p;
+	ha += p;
+	la = a - ha;
+
+	p = b * split;
+	hb = b - p;
+	hb += p;
+	lb = b - hb;
+
+	p = ha * hb;
+	q = ha * lb + la * hb;
+
+	ret.hi = p + q;
+	ret.lo = p - ret.hi + q + la * lb;
+	return (ret);
+}
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * We use scaling to avoid overflow/underflow, along with the
+ * canonical precision-doubling technique adapted from:
+ *
+ *	Dekker, T.  A Floating-Point Technique for Extending the
+ *	Available Precision.  Numer. Math. 18, 224-242 (1971).
+ *
+ * This algorithm is sensitive to the rounding precision.  FPUs such
+ * as the i387 must be set in double-precision mode if variables are
+ * to be stored in FP registers in order to avoid incorrect results.
+ * This is the default on FreeBSD, but not on many other systems.
+ *
+ * Hardware instructions should be used on architectures that support it,
+ * since this implementation will likely be several times slower.
+ */
+double
+fma(double x, double y, double z)
+{
+	double xs, ys, zs, adj;
+	struct dd xy, r;
+	int oround;
+	int ex, ey, ez;
+	int spread;
+
+	/*
+	 * Handle special cases. The order of operations and the particular
+	 * return values here are crucial in handling special cases involving
+	 * infinities, NaNs, overflows, and signed zeroes correctly.
+	 */
+	if (x == 0.0 || y == 0.0)
+		return (x * y + z);
+	if (z == 0.0)
+		return (x * y);
+	if (!isfinite(x) || !isfinite(y))
+		return (x * y + z);
+	if (!isfinite(z))
+		return (z);
+
+	xs = frexp(x, &ex);
+	ys = frexp(y, &ey);
+	zs = frexp(z, &ez);
+	oround = fegetround();
+	spread = ex + ey - ez;
+
+	/*
+	 * If x * y and z are many orders of magnitude apart, the scaling
+	 * will overflow, so we handle these cases specially.  Rounding
+	 * modes other than FE_TONEAREST are painful.
+	 */
+	if (spread < -DBL_MANT_DIG) {
+		feraiseexcept(FE_INEXACT);
+		if (!isnormal(z))
+			feraiseexcept(FE_UNDERFLOW);
+		switch (oround) {
+		case FE_TONEAREST:
+			return (z);
+		case FE_TOWARDZERO:
+			if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
+				return (z);
+			else
+				return (nextafter(z, 0));
+		case FE_DOWNWARD:
+			if (x > 0.0 ^ y < 0.0)
+				return (z);
+			else
+				return (nextafter(z, -INFINITY));
+		default:	/* FE_UPWARD */
+			if (x > 0.0 ^ y < 0.0)
+				return (nextafter(z, INFINITY));
+			else
+				return (z);
+		}
+	}
+	if (spread <= DBL_MANT_DIG * 2)
+		zs = ldexp(zs, -spread);
+	else
+		zs = copysign(DBL_MIN, zs);
+
+	fesetround(FE_TONEAREST);
+	/* work around clang bug 8100 */
+	volatile double vxs = xs;
+
+	/*
+	 * Basic approach for round-to-nearest:
+	 *
+	 *     (xy.hi, xy.lo) = x * y		(exact)
+	 *     (r.hi, r.lo)   = xy.hi + z	(exact)
+	 *     adj = xy.lo + r.lo		(inexact; low bit is sticky)
+	 *     result = r.hi + adj		(correctly rounded)
+	 */
+	xy = dd_mul(vxs, ys);
+	r = dd_add(xy.hi, zs);
+
+	spread = ex + ey;
+
+	if (r.hi == 0.0) {
+		/*
+		 * When the addends cancel to 0, ensure that the result has
+		 * the correct sign.
+		 */
+		fesetround(oround);
+		volatile double vzs = zs; /* XXX gcc CSE bug workaround */
+		return (xy.hi + vzs + ldexp(xy.lo, spread));
+	}
+
+	if (oround != FE_TONEAREST) {
+		/*
+		 * There is no need to worry about double rounding in directed
+		 * rounding modes.
+		 */
+		fesetround(oround);
+		/* work around clang bug 8100 */
+		volatile double vrlo = r.lo;
+		adj = vrlo + xy.lo;
+		return (ldexp(r.hi + adj, spread));
+	}
+
+	adj = add_adjusted(r.lo, xy.lo);
+	if (spread + ilogb(r.hi) > -1023)
+		return (ldexp(r.hi + adj, spread));
+	else
+		return (add_and_denormalize(r.hi, adj, spread));
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(fma, fmal);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmaf.c b/libm/upstream-freebsd/lib/msun/src/s_fmaf.c
new file mode 100644
index 0000000..3695823
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmaf.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+
+#include "math.h"
+#include "math_private.h"
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * A double has more than twice as much precision than a float, so
+ * direct double-precision arithmetic suffices, except where double
+ * rounding occurs.
+ */
+float
+fmaf(float x, float y, float z)
+{
+	double xy, result;
+	uint32_t hr, lr;
+
+	xy = (double)x * y;
+	result = xy + z;
+	EXTRACT_WORDS(hr, lr, result);
+	/* Common case: The double precision result is fine. */
+	if ((lr & 0x1fffffff) != 0x10000000 ||	/* not a halfway case */
+	    (hr & 0x7ff00000) == 0x7ff00000 ||	/* NaN */
+	    result - xy == z ||			/* exact */
+	    fegetround() != FE_TONEAREST)	/* not round-to-nearest */
+		return (result);
+
+	/*
+	 * If result is inexact, and exactly halfway between two float values,
+	 * we need to adjust the low-order bit in the direction of the error.
+	 */
+	fesetround(FE_TOWARDZERO);
+	volatile double vxy = xy;  /* XXX work around gcc CSE bug */
+	double adjusted_result = vxy + z;
+	fesetround(FE_TONEAREST);
+	if (result == adjusted_result)
+		SET_LOW_WORD(adjusted_result, lr + 1);
+	return (adjusted_result);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmal.c b/libm/upstream-freebsd/lib/msun/src/s_fmal.c
new file mode 100644
index 0000000..d435f4f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmal.c
@@ -0,0 +1,272 @@
+/*-
+ * Copyright (c) 2005-2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+/*
+ * A struct dd represents a floating-point number with twice the precision
+ * of a long double.  We maintain the invariant that "hi" stores the high-order
+ * bits of the result.
+ */
+struct dd {
+	long double hi;
+	long double lo;
+};
+
+/*
+ * Compute a+b exactly, returning the exact result in a struct dd.  We assume
+ * that both a and b are finite, but make no assumptions about their relative
+ * magnitudes.
+ */
+static inline struct dd
+dd_add(long double a, long double b)
+{
+	struct dd ret;
+	long double s;
+
+	ret.hi = a + b;
+	s = ret.hi - a;
+	ret.lo = (a - (ret.hi - s)) + (b - s);
+	return (ret);
+}
+
+/*
+ * Compute a+b, with a small tweak:  The least significant bit of the
+ * result is adjusted into a sticky bit summarizing all the bits that
+ * were lost to rounding.  This adjustment negates the effects of double
+ * rounding when the result is added to another number with a higher
+ * exponent.  For an explanation of round and sticky bits, see any reference
+ * on FPU design, e.g.,
+ *
+ *     J. Coonen.  An Implementation Guide to a Proposed Standard for
+ *     Floating-Point Arithmetic.  Computer, vol. 13, no. 1, Jan 1980.
+ */
+static inline long double
+add_adjusted(long double a, long double b)
+{
+	struct dd sum;
+	union IEEEl2bits u;
+
+	sum = dd_add(a, b);
+	if (sum.lo != 0) {
+		u.e = sum.hi;
+		if ((u.bits.manl & 1) == 0)
+			sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+	}
+	return (sum.hi);
+}
+
+/*
+ * Compute ldexp(a+b, scale) with a single rounding error. It is assumed
+ * that the result will be subnormal, and care is taken to ensure that
+ * double rounding does not occur.
+ */
+static inline long double
+add_and_denormalize(long double a, long double b, int scale)
+{
+	struct dd sum;
+	int bits_lost;
+	union IEEEl2bits u;
+
+	sum = dd_add(a, b);
+
+	/*
+	 * If we are losing at least two bits of accuracy to denormalization,
+	 * then the first lost bit becomes a round bit, and we adjust the
+	 * lowest bit of sum.hi to make it a sticky bit summarizing all the
+	 * bits in sum.lo. With the sticky bit adjusted, the hardware will
+	 * break any ties in the correct direction.
+	 *
+	 * If we are losing only one bit to denormalization, however, we must
+	 * break the ties manually.
+	 */
+	if (sum.lo != 0) {
+		u.e = sum.hi;
+		bits_lost = -u.bits.exp - scale + 1;
+		if ((bits_lost != 1) ^ (int)(u.bits.manl & 1))
+			sum.hi = nextafterl(sum.hi, INFINITY * sum.lo);
+	}
+	return (ldexp(sum.hi, scale));
+}
+
+/*
+ * Compute a*b exactly, returning the exact result in a struct dd.  We assume
+ * that both a and b are normalized, so no underflow or overflow will occur.
+ * The current rounding mode must be round-to-nearest.
+ */
+static inline struct dd
+dd_mul(long double a, long double b)
+{
+#if LDBL_MANT_DIG == 64
+	static const long double split = 0x1p32L + 1.0;
+#elif LDBL_MANT_DIG == 113
+	static const long double split = 0x1p57L + 1.0;
+#endif
+	struct dd ret;
+	long double ha, hb, la, lb, p, q;
+
+	p = a * split;
+	ha = a - p;
+	ha += p;
+	la = a - ha;
+
+	p = b * split;
+	hb = b - p;
+	hb += p;
+	lb = b - hb;
+
+	p = ha * hb;
+	q = ha * lb + la * hb;
+
+	ret.hi = p + q;
+	ret.lo = p - ret.hi + q + la * lb;
+	return (ret);
+}
+
+/*
+ * Fused multiply-add: Compute x * y + z with a single rounding error.
+ *
+ * We use scaling to avoid overflow/underflow, along with the
+ * canonical precision-doubling technique adapted from:
+ *
+ *	Dekker, T.  A Floating-Point Technique for Extending the
+ *	Available Precision.  Numer. Math. 18, 224-242 (1971).
+ */
+long double
+fmal(long double x, long double y, long double z)
+{
+	long double xs, ys, zs, adj;
+	struct dd xy, r;
+	int oround;
+	int ex, ey, ez;
+	int spread;
+
+	/*
+	 * Handle special cases. The order of operations and the particular
+	 * return values here are crucial in handling special cases involving
+	 * infinities, NaNs, overflows, and signed zeroes correctly.
+	 */
+	if (x == 0.0 || y == 0.0)
+		return (x * y + z);
+	if (z == 0.0)
+		return (x * y);
+	if (!isfinite(x) || !isfinite(y))
+		return (x * y + z);
+	if (!isfinite(z))
+		return (z);
+
+	xs = frexpl(x, &ex);
+	ys = frexpl(y, &ey);
+	zs = frexpl(z, &ez);
+	oround = fegetround();
+	spread = ex + ey - ez;
+
+	/*
+	 * If x * y and z are many orders of magnitude apart, the scaling
+	 * will overflow, so we handle these cases specially.  Rounding
+	 * modes other than FE_TONEAREST are painful.
+	 */
+	if (spread < -LDBL_MANT_DIG) {
+		feraiseexcept(FE_INEXACT);
+		if (!isnormal(z))
+			feraiseexcept(FE_UNDERFLOW);
+		switch (oround) {
+		case FE_TONEAREST:
+			return (z);
+		case FE_TOWARDZERO:
+			if (x > 0.0 ^ y < 0.0 ^ z < 0.0)
+				return (z);
+			else
+				return (nextafterl(z, 0));
+		case FE_DOWNWARD:
+			if (x > 0.0 ^ y < 0.0)
+				return (z);
+			else
+				return (nextafterl(z, -INFINITY));
+		default:	/* FE_UPWARD */
+			if (x > 0.0 ^ y < 0.0)
+				return (nextafterl(z, INFINITY));
+			else
+				return (z);
+		}
+	}
+	if (spread <= LDBL_MANT_DIG * 2)
+		zs = ldexpl(zs, -spread);
+	else
+		zs = copysignl(LDBL_MIN, zs);
+
+	fesetround(FE_TONEAREST);
+	/* work around clang bug 8100 */
+	volatile long double vxs = xs;
+
+	/*
+	 * Basic approach for round-to-nearest:
+	 *
+	 *     (xy.hi, xy.lo) = x * y		(exact)
+	 *     (r.hi, r.lo)   = xy.hi + z	(exact)
+	 *     adj = xy.lo + r.lo		(inexact; low bit is sticky)
+	 *     result = r.hi + adj		(correctly rounded)
+	 */
+	xy = dd_mul(vxs, ys);
+	r = dd_add(xy.hi, zs);
+
+	spread = ex + ey;
+
+	if (r.hi == 0.0) {
+		/*
+		 * When the addends cancel to 0, ensure that the result has
+		 * the correct sign.
+		 */
+		fesetround(oround);
+		volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
+		return (xy.hi + vzs + ldexpl(xy.lo, spread));
+	}
+
+	if (oround != FE_TONEAREST) {
+		/*
+		 * There is no need to worry about double rounding in directed
+		 * rounding modes.
+		 */
+		fesetround(oround);
+		/* work around clang bug 8100 */
+		volatile long double vrlo = r.lo;
+		adj = vrlo + xy.lo;
+		return (ldexpl(r.hi + adj, spread));
+	}
+
+	adj = add_adjusted(r.lo, xy.lo);
+	if (spread + ilogbl(r.hi) > -16383)
+		return (ldexpl(r.hi + adj, spread));
+	else
+		return (add_and_denormalize(r.hi, adj, spread));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmax.c b/libm/upstream-freebsd/lib/msun/src/s_fmax.c
new file mode 100644
index 0000000..b51b865
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmax.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double
+fmax(double x, double y)
+{
+	union IEEEd2bits u[2];
+
+	u[0].d = x;
+	u[1].d = y;
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+		return (y);
+	if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[u[0].bits.sign].d);
+
+	return (x > y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmaxf.c b/libm/upstream-freebsd/lib/msun/src/s_fmaxf.c
new file mode 100644
index 0000000..423da54
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmaxf.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+float
+fmaxf(float x, float y)
+{
+	union IEEEf2bits u[2];
+
+	u[0].f = x;
+	u[1].f = y;
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+		return (y);
+	if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[u[0].bits.sign].f);
+
+	return (x > y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmaxl.c b/libm/upstream-freebsd/lib/msun/src/s_fmaxl.c
new file mode 100644
index 0000000..0ac48a9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmaxl.c
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fmaxl(long double x, long double y)
+{
+	union IEEEl2bits u[2];
+
+	u[0].e = x;
+	mask_nbit_l(u[0]);
+	u[1].e = y;
+	mask_nbit_l(u[1]);
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+		return (y);
+	if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[0].bits.sign ? y : x);
+
+	return (x > y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmin.c b/libm/upstream-freebsd/lib/msun/src/s_fmin.c
new file mode 100644
index 0000000..3500c84
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fmin.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double
+fmin(double x, double y)
+{
+	union IEEEd2bits u[2];
+
+	u[0].d = x;
+	u[1].d = y;
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 2047 && (u[0].bits.manh | u[0].bits.manl) != 0)
+		return (y);
+	if (u[1].bits.exp == 2047 && (u[1].bits.manh | u[1].bits.manl) != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[u[1].bits.sign].d);
+
+	return (x < y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fminf.c b/libm/upstream-freebsd/lib/msun/src/s_fminf.c
new file mode 100644
index 0000000..76a5c76
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fminf.c
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+float
+fminf(float x, float y)
+{
+	union IEEEf2bits u[2];
+
+	u[0].f = x;
+	u[1].f = y;
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 255 && u[0].bits.man != 0)
+		return (y);
+	if (u[1].bits.exp == 255 && u[1].bits.man != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[u[1].bits.sign].f);
+
+	return (x < y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fminl.c b/libm/upstream-freebsd/lib/msun/src/s_fminl.c
new file mode 100644
index 0000000..f9d3ebb
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_fminl.c
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+fminl(long double x, long double y)
+{
+	union IEEEl2bits u[2];
+
+	u[0].e = x;
+	mask_nbit_l(u[0]);
+	u[1].e = y;
+	mask_nbit_l(u[1]);
+
+	/* Check for NaNs to avoid raising spurious exceptions. */
+	if (u[0].bits.exp == 32767 && (u[0].bits.manh | u[0].bits.manl) != 0)
+		return (y);
+	if (u[1].bits.exp == 32767 && (u[1].bits.manh | u[1].bits.manl) != 0)
+		return (x);
+
+	/* Handle comparisons of signed zeroes. */
+	if (u[0].bits.sign != u[1].bits.sign)
+		return (u[1].bits.sign ? y : x);
+
+	return (x < y ? x : y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_frexp.c b/libm/upstream-freebsd/lib/msun/src/s_frexp.c
new file mode 100644
index 0000000..318a991
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_frexp.c
@@ -0,0 +1,56 @@
+/* @(#)s_frexp.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * for non-zero x
+ *	x = frexp(arg,&exp);
+ * return a double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ *	arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54 =  1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
+
+double
+frexp(double x, int *eptr)
+{
+	int32_t hx, ix, lx;
+	EXTRACT_WORDS(hx,lx,x);
+	ix = 0x7fffffff&hx;
+	*eptr = 0;
+	if(ix>=0x7ff00000||((ix|lx)==0)) return x;	/* 0,inf,nan */
+	if (ix<0x00100000) {		/* subnormal */
+	    x *= two54;
+	    GET_HIGH_WORD(hx,x);
+	    ix = hx&0x7fffffff;
+	    *eptr = -54;
+	}
+	*eptr += (ix>>20)-1022;
+	hx = (hx&0x800fffff)|0x3fe00000;
+	SET_HIGH_WORD(x,hx);
+	return x;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(frexp, frexpl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_frexpf.c b/libm/upstream-freebsd/lib/msun/src/s_frexpf.c
new file mode 100644
index 0000000..5a7c486
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_frexpf.c
@@ -0,0 +1,43 @@
+/* s_frexpf.c -- float version of s_frexp.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two25 =  3.3554432000e+07; /* 0x4c000000 */
+
+float
+frexpf(float x, int *eptr)
+{
+	int32_t hx,ix;
+	GET_FLOAT_WORD(hx,x);
+	ix = 0x7fffffff&hx;
+	*eptr = 0;
+	if(ix>=0x7f800000||(ix==0)) return x;	/* 0,inf,nan */
+	if (ix<0x00800000) {		/* subnormal */
+	    x *= two25;
+	    GET_FLOAT_WORD(hx,x);
+	    ix = hx&0x7fffffff;
+	    *eptr = -25;
+	}
+	*eptr += (ix>>23)-126;
+	hx = (hx&0x807fffff)|0x3f000000;
+	SET_FLOAT_WORD(x,hx);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_frexpl.c b/libm/upstream-freebsd/lib/msun/src/s_frexpl.c
new file mode 100644
index 0000000..d34f55d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_frexpl.c
@@ -0,0 +1,62 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+long double
+frexpl(long double x, int *ex)
+{
+	union IEEEl2bits u;
+
+	u.e = x;
+	switch (u.bits.exp) {
+	case 0:		/* 0 or subnormal */
+		if ((u.bits.manl | u.bits.manh) == 0) {
+			*ex = 0;
+		} else {
+			u.e *= 0x1.0p514;
+			*ex = u.bits.exp - 0x4200;
+			u.bits.exp = 0x3ffe;
+		}
+		break;
+	case 0x7fff:	/* infinity or NaN; value of *ex is unspecified */
+		break;
+	default:	/* normal */
+		*ex = u.bits.exp - 0x3ffe;
+		u.bits.exp = 0x3ffe;
+		break;
+	}
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ilogb.c b/libm/upstream-freebsd/lib/msun/src/s_ilogb.c
new file mode 100644
index 0000000..a930bc9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ilogb.c
@@ -0,0 +1,48 @@
+/* @(#)s_ilogb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* ilogb(double x)
+ * return the binary exponent of non-zero x
+ * ilogb(0) = FP_ILOGB0
+ * ilogb(NaN) = FP_ILOGBNAN (no signal is raised)
+ * ilogb(inf) = INT_MAX (no signal is raised)
+ */
+
+#include <limits.h>
+
+#include "math.h"
+#include "math_private.h"
+
+	int ilogb(double x)
+{
+	int32_t hx,lx,ix;
+
+	EXTRACT_WORDS(hx,lx,x);
+	hx &= 0x7fffffff;
+	if(hx<0x00100000) {
+	    if((hx|lx)==0)
+		return FP_ILOGB0;
+	    else			/* subnormal x */
+		if(hx==0) {
+		    for (ix = -1043; lx>0; lx<<=1) ix -=1;
+		} else {
+		    for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
+		}
+	    return ix;
+	}
+	else if (hx<0x7ff00000) return (hx>>20)-1023;
+	else if (hx>0x7ff00000 || lx!=0) return FP_ILOGBNAN;
+	else return INT_MAX;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ilogbf.c b/libm/upstream-freebsd/lib/msun/src/s_ilogbf.c
new file mode 100644
index 0000000..93fe295
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ilogbf.c
@@ -0,0 +1,40 @@
+/* s_ilogbf.c -- float version of s_ilogb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <limits.h>
+
+#include "math.h"
+#include "math_private.h"
+
+	int ilogbf(float x)
+{
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+	hx &= 0x7fffffff;
+	if(hx<0x00800000) {
+	    if(hx==0)
+		return FP_ILOGB0;
+	    else			/* subnormal x */
+	        for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
+	    return ix;
+	}
+	else if (hx<0x7f800000) return (hx>>23)-127;
+	else if (hx>0x7f800000) return FP_ILOGBNAN;
+	else return INT_MAX;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ilogbl.c b/libm/upstream-freebsd/lib/msun/src/s_ilogbl.c
new file mode 100644
index 0000000..3211f44
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_ilogbl.c
@@ -0,0 +1,53 @@
+/*
+ * From: @(#)s_ilogb.c 5.1 93/09/24
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+int
+ilogbl(long double x)
+{
+	union IEEEl2bits u;
+	unsigned long m;
+	int b;
+
+	u.e = x;
+	if (u.bits.exp == 0) {
+		if ((u.bits.manl | u.bits.manh) == 0)
+			return (FP_ILOGB0);
+		/* denormalized */
+		if (u.bits.manh == 0) {
+			m = 1lu << (LDBL_MANL_SIZE - 1);
+			for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
+				b++;
+		} else {
+			m = 1lu << (LDBL_MANH_SIZE - 1);
+			for (b = 0; !(u.bits.manh & m); m >>= 1)
+				b++;
+		}
+#ifdef LDBL_IMPLICIT_NBIT
+		b++;
+#endif
+		return (LDBL_MIN_EXP - b - 1);
+	} else if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1)
+		return (u.bits.exp - LDBL_MAX_EXP + 1);
+	else if (u.bits.manl != 0 || u.bits.manh != 0)
+		return (FP_ILOGBNAN);
+	else
+		return (INT_MAX);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llrint.c b/libm/upstream-freebsd/lib/msun/src/s_llrint.c
new file mode 100644
index 0000000..7c959ec
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llrint.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		double
+#define	roundit		rint
+#define dtype		long long
+#define	fn		llrint
+
+#include "s_lrint.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llrintf.c b/libm/upstream-freebsd/lib/msun/src/s_llrintf.c
new file mode 100644
index 0000000..7ec6015
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llrintf.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		float
+#define	roundit		rintf
+#define dtype		long long
+#define	fn		llrintf
+
+#include "s_lrint.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llrintl.c b/libm/upstream-freebsd/lib/msun/src/s_llrintl.c
new file mode 100644
index 0000000..6ef8375
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llrintl.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		long double
+#define	roundit		rintl
+#define dtype		long long
+#define	fn		llrintl
+
+#include "s_lrint.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llround.c b/libm/upstream-freebsd/lib/msun/src/s_llround.c
new file mode 100644
index 0000000..827dfc1
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llround.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		double
+#define	roundit		round
+#define dtype		long long
+#define	DTYPE_MIN	LLONG_MIN
+#define	DTYPE_MAX	LLONG_MAX
+#define	fn		llround
+
+#include "s_lround.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llroundf.c b/libm/upstream-freebsd/lib/msun/src/s_llroundf.c
new file mode 100644
index 0000000..c037a18
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llroundf.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		float
+#define	roundit		roundf
+#define dtype		long long
+#define	DTYPE_MIN	LLONG_MIN
+#define	DTYPE_MAX	LLONG_MAX
+#define	fn		llroundf
+
+#include "s_lround.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_llroundl.c b/libm/upstream-freebsd/lib/msun/src/s_llroundl.c
new file mode 100644
index 0000000..02c44eb
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_llroundl.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		long double
+#define	roundit		roundl
+#define dtype		long long
+#define	DTYPE_MIN	LLONG_MIN
+#define	DTYPE_MAX	LLONG_MAX
+#define	fn		llroundl
+
+#include "s_lround.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_log1p.c b/libm/upstream-freebsd/lib/msun/src/s_log1p.c
new file mode 100644
index 0000000..3cc77bd
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_log1p.c
@@ -0,0 +1,180 @@
+/* @(#)s_log1p.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* double log1p(double x)
+ *
+ * Method :
+ *   1. Argument Reduction: find k and f such that
+ *			1+x = 2^k * (1+f),
+ *	   where  sqrt(2)/2 < 1+f < sqrt(2) .
+ *
+ *      Note. If k=0, then f=x is exact. However, if k!=0, then f
+ *	may not be representable exactly. In that case, a correction
+ *	term is need. Let u=1+x rounded. Let c = (1+x)-u, then
+ *	log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
+ *	and add back the correction term c/u.
+ *	(Note: when x > 2**53, one can simply return log(x))
+ *
+ *   2. Approximation of log1p(f).
+ *	Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
+ *		 = 2s + 2/3 s**3 + 2/5 s**5 + .....,
+ *	     	 = 2s + s*R
+ *      We use a special Reme algorithm on [0,0.1716] to generate
+ * 	a polynomial of degree 14 to approximate R The maximum error
+ *	of this polynomial approximation is bounded by 2**-58.45. In
+ *	other words,
+ *		        2      4      6      8      10      12      14
+ *	    R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s  +Lp6*s  +Lp7*s
+ *  	(the values of Lp1 to Lp7 are listed in the program)
+ *	and
+ *	    |      2          14          |     -58.45
+ *	    | Lp1*s +...+Lp7*s    -  R(z) | <= 2
+ *	    |                             |
+ *	Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
+ *	In order to guarantee error in log below 1ulp, we compute log
+ *	by
+ *		log1p(f) = f - (hfsq - s*(hfsq+R)).
+ *
+ *	3. Finally, log1p(x) = k*ln2 + log1p(f).
+ *		 	     = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
+ *	   Here ln2 is split into two floating point number:
+ *			ln2_hi + ln2_lo,
+ *	   where n*ln2_hi is always exact for |n| < 2000.
+ *
+ * Special cases:
+ *	log1p(x) is NaN with signal if x < -1 (including -INF) ;
+ *	log1p(+INF) is +INF; log1p(-1) is -INF with signal;
+ *	log1p(NaN) is that NaN with no signal.
+ *
+ * Accuracy:
+ *	according to an error analysis, the error is always less than
+ *	1 ulp (unit in the last place).
+ *
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ *
+ * Note: Assuming log() return accurate answer, the following
+ * 	 algorithm can be used to compute log1p(x) to within a few ULP:
+ *
+ *		u = 1+x;
+ *		if(u==1.0) return x ; else
+ *			   return log(u)*(x/(u-1.0));
+ *
+ *	 See HP-15C Advanced Functions Handbook, p.193.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+ln2_hi  =  6.93147180369123816490e-01,	/* 3fe62e42 fee00000 */
+ln2_lo  =  1.90821492927058770002e-10,	/* 3dea39ef 35793c76 */
+two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
+Lp1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
+Lp2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
+Lp3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
+Lp4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
+Lp5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
+Lp6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
+Lp7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
+
+static const double zero = 0.0;
+static volatile double vzero = 0.0;
+
+double
+log1p(double x)
+{
+	double hfsq,f,c,s,z,R,u;
+	int32_t k,hx,hu,ax;
+
+	GET_HIGH_WORD(hx,x);
+	ax = hx&0x7fffffff;
+
+	k = 1;
+	if (hx < 0x3FDA827A) {			/* 1+x < sqrt(2)+ */
+	    if(ax>=0x3ff00000) {		/* x <= -1.0 */
+		if(x==-1.0) return -two54/vzero; /* log1p(-1)=+inf */
+		else return (x-x)/(x-x);	/* log1p(x<-1)=NaN */
+	    }
+	    if(ax<0x3e200000) {			/* |x| < 2**-29 */
+		if(two54+x>zero			/* raise inexact */
+	            &&ax<0x3c900000) 		/* |x| < 2**-54 */
+		    return x;
+		else
+		    return x - x*x*0.5;
+	    }
+	    if(hx>0||hx<=((int32_t)0xbfd2bec4)) {
+		k=0;f=x;hu=1;}		/* sqrt(2)/2- <= 1+x < sqrt(2)+ */
+	}
+	if (hx >= 0x7ff00000) return x+x;
+	if(k!=0) {
+	    if(hx<0x43400000) {
+		STRICT_ASSIGN(double,u,1.0+x);
+		GET_HIGH_WORD(hu,u);
+	        k  = (hu>>20)-1023;
+	        c  = (k>0)? 1.0-(u-x):x-(u-1.0);/* correction term */
+		c /= u;
+	    } else {
+		u  = x;
+		GET_HIGH_WORD(hu,u);
+	        k  = (hu>>20)-1023;
+		c  = 0;
+	    }
+	    hu &= 0x000fffff;
+	    /*
+	     * The approximation to sqrt(2) used in thresholds is not
+	     * critical.  However, the ones used above must give less
+	     * strict bounds than the one here so that the k==0 case is
+	     * never reached from here, since here we have committed to
+	     * using the correction term but don't use it if k==0.
+	     */
+	    if(hu<0x6a09e) {			/* u ~< sqrt(2) */
+	        SET_HIGH_WORD(u,hu|0x3ff00000);	/* normalize u */
+	    } else {
+	        k += 1;
+		SET_HIGH_WORD(u,hu|0x3fe00000);	/* normalize u/2 */
+	        hu = (0x00100000-hu)>>2;
+	    }
+	    f = u-1.0;
+	}
+	hfsq=0.5*f*f;
+	if(hu==0) {	/* |f| < 2**-20 */
+	    if(f==zero) {
+		if(k==0) {
+		    return zero;
+		} else {
+		    c += k*ln2_lo;
+		    return k*ln2_hi+c;
+		}
+	    }
+	    R = hfsq*(1.0-0.66666666666666666*f);
+	    if(k==0) return f-R; else
+	    	     return k*ln2_hi-((R-(k*ln2_lo+c))-f);
+	}
+ 	s = f/(2.0+f);
+	z = s*s;
+	R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
+	if(k==0) return f-(hfsq-s*(hfsq+R)); else
+		 return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f);
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(log1p, log1pl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_log1pf.c b/libm/upstream-freebsd/lib/msun/src/s_log1pf.c
new file mode 100644
index 0000000..df04c67
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_log1pf.c
@@ -0,0 +1,115 @@
+/* s_log1pf.c -- float version of s_log1p.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+ln2_hi =   6.9313812256e-01,	/* 0x3f317180 */
+ln2_lo =   9.0580006145e-06,	/* 0x3717f7d1 */
+two25 =    3.355443200e+07,	/* 0x4c000000 */
+Lp1 = 6.6666668653e-01,	/* 3F2AAAAB */
+Lp2 = 4.0000000596e-01,	/* 3ECCCCCD */
+Lp3 = 2.8571429849e-01, /* 3E924925 */
+Lp4 = 2.2222198546e-01, /* 3E638E29 */
+Lp5 = 1.8183572590e-01, /* 3E3A3325 */
+Lp6 = 1.5313838422e-01, /* 3E1CD04F */
+Lp7 = 1.4798198640e-01; /* 3E178897 */
+
+static const float zero = 0.0;
+static volatile float vzero = 0.0;
+
+float
+log1pf(float x)
+{
+	float hfsq,f,c,s,z,R,u;
+	int32_t k,hx,hu,ax;
+
+	GET_FLOAT_WORD(hx,x);
+	ax = hx&0x7fffffff;
+
+	k = 1;
+	if (hx < 0x3ed413d0) {			/* 1+x < sqrt(2)+  */
+	    if(ax>=0x3f800000) {		/* x <= -1.0 */
+		if(x==(float)-1.0) return -two25/vzero; /* log1p(-1)=+inf */
+		else return (x-x)/(x-x);	/* log1p(x<-1)=NaN */
+	    }
+	    if(ax<0x38000000) {			/* |x| < 2**-15 */
+		if(two25+x>zero			/* raise inexact */
+	            &&ax<0x33800000) 		/* |x| < 2**-24 */
+		    return x;
+		else
+		    return x - x*x*(float)0.5;
+	    }
+	    if(hx>0||hx<=((int32_t)0xbe95f619)) {
+		k=0;f=x;hu=1;}		/* sqrt(2)/2- <= 1+x < sqrt(2)+ */
+	}
+	if (hx >= 0x7f800000) return x+x;
+	if(k!=0) {
+	    if(hx<0x5a000000) {
+		STRICT_ASSIGN(float,u,(float)1.0+x);
+		GET_FLOAT_WORD(hu,u);
+	        k  = (hu>>23)-127;
+		/* correction term */
+	        c  = (k>0)? (float)1.0-(u-x):x-(u-(float)1.0);
+		c /= u;
+	    } else {
+		u  = x;
+		GET_FLOAT_WORD(hu,u);
+	        k  = (hu>>23)-127;
+		c  = 0;
+	    }
+	    hu &= 0x007fffff;
+	    /*
+	     * The approximation to sqrt(2) used in thresholds is not
+	     * critical.  However, the ones used above must give less
+	     * strict bounds than the one here so that the k==0 case is
+	     * never reached from here, since here we have committed to
+	     * using the correction term but don't use it if k==0.
+	     */
+	    if(hu<0x3504f4) {			/* u < sqrt(2) */
+	        SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */
+	    } else {
+	        k += 1;
+		SET_FLOAT_WORD(u,hu|0x3f000000);	/* normalize u/2 */
+	        hu = (0x00800000-hu)>>2;
+	    }
+	    f = u-(float)1.0;
+	}
+	hfsq=(float)0.5*f*f;
+	if(hu==0) {	/* |f| < 2**-20 */
+	    if(f==zero) {
+		if(k==0) {
+		    return zero;
+		} else {
+		    c += k*ln2_lo;
+		    return k*ln2_hi+c;
+		}
+	    }
+	    R = hfsq*((float)1.0-(float)0.66666666666666666*f);
+	    if(k==0) return f-R; else
+	    	     return k*ln2_hi-((R-(k*ln2_lo+c))-f);
+	}
+ 	s = f/((float)2.0+f);
+	z = s*s;
+	R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
+	if(k==0) return f-(hfsq-s*(hfsq+R)); else
+		 return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_logb.c b/libm/upstream-freebsd/lib/msun/src/s_logb.c
new file mode 100644
index 0000000..a47e354
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_logb.c
@@ -0,0 +1,49 @@
+/* @(#)s_logb.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * double logb(x)
+ * IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
+ * Use ilogb instead.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54 = 1.80143985094819840000e+16;	/* 43500000 00000000 */
+
+double
+logb(double x)
+{
+	int32_t lx,ix;
+	EXTRACT_WORDS(ix,lx,x);
+	ix &= 0x7fffffff;			/* high |x| */
+	if((ix|lx)==0) return -1.0/fabs(x);
+	if(ix>=0x7ff00000) return x*x;
+	if(ix<0x00100000) {
+		x *= two54;		 /* convert subnormal x to normal */
+		GET_HIGH_WORD(ix,x);
+		ix &= 0x7fffffff;
+		return (double) ((ix>>20)-1023-54);
+	} else
+		return (double) ((ix>>20)-1023);
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(logb, logbl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_logbf.c b/libm/upstream-freebsd/lib/msun/src/s_logbf.c
new file mode 100644
index 0000000..3ab190d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_logbf.c
@@ -0,0 +1,40 @@
+/* s_logbf.c -- float version of s_logb.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two25 = 3.355443200e+07;		/* 0x4c000000 */
+
+float
+logbf(float x)
+{
+	int32_t ix;
+	GET_FLOAT_WORD(ix,x);
+	ix &= 0x7fffffff;			/* high |x| */
+	if(ix==0) return (float)-1.0/fabsf(x);
+	if(ix>=0x7f800000) return x*x;
+	if(ix<0x00800000) {
+		x *= two25;		 /* convert subnormal x to normal */
+		GET_FLOAT_WORD(ix,x);
+		ix &= 0x7fffffff;
+		return (float) ((ix>>23)-127-25);
+	} else
+		return (float) ((ix>>23)-127);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_logbl.c b/libm/upstream-freebsd/lib/msun/src/s_logbl.c
new file mode 100644
index 0000000..7e88e36
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_logbl.c
@@ -0,0 +1,55 @@
+/*
+ * From: @(#)s_ilogb.c 5.1 93/09/24
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+long double
+logbl(long double x)
+{
+	union IEEEl2bits u;
+	unsigned long m;
+	int b;
+
+	u.e = x;
+	if (u.bits.exp == 0) {
+		if ((u.bits.manl | u.bits.manh) == 0) {	/* x == 0 */
+			u.bits.sign = 1;
+			return (1.0L / u.e);
+		}
+		/* denormalized */
+		if (u.bits.manh == 0) {
+			m = 1lu << (LDBL_MANL_SIZE - 1);
+			for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
+				b++;
+		} else {
+			m = 1lu << (LDBL_MANH_SIZE - 1);
+			for (b = 0; !(u.bits.manh & m); m >>= 1)
+				b++;
+		}
+#ifdef LDBL_IMPLICIT_NBIT
+		b++;
+#endif
+		return ((long double)(LDBL_MIN_EXP - b - 1));
+	}
+	if (u.bits.exp < (LDBL_MAX_EXP << 1) - 1)	/* normal */
+		return ((long double)(u.bits.exp - LDBL_MAX_EXP + 1));
+	else						/* +/- inf or nan */
+		return (x * x);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lrint.c b/libm/upstream-freebsd/lib/msun/src/s_lrint.c
new file mode 100644
index 0000000..27ff5ff
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lrint.c
@@ -0,0 +1,58 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <fenv.h>
+#include <math.h>
+
+#ifndef type
+__FBSDID("$FreeBSD$");
+#define type		double
+#define	roundit		rint
+#define dtype		long
+#define	fn		lrint
+#endif
+
+/*
+ * C99 says we should not raise a spurious inexact exception when an
+ * invalid exception is raised.  Unfortunately, the set of inputs
+ * that overflows depends on the rounding mode when 'dtype' has more
+ * significant bits than 'type'.  Hence, we bend over backwards for the
+ * sake of correctness; an MD implementation could be more efficient.
+ */
+dtype
+fn(type x)
+{
+	fenv_t env;
+	dtype d;
+
+	feholdexcept(&env);
+	d = (dtype)roundit(x);
+	if (fetestexcept(FE_INVALID))
+		feclearexcept(FE_INEXACT);
+	feupdateenv(&env);
+	return (d);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lrintf.c b/libm/upstream-freebsd/lib/msun/src/s_lrintf.c
new file mode 100644
index 0000000..a757ded
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lrintf.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		float
+#define	roundit		rintf
+#define dtype		long
+#define	fn		lrintf
+
+#include "s_lrint.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lrintl.c b/libm/upstream-freebsd/lib/msun/src/s_lrintl.c
new file mode 100644
index 0000000..497b442
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lrintl.c
@@ -0,0 +1,9 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		long double
+#define	roundit		rintl
+#define dtype		long
+#define	fn		lrintl
+
+#include "s_lrint.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lround.c b/libm/upstream-freebsd/lib/msun/src/s_lround.c
new file mode 100644
index 0000000..3cff489
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lround.c
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/limits.h>
+#include <fenv.h>
+#include <math.h>
+
+#ifndef type
+__FBSDID("$FreeBSD$");
+#define type		double
+#define	roundit		round
+#define dtype		long
+#define	DTYPE_MIN	LONG_MIN
+#define	DTYPE_MAX	LONG_MAX
+#define	fn		lround
+#endif
+
+/*
+ * If type has more precision than dtype, the endpoints dtype_(min|max) are
+ * of the form xxx.5; they are "out of range" because lround() rounds away
+ * from 0.  On the other hand, if type has less precision than dtype, then
+ * all values that are out of range are integral, so we might as well assume
+ * that everything is in range.  At compile time, INRANGE(x) should reduce to
+ * two floating-point comparisons in the former case, or TRUE otherwise.
+ */
+static const type dtype_min = DTYPE_MIN - 0.5;
+static const type dtype_max = DTYPE_MAX + 0.5;
+#define	INRANGE(x)	(dtype_max - DTYPE_MAX != 0.5 || \
+			 ((x) > dtype_min && (x) < dtype_max))
+
+dtype
+fn(type x)
+{
+
+	if (INRANGE(x)) {
+		x = roundit(x);
+		return ((dtype)x);
+	} else {
+		feraiseexcept(FE_INVALID);
+		return (DTYPE_MAX);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lroundf.c b/libm/upstream-freebsd/lib/msun/src/s_lroundf.c
new file mode 100644
index 0000000..e24fe7f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lroundf.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		float
+#define	roundit		roundf
+#define dtype		long
+#define	DTYPE_MIN	LONG_MIN
+#define	DTYPE_MAX	LONG_MAX
+#define	fn		lroundf
+
+#include "s_lround.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_lroundl.c b/libm/upstream-freebsd/lib/msun/src/s_lroundl.c
new file mode 100644
index 0000000..e410827
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_lroundl.c
@@ -0,0 +1,11 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define type		long double
+#define	roundit		roundl
+#define dtype		long
+#define	DTYPE_MIN	LONG_MIN
+#define	DTYPE_MAX	LONG_MAX
+#define	fn		lroundl
+
+#include "s_lround.c"
diff --git a/libm/upstream-freebsd/lib/msun/src/s_modf.c b/libm/upstream-freebsd/lib/msun/src/s_modf.c
new file mode 100644
index 0000000..ab13191
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_modf.c
@@ -0,0 +1,79 @@
+/* @(#)s_modf.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+/*
+ * modf(double x, double *iptr)
+ * return fraction part of x, and return x's integral part in *iptr.
+ * Method:
+ *	Bit twiddling.
+ *
+ * Exception:
+ *	No exception.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const double one = 1.0;
+
+double
+modf(double x, double *iptr)
+{
+	int32_t i0,i1,j0;
+	u_int32_t i;
+	EXTRACT_WORDS(i0,i1,x);
+	j0 = ((i0>>20)&0x7ff)-0x3ff;	/* exponent of x */
+	if(j0<20) {			/* integer part in high x */
+	    if(j0<0) {			/* |x|<1 */
+	        INSERT_WORDS(*iptr,i0&0x80000000,0);	/* *iptr = +-0 */
+		return x;
+	    } else {
+		i = (0x000fffff)>>j0;
+		if(((i0&i)|i1)==0) {		/* x is integral */
+		    u_int32_t high;
+		    *iptr = x;
+		    GET_HIGH_WORD(high,x);
+		    INSERT_WORDS(x,high&0x80000000,0);	/* return +-0 */
+		    return x;
+		} else {
+		    INSERT_WORDS(*iptr,i0&(~i),0);
+		    return x - *iptr;
+		}
+	    }
+	} else if (j0>51) {		/* no fraction part */
+	    u_int32_t high;
+	    if (j0 == 0x400) {		/* inf/NaN */
+		*iptr = x;
+		return 0.0 / x;
+	    }
+	    *iptr = x*one;
+	    GET_HIGH_WORD(high,x);
+	    INSERT_WORDS(x,high&0x80000000,0);	/* return +-0 */
+	    return x;
+	} else {			/* fraction part in low x */
+	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
+	    if((i1&i)==0) { 		/* x is integral */
+	        u_int32_t high;
+		*iptr = x;
+		GET_HIGH_WORD(high,x);
+		INSERT_WORDS(x,high&0x80000000,0);	/* return +-0 */
+		return x;
+	    } else {
+	        INSERT_WORDS(*iptr,i0,i1&(~i));
+		return x - *iptr;
+	    }
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_modff.c b/libm/upstream-freebsd/lib/msun/src/s_modff.c
new file mode 100644
index 0000000..062259c
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_modff.c
@@ -0,0 +1,57 @@
+/* s_modff.c -- float version of s_modf.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float one = 1.0;
+
+float
+modff(float x, float *iptr)
+{
+	int32_t i0,j0;
+	u_int32_t i;
+	GET_FLOAT_WORD(i0,x);
+	j0 = ((i0>>23)&0xff)-0x7f;	/* exponent of x */
+	if(j0<23) {			/* integer part in x */
+	    if(j0<0) {			/* |x|<1 */
+	        SET_FLOAT_WORD(*iptr,i0&0x80000000);	/* *iptr = +-0 */
+		return x;
+	    } else {
+		i = (0x007fffff)>>j0;
+		if((i0&i)==0) {			/* x is integral */
+		    u_int32_t ix;
+		    *iptr = x;
+		    GET_FLOAT_WORD(ix,x);
+		    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
+		    return x;
+		} else {
+		    SET_FLOAT_WORD(*iptr,i0&(~i));
+		    return x - *iptr;
+		}
+	    }
+	} else {			/* no fraction part */
+	    u_int32_t ix;
+	    *iptr = x*one;
+	    if (x != x)			/* NaN */
+		return x;
+	    GET_FLOAT_WORD(ix,x);
+	    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
+	    return x;
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_modfl.c b/libm/upstream-freebsd/lib/msun/src/s_modfl.c
new file mode 100644
index 0000000..3dcdf86
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_modfl.c
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2007 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Derived from s_modf.c, which has the following Copyright:
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * $FreeBSD$
+ */
+
+#include <float.h>
+#include <math.h>
+#include <sys/types.h>
+
+#include "fpmath.h"
+
+#if LDBL_MANL_SIZE > 32
+#define	MASK	((uint64_t)-1)
+#else
+#define	MASK	((uint32_t)-1)
+#endif
+/* Return the last n bits of a word, representing the fractional part. */
+#define	GETFRAC(bits, n)	((bits) & ~(MASK << (n)))
+/* The number of fraction bits in manh, not counting the integer bit */
+#define	HIBITS	(LDBL_MANT_DIG - LDBL_MANL_SIZE)
+
+static const long double zero[] = { 0.0L, -0.0L };
+
+long double
+modfl(long double x, long double *iptr)
+{
+	union IEEEl2bits ux;
+	int e;
+
+	ux.e = x;
+	e = ux.bits.exp - LDBL_MAX_EXP + 1;
+	if (e < HIBITS) {			/* Integer part is in manh. */
+		if (e < 0) {			/* |x|<1 */
+			*iptr = zero[ux.bits.sign];
+			return (x);
+		} else {
+			if ((GETFRAC(ux.bits.manh, HIBITS - 1 - e) |
+			     ux.bits.manl) == 0) {	/* X is an integer. */
+				*iptr = x;
+				return (zero[ux.bits.sign]);
+			} else {
+				/* Clear all but the top e+1 bits. */
+				ux.bits.manh >>= HIBITS - 1 - e;
+				ux.bits.manh <<= HIBITS - 1 - e;
+				ux.bits.manl = 0;
+				*iptr = ux.e;
+				return (x - ux.e);
+			}
+		}
+	} else if (e >= LDBL_MANT_DIG - 1) {	/* x has no fraction part. */
+		*iptr = x;
+		if (x != x)			/* Handle NaNs. */
+			return (x);
+		return (zero[ux.bits.sign]);
+	} else {				/* Fraction part is in manl. */
+		if (GETFRAC(ux.bits.manl, LDBL_MANT_DIG - 1 - e) == 0) {
+			/* x is integral. */
+			*iptr = x;
+			return (zero[ux.bits.sign]);
+		} else {
+			/* Clear all but the top e+1 bits. */
+			ux.bits.manl >>= LDBL_MANT_DIG - 1 - e;
+			ux.bits.manl <<= LDBL_MANT_DIG - 1 - e;
+			*iptr = ux.e;
+			return (x - ux.e);
+		}
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nan.c b/libm/upstream-freebsd/lib/msun/src/s_nan.c
new file mode 100644
index 0000000..890f471
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nan.c
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2007 David Schultz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/endian.h>
+#include <ctype.h>
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+#include <strings.h>
+
+#include "math_private.h"
+
+/*
+ * Scan a string of hexadecimal digits (the format nan(3) expects) and
+ * make a bit array (using the local endianness). We stop when we
+ * encounter an invalid character, NUL, etc.  If we overflow, we do
+ * the same as gcc's __builtin_nan(), namely, discard the high order bits.
+ *
+ * The format this routine accepts needs to be compatible with what is used
+ * in contrib/gdtoa/hexnan.c (for strtod/scanf) and what is used in
+ * __builtin_nan(). In fact, we're only 100% compatible for strings we
+ * consider valid, so we might be violating the C standard. But it's
+ * impossible to use nan(3) portably anyway, so this seems good enough.
+ */
+void
+_scan_nan(uint32_t *words, int num_words, const char *s)
+{
+	int si;		/* index into s */
+	int bitpos;	/* index into words (in bits) */
+
+	bzero(words, num_words * sizeof(uint32_t));
+
+	/* Allow a leading '0x'. (It's expected, but redundant.) */
+	if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
+		s += 2;
+
+	/* Scan forwards in the string, looking for the end of the sequence. */
+	for (si = 0; isxdigit(s[si]); si++)
+		;
+
+	/* Scan backwards, filling in the bits in words[] as we go. */
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+	for (bitpos = 0; bitpos < 32 * num_words; bitpos += 4) {
+#else
+	for (bitpos = 32 * num_words - 4; bitpos >= 0; bitpos -= 4) {
+#endif
+		if (--si < 0)
+			break;
+		words[bitpos / 32] |= digittoint(s[si]) << (bitpos % 32);
+	}
+}
+
+double
+nan(const char *s)
+{
+	union {
+		double d;
+		uint32_t bits[2];
+	} u;
+
+	_scan_nan(u.bits, 2, s);
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+	u.bits[1] |= 0x7ff80000;
+#else
+	u.bits[0] |= 0x7ff80000;
+#endif
+	return (u.d);
+}
+
+float
+nanf(const char *s)
+{
+	union {
+		float f;
+		uint32_t bits[1];
+	} u;
+
+	_scan_nan(u.bits, 1, s);
+	u.bits[0] |= 0x7fc00000;
+	return (u.f);
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(nan, nanl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nearbyint.c b/libm/upstream-freebsd/lib/msun/src/s_nearbyint.c
new file mode 100644
index 0000000..063f8d7
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nearbyint.c
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <fenv.h>
+#include <math.h>
+
+/*
+ * We save and restore the floating-point environment to avoid raising
+ * an inexact exception.  We can get away with using fesetenv()
+ * instead of feclearexcept()/feupdateenv() to restore the environment
+ * because the only exception defined for rint() is overflow, and
+ * rounding can't overflow as long as emax >= p.
+ *
+ * The volatile keyword is needed below because clang incorrectly assumes
+ * that rint won't raise any floating-point exceptions. Declaring ret volatile
+ * is sufficient to trick the compiler into doing the right thing.
+ */
+#define	DECL(type, fn, rint)	\
+type				\
+fn(type x)			\
+{				\
+	volatile type ret;	\
+	fenv_t env;		\
+				\
+	fegetenv(&env);		\
+	ret = rint(x);		\
+	fesetenv(&env);		\
+	return (ret);		\
+}
+
+DECL(double, nearbyint, rint)
+DECL(float, nearbyintf, rintf)
+DECL(long double, nearbyintl, rintl)
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nextafter.c b/libm/upstream-freebsd/lib/msun/src/s_nextafter.c
new file mode 100644
index 0000000..52dd21c
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nextafter.c
@@ -0,0 +1,83 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* IEEE functions
+ *	nextafter(x,y)
+ *	return the next machine floating-point number of x in the
+ *	direction toward y.
+ *   Special cases:
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+double
+nextafter(double x, double y)
+{
+	volatile double t;
+	int32_t hx,hy,ix,iy;
+	u_int32_t lx,ly;
+
+	EXTRACT_WORDS(hx,lx,x);
+	EXTRACT_WORDS(hy,ly,y);
+	ix = hx&0x7fffffff;		/* |x| */
+	iy = hy&0x7fffffff;		/* |y| */
+
+	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||   /* x is nan */
+	   ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))     /* y is nan */
+	   return x+y;
+	if(x==y) return y;		/* x=y, return y */
+	if((ix|lx)==0) {			/* x == 0 */
+	    INSERT_WORDS(x,hy&0x80000000,1);	/* return +-minsubnormal */
+	    t = x*x;
+	    if(t==x) return t; else return x;	/* raise underflow flag */
+	}
+	if(hx>=0) {				/* x > 0 */
+	    if(hx>hy||((hx==hy)&&(lx>ly))) {	/* x > y, x -= ulp */
+		if(lx==0) hx -= 1;
+		lx -= 1;
+	    } else {				/* x < y, x += ulp */
+		lx += 1;
+		if(lx==0) hx += 1;
+	    }
+	} else {				/* x < 0 */
+	    if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */
+		if(lx==0) hx -= 1;
+		lx -= 1;
+	    } else {				/* x > y, x += ulp */
+		lx += 1;
+		if(lx==0) hx += 1;
+	    }
+	}
+	hy = hx&0x7ff00000;
+	if(hy>=0x7ff00000) return x+x;	/* overflow  */
+	if(hy<0x00100000) {		/* underflow */
+	    t = x*x;
+	    if(t!=x) {		/* raise underflow flag */
+	        INSERT_WORDS(y,hx,lx);
+		return y;
+	    }
+	}
+	INSERT_WORDS(x,hx,lx);
+	return x;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(nextafter, nexttoward);
+__weak_reference(nextafter, nexttowardl);
+__weak_reference(nextafter, nextafterl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nextafterf.c b/libm/upstream-freebsd/lib/msun/src/s_nextafterf.c
new file mode 100644
index 0000000..96e21ef
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nextafterf.c
@@ -0,0 +1,66 @@
+/* s_nextafterf.c -- float version of s_nextafter.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+float
+nextafterf(float x, float y)
+{
+	volatile float t;
+	int32_t hx,hy,ix,iy;
+
+	GET_FLOAT_WORD(hx,x);
+	GET_FLOAT_WORD(hy,y);
+	ix = hx&0x7fffffff;		/* |x| */
+	iy = hy&0x7fffffff;		/* |y| */
+
+	if((ix>0x7f800000) ||   /* x is nan */
+	   (iy>0x7f800000))     /* y is nan */
+	   return x+y;
+	if(x==y) return y;		/* x=y, return y */
+	if(ix==0) {				/* x == 0 */
+	    SET_FLOAT_WORD(x,(hy&0x80000000)|1);/* return +-minsubnormal */
+	    t = x*x;
+	    if(t==x) return t; else return x;	/* raise underflow flag */
+	}
+	if(hx>=0) {				/* x > 0 */
+	    if(hx>hy) {				/* x > y, x -= ulp */
+		hx -= 1;
+	    } else {				/* x < y, x += ulp */
+		hx += 1;
+	    }
+	} else {				/* x < 0 */
+	    if(hy>=0||hx>hy){			/* x < y, x -= ulp */
+		hx -= 1;
+	    } else {				/* x > y, x += ulp */
+		hx += 1;
+	    }
+	}
+	hy = hx&0x7f800000;
+	if(hy>=0x7f800000) return x+x;	/* overflow  */
+	if(hy<0x00800000) {		/* underflow */
+	    t = x*x;
+	    if(t!=x) {		/* raise underflow flag */
+	        SET_FLOAT_WORD(y,hx);
+		return y;
+	    }
+	}
+	SET_FLOAT_WORD(x,hx);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nextafterl.c b/libm/upstream-freebsd/lib/msun/src/s_nextafterl.c
new file mode 100644
index 0000000..9c61a43
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nextafterl.c
@@ -0,0 +1,80 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* IEEE functions
+ *	nextafter(x,y)
+ *	return the next machine floating-point number of x in the
+ *	direction toward y.
+ *   Special cases:
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+long double
+nextafterl(long double x, long double y)
+{
+	volatile long double t;
+	union IEEEl2bits ux, uy;
+
+	ux.e = x;
+	uy.e = y;
+
+	if ((ux.bits.exp == 0x7fff &&
+	     ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
+	    (uy.bits.exp == 0x7fff &&
+	     ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return y;		/* x=y, return y */
+	if(x==0.0) {
+	    ux.bits.manh = 0;			/* return +-minsubnormal */
+	    ux.bits.manl = 1;
+	    ux.bits.sign = uy.bits.sign;
+	    t = ux.e*ux.e;
+	    if(t==ux.e) return t; else return ux.e; /* raise underflow flag */
+	}
+	if(x>0.0 ^ x<y) {			/* x -= ulp */
+	    if(ux.bits.manl==0) {
+		if ((ux.bits.manh&~LDBL_NBIT)==0)
+		    ux.bits.exp -= 1;
+		ux.bits.manh = (ux.bits.manh - 1) | (ux.bits.manh & LDBL_NBIT);
+	    }
+	    ux.bits.manl -= 1;
+	} else {				/* x += ulp */
+	    ux.bits.manl += 1;
+	    if(ux.bits.manl==0) {
+		ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
+		if ((ux.bits.manh&~LDBL_NBIT)==0)
+		    ux.bits.exp += 1;
+	    }
+	}
+	if(ux.bits.exp==0x7fff) return x+x;	/* overflow  */
+	if(ux.bits.exp==0) {			/* underflow */
+	    mask_nbit_l(ux);
+	    t = ux.e * ux.e;
+	    if(t!=ux.e)			/* raise underflow flag */
+		return ux.e;
+	}
+	return ux.e;
+}
+
+__strong_reference(nextafterl, nexttowardl);
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nexttoward.c b/libm/upstream-freebsd/lib/msun/src/s_nexttoward.c
new file mode 100644
index 0000000..b2a50d3
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nexttoward.c
@@ -0,0 +1,72 @@
+/* @(#)s_nextafter.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * We assume that a long double has a 15-bit exponent.  On systems
+ * where long double is the same as double, nexttoward() is an alias
+ * for nextafter(), so we don't use this routine.
+ */
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+double
+nexttoward(double x, long double y)
+{
+	union IEEEl2bits uy;
+	volatile double t;
+	int32_t hx,ix;
+	u_int32_t lx;
+
+	EXTRACT_WORDS(hx,lx,x);
+	ix = hx&0x7fffffff;		/* |x| */
+	uy.e = y;
+
+	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||
+	    (uy.bits.exp == 0x7fff &&
+	     ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return (double)y;		/* x=y, return y */
+	if(x==0.0) {
+	    INSERT_WORDS(x,uy.bits.sign<<31,1);	/* return +-minsubnormal */
+	    t = x*x;
+	    if(t==x) return t; else return x;	/* raise underflow flag */
+	}
+	if(hx>0.0 ^ x < y) {			/* x -= ulp */
+	    if(lx==0) hx -= 1;
+	    lx -= 1;
+	} else {				/* x += ulp */
+	    lx += 1;
+	    if(lx==0) hx += 1;
+	}
+	ix = hx&0x7ff00000;
+	if(ix>=0x7ff00000) return x+x;	/* overflow  */
+	if(ix<0x00100000) {		/* underflow */
+	    t = x*x;
+	    if(t!=x) {		/* raise underflow flag */
+	        INSERT_WORDS(x,hx,lx);
+		return x;
+	    }
+	}
+	INSERT_WORDS(x,hx,lx);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_nexttowardf.c b/libm/upstream-freebsd/lib/msun/src/s_nexttowardf.c
new file mode 100644
index 0000000..9ddfff9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_nexttowardf.c
@@ -0,0 +1,59 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define	LDBL_INFNAN_EXP	(LDBL_MAX_EXP * 2 - 1)
+
+float
+nexttowardf(float x, long double y)
+{
+	union IEEEl2bits uy;
+	volatile float t;
+	int32_t hx,ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx&0x7fffffff;		/* |x| */
+	uy.e = y;
+
+	if((ix>0x7f800000) ||
+	   (uy.bits.exp == LDBL_INFNAN_EXP &&
+	    ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
+	   return x+y;	/* x or y is nan */
+	if(x==y) return (float)y;		/* x=y, return y */
+	if(ix==0) {				/* x == 0 */
+	    SET_FLOAT_WORD(x,(uy.bits.sign<<31)|1);/* return +-minsubnormal */
+	    t = x*x;
+	    if(t==x) return t; else return x;	/* raise underflow flag */
+	}
+	if(hx>=0 ^ x < y)			/* x -= ulp */
+	    hx -= 1;
+	else					/* x += ulp */
+	    hx += 1;
+	ix = hx&0x7f800000;
+	if(ix>=0x7f800000) return x+x;	/* overflow  */
+	if(ix<0x00800000) {		/* underflow */
+	    t = x*x;
+	    if(t!=x) {		/* raise underflow flag */
+	        SET_FLOAT_WORD(x,hx);
+		return x;
+	    }
+	}
+	SET_FLOAT_WORD(x,hx);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_remquo.c b/libm/upstream-freebsd/lib/msun/src/s_remquo.c
new file mode 100644
index 0000000..d811c69
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_remquo.c
@@ -0,0 +1,159 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double Zero[] = {0.0, -0.0,};
+
+/*
+ * Return the IEEE remainder and set *quo to the last n bits of the
+ * quotient, rounded to the nearest integer.  We choose n=31 because
+ * we wind up computing all the integer bits of the quotient anyway as
+ * a side-effect of computing the remainder by the shift and subtract
+ * method.  In practice, this is far more bits than are needed to use
+ * remquo in reduction algorithms.
+ */
+double
+remquo(double x, double y, int *quo)
+{
+	int32_t n,hx,hy,hz,ix,iy,sx,i;
+	u_int32_t lx,ly,lz,q,sxy;
+
+	EXTRACT_WORDS(hx,lx,x);
+	EXTRACT_WORDS(hy,ly,y);
+	sxy = (hx ^ hy) & 0x80000000;
+	sx = hx&0x80000000;		/* sign of x */
+	hx ^=sx;		/* |x| */
+	hy &= 0x7fffffff;	/* |y| */
+
+    /* purge off exception values */
+	if((hy|ly)==0||(hx>=0x7ff00000)||	/* y=0,or x not finite */
+	  ((hy|((ly|-ly)>>31))>0x7ff00000))	/* or y is NaN */
+	    return (x*y)/(x*y);
+	if(hx<=hy) {
+	    if((hx<hy)||(lx<ly)) {
+		q = 0;
+		goto fixup;	/* |x|<|y| return x or x-y */
+	    }
+	    if(lx==ly) {
+		*quo = (sxy ? -1 : 1);
+		return Zero[(u_int32_t)sx>>31];	/* |x|=|y| return x*0*/
+	    }
+	}
+
+    /* determine ix = ilogb(x) */
+	if(hx<0x00100000) {	/* subnormal x */
+	    if(hx==0) {
+		for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
+	    } else {
+		for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
+	    }
+	} else ix = (hx>>20)-1023;
+
+    /* determine iy = ilogb(y) */
+	if(hy<0x00100000) {	/* subnormal y */
+	    if(hy==0) {
+		for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
+	    } else {
+		for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
+	    }
+	} else iy = (hy>>20)-1023;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	if(ix >= -1022) 
+	    hx = 0x00100000|(0x000fffff&hx);
+	else {		/* subnormal x, shift x to normal */
+	    n = -1022-ix;
+	    if(n<=31) {
+	        hx = (hx<<n)|(lx>>(32-n));
+	        lx <<= n;
+	    } else {
+		hx = lx<<(n-32);
+		lx = 0;
+	    }
+	}
+	if(iy >= -1022) 
+	    hy = 0x00100000|(0x000fffff&hy);
+	else {		/* subnormal y, shift y to normal */
+	    n = -1022-iy;
+	    if(n<=31) {
+	        hy = (hy<<n)|(ly>>(32-n));
+	        ly <<= n;
+	    } else {
+		hy = ly<<(n-32);
+		ly = 0;
+	    }
+	}
+
+    /* fix point fmod */
+	n = ix - iy;
+	q = 0;
+	while(n--) {
+	    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	    if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
+	    else {hx = hz+hz+(lz>>31); lx = lz+lz; q++;}
+	    q <<= 1;
+	}
+	hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	if(hz>=0) {hx=hz;lx=lz;q++;}
+
+    /* convert back to floating value and restore the sign */
+	if((hx|lx)==0) {			/* return sign(x)*0 */
+	    q &= 0x7fffffff;
+	    *quo = (sxy ? -q : q);
+	    return Zero[(u_int32_t)sx>>31];
+	}
+	while(hx<0x00100000) {		/* normalize x */
+	    hx = hx+hx+(lx>>31); lx = lx+lx;
+	    iy -= 1;
+	}
+	if(iy>= -1022) {	/* normalize output */
+	    hx = ((hx-0x00100000)|((iy+1023)<<20));
+	} else {		/* subnormal output */
+	    n = -1022 - iy;
+	    if(n<=20) {
+		lx = (lx>>n)|((u_int32_t)hx<<(32-n));
+		hx >>= n;
+	    } else if (n<=31) {
+		lx = (hx<<(32-n))|(lx>>n); hx = 0;
+	    } else {
+		lx = hx>>(n-32); hx = 0;
+	    }
+	}
+fixup:
+	INSERT_WORDS(x,hx,lx);
+	y = fabs(y);
+	if (y < 0x1p-1021) {
+	    if (x+x>y || (x+x==y && (q & 1))) {
+		q++;
+		x-=y;
+	    }
+	} else if (x>0.5*y || (x==0.5*y && (q & 1))) {
+	    q++;
+	    x-=y;
+	}
+	GET_HIGH_WORD(hx,x);
+	SET_HIGH_WORD(x,hx^sx);
+	q &= 0x7fffffff;
+	*quo = (sxy ? -q : q);
+	return x;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(remquo, remquol);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_remquof.c b/libm/upstream-freebsd/lib/msun/src/s_remquof.c
new file mode 100644
index 0000000..f7b4c00
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_remquof.c
@@ -0,0 +1,122 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const float Zero[] = {0.0, -0.0,};
+
+/*
+ * Return the IEEE remainder and set *quo to the last n bits of the
+ * quotient, rounded to the nearest integer.  We choose n=31 because
+ * we wind up computing all the integer bits of the quotient anyway as
+ * a side-effect of computing the remainder by the shift and subtract
+ * method.  In practice, this is far more bits than are needed to use
+ * remquo in reduction algorithms.
+ */
+float
+remquof(float x, float y, int *quo)
+{
+	int32_t n,hx,hy,hz,ix,iy,sx,i;
+	u_int32_t q,sxy;
+
+	GET_FLOAT_WORD(hx,x);
+	GET_FLOAT_WORD(hy,y);
+	sxy = (hx ^ hy) & 0x80000000;
+	sx = hx&0x80000000;		/* sign of x */
+	hx ^=sx;		/* |x| */
+	hy &= 0x7fffffff;	/* |y| */
+
+    /* purge off exception values */
+	if(hy==0||hx>=0x7f800000||hy>0x7f800000) /* y=0,NaN;or x not finite */
+	    return (x*y)/(x*y);
+	if(hx<hy) {
+	    q = 0;
+	    goto fixup;	/* |x|<|y| return x or x-y */
+	} else if(hx==hy) {
+	    *quo = (sxy ? -1 : 1);
+	    return Zero[(u_int32_t)sx>>31];	/* |x|=|y| return x*0*/
+	}
+
+    /* determine ix = ilogb(x) */
+	if(hx<0x00800000) {	/* subnormal x */
+	    for (ix = -126,i=(hx<<8); i>0; i<<=1) ix -=1;
+	} else ix = (hx>>23)-127;
+
+    /* determine iy = ilogb(y) */
+	if(hy<0x00800000) {	/* subnormal y */
+	    for (iy = -126,i=(hy<<8); i>0; i<<=1) iy -=1;
+	} else iy = (hy>>23)-127;
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	if(ix >= -126)
+	    hx = 0x00800000|(0x007fffff&hx);
+	else {		/* subnormal x, shift x to normal */
+	    n = -126-ix;
+	    hx <<= n;
+	}
+	if(iy >= -126)
+	    hy = 0x00800000|(0x007fffff&hy);
+	else {		/* subnormal y, shift y to normal */
+	    n = -126-iy;
+	    hy <<= n;
+	}
+
+    /* fix point fmod */
+	n = ix - iy;
+	q = 0;
+	while(n--) {
+	    hz=hx-hy;
+	    if(hz<0) hx = hx << 1;
+	    else {hx = hz << 1; q++;}
+	    q <<= 1;
+	}
+	hz=hx-hy;
+	if(hz>=0) {hx=hz;q++;}
+
+    /* convert back to floating value and restore the sign */
+	if(hx==0) {				/* return sign(x)*0 */
+	    q &= 0x7fffffff;
+	    *quo = (sxy ? -q : q);
+	    return Zero[(u_int32_t)sx>>31];
+	}
+	while(hx<0x00800000) {		/* normalize x */
+	    hx <<= 1;
+	    iy -= 1;
+	}
+	if(iy>= -126) {		/* normalize output */
+	    hx = ((hx-0x00800000)|((iy+127)<<23));
+	} else {		/* subnormal output */
+	    n = -126 - iy;
+	    hx >>= n;
+	}
+fixup:
+	SET_FLOAT_WORD(x,hx);
+	y = fabsf(y);
+	if (y < 0x1p-125f) {
+	    if (x+x>y || (x+x==y && (q & 1))) {
+		q++;
+		x-=y;
+	    }
+	} else if (x>0.5f*y || (x==0.5f*y && (q & 1))) {
+	    q++;
+	    x-=y;
+	}
+	GET_FLOAT_WORD(hx,x);
+	SET_FLOAT_WORD(x,hx^sx);
+	q &= 0x7fffffff;
+	*quo = (sxy ? -q : q);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_remquol.c b/libm/upstream-freebsd/lib/msun/src/s_remquol.c
new file mode 100644
index 0000000..712651c
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_remquol.c
@@ -0,0 +1,178 @@
+/* @(#)e_fmod.c 1.3 95/01/18 */
+/*-
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+#define	BIAS (LDBL_MAX_EXP - 1)
+
+#if LDBL_MANL_SIZE > 32
+typedef	uint64_t manl_t;
+#else
+typedef	uint32_t manl_t;
+#endif
+
+#if LDBL_MANH_SIZE > 32
+typedef	uint64_t manh_t;
+#else
+typedef	uint32_t manh_t;
+#endif
+
+/*
+ * These macros add and remove an explicit integer bit in front of the
+ * fractional mantissa, if the architecture doesn't have such a bit by
+ * default already.
+ */
+#ifdef LDBL_IMPLICIT_NBIT
+#define	SET_NBIT(hx)	((hx) | (1ULL << LDBL_MANH_SIZE))
+#define	HFRAC_BITS	LDBL_MANH_SIZE
+#else
+#define	SET_NBIT(hx)	(hx)
+#define	HFRAC_BITS	(LDBL_MANH_SIZE - 1)
+#endif
+
+#define	MANL_SHIFT	(LDBL_MANL_SIZE - 1)
+
+static const long double Zero[] = {0.0L, -0.0L};
+
+/*
+ * Return the IEEE remainder and set *quo to the last n bits of the
+ * quotient, rounded to the nearest integer.  We choose n=31 because
+ * we wind up computing all the integer bits of the quotient anyway as
+ * a side-effect of computing the remainder by the shift and subtract
+ * method.  In practice, this is far more bits than are needed to use
+ * remquo in reduction algorithms.
+ *
+ * Assumptions:
+ * - The low part of the mantissa fits in a manl_t exactly.
+ * - The high part of the mantissa fits in an int64_t with enough room
+ *   for an explicit integer bit in front of the fractional bits.
+ */
+long double
+remquol(long double x, long double y, int *quo)
+{
+	union IEEEl2bits ux, uy;
+	int64_t hx,hz;	/* We need a carry bit even if LDBL_MANH_SIZE is 32. */
+	manh_t hy;
+	manl_t lx,ly,lz;
+	int ix,iy,n,q,sx,sxy;
+
+	ux.e = x;
+	uy.e = y;
+	sx = ux.bits.sign;
+	sxy = sx ^ uy.bits.sign;
+	ux.bits.sign = 0;	/* |x| */
+	uy.bits.sign = 0;	/* |y| */
+	x = ux.e;
+
+    /* purge off exception values */
+	if((uy.bits.exp|uy.bits.manh|uy.bits.manl)==0 || /* y=0 */
+	   (ux.bits.exp == BIAS + LDBL_MAX_EXP) ||	 /* or x not finite */
+	   (uy.bits.exp == BIAS + LDBL_MAX_EXP &&
+	    ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl)!=0)) /* or y is NaN */
+	    return (x*y)/(x*y);
+	if(ux.bits.exp<=uy.bits.exp) {
+	    if((ux.bits.exp<uy.bits.exp) ||
+	       (ux.bits.manh<=uy.bits.manh &&
+		(ux.bits.manh<uy.bits.manh ||
+		 ux.bits.manl<uy.bits.manl))) {
+		q = 0;
+		goto fixup;	/* |x|<|y| return x or x-y */
+	    }
+	    if(ux.bits.manh==uy.bits.manh && ux.bits.manl==uy.bits.manl) {
+		*quo = (sxy ? -1 : 1);
+		return Zero[sx];	/* |x|=|y| return x*0*/
+	    }
+	}
+
+    /* determine ix = ilogb(x) */
+	if(ux.bits.exp == 0) {	/* subnormal x */
+	    ux.e *= 0x1.0p512;
+	    ix = ux.bits.exp - (BIAS + 512);
+	} else {
+	    ix = ux.bits.exp - BIAS;
+	}
+
+    /* determine iy = ilogb(y) */
+	if(uy.bits.exp == 0) {	/* subnormal y */
+	    uy.e *= 0x1.0p512;
+	    iy = uy.bits.exp - (BIAS + 512);
+	} else {
+	    iy = uy.bits.exp - BIAS;
+	}
+
+    /* set up {hx,lx}, {hy,ly} and align y to x */
+	hx = SET_NBIT(ux.bits.manh);
+	hy = SET_NBIT(uy.bits.manh);
+	lx = ux.bits.manl;
+	ly = uy.bits.manl;
+
+    /* fix point fmod */
+	n = ix - iy;
+	q = 0;
+
+	while(n--) {
+	    hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	    if(hz<0){hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;}
+	    else {hx = hz+hz+(lz>>MANL_SHIFT); lx = lz+lz; q++;}
+	    q <<= 1;
+	}
+	hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
+	if(hz>=0) {hx=hz;lx=lz;q++;}
+
+    /* convert back to floating value and restore the sign */
+	if((hx|lx)==0) {			/* return sign(x)*0 */
+	    q &= 0x7fffffff;
+	    *quo = (sxy ? -q : q);
+	    return Zero[sx];
+	}
+	while(hx<(1ULL<<HFRAC_BITS)) {	/* normalize x */
+	    hx = hx+hx+(lx>>MANL_SHIFT); lx = lx+lx;
+	    iy -= 1;
+	}
+	ux.bits.manh = hx; /* The integer bit is truncated here if needed. */
+	ux.bits.manl = lx;
+	if (iy < LDBL_MIN_EXP) {
+	    ux.bits.exp = iy + (BIAS + 512);
+	    ux.e *= 0x1p-512;
+	} else {
+	    ux.bits.exp = iy + BIAS;
+	}
+	ux.bits.sign = 0;
+	x = ux.e;
+fixup:
+	y = fabsl(y);
+	if (y < LDBL_MIN * 2) {
+	    if (x+x>y || (x+x==y && (q & 1))) {
+		q++;
+		x-=y;
+	    }
+	} else if (x>0.5*y || (x==0.5*y && (q & 1))) {
+	    q++;
+	    x-=y;
+	}
+
+	ux.e = x;
+	ux.bits.sign ^= sx;
+	x = ux.e;
+
+	q &= 0x7fffffff;
+	*quo = (sxy ? -q : q);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_rint.c b/libm/upstream-freebsd/lib/msun/src/s_rint.c
new file mode 100644
index 0000000..c56f8fb
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_rint.c
@@ -0,0 +1,92 @@
+/* @(#)s_rint.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * rint(x)
+ * Return x rounded to integral value according to the prevailing
+ * rounding mode.
+ * Method:
+ *	Using floating addition.
+ * Exception:
+ *	Inexact flag raised if x not equal to rint(x).
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+TWO52[2]={
+  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
+ -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
+};
+
+double
+rint(double x)
+{
+	int32_t i0,j0,sx;
+	u_int32_t i,i1;
+	double w,t;
+	EXTRACT_WORDS(i0,i1,x);
+	sx = (i0>>31)&1;
+	j0 = ((i0>>20)&0x7ff)-0x3ff;
+	if(j0<20) {
+	    if(j0<0) {
+		if(((i0&0x7fffffff)|i1)==0) return x;
+		i1 |= (i0&0x0fffff);
+		i0 &= 0xfffe0000;
+		i0 |= ((i1|-i1)>>12)&0x80000;
+		SET_HIGH_WORD(x,i0);
+	        STRICT_ASSIGN(double,w,TWO52[sx]+x);
+	        t =  w-TWO52[sx];
+		GET_HIGH_WORD(i0,t);
+		SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
+	        return t;
+	    } else {
+		i = (0x000fffff)>>j0;
+		if(((i0&i)|i1)==0) return x; /* x is integral */
+		i>>=1;
+		if(((i0&i)|i1)!=0) {
+		    /*
+		     * Some bit is set after the 0.5 bit.  To avoid the
+		     * possibility of errors from double rounding in
+		     * w = TWO52[sx]+x, adjust the 0.25 bit to a lower
+		     * guard bit.  We do this for all j0<=51.  The
+		     * adjustment is trickiest for j0==18 and j0==19
+		     * since then it spans the word boundary.
+		     */
+		    if(j0==19) i1 = 0x40000000; else
+		    if(j0==18) i1 = 0x80000000; else
+		    i0 = (i0&(~i))|((0x20000)>>j0);
+		}
+	    }
+	} else if (j0>51) {
+	    if(j0==0x400) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	} else {
+	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
+	    if((i1&i)==0) return x;	/* x is integral */
+	    i>>=1;
+	    if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
+	}
+	INSERT_WORDS(x,i0,i1);
+	STRICT_ASSIGN(double,w,TWO52[sx]+x);
+	return w-TWO52[sx];
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(rint, rintl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_rintf.c b/libm/upstream-freebsd/lib/msun/src/s_rintf.c
new file mode 100644
index 0000000..f8743a4
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_rintf.c
@@ -0,0 +1,53 @@
+/* s_rintf.c -- float version of s_rint.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <stdint.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+TWO23[2]={
+  8.3886080000e+06, /* 0x4b000000 */
+ -8.3886080000e+06, /* 0xcb000000 */
+};
+
+float
+rintf(float x)
+{
+	int32_t i0,j0,sx;
+	float w,t;
+	GET_FLOAT_WORD(i0,x);
+	sx = (i0>>31)&1;
+	j0 = ((i0>>23)&0xff)-0x7f;
+	if(j0<23) {
+	    if(j0<0) {
+		if((i0&0x7fffffff)==0) return x;
+		STRICT_ASSIGN(float,w,TWO23[sx]+x);
+	        t =  w-TWO23[sx];
+		GET_FLOAT_WORD(i0,t);
+		SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
+	        return t;
+	    }
+	    STRICT_ASSIGN(float,w,TWO23[sx]+x);
+	    return w-TWO23[sx];
+	}
+	if(j0==0x80) return x+x;	/* inf or NaN */
+	else return x;			/* x is integral */
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_rintl.c b/libm/upstream-freebsd/lib/msun/src/s_rintl.c
new file mode 100644
index 0000000..b43df89
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_rintl.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual bias, min exp and expsign packing. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const float
+shift[2] = {
+#if LDBL_MANT_DIG == 64
+	0x1.0p63, -0x1.0p63
+#elif LDBL_MANT_DIG == 113
+	0x1.0p112, -0x1.0p112
+#else
+#error "Unsupported long double format"
+#endif
+};
+static const float zero[2] = { 0.0, -0.0 };
+
+long double
+rintl(long double x)
+{
+	union IEEEl2bits u;
+	uint32_t expsign;
+	int ex, sign;
+
+	u.e = x;
+	expsign = u.xbits.expsign;
+	ex = expsign & 0x7fff;
+
+	if (ex >= BIAS + LDBL_MANT_DIG - 1) {
+		if (ex == BIAS + LDBL_MAX_EXP)
+			return (x + x);	/* Inf, NaN, or unsupported format */
+		return (x);		/* finite and already an integer */
+	}
+	sign = expsign >> 15;
+
+	/*
+	 * The following code assumes that intermediate results are
+	 * evaluated in long double precision. If they are evaluated in
+	 * greater precision, double rounding may occur, and if they are
+	 * evaluated in less precision (as on i386), results will be
+	 * wildly incorrect.
+	 */
+	x += shift[sign];
+	x -= shift[sign];
+
+	/*
+	 * If the result is +-0, then it must have the same sign as x, but
+	 * the above calculation doesn't always give this.  Fix up the sign.
+	 */
+	if (ex < BIAS && x == 0.0L)
+		return (zero[sign]);
+
+	return (x);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_round.c b/libm/upstream-freebsd/lib/msun/src/s_round.c
new file mode 100644
index 0000000..fab3019
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_round.c
@@ -0,0 +1,60 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+double
+round(double x)
+{
+	double t;
+	uint32_t hx;
+
+	GET_HIGH_WORD(hx, x);
+	if ((hx & 0x7fffffff) == 0x7ff00000)
+		return (x + x);
+
+	if (!(hx & 0x80000000)) {
+		t = floor(x);
+		if (t - x <= -0.5)
+			t += 1;
+		return (t);
+	} else {
+		t = floor(-x);
+		if (t + x <= -0.5)
+			t += 1;
+		return (-t);
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(round, roundl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_roundf.c b/libm/upstream-freebsd/lib/msun/src/s_roundf.c
new file mode 100644
index 0000000..e7e2eb9
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_roundf.c
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+float
+roundf(float x)
+{
+	float t;
+	uint32_t hx;
+
+	GET_FLOAT_WORD(hx, x);
+	if ((hx & 0x7fffffff) == 0x7f800000)
+		return (x + x);
+
+	if (!(hx & 0x80000000)) {
+		t = floorf(x);
+		if (t - x <= -0.5F)
+			t += 1;
+		return (t);
+	} else {
+		t = floorf(-x);
+		if (t + x <= -0.5F)
+			t += 1;
+		return (-t);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_roundl.c b/libm/upstream-freebsd/lib/msun/src/s_roundl.c
new file mode 100644
index 0000000..2d15e13
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_roundl.c
@@ -0,0 +1,62 @@
+/*-
+ * Copyright (c) 2003, Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "fpmath.h"
+#include "math.h"
+#include "math_private.h"
+
+long double
+roundl(long double x)
+{
+	long double t;
+	uint16_t hx;
+
+	GET_LDBL_EXPSIGN(hx, x);
+	if ((hx & 0x7fff) == 0x7fff)
+		return (x + x);
+
+	ENTERI();
+
+	if (!(hx & 0x8000)) {
+		t = floorl(x);
+		if (t - x <= -0.5L)
+			t += 1;
+		RETURNI(t);
+	} else {
+		t = floorl(-x);
+		if (t + x <= -0.5L)
+			t += 1;
+		RETURNI(-t);
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_scalbln.c b/libm/upstream-freebsd/lib/msun/src/s_scalbln.c
new file mode 100644
index 0000000..8e61377
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_scalbln.c
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/msun/src/s_scalbln.c 278339 2015-02-07 00:38:18Z kargl $");
+
+#include <math.h>
+
+#define	NMAX	65536
+#define	NMIN	-65536
+
+double
+scalbln(double x, long n)
+{
+
+	return (scalbn(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
+
+float
+scalblnf(float x, long n)
+{
+
+	return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
+
+long double
+scalblnl(long double x, long n)
+{
+
+	return (scalbnl(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_scalbn.c b/libm/upstream-freebsd/lib/msun/src/s_scalbn.c
new file mode 100644
index 0000000..e7efaab
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_scalbn.c
@@ -0,0 +1,66 @@
+/* @(#)s_scalbn.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+/*
+ * scalbn (double x, int n)
+ * scalbn(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+
+#include <sys/cdefs.h>
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double
+two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
+huge   = 1.0e+300,
+tiny   = 1.0e-300;
+
+double
+scalbn (double x, int n)
+{
+	int32_t k,hx,lx;
+	EXTRACT_WORDS(hx,lx,x);
+        k = (hx&0x7ff00000)>>20;		/* extract exponent */
+        if (k==0) {				/* 0 or subnormal x */
+            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
+	    x *= two54;
+	    GET_HIGH_WORD(hx,x);
+	    k = ((hx&0x7ff00000)>>20) - 54;
+            if (n< -50000) return tiny*x; 	/*underflow*/
+	    }
+        if (k==0x7ff) return x+x;		/* NaN or Inf */
+        k = k+n;
+        if (k >  0x7fe) return huge*copysign(huge,x); /* overflow  */
+        if (k > 0) 				/* normal result */
+	    {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
+        if (k <= -54)
+            if (n > 50000) 	/* in case integer overflow in n+k */
+		return huge*copysign(huge,x);	/*overflow*/
+	    else return tiny*copysign(tiny,x); 	/*underflow*/
+        k += 54;				/* subnormal result */
+	SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
+        return x*twom54;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(scalbn, ldexpl);
+__weak_reference(scalbn, scalbnl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_scalbnf.c b/libm/upstream-freebsd/lib/msun/src/s_scalbnf.c
new file mode 100644
index 0000000..7666c74
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_scalbnf.c
@@ -0,0 +1,58 @@
+/* s_scalbnf.c -- float version of s_scalbn.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+#include <sys/cdefs.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const float
+two25   =  3.355443200e+07,	/* 0x4c000000 */
+twom25  =  2.9802322388e-08,	/* 0x33000000 */
+huge   = 1.0e+30,
+tiny   = 1.0e-30;
+
+float
+scalbnf (float x, int n)
+{
+	int32_t k,ix;
+	GET_FLOAT_WORD(ix,x);
+        k = (ix&0x7f800000)>>23;		/* extract exponent */
+        if (k==0) {				/* 0 or subnormal x */
+            if ((ix&0x7fffffff)==0) return x; /* +-0 */
+	    x *= two25;
+	    GET_FLOAT_WORD(ix,x);
+	    k = ((ix&0x7f800000)>>23) - 25;
+            if (n< -50000) return tiny*x; 	/*underflow*/
+	    }
+        if (k==0xff) return x+x;		/* NaN or Inf */
+        k = k+n;
+        if (k >  0xfe) return huge*copysignf(huge,x); /* overflow  */
+        if (k > 0) 				/* normal result */
+	    {SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23)); return x;}
+        if (k <= -25)
+            if (n > 50000) 	/* in case integer overflow in n+k */
+		return huge*copysignf(huge,x);	/*overflow*/
+	    else return tiny*copysignf(tiny,x);	/*underflow*/
+        k += 25;				/* subnormal result */
+	SET_FLOAT_WORD(x,(ix&0x807fffff)|(k<<23));
+        return x*twom25;
+}
+
+__strong_reference(scalbnf, ldexpf);
diff --git a/libm/upstream-freebsd/lib/msun/src/s_scalbnl.c b/libm/upstream-freebsd/lib/msun/src/s_scalbnl.c
new file mode 100644
index 0000000..fc89f8d
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_scalbnl.c
@@ -0,0 +1,71 @@
+/* @(#)s_scalbn.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef lint
+static char rcsid[] = "$FreeBSD$";
+#endif
+
+/*
+ * scalbnl (long double x, int n)
+ * scalbnl(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+ * exponentiation or a multiplication.
+ */
+
+/*
+ * We assume that a long double has a 15-bit exponent.  On systems
+ * where long double is the same as double, scalbnl() is an alias
+ * for scalbn(), so we don't use this routine.
+ */
+
+#include <sys/cdefs.h>
+#include <float.h>
+#include <math.h>
+
+#include "fpmath.h"
+
+#if LDBL_MAX_EXP != 0x4000
+#error "Unsupported long double format"
+#endif
+
+static const long double
+huge = 0x1p16000L,
+tiny = 0x1p-16000L;
+
+long double
+scalbnl (long double x, int n)
+{
+	union IEEEl2bits u;
+	int k;
+	u.e = x;
+        k = u.bits.exp;				/* extract exponent */
+        if (k==0) {				/* 0 or subnormal x */
+            if ((u.bits.manh|u.bits.manl)==0) return x;	/* +-0 */
+	    u.e *= 0x1p+128;
+	    k = u.bits.exp - 128;
+            if (n< -50000) return tiny*x; 	/*underflow*/
+	    }
+        if (k==0x7fff) return x+x;		/* NaN or Inf */
+        k = k+n;
+        if (k >= 0x7fff) return huge*copysignl(huge,x); /* overflow  */
+        if (k > 0) 				/* normal result */
+	    {u.bits.exp = k; return u.e;}
+        if (k <= -128)
+            if (n > 50000) 	/* in case integer overflow in n+k */
+		return huge*copysign(huge,x);	/*overflow*/
+	    else return tiny*copysign(tiny,x); 	/*underflow*/
+        k += 128;				/* subnormal result */
+	u.bits.exp = k;
+        return u.e*0x1p-128;
+}
+
+__strong_reference(scalbnl, ldexpl);
diff --git a/libm/upstream-freebsd/lib/msun/src/s_signgam.c b/libm/upstream-freebsd/lib/msun/src/s_signgam.c
new file mode 100644
index 0000000..d67d591
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_signgam.c
@@ -0,0 +1,3 @@
+#include "math.h"
+#include "math_private.h"
+int signgam = 0;
diff --git a/libm/upstream-freebsd/lib/msun/src/s_significand.c b/libm/upstream-freebsd/lib/msun/src/s_significand.c
new file mode 100644
index 0000000..356e300
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_significand.c
@@ -0,0 +1,29 @@
+/* @(#)s_signif.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * significand(x) computes just
+ * 	scalb(x, (double) -ilogb(x)),
+ * for exercising the fraction-part(F) IEEE 754-1985 test vector.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+double
+significand(double x)
+{
+	return __ieee754_scalb(x,(double) -ilogb(x));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_significandf.c b/libm/upstream-freebsd/lib/msun/src/s_significandf.c
new file mode 100644
index 0000000..ad030e2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_significandf.c
@@ -0,0 +1,26 @@
+/* s_significandf.c -- float version of s_significand.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+float
+significandf(float x)
+{
+	return __ieee754_scalbf(x,(float) -ilogbf(x));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_sin.c b/libm/upstream-freebsd/lib/msun/src/s_sin.c
new file mode 100644
index 0000000..17ea846
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_sin.c
@@ -0,0 +1,89 @@
+/* @(#)s_sin.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* sin(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ *	__kernel_sin		... sine function on [-pi/4,pi/4]
+ *	__kernel_cos		... cose function on [-pi/4,pi/4]
+ *	__ieee754_rem_pio2	... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *	in [-pi/4 , +pi/4], and let n = k mod 4.
+ *	We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *	    0	       S	   C		 T
+ *	    1	       C	  -S		-1/T
+ *	    2	      -S	  -C		 T
+ *	    3	      -C	   S		-1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *	TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include <float.h>
+
+#include "math.h"
+#define INLINE_REM_PIO2
+#include "math_private.h"
+#include "e_rem_pio2.c"
+
+double
+sin(double x)
+{
+	double y[2],z=0.0;
+	int32_t n, ix;
+
+    /* High word of x. */
+	GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+	ix &= 0x7fffffff;
+	if(ix <= 0x3fe921fb) {
+	    if(ix<0x3e500000)			/* |x| < 2**-26 */
+	       {if((int)x==0) return x;}	/* generate inexact */
+	    return __kernel_sin(x,z,0);
+	}
+
+    /* sin(Inf or NaN) is NaN */
+	else if (ix>=0x7ff00000) return x-x;
+
+    /* argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2(x,y);
+	    switch(n&3) {
+		case 0: return  __kernel_sin(y[0],y[1],1);
+		case 1: return  __kernel_cos(y[0],y[1]);
+		case 2: return -__kernel_sin(y[0],y[1],1);
+		default:
+			return -__kernel_cos(y[0],y[1]);
+	    }
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(sin, sinl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_sinf.c b/libm/upstream-freebsd/lib/msun/src/s_sinf.c
new file mode 100644
index 0000000..41b5dc1
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_sinf.c
@@ -0,0 +1,85 @@
+/* s_sinf.c -- float version of s_sin.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#define	INLINE_KERNEL_COSDF
+#define	INLINE_KERNEL_SINDF
+#define INLINE_REM_PIO2F
+#include "math_private.h"
+#include "e_rem_pio2f.c"
+#include "k_cosf.c"
+#include "k_sinf.c"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+s1pio2 = 1*M_PI_2,			/* 0x3FF921FB, 0x54442D18 */
+s2pio2 = 2*M_PI_2,			/* 0x400921FB, 0x54442D18 */
+s3pio2 = 3*M_PI_2,			/* 0x4012D97C, 0x7F3321D2 */
+s4pio2 = 4*M_PI_2;			/* 0x401921FB, 0x54442D18 */
+
+float
+sinf(float x)
+{
+	double y;
+	int32_t n, hx, ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx & 0x7fffffff;
+
+	if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
+	    if(ix<0x39800000)		/* |x| < 2**-12 */
+		if(((int)x)==0) return x;	/* x with inexact if x != 0 */
+	    return __kernel_sindf(x);
+	}
+	if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
+	    if(ix<=0x4016cbe3) {	/* |x| ~<= 3pi/4 */
+		if(hx>0)
+		    return __kernel_cosdf(x - s1pio2);
+		else
+		    return -__kernel_cosdf(x + s1pio2);
+	    } else
+		return __kernel_sindf((hx > 0 ? s2pio2 : -s2pio2) - x);
+	}
+	if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
+	    if(ix<=0x40afeddf) {	/* |x| ~<= 7*pi/4 */
+		if(hx>0)
+		    return -__kernel_cosdf(x - s3pio2);
+		else
+		    return __kernel_cosdf(x + s3pio2);
+	    } else
+		return __kernel_sindf(x + (hx > 0 ? -s4pio2 : s4pio2));
+	}
+
+    /* sin(Inf or NaN) is NaN */
+	else if (ix>=0x7f800000) return x-x;
+
+    /* general argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2f(x,&y);
+	    switch(n&3) {
+		case 0: return  __kernel_sindf(y);
+		case 1: return  __kernel_cosdf(y);
+		case 2: return  __kernel_sindf(-y);
+		default:
+			return -__kernel_cosdf(y);
+	    }
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_sinl.c b/libm/upstream-freebsd/lib/msun/src/s_sinl.c
new file mode 100644
index 0000000..f454f8f
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_sinl.c
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+sinl(long double x)
+{
+	union IEEEl2bits z;
+	int e0, s;
+	long double y[2];
+	long double hi, lo;
+
+	z.e = x;
+	s = z.bits.sign;
+	z.bits.sign = 0;
+
+	/* If x = +-0 or x is a subnormal number, then sin(x) = x */
+	if (z.bits.exp == 0)
+		return (x);
+
+	/* If x = NaN or Inf, then sin(x) = NaN. */
+	if (z.bits.exp == 32767)
+		return ((x - x) / (x - x));
+
+	ENTERI();
+
+	/* Optimize the case where x is already within range. */
+	if (z.e < M_PI_4) {
+		hi = __kernel_sinl(z.e, 0, 0);
+		RETURNI(s ? -hi : hi);
+	}
+
+	e0 = __ieee754_rem_pio2l(x, y);
+	hi = y[0];
+	lo = y[1];
+
+	switch (e0 & 3) {
+	case 0:
+	    hi = __kernel_sinl(hi, lo, 1);
+	    break;
+	case 1:
+	    hi = __kernel_cosl(hi, lo);
+	    break;
+	case 2:
+	    hi = - __kernel_sinl(hi, lo, 1);
+	    break;
+	case 3:
+	    hi = - __kernel_cosl(hi, lo);
+	    break;
+	}
+	
+	RETURNI(hi);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tan.c b/libm/upstream-freebsd/lib/msun/src/s_tan.c
new file mode 100644
index 0000000..196c27e
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tan.c
@@ -0,0 +1,83 @@
+/* @(#)s_tan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* tan(x)
+ * Return tangent function of x.
+ *
+ * kernel function:
+ *	__kernel_tan		... tangent function on [-pi/4,pi/4]
+ *	__ieee754_rem_pio2	... argument reduction routine
+ *
+ * Method.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *	[-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *	in [-pi/4 , +pi/4], and let n = k mod 4.
+ *	We have
+ *
+ *          n        sin(x)      cos(x)        tan(x)
+ *     ----------------------------------------------------------
+ *	    0	       S	   C		 T
+ *	    1	       C	  -S		-1/T
+ *	    2	      -S	  -C		 T
+ *	    3	      -C	   S		-1/T
+ *     ----------------------------------------------------------
+ *
+ * Special cases:
+ *      Let trig be any of sin, cos, or tan.
+ *      trig(+-INF)  is NaN, with signals;
+ *      trig(NaN)    is that NaN;
+ *
+ * Accuracy:
+ *	TRIG(x) returns trig(x) nearly rounded
+ */
+
+#include <float.h>
+
+#include "math.h"
+#define INLINE_REM_PIO2
+#include "math_private.h"
+#include "e_rem_pio2.c"
+
+double
+tan(double x)
+{
+	double y[2],z=0.0;
+	int32_t n, ix;
+
+    /* High word of x. */
+	GET_HIGH_WORD(ix,x);
+
+    /* |x| ~< pi/4 */
+	ix &= 0x7fffffff;
+	if(ix <= 0x3fe921fb) {
+	    if(ix<0x3e400000)			/* x < 2**-27 */
+		if((int)x==0) return x;		/* generate inexact */
+	    return __kernel_tan(x,z,1);
+	}
+
+    /* tan(Inf or NaN) is NaN */
+	else if (ix>=0x7ff00000) return x-x;		/* NaN */
+
+    /* argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2(x,y);
+	    return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
+							-1 -- n odd */
+	}
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(tan, tanl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tanf.c b/libm/upstream-freebsd/lib/msun/src/s_tanf.c
new file mode 100644
index 0000000..4fe8c17
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tanf.c
@@ -0,0 +1,72 @@
+/* s_tanf.c -- float version of s_tan.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Optimized by Bruce D. Evans.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <float.h>
+
+#include "math.h"
+#define	INLINE_KERNEL_TANDF
+#define INLINE_REM_PIO2F
+#include "math_private.h"
+#include "e_rem_pio2f.c"
+#include "k_tanf.c"
+
+/* Small multiples of pi/2 rounded to double precision. */
+static const double
+t1pio2 = 1*M_PI_2,			/* 0x3FF921FB, 0x54442D18 */
+t2pio2 = 2*M_PI_2,			/* 0x400921FB, 0x54442D18 */
+t3pio2 = 3*M_PI_2,			/* 0x4012D97C, 0x7F3321D2 */
+t4pio2 = 4*M_PI_2;			/* 0x401921FB, 0x54442D18 */
+
+float
+tanf(float x)
+{
+	double y;
+	int32_t n, hx, ix;
+
+	GET_FLOAT_WORD(hx,x);
+	ix = hx & 0x7fffffff;
+
+	if(ix <= 0x3f490fda) {		/* |x| ~<= pi/4 */
+	    if(ix<0x39800000)		/* |x| < 2**-12 */
+		if(((int)x)==0) return x;	/* x with inexact if x != 0 */
+	    return __kernel_tandf(x,1);
+	}
+	if(ix<=0x407b53d1) {		/* |x| ~<= 5*pi/4 */
+	    if(ix<=0x4016cbe3)		/* |x| ~<= 3pi/4 */
+		return __kernel_tandf(x + (hx>0 ? -t1pio2 : t1pio2), -1);
+	    else
+		return __kernel_tandf(x + (hx>0 ? -t2pio2 : t2pio2), 1);
+	}
+	if(ix<=0x40e231d5) {		/* |x| ~<= 9*pi/4 */
+	    if(ix<=0x40afeddf)		/* |x| ~<= 7*pi/4 */
+		return __kernel_tandf(x + (hx>0 ? -t3pio2 : t3pio2), -1);
+	    else
+		return __kernel_tandf(x + (hx>0 ? -t4pio2 : t4pio2), 1);
+	}
+
+    /* tan(Inf or NaN) is NaN */
+	else if (ix>=0x7f800000) return x-x;
+
+    /* general argument reduction needed */
+	else {
+	    n = __ieee754_rem_pio2f(x,&y);
+	    /* integer parameter: 1 -- n even; -1 -- n odd */
+	    return __kernel_tandf(y,1-((n&1)<<1));
+	}
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tanh.c b/libm/upstream-freebsd/lib/msun/src/s_tanh.c
new file mode 100644
index 0000000..6d26c69
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tanh.c
@@ -0,0 +1,84 @@
+/* @(#)s_tanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* Tanh(x)
+ * Return the Hyperbolic Tangent of x
+ *
+ * Method :
+ *				       x    -x
+ *				      e  - e
+ *	0. tanh(x) is defined to be -----------
+ *				       x    -x
+ *				      e  + e
+ *	1. reduce x to non-negative by tanh(-x) = -tanh(x).
+ *	2.  0      <= x <  2**-28 : tanh(x) := x with inexact if x != 0
+ *					        -t
+ *	    2**-28 <= x <  1      : tanh(x) := -----; t = expm1(-2x)
+ *					       t + 2
+ *						     2
+ *	    1      <= x <  22     : tanh(x) := 1 - -----; t = expm1(2x)
+ *						   t + 2
+ *	    22     <= x <= INF    : tanh(x) := 1.
+ *
+ * Special cases:
+ *	tanh(NaN) is NaN;
+ *	only tanh(0)=0 is exact for finite argument.
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile double tiny = 1.0e-300;
+static const double one = 1.0, two = 2.0, huge = 1.0e300;
+
+double
+tanh(double x)
+{
+	double t,z;
+	int32_t jx,ix;
+
+	GET_HIGH_WORD(jx,x);
+	ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7ff00000) {
+	    if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
+	    else       return one/x-one;    /* tanh(NaN) = NaN */
+	}
+
+    /* |x| < 22 */
+	if (ix < 0x40360000) {		/* |x|<22 */
+	    if (ix<0x3e300000) {	/* |x|<2**-28 */
+		if(huge+x>one) return x; /* tanh(tiny) = tiny with inexact */
+	    }
+	    if (ix>=0x3ff00000) {	/* |x|>=1  */
+		t = expm1(two*fabs(x));
+		z = one - two/(t+two);
+	    } else {
+	        t = expm1(-two*fabs(x));
+	        z= -t/(t+two);
+	    }
+    /* |x| >= 22, return +-1 */
+	} else {
+	    z = one - tiny;		/* raise inexact flag */
+	}
+	return (jx>=0)? z: -z;
+}
+
+#if (LDBL_MANT_DIG == 53)
+__weak_reference(tanh, tanhl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tanhf.c b/libm/upstream-freebsd/lib/msun/src/s_tanhf.c
new file mode 100644
index 0000000..f537be4
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tanhf.c
@@ -0,0 +1,57 @@
+/* s_tanhf.c -- float version of s_tanh.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "math.h"
+#include "math_private.h"
+
+static const volatile float tiny = 1.0e-30;
+static const float one=1.0, two=2.0, huge = 1.0e30;
+
+float
+tanhf(float x)
+{
+	float t,z;
+	int32_t jx,ix;
+
+	GET_FLOAT_WORD(jx,x);
+	ix = jx&0x7fffffff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7f800000) {
+	    if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
+	    else       return one/x-one;    /* tanh(NaN) = NaN */
+	}
+
+    /* |x| < 9 */
+	if (ix < 0x41100000) {		/* |x|<9 */
+	    if (ix<0x39800000) {	/* |x|<2**-12 */
+		if(huge+x>one) return x; /* tanh(tiny) = tiny with inexact */
+	    }
+	    if (ix>=0x3f800000) {	/* |x|>=1  */
+		t = expm1f(two*fabsf(x));
+		z = one - two/(t+two);
+	    } else {
+	        t = expm1f(-two*fabsf(x));
+	        z= -t/(t+two);
+	    }
+    /* |x| >= 9, return +-1 */
+	} else {
+	    z = one - tiny;		/* raise inexact flag */
+	}
+	return (jx>=0)? z: -z;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tanhl.c b/libm/upstream-freebsd/lib/msun/src/s_tanhl.c
new file mode 100644
index 0000000..886158b
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tanhl.c
@@ -0,0 +1,172 @@
+/* from: FreeBSD: head/lib/msun/src/s_tanhl.c XXX */
+
+/* @(#)s_tanh.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * See s_tanh.c for complete comments.
+ *
+ * Converted to long double by Bruce D. Evans.
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#include "fpmath.h"
+#include "k_expl.h"
+
+#if LDBL_MAX_EXP != 0x4000
+/* We also require the usual expsign encoding. */
+#error "Unsupported long double format"
+#endif
+
+#define	BIAS	(LDBL_MAX_EXP - 1)
+
+static const volatile double tiny = 1.0e-300;
+static const double one = 1.0;
+#if LDBL_MANT_DIG == 64
+/*
+ * Domain [-0.25, 0.25], range ~[-1.6304e-22, 1.6304e-22]:
+ * |tanh(x)/x - t(x)| < 2**-72.3
+ */
+static const union IEEEl2bits
+T3u = LD80C(0xaaaaaaaaaaaaaa9f, -2, -3.33333333333333333017e-1L);
+#define	T3	T3u.e
+static const double
+T5  =  1.3333333333333314e-1,		/*  0x1111111111110a.0p-55 */
+T7  = -5.3968253968210485e-2,		/* -0x1ba1ba1ba1a1a1.0p-57 */
+T9  =  2.1869488531393817e-2,		/*  0x1664f488172022.0p-58 */
+T11 = -8.8632352345964591e-3,		/* -0x1226e34bc138d5.0p-59 */
+T13 =  3.5921169709993771e-3,		/*  0x1d6d371d3e400f.0p-61 */
+T15 = -1.4555786415756001e-3,		/* -0x17d923aa63814d.0p-62 */
+T17 =  5.8645267876296793e-4,		/*  0x13378589b85aa7.0p-63 */
+T19 = -2.1121033571392224e-4;		/* -0x1baf0af80c4090.0p-65 */
+#elif LDBL_MANT_DIG == 113
+/*
+ * Domain [-0.25, 0.25], range ~[-2.4211e-37, 2.4211e-37]:
+ * |tanh(x)/x - t(x)| < 2**121.6
+ */
+static const long double
+T3 = -3.33333333333333333333333333333332980e-1L,	/* -0x1555555555555555555555555554e.0p-114L */
+T5  =  1.33333333333333333333333333332707260e-1L,	/*  0x1111111111111111111111110ab7b.0p-115L */
+T7  = -5.39682539682539682539682535723482314e-2L,	/* -0x1ba1ba1ba1ba1ba1ba1ba17b5fc98.0p-117L */
+T9  =  2.18694885361552028218693591149061717e-2L,	/*  0x1664f4882c10f9f32d6b1a12a25e5.0p-118L */
+T11 = -8.86323552990219656883762347736381851e-3L,	/* -0x1226e355e6c23c8f5a5a0f386cb4d.0p-119L */
+T13 =  3.59212803657248101358314398220822722e-3L,	/*  0x1d6d3d0e157ddfb403ad3637442c6.0p-121L */
+T15 = -1.45583438705131796512568010348874662e-3L;	/* -0x17da36452b75e150c44cc34253b34.0p-122L */
+static const double
+T17 =  5.9002744094556621e-4,		/*  0x1355824803668e.0p-63 */
+T19 = -2.3912911424260516e-4,		/* -0x1f57d7734c8dde.0p-65 */
+T21 =  9.6915379535512898e-5,		/*  0x1967e18ad6a6ca.0p-66 */
+T23 = -3.9278322983156353e-5,		/* -0x1497d8e6b75729.0p-67 */
+T25 =  1.5918887220143869e-5,		/*  0x10b1319998cafa.0p-68 */
+T27 = -6.4514295231630956e-6,		/* -0x1b0f2b71b218eb.0p-70 */
+T29 =  2.6120754043964365e-6,		/*  0x15e963a3cf3a39.0p-71 */
+T31 = -1.0407567231003314e-6,		/* -0x1176041e656869.0p-72 */
+T33 =  3.4744117554063574e-7;		/*  0x1750fe732cab9c.0p-74 */
+#endif /* LDBL_MANT_DIG == 64 */
+
+static inline long double
+divl(long double a, long double b, long double c, long double d,
+    long double e, long double f)
+{
+	long double inv, r;
+	float fr, fw;
+
+	_2sumF(a, c);
+	b = b + c;
+	_2sumF(d, f);
+	e = e + f;
+
+	inv = 1 / (d + e);
+
+	r = (a + b) * inv;
+	fr = r;
+	r = fr;
+
+	fw = d + e;
+	e = d - fw + e;
+	d = fw;
+
+	r = r + (a - d * r + b - e * r) * inv;
+
+	return r;
+}
+
+long double
+tanhl(long double x)
+{
+	long double hi,lo,s,x2,x4,z;
+	double dx2;
+	int16_t jx,ix;
+
+	GET_LDBL_EXPSIGN(jx,x);
+	ix = jx&0x7fff;
+
+    /* x is INF or NaN */
+	if(ix>=0x7fff) {
+	    if (jx>=0) return one/x+one;    /* tanh(+-inf)=+-1 */
+	    else       return one/x-one;    /* tanh(NaN) = NaN */
+	}
+
+	ENTERI();
+
+    /* |x| < 40 */
+	if (ix < 0x4004 || fabsl(x) < 40) {	/* |x|<40 */
+	    if (__predict_false(ix<BIAS-(LDBL_MANT_DIG+1)/2)) {	/* |x|<TINY */
+		/* tanh(+-0) = +0; tanh(tiny) = tiny(-+) with inexact: */
+		return (x == 0 ? x : (0x1p200 * x - x) * 0x1p-200);
+	    }
+	    if (ix<0x3ffd) {		/* |x|<0.25 */
+		x2 = x*x;
+#if LDBL_MANT_DIG == 64
+		x4 = x2*x2;
+		RETURNI(((T19*x2 + T17)*x4 + (T15*x2 + T13))*(x2*x*x2*x4*x4) +
+		    ((T11*x2 + T9)*x4 + (T7*x2 + T5))*(x2*x*x2) +
+		    T3*(x2*x) + x);
+#elif LDBL_MANT_DIG == 113
+		dx2 = x2;
+#if 0
+		RETURNI(((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
+		    T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
+		    T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
+		    (x2*x*x2) +
+		    T3*(x2*x) + x);
+#else
+		long double q = ((((((((((((((T33*dx2 + T31)*dx2 + T29)*dx2 + T27)*dx2 +
+		    T25)*x2 + T23)*x2 + T21)*x2 + T19)*x2 + T17)*x2 +
+		    T15)*x2 + T13)*x2 + T11)*x2 + T9)*x2 + T7)*x2 + T5)*
+		    (x2*x*x2);
+		RETURNI(q + T3*(x2*x) + x);
+#endif
+#endif
+	    }
+	    k_hexpl(2*fabsl(x), &hi, &lo);
+	    if (ix<0x4001 && fabsl(x) < 1.5)	/* |x|<1.5 */
+		z = divl(hi, lo, -0.5, hi, lo, 0.5);
+	    else
+		z = one - one/(lo+0.5+hi);
+    /* |x| >= 40, return +-1 */
+	} else {
+	    z = one - tiny;		/* raise inexact flag */
+	}
+	s = 1;
+	if (jx<0) s = -1;
+	RETURNI(s*z);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tanl.c b/libm/upstream-freebsd/lib/msun/src/s_tanl.c
new file mode 100644
index 0000000..eadc837
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tanl.c
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2007 Steven G. Kargl
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Limited testing on pseudorandom numbers drawn within [0:4e8] shows
+ * an accuracy of <= 1.5 ULP where 247024 values of x out of 40 million
+ * possibles resulted in tan(x) that exceeded 0.5 ULP (ie., 0.6%).
+ */
+
+#include <float.h>
+#ifdef __i386__
+#include <ieeefp.h>
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#if LDBL_MANT_DIG == 64
+#include "../ld80/e_rem_pio2l.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/e_rem_pio2l.h"
+#else
+#error "Unsupported long double format"
+#endif
+
+long double
+tanl(long double x)
+{
+	union IEEEl2bits z;
+	int e0, s;
+	long double y[2];
+	long double hi, lo;
+
+	z.e = x;
+	s = z.bits.sign;
+	z.bits.sign = 0;
+
+	/* If x = +-0 or x is subnormal, then tan(x) = x. */
+	if (z.bits.exp == 0)
+		return (x);
+
+	/* If x = NaN or Inf, then tan(x) = NaN. */
+	if (z.bits.exp == 32767)
+		return ((x - x) / (x - x));
+
+	ENTERI();
+
+	/* Optimize the case where x is already within range. */
+	if (z.e < M_PI_4) {
+		hi = __kernel_tanl(z.e, 0, 0);
+		RETURNI(s ? -hi : hi);
+	}
+
+	e0 = __ieee754_rem_pio2l(x, y);
+	hi = y[0];
+	lo = y[1];
+
+	switch (e0 & 3) {
+	case 0:
+	case 2:
+	    hi = __kernel_tanl(hi, lo, 0);
+	    break;
+	case 1:
+	case 3:
+	    hi = __kernel_tanl(hi, lo, 1);
+	    break;
+	}
+
+	RETURNI(hi);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_tgammaf.c b/libm/upstream-freebsd/lib/msun/src/s_tgammaf.c
new file mode 100644
index 0000000..9993d91
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_tgammaf.c
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2008 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <math.h>
+
+/*
+ * We simply call tgamma() rather than bloating the math library with
+ * a float-optimized version of it. The reason is that tgammaf() is
+ * essentially useless, since the function is superexponential and
+ * floats have very limited range.
+ */
+float
+tgammaf(float x)
+{
+
+	return (tgamma(x));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_trunc.c b/libm/upstream-freebsd/lib/msun/src/s_trunc.c
new file mode 100644
index 0000000..63a6753
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_trunc.c
@@ -0,0 +1,67 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * trunc(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to trunc(x).
+ */
+
+#include <float.h>
+
+#include "math.h"
+#include "math_private.h"
+
+static const double huge = 1.0e300;
+
+double
+trunc(double x)
+{
+	int32_t i0,i1,j0;
+	u_int32_t i;
+	EXTRACT_WORDS(i0,i1,x);
+	j0 = ((i0>>20)&0x7ff)-0x3ff;
+	if(j0<20) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */
+		    i0 &= 0x80000000U;
+		    i1 = 0;
+		}
+	    } else {
+		i = (0x000fffff)>>j0;
+		if(((i0&i)|i1)==0) return x; /* x is integral */
+		if(huge+x>0.0) {	/* raise inexact flag */
+		    i0 &= (~i); i1=0;
+		}
+	    }
+	} else if (j0>51) {
+	    if(j0==0x400) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	} else {
+	    i = ((u_int32_t)(0xffffffff))>>(j0-20);
+	    if((i1&i)==0) return x;	/* x is integral */
+	    if(huge+x>0.0)		/* raise inexact flag */
+		i1 &= (~i);
+	}
+	INSERT_WORDS(x,i0,i1);
+	return x;
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(trunc, truncl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/s_truncf.c b/libm/upstream-freebsd/lib/msun/src/s_truncf.c
new file mode 100644
index 0000000..384eaee
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_truncf.c
@@ -0,0 +1,53 @@
+/* @(#)s_floor.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * truncf(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to truncf(x).
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+static const float huge = 1.0e30F;
+
+float
+truncf(float x)
+{
+	int32_t i0,j0;
+	u_int32_t i;
+	GET_FLOAT_WORD(i0,x);
+	j0 = ((i0>>23)&0xff)-0x7f;
+	if(j0<23) {
+	    if(j0<0) { 	/* raise inexact if x != 0 */
+		if(huge+x>0.0F)		/* |x|<1, so return 0*sign(x) */
+		    i0 &= 0x80000000;
+	    } else {
+		i = (0x007fffff)>>j0;
+		if((i0&i)==0) return x; /* x is integral */
+		if(huge+x>0.0F)		/* raise inexact flag */
+		    i0 &= (~i);
+	    }
+	} else {
+	    if(j0==0x80) return x+x;	/* inf or NaN */
+	    else return x;		/* x is integral */
+	}
+	SET_FLOAT_WORD(x,i0);
+	return x;
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_truncl.c b/libm/upstream-freebsd/lib/msun/src/s_truncl.c
new file mode 100644
index 0000000..9e2b511
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/s_truncl.c
@@ -0,0 +1,68 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ *
+ * From: @(#)s_floor.c 5.1 93/09/24
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * truncl(x)
+ * Return x rounded toward 0 to integral value
+ * Method:
+ *	Bit twiddling.
+ * Exception:
+ *	Inexact flag raised if x not equal to truncl(x).
+ */
+
+#include <float.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "fpmath.h"
+
+#ifdef LDBL_IMPLICIT_NBIT
+#define	MANH_SIZE	(LDBL_MANH_SIZE + 1)
+#else
+#define	MANH_SIZE	LDBL_MANH_SIZE
+#endif
+
+static const long double huge = 1.0e300;
+static const float zero[] = { 0.0, -0.0 };
+
+long double
+truncl(long double x)
+{
+	union IEEEl2bits u = { .e = x };
+	int e = u.bits.exp - LDBL_MAX_EXP + 1;
+
+	if (e < MANH_SIZE - 1) {
+		if (e < 0) {			/* raise inexact if x != 0 */
+			if (huge + x > 0.0)
+				u.e = zero[u.bits.sign];
+		} else {
+			uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
+			if (((u.bits.manh & m) | u.bits.manl) == 0)
+				return (x);	/* x is integral */
+			if (huge + x > 0.0) {	/* raise inexact flag */
+				u.bits.manh &= ~m;
+				u.bits.manl = 0;
+			}
+		}
+	} else if (e < LDBL_MANT_DIG - 1) {
+		uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
+		if ((u.bits.manl & m) == 0)
+			return (x);	/* x is integral */
+		if (huge + x > 0.0)		/* raise inexact flag */
+			u.bits.manl &= ~m;
+	}
+	return (u.e);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/w_cabs.c b/libm/upstream-freebsd/lib/msun/src/w_cabs.c
new file mode 100644
index 0000000..543b858
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/w_cabs.c
@@ -0,0 +1,23 @@
+/*
+ * cabs() wrapper for hypot().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <complex.h>
+#include <float.h>
+#include <math.h>
+
+double
+cabs(double complex z)
+{
+	return hypot(creal(z), cimag(z));
+}
+
+#if LDBL_MANT_DIG == 53
+__weak_reference(cabs, cabsl);
+#endif
diff --git a/libm/upstream-freebsd/lib/msun/src/w_cabsf.c b/libm/upstream-freebsd/lib/msun/src/w_cabsf.c
new file mode 100644
index 0000000..e7bfe22
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/w_cabsf.c
@@ -0,0 +1,23 @@
+/*
+ * cabsf() wrapper for hypotf().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+  "$FreeBSD$";
+#endif /* not lint */
+
+#include <complex.h>
+#include <math.h>
+#include "math_private.h"
+
+float
+cabsf(z)
+	float complex z;
+{
+
+	return hypotf(crealf(z), cimagf(z));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/w_cabsl.c b/libm/upstream-freebsd/lib/msun/src/w_cabsl.c
new file mode 100644
index 0000000..b715e0c
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/w_cabsl.c
@@ -0,0 +1,20 @@
+/*
+ * cabs() wrapper for hypot().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ *
+ * Modified by Steven G. Kargl for the long double type.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <complex.h>
+#include <math.h>
+
+long double
+cabsl(long double complex z)
+{
+	return hypotl(creall(z), cimagl(z));
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/w_drem.c b/libm/upstream-freebsd/lib/msun/src/w_drem.c
new file mode 100644
index 0000000..0f68409
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/w_drem.c
@@ -0,0 +1,15 @@
+/*
+ * drem() wrapper for remainder().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+
+#include <math.h>
+
+double
+drem(x, y)
+	double x, y;
+{
+	return remainder(x, y);
+}
diff --git a/libm/upstream-freebsd/lib/msun/src/w_dremf.c b/libm/upstream-freebsd/lib/msun/src/w_dremf.c
new file mode 100644
index 0000000..4bfcff2
--- /dev/null
+++ b/libm/upstream-freebsd/lib/msun/src/w_dremf.c
@@ -0,0 +1,16 @@
+/*
+ * dremf() wrapper for remainderf().
+ *
+ * Written by J.T. Conklin, <jtc@wimsey.com>
+ * Placed into the Public Domain, 1994.
+ */
+/* $FreeBSD$ */
+
+#include "math.h"
+#include "math_private.h"
+
+float
+dremf(float x, float y)
+{
+	return remainderf(x, y);
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cacoshl.c b/libm/upstream-netbsd/lib/libm/complex/cacoshl.c
new file mode 100644
index 0000000..4e4e006
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cacoshl.c
@@ -0,0 +1,45 @@
+/* $NetBSD: cacoshl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+
+long double complex
+cacoshl(long double complex z)
+{
+	long double complex w;
+
+#if 0 /* does not give the principal value */
+	w = I * cacosl(z);
+#else
+	w = clogl(z + csqrtl(z + 1) * csqrtl(z - 1));
+#endif
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cacosl.c b/libm/upstream-netbsd/lib/libm/complex/cacosl.c
new file mode 100644
index 0000000..e481158
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cacosl.c
@@ -0,0 +1,45 @@
+/* $NetBSD: cacosl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrl.h"
+
+long double complex
+cacosl(long double complex z)
+{
+	long double complex w;
+
+	w = casinl(z);
+	w = (M_PI_2L - creall(w)) - cimagl(w) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/casinhl.c b/libm/upstream-netbsd/lib/libm/complex/casinhl.c
new file mode 100644
index 0000000..9f74ee9
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/casinhl.c
@@ -0,0 +1,42 @@
+/* $NetBSD: casinhl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+long double complex
+casinhl(long double complex z)
+{
+	long double complex w;
+
+	w = -1.0L * I * casinl(z * I);
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/casinl.c b/libm/upstream-netbsd/lib/libm/complex/casinl.c
new file mode 100644
index 0000000..986a8c0
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/casinl.c
@@ -0,0 +1,120 @@
+/* $NetBSD: casinl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+#ifdef __weak_alias
+__weak_alias(casinl, _casinl)
+#endif
+
+long double complex
+casinl(long double complex z)
+{
+	long double complex w;
+	long double complex ca, ct, zz, z2;
+	long double x, y;
+
+	x = creall(z);
+	y = cimagl(z);
+
+#if 0 /* MD: test is incorrect, casin(>1) is defined */
+	if (y == 0.0L) {
+		if (fabsl(x) > 1.0L) {
+			w = M_PI_2L + 0.0L * I;
+#if 0
+			mtherr ("casinl", DOMAIN);
+#endif
+		} else {
+			w = asinl(x) + 0.0L * I;
+		}
+		return w;
+	}
+#endif
+
+/* Power series expansion */
+/*
+b = cabsl(z);
+if( b < 0.125L )
+{
+z2.r = (x - y) * (x + y);
+z2.i = 2.0L * x * y;
+
+cn = 1.0L;
+n = 1.0L;
+ca.r = x;
+ca.i = y;
+sum.r = x;
+sum.i = y;
+do
+	{
+	ct.r = z2.r * ca.r  -  z2.i * ca.i;
+	ct.i = z2.r * ca.i  +  z2.i * ca.r;
+	ca.r = ct.r;
+	ca.i = ct.i;
+
+	cn *= n;
+	n += 1.0;
+	cn /= n;
+	n += 1.0;
+	b = cn/n;
+
+	ct.r *= b;
+	ct.i *= b;
+	sum.r += ct.r;
+	sum.i += ct.i;
+	b = fabsl(ct.r) + fabsl(ct.i);
+	}
+while( b > MACHEPL );
+w->r = sum.r;
+w->i = sum.i;
+return;
+}
+*/
+
+
+	ca = x + y * I;
+	ct = ca * I;
+	/* sqrtl( 1 - z*z) */
+	/* cmull( &ca, &ca, &zz ) */
+	/*x * x  -  y * y */
+	zz = (x - y) * (x + y) + (2.0L * x * y) * I;
+
+	zz = 1.0L - creall(zz) - cimagl(zz) * I;
+	z2 = csqrtl(zz);
+
+	zz = ct + z2;
+	zz = clogl(zz);
+	/* multiply by 1/i = -i */
+	w = zz * (-1.0L * I);
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/catanhl.c b/libm/upstream-netbsd/lib/libm/complex/catanhl.c
new file mode 100644
index 0000000..4969b70
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/catanhl.c
@@ -0,0 +1,42 @@
+/* $NetBSD: catanhl.c,v 1.3 2014/10/10 12:43:15 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+
+long double complex
+catanhl(long double complex z)
+{
+	long double complex w;
+
+	w = -1.0L * I * catanl(z * I);
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/catanl.c b/libm/upstream-netbsd/lib/libm/complex/catanl.c
new file mode 100644
index 0000000..bdff23f
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/catanl.c
@@ -0,0 +1,80 @@
+/* $NetBSD: catanl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include <float.h>
+#include "cephes_subrl.h"
+
+#ifdef __weak_alias
+__weak_alias(catanl, _catanl)
+#endif
+
+#define MAXNUM LDBL_MAX
+
+long double complex
+catanl(long double complex z)
+{
+	long double complex w;
+	long double a, t, x, x2, y;
+
+	x = creall(z);
+	y = cimagl(z);
+
+	if ((x == 0.0L) && (y > 1.0L))
+		goto ovrf;
+
+	x2 = x * x;
+	a = 1.0L - x2 - (y * y);
+	if (a == 0.0)
+		goto ovrf;
+
+	t = 0.5L * atan2l(2.0L * x, a);
+	w = _redupil(t);
+
+	t = y - 1.0L;
+	a = x2 + (t * t);
+	if (a == 0.0L)
+		goto ovrf;
+
+	t = y + 1.0L;
+	a = (x2 + (t * t))/a;
+	w = w + (0.25L * logl(a)) * I;
+	return w;
+
+ovrf:
+#if 0
+	mtherr ("catanl", OVERFLOW);
+#endif
+	w = MAXNUM + MAXNUM * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/ccoshl.c b/libm/upstream-netbsd/lib/libm/complex/ccoshl.c
new file mode 100644
index 0000000..4c33f9d
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/ccoshl.c
@@ -0,0 +1,46 @@
+/* $NetBSD: ccoshl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+ccoshl(long double complex z)
+{
+	long double complex w;
+	long double x, y;
+
+	x = creall(z);
+	y = cimagl(z);
+	w = coshl(x) * cosl(y) + (sinhl(x) * sinl(y)) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/ccosl.c b/libm/upstream-netbsd/lib/libm/complex/ccosl.c
new file mode 100644
index 0000000..6ce5661
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/ccosl.c
@@ -0,0 +1,46 @@
+/* $NetBSD: ccosl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrl.h"
+
+long double complex
+ccosl(long double complex z)
+{
+	long double complex w;
+	long double ch, sh;
+
+	_cchshl(cimagl(z), &ch, &sh);
+	w = cosl(creall(z)) * ch - (sinl(creall(z)) * sh) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.c b/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.c
new file mode 100644
index 0000000..90dbd86
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.c
@@ -0,0 +1,129 @@
+/* $NetBSD: cephes_subrl.c,v 1.2 2014/10/10 14:06:40 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrl.h"
+
+/* calculate cosh and sinh */
+
+void
+_cchshl(long double x, long double *c, long double *s)
+{
+	long double e, ei;
+
+	if (fabsl(x) <= 0.5L) {
+		*c = coshl(x);
+		*s = sinhl(x);
+	} else {
+		e = expl(x);
+		ei = 0.5L / e;
+		e = 0.5L * e;
+		*s = e - ei;
+		*c = e + ei;
+	}
+}
+
+/* Program to subtract nearest integer multiple of PI */
+
+/* extended precision value of PI: */
+static const long double DP1 = 3.14159265358979323829596852490908531763125L;
+static const long double DP2 = 1.6667485837041756656403424829301998703007e-19L;
+#ifndef __vax__
+static const long double DP3 = 1.8830410776607851167459095484560349402753e-39L;
+#define MACHEPL 1.1e-38L
+#else
+static const long double DP3 = 0L;
+#define MACHEPL 1.1e-19L
+#endif
+
+long double
+_redupil(long double x)
+{
+	long double t;
+	long long i;
+
+	t = x / M_PIL;
+	if (t >= 0.0L)
+		t += 0.5L;
+	else
+		t -= 0.5L;
+
+	i = t;	/* the multiple */
+	t = i;
+	t = ((x - t * DP1) - t * DP2) - t * DP3;
+	return t;
+}
+
+/* Taylor series expansion for cosh(2y) - cos(2x) */
+
+long double
+_ctansl(long double complex z)
+{
+	long double f, x, x2, y, y2, rn, t;
+	long double d;
+
+	x = fabsl(2.0L * creall(z));
+	y = fabsl(2.0L * cimagl(z));
+
+	x = _redupil(x);
+
+	x = x * x;
+	y = y * y;
+	x2 = 1.0;
+	y2 = 1.0;
+	f = 1.0;
+	rn = 0.0;
+	d = 0.0;
+	do {
+		rn += 1.0L;
+		f *= rn;
+		rn += 1.0L;
+		f *= rn;
+		x2 *= x;
+		y2 *= y;
+		t = y2 + x2;
+		t /= f;
+		d += t;
+
+		rn += 1.0L;
+		f *= rn;
+		rn += 1.0L;
+		f *= rn;
+		x2 *= x;
+		y2 *= y;
+		t = y2 - x2;
+		t /= f;
+		d += t;
+	} while (fabsl(t/d) > MACHEPL);
+	return d;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.h b/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.h
new file mode 100644
index 0000000..6354b23
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cephes_subrl.h
@@ -0,0 +1,9 @@
+/* $NetBSD: cephes_subrl.h,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+void _cchshl(long double, long double *, long double *);
+long double _redupil(long double);
+long double _ctansl(long double complex);
+
+#define	M_PIL	3.14159265358979323846264338327950280e+00L
+#define	M_PI_2L	1.57079632679489661923132169163975140e+00L
+
diff --git a/libm/upstream-netbsd/lib/libm/complex/cexpl.c b/libm/upstream-netbsd/lib/libm/complex/cexpl.c
new file mode 100644
index 0000000..a1e2235
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cexpl.c
@@ -0,0 +1,47 @@
+/* $NetBSD: cexpl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+cexpl(long double complex z)
+{
+	long double complex w;
+	long double r, x, y;
+
+	x = creall(z);
+	y = cimagl(z);
+	r = expl(x);
+	w = r * cosl(y) + r * sinl(y) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/clog.c b/libm/upstream-netbsd/lib/libm/complex/clog.c
new file mode 100644
index 0000000..6362c44
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/clog.c
@@ -0,0 +1,47 @@
+/* $NetBSD: clog.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+clog(double complex z)
+{
+	double complex w;
+	double p, rr;
+
+	rr = cabs(z);
+	p = log(rr);
+	rr = atan2(cimag(z), creal(z));
+	w = p + rr * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/clogf.c b/libm/upstream-netbsd/lib/libm/complex/clogf.c
new file mode 100644
index 0000000..c3cdad0
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/clogf.c
@@ -0,0 +1,47 @@
+/* $NetBSD: clogf.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+clogf(float complex z)
+{
+	float complex w;
+	float p, rr;
+
+	rr = cabsf(z);
+	p = logf(rr);
+	rr = atan2f(cimagf(z), crealf(z));
+	w = p + rr * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/clogl.c b/libm/upstream-netbsd/lib/libm/complex/clogl.c
new file mode 100644
index 0000000..11e7a15
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/clogl.c
@@ -0,0 +1,47 @@
+/* $NetBSD: clogl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+clogl(long double complex z)
+{
+	long double complex w;
+	long double p, rr;
+
+	rr = cabsl(z);
+	p = logl(rr);
+	rr = atan2l(cimagl(z), creall(z));
+	w = p + rr * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cpow.c b/libm/upstream-netbsd/lib/libm/complex/cpow.c
new file mode 100644
index 0000000..5bc8d3f
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cpow.c
@@ -0,0 +1,57 @@
+/* $NetBSD: cpow.c,v 1.1 2007/08/20 16:01:35 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+double complex
+cpow(double complex a, double complex z)
+{
+	double complex w;
+	double x, y, r, theta, absa, arga;
+
+	x = creal(z);
+	y = cimag(z);
+	absa = cabs(a);
+	if (absa == 0.0) {
+		return (0.0 + 0.0 * I);
+	}
+	arga = carg(a);
+	r = pow(absa, x);
+	theta = x * arga;
+	if (y != 0.0) {
+		r = r * exp(-y * arga);
+		theta = theta + y * log(absa);
+	}
+	w = r * cos(theta) + (r * sin(theta)) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cpowf.c b/libm/upstream-netbsd/lib/libm/complex/cpowf.c
new file mode 100644
index 0000000..f7af10a
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cpowf.c
@@ -0,0 +1,57 @@
+/* $NetBSD: cpowf.c,v 1.1 2007/08/20 16:01:36 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+float complex
+cpowf(float complex a, float complex z)
+{
+	float complex w;
+	float x, y, r, theta, absa, arga;
+
+	x = crealf(z);
+	y = cimagf(z);
+	absa = cabsf(a);
+	if (absa == 0.0f) {
+		return (0.0f + 0.0f * I);
+	}
+	arga = cargf(a);
+	r = powf(absa, x);
+	theta = x * arga;
+	if (y != 0.0f) {
+		r = r * expf(-y * arga);
+		theta = theta + y * logf(absa);
+	}
+	w = r * cosf(theta) + (r * sinf(theta)) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/cpowl.c b/libm/upstream-netbsd/lib/libm/complex/cpowl.c
new file mode 100644
index 0000000..39336ea
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/cpowl.c
@@ -0,0 +1,57 @@
+/* $NetBSD: cpowl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+cpowl(long double complex a, long double complex z)
+{
+	long double complex w;
+	long double x, y, r, theta, absa, arga;
+
+	x = creall(z);
+	y = cimagl(z);
+	absa = cabsl(a);
+	if (absa == 0.0L) {
+		return (0.0L + 0.0L * I);
+	}
+	arga = cargl(a);
+	r = powl(absa, x);
+	theta = x * arga;
+	if (y != 0.0L) {
+		r = r * expl(-y * arga);
+		theta = theta + y * logl(absa);
+	}
+	w = r * cosl(theta) + (r * sinl(theta)) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/csinhl.c b/libm/upstream-netbsd/lib/libm/complex/csinhl.c
new file mode 100644
index 0000000..b78f7f1
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/csinhl.c
@@ -0,0 +1,46 @@
+/* $NetBSD: csinhl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+csinhl(long double complex z)
+{
+	long double complex w;
+	long double x, y;
+
+	x = creall(z);
+	y = cimagl(z);
+	w = sinhl(x) * cosl(y) + (coshl(x) * sinl(y)) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/csinl.c b/libm/upstream-netbsd/lib/libm/complex/csinl.c
new file mode 100644
index 0000000..c86847b
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/csinl.c
@@ -0,0 +1,46 @@
+/* $NetBSD: csinl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include "cephes_subrl.h"
+
+long double complex
+csinl(long double complex z)
+{
+	long double complex w;
+	long double ch, sh;
+
+	_cchshl(cimagl(z), &ch, &sh);
+	w = sinl(creall(z)) * ch + (cosl(creall(z)) * sh) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/ctanhl.c b/libm/upstream-netbsd/lib/libm/complex/ctanhl.c
new file mode 100644
index 0000000..0894dd0
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/ctanhl.c
@@ -0,0 +1,48 @@
+/* $NetBSD: ctanhl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+
+long double complex
+ctanhl(long double complex z)
+{
+	long double complex w;
+	long double x, y, d;
+
+	x = creall(z);
+	y = cimagl(z);
+	d = coshl(2.0L * x) + cosl(2.0L * y);
+	w = sinhl(2.0L * x) / d  +  (sinl(2.0L * y) / d) * I;
+
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/complex/ctanl.c b/libm/upstream-netbsd/lib/libm/complex/ctanl.c
new file mode 100644
index 0000000..7932aef
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/complex/ctanl.c
@@ -0,0 +1,59 @@
+/* $NetBSD: ctanl.c,v 1.1 2014/10/10 00:48:18 christos Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "../src/namespace.h"
+#include <complex.h>
+#include <math.h>
+#include <float.h>
+#include "cephes_subrl.h"
+
+#define MAXNUM LDBL_MAX
+
+long double complex
+ctanl(long double complex z)
+{
+	long double complex w;
+	long double d;
+
+	d = cosl(2.0L * creall(z)) + coshl(2.0L * cimagl(z));
+
+	if (fabsl(d) < 0.25L)
+		d = _ctansl(z);
+
+	if (d == 0.0L) {
+		/* mtherr ("ctan", OVERFLOW); */
+		w = MAXNUM + MAXNUM * I;
+		return w;
+	}
+
+	w = sinl(2.0L * creall(z)) / d + (sinhl(2.0L * cimagl(z)) / d) * I;
+	return w;
+}
diff --git a/libm/upstream-netbsd/lib/libm/src/namespace.h b/libm/upstream-netbsd/lib/libm/src/namespace.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libm/upstream-netbsd/lib/libm/src/namespace.h
diff --git a/libm/x86/ceil.S b/libm/x86/ceil.S
new file mode 100644
index 0000000..6302037
--- /dev/null
+++ b/libm/x86/ceil.S
@@ -0,0 +1,43 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(ceil)
+	mov    %esp,%eax
+	and    $0xfffffff8,%eax
+	movsd  0x4(%esp),%xmm0
+	roundsd $0x2,%xmm0,%xmm0
+	movlpd %xmm0,-0x8(%eax)
+	fldl   -0x8(%eax)
+	ret
+END(ceil)
+
+ALIAS_SYMBOL(ceill, ceil);
diff --git a/libm/x86/ceilf.S b/libm/x86/ceilf.S
new file mode 100644
index 0000000..51eb440
--- /dev/null
+++ b/libm/x86/ceilf.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(ceilf)
+	movss  0x4(%esp),%xmm0
+	roundss $0x2,%xmm0,%xmm0
+	movss  %xmm0,-0x4(%esp)
+	flds   -0x4(%esp)
+	ret
+END(ceilf)
diff --git a/libm/x86/e_acos.S b/libm/x86/e_acos.S
new file mode 100644
index 0000000..fa61853
--- /dev/null
+++ b/libm/x86/e_acos.S
@@ -0,0 +1,1929 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  To compute acos(s), separate schemes are used when s is in different
+//  intervals.
+//
+//  |s| in [2^{-4}, sqrt(3)/2):
+//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
+//       acos(s)=pi/2-asin(t)-asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
+//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
+//       For the first degree term, r is evaluated as
+//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
+//       (sqrt(1-t^2) read from table)
+//  The main source of error is still R (may still be affected by up to 3 ulps
+//  of rounding error). The table size must be sufficiently large, to minimize
+//  this effect.
+//
+//  |s| in [sqrt(3)/2, 255/256):
+//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
+//       acos(|s|)=asin(t)-asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
+//   acos(-|s|)=pi-acos(|s|)
+//       (The -PI constant, or 0, is added to the result. The sign is set at
+//        the end)
+//       asin(r) evaluated as a polynomial (same as above)
+//       The first degree term is evaluated as
+//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
+//
+//  |s|<2^{-4}: acos(s)=pi/2-asin(s)
+//              evaluate asin(s) as 13-degree polynomial
+//
+//  |s| in [255/256,1): acos(|s|)=2*asin(q), where q=sqrt((1-|s|)/2)
+//  asin(q) is evaluated as 13-degree polynomial
+//      q^2=(1-|s|)/2 is obtained in advance
+//         2*q*eps ~ ((1-|s|)/2-q^2)/q used for first term
+//   acos(-|s|)=pi-acos(|s|)
+//       (The -PI constant, or 0, is added to the result. The sign is set at
+//        the end)
+//
+// Special cases:
+//  acos(NaN) = quiet NaN, and raise invalid exception
+//  acos(INF) = QNaN and raise invalid exception
+//  acos(x) = QNaN and raise invalid exception, for |x|>1.0
+//  acos(1) = +0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function	
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret       
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  acos
+ENTRY(acos)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 48(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        movsd     6048(%ebx), %xmm4
+        movsd     6080(%ebx), %xmm3
+        xorpd     %xmm5, %xmm5
+        movsd     6064(%ebx), %xmm2
+        movapd    %xmm0, %xmm1
+        movsd     %xmm0, 8(%esp)
+        psrlq     $44, %xmm0
+        movd      %xmm0, %edx
+        movapd    %xmm1, %xmm7
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movapd    %xmm1, %xmm0
+        movl      $524287, %eax
+        andl      %edx, %eax
+        subl      $260864, %eax
+        cmpl      $955, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        mulsd     %xmm1, %xmm1
+        andl      $65535, %edx
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andpd     %xmm7, %xmm2
+        andl      $-4, %edx
+        subl      $64256, %edx
+        movsd     3840(%ebx,%edx,2), %xmm1
+        orpd      %xmm5, %xmm2
+        movapd    (%ebx,%edx,4), %xmm4
+        movapd    %xmm7, %xmm6
+        addsd     %xmm2, %xmm7
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm0, %xmm7
+        mulsd     %xmm1, %xmm6
+        mulsd     %xmm2, %xmm3
+        movapd    %xmm6, %xmm1
+        addsd     %xmm3, %xmm6
+        divsd     %xmm6, %xmm7
+        movsd     5976(%ebx), %xmm0
+        movsd     5960(%ebx), %xmm5
+        subsd     %xmm3, %xmm1
+        psrlq     $63, %xmm2
+        movapd    %xmm1, %xmm3
+        psllq     $63, %xmm2
+        mulsd     %xmm1, %xmm1
+        pshufd    $68, %xmm2, %xmm2
+        movsd     5968(%ebx), %xmm6
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm4
+        mulsd     %xmm3, %xmm5
+        subpd     5888(%ebx), %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm3, %xmm0
+        subsd     %xmm4, %xmm5
+        pshufd    $238, %xmm4, %xmm4
+        addsd     %xmm5, %xmm0
+        subsd     %xmm7, %xmm0
+        subsd     %xmm4, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        subl      $955, %eax
+        cmpl      $65, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        psrlq     $38, %xmm7
+        psllq     $38, %xmm7
+        pmovmskb  %xmm0, %eax
+        andnpd    %xmm0, %xmm4
+        subsd     %xmm7, %xmm1
+        movapd    %xmm7, %xmm6
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm6, %xmm0
+        orpd      %xmm4, %xmm5
+        subsd     %xmm7, %xmm3
+        mulsd     %xmm1, %xmm0
+        movapd    %xmm3, %xmm4
+        subsd     %xmm0, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andl      $128, %eax
+        shrl      $7, %eax
+        negl      %eax
+        movapd    %xmm3, %xmm7
+        andpd     %xmm3, %xmm2
+        psllq     $2, %xmm3
+        pextrw    $3, %xmm3, %edx
+        orpd      %xmm5, %xmm2
+        movd      %eax, %xmm3
+        pshufd    $0, %xmm3, %xmm3
+        subl      $65216, %edx
+        addl      %edx, %edx
+        mulsd     3840(%ebx,%edx,4), %xmm7
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm2, %xmm2
+        subsd     %xmm7, %xmm6
+        andpd     5904(%ebx), %xmm3
+        addsd     %xmm1, %xmm6
+        subsd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm7
+        movsd     5960(%ebx), %xmm5
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm7
+        movsd     5976(%ebx), %xmm0
+        divsd     %xmm7, %xmm4
+        movsd     5968(%ebx), %xmm2
+        addpd     (%ebx,%edx,8), %xmm3
+        movapd    %xmm6, %xmm1
+        mulsd     %xmm6, %xmm6
+        mulsd     %xmm6, %xmm0
+        mulsd     %xmm6, %xmm1
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm6, %xmm1
+        addsd     %xmm2, %xmm0
+        pxor      %xmm6, %xmm6
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm5
+        addsd     %xmm5, %xmm0
+        andl      $32768, %eax
+        pinsrw    $3, %eax, %xmm6
+        movapd    %xmm4, %xmm5
+        pshufd    $238, %xmm3, %xmm3
+        addsd     %xmm3, %xmm4
+        subsd     %xmm4, %xmm3
+        addsd     %xmm3, %xmm5
+        addsd     %xmm5, %xmm0
+        addsd     %xmm4, %xmm0
+        xorpd     %xmm6, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        addl      $15291, %eax
+        cmpl      $14336, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        unpcklpd  %xmm0, %xmm0
+        movapd    5984(%ebx), %xmm6
+        unpcklpd  %xmm0, %xmm1
+        movapd    6000(%ebx), %xmm2
+        movapd    6016(%ebx), %xmm4
+        mulpd     %xmm0, %xmm0
+        movapd    5888(%ebx), %xmm5
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm6
+        mulpd     %xmm0, %xmm0
+        movapd    %xmm1, %xmm3
+        mulsd     %xmm1, %xmm1
+        addpd     %xmm2, %xmm6
+        mulpd     %xmm0, %xmm4
+        mulsd     %xmm3, %xmm1
+        addpd     %xmm4, %xmm6
+        pshufd    $238, %xmm5, %xmm0
+        mulpd     %xmm6, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        subsd     %xmm7, %xmm0
+        pshufd    $238, %xmm1, %xmm2
+        subsd     %xmm1, %xmm5
+        subsd     %xmm0, %xmm6
+        subsd     %xmm2, %xmm5
+        subsd     %xmm6, %xmm7
+        subsd     %xmm7, %xmm5
+        addsd     %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_3.0.2:
+        subl      $15356, %eax
+        cmpl      $4, %eax
+        jae       .L_2TAG_PACKET_4.0.2
+        xorpd     %xmm6, %xmm6
+        andpd     6048(%ebx), %xmm7
+        movsd     6096(%ebx), %xmm4
+        movapd    5984(%ebx), %xmm1
+        mulsd     %xmm4, %xmm7
+        movapd    6000(%ebx), %xmm2
+        subsd     %xmm7, %xmm4
+        movapd    6016(%ebx), %xmm3
+        pshufd    $68, %xmm4, %xmm7
+        sqrtsd    %xmm4, %xmm4
+        mulpd     %xmm7, %xmm1
+        pshufd    $68, %xmm7, %xmm5
+        pextrw    $3, %xmm0, %eax
+        mulpd     %xmm7, %xmm7
+        addpd     %xmm1, %xmm2
+        movsd     5936(%ebx), %xmm1
+        mulpd     %xmm7, %xmm3
+        cmpsd     $1, %xmm6, %xmm0
+        mulsd     %xmm5, %xmm7
+        addpd     %xmm3, %xmm2
+        pshufd    $68, %xmm0, %xmm0
+        mulsd     %xmm7, %xmm2
+        andpd     5904(%ebx), %xmm0
+        mulpd     %xmm5, %xmm2
+        andpd     %xmm4, %xmm1
+        pshufd    $68, %xmm4, %xmm3
+        subsd     %xmm1, %xmm4
+        addsd     %xmm3, %xmm3
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm4, %xmm3
+        subsd     %xmm1, %xmm5
+        mulsd     %xmm3, %xmm4
+        pshufd    $238, %xmm3, %xmm3
+        subsd     %xmm4, %xmm5
+        divsd     %xmm3, %xmm5
+        addpd     %xmm3, %xmm3
+        mulpd     %xmm3, %xmm2
+        pshufd    $238, %xmm2, %xmm4
+        addsd     %xmm0, %xmm2
+        andl      $32768, %eax
+        pinsrw    $3, %eax, %xmm6
+        pshufd    $238, %xmm0, %xmm0
+        addsd     %xmm4, %xmm2
+        addsd     %xmm5, %xmm2
+        addsd     %xmm3, %xmm2
+        addsd     %xmm2, %xmm0
+        xorpd     %xmm6, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_4.0.2:
+        addl      $261884, %eax
+        cmpl      $261888, %eax
+        jb        .L_2TAG_PACKET_5.0.2
+        movd      %xmm7, %ecx
+        psrlq     $32, %xmm7
+        movd      %xmm7, %edx
+        andl      $2147483647, %edx
+        movl      $1072693248, %eax
+        subl      %edx, %eax
+        orl       %ecx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_6.0.2
+        movq      8(%esp), %xmm2
+        movd      %xmm2, %edx
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $2147483647, %ecx
+        subl      $1, %edx
+        sbbl      $2146435072, %ecx
+        cmpl      $0, %ecx
+        jge       .L_2TAG_PACKET_7.0.2
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_6.0.2:
+        pextrw    $1, %xmm7, %edx
+        shrl      $15, %edx
+        negl      %edx
+        movd      %edx, %xmm7
+        pshufd    $0, %xmm7, %xmm7
+        movsd     5920(%ebx), %xmm2
+        movsd     5928(%ebx), %xmm0
+        andpd     %xmm7, %xmm2
+        andpd     %xmm7, %xmm0
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_5.0.2:
+        movsd     5888(%ebx), %xmm2
+        movsd     5896(%ebx), %xmm0
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm6, %xmm6
+        addsd     %xmm6, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+.L_2TAG_PACKET_1.0.2:
+        movl      48(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(acos)
+# -- End  acos
+
+# Start file scope ASM
+ALIAS_SYMBOL(acosl, acos);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	3822952792
+	.long	1021639372
+	.long	182792448
+	.long	1068507836
+	.long	2264213271
+	.long	1019558908
+	.long	649052928
+	.long	1068524253
+	.long	1797139609
+	.long	1022295143
+	.long	1243095296
+	.long	1068540671
+	.long	1415938756
+	.long	1021439537
+	.long	2033294592
+	.long	1068557090
+	.long	2356809978
+	.long	1021777916
+	.long	3088063744
+	.long	1068573510
+	.long	2669055318
+	.long	1022124482
+	.long	180888576
+	.long	1068589932
+	.long	3566445325
+	.long	1021358712
+	.long	1970196992
+	.long	1068606354
+	.long	896980323
+	.long	1021319659
+	.long	4229555456
+	.long	1068622777
+	.long	436049712
+	.long	1021319758
+	.long	2732572160
+	.long	1068639202
+	.long	583123209
+	.long	1020797960
+	.long	1842831872
+	.long	1068655628
+	.long	1370449804
+	.long	1021429270
+	.long	1628994560
+	.long	1068672055
+	.long	2411391464
+	.long	1021057980
+	.long	2159763712
+	.long	1068688483
+	.long	1208692749
+	.long	1021943903
+	.long	3503886336
+	.long	1068704912
+	.long	538793309
+	.long	1019744063
+	.long	1435187200
+	.long	1068721343
+	.long	4085087612
+	.long	1020608419
+	.long	317469952
+	.long	1068737775
+	.long	144386942
+	.long	1021440732
+	.long	219617280
+	.long	1068754208
+	.long	2940088361
+	.long	1019981122
+	.long	1210558208
+	.long	1068770642
+	.long	2176850347
+	.long	1018373705
+	.long	3359268352
+	.long	1068787077
+	.long	2395611454
+	.long	1021889042
+	.long	2439803648
+	.long	1068803514
+	.long	1650705253
+	.long	1020227966
+	.long	2816203520
+	.long	1068819952
+	.long	3702166386
+	.long	1019379914
+	.long	262620672
+	.long	1068836392
+	.long	1855649370
+	.long	1020453124
+	.long	3438159616
+	.long	1068852832
+	.long	923063860
+	.long	1019273834
+	.long	3822105856
+	.long	1068869274
+	.long	4289947947
+	.long	1019434249
+	.long	1483729920
+	.long	1068885718
+	.long	787455814
+	.long	1020738379
+	.long	787321088
+	.long	1068902163
+	.long	3321653337
+	.long	1021842569
+	.long	1802253312
+	.long	1068918609
+	.long	2653633526
+	.long	1021821525
+	.long	302985984
+	.long	1068935057
+	.long	161272028
+	.long	1021655149
+	.long	653966080
+	.long	1068951506
+	.long	2566098667
+	.long	1020066219
+	.long	2924727296
+	.long	1068967956
+	.long	3646493722
+	.long	1014292285
+	.long	2889890304
+	.long	1068984408
+	.long	1081009196
+	.long	1022189620
+	.long	619098112
+	.long	1069000862
+	.long	4011643355
+	.long	1021773297
+	.long	477017600
+	.long	1069017317
+	.long	4030305534
+	.long	1021292252
+	.long	2533403904
+	.long	1069033773
+	.long	2645187591
+	.long	1019527099
+	.long	2563102208
+	.long	1069050231
+	.long	3857293792
+	.long	1022311697
+	.long	635982336
+	.long	1069066691
+	.long	3625936637
+	.long	1017511744
+	.long	1116940800
+	.long	1069083152
+	.long	3653872993
+	.long	1022016631
+	.long	4075964160
+	.long	1069099614
+	.long	2468900271
+	.long	1021769532
+	.long	993165568
+	.long	1069116079
+	.long	1358104224
+	.long	1021199776
+	.long	528586752
+	.long	1069132545
+	.long	2200950332
+	.long	1022024872
+	.long	2752395776
+	.long	1069149012
+	.long	3197072454
+	.long	1017751319
+	.long	3439855616
+	.long	1069165481
+	.long	1651081806
+	.long	1020809338
+	.long	2661257728
+	.long	1069181952
+	.long	539032752
+	.long	1021728805
+	.long	486957312
+	.long	1069198425
+	.long	3136045149
+	.long	1016888671
+	.long	1282340352
+	.long	1069214899
+	.long	2593963259
+	.long	1018956103
+	.long	822921728
+	.long	1069231375
+	.long	2146032737
+	.long	1022306465
+	.long	3474216192
+	.long	1069247852
+	.long	3976811625
+	.long	1021350207
+	.long	716902656
+	.long	1069264332
+	.long	718267222
+	.long	1018624727
+	.long	1211594496
+	.long	1069280813
+	.long	1485641389
+	.long	1018447451
+	.long	734070272
+	.long	1069297296
+	.long	354455128
+	.long	1021341291
+	.long	3650110720
+	.long	1069313780
+	.long	682185947
+	.long	1021651853
+	.long	1440663040
+	.long	1069330267
+	.long	3558574550
+	.long	1021615110
+	.long	2766612224
+	.long	1069346755
+	.long	874607978
+	.long	1017746872
+	.long	3404011008
+	.long	1069363245
+	.long	4154988502
+	.long	1021439906
+	.long	3423949056
+	.long	1069379737
+	.long	2263202309
+	.long	1021479615
+	.long	2897587712
+	.long	1069396231
+	.long	2562065031
+	.long	1022090363
+	.long	1896159232
+	.long	1069412727
+	.long	3836237663
+	.long	1019867288
+	.long	490968576
+	.long	1069429225
+	.long	3322056743
+	.long	1006752762
+	.long	3048360192
+	.long	1069445724
+	.long	1152314833
+	.long	1013122252
+	.long	1049850624
+	.long	1069462226
+	.long	3601590727
+	.long	1022214610
+	.long	3156899584
+	.long	1069478729
+	.long	1855169970
+	.long	1019487271
+	.long	851173376
+	.long	1069495235
+	.long	312649594
+	.long	1020868604
+	.long	2794281728
+	.long	1069511742
+	.long	1093490181
+	.long	1020777577
+	.long	468042496
+	.long	1069528252
+	.long	1152540679
+	.long	1021403732
+	.long	2534219264
+	.long	1069544763
+	.long	2292126035
+	.long	1021872430
+	.long	1376146432
+	.long	1069558527
+	.long	3293753641
+	.long	1020500454
+	.long	4175442432
+	.long	1069575044
+	.long	3626347564
+	.long	1021610969
+	.long	3523113472
+	.long	1069591566
+	.long	339956500
+	.long	1021119039
+	.long	4003350528
+	.long	1069608092
+	.long	3429333082
+	.long	1022813542
+	.long	1611067392
+	.long	1069624623
+	.long	2298017544
+	.long	1021977587
+	.long	931782144
+	.long	1069641158
+	.long	2164684743
+	.long	1021250988
+	.long	2256725504
+	.long	1069657697
+	.long	1138762335
+	.long	1021443776
+	.long	1582853120
+	.long	1069674241
+	.long	1084010382
+	.long	1022994693
+	.long	3497758720
+	.long	1069690789
+	.long	406366244
+	.long	1022713586
+	.long	3999816960
+	.long	1069707342
+	.long	1488723042
+	.long	1023381290
+	.long	3383096064
+	.long	1069723900
+	.long	2541558953
+	.long	1019137887
+	.long	1942403584
+	.long	1069740463
+	.long	1879620343
+	.long	1022653642
+	.long	4268263680
+	.long	1069757030
+	.long	3039077047
+	.long	1022252545
+	.long	2067062272
+	.long	1069773603
+	.long	4190670677
+	.long	1020725863
+	.long	4225828096
+	.long	1069790180
+	.long	1998567321
+	.long	1022014385
+	.long	2452507136
+	.long	1069806763
+	.long	1511628873
+	.long	1021900300
+	.long	1340746240
+	.long	1069823351
+	.long	788367341
+	.long	1022726208
+	.long	1190035456
+	.long	1069839944
+	.long	3856337230
+	.long	1021834118
+	.long	2300688384
+	.long	1069856542
+	.long	3211396579
+	.long	1022621365
+	.long	678886400
+	.long	1069873146
+	.long	4001011887
+	.long	1022042646
+	.long	921594112
+	.long	1069889755
+	.long	557811968
+	.long	1023065533
+	.long	3331668992
+	.long	1069906369
+	.long	1877060679
+	.long	1022419742
+	.long	3917875200
+	.long	1069922989
+	.long	1181055171
+	.long	1022752712
+	.long	2984829696
+	.long	1069939615
+	.long	4294526932
+	.long	1021499988
+	.long	838049024
+	.long	1069956247
+	.long	3658081878
+	.long	1022957952
+	.long	2078928384
+	.long	1069972884
+	.long	820353701
+	.long	1019391107
+	.long	2719854336
+	.long	1069989527
+	.long	1644022489
+	.long	1023378240
+	.long	3069117696
+	.long	1070006176
+	.long	2771393702
+	.long	1019319954
+	.long	3435962368
+	.long	1070022831
+	.long	3876394145
+	.long	1023024433
+	.long	4130595328
+	.long	1070039492
+	.long	1630447748
+	.long	1021465882
+	.long	1169236224
+	.long	1070056160
+	.long	2828355997
+	.long	1020458120
+	.long	3453997312
+	.long	1070072833
+	.long	164091641
+	.long	1020388279
+	.long	2708127744
+	.long	1070089513
+	.long	3036550223
+	.long	1023328684
+	.long	3540797696
+	.long	1070106199
+	.long	3710949463
+	.long	1022568805
+	.long	1972276736
+	.long	1070122892
+	.long	3885277950
+	.long	1019761674
+	.long	2613815552
+	.long	1070139591
+	.long	2764165077
+	.long	1022921023
+	.long	1487791616
+	.long	1070156297
+	.long	1330644769
+	.long	1023162679
+	.long	3207593472
+	.long	1070173009
+	.long	3911007221
+	.long	1022993496
+	.long	3797764608
+	.long	1070189728
+	.long	979712598
+	.long	1022554580
+	.long	3578920448
+	.long	1070206454
+	.long	2825738223
+	.long	1020223708
+	.long	2872795648
+	.long	1070223187
+	.long	392451124
+	.long	1022666279
+	.long	2002258432
+	.long	1070239927
+	.long	3730407632
+	.long	1023148291
+	.long	1291326464
+	.long	1070256674
+	.long	3723802980
+	.long	1022514089
+	.long	1065180928
+	.long	1070273428
+	.long	2635617463
+	.long	1022654470
+	.long	1650181632
+	.long	1070290189
+	.long	2061982883
+	.long	1022853411
+	.long	3373882880
+	.long	1070306957
+	.long	319732785
+	.long	1022017175
+	.long	2270081280
+	.long	1070323733
+	.long	2237757411
+	.long	1023064087
+	.long	2963732736
+	.long	1070340516
+	.long	468839165
+	.long	1023293774
+	.long	1491099904
+	.long	1070357307
+	.long	1502657946
+	.long	1021533479
+	.long	2479636480
+	.long	1070374105
+	.long	482913562
+	.long	1021986286
+	.long	1968133632
+	.long	1070390911
+	.long	3281474337
+	.long	1022646400
+	.long	291639040
+	.long	1070407725
+	.long	2453320259
+	.long	1022812423
+	.long	2081472512
+	.long	1070424546
+	.long	2939989570
+	.long	1023091888
+	.long	3380340480
+	.long	1070441375
+	.long	2850707499
+	.long	1021921109
+	.long	232287488
+	.long	1070458213
+	.long	3674625342
+	.long	1020725130
+	.long	1567614208
+	.long	1070475058
+	.long	9347334
+	.long	1022024009
+	.long	3433091072
+	.long	1070491911
+	.long	282524999
+	.long	1021433523
+	.long	1876877312
+	.long	1070508773
+	.long	3470449440
+	.long	1019309721
+	.long	1538472192
+	.long	1070525643
+	.long	2089486825
+	.long	1019698916
+	.long	2763830784
+	.long	1070542521
+	.long	443498115
+	.long	1020505194
+	.long	1605381632
+	.long	1070559408
+	.long	3018871601
+	.long	1022869913
+	.long	2706946048
+	.long	1070576303
+	.long	3936260892
+	.long	1023175875
+	.long	2123887360
+	.long	1070593207
+	.long	2994220655
+	.long	1022825948
+	.long	104015104
+	.long	1070603108
+	.long	335054493
+	.long	1023441853
+	.long	2904568832
+	.long	1070615800
+	.long	1451215633
+	.long	1023853857
+	.long	3456197120
+	.long	1070632739
+	.long	436334733
+	.long	1024026432
+	.long	252452352
+	.long	1070649697
+	.long	34596167
+	.long	1024031396
+	.long	3328018432
+	.long	1070666672
+	.long	2644547073
+	.long	1024296758
+	.long	1255829248
+	.long	1070683667
+	.long	552832586
+	.long	1023763122
+	.long	4097058560
+	.long	1070700680
+	.long	1955640623
+	.long	1021394654
+	.long	451770112
+	.long	1070717714
+	.long	3428903777
+	.long	1022941142
+	.long	408920832
+	.long	1070734767
+	.long	165503263
+	.long	1023894958
+	.long	1186960640
+	.long	1070751840
+	.long	435826450
+	.long	1024026134
+	.long	19078656
+	.long	1070768934
+	.long	1834169749
+	.long	1022899284
+	.long	2743490304
+	.long	1070786048
+	.long	494581074
+	.long	1018818479
+	.long	2328961024
+	.long	1070803184
+	.long	2987908834
+	.long	1022581110
+	.long	350011392
+	.long	1070820342
+	.long	240771184
+	.long	1024143083
+	.long	2692326912
+	.long	1070837521
+	.long	666056837
+	.long	1022394776
+	.long	2373274368
+	.long	1070854723
+	.long	2484337770
+	.long	1024228156
+	.long	1017131520
+	.long	1070871948
+	.long	3285648279
+	.long	1024025789
+	.long	265558272
+	.long	1070889196
+	.long	392241896
+	.long	1024252809
+	.long	1778008064
+	.long	1070906467
+	.long	1536107943
+	.long	1023949300
+	.long	2937184768
+	.long	1070923762
+	.long	3541062251
+	.long	1019448646
+	.long	1144442880
+	.long	1070941082
+	.long	3691683781
+	.long	1022123948
+	.long	2410165504
+	.long	1070958426
+	.long	1804181960
+	.long	1023945221
+	.long	4174350848
+	.long	1070975795
+	.long	2016094861
+	.long	1021716585
+	.long	3897012480
+	.long	1070993190
+	.long	175294410
+	.long	1023703404
+	.long	3353623040
+	.long	1071010611
+	.long	167973242
+	.long	1023240839
+	.long	45671168
+	.long	1071028059
+	.long	2166856113
+	.long	1021565413
+	.long	86063872
+	.long	1071045533
+	.long	2676254727
+	.long	1023985299
+	.long	1019772672
+	.long	1071063034
+	.long	989043593
+	.long	1021549587
+	.long	414297344
+	.long	1071080563
+	.long	3960972046
+	.long	1024307251
+	.long	155173120
+	.long	1071098120
+	.long	1830919291
+	.long	1021592251
+	.long	2151562240
+	.long	1071115705
+	.long	405408666
+	.long	1023423128
+	.long	4041854720
+	.long	1071133319
+	.long	2043497827
+	.long	1024411503
+	.long	3489224192
+	.long	1071150963
+	.long	3072215864
+	.long	1022698635
+	.long	2477196288
+	.long	1071168637
+	.long	1812195139
+	.long	1022689192
+	.long	3015298816
+	.long	1071186341
+	.long	764841969
+	.long	1021027331
+	.long	2844731136
+	.long	1071204076
+	.long	2878117321
+	.long	1019116513
+	.long	4028950528
+	.long	1071221842
+	.long	698911452
+	.long	1023265602
+	.long	69441536
+	.long	1071239641
+	.long	3253467847
+	.long	1020795075
+	.long	1676209920
+	.long	1071257471
+	.long	4272431167
+	.long	1022873982
+	.long	2408752384
+	.long	1071275334
+	.long	648519100
+	.long	1024385717
+	.long	151623680
+	.long	1071293231
+	.long	345257017
+	.long	1019561408
+	.long	1410154240
+	.long	1071311161
+	.long	197863993
+	.long	1023224207
+	.long	4131351552
+	.long	1071329125
+	.long	2620801789
+	.long	1024411169
+	.long	1999664384
+	.long	1071347125
+	.long	3952692616
+	.long	1024168086
+	.long	1617668864
+	.long	1071365160
+	.long	3019889809
+	.long	1021907692
+	.long	1032074240
+	.long	1071383231
+	.long	59469899
+	.long	1023656194
+	.long	2619492096
+	.long	1071401338
+	.long	1417526820
+	.long	1021457783
+	.long	202429440
+	.long	1071419483
+	.long	2927667935
+	.long	1019175447
+	.long	525044224
+	.long	1071437665
+	.long	38166811
+	.long	1023981879
+	.long	1779258880
+	.long	1071455885
+	.long	481252500
+	.long	1023310234
+	.long	2195673600
+	.long	1071474144
+	.long	3962395981
+	.long	1021339088
+	.long	44573696
+	.long	1071492443
+	.long	3936281395
+	.long	1023014829
+	.long	2226905344
+	.long	1071510781
+	.long	1515320476
+	.long	1024320623
+	.long	2800512512
+	.long	1071529160
+	.long	1225403697
+	.long	1021081846
+	.long	161113600
+	.long	1071547581
+	.long	3064809733
+	.long	1024173917
+	.long	1338410240
+	.long	1071566043
+	.long	2027604973
+	.long	1024362526
+	.long	522433280
+	.long	1071584548
+	.long	2055171723
+	.long	1023858825
+	.long	539595776
+	.long	1071603096
+	.long	3868820135
+	.long	1022936424
+	.long	4264017664
+	.long	1071621687
+	.long	3228065145
+	.long	1023479578
+	.long	1733924096
+	.long	1071640324
+	.long	3511934475
+	.long	1022496355
+	.long	108880384
+	.long	1071651839
+	.long	615880967
+	.long	1023519706
+	.long	3517856512
+	.long	1071661202
+	.long	3113108559
+	.long	1025190289
+	.long	4043153152
+	.long	1071670589
+	.long	1571836218
+	.long	1023106116
+	.long	3251299072
+	.long	1071680000
+	.long	3444076102
+	.long	1022187841
+	.long	2736921600
+	.long	1071689435
+	.long	272771483
+	.long	1025095280
+	.long	3897698560
+	.long	1071703633
+	.long	2075390188
+	.long	1022489022
+	.long	3209485056
+	.long	1071722652
+	.long	1438094065
+	.long	1021844944
+	.long	3781432064
+	.long	1071741774
+	.long	1675017145
+	.long	1024143828
+	.long	2684184064
+	.long	1071761003
+	.long	2259963753
+	.long	1024731393
+	.long	1840489728
+	.long	1071780342
+	.long	3372883597
+	.long	1023431408
+	.long	3764087808
+	.long	1071799794
+	.long	3307523102
+	.long	1024485788
+	.long	3006232320
+	.long	1071819364
+	.long	3088971966
+	.long	1025213251
+	.long	3374881280
+	.long	1071839055
+	.long	834437749
+	.long	1025236452
+	.long	797284864
+	.long	1071858872
+	.long	3122663941
+	.long	1025320473
+	.long	545765120
+	.long	1071878818
+	.long	826539625
+	.long	1022450955
+	.long	107562240
+	.long	1071898898
+	.long	339584600
+	.long	1022481255
+	.long	2123649024
+	.long	1071919116
+	.long	3912959833
+	.long	1024321009
+	.long	1562385664
+	.long	1071939478
+	.long	2846067230
+	.long	1023343981
+	.long	2963085824
+	.long	1071959988
+	.long	954548627
+	.long	1021475211
+	.long	3325550592
+	.long	1071980652
+	.long	3459651155
+	.long	1025305573
+	.long	775752448
+	.long	1072001476
+	.long	3582746667
+	.long	1023859460
+	.long	3238590720
+	.long	1072022464
+	.long	634636162
+	.long	1024472353
+	.long	2758801920
+	.long	1072043624
+	.long	3078216319
+	.long	1025304516
+	.long	1370319104
+	.long	1072064962
+	.long	2570569078
+	.long	1025099442
+	.long	2615805184
+	.long	1072086484
+	.long	3729933412
+	.long	1024605112
+	.long	3077336576
+	.long	1072108198
+	.long	1948916066
+	.long	1024781603
+	.long	1099528192
+	.long	1072130112
+	.long	3139143157
+	.long	1023729360
+	.long	1231903232
+	.long	1072152233
+	.long	1349513477
+	.long	1024737515
+	.long	1507504128
+	.long	1072174570
+	.long	3484516322
+	.long	1024000959
+	.long	2214659840
+	.long	1072197132
+	.long	2563820917
+	.long	1025225535
+	.long	1804739840
+	.long	1072219929
+	.long	760038746
+	.long	1024482855
+	.long	1413746688
+	.long	1072242971
+	.long	3401734714
+	.long	1025129838
+	.long	821409536
+	.long	1072266269
+	.long	3729772551
+	.long	1025484796
+	.long	3031825664
+	.long	1072289834
+	.long	122256749
+	.long	1024752594
+	.long	1710784256
+	.long	1072313680
+	.long	1518205483
+	.long	1024724809
+	.long	3025265152
+	.long	1072337819
+	.long	409951989
+	.long	1022835555
+	.long	287769088
+	.long	1072362267
+	.long	800355594
+	.long	1022484850
+	.long	198179840
+	.long	1072387038
+	.long	3502926213
+	.long	1024209373
+	.long	1909130496
+	.long	1072412149
+	.long	3064694319
+	.long	1025380823
+	.long	1941732096
+	.long	1072437619
+	.long	4112930390
+	.long	1024294679
+	.long	3492010496
+	.long	1072463467
+	.long	2684918107
+	.long	1023220233
+	.long	81959680
+	.long	1072489716
+	.long	220021366
+	.long	1020635131
+	.long	2297837056
+	.long	1072516387
+	.long	4027683826
+	.long	1021041185
+	.long	270404096
+	.long	1072543508
+	.long	2012766065
+	.long	1021780753
+	.long	3667376896
+	.long	1072571105
+	.long	2727981522
+	.long	1023009874
+	.long	330400256
+	.long	1072599212
+	.long	2940017003
+	.long	1025393439
+	.long	1119293952
+	.long	1072627861
+	.long	1608550416
+	.long	1022675612
+	.long	3536155904
+	.long	1072657091
+	.long	349665778
+	.long	1025156751
+	.long	3078046720
+	.long	1072686946
+	.long	2016159996
+	.long	1022193169
+	.long	455228416
+	.long	1072705361
+	.long	1908539328
+	.long	1026126332
+	.long	1871505664
+	.long	1072720988
+	.long	2784700894
+	.long	1025922277
+	.long	1630994432
+	.long	1072737010
+	.long	361107678
+	.long	1022887244
+	.long	2084558336
+	.long	1072753462
+	.long	2642784509
+	.long	1072689083
+	.long	1514442531
+	.long	1072688953
+	.long	333108933
+	.long	1072688821
+	.long	3392112024
+	.long	1072688686
+	.long	2099852862
+	.long	1072688550
+	.long	749609004
+	.long	1072688412
+	.long	3634632596
+	.long	1072688271
+	.long	2163248461
+	.long	1072688129
+	.long	628657846
+	.long	1072687985
+	.long	3324036511
+	.long	1072687838
+	.long	1657632815
+	.long	1072687690
+	.long	4217538760
+	.long	1072687539
+	.long	2411951597
+	.long	1072687387
+	.long	533944872
+	.long	1072687233
+	.long	2876566508
+	.long	1072687076
+	.long	847936891
+	.long	1072686918
+	.long	3036019913
+	.long	1072686757
+	.long	848884575
+	.long	1072686595
+	.long	2874443326
+	.long	1072686430
+	.long	520713666
+	.long	1072686264
+	.long	2375556481
+	.long	1072686095
+	.long	4141904948
+	.long	1072685924
+	.long	1522666382
+	.long	1072685752
+	.long	3105624104
+	.long	1072685577
+	.long	298666327
+	.long	1072685401
+	.long	1689524500
+	.long	1072685222
+	.long	2981002200
+	.long	1072685041
+	.long	4170844284
+	.long	1072684858
+	.long	961802263
+	.long	1072684674
+	.long	1941503454
+	.long	1072684487
+	.long	2812647170
+	.long	1072684298
+	.long	3572873869
+	.long	1072684107
+	.long	4219797823
+	.long	1072683914
+	.long	456039788
+	.long	1072683720
+	.long	869096151
+	.long	1072683523
+	.long	1161535119
+	.long	1072683324
+	.long	1330865866
+	.long	1072683123
+	.long	1374571204
+	.long	1072682920
+	.long	1290107538
+	.long	1072682715
+	.long	1074904836
+	.long	1072682508
+	.long	726366587
+	.long	1072682299
+	.long	241869763
+	.long	1072682088
+	.long	3913732079
+	.long	1072681874
+	.long	3149342765
+	.long	1072681659
+	.long	2240966306
+	.long	1072681442
+	.long	1185873216
+	.long	1072681223
+	.long	4276274591
+	.long	1072681001
+	.long	2919452883
+	.long	1072680778
+	.long	1407565635
+	.long	1072680553
+	.long	4032743551
+	.long	1072680325
+	.long	2202188565
+	.long	1072680096
+	.long	207977577
+	.long	1072679865
+	.long	2342160518
+	.long	1072679631
+	.long	11858423
+	.long	1072679396
+	.long	1804034453
+	.long	1072679158
+	.long	3420722787
+	.long	1072678918
+	.long	563930456
+	.long	1072678677
+	.long	1820539192
+	.long	1072678433
+	.long	2892501606
+	.long	1072678187
+	.long	3776710320
+	.long	1072677939
+	.long	175063337
+	.long	1072677690
+	.long	674333171
+	.long	1072677438
+	.long	976363026
+	.long	1072677184
+	.long	1077935934
+	.long	1072676928
+	.long	1921075490
+	.long	1072676540
+	.long	881493302
+	.long	1072676016
+	.long	3275752439
+	.long	1072675483
+	.long	486855588
+	.long	1072674943
+	.long	1077229111
+	.long	1072674394
+	.long	723950308
+	.long	1072673837
+	.long	3693582199
+	.long	1072673271
+	.long	1367335316
+	.long	1072672698
+	.long	2305837020
+	.long	1072672116
+	.long	2184358641
+	.long	1072671526
+	.long	972682840
+	.long	1072670928
+	.long	2935101762
+	.long	1072670321
+	.long	3745513263
+	.long	1072669706
+	.long	3372320886
+	.long	1072669083
+	.long	1783464620
+	.long	1072668452
+	.long	3241386215
+	.long	1072667812
+	.long	3418125284
+	.long	1072667164
+	.long	2280219148
+	.long	1072666508
+	.long	4088700758
+	.long	1072665843
+	.long	219227400
+	.long	1072665171
+	.long	3521816918
+	.long	1072664489
+	.long	1076205279
+	.long	1072663800
+	.long	1436484616
+	.long	1072663102
+	.long	271362610
+	.long	1072662396
+	.long	1838996688
+	.long	1072661681
+	.long	1807122518
+	.long	1072660958
+	.long	137953542
+	.long	1072660227
+	.long	1088178584
+	.long	1072659487
+	.long	324057537
+	.long	1072658739
+	.long	2101288076
+	.long	1072657982
+	.long	2085133974
+	.long	1072657217
+	.long	235324451
+	.long	1072656444
+	.long	806051592
+	.long	1072655662
+	.long	3756033140
+	.long	1072654871
+	.long	453542543
+	.long	1072654073
+	.long	3741177327
+	.long	1072653265
+	.long	691216109
+	.long	1072652450
+	.long	4145223372
+	.long	1072651625
+	.long	1174439091
+	.long	1072650793
+	.long	324416139
+	.long	1072649952
+	.long	1550246310
+	.long	1072649102
+	.long	511524674
+	.long	1072648244
+	.long	1457248482
+	.long	1072647377
+	.long	45944955
+	.long	1072646502
+	.long	525537397
+	.long	1072645618
+	.long	2848440188
+	.long	1072644725
+	.long	2671555633
+	.long	1072643824
+	.long	4241172637
+	.long	1072642914
+	.long	3213094278
+	.long	1072641996
+	.long	3832503688
+	.long	1072641069
+	.long	1754091534
+	.long	1072640134
+	.long	1221921804
+	.long	1072639190
+	.long	2184526489
+	.long	1072638237
+	.long	294902089
+	.long	1072637276
+	.long	4090375270
+	.long	1072636305
+	.long	632860906
+	.long	1072635327
+	.long	2753498702
+	.long	1072634339
+	.long	1808009252
+	.long	1072633343
+	.long	2036428672
+	.long	1072632338
+	.long	3383235626
+	.long	1072631324
+	.long	1497347484
+	.long	1072630302
+	.long	617018317
+	.long	1072629271
+	.long	684933058
+	.long	1072628231
+	.long	1643170798
+	.long	1072627182
+	.long	3011066360
+	.long	1072625592
+	.long	957158713
+	.long	1072623442
+	.long	1390907941
+	.long	1072621256
+	.long	3819155270
+	.long	1072619034
+	.long	3443571196
+	.long	1072616777
+	.long	4045412458
+	.long	1072614484
+	.long	805503923
+	.long	1072612156
+	.long	1778922015
+	.long	1072609791
+	.long	2125033665
+	.long	1072607390
+	.long	1287203863
+	.long	1072604953
+	.long	2992629568
+	.long	1072602479
+	.long	2367267127
+	.long	1072599969
+	.long	3115526047
+	.long	1072597422
+	.long	340219539
+	.long	1072594839
+	.long	2017215719
+	.long	1072592218
+	.long	3225443424
+	.long	1072589560
+	.long	3326565673
+	.long	1072586865
+	.long	1669811211
+	.long	1072584133
+	.long	1886735022
+	.long	1072581363
+	.long	3301071171
+	.long	1072578555
+	.long	928514283
+	.long	1072575710
+	.long	2656364059
+	.long	1072572826
+	.long	3473490507
+	.long	1072569904
+	.long	2649965606
+	.long	1072566944
+	.long	3736819052
+	.long	1072563945
+	.long	1680885175
+	.long	1072560908
+	.long	4413771
+	.long	1072557832
+	.long	2214869753
+	.long	1072554716
+	.long	3214725184
+	.long	1072551561
+	.long	2186079903
+	.long	1072548367
+	.long	2590372131
+	.long	1072545133
+	.long	3578146079
+	.long	1072541859
+	.long	4283712755
+	.long	1072538545
+	.long	3824834510
+	.long	1072535191
+	.long	1302400298
+	.long	1072531797
+	.long	95058636
+	.long	1072528362
+	.long	3563906063
+	.long	1072524885
+	.long	2167230730
+	.long	1072521368
+	.long	3524918334
+	.long	1072517809
+	.long	2353304918
+	.long	1072514209
+	.long	1939625839
+	.long	1072510567
+	.long	1256714581
+	.long	1072506883
+	.long	3552525848
+	.long	1072503156
+	.long	3464809522
+	.long	1072499387
+	.long	4200542593
+	.long	1072495575
+	.long	355609124
+	.long	1072491721
+	.long	3684139099
+	.long	1072487822
+	.long	148355918
+	.long	1072483881
+	.long	1457689242
+	.long	1072479895
+	.long	2118591596
+	.long	1072475865
+	.long	908848089
+	.long	1072471791
+	.long	877032689
+	.long	1072467672
+	.long	752012304
+	.long	1072463508
+	.long	3532301749
+	.long	1072459298
+	.long	3600563221
+	.long	1072455043
+	.long	3902857084
+	.long	1072450742
+	.long	3063101036
+	.long	1072446395
+	.long	3972344374
+	.long	1072442001
+	.long	903183549
+	.long	1072437561
+	.long	983892938
+	.long	1072433073
+	.long	2722858568
+	.long	1072428537
+	.long	302790515
+	.long	1072423954
+	.long	759811057
+	.long	1072419322
+	.long	2507809922
+	.long	1072414641
+	.long	2388408813
+	.long	1072407528
+	.long	2084492942
+	.long	1072397870
+	.long	2435703301
+	.long	1072388010
+	.long	1935433360
+	.long	1072377945
+	.long	2742047290
+	.long	1072367671
+	.long	2053284205
+	.long	1072357185
+	.long	657783367
+	.long	1072346483
+	.long	2893664841
+	.long	1072335560
+	.long	3718906405
+	.long	1072324413
+	.long	1547896303
+	.long	1072313038
+	.long	2494058440
+	.long	1072301429
+	.long	3133238742
+	.long	1072289582
+	.long	3327000086
+	.long	1072277492
+	.long	1860667274
+	.long	1072265154
+	.long	665340747
+	.long	1072252562
+	.long	443347841
+	.long	1072239710
+	.long	581282618
+	.long	1072226592
+	.long	3349780465
+	.long	1072213201
+	.long	914217606
+	.long	1072199532
+	.long	989797661
+	.long	1072185576
+	.long	945436416
+	.long	1072171326
+	.long	549291300
+	.long	1072156774
+	.long	1814636389
+	.long	1072141911
+	.long	239092858
+	.long	1072126729
+	.long	1794680724
+	.long	1072111217
+	.long	1241534678
+	.long	1072095366
+	.long	3366566214
+	.long	1072079164
+	.long	1244090828
+	.long	1072062601
+	.long	1708448120
+	.long	1072045663
+	.long	3544260650
+	.long	1072028337
+	.long	1402741403
+	.long	1072010610
+	.long	2551936888
+	.long	1071992465
+	.long	617669739
+	.long	1071973887
+	.long	794002186
+	.long	1071954857
+	.long	2021237693
+	.long	1071935356
+	.long	540450384
+	.long	1071915364
+	.long	1920555537
+	.long	1071894857
+	.long	2879585206
+	.long	1071873811
+	.long	3000237455
+	.long	1071852199
+	.long	3352974346
+	.long	1071829991
+	.long	569629937
+	.long	1071807155
+	.long	2077237208
+	.long	1071783653
+	.long	2284891805
+	.long	1071759446
+	.long	1226651784
+	.long	1071734489
+	.long	1102047405
+	.long	1071708731
+	.long	2009896384
+	.long	1071682115
+	.long	927419082
+	.long	1071654577
+	.long	85010366
+	.long	1071607413
+	.long	696431025
+	.long	1071548180
+	.long	2611410541
+	.long	1071486585
+	.long	2612593658
+	.long	1071422396
+	.long	3548155306
+	.long	1071355336
+	.long	3887997484
+	.long	1071285073
+	.long	244854763
+	.long	1071211202
+	.long	4214445648
+	.long	1071133216
+	.long	2303966727
+	.long	1071050478
+	.long	3991040013
+	.long	1070962152
+	.long	3126952278
+	.long	1070867118
+	.long	1817448378
+	.long	1070763804
+	.long	1793814864
+	.long	1070649884
+	.long	3507224072
+	.long	1070447193
+	.long	4027609105
+	.long	1070148772
+	.long	577507993
+	.long	1069779414
+	.long	2310232419
+	.long	1068931829
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	3164710438
+	.long	1413754136
+	.long	3221823995
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	1074340347
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	1431655765
+	.long	3217380693
+	.long	858993459
+	.long	3216192307
+	.long	3067833783
+	.long	3215383405
+	.long	780903145
+	.long	1066854586
+	.long	858993459
+	.long	1068708659
+	.long	3340530119
+	.long	1067392113
+	.long	1431655765
+	.long	1069897045
+	.long	1321528399
+	.long	1066517740
+	.long	3067833783
+	.long	1067899757
+	.long	2021159460
+	.long	1065855096
+	.long	2576980378
+	.long	1066178969
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	0
+	.long	0
+	.long	4294950912
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	0
+	.type	static_const_table,@object
+	.size	static_const_table,6112
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_asin.S b/libm/x86/e_asin.S
new file mode 100644
index 0000000..5d7f331
--- /dev/null
+++ b/libm/x86/e_asin.S
@@ -0,0 +1,2003 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  To compute asin(s), separate schemes are used when s is in different
+//  intervals.
+//
+//  |s| in [2^{-4}, sqrt(3)/2):
+//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
+//       asin(s)=asin(t)+asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
+//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
+//       For the first degree term, r is evaluated as
+//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
+//       (sqrt(1-t^2) read from table)
+//  The main source of error is still R (may still be affected by up to 3 ulps
+//  of rounding error). The table size must be sufficiently large, to minimize
+//  this effect.
+//
+//  |s| in [sqrt(3)/2, 255/256):
+//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
+//       asin(|s|)=pi/2-asin(t)+asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
+//       asin(r) evaluated as polynomial (same as above)
+//       The first degree term is evaluated as
+//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
+//
+//  |s|<2^{-4}: evaluate as 13-degree polynomial
+//
+//  |s| in [255/256,1): asin(|s|)=pi/2-asin(sqrt(1-s^2))
+//         use 17-degree polynomial, get error term
+//         Q*eps ~ (1-s^2-Q^2)/(2*Q) for first term
+//                 ( Q(1+eps)=sqrt(1-s^2) )
+//
+// Special cases:
+//  asin(NaN) = quiet NaN, and raise invalid exception
+//  asin(INF) = QNaN and raise invalid exception
+//  asin(x) = QNaN and raise invalid exception, for |x|>1.0
+//  asin(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  asin
+ENTRY(asin)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 64(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        stmxcsr   16(%esp)
+        movl      16(%esp), %edx
+        andl      $-24577, %edx
+        cmpl      %edx, 16(%esp)
+        jne       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        movsd     5984(%ebx), %xmm4
+        movsd     6016(%ebx), %xmm3
+        xorpd     %xmm5, %xmm5
+        movsd     6000(%ebx), %xmm2
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movapd    %xmm0, %xmm1
+        movsd     %xmm0, 8(%esp)
+        psrlq     $44, %xmm0
+        movd      %xmm0, %edx
+        movapd    %xmm1, %xmm7
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movapd    %xmm1, %xmm0
+        movl      $524287, %eax
+        andl      %edx, %eax
+        subl      $260864, %eax
+        cmpl      $955, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        mulsd     %xmm1, %xmm1
+        andl      $65535, %edx
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andpd     %xmm7, %xmm2
+        andl      $-4, %edx
+        subl      $64256, %edx
+        movsd     3936(%ebx,%edx,2), %xmm1
+        orpd      %xmm5, %xmm2
+        movapd    96(%ebx,%edx,4), %xmm4
+        movapd    %xmm7, %xmm6
+        addsd     %xmm2, %xmm7
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm7, %xmm0
+        mulsd     %xmm1, %xmm6
+        mulsd     %xmm2, %xmm3
+        movapd    %xmm6, %xmm1
+        addsd     %xmm3, %xmm6
+        divsd     %xmm6, %xmm0
+        movsd     80(%ebx), %xmm7
+        movsd     64(%ebx), %xmm5
+        subsd     %xmm3, %xmm1
+        andpd     6064(%ebx), %xmm2
+        movapd    %xmm1, %xmm3
+        mulsd     %xmm1, %xmm1
+        movsd     72(%ebx), %xmm6
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm7
+        mulsd     %xmm3, %xmm5
+        xorpd     %xmm2, %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm3, %xmm6
+        addsd     %xmm4, %xmm5
+        pshufd    $238, %xmm4, %xmm4
+        addsd     %xmm5, %xmm6
+        orpd      %xmm2, %xmm4
+        addsd     %xmm6, %xmm0
+        movl      16(%esp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%esp), %eax
+        je        .L_2TAG_PACKET_3.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %eax
+        andl      $24576, %eax
+        orl       %eax, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_3.0.2:
+        addsd     %xmm4, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_2.0.2:
+        subl      $955, %eax
+        cmpl      $67, %eax
+        jae       .L_2TAG_PACKET_5.0.2
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        movl      %edx, %eax
+        andpd     5984(%ebx), %xmm0
+        andpd     6048(%ebx), %xmm7
+        movapd    %xmm0, %xmm1
+        movsd     6016(%ebx), %xmm4
+        movapd    %xmm7, %xmm6
+        subsd     %xmm7, %xmm1
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm6, %xmm0
+        subsd     %xmm7, %xmm4
+        mulsd     %xmm1, %xmm0
+        movapd    %xmm3, %xmm7
+        andpd     %xmm3, %xmm2
+        psllq     $2, %xmm3
+        pextrw    $3, %xmm3, %edx
+        orpd      %xmm5, %xmm2
+        subl      $65216, %edx
+        addl      %edx, %edx
+        mulsd     3936(%ebx,%edx,4), %xmm7
+        mulsd     %xmm2, %xmm6
+        movapd    6080(%ebx), %xmm3
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm2, %xmm2
+        subsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm6
+        subsd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm7
+        movsd     64(%ebx), %xmm5
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm7
+        movsd     80(%ebx), %xmm0
+        divsd     %xmm7, %xmm4
+        movsd     72(%ebx), %xmm2
+        subpd     96(%ebx,%edx,8), %xmm3
+        movapd    %xmm6, %xmm1
+        mulsd     %xmm6, %xmm6
+        andl      $524288, %eax
+        shrl      $4, %eax
+        mulsd     %xmm6, %xmm0
+        mulsd     %xmm6, %xmm1
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm6, %xmm1
+        addsd     %xmm2, %xmm0
+        pxor      %xmm6, %xmm6
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm5
+        pinsrw    $3, %eax, %xmm6
+        addsd     %xmm5, %xmm0
+        movapd    %xmm4, %xmm5
+        pshufd    $238, %xmm3, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm3
+        subsd     %xmm3, %xmm5
+        subsd     %xmm5, %xmm0
+        movl      16(%esp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%esp), %eax
+        je        .L_2TAG_PACKET_6.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %eax
+        andl      $24576, %eax
+        orl       %eax, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm6, %xmm0
+        xorpd     %xmm6, %xmm4
+        subsd     %xmm4, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        addl      $15291, %eax
+        cmpl      $14336, %eax
+        jae       .L_2TAG_PACKET_7.0.2
+        unpcklpd  %xmm7, %xmm7
+        movapd    (%ebx), %xmm1
+        movapd    %xmm7, %xmm6
+        movapd    16(%ebx), %xmm2
+        movapd    32(%ebx), %xmm4
+        mulpd     %xmm7, %xmm7
+        mulpd     %xmm7, %xmm6
+        mulpd     %xmm7, %xmm1
+        mulpd     %xmm7, %xmm7
+        movapd    %xmm6, %xmm3
+        mulsd     %xmm6, %xmm6
+        addpd     %xmm2, %xmm1
+        mulpd     %xmm7, %xmm4
+        mulsd     %xmm3, %xmm6
+        addpd     %xmm4, %xmm1
+        mulpd     %xmm6, %xmm1
+        pshufd    $238, %xmm1, %xmm2
+        addsd     %xmm2, %xmm1
+        movl      16(%esp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%esp), %eax
+        je        .L_2TAG_PACKET_8.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %eax
+        andl      $24576, %eax
+        orl       %eax, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_8.0.2:
+        addsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_7.0.2:
+        subl      $15358, %eax
+        cmpl      $2, %eax
+        jae       .L_2TAG_PACKET_9.0.2
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        movl      %edx, %eax
+        andpd     6032(%ebx), %xmm7
+        pshufd    $68, %xmm3, %xmm5
+        andpd     6032(%ebx), %xmm3
+        movapd    %xmm7, %xmm1
+        movsd     6016(%ebx), %xmm4
+        movapd    %xmm7, %xmm6
+        subsd     %xmm7, %xmm0
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm1, %xmm1
+        mulsd     %xmm0, %xmm1
+        subsd     %xmm7, %xmm4
+        movapd    %xmm3, %xmm6
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm0, %xmm0
+        subsd     %xmm1, %xmm4
+        subsd     %xmm5, %xmm6
+        addsd     %xmm5, %xmm5
+        subsd     %xmm3, %xmm4
+        movapd    (%ebx), %xmm2
+        pshufd    $238, %xmm5, %xmm3
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm5
+        pshufd    $238, %xmm3, %xmm7
+        addsd     %xmm3, %xmm3
+        mulsd     %xmm6, %xmm5
+        addsd     %xmm5, %xmm4
+        pshufd    $238, %xmm7, %xmm6
+        divsd     %xmm3, %xmm4
+        movapd    48(%ebx), %xmm1
+        movapd    16(%ebx), %xmm5
+        movapd    32(%ebx), %xmm0
+        mulpd     %xmm7, %xmm7
+        movapd    %xmm6, %xmm3
+        mulpd     %xmm7, %xmm2
+        mulpd     %xmm7, %xmm6
+        shrl      $4, %eax
+        andl      $32768, %eax
+        mulsd     %xmm7, %xmm1
+        mulpd     %xmm7, %xmm7
+        addpd     %xmm2, %xmm5
+        movapd    %xmm6, %xmm2
+        mulsd     %xmm6, %xmm6
+        mulpd     %xmm0, %xmm7
+        movapd    6080(%ebx), %xmm0
+        mulsd     %xmm6, %xmm2
+        addpd     %xmm5, %xmm7
+        pshufd    $238, %xmm1, %xmm5
+        mulsd     %xmm2, %xmm6
+        mulpd     %xmm2, %xmm7
+        addsd     %xmm5, %xmm1
+        xorpd     %xmm5, %xmm5
+        pshufd    $238, %xmm7, %xmm2
+        mulsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm2, %xmm7
+        movapd    %xmm3, %xmm2
+        pinsrw    $3, %eax, %xmm5
+        subsd     %xmm6, %xmm3
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm6
+        addsd     %xmm4, %xmm7
+        subsd     %xmm6, %xmm2
+        subsd     %xmm7, %xmm0
+        subsd     %xmm2, %xmm0
+        movl      16(%esp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%esp), %eax
+        je        .L_2TAG_PACKET_10.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %eax
+        andl      $24576, %eax
+        orl       %eax, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_10.0.2:
+        xorpd     %xmm5, %xmm0
+        xorpd     %xmm5, %xmm3
+        subsd     %xmm3, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_9.0.2:
+        addl      $261886, %eax
+        cmpl      $261888, %eax
+        jb        .L_2TAG_PACKET_11.0.2
+        movd      %xmm0, %ecx
+        psrlq     $32, %xmm0
+        movd      %xmm0, %edx
+        andl      $2147483647, %edx
+        movl      $1072693248, %eax
+        subl      %edx, %eax
+        orl       %ecx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_12.0.2
+        movq      8(%esp), %xmm2
+        movd      %xmm2, %edx
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $2147483647, %ecx
+        subl      $1, %edx
+        sbbl      $2146435072, %ecx
+        cmpl      $0, %ecx
+        jge       .L_2TAG_PACKET_11.0.2
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_13.0.2
+.L_2TAG_PACKET_12.0.2:
+        movsd     5984(%ebx), %xmm1
+        movsd     6080(%ebx), %xmm2
+        movsd     6088(%ebx), %xmm0
+        movl      16(%esp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%esp), %eax
+        je        .L_2TAG_PACKET_14.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %eax
+        andl      $24576, %eax
+        orl       %eax, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_14.0.2:
+        andnpd    %xmm7, %xmm1
+        orpd      %xmm1, %xmm0
+        orpd      %xmm1, %xmm2
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_0.0.2:
+        movl      16(%esp), %edx
+        andl      $-24577, %edx
+        movl      %edx, 24(%esp)
+        ldmxcsr   24(%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_11.0.2:
+        movsd     8(%esp), %xmm0
+        xorpd     %xmm6, %xmm6
+        movapd    %xmm0, %xmm7
+        pextrw    $3, %xmm0, %edx
+        andl      $32752, %edx
+        subl      $16, %edx
+        cmpl      $32736, %edx
+        jb        .L_2TAG_PACKET_15.0.2
+        addsd     %xmm0, %xmm6
+        orpd      %xmm6, %xmm0
+        mulsd     %xmm0, %xmm7
+.L_2TAG_PACKET_15.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+.L_2TAG_PACKET_13.0.2:
+        movl      16(%esp), %edx
+        andl      $-24577, %edx
+        cmpl      16(%esp), %edx
+        je        .L_2TAG_PACKET_4.0.2
+        stmxcsr   24(%esp)
+        movl      16(%esp), %edx
+        andl      $24576, %edx
+        orl       %edx, 24(%esp)
+        ldmxcsr   24(%esp)
+.L_2TAG_PACKET_4.0.2:
+        movl      64(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(asin)
+# -- End  asin
+
+# Start file scope ASM
+ALIAS_SYMBOL(asinl, asin);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	780903145
+	.long	1066854586
+	.long	858993459
+	.long	1068708659
+	.long	3340530119
+	.long	1067392113
+	.long	1431655765
+	.long	1069897045
+	.long	1321528399
+	.long	1066517740
+	.long	3067833783
+	.long	1067899757
+	.long	2021159460
+	.long	1065855096
+	.long	2576980378
+	.long	1066178969
+	.long	1431655765
+	.long	1069897045
+	.long	858993459
+	.long	1068708659
+	.long	3067833783
+	.long	1067899757
+	.long	0
+	.long	0
+	.long	3822952792
+	.long	1021639372
+	.long	182792448
+	.long	1068507836
+	.long	2264213271
+	.long	1019558908
+	.long	649052928
+	.long	1068524253
+	.long	1797139609
+	.long	1022295143
+	.long	1243095296
+	.long	1068540671
+	.long	1415938756
+	.long	1021439537
+	.long	2033294592
+	.long	1068557090
+	.long	2356809978
+	.long	1021777916
+	.long	3088063744
+	.long	1068573510
+	.long	2669055318
+	.long	1022124482
+	.long	180888576
+	.long	1068589932
+	.long	3566445325
+	.long	1021358712
+	.long	1970196992
+	.long	1068606354
+	.long	896980323
+	.long	1021319659
+	.long	4229555456
+	.long	1068622777
+	.long	436049712
+	.long	1021319758
+	.long	2732572160
+	.long	1068639202
+	.long	583123209
+	.long	1020797960
+	.long	1842831872
+	.long	1068655628
+	.long	1370449804
+	.long	1021429270
+	.long	1628994560
+	.long	1068672055
+	.long	2411391464
+	.long	1021057980
+	.long	2159763712
+	.long	1068688483
+	.long	1208692749
+	.long	1021943903
+	.long	3503886336
+	.long	1068704912
+	.long	538793309
+	.long	1019744063
+	.long	1435187200
+	.long	1068721343
+	.long	4085087612
+	.long	1020608419
+	.long	317469952
+	.long	1068737775
+	.long	144386942
+	.long	1021440732
+	.long	219617280
+	.long	1068754208
+	.long	2940088361
+	.long	1019981122
+	.long	1210558208
+	.long	1068770642
+	.long	2176850347
+	.long	1018373705
+	.long	3359268352
+	.long	1068787077
+	.long	2395611454
+	.long	1021889042
+	.long	2439803648
+	.long	1068803514
+	.long	1650705253
+	.long	1020227966
+	.long	2816203520
+	.long	1068819952
+	.long	3702166386
+	.long	1019379914
+	.long	262620672
+	.long	1068836392
+	.long	1855649370
+	.long	1020453124
+	.long	3438159616
+	.long	1068852832
+	.long	923063860
+	.long	1019273834
+	.long	3822105856
+	.long	1068869274
+	.long	4289947947
+	.long	1019434249
+	.long	1483729920
+	.long	1068885718
+	.long	787455814
+	.long	1020738379
+	.long	787321088
+	.long	1068902163
+	.long	3321653337
+	.long	1021842569
+	.long	1802253312
+	.long	1068918609
+	.long	2653633526
+	.long	1021821525
+	.long	302985984
+	.long	1068935057
+	.long	161272028
+	.long	1021655149
+	.long	653966080
+	.long	1068951506
+	.long	2566098667
+	.long	1020066219
+	.long	2924727296
+	.long	1068967956
+	.long	3646493722
+	.long	1014292285
+	.long	2889890304
+	.long	1068984408
+	.long	1081009196
+	.long	1022189620
+	.long	619098112
+	.long	1069000862
+	.long	4011643355
+	.long	1021773297
+	.long	477017600
+	.long	1069017317
+	.long	4030305534
+	.long	1021292252
+	.long	2533403904
+	.long	1069033773
+	.long	2645187591
+	.long	1019527099
+	.long	2563102208
+	.long	1069050231
+	.long	3857293792
+	.long	1022311697
+	.long	635982336
+	.long	1069066691
+	.long	3625936637
+	.long	1017511744
+	.long	1116940800
+	.long	1069083152
+	.long	3653872993
+	.long	1022016631
+	.long	4075964160
+	.long	1069099614
+	.long	2468900271
+	.long	1021769532
+	.long	993165568
+	.long	1069116079
+	.long	1358104224
+	.long	1021199776
+	.long	528586752
+	.long	1069132545
+	.long	2200950332
+	.long	1022024872
+	.long	2752395776
+	.long	1069149012
+	.long	3197072454
+	.long	1017751319
+	.long	3439855616
+	.long	1069165481
+	.long	1651081806
+	.long	1020809338
+	.long	2661257728
+	.long	1069181952
+	.long	539032752
+	.long	1021728805
+	.long	486957312
+	.long	1069198425
+	.long	3136045149
+	.long	1016888671
+	.long	1282340352
+	.long	1069214899
+	.long	2593963259
+	.long	1018956103
+	.long	822921728
+	.long	1069231375
+	.long	2146032737
+	.long	1022306465
+	.long	3474216192
+	.long	1069247852
+	.long	3976811625
+	.long	1021350207
+	.long	716902656
+	.long	1069264332
+	.long	718267222
+	.long	1018624727
+	.long	1211594496
+	.long	1069280813
+	.long	1485641389
+	.long	1018447451
+	.long	734070272
+	.long	1069297296
+	.long	354455128
+	.long	1021341291
+	.long	3650110720
+	.long	1069313780
+	.long	682185947
+	.long	1021651853
+	.long	1440663040
+	.long	1069330267
+	.long	3558574550
+	.long	1021615110
+	.long	2766612224
+	.long	1069346755
+	.long	874607978
+	.long	1017746872
+	.long	3404011008
+	.long	1069363245
+	.long	4154988502
+	.long	1021439906
+	.long	3423949056
+	.long	1069379737
+	.long	2263202309
+	.long	1021479615
+	.long	2897587712
+	.long	1069396231
+	.long	2562065031
+	.long	1022090363
+	.long	1896159232
+	.long	1069412727
+	.long	3836237663
+	.long	1019867288
+	.long	490968576
+	.long	1069429225
+	.long	3322056743
+	.long	1006752762
+	.long	3048360192
+	.long	1069445724
+	.long	1152314833
+	.long	1013122252
+	.long	1049850624
+	.long	1069462226
+	.long	3601590727
+	.long	1022214610
+	.long	3156899584
+	.long	1069478729
+	.long	1855169970
+	.long	1019487271
+	.long	851173376
+	.long	1069495235
+	.long	312649594
+	.long	1020868604
+	.long	2794281728
+	.long	1069511742
+	.long	1093490181
+	.long	1020777577
+	.long	468042496
+	.long	1069528252
+	.long	1152540679
+	.long	1021403732
+	.long	2534219264
+	.long	1069544763
+	.long	2292126035
+	.long	1021872430
+	.long	1376146432
+	.long	1069558527
+	.long	3293753641
+	.long	1020500454
+	.long	4175442432
+	.long	1069575044
+	.long	3626347564
+	.long	1021610969
+	.long	3523113472
+	.long	1069591566
+	.long	339956500
+	.long	1021119039
+	.long	4003350528
+	.long	1069608092
+	.long	3429333082
+	.long	1022813542
+	.long	1611067392
+	.long	1069624623
+	.long	2298017544
+	.long	1021977587
+	.long	931782144
+	.long	1069641158
+	.long	2164684743
+	.long	1021250988
+	.long	2256725504
+	.long	1069657697
+	.long	1138762335
+	.long	1021443776
+	.long	1582853120
+	.long	1069674241
+	.long	1084010382
+	.long	1022994693
+	.long	3497758720
+	.long	1069690789
+	.long	406366244
+	.long	1022713586
+	.long	3999816960
+	.long	1069707342
+	.long	1488723042
+	.long	1023381290
+	.long	3383096064
+	.long	1069723900
+	.long	2541558953
+	.long	1019137887
+	.long	1942403584
+	.long	1069740463
+	.long	1879620343
+	.long	1022653642
+	.long	4268263680
+	.long	1069757030
+	.long	3039077047
+	.long	1022252545
+	.long	2067062272
+	.long	1069773603
+	.long	4190670677
+	.long	1020725863
+	.long	4225828096
+	.long	1069790180
+	.long	1998567321
+	.long	1022014385
+	.long	2452507136
+	.long	1069806763
+	.long	1511628873
+	.long	1021900300
+	.long	1340746240
+	.long	1069823351
+	.long	788367341
+	.long	1022726208
+	.long	1190035456
+	.long	1069839944
+	.long	3856337230
+	.long	1021834118
+	.long	2300688384
+	.long	1069856542
+	.long	3211396579
+	.long	1022621365
+	.long	678886400
+	.long	1069873146
+	.long	4001011887
+	.long	1022042646
+	.long	921594112
+	.long	1069889755
+	.long	557811968
+	.long	1023065533
+	.long	3331668992
+	.long	1069906369
+	.long	1877060679
+	.long	1022419742
+	.long	3917875200
+	.long	1069922989
+	.long	1181055171
+	.long	1022752712
+	.long	2984829696
+	.long	1069939615
+	.long	4294526932
+	.long	1021499988
+	.long	838049024
+	.long	1069956247
+	.long	3658081878
+	.long	1022957952
+	.long	2078928384
+	.long	1069972884
+	.long	820353701
+	.long	1019391107
+	.long	2719854336
+	.long	1069989527
+	.long	1644022489
+	.long	1023378240
+	.long	3069117696
+	.long	1070006176
+	.long	2771393702
+	.long	1019319954
+	.long	3435962368
+	.long	1070022831
+	.long	3876394145
+	.long	1023024433
+	.long	4130595328
+	.long	1070039492
+	.long	1630447748
+	.long	1021465882
+	.long	1169236224
+	.long	1070056160
+	.long	2828355997
+	.long	1020458120
+	.long	3453997312
+	.long	1070072833
+	.long	164091641
+	.long	1020388279
+	.long	2708127744
+	.long	1070089513
+	.long	3036550223
+	.long	1023328684
+	.long	3540797696
+	.long	1070106199
+	.long	3710949463
+	.long	1022568805
+	.long	1972276736
+	.long	1070122892
+	.long	3885277950
+	.long	1019761674
+	.long	2613815552
+	.long	1070139591
+	.long	2764165077
+	.long	1022921023
+	.long	1487791616
+	.long	1070156297
+	.long	1330644769
+	.long	1023162679
+	.long	3207593472
+	.long	1070173009
+	.long	3911007221
+	.long	1022993496
+	.long	3797764608
+	.long	1070189728
+	.long	979712598
+	.long	1022554580
+	.long	3578920448
+	.long	1070206454
+	.long	2825738223
+	.long	1020223708
+	.long	2872795648
+	.long	1070223187
+	.long	392451124
+	.long	1022666279
+	.long	2002258432
+	.long	1070239927
+	.long	3730407632
+	.long	1023148291
+	.long	1291326464
+	.long	1070256674
+	.long	3723802980
+	.long	1022514089
+	.long	1065180928
+	.long	1070273428
+	.long	2635617463
+	.long	1022654470
+	.long	1650181632
+	.long	1070290189
+	.long	2061982883
+	.long	1022853411
+	.long	3373882880
+	.long	1070306957
+	.long	319732785
+	.long	1022017175
+	.long	2270081280
+	.long	1070323733
+	.long	2237757411
+	.long	1023064087
+	.long	2963732736
+	.long	1070340516
+	.long	468839165
+	.long	1023293774
+	.long	1491099904
+	.long	1070357307
+	.long	1502657946
+	.long	1021533479
+	.long	2479636480
+	.long	1070374105
+	.long	482913562
+	.long	1021986286
+	.long	1968133632
+	.long	1070390911
+	.long	3281474337
+	.long	1022646400
+	.long	291639040
+	.long	1070407725
+	.long	2453320259
+	.long	1022812423
+	.long	2081472512
+	.long	1070424546
+	.long	2939989570
+	.long	1023091888
+	.long	3380340480
+	.long	1070441375
+	.long	2850707499
+	.long	1021921109
+	.long	232287488
+	.long	1070458213
+	.long	3674625342
+	.long	1020725130
+	.long	1567614208
+	.long	1070475058
+	.long	9347334
+	.long	1022024009
+	.long	3433091072
+	.long	1070491911
+	.long	282524999
+	.long	1021433523
+	.long	1876877312
+	.long	1070508773
+	.long	3470449440
+	.long	1019309721
+	.long	1538472192
+	.long	1070525643
+	.long	2089486825
+	.long	1019698916
+	.long	2763830784
+	.long	1070542521
+	.long	443498115
+	.long	1020505194
+	.long	1605381632
+	.long	1070559408
+	.long	3018871601
+	.long	1022869913
+	.long	2706946048
+	.long	1070576303
+	.long	3936260892
+	.long	1023175875
+	.long	2123887360
+	.long	1070593207
+	.long	2994220655
+	.long	1022825948
+	.long	104015104
+	.long	1070603108
+	.long	335054493
+	.long	1023441853
+	.long	2904568832
+	.long	1070615800
+	.long	1451215633
+	.long	1023853857
+	.long	3456197120
+	.long	1070632739
+	.long	436334733
+	.long	1024026432
+	.long	252452352
+	.long	1070649697
+	.long	34596167
+	.long	1024031396
+	.long	3328018432
+	.long	1070666672
+	.long	2644547073
+	.long	1024296758
+	.long	1255829248
+	.long	1070683667
+	.long	552832586
+	.long	1023763122
+	.long	4097058560
+	.long	1070700680
+	.long	1955640623
+	.long	1021394654
+	.long	451770112
+	.long	1070717714
+	.long	3428903777
+	.long	1022941142
+	.long	408920832
+	.long	1070734767
+	.long	165503263
+	.long	1023894958
+	.long	1186960640
+	.long	1070751840
+	.long	435826450
+	.long	1024026134
+	.long	19078656
+	.long	1070768934
+	.long	1834169749
+	.long	1022899284
+	.long	2743490304
+	.long	1070786048
+	.long	494581074
+	.long	1018818479
+	.long	2328961024
+	.long	1070803184
+	.long	2987908834
+	.long	1022581110
+	.long	350011392
+	.long	1070820342
+	.long	240771184
+	.long	1024143083
+	.long	2692326912
+	.long	1070837521
+	.long	666056837
+	.long	1022394776
+	.long	2373274368
+	.long	1070854723
+	.long	2484337770
+	.long	1024228156
+	.long	1017131520
+	.long	1070871948
+	.long	3285648279
+	.long	1024025789
+	.long	265558272
+	.long	1070889196
+	.long	392241896
+	.long	1024252809
+	.long	1778008064
+	.long	1070906467
+	.long	1536107943
+	.long	1023949300
+	.long	2937184768
+	.long	1070923762
+	.long	3541062251
+	.long	1019448646
+	.long	1144442880
+	.long	1070941082
+	.long	3691683781
+	.long	1022123948
+	.long	2410165504
+	.long	1070958426
+	.long	1804181960
+	.long	1023945221
+	.long	4174350848
+	.long	1070975795
+	.long	2016094861
+	.long	1021716585
+	.long	3897012480
+	.long	1070993190
+	.long	175294410
+	.long	1023703404
+	.long	3353623040
+	.long	1071010611
+	.long	167973242
+	.long	1023240839
+	.long	45671168
+	.long	1071028059
+	.long	2166856113
+	.long	1021565413
+	.long	86063872
+	.long	1071045533
+	.long	2676254727
+	.long	1023985299
+	.long	1019772672
+	.long	1071063034
+	.long	989043593
+	.long	1021549587
+	.long	414297344
+	.long	1071080563
+	.long	3960972046
+	.long	1024307251
+	.long	155173120
+	.long	1071098120
+	.long	1830919291
+	.long	1021592251
+	.long	2151562240
+	.long	1071115705
+	.long	405408666
+	.long	1023423128
+	.long	4041854720
+	.long	1071133319
+	.long	2043497827
+	.long	1024411503
+	.long	3489224192
+	.long	1071150963
+	.long	3072215864
+	.long	1022698635
+	.long	2477196288
+	.long	1071168637
+	.long	1812195139
+	.long	1022689192
+	.long	3015298816
+	.long	1071186341
+	.long	764841969
+	.long	1021027331
+	.long	2844731136
+	.long	1071204076
+	.long	2878117321
+	.long	1019116513
+	.long	4028950528
+	.long	1071221842
+	.long	698911452
+	.long	1023265602
+	.long	69441536
+	.long	1071239641
+	.long	3253467847
+	.long	1020795075
+	.long	1676209920
+	.long	1071257471
+	.long	4272431167
+	.long	1022873982
+	.long	2408752384
+	.long	1071275334
+	.long	648519100
+	.long	1024385717
+	.long	151623680
+	.long	1071293231
+	.long	345257017
+	.long	1019561408
+	.long	1410154240
+	.long	1071311161
+	.long	197863993
+	.long	1023224207
+	.long	4131351552
+	.long	1071329125
+	.long	2620801789
+	.long	1024411169
+	.long	1999664384
+	.long	1071347125
+	.long	3952692616
+	.long	1024168086
+	.long	1617668864
+	.long	1071365160
+	.long	3019889809
+	.long	1021907692
+	.long	1032074240
+	.long	1071383231
+	.long	59469899
+	.long	1023656194
+	.long	2619492096
+	.long	1071401338
+	.long	1417526820
+	.long	1021457783
+	.long	202429440
+	.long	1071419483
+	.long	2927667935
+	.long	1019175447
+	.long	525044224
+	.long	1071437665
+	.long	38166811
+	.long	1023981879
+	.long	1779258880
+	.long	1071455885
+	.long	481252500
+	.long	1023310234
+	.long	2195673600
+	.long	1071474144
+	.long	3962395981
+	.long	1021339088
+	.long	44573696
+	.long	1071492443
+	.long	3936281395
+	.long	1023014829
+	.long	2226905344
+	.long	1071510781
+	.long	1515320476
+	.long	1024320623
+	.long	2800512512
+	.long	1071529160
+	.long	1225403697
+	.long	1021081846
+	.long	161113600
+	.long	1071547581
+	.long	3064809733
+	.long	1024173917
+	.long	1338410240
+	.long	1071566043
+	.long	2027604973
+	.long	1024362526
+	.long	522433280
+	.long	1071584548
+	.long	2055171723
+	.long	1023858825
+	.long	539595776
+	.long	1071603096
+	.long	3868820135
+	.long	1022936424
+	.long	4264017664
+	.long	1071621687
+	.long	3228065145
+	.long	1023479578
+	.long	1733924096
+	.long	1071640324
+	.long	3511934475
+	.long	1022496355
+	.long	108880384
+	.long	1071651839
+	.long	615880967
+	.long	1023519706
+	.long	3517856512
+	.long	1071661202
+	.long	3113108559
+	.long	1025190289
+	.long	4043153152
+	.long	1071670589
+	.long	1571836218
+	.long	1023106116
+	.long	3251299072
+	.long	1071680000
+	.long	3444076102
+	.long	1022187841
+	.long	2736921600
+	.long	1071689435
+	.long	272771483
+	.long	1025095280
+	.long	3897698560
+	.long	1071703633
+	.long	2075390188
+	.long	1022489022
+	.long	3209485056
+	.long	1071722652
+	.long	1438094065
+	.long	1021844944
+	.long	3781432064
+	.long	1071741774
+	.long	1675017145
+	.long	1024143828
+	.long	2684184064
+	.long	1071761003
+	.long	2259963753
+	.long	1024731393
+	.long	1840489728
+	.long	1071780342
+	.long	3372883597
+	.long	1023431408
+	.long	3764087808
+	.long	1071799794
+	.long	3307523102
+	.long	1024485788
+	.long	3006232320
+	.long	1071819364
+	.long	3088971966
+	.long	1025213251
+	.long	3374881280
+	.long	1071839055
+	.long	834437749
+	.long	1025236452
+	.long	797284864
+	.long	1071858872
+	.long	3122663941
+	.long	1025320473
+	.long	545765120
+	.long	1071878818
+	.long	826539625
+	.long	1022450955
+	.long	107562240
+	.long	1071898898
+	.long	339584600
+	.long	1022481255
+	.long	2123649024
+	.long	1071919116
+	.long	3912959833
+	.long	1024321009
+	.long	1562385664
+	.long	1071939478
+	.long	2846067230
+	.long	1023343981
+	.long	2963085824
+	.long	1071959988
+	.long	954548627
+	.long	1021475211
+	.long	3325550592
+	.long	1071980652
+	.long	3459651155
+	.long	1025305573
+	.long	775752448
+	.long	1072001476
+	.long	3582746667
+	.long	1023859460
+	.long	3238590720
+	.long	1072022464
+	.long	634636162
+	.long	1024472353
+	.long	2758801920
+	.long	1072043624
+	.long	3078216319
+	.long	1025304516
+	.long	1370319104
+	.long	1072064962
+	.long	2570569078
+	.long	1025099442
+	.long	2615805184
+	.long	1072086484
+	.long	3729933412
+	.long	1024605112
+	.long	3077336576
+	.long	1072108198
+	.long	1948916066
+	.long	1024781603
+	.long	1099528192
+	.long	1072130112
+	.long	3139143157
+	.long	1023729360
+	.long	1231903232
+	.long	1072152233
+	.long	1349513477
+	.long	1024737515
+	.long	1507504128
+	.long	1072174570
+	.long	3484516322
+	.long	1024000959
+	.long	2214659840
+	.long	1072197132
+	.long	2563820917
+	.long	1025225535
+	.long	1804739840
+	.long	1072219929
+	.long	760038746
+	.long	1024482855
+	.long	1413746688
+	.long	1072242971
+	.long	3401734714
+	.long	1025129838
+	.long	821409536
+	.long	1072266269
+	.long	3729772551
+	.long	1025484796
+	.long	3031825664
+	.long	1072289834
+	.long	122256749
+	.long	1024752594
+	.long	1710784256
+	.long	1072313680
+	.long	1518205483
+	.long	1024724809
+	.long	3025265152
+	.long	1072337819
+	.long	409951989
+	.long	1022835555
+	.long	287769088
+	.long	1072362267
+	.long	800355594
+	.long	1022484850
+	.long	198179840
+	.long	1072387038
+	.long	3502926213
+	.long	1024209373
+	.long	1909130496
+	.long	1072412149
+	.long	3064694319
+	.long	1025380823
+	.long	1941732096
+	.long	1072437619
+	.long	4112930390
+	.long	1024294679
+	.long	3492010496
+	.long	1072463467
+	.long	2684918107
+	.long	1023220233
+	.long	81959680
+	.long	1072489716
+	.long	220021366
+	.long	1020635131
+	.long	2297837056
+	.long	1072516387
+	.long	4027683826
+	.long	1021041185
+	.long	270404096
+	.long	1072543508
+	.long	2012766065
+	.long	1021780753
+	.long	3667376896
+	.long	1072571105
+	.long	2727981522
+	.long	1023009874
+	.long	330400256
+	.long	1072599212
+	.long	2940017003
+	.long	1025393439
+	.long	1119293952
+	.long	1072627861
+	.long	1608550416
+	.long	1022675612
+	.long	3536155904
+	.long	1072657091
+	.long	349665778
+	.long	1025156751
+	.long	3078046720
+	.long	1072686946
+	.long	2016159996
+	.long	1022193169
+	.long	455228416
+	.long	1072705361
+	.long	1908539328
+	.long	1026126332
+	.long	1871505664
+	.long	1072720988
+	.long	2784700894
+	.long	1025922277
+	.long	1630994432
+	.long	1072737010
+	.long	361107678
+	.long	1022887244
+	.long	2084558336
+	.long	1072753462
+	.long	2642784509
+	.long	1072689083
+	.long	1514442531
+	.long	1072688953
+	.long	333108933
+	.long	1072688821
+	.long	3392112024
+	.long	1072688686
+	.long	2099852862
+	.long	1072688550
+	.long	749609004
+	.long	1072688412
+	.long	3634632596
+	.long	1072688271
+	.long	2163248461
+	.long	1072688129
+	.long	628657846
+	.long	1072687985
+	.long	3324036511
+	.long	1072687838
+	.long	1657632815
+	.long	1072687690
+	.long	4217538760
+	.long	1072687539
+	.long	2411951597
+	.long	1072687387
+	.long	533944872
+	.long	1072687233
+	.long	2876566508
+	.long	1072687076
+	.long	847936891
+	.long	1072686918
+	.long	3036019913
+	.long	1072686757
+	.long	848884575
+	.long	1072686595
+	.long	2874443326
+	.long	1072686430
+	.long	520713666
+	.long	1072686264
+	.long	2375556481
+	.long	1072686095
+	.long	4141904948
+	.long	1072685924
+	.long	1522666382
+	.long	1072685752
+	.long	3105624104
+	.long	1072685577
+	.long	298666327
+	.long	1072685401
+	.long	1689524500
+	.long	1072685222
+	.long	2981002200
+	.long	1072685041
+	.long	4170844284
+	.long	1072684858
+	.long	961802263
+	.long	1072684674
+	.long	1941503454
+	.long	1072684487
+	.long	2812647170
+	.long	1072684298
+	.long	3572873869
+	.long	1072684107
+	.long	4219797823
+	.long	1072683914
+	.long	456039788
+	.long	1072683720
+	.long	869096151
+	.long	1072683523
+	.long	1161535119
+	.long	1072683324
+	.long	1330865866
+	.long	1072683123
+	.long	1374571204
+	.long	1072682920
+	.long	1290107538
+	.long	1072682715
+	.long	1074904836
+	.long	1072682508
+	.long	726366587
+	.long	1072682299
+	.long	241869763
+	.long	1072682088
+	.long	3913732079
+	.long	1072681874
+	.long	3149342765
+	.long	1072681659
+	.long	2240966306
+	.long	1072681442
+	.long	1185873216
+	.long	1072681223
+	.long	4276274591
+	.long	1072681001
+	.long	2919452883
+	.long	1072680778
+	.long	1407565635
+	.long	1072680553
+	.long	4032743551
+	.long	1072680325
+	.long	2202188565
+	.long	1072680096
+	.long	207977577
+	.long	1072679865
+	.long	2342160518
+	.long	1072679631
+	.long	11858423
+	.long	1072679396
+	.long	1804034453
+	.long	1072679158
+	.long	3420722787
+	.long	1072678918
+	.long	563930456
+	.long	1072678677
+	.long	1820539192
+	.long	1072678433
+	.long	2892501606
+	.long	1072678187
+	.long	3776710320
+	.long	1072677939
+	.long	175063337
+	.long	1072677690
+	.long	674333171
+	.long	1072677438
+	.long	976363026
+	.long	1072677184
+	.long	1077935934
+	.long	1072676928
+	.long	1921075490
+	.long	1072676540
+	.long	881493302
+	.long	1072676016
+	.long	3275752439
+	.long	1072675483
+	.long	486855588
+	.long	1072674943
+	.long	1077229111
+	.long	1072674394
+	.long	723950308
+	.long	1072673837
+	.long	3693582199
+	.long	1072673271
+	.long	1367335316
+	.long	1072672698
+	.long	2305837020
+	.long	1072672116
+	.long	2184358641
+	.long	1072671526
+	.long	972682840
+	.long	1072670928
+	.long	2935101762
+	.long	1072670321
+	.long	3745513263
+	.long	1072669706
+	.long	3372320886
+	.long	1072669083
+	.long	1783464620
+	.long	1072668452
+	.long	3241386215
+	.long	1072667812
+	.long	3418125284
+	.long	1072667164
+	.long	2280219148
+	.long	1072666508
+	.long	4088700758
+	.long	1072665843
+	.long	219227400
+	.long	1072665171
+	.long	3521816918
+	.long	1072664489
+	.long	1076205279
+	.long	1072663800
+	.long	1436484616
+	.long	1072663102
+	.long	271362610
+	.long	1072662396
+	.long	1838996688
+	.long	1072661681
+	.long	1807122518
+	.long	1072660958
+	.long	137953542
+	.long	1072660227
+	.long	1088178584
+	.long	1072659487
+	.long	324057537
+	.long	1072658739
+	.long	2101288076
+	.long	1072657982
+	.long	2085133974
+	.long	1072657217
+	.long	235324451
+	.long	1072656444
+	.long	806051592
+	.long	1072655662
+	.long	3756033140
+	.long	1072654871
+	.long	453542543
+	.long	1072654073
+	.long	3741177327
+	.long	1072653265
+	.long	691216109
+	.long	1072652450
+	.long	4145223372
+	.long	1072651625
+	.long	1174439091
+	.long	1072650793
+	.long	324416139
+	.long	1072649952
+	.long	1550246310
+	.long	1072649102
+	.long	511524674
+	.long	1072648244
+	.long	1457248482
+	.long	1072647377
+	.long	45944955
+	.long	1072646502
+	.long	525537397
+	.long	1072645618
+	.long	2848440188
+	.long	1072644725
+	.long	2671555633
+	.long	1072643824
+	.long	4241172637
+	.long	1072642914
+	.long	3213094278
+	.long	1072641996
+	.long	3832503688
+	.long	1072641069
+	.long	1754091534
+	.long	1072640134
+	.long	1221921804
+	.long	1072639190
+	.long	2184526489
+	.long	1072638237
+	.long	294902089
+	.long	1072637276
+	.long	4090375270
+	.long	1072636305
+	.long	632860906
+	.long	1072635327
+	.long	2753498702
+	.long	1072634339
+	.long	1808009252
+	.long	1072633343
+	.long	2036428672
+	.long	1072632338
+	.long	3383235626
+	.long	1072631324
+	.long	1497347484
+	.long	1072630302
+	.long	617018317
+	.long	1072629271
+	.long	684933058
+	.long	1072628231
+	.long	1643170798
+	.long	1072627182
+	.long	3011066360
+	.long	1072625592
+	.long	957158713
+	.long	1072623442
+	.long	1390907941
+	.long	1072621256
+	.long	3819155270
+	.long	1072619034
+	.long	3443571196
+	.long	1072616777
+	.long	4045412458
+	.long	1072614484
+	.long	805503923
+	.long	1072612156
+	.long	1778922015
+	.long	1072609791
+	.long	2125033665
+	.long	1072607390
+	.long	1287203863
+	.long	1072604953
+	.long	2992629568
+	.long	1072602479
+	.long	2367267127
+	.long	1072599969
+	.long	3115526047
+	.long	1072597422
+	.long	340219539
+	.long	1072594839
+	.long	2017215719
+	.long	1072592218
+	.long	3225443424
+	.long	1072589560
+	.long	3326565673
+	.long	1072586865
+	.long	1669811211
+	.long	1072584133
+	.long	1886735022
+	.long	1072581363
+	.long	3301071171
+	.long	1072578555
+	.long	928514283
+	.long	1072575710
+	.long	2656364059
+	.long	1072572826
+	.long	3473490507
+	.long	1072569904
+	.long	2649965606
+	.long	1072566944
+	.long	3736819052
+	.long	1072563945
+	.long	1680885175
+	.long	1072560908
+	.long	4413771
+	.long	1072557832
+	.long	2214869753
+	.long	1072554716
+	.long	3214725184
+	.long	1072551561
+	.long	2186079903
+	.long	1072548367
+	.long	2590372131
+	.long	1072545133
+	.long	3578146079
+	.long	1072541859
+	.long	4283712755
+	.long	1072538545
+	.long	3824834510
+	.long	1072535191
+	.long	1302400298
+	.long	1072531797
+	.long	95058636
+	.long	1072528362
+	.long	3563906063
+	.long	1072524885
+	.long	2167230730
+	.long	1072521368
+	.long	3524918334
+	.long	1072517809
+	.long	2353304918
+	.long	1072514209
+	.long	1939625839
+	.long	1072510567
+	.long	1256714581
+	.long	1072506883
+	.long	3552525848
+	.long	1072503156
+	.long	3464809522
+	.long	1072499387
+	.long	4200542593
+	.long	1072495575
+	.long	355609124
+	.long	1072491721
+	.long	3684139099
+	.long	1072487822
+	.long	148355918
+	.long	1072483881
+	.long	1457689242
+	.long	1072479895
+	.long	2118591596
+	.long	1072475865
+	.long	908848089
+	.long	1072471791
+	.long	877032689
+	.long	1072467672
+	.long	752012304
+	.long	1072463508
+	.long	3532301749
+	.long	1072459298
+	.long	3600563221
+	.long	1072455043
+	.long	3902857084
+	.long	1072450742
+	.long	3063101036
+	.long	1072446395
+	.long	3972344374
+	.long	1072442001
+	.long	903183549
+	.long	1072437561
+	.long	983892938
+	.long	1072433073
+	.long	2722858568
+	.long	1072428537
+	.long	302790515
+	.long	1072423954
+	.long	759811057
+	.long	1072419322
+	.long	2507809922
+	.long	1072414641
+	.long	2388408813
+	.long	1072407528
+	.long	2084492942
+	.long	1072397870
+	.long	2435703301
+	.long	1072388010
+	.long	1935433360
+	.long	1072377945
+	.long	2742047290
+	.long	1072367671
+	.long	2053284205
+	.long	1072357185
+	.long	657783367
+	.long	1072346483
+	.long	2893664841
+	.long	1072335560
+	.long	3718906405
+	.long	1072324413
+	.long	1547896303
+	.long	1072313038
+	.long	2494058440
+	.long	1072301429
+	.long	3133238742
+	.long	1072289582
+	.long	3327000086
+	.long	1072277492
+	.long	1860667274
+	.long	1072265154
+	.long	665340747
+	.long	1072252562
+	.long	443347841
+	.long	1072239710
+	.long	581282618
+	.long	1072226592
+	.long	3349780465
+	.long	1072213201
+	.long	914217606
+	.long	1072199532
+	.long	989797661
+	.long	1072185576
+	.long	945436416
+	.long	1072171326
+	.long	549291300
+	.long	1072156774
+	.long	1814636389
+	.long	1072141911
+	.long	239092858
+	.long	1072126729
+	.long	1794680724
+	.long	1072111217
+	.long	1241534678
+	.long	1072095366
+	.long	3366566214
+	.long	1072079164
+	.long	1244090828
+	.long	1072062601
+	.long	1708448120
+	.long	1072045663
+	.long	3544260650
+	.long	1072028337
+	.long	1402741403
+	.long	1072010610
+	.long	2551936888
+	.long	1071992465
+	.long	617669739
+	.long	1071973887
+	.long	794002186
+	.long	1071954857
+	.long	2021237693
+	.long	1071935356
+	.long	540450384
+	.long	1071915364
+	.long	1920555537
+	.long	1071894857
+	.long	2879585206
+	.long	1071873811
+	.long	3000237455
+	.long	1071852199
+	.long	3352974346
+	.long	1071829991
+	.long	569629937
+	.long	1071807155
+	.long	2077237208
+	.long	1071783653
+	.long	2284891805
+	.long	1071759446
+	.long	1226651784
+	.long	1071734489
+	.long	1102047405
+	.long	1071708731
+	.long	2009896384
+	.long	1071682115
+	.long	927419082
+	.long	1071654577
+	.long	85010366
+	.long	1071607413
+	.long	696431025
+	.long	1071548180
+	.long	2611410541
+	.long	1071486585
+	.long	2612593658
+	.long	1071422396
+	.long	3548155306
+	.long	1071355336
+	.long	3887997484
+	.long	1071285073
+	.long	244854763
+	.long	1071211202
+	.long	4214445648
+	.long	1071133216
+	.long	2303966727
+	.long	1071050478
+	.long	3991040013
+	.long	1070962152
+	.long	3126952278
+	.long	1070867118
+	.long	1817448378
+	.long	1070763804
+	.long	1793814864
+	.long	1070649884
+	.long	3507224072
+	.long	1070447193
+	.long	4027609105
+	.long	1070148772
+	.long	577507993
+	.long	1069779414
+	.long	2310232419
+	.long	1068931829
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	0
+	.long	0
+	.long	4294950912
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	2147483584
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.type	static_const_table,@object
+	.size	static_const_table,6096
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_atan2.S b/libm/x86/e_atan2.S
new file mode 100644
index 0000000..1efdf65
--- /dev/null
+++ b/libm/x86/e_atan2.S
@@ -0,0 +1,1221 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//
+//1. The method is based on the relationship of atan2(Y,X) to atan(|Y/X|)
+//   as follows.
+//                   /  sign(Y) atan(|Y/X|)                if X > 0
+//       atan2(Y,X) =
+//                   \  sign(Y)*pi  - sign(Y)*atan(|Y/X|)  if X < 0
+//
+//   Thus, atan2(Y,X) is of the form  atan2(Y,X) = PI + sgn*atan(|Y/X|)
+//   where PI and sgn can be determined by the four possible combinations of
+//   of the pair (sign(X),sign(Y)). We concentrate on the numerical method
+//   for atan(|Y/X|).
+//
+//2. For |Y/X| < 2^(-64), atan(|Y/X|) ~=~ |Y/X|. Hence, atan2(Y,X) is  Y/X
+//   if X > 0, and sign(Y)*pi otherwise.
+//3. For |Y/X| >= 2^(65), atan(|Y/X|) ~=~ pi/2. Hence atan2(Y,X) is sign(Y)pi/2.
+//4. For 2^(-64) <= |Y/X| < 2^(-5), atan(|Y/X|) is approximated by a polynomial
+//   of the form  Z + Z*E*polynomial(E), where Z = |Y/X| and E = Z*Z.
+//5. For |Y/X| > 2^(5), atan(|Y/X|) = pi/2 + atan(-|X/Y|), and atan(-|X/Y|) is
+//   calculated using the polynomial in 4 above.
+//6. For 2^(-5) <= |Y/X| <= 2^(5), we employ a table lookup method. First,
+//   we obtain B = 2^k * 1.b1 b2 b3 b4 = 2^k * (1+k/16) that approximate
+//   |Y/X| to approximately 5 significant bits. Hence, atan(|Y/X|) is
+//
+//      atan(|Y/X|)  =  atan(B) + atan(Z), where  Z = (|Y|-B|X|)/(|X|+B|Y|).
+//                  ~=~   tau   + Z + Z*E*polynomial(E), where E = Z*Z.
+//
+//   B has the range from 2^(-6)*(1+14/16) to 2^5 = 2^(5)*(1+0/16), totally
+//   163 possible values. These values are calculated beforehand and stored
+//   in a table. The polynomial is the one used in 4.
+//
+// Special cases:
+//  atan2(+-0, +0) = +-0
+//  atan2(+-0, -0) = +-pi
+//  atan2(+-0, x) = +-0, for x > 0, and +-pi, for x < 0
+//  atan2(y, +-0) = +pi/2 for y > 0, and -pi/2 for y < 0
+//  atan2(+-y, +INF) = +-0, for finite y > 0
+//  atan2(+-y, -INF) = +-pi, for finite y > 0
+//  atan2(+-INF, x) = +-pi/2, for finite x
+//  atan2(+-INF, +INF) = +-pi/4
+//  atan2(+-INF, -INF) = +-3*pi/4
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  atan2
+ENTRY(atan2)
+# parameter 1: 8 + %ebp
+# parameter 2: 16 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 64(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     136(%esp), %xmm1
+        movsd     128(%esp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        movq      %xmm0, 8(%esp)
+        andl      $32752, %eax
+        movq      %xmm1, 16(%esp)
+        subl      $14448, %eax
+        cmpl      $3840, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        subl      $14448, %eax
+        cmpl      $3840, %eax
+        ja        .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        unpcklpd  %xmm1, %xmm0
+        xorpd     %xmm5, %xmm5
+        xorpd     %xmm3, %xmm3
+        movl      $2048, %eax
+        pinsrw    $3, %eax, %xmm5
+        paddw     %xmm1, %xmm5
+        psrlq     $29, %xmm5
+        rcpss     %xmm5, %xmm3
+        xorpd     %xmm4, %xmm4
+        movl      $14336, %ecx
+        pinsrw    $3, %ecx, %xmm4
+        psllq     $29, %xmm3
+        paddw     %xmm4, %xmm3
+        mulsd     %xmm0, %xmm3
+        xorpd     %xmm2, %xmm2
+        xorpd     %xmm6, %xmm6
+        xorpd     %xmm7, %xmm7
+        movl      $32768, %eax
+        pinsrw    $2, %eax, %xmm6
+        movl      $32767, %ecx
+        pinsrw    $3, %ecx, %xmm7
+        paddd     %xmm6, %xmm3
+        andpd     %xmm7, %xmm3
+        movapd    %xmm3, %xmm5
+        pextrw    $3, %xmm3, %eax
+        movl      $16448, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        minsd     %xmm2, %xmm3
+        movmskpd  %xmm0, %edx
+        psllq     $1, %xmm0
+        psrlq     $1, %xmm0
+        cmpsd     $2, %xmm2, %xmm5
+        psllq     $1, %xmm1
+        psrlq     $1, %xmm1
+        movapd    %xmm1, %xmm6
+        movapd    %xmm1, %xmm7
+        movapd    %xmm0, %xmm2
+        movl      $0, %ecx
+        pinsrw    $0, %ecx, %xmm6
+        subsd     %xmm6, %xmm7
+        movapd    %xmm0, %xmm4
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm3, %xmm4
+        mulsd     %xmm3, %xmm7
+        andpd     %xmm5, %xmm0
+        subsd     %xmm6, %xmm0
+        andpd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm4
+        subsd     %xmm7, %xmm0
+        andl      $32752, %eax
+        subl      $16286, %eax
+        cmpl      $1121, %eax
+        ja        .L_2TAG_PACKET_3.0.2
+        divsd     %xmm4, %xmm0
+        pextrw    $3, %xmm3, %ecx
+        movsd     2944(%ebx), %xmm2
+        movsd     2960(%ebx), %xmm3
+        pextrw    $0, %xmm5, %eax
+        addl      %edx, %edx
+        movapd    2688(%ebx,%edx,8), %xmm6
+        movapd    2752(%ebx,%edx,8), %xmm1
+        subl      $16286, %ecx
+        notl      %eax
+        andl      $1, %eax
+        addl      %eax, %ecx
+        addl      %ecx, %ecx
+        movapd    (%ebx,%ecx,8), %xmm5
+        xorpd     %xmm1, %xmm5
+        addpd     %xmm6, %xmm5
+        movapd    %xmm5, %xmm6
+        unpckhpd  %xmm5, %xmm5
+        xorpd     %xmm0, %xmm1
+        movapd    %xmm1, %xmm4
+        mulsd     %xmm0, %xmm0
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm3
+        addsd     %xmm6, %xmm1
+        subsd     %xmm1, %xmm6
+        addsd     %xmm4, %xmm6
+        addsd     2952(%ebx), %xmm2
+        mulsd     %xmm0, %xmm3
+        mulsd     %xmm0, %xmm4
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm4, %xmm2
+        addsd     2968(%ebx), %xmm3
+        mulsd     %xmm3, %xmm2
+        addsd     %xmm6, %xmm2
+        addsd     %xmm2, %xmm1
+        movsd     %xmm1, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_3.0.2:
+        addl      $942, %eax
+        cmpl      $942, %eax
+        ja        .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm4, %xmm4
+        movl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm4
+        divsd     %xmm1, %xmm4
+        addl      %edx, %edx
+        movapd    2752(%ebx,%edx,8), %xmm6
+        unpcklpd  %xmm3, %xmm3
+        xorpd     %xmm6, %xmm0
+        xorpd     %xmm6, %xmm2
+        xorpd     %xmm6, %xmm3
+        movapd    2816(%ebx,%edx,8), %xmm7
+        movsd     2944(%ebx), %xmm1
+        movsd     2960(%ebx), %xmm5
+        andpd     2880(%ebx,%edx,8), %xmm3
+        mulsd     %xmm4, %xmm2
+        mulsd     %xmm4, %xmm0
+        movapd    %xmm2, %xmm6
+        mulsd     %xmm2, %xmm2
+        mulsd     %xmm2, %xmm1
+        addsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm6
+        addsd     2952(%ebx), %xmm1
+        mulsd     %xmm2, %xmm5
+        addsd     %xmm0, %xmm7
+        addpd     %xmm3, %xmm7
+        mulsd     %xmm6, %xmm1
+        addsd     2968(%ebx), %xmm5
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm7, %xmm5
+        unpckhpd  %xmm7, %xmm7
+        addsd     %xmm7, %xmm5
+        movsd     %xmm5, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        movsd     16(%esp), %xmm1
+        movsd     8(%esp), %xmm0
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      %eax, %ecx
+        jg        .L_2TAG_PACKET_6.0.2
+        pextrw    $3, %xmm1, %ecx
+        cmpl      $32767, %ecx
+        jg        .L_2TAG_PACKET_7.0.2
+        divsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_7.0.2:
+        andpd     2672(%ebx), %xmm0
+        movsd     2640(%ebx), %xmm2
+        xorpd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_6.0.2:
+        andpd     2672(%ebx), %xmm0
+        movsd     2624(%ebx), %xmm2
+        xorpd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_0.0.2:
+.L_2TAG_PACKET_1.0.2:
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_8.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_9.0.2
+        movsd     2992(%ebx), %xmm3
+        movl      $1024, %edx
+        movsd     2976(%ebx), %xmm4
+        xorpd     %xmm6, %xmm6
+        movsd     3008(%ebx), %xmm7
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_10.0.2
+.L_2TAG_PACKET_11.0.2:
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_12.0.2
+.L_2TAG_PACKET_13.0.2:
+        addl      %ecx, %edx
+        subl      %eax, %edx
+        cmpl      $2048, %edx
+        ja        .L_2TAG_PACKET_5.0.2
+        addl      $15344, %edx
+        pinsrw    $3, %edx, %xmm6
+        andpd     %xmm4, %xmm0
+        andpd     %xmm4, %xmm1
+        orpd      %xmm6, %xmm0
+        orpd      %xmm7, %xmm1
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_10.0.2:
+        subl      $880, %edx
+        mulsd     %xmm3, %xmm0
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_14.0.2
+        jmp       .L_2TAG_PACKET_11.0.2
+.L_2TAG_PACKET_12.0.2:
+        addl      $880, %edx
+        mulsd     %xmm3, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_15.0.2
+        jmp       .L_2TAG_PACKET_13.0.2
+.L_2TAG_PACKET_8.0.2:
+        movd      %xmm0, %edx
+        movapd    %xmm0, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $1048575, %ecx
+        orl       %edx, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_16.0.2
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        cmpl      $32752, %eax
+        jae       .L_2TAG_PACKET_17.0.2
+        movapd    2624(%ebx), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+.L_2TAG_PACKET_18.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_16.0.2:
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_17.0.2:
+        movd      %xmm1, %eax
+        movapd    %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        movl      $-2147483648, %edx
+        andl      %ecx, %edx
+        andl      $1048575, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_19.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_20.0.2
+        movapd    2656(%ebx), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_19.0.2:
+        movapd    %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_20.0.2:
+        movapd    2656(%ebx), %xmm5
+        movapd    2624(%ebx), %xmm6
+        addpd     %xmm6, %xmm5
+        pshufd    $238, %xmm5, %xmm6
+        addpd     %xmm6, %xmm5
+        orpd      %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_9.0.2:
+        movd      %xmm1, %eax
+        movapd    %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        movl      $-2147483648, %edx
+        andl      %ecx, %edx
+        andl      $1048575, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_19.0.2
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_21.0.2
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_21.0.2:
+        movapd    2640(%ebx), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_14.0.2:
+        pextrw    $3, %xmm1, %edx
+        andl      $32768, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_22.0.2
+        movapd    2640(%ebx), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        comisd    %xmm0, %xmm1
+        orpd      %xmm5, %xmm0
+        jne       .L_2TAG_PACKET_23.0.2
+.L_2TAG_PACKET_24.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_23.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_22.0.2:
+        comisd    %xmm0, %xmm1
+        jne       .L_2TAG_PACKET_23.0.2
+        je        .L_2TAG_PACKET_24.0.2
+.L_2TAG_PACKET_15.0.2:
+        movapd    2624(%ebx), %xmm5
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+.L_2TAG_PACKET_4.0.2:
+        movl      64(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(atan2)
+# -- End  atan2
+
+# Start file scope ASM
+ALIAS_SYMBOL(atan2l, atan2);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	3390881280
+	.long	1067318733
+	.long	1411116779
+	.long	1018950063
+	.long	2985987840
+	.long	1067384211
+	.long	2088903695
+	.long	1018086027
+	.long	3148445184
+	.long	1067449685
+	.long	2044163806
+	.long	1017271335
+	.long	3667629184
+	.long	1067515494
+	.long	2353092775
+	.long	1019967309
+	.long	1546568832
+	.long	1067580954
+	.long	611991315
+	.long	1017602584
+	.long	3815996800
+	.long	1067646404
+	.long	466038598
+	.long	1019686426
+	.long	4050241920
+	.long	1067711845
+	.long	3265026328
+	.long	1019626952
+	.long	120454912
+	.long	1067777277
+	.long	1542207696
+	.long	1020155608
+	.long	2784639744
+	.long	1067842697
+	.long	3883834623
+	.long	1018602870
+	.long	1328010624
+	.long	1067908107
+	.long	1791097456
+	.long	1019053126
+	.long	2217794048
+	.long	1067973505
+	.long	551619938
+	.long	1018494194
+	.long	3333520000
+	.long	1068038891
+	.long	2390331823
+	.long	1019033022
+	.long	2557052032
+	.long	1068104265
+	.long	2423976108
+	.long	1019728674
+	.long	2067649536
+	.long	1068169626
+	.long	3757397745
+	.long	1018672362
+	.long	4047094784
+	.long	1068234973
+	.long	481613184
+	.long	1019275104
+	.long	2089853184
+	.long	1068300307
+	.long	1733914374
+	.long	1020124677
+	.long	2678003840
+	.long	1068365626
+	.long	1373600282
+	.long	1013935474
+	.long	3706496128
+	.long	1068430930
+	.long	1000610902
+	.long	1019673285
+	.long	3073179008
+	.long	1068496219
+	.long	1497143008
+	.long	1019900342
+	.long	2803716736
+	.long	1068562846
+	.long	1476677416
+	.long	1019444094
+	.long	3204984128
+	.long	1068628077
+	.long	1192335905
+	.long	1018748628
+	.long	831146624
+	.long	1068693273
+	.long	2733586224
+	.long	1018823295
+	.long	243029376
+	.long	1068758431
+	.long	950106081
+	.long	1019046675
+	.long	1735561920
+	.long	1068823549
+	.long	3546440856
+	.long	1020104712
+	.long	1339217792
+	.long	1068888626
+	.long	3028812387
+	.long	1019818321
+	.long	3706342144
+	.long	1068953659
+	.long	3814564029
+	.long	1017763871
+	.long	637726976
+	.long	1069018648
+	.long	3584007699
+	.long	1017976868
+	.long	1148779264
+	.long	1069083589
+	.long	2282532133
+	.long	1019483954
+	.long	1406131392
+	.long	1069148481
+	.long	1547359113
+	.long	1019786342
+	.long	1908875904
+	.long	1069213322
+	.long	1315508410
+	.long	1020009473
+	.long	3194947520
+	.long	1069278110
+	.long	3845393201
+	.long	1015803761
+	.long	1547487744
+	.long	1069342844
+	.long	3863107865
+	.long	1019810104
+	.long	1881061952
+	.long	1069407521
+	.long	4288343548
+	.long	1019687581
+	.long	563086336
+	.long	1069472140
+	.long	2582230241
+	.long	1020099350
+	.long	2594975552
+	.long	1069536698
+	.long	2306443764
+	.long	1019667244
+	.long	3438545024
+	.long	1069606573
+	.long	957455549
+	.long	1015587735
+	.long	4211357472
+	.long	1069670906
+	.long	2611778754
+	.long	1017877214
+	.long	3002835424
+	.long	1069735101
+	.long	235580458
+	.long	1020211685
+	.long	3905315424
+	.long	1069799150
+	.long	3630647617
+	.long	1018736849
+	.long	2849656576
+	.long	1069863047
+	.long	2412165062
+	.long	1019693004
+	.long	507429472
+	.long	1069926785
+	.long	1397750723
+	.long	1018412717
+	.long	2307470272
+	.long	1069990356
+	.long	1796470904
+	.long	1019796181
+	.long	1271814912
+	.long	1070053755
+	.long	189761565
+	.long	1016149115
+	.long	3800538144
+	.long	1070116974
+	.long	2524871582
+	.long	1018263353
+	.long	3916203552
+	.long	1070180008
+	.long	127848658
+	.long	1017672664
+	.long	457192032
+	.long	1070242851
+	.long	4020400938
+	.long	1019823010
+	.long	1385324704
+	.long	1070305495
+	.long	564511179
+	.long	1016079094
+	.long	2322869856
+	.long	1070367935
+	.long	2347103319
+	.long	1018927760
+	.long	3743438624
+	.long	1070430165
+	.long	877973862
+	.long	1019638162
+	.long	2392255552
+	.long	1070492180
+	.long	2432782267
+	.long	1018872629
+	.long	4180443328
+	.long	1070553973
+	.long	3102990015
+	.long	1020093101
+	.long	2547540832
+	.long	1070636485
+	.long	3877738253
+	.long	1017300424
+	.long	2735468912
+	.long	1070697461
+	.long	2446470256
+	.long	1019235378
+	.long	542633792
+	.long	1070757943
+	.long	583606328
+	.long	1018624131
+	.long	923265984
+	.long	1070817911
+	.long	1793926708
+	.long	1019714161
+	.long	918728448
+	.long	1070877348
+	.long	3726463586
+	.long	1019433296
+	.long	2572275008
+	.long	1070936237
+	.long	1845354238
+	.long	1019459238
+	.long	50974688
+	.long	1070994564
+	.long	983808064
+	.long	1016685418
+	.long	1105518320
+	.long	1071052313
+	.long	2357496692
+	.long	1015139882
+	.long	1264825328
+	.long	1071109472
+	.long	2244129354
+	.long	1019046344
+	.long	961157920
+	.long	1071166029
+	.long	3124185339
+	.long	1018541776
+	.long	1162701584
+	.long	1071221973
+	.long	1279780948
+	.long	1019268918
+	.long	3284935664
+	.long	1071277294
+	.long	2670033472
+	.long	1019833744
+	.long	497441888
+	.long	1071331985
+	.long	1032737410
+	.long	1019795212
+	.long	3377383904
+	.long	1071386036
+	.long	2356897182
+	.long	1020205553
+	.long	1126962000
+	.long	1071439443
+	.long	3723724586
+	.long	1015212418
+	.long	90291008
+	.long	1071492199
+	.long	4178672431
+	.long	1020186971
+	.long	190059536
+	.long	1071595741
+	.long	1763589807
+	.long	1019162163
+	.long	2497392840
+	.long	1071670654
+	.long	3036997041
+	.long	1020204325
+	.long	2616971944
+	.long	1071719773
+	.long	300151069
+	.long	1017041957
+	.long	2883518128
+	.long	1071767563
+	.long	2203981414
+	.long	1019190108
+	.long	1496354352
+	.long	1071814030
+	.long	332287966
+	.long	1016846435
+	.long	483276728
+	.long	1071859184
+	.long	653845024
+	.long	1018830914
+	.long	3097401072
+	.long	1071903039
+	.long	1514746408
+	.long	1019278972
+	.long	2737217248
+	.long	1071945615
+	.long	1358845067
+	.long	1017268275
+	.long	2072577560
+	.long	1071986933
+	.long	3041024735
+	.long	1019929672
+	.long	2266405656
+	.long	1072027017
+	.long	1271261130
+	.long	1012925070
+	.long	958652544
+	.long	1072065894
+	.long	2158017058
+	.long	1019955372
+	.long	3312993840
+	.long	1072103591
+	.long	765809169
+	.long	1019114443
+	.long	3177001304
+	.long	1072140139
+	.long	144180084
+	.long	1019822186
+	.long	3071642184
+	.long	1072175568
+	.long	4004602424
+	.long	1019420740
+	.long	4283953648
+	.long	1072209909
+	.long	1511950430
+	.long	1020176966
+	.long	1413754136
+	.long	1072243195
+	.long	856972295
+	.long	1015129638
+	.long	4073202944
+	.long	1072306725
+	.long	4068194804
+	.long	1019714860
+	.long	946117760
+	.long	1072366415
+	.long	694980733
+	.long	1020150135
+	.long	3980632032
+	.long	1072422512
+	.long	1313251280
+	.long	1019948709
+	.long	1468297112
+	.long	1072475260
+	.long	330111143
+	.long	1019809198
+	.long	3478063816
+	.long	1072524887
+	.long	2930067044
+	.long	1017784081
+	.long	1153979856
+	.long	1072571613
+	.long	2225786102
+	.long	1017634481
+	.long	2089828808
+	.long	1072615641
+	.long	474621367
+	.long	1017043414
+	.long	3531732632
+	.long	1072657163
+	.long	2276396220
+	.long	1018757240
+	.long	775214612
+	.long	1072694803
+	.long	3209744818
+	.long	1019963015
+	.long	662307284
+	.long	1072713319
+	.long	1381696763
+	.long	1019763781
+	.long	1192776652
+	.long	1072730830
+	.long	3017932994
+	.long	1015179769
+	.long	744202396
+	.long	1072747407
+	.long	2073854034
+	.long	1019512292
+	.long	8337908
+	.long	1072763115
+	.long	16004448
+	.long	1019599514
+	.long	3589868768
+	.long	1072778013
+	.long	1374369804
+	.long	1018019237
+	.long	121647320
+	.long	1072792159
+	.long	128481634
+	.long	1018115438
+	.long	2464923204
+	.long	1072805601
+	.long	1787331214
+	.long	1016798022
+	.long	4093304372
+	.long	1072830562
+	.long	3306868969
+	.long	1019384078
+	.long	1436891684
+	.long	1072853231
+	.long	676347266
+	.long	1017302183
+	.long	1104571840
+	.long	1072873890
+	.long	2870400285
+	.long	1019938149
+	.long	2037009832
+	.long	1072892781
+	.long	2956702105
+	.long	1016472908
+	.long	3139037960
+	.long	1072910111
+	.long	916057147
+	.long	1018364335
+	.long	1826698064
+	.long	1072926058
+	.long	2171961098
+	.long	1019669816
+	.long	1353941060
+	.long	1072940774
+	.long	1722928782
+	.long	1019926215
+	.long	1803191644
+	.long	1072954391
+	.long	1547878639
+	.long	1020259262
+	.long	1092591296
+	.long	1072967024
+	.long	3070107923
+	.long	1018320401
+	.long	2205372832
+	.long	1072978772
+	.long	787328196
+	.long	1014621351
+	.long	1291577100
+	.long	1072989723
+	.long	2964757301
+	.long	1020242528
+	.long	4234512804
+	.long	1072999952
+	.long	3136030038
+	.long	1017522144
+	.long	3248069132
+	.long	1073009528
+	.long	1506192355
+	.long	1018050472
+	.long	3932628500
+	.long	1073018509
+	.long	1045823554
+	.long	1019946655
+	.long	4195697848
+	.long	1073026948
+	.long	233443322
+	.long	1018917447
+	.long	2501811452
+	.long	1073034892
+	.long	901427976
+	.long	1017333852
+	.long	866379428
+	.long	1073049455
+	.long	2437443742
+	.long	1019678792
+	.long	1376865888
+	.long	1073062480
+	.long	3365790232
+	.long	1014547152
+	.long	3290094268
+	.long	1073074195
+	.long	3898947415
+	.long	1018683566
+	.long	354764884
+	.long	1073084787
+	.long	3854322404
+	.long	1019662058
+	.long	3332975496
+	.long	1073094406
+	.long	3171701655
+	.long	1017830922
+	.long	1141460088
+	.long	1073103181
+	.long	3946082701
+	.long	1020032019
+	.long	745761284
+	.long	1073111216
+	.long	1347210591
+	.long	1019106121
+	.long	1673304508
+	.long	1073118600
+	.long	1760606642
+	.long	1017324577
+	.long	983388240
+	.long	1073125409
+	.long	3740651204
+	.long	1019514104
+	.long	3895509100
+	.long	1073131706
+	.long	2409629983
+	.long	1020069322
+	.long	2128523668
+	.long	1073137548
+	.long	3045605368
+	.long	1018579174
+	.long	2075485692
+	.long	1073142981
+	.long	3720571789
+	.long	1017557436
+	.long	121855976
+	.long	1073148047
+	.long	2391744767
+	.long	1020160645
+	.long	4181733780
+	.long	1073152780
+	.long	995028816
+	.long	1019681295
+	.long	2887813280
+	.long	1073157214
+	.long	218733247
+	.long	1020003509
+	.long	2862180896
+	.long	1073161375
+	.long	2043806490
+	.long	1018602288
+	.long	3909375184
+	.long	1073168973
+	.long	1559903412
+	.long	1020103444
+	.long	3533966292
+	.long	1073175738
+	.long	734884149
+	.long	1018462962
+	.long	3815044608
+	.long	1073181799
+	.long	3630523428
+	.long	1017250093
+	.long	739639376
+	.long	1073187261
+	.long	4167476661
+	.long	1020008277
+	.long	1068309648
+	.long	1073192207
+	.long	2110061437
+	.long	1019295858
+	.long	2350566352
+	.long	1073196707
+	.long	582596516
+	.long	1018568821
+	.long	2529520024
+	.long	1073200819
+	.long	745552787
+	.long	1019053165
+	.long	1841667508
+	.long	1073204591
+	.long	3982568700
+	.long	1016503327
+	.long	2242261080
+	.long	1073208063
+	.long	3433582258
+	.long	1016196763
+	.long	715134328
+	.long	1073211270
+	.long	355901358
+	.long	1020087916
+	.long	2700735876
+	.long	1073214240
+	.long	3640957736
+	.long	1019780205
+	.long	141607580
+	.long	1073217000
+	.long	2488245051
+	.long	1020262395
+	.long	287934404
+	.long	1073219570
+	.long	2392691085
+	.long	1019883292
+	.long	2363373988
+	.long	1073221969
+	.long	4194561737
+	.long	1019237447
+	.long	3829340424
+	.long	1073224214
+	.long	429455526
+	.long	1019490975
+	.long	1988805928
+	.long	1073226320
+	.long	3029848706
+	.long	1018104889
+	.long	1647572320
+	.long	1073230161
+	.long	10289938
+	.long	1017394880
+	.long	3988000624
+	.long	1073233576
+	.long	1957559169
+	.long	1019434816
+	.long	4263843944
+	.long	1073236633
+	.long	204710264
+	.long	1019908761
+	.long	663197724
+	.long	1073239386
+	.long	1921757578
+	.long	1019778948
+	.long	3560800700
+	.long	1073241876
+	.long	3994348896
+	.long	1019230192
+	.long	2441785656
+	.long	1073244141
+	.long	871468611
+	.long	1014800505
+	.long	3277400272
+	.long	1073246209
+	.long	4092218139
+	.long	1020040842
+	.long	3951990120
+	.long	1073248105
+	.long	4276546478
+	.long	1019763677
+	.long	2737338540
+	.long	1073249850
+	.long	252776012
+	.long	1018794951
+	.long	1511361316
+	.long	1073251461
+	.long	3119653999
+	.long	1018514803
+	.long	3969162516
+	.long	1073252952
+	.long	1037069016
+	.long	1016792900
+	.long	413985240
+	.long	1073254338
+	.long	4110171432
+	.long	1020001345
+	.long	3681283576
+	.long	1073255627
+	.long	1463092818
+	.long	1020260354
+	.long	3146455488
+	.long	1073256831
+	.long	1031209123
+	.long	1016554799
+	.long	95214512
+	.long	1073257958
+	.long	1373808632
+	.long	1019493031
+	.long	4250240828
+	.long	1073259013
+	.long	3891047882
+	.long	1020108730
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	1072243195
+	.long	856972295
+	.long	1015129638
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	3221823995
+	.long	856972295
+	.long	3164710438
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	3164710438
+	.long	1413754136
+	.long	3221823995
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	2006262985
+	.long	1069310863
+	.long	2358449471
+	.long	3217342131
+	.long	3845454352
+	.long	1069952297
+	.long	2829679149
+	.long	1073771565
+	.long	4294967295
+	.long	2148532223
+	.long	0
+	.long	0
+	.long	0
+	.long	1130364928
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.type	static_const_table,@object
+	.size	static_const_table,3024
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_cosh.S b/libm/x86/e_cosh.S
new file mode 100644
index 0000000..ecea8f4
--- /dev/null
+++ b/libm/x86/e_cosh.S
@@ -0,0 +1,1349 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  cosh(x)=(exp(x)+exp(-x))/2
+//
+//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//          L2EH+L2EL (upper 26, lower 53 bits)
+//
+//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
+//                              f=0.b1 b2 ... b7, k integer
+//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
+//  Tp stores higher 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
+//
+//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
+//                       for |x| in [1/8,3*2^8)
+//  e^{-|x|}=2^{-k-f}*2^{-r}
+//
+//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
+//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
+//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)
+//
+//  For |x| in [1/8, 3*2^7), cosh(x) is formed as
+//   RN(2^k*Tp+2^{-k}*Tn)+2^k*Tp*P15+2^{-k}*Tn*P`15+2^{-k}*TnL+2^{-k}*Dn+2^k*Dp
+//
+//  For |x| in [3*2^7, 3*2^8), (e^|x|)/2 is returned, and
+//  the result is checked for overflow.
+//
+//  For |x|<1/8, a Taylor polynomial expansion is used (degree 10)
+//  (error bound for polynomial expansion is below 0.501 ulp)
+//
+// Special cases:
+//  cosh(NaN) = quiet NaN, and raise invalid exception
+//  cosh(INF) = that INF
+//  cosh(0)=1
+//  for finite argument, only cosh(0)=1 is exact
+//  For IEEE double
+//  cosh(x) overflows
+//  for x > 710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  cosh
+ENTRY(cosh)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        movsd     4240(%ebx), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     4192(%ebx), %xmm1
+        movsd     4200(%ebx), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     4096(%ebx), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        andl      $32767, %ecx
+        subl      $16320, %ecx
+        cmpl      $200, %ecx
+        jae       .L_2TAG_PACKET_0.0.2
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        movapd    %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        xorpd     %xmm5, %xmm5
+        subsd     %xmm6, %xmm3
+        movapd    4112(%ebx), %xmm4
+        addsd     %xmm1, %xmm2
+        movapd    4128(%ebx), %xmm6
+        subsd     %xmm3, %xmm7
+        movl      $32704, %edx
+        pinsrw    $3, %edx, %xmm5
+        movapd    4144(%ebx), %xmm1
+        addsd     %xmm7, %xmm2
+        movl      $127, %edx
+        andl      %eax, %edx
+        addl      %edx, %edx
+        shrl      $3, %eax
+        andl      $65520, %eax
+        addl      $16352, %eax
+        xorpd     %xmm0, %xmm0
+        cmpl      $184, %ecx
+        jae       .L_2TAG_PACKET_1.0.2
+        pshufd    $68, %xmm5, %xmm5
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        psubw     %xmm0, %xmm5
+        mulpd     (%ebx,%edx,8), %xmm0
+        mulpd     2048(%ebx,%edx,8), %xmm5
+        pshufd    $68, %xmm2, %xmm3
+        movapd    4160(%ebx), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        mulpd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulpd     4176(%ebx), %xmm2
+        mulpd     %xmm3, %xmm1
+        mulpd     %xmm3, %xmm7
+        mulpd     %xmm3, %xmm4
+        mulpd     %xmm3, %xmm1
+        addpd     %xmm7, %xmm6
+        movapd    %xmm0, %xmm7
+        addpd     %xmm1, %xmm4
+        shufpd    $0, %xmm5, %xmm7
+        addpd     %xmm5, %xmm0
+        mulpd     %xmm7, %xmm2
+        addpd     %xmm6, %xmm4
+        subsd     %xmm0, %xmm7
+        mulpd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm5, %xmm7
+        addpd     %xmm2, %xmm4
+        addsd     %xmm6, %xmm7
+        pshufd    $238, %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        addl      $16320, %ecx
+        cmpl      $16320, %ecx
+        ja        .L_2TAG_PACKET_3.0.2
+        cmpl      $15952, %ecx
+        jae       .L_2TAG_PACKET_4.0.2
+        addsd     %xmm2, %xmm6
+        movsd     4248(%ebx), %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_1.0.2:
+        subl      $16352, %eax
+        movl      %eax, %ecx
+        andl      $32752, %eax
+        shrl      $1, %eax
+        andl      $65520, %eax
+        subl      %eax, %ecx
+        addl      $16352, %eax
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        mulpd     (%ebx,%edx,8), %xmm0
+        pshufd    $68, %xmm2, %xmm3
+        movsd     4160(%ebx), %xmm7
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     4176(%ebx), %xmm2
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm3, %xmm4
+        addl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm5
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm6, %xmm4
+        mulsd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm6, %xmm4
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm5, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        movl      $64, %edx
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_5.0.2
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_4.0.2:
+        movapd    4208(%ebx), %xmm1
+        mulpd     %xmm5, %xmm5
+        movapd    4224(%ebx), %xmm2
+        xorpd     %xmm3, %xmm3
+        movapd    %xmm5, %xmm0
+        mulpd     %xmm5, %xmm1
+        movsd     4248(%ebx), %xmm6
+        mulpd     %xmm5, %xmm5
+        movl      $16352, %eax
+        pinsrw    $3, %eax, %xmm3
+        addpd     %xmm2, %xmm1
+        mulpd     %xmm5, %xmm1
+        pshufd    $238, %xmm1, %xmm2
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm2
+        addsd     %xmm2, %xmm0
+        addsd     %xmm6, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_3.0.2:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $64, %edx
+.L_2TAG_PACKET_5.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     112(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_6.0.2:
+        mulsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_2.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_7.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(cosh)
+# -- End  cosh
+
+# Start file scope ASM
+ALIAS_SYMBOL(coshl, cosh);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	3706687593
+	.long	1073526560
+	.long	3521726940
+	.long	1014301643
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.long	3607404736
+	.long	1044146952
+	.long	3607404736
+	.long	3191630600
+	.long	4277811695
+	.long	1063661122
+	.long	4277811695
+	.long	3211144770
+	.long	2140175755
+	.long	1033864261
+	.long	2140175755
+	.long	1033864261
+	.long	4289495988
+	.long	1054113747
+	.long	4289495988
+	.long	1054113747
+	.long	4277811695
+	.long	1064709698
+	.long	4277811695
+	.long	3212193346
+	.long	1610612736
+	.long	1080497479
+	.long	4166901572
+	.long	1053077003
+	.long	3078135644
+	.long	1049787983
+	.long	381774870
+	.long	1062650220
+	.long	436314137
+	.long	1056571808
+	.long	1431655765
+	.long	1067799893
+	.long	4160749568
+	.long	2147483647
+	.long	0
+	.long	1072693248
+	.type	static_const_table,@object
+	.size	static_const_table,4256
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_exp.S b/libm/x86/e_exp.S
new file mode 100644
index 0000000..eab619d
--- /dev/null
+++ b/libm/x86/e_exp.S
@@ -0,0 +1,576 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Description:
+//  Let K = 64 (table size).
+//        x    x/log(2)     n
+//       e  = 2          = 2 * T[j] * (1 + P(y))
+//  where
+//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
+//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
+//                  j/K
+//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
+//
+//       P(y) is a minimax polynomial approximation of exp(x)-1
+//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
+//
+//  To avoid problems with arithmetic overflow and underflow,
+//            n                        n1  n2
+//  value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
+//  where BIAS is a value of exponent bias.
+//
+// Special cases:
+//  exp(NaN) = NaN
+//  exp(+INF) = +INF
+//  exp(-INF) = 0
+//  exp(x) = 1 for subnormals
+//  for finite argument, only exp(0)=1 is exact
+//  For IEEE double
+//    if x >  709.782712893383973096 then exp(x) overflow
+//    if x < -745.133219101941108420 then exp(x) underflow
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  exp
+ENTRY(exp)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 64(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        unpcklpd  %xmm0, %xmm0
+        movapd    64(%ebx), %xmm1
+        movapd    48(%ebx), %xmm6
+        movapd    80(%ebx), %xmm2
+        movapd    96(%ebx), %xmm3
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        movl      $16527, %edx
+        subl      %eax, %edx
+        subl      $15504, %eax
+        orl       %eax, %edx
+        cmpl      $-2147483648, %edx
+        jae       .L_2TAG_PACKET_0.0.2
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm6, %xmm1
+        movapd    %xmm1, %xmm7
+        subpd     %xmm6, %xmm1
+        mulpd     %xmm1, %xmm2
+        movapd    128(%ebx), %xmm4
+        mulpd     %xmm1, %xmm3
+        movapd    144(%ebx), %xmm5
+        subpd     %xmm2, %xmm0
+        movd      %xmm7, %eax
+        movl      %eax, %ecx
+        andl      $63, %ecx
+        shll      $4, %ecx
+        sarl      $6, %eax
+        movl      %eax, %edx
+        movdqa    16(%ebx), %xmm6
+        pand      %xmm6, %xmm7
+        movdqa    32(%ebx), %xmm6
+        paddq     %xmm6, %xmm7
+        psllq     $46, %xmm7
+        subpd     %xmm3, %xmm0
+        movapd    160(%ebx,%ecx), %xmm2
+        mulpd     %xmm0, %xmm4
+        movapd    %xmm0, %xmm6
+        movapd    %xmm0, %xmm1
+        mulpd     %xmm6, %xmm6
+        mulpd     %xmm6, %xmm0
+        addpd     %xmm4, %xmm5
+        mulsd     %xmm6, %xmm0
+        mulpd     112(%ebx), %xmm6
+        addsd     %xmm2, %xmm1
+        unpckhpd  %xmm2, %xmm2
+        mulpd     %xmm5, %xmm0
+        addsd     %xmm0, %xmm1
+        orpd      %xmm7, %xmm2
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        addsd     %xmm6, %xmm0
+        addl      $894, %edx
+        cmpl      $1916, %edx
+        ja        .L_2TAG_PACKET_1.0.2
+        mulsd     %xmm2, %xmm0
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_1.0.2:
+        fstcw     24(%esp)
+        movzwl    24(%esp), %edx
+        orl       $768, %edx
+        movw      %dx, 28(%esp)
+        fldcw     28(%esp)
+        movl      %eax, %edx
+        sarl      $1, %eax
+        subl      %eax, %edx
+        movdqa    (%ebx), %xmm6
+        pandn     %xmm2, %xmm6
+        addl      $1023, %eax
+        movd      %eax, %xmm3
+        psllq     $52, %xmm3
+        orpd      %xmm3, %xmm6
+        addl      $1023, %edx
+        movd      %edx, %xmm4
+        psllq     $52, %xmm4
+        movsd     %xmm0, 8(%esp)
+        fldl      8(%esp)
+        movsd     %xmm6, 16(%esp)
+        fldl      16(%esp)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        movsd     %xmm4, 8(%esp)
+        fldl      8(%esp)
+        fmulp     %st, %st(1)
+        fstpl     8(%esp)
+        movsd     8(%esp), %xmm0
+        fldcw     24(%esp)
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_3.0.2
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_4.0.2
+        jmp       .L_2TAG_PACKET_2.0.2
+        cmpl      $-2147483648, %ecx
+        jb        .L_2TAG_PACKET_3.0.2
+        cmpl      $-1064950997, %ecx
+        jb        .L_2TAG_PACKET_2.0.2
+        ja        .L_2TAG_PACKET_4.0.2
+        movl      128(%esp), %edx
+        cmpl      $-17155601, %edx
+        jb        .L_2TAG_PACKET_2.0.2
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_3.0.2:
+        movl      $14, %edx
+        jmp       .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_4.0.2:
+        movl      $15, %edx
+.L_2TAG_PACKET_5.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     128(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_7.0.2:
+        cmpl      $2146435072, %eax
+        jae       .L_2TAG_PACKET_8.0.2
+        movl      132(%esp), %eax
+        cmpl      $-2147483648, %eax
+        jae       .L_2TAG_PACKET_9.0.2
+        movsd     1208(%ebx), %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $14, %edx
+        jmp       .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_9.0.2:
+        movsd     1216(%ebx), %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $15, %edx
+        jmp       .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_8.0.2:
+        movl      128(%esp), %edx
+        cmpl      $2146435072, %eax
+        ja        .L_2TAG_PACKET_10.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_10.0.2
+        movl      132(%esp), %eax
+        cmpl      $2146435072, %eax
+        jne       .L_2TAG_PACKET_11.0.2
+        movsd     1192(%ebx), %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_11.0.2:
+        movsd     1200(%ebx), %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_10.0.2:
+        movsd     128(%esp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        movl      132(%esp), %eax
+        andl      $2147483647, %eax
+        cmpl      $1083179008, %eax
+        jae       .L_2TAG_PACKET_7.0.2
+        movsd     128(%esp), %xmm0
+        addsd     1184(%ebx), %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_2.0.2:
+        movsd     %xmm0, 48(%esp)
+        fldl      48(%esp)
+.L_2TAG_PACKET_6.0.2:
+        movl      64(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(exp)
+# -- End  exp
+
+# Start file scope ASM
+ALIAS_SYMBOL(expl, exp);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	4293918720
+	.long	0
+	.long	4293918720
+	.long	4294967232
+	.long	0
+	.long	4294967232
+	.long	0
+	.long	65472
+	.long	0
+	.long	65472
+	.long	0
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	1127743488
+	.long	1697350398
+	.long	1079448903
+	.long	1697350398
+	.long	1079448903
+	.long	4277796864
+	.long	1065758274
+	.long	4277796864
+	.long	1065758274
+	.long	3164486458
+	.long	1025308570
+	.long	3164486458
+	.long	1025308570
+	.long	4294967294
+	.long	1071644671
+	.long	4294967294
+	.long	1071644671
+	.long	3811088480
+	.long	1062650204
+	.long	1432067621
+	.long	1067799893
+	.long	3230715663
+	.long	1065423125
+	.long	1431604129
+	.long	1069897045
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	235107661
+	.long	1018002367
+	.long	1048019040
+	.long	11418
+	.long	896005651
+	.long	1015861842
+	.long	3541402996
+	.long	22960
+	.long	1642514529
+	.long	1012987726
+	.long	410360776
+	.long	34629
+	.long	1568897900
+	.long	1016568486
+	.long	1828292879
+	.long	46424
+	.long	1882168529
+	.long	1010744893
+	.long	852742562
+	.long	58348
+	.long	509852888
+	.long	1017336174
+	.long	3490863952
+	.long	70401
+	.long	653277307
+	.long	1017431380
+	.long	2930322911
+	.long	82586
+	.long	1649557430
+	.long	1017729363
+	.long	1014845818
+	.long	94904
+	.long	1058231231
+	.long	1015777676
+	.long	3949972341
+	.long	107355
+	.long	1044000607
+	.long	1016786167
+	.long	828946858
+	.long	119943
+	.long	1151779725
+	.long	1015705409
+	.long	2288159958
+	.long	132667
+	.long	3819481236
+	.long	1016499965
+	.long	1853186616
+	.long	145530
+	.long	2552227826
+	.long	1015039787
+	.long	1709341917
+	.long	158533
+	.long	1829350193
+	.long	1015216097
+	.long	4112506593
+	.long	171677
+	.long	1913391795
+	.long	1015756674
+	.long	2799960843
+	.long	184965
+	.long	1303423926
+	.long	1015238005
+	.long	171030293
+	.long	198398
+	.long	1574172746
+	.long	1016061241
+	.long	2992903935
+	.long	211976
+	.long	3424156969
+	.long	1017196428
+	.long	926591434
+	.long	225703
+	.long	1938513547
+	.long	1017631273
+	.long	887463926
+	.long	239579
+	.long	2804567149
+	.long	1015390024
+	.long	1276261410
+	.long	253606
+	.long	631083525
+	.long	1017690182
+	.long	569847337
+	.long	267786
+	.long	1623370770
+	.long	1011049453
+	.long	1617004845
+	.long	282120
+	.long	3667985273
+	.long	1013894369
+	.long	3049340112
+	.long	296610
+	.long	3145379760
+	.long	1014403278
+	.long	3577096743
+	.long	311258
+	.long	2603100681
+	.long	1017152460
+	.long	1990012070
+	.long	326066
+	.long	3249202951
+	.long	1017448880
+	.long	1453150081
+	.long	341035
+	.long	419288974
+	.long	1016280325
+	.long	917841882
+	.long	356167
+	.long	3793507337
+	.long	1016095713
+	.long	3712504873
+	.long	371463
+	.long	728023093
+	.long	1016345318
+	.long	363667784
+	.long	386927
+	.long	2582678538
+	.long	1017123460
+	.long	2956612996
+	.long	402558
+	.long	7592966
+	.long	1016721543
+	.long	2186617380
+	.long	418360
+	.long	228611441
+	.long	1016696141
+	.long	1719614412
+	.long	434334
+	.long	2261665670
+	.long	1017457593
+	.long	1013258798
+	.long	450482
+	.long	544148907
+	.long	1017323666
+	.long	3907805043
+	.long	466805
+	.long	2383914918
+	.long	1017143586
+	.long	1447192520
+	.long	483307
+	.long	1176412038
+	.long	1017267372
+	.long	1944781190
+	.long	499988
+	.long	2882956373
+	.long	1013312481
+	.long	919555682
+	.long	516851
+	.long	3154077648
+	.long	1016528543
+	.long	2571947538
+	.long	533897
+	.long	348651999
+	.long	1016405780
+	.long	2604962540
+	.long	551129
+	.long	3253791412
+	.long	1015920431
+	.long	1110089947
+	.long	568549
+	.long	1509121860
+	.long	1014756995
+	.long	2568320822
+	.long	586158
+	.long	2617649212
+	.long	1017340090
+	.long	2966275556
+	.long	603959
+	.long	553214634
+	.long	1016457425
+	.long	2682146383
+	.long	621954
+	.long	730975783
+	.long	1014083580
+	.long	2191782032
+	.long	640145
+	.long	1486499517
+	.long	1016818996
+	.long	2069751140
+	.long	658534
+	.long	2595788928
+	.long	1016407932
+	.long	2990417244
+	.long	677123
+	.long	1853053619
+	.long	1015310724
+	.long	1434058175
+	.long	695915
+	.long	2462790535
+	.long	1015814775
+	.long	2572866477
+	.long	714911
+	.long	3693944214
+	.long	1017259110
+	.long	3092190714
+	.long	734114
+	.long	2979333550
+	.long	1017188654
+	.long	4076559942
+	.long	753526
+	.long	174054861
+	.long	1014300631
+	.long	2420883922
+	.long	773150
+	.long	816778419
+	.long	1014197934
+	.long	3716502172
+	.long	792987
+	.long	3507050924
+	.long	1015341199
+	.long	777507147
+	.long	813041
+	.long	1821514088
+	.long	1013410604
+	.long	3706687593
+	.long	833312
+	.long	920623539
+	.long	1016295433
+	.long	1242007931
+	.long	853805
+	.long	2789017511
+	.long	1014276997
+	.long	3707479175
+	.long	874520
+	.long	3586233004
+	.long	1015962192
+	.long	64696965
+	.long	895462
+	.long	474650514
+	.long	1016642419
+	.long	863738718
+	.long	916631
+	.long	1614448851
+	.long	1014281732
+	.long	3884662774
+	.long	938030
+	.long	2450082086
+	.long	1016164135
+	.long	2728693977
+	.long	959663
+	.long	1101668360
+	.long	1015989180
+	.long	3999357479
+	.long	981531
+	.long	835814894
+	.long	1015702697
+	.long	1533953344
+	.long	1003638
+	.long	1301400989
+	.long	1014466875
+	.long	2174652632
+	.long	1025985
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	2146435071
+	.long	0
+	.long	1048576
+	.type	static_const_table,@object
+	.size	static_const_table,1224
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_hypot.S b/libm/x86/e_hypot.S
new file mode 100644
index 0000000..6a143e5
--- /dev/null
+++ b/libm/x86/e_hypot.S
@@ -0,0 +1,220 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// X87 version:
+// Use 80-bit FPU precision fmul, fsqrt to compute square and sqrt.
+//
+// SSE version:
+// Swap x, y if |x|<|y|
+// For x=2^k*x, get y=y*2^(-k)
+// Get S ~ sqrt(x^2+y^2)  (leading 1 + leading 25 mantissa bits)
+//
+// Get D = ( RN(x^2+y^2) - S^2 ) + ( x^2 - RN(x^2) ) +
+//                               + ( y^2 - ((RN(x^2+y^2)-RN(x^2)) )
+//
+// Result is 2^k*(S + Se),  where Se = S*e
+//        S*e is approximated as (D/2S)*( 1 - (D/2S)^2*1.0/S )
+//
+// Return 2^k*(S+Se)
+//
+// For |y/x|<2^(-64), return x
+//
+// For cases where maximum biased exponent is either greater than 7fdh or
+// below 32, take a special path to check for special cases (0, NaN, Inf),
+// possible overflow, and more accurate computation for denormal results
+//
+// Special cases:
+//  hypot(x,y), hypot(y,x), and hypot(x,-y) are equivalent
+//  hypot(x,+-0) is equivalent to fabs(x)
+//  hypot(x,y) = y if (x==NaN or x==INF) and y==INF
+//  hypot(x,y) = x if (x==NaN or x==INF) and y!=INF (even if y==NaN!)
+//  hypot(x,y) = y if (x!=NaN and x!=INF) and (y==NaN or y==INF)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  hypot
+ENTRY(hypot)
+# parameter 1: 8 + %ebp
+# parameter 2: 16 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $152, %esp
+        movl      %ebx, 96(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movapd    (%ebx), %xmm3
+        movsd     160(%esp), %xmm0
+        movsd     168(%esp), %xmm1
+        andpd     %xmm3, %xmm0
+        andpd     %xmm3, %xmm1
+        pextrw    $3, %xmm0, %eax
+        pextrw    $3, %xmm1, %edx
+        cmpl      $24528, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        cmpl      $24528, %edx
+        ja        .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        fldl      160(%esp)
+        fldl      168(%esp)
+        fxch      %st(1)
+        fmul      %st(0), %st
+        fxch      %st(1)
+        nop       
+        fmul      %st(0), %st
+        faddp     %st, %st(1)
+        fsqrt     
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        cmpl      $32752, %eax
+        movl      %eax, %ecx
+        jae       .L_2TAG_PACKET_3.0.2
+        subl      %edx, %ecx
+        cmpl      $32752, %edx
+        jae       .L_2TAG_PACKET_3.0.2
+        addl      $928, %ecx
+        addl      %edx, %eax
+        cmpl      $1856, %ecx
+        ja        .L_2TAG_PACKET_4.0.2
+        cmpl      $49056, %eax
+        jb        .L_2TAG_PACKET_1.0.2
+        fldl      160(%esp)
+        fldl      168(%esp)
+        fxch      %st(1)
+        fmul      %st(0), %st
+        fxch      %st(1)
+        nop       
+        fmul      %st(0), %st
+        faddp     %st, %st(1)
+        fsqrt     
+.L_2TAG_PACKET_5.0.2:
+        fstl      (%esp)
+        fstpt     16(%esp)
+        xorl      %eax, %eax
+        movw      24(%esp), %ax
+        cmpl      $17407, %eax
+        jae       .L_2TAG_PACKET_6.0.2
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_4.0.2:
+        movsd     %xmm0, 32(%esp)
+        movsd     %xmm1, 40(%esp)
+        fldl      32(%esp)
+        faddl     40(%esp)
+        jmp       .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_6.0.2:
+        movl      $46, %edx
+.L_2TAG_PACKET_8.0.2:
+        movsd     160(%esp), %xmm0
+        movsd     168(%esp), %xmm1
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_3.0.2:
+        shufpd    $0, %xmm1, %xmm0
+        movdqa    %xmm0, %xmm2
+        movdqa    16(%ebx), %xmm3
+        movsd     %xmm0, 32(%esp)
+        movsd     %xmm1, 40(%esp)
+        cmppd     $3, %xmm0, %xmm2
+        cmppd     $0, %xmm0, %xmm3
+        movmskpd  %xmm2, %edx
+        movmskpd  %xmm3, %eax
+        testl     %edx, %edx
+        je        .L_2TAG_PACKET_9.0.2
+        fldl      32(%esp)
+        fmull     40(%esp)
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_10.0.2
+        testl     $2, %eax
+        jne       .L_2TAG_PACKET_11.0.2
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_9.0.2:
+        fldl      32(%esp)
+        faddl     40(%esp)
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_10.0.2:
+        fstpl     40(%esp)
+        fldl      32(%esp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_11.0.2:
+        fstpl     32(%esp)
+        fldl      40(%esp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_2.0.2:
+.L_2TAG_PACKET_7.0.2:
+        movl      96(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(hypot)
+# -- End  hypot
+
+# Start file scope ASM
+ALIAS_SYMBOL(hypotl, hypot);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	4294967295
+	.long	2147483647
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	2146435072
+	.type	static_const_table,@object
+	.size	static_const_table,32
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_log.S b/libm/x86/e_log.S
new file mode 100644
index 0000000..a6181ca
--- /dev/null
+++ b/libm/x86/e_log.S
@@ -0,0 +1,780 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpss instruction (B0)
+//    B = int((B0*2^7+0.5))/2^7
+//
+//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
+//
+//    Result:  k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6)  and
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//  log(NaN) = quiet NaN, and raise invalid exception
+//  log(+INF) = that INF
+//  log(0) = -INF with divide-by-zero exception raised
+//  log(1) = +0
+//  log(x) = NaN with invalid exception raised if x < -0, including -INF
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  log
+ENTRY(log)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        xorpd     %xmm3, %xmm3
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm3
+        movsd     112(%esp), %xmm0
+        movapd    %xmm0, %xmm1
+        movl      $32768, %ecx
+        movd      %ecx, %xmm4
+        movsd     2128(%ebx), %xmm5
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        psllq     $5, %xmm0
+        movl      $16352, %ecx
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        paddd     %xmm4, %xmm0
+        orpd      %xmm3, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm1, %xmm5
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm1
+        mulpd     %xmm0, %xmm5
+        andl      $32752, %eax
+        subl      %ecx, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulsd     %xmm0, %xmm1
+        movsd     2064(%ebx), %xmm6
+        movapd    2080(%ebx), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    (%ebx,%edx), %xmm0
+        movapd    2096(%ebx), %xmm4
+        addsd     %xmm5, %xmm1
+        movapd    2112(%ebx), %xmm2
+        mulsd     %xmm7, %xmm6
+        pshufd    $68, %xmm1, %xmm5
+        mulsd     2072(%ebx), %xmm7
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm4
+        mulpd     %xmm5, %xmm5
+        pshufd    $228, %xmm0, %xmm6
+        addsd     %xmm1, %xmm0
+        addpd     %xmm2, %xmm4
+        mulpd     %xmm5, %xmm3
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm4
+        pshufd    $238, %xmm0, %xmm2
+        addsd     %xmm6, %xmm1
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm2, %xmm7
+        addpd     %xmm3, %xmm4
+        addsd     %xmm7, %xmm1
+        mulpd     %xmm5, %xmm4
+        addsd     %xmm4, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        movsd     112(%esp), %xmm0
+        movapd    %xmm0, %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        cmpl      $16, %eax
+        jb        .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_6.0.2:
+        ja        .L_2TAG_PACKET_5.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_5.0.2
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_3.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        movl      $3, %edx
+        mulsd     %xmm1, %xmm0
+.L_2TAG_PACKET_9.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     112(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_10.0.2
+.L_2TAG_PACKET_8.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $2, %edx
+        jmp       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_4.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_8.0.2
+        xorpd     %xmm1, %xmm1
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        movapd    %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        psllq     $5, %xmm0
+        movl      $18416, %ecx
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_10.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(log)
+# -- End  log
+
+# Start file scope ASM
+ALIAS_SYMBOL(logl, log);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	4277811200
+	.long	1072049730
+	.long	2479318832
+	.long	1026487127
+	.long	2854492160
+	.long	1072033410
+	.long	215631550
+	.long	1025638968
+	.long	1547061248
+	.long	1072017216
+	.long	2886781435
+	.long	1026423395
+	.long	649825280
+	.long	1072001146
+	.long	4281533405
+	.long	1024038923
+	.long	646346752
+	.long	1071985198
+	.long	1562735921
+	.long	1023790276
+	.long	2203734016
+	.long	1071969370
+	.long	1838397691
+	.long	3173936209
+	.long	1872169984
+	.long	1071953661
+	.long	3981202460
+	.long	1022325013
+	.long	669557760
+	.long	1071938069
+	.long	4182597802
+	.long	3173174122
+	.long	4076413952
+	.long	1071922591
+	.long	1209029111
+	.long	3170736207
+	.long	556125184
+	.long	1071907228
+	.long	821086028
+	.long	3173437049
+	.long	204914688
+	.long	1071891976
+	.long	2097025986
+	.long	3171071798
+	.long	387545088
+	.long	1071876834
+	.long	3142936996
+	.long	3173092218
+	.long	2912783360
+	.long	1071861800
+	.long	2502420140
+	.long	1024505919
+	.long	1144260608
+	.long	1071846874
+	.long	3315658140
+	.long	3173469843
+	.long	1471209472
+	.long	1071832053
+	.long	129621009
+	.long	3172443877
+	.long	1829683200
+	.long	1071817336
+	.long	3885467693
+	.long	1025535275
+	.long	288676864
+	.long	1071802722
+	.long	86139472
+	.long	3171639793
+	.long	3636378624
+	.long	1071788208
+	.long	1850238587
+	.long	1024654342
+	.long	1606817792
+	.long	1071773795
+	.long	3388899795
+	.long	3173675586
+	.long	1236164608
+	.long	1071759480
+	.long	3983599207
+	.long	1020046558
+	.long	1089616896
+	.long	1071745262
+	.long	4171974224
+	.long	1024773198
+	.long	4143093760
+	.long	1071731139
+	.long	2727587401
+	.long	3173965207
+	.long	600267776
+	.long	1071717112
+	.long	3147685042
+	.long	3173353031
+	.long	2249313280
+	.long	1071703177
+	.long	125835074
+	.long	1025255832
+	.long	3805303808
+	.long	1071689334
+	.long	2289991207
+	.long	1025460331
+	.long	87278592
+	.long	1071675583
+	.long	1106114045
+	.long	1025933602
+	.long	3195405312
+	.long	1071661920
+	.long	3885316576
+	.long	3171206239
+	.long	3853649920
+	.long	1071648346
+	.long	2977069852
+	.long	3171236771
+	.long	2944026624
+	.long	1071625048
+	.long	1008093493
+	.long	1023444474
+	.long	3993180160
+	.long	1071598247
+	.long	1862355595
+	.long	1024642533
+	.long	1454641152
+	.long	1071571617
+	.long	1514603089
+	.long	1026500596
+	.long	3286085632
+	.long	1071545154
+	.long	1400028424
+	.long	3173279056
+	.long	438773760
+	.long	1071518858
+	.long	120727864
+	.long	3172148914
+	.long	1212979200
+	.long	1071492725
+	.long	1625055594
+	.long	3172901933
+	.long	1189017600
+	.long	1071466754
+	.long	3920062376
+	.long	1025727407
+	.long	403064832
+	.long	1071440943
+	.long	1053271728
+	.long	3171391427
+	.long	3343210496
+	.long	1071415289
+	.long	3243395502
+	.long	3173627613
+	.long	1765777408
+	.long	1071389792
+	.long	2145968512
+	.long	1026354304
+	.long	461430784
+	.long	1071364449
+	.long	4094322285
+	.long	1026021467
+	.long	71706624
+	.long	1071339258
+	.long	763632021
+	.long	1024496933
+	.long	1380503552
+	.long	1071314217
+	.long	1383547992
+	.long	3173088453
+	.long	1015732224
+	.long	1071289325
+	.long	3198646877
+	.long	1025390322
+	.long	35977216
+	.long	1071264580
+	.long	2141026805
+	.long	1025754693
+	.long	3927306240
+	.long	1071239979
+	.long	282116272
+	.long	3173394334
+	.long	1125341184
+	.long	1071215523
+	.long	2768427504
+	.long	3172279059
+	.long	1666971648
+	.long	1071191208
+	.long	786837629
+	.long	3172427445
+	.long	2827694080
+	.long	1071167033
+	.long	3857122416
+	.long	3173014241
+	.long	2003683328
+	.long	1071142997
+	.long	859010954
+	.long	1026545007
+	.long	1004017664
+	.long	1071119098
+	.long	3356644970
+	.long	3173458064
+	.long	1753020416
+	.long	1071095334
+	.long	788338552
+	.long	1026157693
+	.long	1992718336
+	.long	1071071704
+	.long	1239179443
+	.long	1026394889
+	.long	3870234624
+	.long	1071048206
+	.long	2082614663
+	.long	1024926053
+	.long	1050437632
+	.long	1071024840
+	.long	660007840
+	.long	1025548499
+	.long	188395520
+	.long	1071001603
+	.long	3878792704
+	.long	3173889571
+	.long	3747176448
+	.long	1070978493
+	.long	144991708
+	.long	3171552042
+	.long	1405669376
+	.long	1070955511
+	.long	3999088879
+	.long	1025486317
+	.long	121151488
+	.long	1070932654
+	.long	2170865497
+	.long	1026473584
+	.long	2652319744
+	.long	1070909920
+	.long	453695652
+	.long	3173916809
+	.long	3262236672
+	.long	1070887309
+	.long	157800053
+	.long	3173984206
+	.long	601221120
+	.long	1070864820
+	.long	3968917661
+	.long	1023992886
+	.long	1999843328
+	.long	1070842450
+	.long	3053895004
+	.long	1024998228
+	.long	1992167424
+	.long	1070820199
+	.long	2968614856
+	.long	1024552653
+	.long	3788726272
+	.long	1070798065
+	.long	3542170808
+	.long	3173573242
+	.long	2094829568
+	.long	1070776048
+	.long	1246758132
+	.long	1026202874
+	.long	288675840
+	.long	1070754146
+	.long	3747328950
+	.long	1026331585
+	.long	1829681152
+	.long	1070732357
+	.long	3125197546
+	.long	1024100318
+	.long	1666869248
+	.long	1070710681
+	.long	1363656119
+	.long	1026336493
+	.long	3417110528
+	.long	1070689116
+	.long	4154791553
+	.long	1026267853
+	.long	2183653376
+	.long	1070667662
+	.long	1671819292
+	.long	3173785870
+	.long	1734434816
+	.long	1070646317
+	.long	373091049
+	.long	1025972363
+	.long	1615681536
+	.long	1070625080
+	.long	384650897
+	.long	1022926043
+	.long	1445382144
+	.long	1070603950
+	.long	344320330
+	.long	3172397196
+	.long	1823715328
+	.long	1070569756
+	.long	3389841200
+	.long	1025231852
+	.long	3839688704
+	.long	1070527917
+	.long	1706790417
+	.long	3167363349
+	.long	4293332992
+	.long	1070486286
+	.long	1614935088
+	.long	1019351591
+	.long	2966720512
+	.long	1070444861
+	.long	4145393717
+	.long	3173711658
+	.long	4066729984
+	.long	1070403639
+	.long	1974925028
+	.long	3171437182
+	.long	3337621504
+	.long	1070362619
+	.long	3314953170
+	.long	3169971314
+	.long	943448064
+	.long	1070321799
+	.long	1498682038
+	.long	3173862340
+	.long	1465634816
+	.long	1070281176
+	.long	1319952810
+	.long	3171693965
+	.long	1015734272
+	.long	1070240749
+	.long	1347821929
+	.long	3173544515
+	.long	118001664
+	.long	1070200516
+	.long	1751482746
+	.long	1026134093
+	.long	3707174912
+	.long	1070160474
+	.long	1486946159
+	.long	1023930920
+	.long	3946381312
+	.long	1070120623
+	.long	2867408081
+	.long	3171368276
+	.long	1699848192
+	.long	1070080961
+	.long	2590187139
+	.long	1025379803
+	.long	2235846656
+	.long	1070041485
+	.long	1888568069
+	.long	3172754960
+	.long	2339729408
+	.long	1070002194
+	.long	3852214753
+	.long	3173323149
+	.long	3196850176
+	.long	1069963086
+	.long	742141560
+	.long	1025101707
+	.long	1800683520
+	.long	1069924160
+	.long	3949500444
+	.long	3172102179
+	.long	3835801600
+	.long	1069885413
+	.long	3848895943
+	.long	1025913832
+	.long	2201202688
+	.long	1069846845
+	.long	1425913464
+	.long	1025868665
+	.long	2778279936
+	.long	1069808453
+	.long	2120889677
+	.long	3173831128
+	.long	2954203136
+	.long	1069770236
+	.long	592147081
+	.long	1019621288
+	.long	210141184
+	.long	1069732193
+	.long	3414275233
+	.long	1023647084
+	.long	709476352
+	.long	1069694321
+	.long	2413027164
+	.long	1024462115
+	.long	2116284416
+	.long	1069656619
+	.long	1144559924
+	.long	1026336654
+	.long	2183651328
+	.long	1069619086
+	.long	3459057650
+	.long	1025634168
+	.long	3047047168
+	.long	1069581720
+	.long	1879674924
+	.long	3173508573
+	.long	970711040
+	.long	1069541521
+	.long	1335954173
+	.long	3173332182
+	.long	2198478848
+	.long	1069467449
+	.long	2951103968
+	.long	3173892200
+	.long	1669611520
+	.long	1069393703
+	.long	531044147
+	.long	1025149248
+	.long	29114368
+	.long	1069320280
+	.long	3327831251
+	.long	1025918673
+	.long	2376949760
+	.long	1069247176
+	.long	737634533
+	.long	3172176000
+	.long	1085390848
+	.long	1069174390
+	.long	3108243400
+	.long	3171828406
+	.long	1566130176
+	.long	1069101918
+	.long	985483226
+	.long	1025708380
+	.long	792780800
+	.long	1069029758
+	.long	4184866295
+	.long	1024426204
+	.long	183156736
+	.long	1068957907
+	.long	2845699378
+	.long	1022107277
+	.long	1301782528
+	.long	1068886362
+	.long	1012735262
+	.long	3173804294
+	.long	1562411008
+	.long	1068815121
+	.long	2197086703
+	.long	3170187813
+	.long	2815549440
+	.long	1068744181
+	.long	2782613207
+	.long	1026345054
+	.long	2756124672
+	.long	1068673540
+	.long	2929486205
+	.long	3173037800
+	.long	3511050240
+	.long	1068603195
+	.long	1443733147
+	.long	3173331549
+	.long	3047047168
+	.long	1068533144
+	.long	1879674924
+	.long	3172459997
+	.long	3221667840
+	.long	1068427825
+	.long	1338588027
+	.long	3171815742
+	.long	3453861888
+	.long	1068288883
+	.long	1205348359
+	.long	3172624626
+	.long	3506110464
+	.long	1068150514
+	.long	893105198
+	.long	1025571866
+	.long	346013696
+	.long	1068012714
+	.long	3495569021
+	.long	3172563349
+	.long	4074029056
+	.long	1067875476
+	.long	3961106338
+	.long	3171065595
+	.long	3559784448
+	.long	1067738798
+	.long	1975385384
+	.long	3173783155
+	.long	797769728
+	.long	1067602675
+	.long	3760305787
+	.long	1026047642
+	.long	2313633792
+	.long	1067467101
+	.long	1559353171
+	.long	1023480256
+	.long	3960766464
+	.long	1067213778
+	.long	1067365107
+	.long	1025865926
+	.long	684261376
+	.long	1066944805
+	.long	844762164
+	.long	3173687482
+	.long	630718464
+	.long	1066676905
+	.long	2458269694
+	.long	1024033081
+	.long	1486061568
+	.long	1066410070
+	.long	115537874
+	.long	3173243995
+	.long	2743664640
+	.long	1065886792
+	.long	3665098304
+	.long	3173471607
+	.long	1971912704
+	.long	1065357333
+	.long	2577214440
+	.long	3171993451
+	.long	1498939392
+	.long	1064306693
+	.long	3409036923
+	.long	1025599151
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	4277811200
+	.long	1067855426
+	.long	2479318832
+	.long	1022292823
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1030730101
+	.long	3217380702
+	.long	1431655765
+	.long	1070945621
+	.long	2576980378
+	.long	1070176665
+	.long	0
+	.long	3219128320
+	.long	0
+	.long	4294959104
+	.long	0
+	.long	4294959104
+	.type	static_const_table,@object
+	.size	static_const_table,2144
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_log10.S b/libm/x86/e_log10.S
new file mode 100644
index 0000000..09b2952
--- /dev/null
+++ b/libm/x86/e_log10.S
@@ -0,0 +1,795 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpss instruction (B0)
+//    B = int((B0*LH*2^7+0.5))/2^7
+//    LH is a short approximation for log10(e)
+//
+//    Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
+//
+//    Result:  k*log10(2) - log(B) + p(r)
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//  log10(0) = -INF with divide-by-zero exception raised                                           
+//  log10(1) = +0
+//  log10(x) = NaN with invalid exception raised if x < -0, including -INF
+//  log10(+INF) = +INF
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  log10
+ENTRY(log10)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movl      $1054736384, %ecx
+        movd      %ecx, %xmm7
+        xorpd     %xmm3, %xmm3
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm3
+        movsd     112(%esp), %xmm0
+        movapd    %xmm0, %xmm1
+        movl      $32768, %edx
+        movd      %edx, %xmm4
+        movapd    2128(%ebx), %xmm5
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $16352, %ecx
+        psllq     $5, %xmm0
+        movsd     2144(%ebx), %xmm2
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $78, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        mulss     %xmm7, %xmm0
+        orpd      %xmm3, %xmm1
+        andpd     %xmm1, %xmm5
+        paddd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm6, %xmm0
+        andl      $32752, %eax
+        subl      %ecx, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        mulsd     %xmm0, %xmm1
+        movsd     2064(%ebx), %xmm6
+        movapd    2080(%ebx), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    -1504(%ebx,%edx), %xmm0
+        movapd    2096(%ebx), %xmm4
+        addsd     %xmm5, %xmm1
+        movapd    2112(%ebx), %xmm2
+        mulsd     %xmm7, %xmm6
+        pshufd    $68, %xmm1, %xmm5
+        mulsd     2072(%ebx), %xmm7
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm4
+        movsd     2152(%ebx), %xmm6
+        mulpd     %xmm5, %xmm5
+        addpd     %xmm2, %xmm4
+        mulpd     %xmm5, %xmm3
+        pshufd    $228, %xmm0, %xmm2
+        addsd     %xmm1, %xmm0
+        mulsd     %xmm1, %xmm4
+        subsd     %xmm0, %xmm2
+        mulsd     %xmm1, %xmm6
+        addsd     %xmm2, %xmm1
+        pshufd    $238, %xmm0, %xmm2
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm2, %xmm7
+        addsd     %xmm6, %xmm1
+        addpd     %xmm3, %xmm4
+        addsd     %xmm7, %xmm1
+        mulpd     %xmm5, %xmm4
+        addsd     %xmm4, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        movsd     112(%esp), %xmm0
+        movapd    %xmm0, %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        cmpl      $16, %eax
+        jb        .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_6.0.2:
+        ja        .L_2TAG_PACKET_5.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_5.0.2
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_3.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        movl      $9, %edx
+        mulsd     %xmm1, %xmm0
+.L_2TAG_PACKET_9.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     112(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_10.0.2
+.L_2TAG_PACKET_8.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $8, %edx
+        jmp       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_4.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_8.0.2
+        xorpd     %xmm1, %xmm1
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movapd    %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psllq     $5, %xmm0
+        movsd     2144(%ebx), %xmm2
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $78, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_10.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(log10)
+# -- End  log10
+
+# Start file scope ASM
+ALIAS_SYMBOL(log10l, log10);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	1352628224
+	.long	1070810131
+	.long	521319256
+	.long	1025503025
+	.long	2150839296
+	.long	1070801944
+	.long	3329350096
+	.long	3170190015
+	.long	1360613376
+	.long	1070793794
+	.long	2024059075
+	.long	1024991594
+	.long	1875350528
+	.long	1070785680
+	.long	2163882141
+	.long	3163564137
+	.long	2312126464
+	.long	1070777602
+	.long	1975711076
+	.long	1023674196
+	.long	1306336256
+	.long	1070769560
+	.long	3524899523
+	.long	3170508164
+	.long	1806334976
+	.long	1070761553
+	.long	4254777025
+	.long	1025238739
+	.long	2483193856
+	.long	1070753581
+	.long	3800671317
+	.long	3172916830
+	.long	2025350144
+	.long	1070745644
+	.long	1731514745
+	.long	1025501083
+	.long	3433285632
+	.long	1070737741
+	.long	2551857336
+	.long	3169662186
+	.long	1134317568
+	.long	1070729873
+	.long	3426297655
+	.long	3172637891
+	.long	2457152512
+	.long	1070722038
+	.long	63549415
+	.long	1025415416
+	.long	1861803008
+	.long	1070714237
+	.long	1910171636
+	.long	1023977580
+	.long	2414140416
+	.long	1070706469
+	.long	4002514337
+	.long	3170841618
+	.long	2900726784
+	.long	1070698734
+	.long	3268064083
+	.long	1022459609
+	.long	2123517952
+	.long	1070691032
+	.long	1767031218
+	.long	1022448156
+	.long	3194569728
+	.long	1070683362
+	.long	3402332618
+	.long	3171671160
+	.long	650882048
+	.long	1070675725
+	.long	4146023905
+	.long	3171023038
+	.long	1928988672
+	.long	1070668119
+	.long	1438617867
+	.long	1016360491
+	.long	1594908672
+	.long	1070660545
+	.long	971389377
+	.long	1024763979
+	.long	2818746368
+	.long	1070653002
+	.long	3555925341
+	.long	3172434821
+	.long	194584576
+	.long	1070645491
+	.long	943919215
+	.long	3172950063
+	.long	1215096832
+	.long	1070638010
+	.long	2283358588
+	.long	1022335098
+	.long	501519360
+	.long	1070630560
+	.long	480904295
+	.long	1024437959
+	.long	1278266368
+	.long	1070623140
+	.long	2755806066
+	.long	3172342012
+	.long	2487812096
+	.long	1070615750
+	.long	2489653202
+	.long	3172481099
+	.long	3085451264
+	.long	1070608390
+	.long	3759184951
+	.long	3172574892
+	.long	2039090176
+	.long	1070601060
+	.long	1361176676
+	.long	3172355319
+	.long	953057280
+	.long	1070591423
+	.long	1176587546
+	.long	3166422018
+	.long	3370524672
+	.long	1070576879
+	.long	3669570051
+	.long	1025376630
+	.long	749742080
+	.long	1070562394
+	.long	707700964
+	.long	3170814058
+	.long	4008353792
+	.long	1070547965
+	.long	3247327652
+	.long	1022431400
+	.long	2612455424
+	.long	1070533594
+	.long	2453457344
+	.long	3172322969
+	.long	3230920704
+	.long	1070519279
+	.long	1296781801
+	.long	1025115335
+	.long	3965253632
+	.long	1070505020
+	.long	373075289
+	.long	1017938528
+	.long	2593157120
+	.long	1070476669
+	.long	1068054086
+	.long	1021616576
+	.long	925962240
+	.long	1070448537
+	.long	850121213
+	.long	1023928989
+	.long	1732556800
+	.long	1070420620
+	.long	1305206740
+	.long	3172665570
+	.long	3815630848
+	.long	1070392915
+	.long	192642943
+	.long	3172699907
+	.long	2001758208
+	.long	1070365420
+	.long	2820786683
+	.long	1024704867
+	.long	16746496
+	.long	1070338131
+	.long	1399573110
+	.long	3171372773
+	.long	1886492672
+	.long	1070311044
+	.long	3621428075
+	.long	3172974358
+	.long	3338196992
+	.long	1070284157
+	.long	3793882035
+	.long	1025124701
+	.long	381769728
+	.long	1070257468
+	.long	3877933342
+	.long	3170195490
+	.long	2186491904
+	.long	1070230972
+	.long	1838687089
+	.long	1017927292
+	.long	1008330752
+	.long	1070204668
+	.long	2228321664
+	.long	1025352196
+	.long	2247065600
+	.long	1070178552
+	.long	1413900906
+	.long	3170902532
+	.long	2964070400
+	.long	1070152622
+	.long	3590454629
+	.long	1025016844
+	.long	465154048
+	.long	1070126876
+	.long	2079688550
+	.long	3172268183
+	.long	883615744
+	.long	1070101310
+	.long	989244452
+	.long	3171900485
+	.long	1993768960
+	.long	1070075922
+	.long	1124327841
+	.long	3172964992
+	.long	1794471936
+	.long	1070050710
+	.long	1140575046
+	.long	1022673726
+	.long	2797932544
+	.long	1070025671
+	.long	1894836933
+	.long	3172544059
+	.long	3433797632
+	.long	1070000803
+	.long	3221831166
+	.long	3171921685
+	.long	2338371584
+	.long	1069976104
+	.long	3732461053
+	.long	3164513518
+	.long	2644013056
+	.long	1069951571
+	.long	2519460462
+	.long	3172548740
+	.long	3383814144
+	.long	1069927202
+	.long	2290997657
+	.long	1025499649
+	.long	3781380096
+	.long	1069902995
+	.long	380479405
+	.long	1025184136
+	.long	3245785088
+	.long	1069878948
+	.long	1096398261
+	.long	3169885192
+	.long	1366712320
+	.long	1069855059
+	.long	2218343715
+	.long	3170281628
+	.long	2204717056
+	.long	1069831325
+	.long	2668334011
+	.long	1025264524
+	.long	1401772032
+	.long	1069807745
+	.long	4103993159
+	.long	1022925721
+	.long	3356721152
+	.long	1069784316
+	.long	3573790772
+	.long	3172186527
+	.long	4041148416
+	.long	1069761037
+	.long	4027691910
+	.long	3171276990
+	.long	3880151040
+	.long	1069737906
+	.long	4087118786
+	.long	3172710734
+	.long	3453364224
+	.long	1069714921
+	.long	99014299
+	.long	3172003077
+	.long	3491092480
+	.long	1069692080
+	.long	3801836701
+	.long	3172989287
+	.long	575580160
+	.long	1069669382
+	.long	1920406012
+	.long	3170874125
+	.long	22282240
+	.long	1069646824
+	.long	964193370
+	.long	1019363159
+	.long	2991429632
+	.long	1069624404
+	.long	3372589890
+	.long	1023425053
+	.long	2189645824
+	.long	1069602122
+	.long	2610503872
+	.long	1023652442
+	.long	3341467648
+	.long	1069579975
+	.long	1190292004
+	.long	1022425665
+	.long	3711293440
+	.long	1069557962
+	.long	1104795356
+	.long	1023625829
+	.long	1380401152
+	.long	1069524644
+	.long	1156998217
+	.long	1025100499
+	.long	765710336
+	.long	1069481144
+	.long	1736649113
+	.long	1024999439
+	.long	849412096
+	.long	1069437902
+	.long	2618178330
+	.long	3170853629
+	.long	1433104384
+	.long	1069394915
+	.long	43477267
+	.long	3170378811
+	.long	2548596736
+	.long	1069352180
+	.long	3967367063
+	.long	1025246584
+	.long	157577216
+	.long	1069309695
+	.long	100402533
+	.long	3172825502
+	.long	3326238720
+	.long	1069267455
+	.long	1176892909
+	.long	1025464099
+	.long	4155494400
+	.long	1069225459
+	.long	3713707617
+	.long	3172630046
+	.long	3545804800
+	.long	1069183704
+	.long	857007315
+	.long	1024965777
+	.long	2602520576
+	.long	1069142187
+	.long	2588758347
+	.long	1022463131
+	.long	2631196672
+	.long	1069100905
+	.long	2118424235
+	.long	1022490989
+	.long	838135808
+	.long	1069059856
+	.long	4117002727
+	.long	1024874520
+	.long	3210903552
+	.long	1069019036
+	.long	650070125
+	.long	3172012966
+	.long	3039211520
+	.long	1068978444
+	.long	438055812
+	.long	1017743757
+	.long	2385633280
+	.long	1068938077
+	.long	3011990369
+	.long	3171312044
+	.long	3491618816
+	.long	1068897932
+	.long	712813818
+	.long	3172720400
+	.long	183644160
+	.long	1068858008
+	.long	4287006742
+	.long	1022379728
+	.long	3639214080
+	.long	1068818300
+	.long	353762279
+	.long	3172980009
+	.long	3728416768
+	.long	1068778808
+	.long	1851367730
+	.long	1025486574
+	.long	3370094592
+	.long	1068739529
+	.long	4046594913
+	.long	3172567047
+	.long	1348407296
+	.long	1068700461
+	.long	143189675
+	.long	1025397632
+	.long	899403776
+	.long	1068661601
+	.long	3753687842
+	.long	3170772772
+	.long	1117708288
+	.long	1068622947
+	.long	1857340812
+	.long	3170782678
+	.long	1248276480
+	.long	1068584497
+	.long	1289858203
+	.long	1025222289
+	.long	683237376
+	.long	1068546249
+	.long	2356679608
+	.long	3171629170
+	.long	3253764096
+	.long	1068508200
+	.long	3267136556
+	.long	1018554987
+	.long	94478336
+	.long	1068441756
+	.long	1927868814
+	.long	3169378180
+	.long	3233144832
+	.long	1068366445
+	.long	2682188854
+	.long	1023964004
+	.long	2940297216
+	.long	1068291522
+	.long	275301289
+	.long	1023944679
+	.long	3677708288
+	.long	1068216982
+	.long	302658771
+	.long	1024465567
+	.long	1576968192
+	.long	1068142822
+	.long	3672035940
+	.long	3172254610
+	.long	1614069760
+	.long	1068069037
+	.long	480052905
+	.long	3172692062
+	.long	424435712
+	.long	1067995624
+	.long	2207869657
+	.long	3170965436
+	.long	3477782528
+	.long	1067922578
+	.long	2980661858
+	.long	3164990018
+	.long	3598401536
+	.long	1067849897
+	.long	1974393034
+	.long	3171357083
+	.long	2435235840
+	.long	1067777577
+	.long	1385289011
+	.long	1024615823
+	.long	1867333632
+	.long	1067705614
+	.long	3442236633
+	.long	1025334384
+	.long	3999301632
+	.long	1067634004
+	.long	3506472073
+	.long	1025132546
+	.long	2566971392
+	.long	1067562745
+	.long	1425757592
+	.long	3172358463
+	.long	112943104
+	.long	1067491833
+	.long	1693407156
+	.long	3172426603
+	.long	3079929856
+	.long	1067392159
+	.long	3999942455
+	.long	1018549369
+	.long	2443837440
+	.long	1067251701
+	.long	974534460
+	.long	1023963412
+	.long	359366656
+	.long	1067111917
+	.long	2204915018
+	.long	1013514416
+	.long	3564519424
+	.long	1066972799
+	.long	3977441659
+	.long	3170879860
+	.long	2011086848
+	.long	1066834343
+	.long	590145514
+	.long	1025390011
+	.long	3216982016
+	.long	1066696541
+	.long	3629120110
+	.long	1024330313
+	.long	2194128896
+	.long	1066559388
+	.long	2367098512
+	.long	3172260338
+	.long	2916220928
+	.long	1066422877
+	.long	2262431886
+	.long	1021229446
+	.long	2263941120
+	.long	1066172214
+	.long	3118507287
+	.long	1021484970
+	.long	3076292608
+	.long	1065901726
+	.long	1411737803
+	.long	3172957147
+	.long	1186136064
+	.long	1065632488
+	.long	3109349337
+	.long	1025397383
+	.long	3085303808
+	.long	1065364487
+	.long	584715031
+	.long	3172596519
+	.long	1821048832
+	.long	1064842211
+	.long	2182246895
+	.long	3172536214
+	.long	697368576
+	.long	1064311094
+	.long	3157561765
+	.long	3172716357
+	.long	894042112
+	.long	1063260131
+	.long	3237958154
+	.long	3172587292
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1352628224
+	.long	1066615827
+	.long	521319256
+	.long	1021308721
+	.long	3248877870
+	.long	1077250164
+	.long	1691676429
+	.long	3221787401
+	.long	945132465
+	.long	3223701783
+	.long	3700831335
+	.long	1073506818
+	.long	2141010593
+	.long	1075227551
+	.long	3698831637
+	.long	3220339442
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	4294959104
+	.long	0
+	.long	1071366144
+	.long	3207479560
+	.long	1062894188
+	.type	static_const_table,@object
+	.size	static_const_table,2160
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_pow.S b/libm/x86/e_pow.S
new file mode 100644
index 0000000..43e30d8
--- /dev/null
+++ b/libm/x86/e_pow.S
@@ -0,0 +1,4277 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    log2(x) calculation:
+//
+//    Get B~1/mx based on the output of rcpps instruction (B0)
+//    B = int((B0*LH*2^9+0.5))/2^9
+//    LH is a short approximation for log2(e)
+//
+//    Reduced argument, scaled by LH:
+//                r=B*mx-LH (computed accurately in high and low parts)
+//
+//    log2(x) result:  k - log2(B) + p(r)
+//             p(r) is a degree 8 polynomial
+//             -log2(B) read from data table (high, low parts)
+//             log2(x) is formed from high and low parts
+//    For |x| in [1-1/32, 1+1/16), a slower but more accurate computation
+//    based om the same table design is performed.
+//
+//   Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8,
+//   to filter out all potential OF/UF cases.
+//   exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5
+//   polynomial
+//
+// Special cases:
+//  pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd 
+//  integer < 0.
+//  pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and 
+//  not an odd integer.
+//  pow(-0,y) = -0 for y an odd integer > 0.
+//  pow(-0,y) = +0 for y > 0 and not an odd integer.
+//  pow(-1,-INF) = 1.
+//  pow(+1,y) = 1 for any y, even a NaN.
+//  pow(x,-0) = 1 for any x, even a NaN.
+//  pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and
+//  finite non-integer y.
+//  pow(x,-INF) = +INF for |x|<1.
+//  pow(x,-INF) = +0 for |x|>1.
+//  pow(x,+INF) = +0 for |x|<1.
+//  pow(x,+INF) = +INF for |x|>1.
+//  pow(-INF,y) = -0 for y an odd integer < 0.
+//  pow(-INF,y) = +0 for y < 0 and not an odd integer.
+//  pow(-INF,y) = -INF for y an odd integer > 0.
+//  pow(-INF,y) = +INF for y > 0 and not an odd integer.
+//  pow(+INF,y) = +0 for y <0.
+//  pow(+INF,y) = +INF for y >0.
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  pow
+ENTRY(pow)
+# parameter 1: 8 + %ebp
+# parameter 2: 16 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 64(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        movsd     136(%esp), %xmm1
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movl      $1069088768, %ecx
+        movd      %ecx, %xmm7
+        movsd     %xmm1, 16(%esp)
+        xorpd     %xmm1, %xmm1
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm1
+        movsd     %xmm0, 8(%esp)
+        movapd    %xmm0, %xmm3
+        movl      $8192, %edx
+        movd      %edx, %xmm4
+        movapd    8240(%ebx), %xmm6
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        psllq     $5, %xmm0
+        movsd     8256(%ebx), %xmm2
+        psrlq     $34, %xmm0
+        movl      %eax, %edx
+        andl      $32752, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        psrlq     $12, %xmm3
+        movl      %esi, 24(%esp)
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        movl      $0, %esi
+.L_2TAG_PACKET_1.0.2:
+        mulss     %xmm7, %xmm0
+        movl      $-1, %edx
+        subl      $4, %ecx
+        shll      %cl, %edx
+        movd      %edx, %xmm5
+        orpd      %xmm1, %xmm3
+        subl      $16351, %eax
+        cmpl      $1, %eax
+        jbe       .L_2TAG_PACKET_2.0.2
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm3, %xmm5
+.L_2TAG_PACKET_3.0.2:
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        subl      $1, %eax
+        sarl      $4, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+.L_2TAG_PACKET_4.0.2:
+        mulsd     %xmm0, %xmm3
+        movapd    8272(%ebx), %xmm1
+        subsd     %xmm2, %xmm5
+        movapd    8288(%ebx), %xmm4
+        movl      %eax, %ecx
+        sarl      $31, %eax
+        addl      %eax, %ecx
+        xorl      %ecx, %eax
+        addl      $1, %eax
+        bsr       %eax, %eax
+        unpcklpd  %xmm3, %xmm5
+        movapd    8304(%ebx), %xmm6
+        addsd     %xmm5, %xmm3
+        andl      $16760832, %edx
+        shrl      $10, %edx
+        addpd     -3616(%ebx,%edx), %xmm5
+        movapd    8320(%ebx), %xmm0
+        pshufd    $68, %xmm3, %xmm2
+        mulsd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm1
+        mulpd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm5
+        mulsd     %xmm3, %xmm2
+        addpd     %xmm1, %xmm6
+        mulsd     %xmm3, %xmm3
+        addpd     %xmm4, %xmm0
+        movsd     16(%esp), %xmm1
+        movzwl    22(%esp), %ecx
+        pshufd    $238, %xmm5, %xmm7
+        movsd     8368(%ebx), %xmm4
+        mulpd     %xmm2, %xmm6
+        pshufd    $68, %xmm3, %xmm3
+        mulpd     %xmm2, %xmm0
+        shll      $4, %eax
+        subl      $15872, %eax
+        andl      $32752, %ecx
+        addl      %ecx, %eax
+        mulpd     %xmm6, %xmm3
+        cmpl      $624, %eax
+        jae       .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %edx
+        pinsrw    $3, %edx, %xmm6
+        movapd    %xmm1, %xmm2
+        andpd     %xmm1, %xmm4
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm7, %xmm0
+        mulsd     %xmm5, %xmm1
+        movapd    %xmm6, %xmm7
+        addsd     %xmm4, %xmm6
+        addpd     %xmm0, %xmm3
+        movd      %xmm6, %edx
+        subsd     %xmm7, %xmm6
+        pshufd    $238, %xmm3, %xmm0
+        subsd     %xmm6, %xmm4
+        addsd     %xmm3, %xmm0
+        movl      %edx, %ecx
+        andl      $255, %edx
+        addl      %edx, %edx
+        movapd    8384(%ebx,%edx,8), %xmm5
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        movapd    12480(%ebx), %xmm7
+        movapd    12496(%ebx), %xmm3
+        shll      $12, %ecx
+        xorl      %esi, %ecx
+        andl      $-1048576, %ecx
+        movd      %ecx, %xmm6
+        addsd     %xmm4, %xmm2
+        movsd     12512(%ebx), %xmm1
+        pshufd    $68, %xmm2, %xmm0
+        pshufd    $68, %xmm2, %xmm4
+        mulpd     %xmm0, %xmm0
+        movl      24(%esp), %esi
+        mulpd     %xmm4, %xmm7
+        pshufd    $17, %xmm6, %xmm6
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm0, %xmm0
+        paddd     %xmm6, %xmm5
+        addpd     %xmm7, %xmm3
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        mulpd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm3
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_7.0.2:
+        movsd     128(%esp), %xmm0
+        movsd     136(%esp), %xmm1
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_0.0.2:
+        addl      $16, %eax
+        movl      $32752, %edx
+        andl      %eax, %edx
+        cmpl      $32752, %edx
+        je        .L_2TAG_PACKET_8.0.2
+        testl     $32768, %eax
+        jne       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_10.0.2:
+        movl      16(%esp), %ecx
+        xorl      %edx, %edx
+        testl     %ecx, %ecx
+        movl      $1, %ecx
+        cmovne    %ecx, %edx
+        orl       20(%esp), %edx
+        cmpl      $1072693248, %edx
+        je        .L_2TAG_PACKET_7.0.2
+        movsd     8(%esp), %xmm0
+        movsd     8(%esp), %xmm3
+        movd      %xmm3, %edx
+        psrlq     $32, %xmm3
+        movd      %xmm3, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_11.0.2
+        xorpd     %xmm3, %xmm3
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm3
+        mulsd     %xmm3, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movapd    %xmm0, %xmm3
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psllq     $5, %xmm0
+        movsd     8256(%ebx), %xmm2
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        movapd    8240(%ebx), %xmm6
+        psrlq     $12, %xmm3
+        mulss     %xmm7, %xmm0
+        movl      $-1024, %edx
+        movd      %edx, %xmm5
+        orpd      %xmm1, %xmm3
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm3, %xmm5
+        movl      $0, %esi
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        andl      $32752, %eax
+        subl      $18416, %eax
+        sarl      $4, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_12.0.2:
+        movl      16(%esp), %ecx
+        xorl      %edx, %edx
+        testl     %ecx, %ecx
+        movl      $1, %ecx
+        cmovne    %ecx, %edx
+        orl       20(%esp), %edx
+        cmpl      $1072693248, %edx
+        je        .L_2TAG_PACKET_7.0.2
+        movsd     8(%esp), %xmm0
+        movsd     8(%esp), %xmm3
+        movd      %xmm3, %edx
+        psrlq     $32, %xmm3
+        movd      %xmm3, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_11.0.2
+        xorpd     %xmm3, %xmm3
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm3
+        mulsd     %xmm3, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movapd    %xmm0, %xmm3
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psllq     $5, %xmm0
+        movsd     8256(%ebx), %xmm2
+        psrlq     $34, %xmm0
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        movapd    8240(%ebx), %xmm6
+        psrlq     $12, %xmm3
+        mulss     %xmm7, %xmm0
+        movl      $-1024, %edx
+        movd      %edx, %xmm5
+        orpd      %xmm1, %xmm3
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm3, %xmm5
+        movl      $-2147483648, %esi
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        andl      $32752, %eax
+        subl      $18416, %eax
+        sarl      $4, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_13.0.2
+        cmpl      $736, %eax
+        jae       .L_2TAG_PACKET_14.0.2
+.L_2TAG_PACKET_15.0.2:
+        addsd     %xmm7, %xmm0
+        movsd     12544(%ebx), %xmm2
+        addpd     %xmm0, %xmm3
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %eax
+        pinsrw    $3, %eax, %xmm6
+        pshufd    $238, %xmm3, %xmm0
+        addsd     %xmm3, %xmm0
+        movapd    %xmm5, %xmm3
+        addsd     %xmm0, %xmm5
+        movapd    %xmm2, %xmm4
+        subsd     %xmm5, %xmm3
+        movapd    %xmm5, %xmm7
+        andpd     %xmm2, %xmm5
+        movapd    %xmm1, %xmm2
+        andpd     %xmm1, %xmm4
+        subsd     %xmm5, %xmm7
+        addsd     %xmm3, %xmm0
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm7, %xmm0
+        mulsd     %xmm0, %xmm2
+        movapd    %xmm6, %xmm7
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm4, %xmm6
+        movd      %xmm6, %eax
+        subsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm2
+        movapd    12480(%ebx), %xmm7
+        movapd    12496(%ebx), %xmm3
+        subsd     %xmm6, %xmm4
+        pextrw    $3, %xmm6, %edx
+        movl      %eax, %ecx
+        andl      $255, %eax
+        addl      %eax, %eax
+        movapd    8384(%ebx,%eax,8), %xmm5
+        addsd     %xmm4, %xmm2
+        sarl      $8, %ecx
+        movl      %ecx, %eax
+        sarl      $1, %ecx
+        subl      %ecx, %eax
+        shll      $20, %ecx
+        xorl      %esi, %ecx
+        movd      %ecx, %xmm6
+        movsd     12512(%ebx), %xmm1
+        andl      $32767, %edx
+        cmpl      $16529, %edx
+        ja        .L_2TAG_PACKET_14.0.2
+        pshufd    $68, %xmm2, %xmm0
+        pshufd    $68, %xmm2, %xmm4
+        mulpd     %xmm0, %xmm0
+        mulpd     %xmm4, %xmm7
+        pshufd    $17, %xmm6, %xmm6
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm0, %xmm0
+        paddd     %xmm6, %xmm5
+        addpd     %xmm7, %xmm3
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        mulpd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm3
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        shll      $4, %eax
+        xorpd     %xmm4, %xmm4
+        addl      $16368, %eax
+        pinsrw    $3, %eax, %xmm4
+        addsd     %xmm1, %xmm0
+        movl      24(%esp), %esi
+        addsd     %xmm3, %xmm0
+        movapd    %xmm0, %xmm1
+        addsd     %xmm5, %xmm0
+        mulsd     %xmm4, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        je        .L_2TAG_PACKET_16.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_18.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_8.0.2:
+        movsd     16(%esp), %xmm1
+        movsd     8(%esp), %xmm0
+        movapd    %xmm0, %xmm2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_19.0.2
+        addsd     %xmm0, %xmm0
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_20.0.2
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_20.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        movl      $29, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_22.0.2:
+        movsd     16(%esp), %xmm0
+        addpd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_19.0.2:
+        movd      %xmm1, %eax
+        movapd    %xmm1, %xmm2
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_23.0.2
+        pextrw    $3, %xmm2, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        jne       .L_2TAG_PACKET_24.0.2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        jne       .L_2TAG_PACKET_22.0.2
+.L_2TAG_PACKET_24.0.2:
+        pextrw    $3, %xmm0, %eax
+        testl     $32768, %eax
+        jne       .L_2TAG_PACKET_25.0.2
+        testl     $-2147483648, %ecx
+        jne       .L_2TAG_PACKET_26.0.2
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_27.0.2:
+        movsd     16(%esp), %xmm1
+        movd      %xmm1, %eax
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_28.0.2
+        testl     $2, %eax
+        jne       .L_2TAG_PACKET_29.0.2
+        jmp       .L_2TAG_PACKET_28.0.2
+.L_2TAG_PACKET_25.0.2:
+        shrl      $20, %ecx
+        andl      $2047, %ecx
+        cmpl      $1075, %ecx
+        ja        .L_2TAG_PACKET_28.0.2
+        je        .L_2TAG_PACKET_30.0.2
+        cmpl      $1074, %ecx
+        ja        .L_2TAG_PACKET_27.0.2
+        cmpl      $1023, %ecx
+        jb        .L_2TAG_PACKET_28.0.2
+        movsd     16(%esp), %xmm1
+        movl      $17208, %eax
+        xorpd     %xmm3, %xmm3
+        pinsrw    $3, %eax, %xmm3
+        movapd    %xmm3, %xmm4
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        jne       .L_2TAG_PACKET_28.0.2
+        movd      %xmm3, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_28.0.2
+.L_2TAG_PACKET_29.0.2:
+        movsd     16(%esp), %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32768, %eax
+        je        .L_2TAG_PACKET_18.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_28.0.2:
+        movsd     16(%esp), %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32768, %eax
+        jne       .L_2TAG_PACKET_26.0.2
+.L_2TAG_PACKET_31.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_30.0.2:
+        movsd     16(%esp), %xmm1
+        movd      %xmm1, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_28.0.2
+        jmp       .L_2TAG_PACKET_29.0.2
+.L_2TAG_PACKET_32.0.2:
+        movd      %xmm1, %eax
+        psrlq     $20, %xmm1
+        movd      %xmm1, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_33.0.2
+        movsd     16(%esp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_33.0.2:
+        movsd     8(%esp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        cmpl      $49136, %eax
+        jne       .L_2TAG_PACKET_34.0.2
+        movd      %xmm0, %ecx
+        psrlq     $20, %xmm0
+        movd      %xmm0, %edx
+        orl       %edx, %ecx
+        jne       .L_2TAG_PACKET_34.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_34.0.2:
+        movsd     16(%esp), %xmm1
+        andl      $32752, %eax
+        subl      $16368, %eax
+        pextrw    $3, %xmm1, %edx
+        xorpd     %xmm0, %xmm0
+        xorl      %edx, %eax
+        andl      $32768, %eax
+        jne       .L_2TAG_PACKET_18.0.2
+        movl      $32752, %ecx
+        pinsrw    $3, %ecx, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_35.0.2:
+        movd      %xmm1, %eax
+        cmpl      $17184, %edx
+        ja        .L_2TAG_PACKET_36.0.2
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_37.0.2
+        testl     $2, %eax
+        je        .L_2TAG_PACKET_38.0.2
+        jmp       .L_2TAG_PACKET_39.0.2
+.L_2TAG_PACKET_36.0.2:
+        testl     $1, %eax
+        je        .L_2TAG_PACKET_38.0.2
+        jmp       .L_2TAG_PACKET_39.0.2
+.L_2TAG_PACKET_9.0.2:
+        movsd     8(%esp), %xmm2
+        movd      %xmm2, %eax
+        psrlq     $31, %xmm2
+        movd      %xmm2, %ecx
+        orl       %ecx, %eax
+        je        .L_2TAG_PACKET_11.0.2
+        movsd     16(%esp), %xmm1
+        pextrw    $3, %xmm1, %edx
+        movd      %xmm1, %eax
+        movapd    %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        addl      %ecx, %ecx
+        orl       %eax, %ecx
+        je        .L_2TAG_PACKET_40.0.2
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .L_2TAG_PACKET_32.0.2
+        cmpl      $17200, %edx
+        ja        .L_2TAG_PACKET_38.0.2
+        cmpl      $17184, %edx
+        jae       .L_2TAG_PACKET_35.0.2
+        cmpl      $16368, %edx
+        jb        .L_2TAG_PACKET_37.0.2
+        movl      $17208, %eax
+        xorpd     %xmm2, %xmm2
+        pinsrw    $3, %eax, %xmm2
+        movapd    %xmm2, %xmm4
+        addsd     %xmm1, %xmm2
+        subsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32767, %eax
+        jne       .L_2TAG_PACKET_37.0.2
+        movd      %xmm2, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_38.0.2
+.L_2TAG_PACKET_39.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm1
+        movsd     8256(%ebx), %xmm2
+        movsd     8(%esp), %xmm4
+        pextrw    $3, %xmm4, %eax
+        movl      $8192, %edx
+        movd      %edx, %xmm4
+        andl      $32767, %eax
+        subl      $16, %eax
+        jl        .L_2TAG_PACKET_12.0.2
+        movl      %eax, %edx
+        andl      $32752, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        movl      $-2147483648, %esi
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_37.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        xorpd     %xmm0, %xmm0
+        mulsd     %xmm1, %xmm0
+        movl      $28, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_38.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm1
+        movsd     8256(%ebx), %xmm2
+        movsd     8(%esp), %xmm4
+        pextrw    $3, %xmm4, %eax
+        movl      $8192, %edx
+        movd      %edx, %xmm4
+        andl      $32767, %eax
+        subl      $16, %eax
+        jl        .L_2TAG_PACKET_10.0.2
+        movl      %eax, %edx
+        andl      $32752, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        movl      $0, %esi
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_23.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_26.0.2:
+        xorpd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_13.0.2:
+        addl      $384, %eax
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_41.0.2
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm7, %xmm0
+        shrl      $31, %esi
+        addpd     %xmm0, %xmm3
+        pshufd    $238, %xmm3, %xmm0
+        addsd     %xmm0, %xmm3
+        movsd     12528(%ebx,%esi,8), %xmm4
+        mulsd     %xmm3, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        shll      $15, %esi
+        orl       %esi, %eax
+        pinsrw    $3, %eax, %xmm0
+        addsd     %xmm1, %xmm5
+        movl      24(%esp), %esi
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm5, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_41.0.2:
+        movl      24(%esp), %esi
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_40.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_42.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        movl      $26, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_11.0.2:
+        movsd     16(%esp), %xmm1
+        movapd    %xmm1, %xmm2
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        jne       .L_2TAG_PACKET_43.0.2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        jne       .L_2TAG_PACKET_22.0.2
+.L_2TAG_PACKET_43.0.2:
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_42.0.2
+        shrl      $21, %edx
+        cmpl      $1075, %edx
+        ja        .L_2TAG_PACKET_44.0.2
+        je        .L_2TAG_PACKET_45.0.2
+        cmpl      $1023, %edx
+        jb        .L_2TAG_PACKET_44.0.2
+        movsd     16(%esp), %xmm1
+        movl      $17208, %eax
+        xorpd     %xmm3, %xmm3
+        pinsrw    $3, %eax, %xmm3
+        movapd    %xmm3, %xmm4
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        jne       .L_2TAG_PACKET_44.0.2
+        movd      %xmm3, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_44.0.2
+.L_2TAG_PACKET_46.0.2:
+        movsd     8(%esp), %xmm0
+        testl     $-2147483648, %ecx
+        jne       .L_2TAG_PACKET_47.0.2
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_45.0.2:
+        movsd     16(%esp), %xmm1
+        movd      %xmm1, %eax
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_46.0.2
+.L_2TAG_PACKET_44.0.2:
+        testl     $-2147483648, %ecx
+        je        .L_2TAG_PACKET_26.0.2
+        xorpd     %xmm0, %xmm0
+.L_2TAG_PACKET_47.0.2:
+        movl      $16368, %eax
+        xorpd     %xmm1, %xmm1
+        pinsrw    $3, %eax, %xmm1
+        divsd     %xmm0, %xmm1
+        movapd    %xmm1, %xmm0
+        movl      $27, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_14.0.2:
+        movsd     8(%esp), %xmm2
+        movsd     16(%esp), %xmm6
+        pextrw    $3, %xmm2, %eax
+        pextrw    $3, %xmm6, %edx
+        movl      $32752, %ecx
+        andl      %edx, %ecx
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_48.0.2
+        andl      $32752, %eax
+        subl      $16368, %eax
+        xorl      %eax, %edx
+        testl     $32768, %edx
+        jne       .L_2TAG_PACKET_49.0.2
+.L_2TAG_PACKET_50.0.2:
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        shrl      $16, %esi
+        orl       %esi, %eax
+        pinsrw    $3, %eax, %xmm1
+        movl      24(%esp), %esi
+        mulsd     %xmm1, %xmm0
+.L_2TAG_PACKET_17.0.2:
+        movl      $24, %edx
+.L_2TAG_PACKET_21.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_49.0.2:
+        movl      $16, %eax
+        pinsrw    $3, %eax, %xmm0
+        mulsd     %xmm0, %xmm0
+        testl     $-2147483648, %esi
+        je        .L_2TAG_PACKET_51.0.2
+        movsd     12560(%ebx), %xmm2
+        xorpd     %xmm2, %xmm0
+.L_2TAG_PACKET_51.0.2:
+        movl      24(%esp), %esi
+        movl      $25, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_16.0.2:
+        pextrw    $3, %xmm5, %ecx
+        pextrw    $3, %xmm4, %edx
+        movl      $-1, %eax
+        andl      $32752, %ecx
+        subl      $16368, %ecx
+        andl      $32752, %edx
+        addl      %ecx, %edx
+        movl      $-31, %ecx
+        sarl      $4, %edx
+        subl      %edx, %ecx
+        jle       .L_2TAG_PACKET_52.0.2
+        cmpl      $20, %ecx
+        ja        .L_2TAG_PACKET_53.0.2
+        shll      %cl, %eax
+.L_2TAG_PACKET_52.0.2:
+        movd      %eax, %xmm0
+        psllq     $32, %xmm0
+        andpd     %xmm5, %xmm0
+        subsd     %xmm0, %xmm5
+        addsd     %xmm1, %xmm5
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm5, %xmm0
+.L_2TAG_PACKET_53.0.2:
+        movl      $25, %edx
+        jmp       .L_2TAG_PACKET_21.0.2
+.L_2TAG_PACKET_2.0.2:
+        movzwl    22(%esp), %ecx
+        movl      $-2147483648, %edx
+        movd      %edx, %xmm1
+        xorpd     %xmm7, %xmm7
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        paddq     %xmm3, %xmm1
+        andpd     %xmm1, %xmm5
+        andl      $32752, %ecx
+        cmpl      $16560, %ecx
+        jb        .L_2TAG_PACKET_3.0.2
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        addl      $16351, %eax
+        shrl      $4, %eax
+        subl      $1022, %eax
+        cvtsi2sdl %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        movsd     (%ebx), %xmm4
+        mulsd     %xmm0, %xmm3
+        movsd     (%ebx), %xmm6
+        subsd     %xmm2, %xmm5
+        movsd     8(%ebx), %xmm1
+        pshufd    $68, %xmm3, %xmm2
+        unpcklpd  %xmm3, %xmm5
+        addsd     %xmm5, %xmm3
+        movsd     8(%ebx), %xmm0
+        andl      $16760832, %edx
+        shrl      $10, %edx
+        addpd     -3616(%ebx,%edx), %xmm7
+        mulsd     %xmm5, %xmm4
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm1
+        movapd    %xmm5, %xmm2
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm0, %xmm5
+        movapd    %xmm7, %xmm0
+        addsd     %xmm3, %xmm2
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm2, %xmm6
+        subsd     %xmm7, %xmm0
+        movapd    %xmm7, %xmm2
+        addsd     %xmm4, %xmm7
+        addsd     %xmm5, %xmm0
+        subsd     %xmm7, %xmm2
+        addsd     %xmm2, %xmm4
+        pshufd    $238, %xmm5, %xmm2
+        movapd    %xmm7, %xmm5
+        addsd     %xmm2, %xmm7
+        addsd     %xmm0, %xmm4
+        movapd    8272(%ebx), %xmm0
+        subsd     %xmm7, %xmm5
+        addsd     %xmm4, %xmm6
+        movapd    %xmm7, %xmm4
+        addsd     %xmm2, %xmm5
+        addsd     %xmm1, %xmm7
+        movapd    8336(%ebx), %xmm2
+        subsd     %xmm7, %xmm4
+        addsd     %xmm5, %xmm6
+        addsd     %xmm1, %xmm4
+        pshufd    $238, %xmm7, %xmm5
+        movapd    %xmm7, %xmm1
+        addsd     %xmm5, %xmm7
+        subsd     %xmm7, %xmm1
+        addsd     %xmm5, %xmm1
+        movapd    8352(%ebx), %xmm5
+        pshufd    $68, %xmm3, %xmm3
+        addsd     %xmm4, %xmm6
+        addsd     %xmm1, %xmm6
+        movapd    8304(%ebx), %xmm1
+        mulpd     %xmm3, %xmm0
+        mulpd     %xmm3, %xmm2
+        pshufd    $68, %xmm3, %xmm4
+        mulpd     %xmm3, %xmm3
+        addpd     %xmm1, %xmm0
+        addpd     %xmm2, %xmm5
+        mulsd     %xmm3, %xmm4
+        movsd     16(%ebx), %xmm2
+        mulpd     %xmm3, %xmm3
+        movsd     16(%esp), %xmm1
+        movzwl    22(%esp), %ecx
+        mulpd     %xmm4, %xmm0
+        pextrw    $3, %xmm7, %eax
+        mulpd     %xmm4, %xmm5
+        mulpd     %xmm3, %xmm0
+        movsd     8376(%ebx), %xmm4
+        andpd     %xmm7, %xmm2
+        addsd     %xmm6, %xmm5
+        subsd     %xmm2, %xmm7
+        addpd     %xmm0, %xmm5
+        andl      $32752, %eax
+        subl      $16368, %eax
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_48.0.2
+        addl      %eax, %ecx
+        cmpl      $16576, %ecx
+        jae       .L_2TAG_PACKET_54.0.2
+        pshufd    $238, %xmm5, %xmm0
+        andpd     %xmm1, %xmm4
+        movapd    %xmm1, %xmm3
+        addsd     %xmm0, %xmm5
+        subsd     %xmm4, %xmm1
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %edx
+        pinsrw    $3, %edx, %xmm6
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm1
+        movapd    %xmm6, %xmm5
+        mulsd     %xmm7, %xmm3
+        addsd     %xmm4, %xmm6
+        addsd     %xmm3, %xmm1
+        movapd    12480(%ebx), %xmm7
+        movd      %xmm6, %edx
+        subsd     %xmm5, %xmm6
+        movapd    12496(%ebx), %xmm3
+        movsd     12512(%ebx), %xmm2
+        subsd     %xmm6, %xmm4
+        movl      %edx, %ecx
+        andl      $255, %edx
+        addl      %edx, %edx
+        movapd    8384(%ebx,%edx,8), %xmm5
+        addsd     %xmm1, %xmm4
+        pextrw    $3, %xmm6, %edx
+        shrl      $8, %ecx
+        movl      %ecx, %eax
+        shrl      $1, %ecx
+        subl      %ecx, %eax
+        shll      $20, %ecx
+        movd      %ecx, %xmm6
+        pshufd    $68, %xmm4, %xmm0
+        pshufd    $68, %xmm4, %xmm1
+        mulpd     %xmm0, %xmm0
+        mulpd     %xmm1, %xmm7
+        pshufd    $17, %xmm6, %xmm6
+        mulsd     %xmm4, %xmm2
+        andl      $32767, %edx
+        cmpl      $16529, %edx
+        ja        .L_2TAG_PACKET_14.0.2
+        mulsd     %xmm0, %xmm0
+        paddd     %xmm6, %xmm5
+        addpd     %xmm7, %xmm3
+        mulsd     %xmm5, %xmm2
+        pshufd    $238, %xmm5, %xmm6
+        mulpd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm2
+        pshufd    $238, %xmm0, %xmm3
+        addl      $1023, %eax
+        shll      $20, %eax
+        orl       %esi, %eax
+        movd      %eax, %xmm4
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        addsd     %xmm2, %xmm0
+        psllq     $32, %xmm4
+        addsd     %xmm3, %xmm0
+        movapd    %xmm0, %xmm1
+        addsd     %xmm5, %xmm0
+        movl      24(%esp), %esi
+        mulsd     %xmm4, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        je        .L_2TAG_PACKET_16.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_55.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_48.0.2:
+        movl      24(%esp), %esi
+.L_2TAG_PACKET_56.0.2:
+        movsd     8(%esp), %xmm0
+        movsd     16(%esp), %xmm1
+        addsd     %xmm1, %xmm1
+        xorpd     %xmm2, %xmm2
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm2
+        addsd     %xmm0, %xmm2
+        pextrw    $3, %xmm2, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_18.0.2
+        movd      %xmm1, %edx
+        movapd    %xmm1, %xmm3
+        psrlq     $20, %xmm3
+        movd      %xmm3, %ecx
+        orl       %edx, %ecx
+        je        .L_2TAG_PACKET_57.0.2
+        addsd     %xmm1, %xmm1
+        movapd    %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_57.0.2:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        pextrw    $3, %xmm1, %edx
+        xorpd     %xmm0, %xmm0
+        subl      $16368, %eax
+        xorl      %edx, %eax
+        testl     $32768, %eax
+        jne       .L_2TAG_PACKET_18.0.2
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm0
+        jmp       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_54.0.2:
+        pextrw    $3, %xmm1, %eax
+        pextrw    $3, %xmm2, %ecx
+        xorl      %ecx, %eax
+        testl     $32768, %eax
+        je        .L_2TAG_PACKET_50.0.2
+        jmp       .L_2TAG_PACKET_49.0.2
+.L_2TAG_PACKET_6.0.2:
+        movl      64(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(pow)
+# -- End  pow
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	3218479616
+	.long	0
+	.long	3210587105
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	4294965248
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	536870912
+	.long	1072689162
+	.long	2523013013
+	.long	1046157398
+	.long	3758096384
+	.long	1072685081
+	.long	3851513758
+	.long	3190968952
+	.long	0
+	.long	1072681007
+	.long	2241466466
+	.long	1046044599
+	.long	3221225472
+	.long	1072676937
+	.long	2990928271
+	.long	3193084984
+	.long	3758096384
+	.long	1072672873
+	.long	2905112743
+	.long	3192918576
+	.long	1610612736
+	.long	1072668815
+	.long	3370591264
+	.long	1046051793
+	.long	2147483648
+	.long	1072664762
+	.long	3272361216
+	.long	3193793653
+	.long	3758096384
+	.long	1072660714
+	.long	46546755
+	.long	1043206936
+	.long	3221225472
+	.long	1072656672
+	.long	3017067724
+	.long	3192177962
+	.long	0
+	.long	1072652636
+	.long	3688436631
+	.long	3192814956
+	.long	2684354560
+	.long	1072648604
+	.long	1707461992
+	.long	3193056712
+	.long	2684354560
+	.long	1072644578
+	.long	1188114540
+	.long	3193603086
+	.long	3758096384
+	.long	1072640557
+	.long	3533180564
+	.long	1045459375
+	.long	2684354560
+	.long	1072636542
+	.long	2000337630
+	.long	3193475557
+	.long	2684354560
+	.long	1072632532
+	.long	3698062443
+	.long	3193752766
+	.long	3758096384
+	.long	1072628527
+	.long	3161606138
+	.long	3190532995
+	.long	2147483648
+	.long	1072624528
+	.long	3165265478
+	.long	3193158459
+	.long	1610612736
+	.long	1072620534
+	.long	1600940077
+	.long	3193226777
+	.long	2147483648
+	.long	1072616545
+	.long	1363272552
+	.long	3192614278
+	.long	3758096384
+	.long	1072612561
+	.long	3966209910
+	.long	3191249654
+	.long	2147483648
+	.long	1072608583
+	.long	1093672789
+	.long	3190637330
+	.long	1610612736
+	.long	1072604610
+	.long	1735239357
+	.long	3192753616
+	.long	1610612736
+	.long	1072600642
+	.long	1470665156
+	.long	1045559697
+	.long	2684354560
+	.long	1072596679
+	.long	3840624926
+	.long	1045928953
+	.long	536870912
+	.long	1072592722
+	.long	4259072556
+	.long	3191035622
+	.long	3221225472
+	.long	1072588769
+	.long	3613088753
+	.long	3192165681
+	.long	2147483648
+	.long	1072584822
+	.long	3175234446
+	.long	1039486948
+	.long	1610612736
+	.long	1072580880
+	.long	856576441
+	.long	1045702812
+	.long	2147483648
+	.long	1072576943
+	.long	2253498719
+	.long	3193285334
+	.long	2684354560
+	.long	1072573011
+	.long	1587070728
+	.long	3190801577
+	.long	3758096384
+	.long	1072569084
+	.long	159986317
+	.long	1042519436
+	.long	1073741824
+	.long	1072565163
+	.long	3999541949
+	.long	3192020440
+	.long	2684354560
+	.long	1072561246
+	.long	3281310262
+	.long	1045586786
+	.long	536870912
+	.long	1072557335
+	.long	3775179406
+	.long	1045226055
+	.long	3221225472
+	.long	1072553428
+	.long	643472356
+	.long	3193681786
+	.long	1073741824
+	.long	1072549527
+	.long	248169775
+	.long	1045068977
+	.long	3758096384
+	.long	1072545630
+	.long	307016632
+	.long	1042640932
+	.long	2147483648
+	.long	1072541739
+	.long	3872718526
+	.long	3189781486
+	.long	536870912
+	.long	1072537853
+	.long	969711630
+	.long	3191724732
+	.long	3221225472
+	.long	1072533971
+	.long	4018820394
+	.long	3193189264
+	.long	1073741824
+	.long	1072530095
+	.long	3102233092
+	.long	1045510224
+	.long	3758096384
+	.long	1072526223
+	.long	1029307912
+	.long	3193812776
+	.long	1073741824
+	.long	1072522357
+	.long	984083153
+	.long	1045987403
+	.long	3221225472
+	.long	1072518495
+	.long	4171455401
+	.long	3193084080
+	.long	0
+	.long	1072514639
+	.long	2592660757
+	.long	1046121691
+	.long	1073741824
+	.long	1072510787
+	.long	2964365712
+	.long	1046054453
+	.long	2147483648
+	.long	1072506940
+	.long	3792777877
+	.long	3193704729
+	.long	2147483648
+	.long	1072503098
+	.long	2948536104
+	.long	3192467100
+	.long	1610612736
+	.long	1072499261
+	.long	3836005619
+	.long	1041873166
+	.long	536870912
+	.long	1072495429
+	.long	3124543160
+	.long	1044409168
+	.long	3221225472
+	.long	1072491601
+	.long	286227933
+	.long	1041065990
+	.long	1073741824
+	.long	1072487779
+	.long	2111296776
+	.long	3193604419
+	.long	2147483648
+	.long	1072483961
+	.long	2606822001
+	.long	3192940394
+	.long	2147483648
+	.long	1072480148
+	.long	194696800
+	.long	1046026063
+	.long	1610612736
+	.long	1072476340
+	.long	8535452
+	.long	1046200178
+	.long	536870912
+	.long	1072472537
+	.long	950463625
+	.long	3192731897
+	.long	2147483648
+	.long	1072468738
+	.long	973831566
+	.long	1045683197
+	.long	3221225472
+	.long	1072464944
+	.long	3330435892
+	.long	3190277577
+	.long	3221225472
+	.long	1072461155
+	.long	208692097
+	.long	3193517651
+	.long	1610612736
+	.long	1072457371
+	.long	2113097415
+	.long	1044781749
+	.long	3758096384
+	.long	1072453591
+	.long	1088808936
+	.long	3193716142
+	.long	0
+	.long	1072449817
+	.long	1443002127
+	.long	3193250205
+	.long	3221225472
+	.long	1072446046
+	.long	3967357419
+	.long	1046109477
+	.long	1610612736
+	.long	1072442281
+	.long	3013517861
+	.long	3193159691
+	.long	2147483648
+	.long	1072438520
+	.long	2524586286
+	.long	1046121951
+	.long	1610612736
+	.long	1072434764
+	.long	1476892861
+	.long	1046434731
+	.long	0
+	.long	1072431013
+	.long	3089640950
+	.long	3192305780
+	.long	536870912
+	.long	1072427266
+	.long	3812255529
+	.long	1045730879
+	.long	0
+	.long	1072423524
+	.long	995354762
+	.long	3191528673
+	.long	1610612736
+	.long	1072419786
+	.long	3260567684
+	.long	1046273695
+	.long	2147483648
+	.long	1072416053
+	.long	2738210286
+	.long	3191471516
+	.long	536870912
+	.long	1072412325
+	.long	1931849805
+	.long	1044560405
+	.long	1610612736
+	.long	1072408601
+	.long	358896655
+	.long	1044029237
+	.long	1073741824
+	.long	1072404882
+	.long	2214589842
+	.long	3193202126
+	.long	2684354560
+	.long	1072401167
+	.long	3118097363
+	.long	3192592906
+	.long	2147483648
+	.long	1072397457
+	.long	1835998884
+	.long	1045788247
+	.long	0
+	.long	1072393752
+	.long	1585488319
+	.long	1045289910
+	.long	0
+	.long	1072390051
+	.long	480160949
+	.long	1046030455
+	.long	2684354560
+	.long	1072386354
+	.long	1832959667
+	.long	3193013644
+	.long	2684354560
+	.long	1072382662
+	.long	3611346555
+	.long	1044544210
+	.long	1073741824
+	.long	1072378975
+	.long	2749418734
+	.long	3193712580
+	.long	1073741824
+	.long	1072375292
+	.long	2390043472
+	.long	3191710658
+	.long	3221225472
+	.long	1072371613
+	.long	2828199902
+	.long	1042265217
+	.long	3221225472
+	.long	1072367939
+	.long	569209321
+	.long	3191230982
+	.long	536870912
+	.long	1072364270
+	.long	236159139
+	.long	1046240123
+	.long	536870912
+	.long	1072360605
+	.long	1010656270
+	.long	3193813968
+	.long	1610612736
+	.long	1072356944
+	.long	2409080597
+	.long	1044025029
+	.long	536870912
+	.long	1072353288
+	.long	598419513
+	.long	1043327370
+	.long	1073741824
+	.long	1072349636
+	.long	4105950479
+	.long	1045747958
+	.long	3758096384
+	.long	1072345988
+	.long	343243853
+	.long	3192420172
+	.long	3221225472
+	.long	1072342345
+	.long	2088439530
+	.long	1046172091
+	.long	536870912
+	.long	1072338707
+	.long	4117721107
+	.long	1043882496
+	.long	3758096384
+	.long	1072335072
+	.long	3192032958
+	.long	3192998645
+	.long	3758096384
+	.long	1072331442
+	.long	2366522518
+	.long	1045401957
+	.long	1610612736
+	.long	1072327817
+	.long	3685533141
+	.long	3193701947
+	.long	536870912
+	.long	1072324196
+	.long	1058658672
+	.long	3193572492
+	.long	536870912
+	.long	1072320579
+	.long	166346347
+	.long	1045456348
+	.long	2147483648
+	.long	1072316966
+	.long	2027889772
+	.long	1046349302
+	.long	1073741824
+	.long	1072313358
+	.long	1079497888
+	.long	1044585259
+	.long	1073741824
+	.long	1072309754
+	.long	2189851573
+	.long	1045132990
+	.long	2684354560
+	.long	1072306154
+	.long	2486629386
+	.long	3193613625
+	.long	536870912
+	.long	1072302559
+	.long	1263686579
+	.long	1044789259
+	.long	0
+	.long	1072298968
+	.long	2412061798
+	.long	3191369627
+	.long	536870912
+	.long	1072295381
+	.long	584315716
+	.long	3193144135
+	.long	1610612736
+	.long	1072291798
+	.long	449000738
+	.long	1046330451
+	.long	0
+	.long	1072288220
+	.long	3938320157
+	.long	1044446220
+	.long	3758096384
+	.long	1072284645
+	.long	2949844595
+	.long	3193462371
+	.long	3758096384
+	.long	1072281075
+	.long	2771329642
+	.long	3192121593
+	.long	536870912
+	.long	1072277510
+	.long	3971508621
+	.long	3193002806
+	.long	2147483648
+	.long	1072273948
+	.long	4071942301
+	.long	1044952619
+	.long	536870912
+	.long	1072270391
+	.long	2090502395
+	.long	1044660556
+	.long	0
+	.long	1072266838
+	.long	3657520961
+	.long	3193770938
+	.long	3758096384
+	.long	1072263288
+	.long	1608175110
+	.long	1045543239
+	.long	0
+	.long	1072259744
+	.long	2506924180
+	.long	1045530501
+	.long	1073741824
+	.long	1072256203
+	.long	18238493
+	.long	1046305623
+	.long	3221225472
+	.long	1072252666
+	.long	3862640487
+	.long	3192882407
+	.long	1073741824
+	.long	1072249134
+	.long	3850158761
+	.long	1043656099
+	.long	3758096384
+	.long	1072245605
+	.long	2356524356
+	.long	1045915296
+	.long	3221225472
+	.long	1072242081
+	.long	936497287
+	.long	3193842353
+	.long	2147483648
+	.long	1072238561
+	.long	2840845344
+	.long	1046454771
+	.long	2147483648
+	.long	1072235045
+	.long	3688100713
+	.long	1044895451
+	.long	2684354560
+	.long	1072231533
+	.long	479979913
+	.long	3193842442
+	.long	2684354560
+	.long	1072228025
+	.long	1016321898
+	.long	1046251032
+	.long	3758096384
+	.long	1072224521
+	.long	562232474
+	.long	3191974558
+	.long	536870912
+	.long	1072221022
+	.long	3870512029
+	.long	3193113881
+	.long	1610612736
+	.long	1072217526
+	.long	1239780547
+	.long	3191583604
+	.long	2684354560
+	.long	1072214034
+	.long	2815421327
+	.long	1045873682
+	.long	0
+	.long	1072210547
+	.long	2371009561
+	.long	1041508792
+	.long	1610612736
+	.long	1072207063
+	.long	1304636524
+	.long	3192414284
+	.long	3221225472
+	.long	1072203583
+	.long	210144854
+	.long	3193327333
+	.long	0
+	.long	1072200108
+	.long	1454303272
+	.long	1046360024
+	.long	1610612736
+	.long	1072196636
+	.long	2095757548
+	.long	1044984677
+	.long	3221225472
+	.long	1072193168
+	.long	2027215580
+	.long	3192880933
+	.long	0
+	.long	1072189705
+	.long	214794880
+	.long	1043457954
+	.long	1073741824
+	.long	1072186245
+	.long	884624917
+	.long	1043497079
+	.long	2147483648
+	.long	1072182789
+	.long	2792396634
+	.long	3193171685
+	.long	2684354560
+	.long	1072179337
+	.long	4128995250
+	.long	3192103434
+	.long	2684354560
+	.long	1072175889
+	.long	333866043
+	.long	1046372325
+	.long	3221225472
+	.long	1072172445
+	.long	2194445544
+	.long	3193958905
+	.long	2684354560
+	.long	1072169005
+	.long	2316082269
+	.long	3192041703
+	.long	1610612736
+	.long	1072165569
+	.long	581005057
+	.long	1046322848
+	.long	536870912
+	.long	1072162137
+	.long	3280786513
+	.long	1045457251
+	.long	3221225472
+	.long	1072158708
+	.long	2567093361
+	.long	1044710359
+	.long	1073741824
+	.long	1072155284
+	.long	3740443584
+	.long	1044224237
+	.long	2684354560
+	.long	1072151863
+	.long	3981028272
+	.long	1042596351
+	.long	3758096384
+	.long	1072148446
+	.long	3820011120
+	.long	3191915623
+	.long	0
+	.long	1072145034
+	.long	2946439484
+	.long	3193831276
+	.long	3758096384
+	.long	1072141624
+	.long	3075274422
+	.long	3190132432
+	.long	2684354560
+	.long	1072138219
+	.long	496052167
+	.long	1043619760
+	.long	1073741824
+	.long	1072134818
+	.long	271106589
+	.long	3192265149
+	.long	2684354560
+	.long	1072131420
+	.long	2091955684
+	.long	1044443554
+	.long	3758096384
+	.long	1072128026
+	.long	723240109
+	.long	3191007419
+	.long	3758096384
+	.long	1072124636
+	.long	1748629070
+	.long	1044510075
+	.long	3221225472
+	.long	1072121250
+	.long	3289522046
+	.long	3193095178
+	.long	1610612736
+	.long	1072117868
+	.long	3599052146
+	.long	3193720427
+	.long	3221225472
+	.long	1072114489
+	.long	2446758135
+	.long	3193436303
+	.long	3758096384
+	.long	1072111114
+	.long	1652171097
+	.long	3192137173
+	.long	3221225472
+	.long	1072107743
+	.long	1353007155
+	.long	1044523902
+	.long	1610612736
+	.long	1072104376
+	.long	990601105
+	.long	1046296663
+	.long	3758096384
+	.long	1072101012
+	.long	2228627618
+	.long	3193041040
+	.long	0
+	.long	1072097653
+	.long	812484756
+	.long	3191950723
+	.long	3758096384
+	.long	1072094296
+	.long	817833130
+	.long	3192279242
+	.long	2147483648
+	.long	1072090944
+	.long	3563228521
+	.long	3193810951
+	.long	3221225472
+	.long	1072087595
+	.long	2729108859
+	.long	3190936185
+	.long	3221225472
+	.long	1072084250
+	.long	2249121662
+	.long	3190639690
+	.long	2147483648
+	.long	1072080909
+	.long	4082471745
+	.long	3193929368
+	.long	3758096384
+	.long	1072077571
+	.long	2827323806
+	.long	3193708561
+	.long	3758096384
+	.long	1072074237
+	.long	735866167
+	.long	1042434690
+	.long	2684354560
+	.long	1072070907
+	.long	3240808889
+	.long	3191918422
+	.long	0
+	.long	1072067581
+	.long	466482777
+	.long	3186962221
+	.long	0
+	.long	1072064258
+	.long	1576076296
+	.long	1045849056
+	.long	3221225472
+	.long	1072060938
+	.long	2751923560
+	.long	3191910703
+	.long	0
+	.long	1072057623
+	.long	1908755527
+	.long	1046437515
+	.long	0
+	.long	1072054311
+	.long	3175841411
+	.long	1044572886
+	.long	2684354560
+	.long	1072051002
+	.long	1633258450
+	.long	3192670420
+	.long	3221225472
+	.long	1072047697
+	.long	1867746657
+	.long	1045726209
+	.long	2684354560
+	.long	1072044396
+	.long	338968864
+	.long	3193084662
+	.long	0
+	.long	1072041099
+	.long	1501742471
+	.long	3191742031
+	.long	0
+	.long	1072037805
+	.long	4266775786
+	.long	3192686970
+	.long	2147483648
+	.long	1072034514
+	.long	4249283553
+	.long	1045769728
+	.long	2684354560
+	.long	1072031227
+	.long	2758366873
+	.long	1046402161
+	.long	1610612736
+	.long	1072027944
+	.long	2161186990
+	.long	1044736865
+	.long	2684354560
+	.long	1072024664
+	.long	810300171
+	.long	1045748777
+	.long	2147483648
+	.long	1072021388
+	.long	183688927
+	.long	3191515581
+	.long	3758096384
+	.long	1072018115
+	.long	368874072
+	.long	3192363575
+	.long	3221225472
+	.long	1072014846
+	.long	2459092970
+	.long	1041794640
+	.long	536870912
+	.long	1072011581
+	.long	867488640
+	.long	1046310291
+	.long	536870912
+	.long	1072008319
+	.long	50140871
+	.long	1043327329
+	.long	2684354560
+	.long	1072005060
+	.long	1241902518
+	.long	3192739252
+	.long	2684354560
+	.long	1072001805
+	.long	1027881659
+	.long	3193858388
+	.long	0
+	.long	1071998554
+	.long	38457322
+	.long	1045489179
+	.long	0
+	.long	1071995306
+	.long	3432963337
+	.long	3190969347
+	.long	1610612736
+	.long	1071992061
+	.long	534931792
+	.long	1046302734
+	.long	1610612736
+	.long	1071988820
+	.long	1817895268
+	.long	3192551860
+	.long	3221225472
+	.long	1071985582
+	.long	357237383
+	.long	3191870833
+	.long	2684354560
+	.long	1071982348
+	.long	108262401
+	.long	3193365867
+	.long	3758096384
+	.long	1071979117
+	.long	1964729244
+	.long	1042502249
+	.long	2684354560
+	.long	1071975890
+	.long	2088446957
+	.long	1038010503
+	.long	3221225472
+	.long	1071972666
+	.long	2947239447
+	.long	1046377845
+	.long	1610612736
+	.long	1071969446
+	.long	774932072
+	.long	1046064854
+	.long	2147483648
+	.long	1071966229
+	.long	4080937590
+	.long	3193041284
+	.long	3758096384
+	.long	1071963015
+	.long	2208251454
+	.long	1045945089
+	.long	3221225472
+	.long	1071959805
+	.long	2850924475
+	.long	1045650959
+	.long	0
+	.long	1071956599
+	.long	714040997
+	.long	1046275153
+	.long	3221225472
+	.long	1071953395
+	.long	85533782
+	.long	3192816920
+	.long	3221225472
+	.long	1071950195
+	.long	1252511005
+	.long	1044805706
+	.long	1073741824
+	.long	1071946999
+	.long	2384659038
+	.long	3193391602
+	.long	0
+	.long	1071943806
+	.long	416481813
+	.long	1043730233
+	.long	536870912
+	.long	1071940616
+	.long	1675424499
+	.long	1046348030
+	.long	3221225472
+	.long	1071937429
+	.long	1175989513
+	.long	3193009113
+	.long	2684354560
+	.long	1071934246
+	.long	2400084650
+	.long	3192451713
+	.long	3758096384
+	.long	1071931066
+	.long	1467335692
+	.long	3193350868
+	.long	1610612736
+	.long	1071927890
+	.long	266493801
+	.long	1044954481
+	.long	1073741824
+	.long	1071924717
+	.long	3919093445
+	.long	1046023575
+	.long	2147483648
+	.long	1071921547
+	.long	3017408483
+	.long	1044880828
+	.long	536870912
+	.long	1071918381
+	.long	948849966
+	.long	3193892224
+	.long	3758096384
+	.long	1071915217
+	.long	1870232600
+	.long	1045777228
+	.long	536870912
+	.long	1071912058
+	.long	822381492
+	.long	3193639186
+	.long	2147483648
+	.long	1071908901
+	.long	788243705
+	.long	1044966343
+	.long	1073741824
+	.long	1071905748
+	.long	1344278809
+	.long	1044428545
+	.long	1073741824
+	.long	1071902598
+	.long	172864300
+	.long	1045765608
+	.long	2684354560
+	.long	1071899451
+	.long	211555467
+	.long	3192963574
+	.long	536870912
+	.long	1071896308
+	.long	3373438023
+	.long	1045643168
+	.long	0
+	.long	1071893168
+	.long	2867180960
+	.long	3189945998
+	.long	536870912
+	.long	1071890031
+	.long	36724362
+	.long	3193240584
+	.long	1610612736
+	.long	1071886897
+	.long	2140176984
+	.long	1045945349
+	.long	0
+	.long	1071883767
+	.long	436842360
+	.long	1040712587
+	.long	3758096384
+	.long	1071880639
+	.long	1225147329
+	.long	3193814594
+	.long	3758096384
+	.long	1071877515
+	.long	1586157348
+	.long	3191614322
+	.long	536870912
+	.long	1071874395
+	.long	3329332918
+	.long	1041699791
+	.long	2684354560
+	.long	1071871277
+	.long	1635968041
+	.long	3191783756
+	.long	1073741824
+	.long	1071868163
+	.long	2876158382
+	.long	1046097093
+	.long	1073741824
+	.long	1071865052
+	.long	4267556964
+	.long	3193723000
+	.long	1073741824
+	.long	1071861944
+	.long	195475940
+	.long	1045520795
+	.long	2147483648
+	.long	1071858839
+	.long	2239193514
+	.long	1046478675
+	.long	0
+	.long	1071855738
+	.long	4168275596
+	.long	1044926285
+	.long	2684354560
+	.long	1071852639
+	.long	142514114
+	.long	1045595182
+	.long	2147483648
+	.long	1071849544
+	.long	1943457984
+	.long	3192930015
+	.long	2147483648
+	.long	1071846452
+	.long	202659489
+	.long	3193926317
+	.long	2684354560
+	.long	1071843363
+	.long	2208408789
+	.long	3193857484
+	.long	3758096384
+	.long	1071840277
+	.long	2237297552
+	.long	3192939576
+	.long	1073741824
+	.long	1071837195
+	.long	2726920839
+	.long	1044193954
+	.long	3758096384
+	.long	1071834115
+	.long	2337732207
+	.long	3193611773
+	.long	2147483648
+	.long	1071831039
+	.long	1390088602
+	.long	1044000317
+	.long	1610612736
+	.long	1071827966
+	.long	3806188736
+	.long	3193463913
+	.long	1073741824
+	.long	1071824896
+	.long	1795276560
+	.long	1043671965
+	.long	1073741824
+	.long	1071821829
+	.long	2960792799
+	.long	1046240474
+	.long	2147483648
+	.long	1071818765
+	.long	3350591592
+	.long	3193333939
+	.long	3221225472
+	.long	1071815704
+	.long	408870754
+	.long	3193322854
+	.long	0
+	.long	1071812647
+	.long	4146717132
+	.long	1046063520
+	.long	2147483648
+	.long	1071809592
+	.long	1681114919
+	.long	3192114313
+	.long	0
+	.long	1071806541
+	.long	1098393137
+	.long	3190846732
+	.long	2684354560
+	.long	1071803492
+	.long	2437484983
+	.long	3193448718
+	.long	1073741824
+	.long	1071800447
+	.long	1036809185
+	.long	3192023501
+	.long	0
+	.long	1071797405
+	.long	659668848
+	.long	3193596312
+	.long	3221225472
+	.long	1071794365
+	.long	1112062459
+	.long	3192773376
+	.long	2147483648
+	.long	1071791329
+	.long	4082956335
+	.long	1045830513
+	.long	1610612736
+	.long	1071788296
+	.long	2387089965
+	.long	1045532601
+	.long	1610612736
+	.long	1071785266
+	.long	1522101980
+	.long	3193941957
+	.long	1073741824
+	.long	1071782239
+	.long	2157197585
+	.long	3188193305
+	.long	1073741824
+	.long	1071779215
+	.long	946810220
+	.long	3193223819
+	.long	1073741824
+	.long	1071776194
+	.long	4069942444
+	.long	3193878549
+	.long	536870912
+	.long	1071773176
+	.long	1693463440
+	.long	1046360588
+	.long	536870912
+	.long	1071770161
+	.long	1954543254
+	.long	1046409381
+	.long	1073741824
+	.long	1071767149
+	.long	1050471249
+	.long	3193933095
+	.long	536870912
+	.long	1071764140
+	.long	1256240478
+	.long	1046456865
+	.long	536870912
+	.long	1071761134
+	.long	676764254
+	.long	1046055503
+	.long	536870912
+	.long	1071758131
+	.long	1421032967
+	.long	1044779786
+	.long	536870912
+	.long	1071755131
+	.long	38735992
+	.long	3192766355
+	.long	0
+	.long	1071752134
+	.long	2960669690
+	.long	1044484680
+	.long	3758096384
+	.long	1071749139
+	.long	788707382
+	.long	1045299895
+	.long	3221225472
+	.long	1071746148
+	.long	685689300
+	.long	1040778831
+	.long	2147483648
+	.long	1071743160
+	.long	1170994182
+	.long	1046159174
+	.long	1073741824
+	.long	1071740175
+	.long	64591436
+	.long	1046153849
+	.long	0
+	.long	1071737193
+	.long	2338031659
+	.long	3189997702
+	.long	2684354560
+	.long	1071734213
+	.long	1941624568
+	.long	3186752676
+	.long	536870912
+	.long	1071731237
+	.long	1401255580
+	.long	1046383990
+	.long	2684354560
+	.long	1071728263
+	.long	376888427
+	.long	1045896456
+	.long	536870912
+	.long	1071725293
+	.long	2831424639
+	.long	3193539109
+	.long	1610612736
+	.long	1071722325
+	.long	3303123696
+	.long	1044599415
+	.long	2684354560
+	.long	1071719360
+	.long	1077295329
+	.long	3189877372
+	.long	3221225472
+	.long	1071716398
+	.long	1434061099
+	.long	3184529771
+	.long	3221225472
+	.long	1071713439
+	.long	2104991590
+	.long	1045062074
+	.long	3221225472
+	.long	1071710483
+	.long	722060869
+	.long	3193788526
+	.long	536870912
+	.long	1071704580
+	.long	3928796486
+	.long	1046129020
+	.long	536870912
+	.long	1071698688
+	.long	588844628
+	.long	1045492135
+	.long	2684354560
+	.long	1071692807
+	.long	326739366
+	.long	3193004445
+	.long	1610612736
+	.long	1071686938
+	.long	2456436042
+	.long	1046278169
+	.long	2684354560
+	.long	1071681080
+	.long	2831303512
+	.long	1043670046
+	.long	536870912
+	.long	1071675234
+	.long	607223418
+	.long	1045507322
+	.long	0
+	.long	1071669399
+	.long	4254921332
+	.long	3193290483
+	.long	0
+	.long	1071663575
+	.long	914994333
+	.long	3191263853
+	.long	1073741824
+	.long	1071657762
+	.long	4147050180
+	.long	3193228552
+	.long	2684354560
+	.long	1071651960
+	.long	594554157
+	.long	3193503935
+	.long	0
+	.long	1071646170
+	.long	1062846796
+	.long	1045944331
+	.long	1073741824
+	.long	1071636109
+	.long	2909238893
+	.long	3193436884
+	.long	1073741824
+	.long	1071624572
+	.long	1682918119
+	.long	1042211899
+	.long	1073741824
+	.long	1071613057
+	.long	2419209426
+	.long	1045437062
+	.long	1073741824
+	.long	1071601564
+	.long	2951341321
+	.long	3190193214
+	.long	0
+	.long	1071590093
+	.long	3084900875
+	.long	3192394907
+	.long	1073741824
+	.long	1071578643
+	.long	999567454
+	.long	1046433447
+	.long	2147483648
+	.long	1071567215
+	.long	1570101857
+	.long	3193291160
+	.long	0
+	.long	1071555809
+	.long	1080647881
+	.long	3185154585
+	.long	0
+	.long	1071544424
+	.long	3526309177
+	.long	1044843640
+	.long	2147483648
+	.long	1071533060
+	.long	2213463349
+	.long	3191738930
+	.long	1073741824
+	.long	1071521718
+	.long	1039925195
+	.long	3192618353
+	.long	1073741824
+	.long	1071510397
+	.long	2115757280
+	.long	3193671567
+	.long	1073741824
+	.long	1071499097
+	.long	1188751495
+	.long	3191145560
+	.long	2147483648
+	.long	1071487818
+	.long	3983461449
+	.long	3193897029
+	.long	2147483648
+	.long	1071476560
+	.long	782141500
+	.long	1042879962
+	.long	2147483648
+	.long	1071465323
+	.long	4038904626
+	.long	1045063881
+	.long	2147483648
+	.long	1071454107
+	.long	2613036921
+	.long	3193217642
+	.long	0
+	.long	1071442912
+	.long	2095723435
+	.long	1044629175
+	.long	1073741824
+	.long	1071431737
+	.long	3879795974
+	.long	1045767874
+	.long	1073741824
+	.long	1071420583
+	.long	2662198042
+	.long	3191434637
+	.long	3221225472
+	.long	1071409449
+	.long	4037605722
+	.long	3193703090
+	.long	2147483648
+	.long	1071398336
+	.long	1860331835
+	.long	1040814822
+	.long	3221225472
+	.long	1071387243
+	.long	1522972033
+	.long	3190305974
+	.long	1073741824
+	.long	1071376171
+	.long	2361534207
+	.long	1043699366
+	.long	0
+	.long	1071365119
+	.long	4180309179
+	.long	1044142099
+	.long	0
+	.long	1071354087
+	.long	1201038528
+	.long	3192968772
+	.long	0
+	.long	1071343075
+	.long	1342478171
+	.long	3193251215
+	.long	0
+	.long	1071332083
+	.long	3836883348
+	.long	3193472007
+	.long	3221225472
+	.long	1071321110
+	.long	3864874250
+	.long	1045593126
+	.long	2147483648
+	.long	1071310158
+	.long	2169494998
+	.long	1046045346
+	.long	1073741824
+	.long	1071299226
+	.long	3785165075
+	.long	3193319246
+	.long	2147483648
+	.long	1071288313
+	.long	1137692678
+	.long	3192716779
+	.long	1073741824
+	.long	1071277420
+	.long	1752107598
+	.long	1046366120
+	.long	3221225472
+	.long	1071266546
+	.long	1912656912
+	.long	1046352281
+	.long	3221225472
+	.long	1071255692
+	.long	2882676334
+	.long	1046406353
+	.long	1073741824
+	.long	1071244858
+	.long	963612460
+	.long	1045282811
+	.long	0
+	.long	1071234043
+	.long	3811255773
+	.long	1046231636
+	.long	1073741824
+	.long	1071223247
+	.long	1126055989
+	.long	3192224037
+	.long	2147483648
+	.long	1071212470
+	.long	2079145427
+	.long	1044432413
+	.long	0
+	.long	1071201713
+	.long	3611595621
+	.long	1043358745
+	.long	2147483648
+	.long	1071190974
+	.long	390522769
+	.long	1045888252
+	.long	1073741824
+	.long	1071180255
+	.long	4087939723
+	.long	3192930745
+	.long	3221225472
+	.long	1071169554
+	.long	1451494480
+	.long	3190219274
+	.long	1073741824
+	.long	1071158873
+	.long	427176194
+	.long	3193042022
+	.long	2147483648
+	.long	1071148210
+	.long	1882381948
+	.long	3192727946
+	.long	2147483648
+	.long	1071137566
+	.long	3736313771
+	.long	3192087019
+	.long	1073741824
+	.long	1071126941
+	.long	1560398816
+	.long	3193185715
+	.long	2147483648
+	.long	1071116334
+	.long	1021942441
+	.long	1041526696
+	.long	2147483648
+	.long	1071105746
+	.long	3517080249
+	.long	3193576041
+	.long	3221225472
+	.long	1071095176
+	.long	2248589878
+	.long	1044527624
+	.long	2147483648
+	.long	1071084625
+	.long	2412896695
+	.long	1046112867
+	.long	3221225472
+	.long	1071074092
+	.long	3834725738
+	.long	1044562378
+	.long	1073741824
+	.long	1071063578
+	.long	1150920407
+	.long	1043768986
+	.long	0
+	.long	1071053082
+	.long	1379393428
+	.long	3188690690
+	.long	0
+	.long	1071042604
+	.long	3058183278
+	.long	3193617655
+	.long	0
+	.long	1071032144
+	.long	421133665
+	.long	3193417186
+	.long	0
+	.long	1071021702
+	.long	2860161357
+	.long	3191816125
+	.long	0
+	.long	1071011278
+	.long	1742405964
+	.long	1043580240
+	.long	0
+	.long	1071000872
+	.long	2821215927
+	.long	3188984273
+	.long	3221225472
+	.long	1070990483
+	.long	510275597
+	.long	1045813401
+	.long	2147483648
+	.long	1070980113
+	.long	304266588
+	.long	3191193536
+	.long	3221225472
+	.long	1070969760
+	.long	1854784211
+	.long	1046302073
+	.long	0
+	.long	1070959426
+	.long	3773082854
+	.long	3193008899
+	.long	2147483648
+	.long	1070949108
+	.long	3003572392
+	.long	1046404879
+	.long	3221225472
+	.long	1070938808
+	.long	1702149204
+	.long	1046407257
+	.long	2147483648
+	.long	1070928526
+	.long	3935314439
+	.long	1046438280
+	.long	3221225472
+	.long	1070918261
+	.long	2677087609
+	.long	1045501749
+	.long	2147483648
+	.long	1070908014
+	.long	4190598039
+	.long	3193640515
+	.long	1073741824
+	.long	1070897784
+	.long	368874072
+	.long	1044879927
+	.long	2147483648
+	.long	1070887571
+	.long	3584052697
+	.long	3192024662
+	.long	3221225472
+	.long	1070877375
+	.long	3762307829
+	.long	1045886918
+	.long	1073741824
+	.long	1070867197
+	.long	495710920
+	.long	1046317072
+	.long	0
+	.long	1070857036
+	.long	2292768238
+	.long	3190887508
+	.long	3221225472
+	.long	1070846891
+	.long	1044078151
+	.long	3193772914
+	.long	1073741824
+	.long	1070836764
+	.long	3266010457
+	.long	1043443755
+	.long	3221225472
+	.long	1070826653
+	.long	3571665822
+	.long	1045547823
+	.long	1073741824
+	.long	1070816560
+	.long	393348347
+	.long	3190525143
+	.long	2147483648
+	.long	1070806483
+	.long	4241722498
+	.long	3192084193
+	.long	2147483648
+	.long	1070796423
+	.long	1693797068
+	.long	3192807972
+	.long	0
+	.long	1070786380
+	.long	2860086745
+	.long	1046331646
+	.long	2147483648
+	.long	1070776353
+	.long	1366141759
+	.long	3192979363
+	.long	1073741824
+	.long	1070766343
+	.long	737899283
+	.long	1045853346
+	.long	3221225472
+	.long	1070756349
+	.long	88734873
+	.long	1043881257
+	.long	3221225472
+	.long	1070746372
+	.long	1438003315
+	.long	3192917101
+	.long	0
+	.long	1070736412
+	.long	1066505530
+	.long	1043896695
+	.long	3221225472
+	.long	1070726467
+	.long	2706653041
+	.long	3191113643
+	.long	3221225472
+	.long	1070716539
+	.long	1321764476
+	.long	1039573724
+	.long	0
+	.long	1070706628
+	.long	1126753211
+	.long	1044502976
+	.long	2147483648
+	.long	1070696732
+	.long	773642884
+	.long	1044110727
+	.long	1073741824
+	.long	1070686853
+	.long	1263743406
+	.long	3193115278
+	.long	0
+	.long	1070676990
+	.long	3115237732
+	.long	3193089176
+	.long	3221225472
+	.long	1070667142
+	.long	3642626838
+	.long	3191146032
+	.long	2147483648
+	.long	1070657311
+	.long	2091696428
+	.long	1044337177
+	.long	1073741824
+	.long	1070647496
+	.long	3168958391
+	.long	1044197568
+	.long	0
+	.long	1070637697
+	.long	711148669
+	.long	3193181047
+	.long	2147483648
+	.long	1070627913
+	.long	4207182773
+	.long	3193402092
+	.long	3221225472
+	.long	1070618145
+	.long	918070640
+	.long	3192902845
+	.long	3221225472
+	.long	1070608393
+	.long	3135571447
+	.long	3192193928
+	.long	2147483648
+	.long	1070598657
+	.long	1043705517
+	.long	3193188604
+	.long	2147483648
+	.long	1070581777
+	.long	1886680492
+	.long	1043890286
+	.long	2147483648
+	.long	1070562367
+	.long	3373799420
+	.long	3191917802
+	.long	2147483648
+	.long	1070542988
+	.long	2919618025
+	.long	3192461752
+	.long	2147483648
+	.long	1070523640
+	.long	2926365158
+	.long	3193113492
+	.long	0
+	.long	1070504323
+	.long	519978638
+	.long	1045918846
+	.long	0
+	.long	1070485037
+	.long	3665353151
+	.long	3193546248
+	.long	0
+	.long	1070465781
+	.long	2327718958
+	.long	1045050797
+	.long	0
+	.long	1070446556
+	.long	345326861
+	.long	3188224716
+	.long	2147483648
+	.long	1070427361
+	.long	2263747488
+	.long	3192871328
+	.long	0
+	.long	1070408197
+	.long	3894192264
+	.long	1045693123
+	.long	0
+	.long	1070389063
+	.long	994321593
+	.long	1046347203
+	.long	2147483648
+	.long	1070369959
+	.long	3540366700
+	.long	1042296230
+	.long	0
+	.long	1070350886
+	.long	966420752
+	.long	3192400412
+	.long	2147483648
+	.long	1070331842
+	.long	1954511160
+	.long	3193467762
+	.long	2147483648
+	.long	1070312828
+	.long	1875003040
+	.long	1045485629
+	.long	0
+	.long	1070293845
+	.long	4003372005
+	.long	3193714109
+	.long	2147483648
+	.long	1070274890
+	.long	2216083644
+	.long	1045720399
+	.long	0
+	.long	1070255966
+	.long	1240985743
+	.long	1045879414
+	.long	0
+	.long	1070237071
+	.long	1573064162
+	.long	1046427916
+	.long	0
+	.long	1070218206
+	.long	2500166582
+	.long	3193848169
+	.long	2147483648
+	.long	1070199369
+	.long	862131539
+	.long	1045606065
+	.long	0
+	.long	1070180563
+	.long	3733427622
+	.long	3193545988
+	.long	0
+	.long	1070161785
+	.long	124515358
+	.long	1045504766
+	.long	2147483648
+	.long	1070143036
+	.long	689228007
+	.long	1044238436
+	.long	0
+	.long	1070124317
+	.long	976284835
+	.long	3189879978
+	.long	2147483648
+	.long	1070105626
+	.long	2997446224
+	.long	3193394244
+	.long	2147483648
+	.long	1070086964
+	.long	594985163
+	.long	3190453447
+	.long	2147483648
+	.long	1070068331
+	.long	3634411091
+	.long	3193012662
+	.long	0
+	.long	1070049727
+	.long	841316482
+	.long	3192551604
+	.long	0
+	.long	1070031151
+	.long	518949849
+	.long	3189505693
+	.long	2147483648
+	.long	1070012603
+	.long	207633604
+	.long	1043791305
+	.long	2147483648
+	.long	1069994084
+	.long	925415631
+	.long	3189658670
+	.long	2147483648
+	.long	1069975593
+	.long	3348775015
+	.long	1046231055
+	.long	0
+	.long	1069957131
+	.long	4137593961
+	.long	1045760644
+	.long	2147483648
+	.long	1069938696
+	.long	3081207972
+	.long	1046319652
+	.long	2147483648
+	.long	1069920290
+	.long	2912811806
+	.long	3193250863
+	.long	0
+	.long	1069901912
+	.long	1704663230
+	.long	3192651171
+	.long	2147483648
+	.long	1069883561
+	.long	1726887473
+	.long	3193427817
+	.long	2147483648
+	.long	1069865238
+	.long	516302873
+	.long	1042556919
+	.long	2147483648
+	.long	1069846943
+	.long	3737277289
+	.long	3192083505
+	.long	0
+	.long	1069828676
+	.long	2829909067
+	.long	3191628520
+	.long	0
+	.long	1069810436
+	.long	3474800299
+	.long	3187384991
+	.long	2147483648
+	.long	1069792223
+	.long	2041291754
+	.long	3186735048
+	.long	2147483648
+	.long	1069774038
+	.long	3100739290
+	.long	3192991951
+	.long	2147483648
+	.long	1069755880
+	.long	2641686866
+	.long	1042449846
+	.long	0
+	.long	1069737750
+	.long	1353612457
+	.long	3192928544
+	.long	2147483648
+	.long	1069719646
+	.long	1823398190
+	.long	3193125156
+	.long	0
+	.long	1069701570
+	.long	2629108558
+	.long	3192983089
+	.long	2147483648
+	.long	1069683520
+	.long	314889080
+	.long	3193178947
+	.long	2147483648
+	.long	1069665497
+	.long	3426846470
+	.long	1046055034
+	.long	0
+	.long	1069647502
+	.long	2451521798
+	.long	3193081447
+	.long	2147483648
+	.long	1069629532
+	.long	963200030
+	.long	1046315089
+	.long	0
+	.long	1069611590
+	.long	3644976987
+	.long	1046450297
+	.long	2147483648
+	.long	1069593674
+	.long	1514045874
+	.long	3193337489
+	.long	0
+	.long	1069575785
+	.long	2640752615
+	.long	3192734715
+	.long	0
+	.long	1069557922
+	.long	177381730
+	.long	3193107348
+	.long	0
+	.long	1069532650
+	.long	546871269
+	.long	1045601847
+	.long	0
+	.long	1069497029
+	.long	2220408187
+	.long	1045964849
+	.long	0
+	.long	1069461461
+	.long	3101209784
+	.long	3192417098
+	.long	0
+	.long	1069425944
+	.long	3768825782
+	.long	1046196178
+	.long	0
+	.long	1069390480
+	.long	737308942
+	.long	1043872555
+	.long	0
+	.long	1069355068
+	.long	1944808119
+	.long	3193362317
+	.long	0
+	.long	1069319707
+	.long	852406261
+	.long	3191004250
+	.long	0
+	.long	1069284398
+	.long	3202370743
+	.long	3192549796
+	.long	0
+	.long	1069249140
+	.long	900633975
+	.long	1043862575
+	.long	0
+	.long	1069213934
+	.long	3417168564
+	.long	3193213168
+	.long	0
+	.long	1069178778
+	.long	2513309972
+	.long	1046051953
+	.long	0
+	.long	1069143674
+	.long	1836846968
+	.long	1044036653
+	.long	0
+	.long	1069108621
+	.long	675391362
+	.long	3193334972
+	.long	0
+	.long	1069073618
+	.long	1859398086
+	.long	3191668729
+	.long	0
+	.long	1069038666
+	.long	3835994043
+	.long	3193252196
+	.long	0
+	.long	1069003764
+	.long	563337246
+	.long	3192060530
+	.long	0
+	.long	1068968912
+	.long	3715154210
+	.long	1045592716
+	.long	0
+	.long	1068934111
+	.long	51415636
+	.long	3192193939
+	.long	0
+	.long	1068899359
+	.long	822049108
+	.long	1045846080
+	.long	0
+	.long	1068864658
+	.long	3739043340
+	.long	3193184949
+	.long	0
+	.long	1068830006
+	.long	2500828997
+	.long	3193115638
+	.long	0
+	.long	1068795403
+	.long	1479335089
+	.long	1045458233
+	.long	0
+	.long	1068760850
+	.long	1914098598
+	.long	1045079833
+	.long	0
+	.long	1068726346
+	.long	1470374909
+	.long	1046125471
+	.long	0
+	.long	1068691892
+	.long	2048101185
+	.long	3192960024
+	.long	0
+	.long	1068657486
+	.long	801101802
+	.long	1042523454
+	.long	0
+	.long	1068623129
+	.long	412171467
+	.long	1044799425
+	.long	0
+	.long	1068588821
+	.long	2124566049
+	.long	1040459843
+	.long	0
+	.long	1068554561
+	.long	2087558263
+	.long	1046083102
+	.long	0
+	.long	1068520350
+	.long	290389316
+	.long	1045220023
+	.long	0
+	.long	1068473430
+	.long	393737815
+	.long	1045770085
+	.long	0
+	.long	1068405202
+	.long	3273111658
+	.long	3193594336
+	.long	0
+	.long	1068337068
+	.long	3076935419
+	.long	3191993934
+	.long	0
+	.long	1068269030
+	.long	1564279721
+	.long	1040713632
+	.long	0
+	.long	1068201088
+	.long	1950103787
+	.long	3191285473
+	.long	0
+	.long	1068133240
+	.long	111301617
+	.long	1046140470
+	.long	0
+	.long	1068065488
+	.long	2740933659
+	.long	1046091898
+	.long	0
+	.long	1067997832
+	.long	1267131462
+	.long	3192947024
+	.long	0
+	.long	1067930268
+	.long	629787343
+	.long	1045599114
+	.long	0
+	.long	1067862800
+	.long	2943029746
+	.long	3191100621
+	.long	0
+	.long	1067795426
+	.long	2538631151
+	.long	3193953989
+	.long	0
+	.long	1067728144
+	.long	3881795033
+	.long	3191377363
+	.long	0
+	.long	1067660956
+	.long	2752747058
+	.long	3186250103
+	.long	0
+	.long	1067593862
+	.long	892170014
+	.long	3193330390
+	.long	0
+	.long	1067526860
+	.long	2000985783
+	.long	3192968647
+	.long	0
+	.long	1067459950
+	.long	1954077304
+	.long	1044399908
+	.long	0
+	.long	1067335900
+	.long	4120702847
+	.long	3193150730
+	.long	0
+	.long	1067202448
+	.long	353489980
+	.long	1045676744
+	.long	0
+	.long	1067069184
+	.long	2609643324
+	.long	3192108001
+	.long	0
+	.long	1066936100
+	.long	2904433317
+	.long	1044836541
+	.long	0
+	.long	1066803200
+	.long	319656790
+	.long	1044863904
+	.long	0
+	.long	1066670484
+	.long	2407987331
+	.long	3192995083
+	.long	0
+	.long	1066537948
+	.long	2437746120
+	.long	3193127733
+	.long	0
+	.long	1066405592
+	.long	762570215
+	.long	3189946997
+	.long	0
+	.long	1066145040
+	.long	3317159694
+	.long	1046060125
+	.long	0
+	.long	1065881056
+	.long	2317845886
+	.long	3191679176
+	.long	0
+	.long	1065617424
+	.long	3665195816
+	.long	1045633853
+	.long	0
+	.long	1065354160
+	.long	2008730355
+	.long	3193898211
+	.long	0
+	.long	1064829264
+	.long	3746236192
+	.long	1046121471
+	.long	0
+	.long	1064303680
+	.long	885296753
+	.long	3191852441
+	.long	0
+	.long	1063253696
+	.long	449976495
+	.long	3192682663
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	4294965248
+	.long	0
+	.long	4294965248
+	.long	0
+	.long	1073160192
+	.long	370913857
+	.long	3210587105
+	.long	1841914130
+	.long	3213059448
+	.long	3995341938
+	.long	3214607105
+	.long	2677381210
+	.long	3216320731
+	.long	3011779882
+	.long	3218479542
+	.long	1367832035
+	.long	1066403058
+	.long	2894285243
+	.long	1067936923
+	.long	1215221452
+	.long	1069835102
+	.long	370913857
+	.long	3210587105
+	.long	2677381210
+	.long	3216320731
+	.long	4172642429
+	.long	1056068382
+	.long	1215221451
+	.long	1069835102
+	.long	1092638156
+	.long	3184925618
+	.long	0
+	.long	4294967288
+	.long	0
+	.long	4294967295
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	997195776
+	.long	4200250559
+	.long	1072696090
+	.long	2808127345
+	.long	3162830514
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	339411585
+	.long	1072701800
+	.long	264588982
+	.long	3162685233
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	772914124
+	.long	1072707540
+	.long	4004372762
+	.long	1013278737
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	1928746161
+	.long	1072713311
+	.long	983617676
+	.long	1015333753
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	238821257
+	.long	1072719114
+	.long	1469694871
+	.long	3163933563
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	728934454
+	.long	1072724948
+	.long	1413842688
+	.long	1015227188
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	4133881824
+	.long	1072730813
+	.long	2148155345
+	.long	3163979875
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	2602514713
+	.long	1072736711
+	.long	2268929336
+	.long	1015402860
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	1172597893
+	.long	1072742641
+	.long	114433263
+	.long	1016396169
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	590962156
+	.long	1072748603
+	.long	3829346666
+	.long	3164324173
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	1608493509
+	.long	1072754597
+	.long	3159622171
+	.long	3163856313
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	685187902
+	.long	1072760624
+	.long	378731989
+	.long	1015891691
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	2875075254
+	.long	1072766683
+	.long	4144233330
+	.long	3164382292
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	351405227
+	.long	1072772776
+	.long	3125337328
+	.long	3160871055
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	2471440686
+	.long	1072778901
+	.long	968836267
+	.long	3163263464
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1416741826
+	.long	1072785060
+	.long	2196380210
+	.long	1012462139
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	2257959872
+	.long	1072791252
+	.long	3802946148
+	.long	1014013503
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	1480023343
+	.long	1072797478
+	.long	2247196168
+	.long	1016376029
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	4162030108
+	.long	1072803737
+	.long	2763428480
+	.long	1016577925
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	2502433899
+	.long	1072810031
+	.long	2148595913
+	.long	1016072567
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	1588871207
+	.long	1072816359
+	.long	143439582
+	.long	3164011992
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2218315341
+	.long	1072822721
+	.long	2694295388
+	.long	3164337444
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	897099801
+	.long	1072829118
+	.long	754756297
+	.long	1016289581
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	2725843665
+	.long	1072835549
+	.long	1433917087
+	.long	1015887099
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	4219606026
+	.long	1072842015
+	.long	2434574742
+	.long	1015730124
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1897844341
+	.long	1072848517
+	.long	1254300460
+	.long	1016324514
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	874372905
+	.long	1072855054
+	.long	100263788
+	.long	1016989308
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	1972484976
+	.long	1072861626
+	.long	675290301
+	.long	3162688626
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	1724976915
+	.long	1072868234
+	.long	420909223
+	.long	3164165955
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	964107055
+	.long	1072874878
+	.long	2800439588
+	.long	3163881797
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	526652809
+	.long	1072881558
+	.long	4223459736
+	.long	1016927951
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	1253935211
+	.long	1072888274
+	.long	1395382931
+	.long	3160751189
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	3991843581
+	.long	1072895026
+	.long	4092853457
+	.long	1015634339
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	1000925746
+	.long	1072901816
+	.long	1018491672
+	.long	3164358120
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1726216749
+	.long	1072908642
+	.long	2466808228
+	.long	3162724981
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	2732492859
+	.long	1072915505
+	.long	2691479646
+	.long	3163304260
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	589198666
+	.long	1072922406
+	.long	2664346172
+	.long	3164206538
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	460407023
+	.long	1072929344
+	.long	4237175092
+	.long	3164187045
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3219942644
+	.long	1072936319
+	.long	3798990616
+	.long	1016417382
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1156440435
+	.long	1072943333
+	.long	2351451249
+	.long	1015015632
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	3743175029
+	.long	1072950384
+	.long	2072812490
+	.long	3163223651
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	3278348324
+	.long	1072957474
+	.long	3069497416
+	.long	1015799288
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	654919306
+	.long	1072964603
+	.long	3232961757
+	.long	3164096045
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1065662932
+	.long	1072971770
+	.long	2533670915
+	.long	1015578814
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	1118294578
+	.long	1072978976
+	.long	2197495694
+	.long	3160957977
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	1720398391
+	.long	1072986221
+	.long	3980678963
+	.long	3164348656
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	3784486610
+	.long	1072993505
+	.long	1581883040
+	.long	3162747529
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3933059031
+	.long	1073000829
+	.long	2133366768
+	.long	3162580408
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	3088564500
+	.long	1073008193
+	.long	1762311517
+	.long	1016094249
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	2178460671
+	.long	1073015597
+	.long	777878098
+	.long	3163891069
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2135241198
+	.long	1073023041
+	.long	1236747871
+	.long	1014637723
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	3896463087
+	.long	1073030525
+	.long	1139797873
+	.long	3162282381
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	4109806887
+	.long	1073038050
+	.long	422403966
+	.long	1015517805
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	3723038930
+	.long	1073045616
+	.long	378465264
+	.long	3163618158
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3689071823
+	.long	1073053223
+	.long	2321004996
+	.long	3163601292
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	671025100
+	.long	1073060872
+	.long	3832014351
+	.long	3164070606
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	4222122499
+	.long	1073068561
+	.long	1277378074
+	.long	3164305313
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	2425981843
+	.long	1073076293
+	.long	2830390851
+	.long	3164395175
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	551349105
+	.long	1073084067
+	.long	3821916050
+	.long	3163155165
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	3872257780
+	.long	1073091882
+	.long	1253592103
+	.long	1017006910
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	488188413
+	.long	1073099741
+	.long	3199821029
+	.long	1016612624
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	4273770423
+	.long	1073107641
+	.long	3383180809
+	.long	3164267477
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3339203574
+	.long	1073115585
+	.long	1483497780
+	.long	3163457330
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	2979960120
+	.long	1073123572
+	.long	2599109725
+	.long	1015547069
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	4201977662
+	.long	1073131602
+	.long	748330254
+	.long	1014642933
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	3721688645
+	.long	1073139676
+	.long	3069276937
+	.long	1016887977
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	2555984613
+	.long	1073147794
+	.long	2652555442
+	.long	3163601268
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	1727278727
+	.long	1073155956
+	.long	3562710623
+	.long	1012520516
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	2263535754
+	.long	1073164162
+	.long	752233586
+	.long	3163687584
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	903334909
+	.long	1073172413
+	.long	1636462108
+	.long	1016088573
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	2980802057
+	.long	1073180708
+	.long	378619896
+	.long	1016821879
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	950803702
+	.long	1073189049
+	.long	1655364926
+	.long	1016285608
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	158781403
+	.long	1073197435
+	.long	2221464712
+	.long	3164335029
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	1660913392
+	.long	1073205866
+	.long	4218599604
+	.long	1016184283
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	2224145553
+	.long	1073214343
+	.long	3482522030
+	.long	3162537745
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2916157145
+	.long	1073222866
+	.long	219487565
+	.long	1016357943
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	515457527
+	.long	1073231436
+	.long	836709333
+	.long	1016699802
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	396319521
+	.long	1073240052
+	.long	4172420816
+	.long	3160123208
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3643909174
+	.long	1073248714
+	.long	3537586109
+	.long	1015403223
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	2759350287
+	.long	1073257424
+	.long	1148526634
+	.long	1016943509
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	3134592888
+	.long	1073266181
+	.long	4232266862
+	.long	1017039710
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	1577608921
+	.long	1073274986
+	.long	1875489510
+	.long	3164016970
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	3492293770
+	.long	1073283838
+	.long	2248032210
+	.long	1016435402
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	1403662306
+	.long	1073292739
+	.long	2788809599
+	.long	3162719583
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	727685349
+	.long	1073301688
+	.long	2038246809
+	.long	3163407318
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2591453363
+	.long	1073310685
+	.long	2132396182
+	.long	3160122774
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	3833209506
+	.long	1073319731
+	.long	2722920684
+	.long	1014803418
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	1297350157
+	.long	1073328827
+	.long	1308022040
+	.long	3164461134
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	424392917
+	.long	1073337972
+	.long	2749202995
+	.long	3163887294
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2366108318
+	.long	1073347166
+	.long	2867985102
+	.long	3162810830
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3985553595
+	.long	1073356410
+	.long	4002146062
+	.long	1016882712
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2152073944
+	.long	1073365705
+	.long	1486860576
+	.long	3164252032
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	2331271250
+	.long	1073375050
+	.long	812057446
+	.long	1013256022
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1405169241
+	.long	1073384446
+	.long	2998539689
+	.long	3163879527
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	557149882
+	.long	1073393893
+	.long	3672720709
+	.long	1015585841
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	977020788
+	.long	1073403391
+	.long	3065100517
+	.long	1016590139
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	3861050111
+	.long	1073412940
+	.long	254893773
+	.long	3163861756
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	1822067026
+	.long	1073422542
+	.long	1241994956
+	.long	1016388866
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	364333489
+	.long	1073432196
+	.long	3923737744
+	.long	3162469949
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	703710506
+	.long	1073441902
+	.long	1384660846
+	.long	1016244467
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	4062661092
+	.long	1073451660
+	.long	1422616006
+	.long	3164303894
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	3080351519
+	.long	1073461472
+	.long	3379126789
+	.long	3158266577
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	3287523847
+	.long	1073471337
+	.long	1625971539
+	.long	3158058531
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	1631695677
+	.long	1073481256
+	.long	2717633076
+	.long	3163392602
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	3657065772
+	.long	1073491228
+	.long	399025623
+	.long	3164005654
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	2029714210
+	.long	1073501255
+	.long	613660079
+	.long	1016147719
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2307442995
+	.long	1073511336
+	.long	3190117721
+	.long	3163453115
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	1464976603
+	.long	1073521472
+	.long	3507292405
+	.long	3163026110
+	.long	3706687593
+	.long	1073526560
+	.long	3521726939
+	.long	1014301643
+	.long	778901109
+	.long	1073531663
+	.long	2248183954
+	.long	3162317327
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1532734324
+	.long	1073541909
+	.long	3094216535
+	.long	3164211433
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	721996136
+	.long	1073552211
+	.long	563754734
+	.long	1016419894
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3939148246
+	.long	1073562568
+	.long	3210352148
+	.long	1016322899
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	3898795731
+	.long	1073572982
+	.long	1249994144
+	.long	1012918394
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	1912561781
+	.long	1073583453
+	.long	3147495102
+	.long	1016726829
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	3594158869
+	.long	1073593980
+	.long	2456521700
+	.long	3164305137
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	1679558232
+	.long	1073604565
+	.long	2390342287
+	.long	3164382546
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	1796832535
+	.long	1073615207
+	.long	3176955716
+	.long	3161634089
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	991358482
+	.long	1073625907
+	.long	838715019
+	.long	3164206244
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	610758006
+	.long	1073636665
+	.long	1965209397
+	.long	3162914808
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2009970496
+	.long	1073647481
+	.long	2159039665
+	.long	3163621524
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	2256325230
+	.long	1073658356
+	.long	580117746
+	.long	1016365871
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	2719515920
+	.long	1073669290
+	.long	2760332941
+	.long	1016186509
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	481706282
+	.long	1073680284
+	.long	1696079173
+	.long	3163759104
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1222472308
+	.long	1073691337
+	.long	1054357470
+	.long	3162069594
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2038973688
+	.long	1073702450
+	.long	892941374
+	.long	1017095035
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	35929225
+	.long	1073713624
+	.long	2809788041
+	.long	3160485544
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	915592468
+	.long	1073724858
+	.long	352947894
+	.long	3162072947
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.long	1797923801
+	.long	1073736153
+	.long	1950547427
+	.long	1014277635
+	.long	3884607281
+	.long	1062590591
+	.long	3607404736
+	.long	1068264200
+	.long	1874480759
+	.long	1065595563
+	.long	4286760335
+	.long	1070514109
+	.long	4277811695
+	.long	1072049730
+	.long	0
+	.long	0
+	.long	4277811695
+	.long	1072049730
+	.long	4277811695
+	.long	3219533378
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.type	static_const_table,@object
+	.size	static_const_table,12576
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/e_sinh.S b/libm/x86/e_sinh.S
new file mode 100644
index 0000000..d6b04b5
--- /dev/null
+++ b/libm/x86/e_sinh.S
@@ -0,0 +1,1407 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  sinh(x)=(exp(x)-exp(-x))/2
+//
+//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//          L2EH+L2EL (upper 26, lower 53 bits)
+//
+//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
+//                              f=0.b1 b2 ... b7, k integer
+//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
+//  Tp stores the high 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
+//
+//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
+//                       for |x| in [23/64,3*2^7)
+//  e^{-|x|}=2^{-k-f}*2^{-r}
+//
+//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
+//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
+//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)+2^{-k}*Dn
+//
+//  For |x| in [1/8, 3*2^7), sinh(x) is formed as
+//      RN(2^k*Tp-2^{-k}*Tn)+2^k*Tp*P15-2^{-k}*Tn*P`15-2^{-k}*TnL-2^{-k}*Dn+2^k*Dp
+//
+//  For x in (3*2^7, 3*2^8), sign(x)*(e^|x|)/2 is returned, and
+//  the result is checked for overflow.
+//
+//  For |x|<23/64, a Taylor polynomial expansion is used (degree 13)
+//  To reduce rounding errors, the p3*x^3 term is computed as
+//     (p3*xh^3)_high+[(p3*xl*(3*x*xh+xl^2))+(p3*xh^3)_low],
+//  where x=xh+xl, (xh are the leading 17 bits of x), and
+//     (p3*xh^3)_high=RN(x+p3*xh^3)-x
+//  (error bound for polynomial expansion is below 0.51 ulp)
+//
+// Special cases:
+//  sinh(NaN) = quiet NaN, and raise invalid exception
+//  sinh(+/-INF) = +/-INF
+//  sinh(x) = x for subnormals
+//  for finite argument, only sinh(0)=0 is exact
+//  For IEEE double
+//    sinh(x) overflows  for x > 
+//    710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  sinh
+ENTRY(sinh)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        movsd     4272(%ebx), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     4192(%ebx), %xmm1
+        movsd     4200(%ebx), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     4096(%ebx), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        movl      $32768, %edx
+        andl      %ecx, %edx
+        andl      $32767, %ecx
+        subl      $16343, %ecx
+        cmpl      $177, %ecx
+        jae       .L_2TAG_PACKET_0.0.2
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        shll      $3, %edx
+        orl       %edx, %eax
+        movapd    %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        xorpd     %xmm5, %xmm5
+        subsd     %xmm6, %xmm3
+        movapd    4112(%ebx), %xmm4
+        addsd     %xmm1, %xmm2
+        movapd    4128(%ebx), %xmm6
+        subsd     %xmm3, %xmm7
+        movl      $32704, %edx
+        pinsrw    $3, %edx, %xmm5
+        movapd    4144(%ebx), %xmm1
+        addsd     %xmm7, %xmm2
+        movl      $127, %edx
+        andl      %eax, %edx
+        addl      %edx, %edx
+        shrl      $3, %eax
+        andl      $65520, %eax
+        addl      $16352, %eax
+        xorpd     %xmm0, %xmm0
+        cmpl      $161, %ecx
+        jae       .L_2TAG_PACKET_1.0.2
+        pshufd    $68, %xmm5, %xmm5
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        psubw     %xmm0, %xmm5
+        mulpd     (%ebx,%edx,8), %xmm0
+        mulpd     2048(%ebx,%edx,8), %xmm5
+        pshufd    $68, %xmm2, %xmm3
+        movapd    4160(%ebx), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        mulpd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulpd     4176(%ebx), %xmm2
+        mulpd     %xmm3, %xmm1
+        mulpd     %xmm3, %xmm7
+        mulpd     %xmm3, %xmm4
+        mulpd     %xmm3, %xmm1
+        addpd     %xmm7, %xmm6
+        movapd    %xmm0, %xmm7
+        addpd     %xmm1, %xmm4
+        shufpd    $0, %xmm5, %xmm7
+        subpd     %xmm5, %xmm0
+        mulpd     %xmm7, %xmm2
+        addpd     %xmm6, %xmm4
+        subsd     %xmm0, %xmm7
+        mulpd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        subsd     %xmm5, %xmm7
+        addpd     %xmm2, %xmm4
+        addsd     %xmm6, %xmm7
+        pshufd    $238, %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_1.0.2:
+        subl      $16352, %eax
+        movl      %eax, %ecx
+        andl      $32752, %eax
+        shrl      $1, %eax
+        andl      $65520, %eax
+        subl      %eax, %ecx
+        addl      $16352, %eax
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        mulpd     (%ebx,%edx,8), %xmm0
+        pshufd    $68, %xmm2, %xmm3
+        movsd     4160(%ebx), %xmm7
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     4176(%ebx), %xmm2
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm3, %xmm4
+        addl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm5
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm6, %xmm4
+        mulsd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm6, %xmm4
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm5, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        movl      $127, %edx
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_3.0.2
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_0.0.2:
+        addl      $16343, %ecx
+        cmpl      $16343, %ecx
+        ja        .L_2TAG_PACKET_4.0.2
+        cmpl      $15856, %ecx
+        jb        .L_2TAG_PACKET_5.0.2
+        movapd    4208(%ebx), %xmm1
+        pshufd    $68, %xmm0, %xmm6
+        mulpd     %xmm5, %xmm5
+        movapd    4224(%ebx), %xmm2
+        pshufd    $68, %xmm0, %xmm7
+        movapd    4240(%ebx), %xmm3
+        pshufd    $68, %xmm0, %xmm4
+        andpd     4256(%ebx), %xmm6
+        mulpd     %xmm5, %xmm1
+        mulsd     %xmm5, %xmm2
+        subpd     %xmm6, %xmm4
+        mulpd     %xmm5, %xmm7
+        addpd     %xmm3, %xmm1
+        pshufd    $68, %xmm6, %xmm3
+        mulpd     %xmm5, %xmm5
+        mulsd     %xmm7, %xmm2
+        mulpd     %xmm7, %xmm1
+        pshufd    $68, %xmm0, %xmm7
+        mulsd     %xmm6, %xmm6
+        addsd     %xmm7, %xmm7
+        mulsd     %xmm4, %xmm4
+        mulpd     %xmm5, %xmm1
+        addsd     %xmm0, %xmm7
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm3, %xmm7
+        pshufd    $238, %xmm1, %xmm3
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm2, %xmm3
+        pshufd    $238, %xmm2, %xmm2
+        addsd     %xmm4, %xmm7
+        movapd    %xmm0, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm5, %xmm7
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm2, %xmm7
+        subsd     %xmm0, %xmm4
+        addsd     %xmm7, %xmm1
+        addsd     %xmm4, %xmm6
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_5.0.2:
+        cmpl      $16, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        movapd    %xmm0, %xmm1
+        mulsd     %xmm1, %xmm1
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm2, %xmm2
+        movl      $17392, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        xorpd     %xmm3, %xmm3
+        movl      $15344, %edx
+        pinsrw    $3, %edx, %xmm3
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm3, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_4.0.2:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_7.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        orl       %edx, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        movl      $127, %edx
+.L_2TAG_PACKET_3.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     112(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm1
+        andnpd    %xmm0, %xmm1
+        mulsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_2.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_8.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(sinh)
+# -- End  sinh
+
+# Start file scope ASM
+ALIAS_SYMBOL(sinhl, sinh);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	3706687593
+	.long	1073526560
+	.long	3521726940
+	.long	1014301643
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.long	3607404736
+	.long	1044146952
+	.long	3607404736
+	.long	3191630600
+	.long	4277811695
+	.long	1063661122
+	.long	4277811695
+	.long	3211144770
+	.long	2140175755
+	.long	1033864261
+	.long	2140175755
+	.long	1033864261
+	.long	4289495988
+	.long	1054113747
+	.long	4289495988
+	.long	1054113747
+	.long	4277811695
+	.long	1064709698
+	.long	4277811695
+	.long	1064709698
+	.long	1610612736
+	.long	1080497479
+	.long	4166901572
+	.long	1053077003
+	.long	329805064
+	.long	1038488134
+	.long	2773927730
+	.long	1053236707
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1069897045
+	.long	1744127201
+	.long	1046144581
+	.long	436314137
+	.long	1059717536
+	.long	0
+	.long	4294967280
+	.long	0
+	.long	4294967280
+	.long	4160749568
+	.long	2147483647
+	.type	static_const_table,@object
+	.size	static_const_table,4280
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/floor.S b/libm/x86/floor.S
new file mode 100644
index 0000000..b859736
--- /dev/null
+++ b/libm/x86/floor.S
@@ -0,0 +1,43 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(floor)
+	mov    %esp,%eax
+	and    $0xfffffff8,%eax
+	movsd  0x4(%esp),%xmm0
+	roundsd $0x1,%xmm0,%xmm0
+	movlpd %xmm0,-0x8(%eax)
+	fldl   -0x8(%eax)
+	ret
+END(floor)
+
+ALIAS_SYMBOL(floorl, floor);
diff --git a/libm/x86/floorf.S b/libm/x86/floorf.S
new file mode 100644
index 0000000..79b9073
--- /dev/null
+++ b/libm/x86/floorf.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(floorf)
+	movss  0x4(%esp),%xmm0
+	roundss $0x1,%xmm0,%xmm0
+	movss  %xmm0,-0x4(%esp)
+	flds   -0x4(%esp)
+	ret
+END(floorf)
diff --git a/libm/x86/libm_reduce_pi04l.S b/libm/x86/libm_reduce_pi04l.S
new file mode 100644
index 0000000..af6a7d0
--- /dev/null
+++ b/libm/x86/libm_reduce_pi04l.S
@@ -0,0 +1,3718 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+# -- Begin  __libm_reduce_pi04l
+	.text
+       .align    16,0x90
+	.hidden __libm_reduce_pi04l
+	.globl __libm_reduce_pi04l
+__libm_reduce_pi04l:
+# parameter 1: 8 + %ebp
+# parameter 2: 20 + %ebp
+# parameter 3: 24 + %ebp
+..B1.1:
+        pushl     %ebp
+        movl      %esp, %ebp
+        andl      $-16, %esp
+        pushl     %esi
+        pushl     %edi
+        pushl     %ebx
+        subl      $20, %esp
+        movzwl    16(%ebp), %ebx
+        andl      $32767, %ebx
+        movl      20(%ebp), %eax
+        cmpl      $16413, %ebx
+        movl      24(%ebp), %esi
+        call      ..L2
+..L2:
+        popl      %edi
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%edi), %edi
+        movl      %eax, 4(%esp)
+        jge       ..B1.8
+..B1.2:
+        fldt      8(%ebp)
+        fldl      __4onpi_d@GOTOFF(%edi)
+        fmul      %st(1), %st
+        fstpt     8(%esp)
+        movzwl    16(%esp), %ecx
+        negl      %ecx
+        addl      $30, %ecx
+        movl      12(%esp), %eax
+        shrl      %cl, %eax
+        cmpl      $0, 4(%esp)
+        jne       ..B1.4
+..B1.3:
+        lea       1(%eax), %ecx
+        andl      $-2, %ecx
+        jmp       ..B1.5
+..B1.4:
+        movl      %eax, %ecx
+        addl      4(%esp), %eax
+        movl      %eax, %edx
+        andl      $1, %edx
+        addl      %edx, %ecx
+..B1.5:
+        fldl      _TWO_32H@GOTOFF(%edi)
+        cmpl      $16400, %ebx
+        movl      %ecx, (%esp)
+        fildl     (%esp)
+        jge       ..B1.7
+..B1.6:
+        fldl      _pi04_3d@GOTOFF(%edi)
+        fmul      %st(1), %st
+        fsubrp    %st, %st(3)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fld       %st(2)
+        fadd      %st(1), %st
+        fsubp     %st, %st(1)
+        fld       %st(0)
+        fxch      %st(1)
+        fsubr     %st, %st(3)
+        fldl      8+_pi04_3d@GOTOFF(%edi)
+        fmul      %st(3), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        fsub      %st(2), %st
+        fsubp     %st, %st(1)
+        faddp     %st, %st(3)
+        fldl      16+_pi04_3d@GOTOFF(%edi)
+        fmulp     %st, %st(2)
+        fld       %st(1)
+        fsubr     %st(1), %st
+        fsubr     %st, %st(1)
+        fxch      %st(2)
+        fsubrp    %st, %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        jmp       ..B1.15
+..B1.7:
+        fldl      _pi04_5d@GOTOFF(%edi)
+        fmul      %st(1), %st
+        fsubrp    %st, %st(3)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fld       %st(2)
+        fadd      %st(1), %st
+        fsubp     %st, %st(1)
+        fld       %st(0)
+        fxch      %st(1)
+        fsubr     %st, %st(3)
+        fldl      8+_pi04_5d@GOTOFF(%edi)
+        fmul      %st(3), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        fsub      %st(2), %st
+        fsubp     %st, %st(1)
+        faddp     %st, %st(3)
+        fldl      16+_pi04_5d@GOTOFF(%edi)
+        fmul      %st(2), %st
+        fld       %st(0)
+        fsubr     %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        fsubrp    %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(3)
+        fldl      24+_pi04_5d@GOTOFF(%edi)
+        fmul      %st(2), %st
+        fld       %st(0)
+        fsubr     %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        fsubrp    %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(3)
+        fldl      32+_pi04_5d@GOTOFF(%edi)
+        fmulp     %st, %st(2)
+        fld       %st(1)
+        fsubr     %st(1), %st
+        fsubr     %st, %st(1)
+        fxch      %st(2)
+        fsubrp    %st, %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        jmp       ..B1.15
+..B1.8:
+        fldt      8(%ebp)
+        addl      $-16417, %ebx
+        fmull     _SCALE@GOTOFF(%edi)
+        movl      $-2078209981, %eax
+        imull     %ebx
+        addl      %ebx, %edx
+        movl      %ebx, %ecx
+        sarl      $4, %edx
+        sarl      $31, %ecx
+        subl      %ecx, %edx
+        movl      %edx, %eax
+        shll      $5, %eax
+        fstpt     8(%ebp)
+        fldt      8(%ebp)
+        subl      %edx, %eax
+        movl      $0, 8(%ebp)
+        subl      %eax, %ebx
+        fldt      8(%ebp)
+        cmpl      $17, %ebx
+        fsubr     %st, %st(1)
+        jl        ..B1.10
+..B1.9:
+        lea       (,%edx,8), %eax
+        lea       (%eax,%edx,4), %ecx
+        incl      %edx
+        fldt      __4onpi_31l@GOTOFF(%ecx,%edi)
+        fmul      %st(2), %st
+        fldt      12+__4onpi_31l@GOTOFF(%edi,%ecx)
+        fmul      %st(2), %st
+        fld       %st(0)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fld       %st(1)
+        fadd      %st(1), %st
+        fstpt     8(%esp)
+        andl      $-16777216, 8(%esp)
+        fldt      8(%esp)
+        fsubrp    %st, %st(1)
+        jmp       ..B1.11
+..B1.10:
+        fldl      _zeros@GOTOFF(%edi)
+        fld       %st(0)
+..B1.11:
+        fld       %st(0)
+        lea       (,%edx,8), %eax
+        fld       %st(3)
+        lea       (%eax,%edx,4), %edx
+        fldt      __4onpi_31l@GOTOFF(%edx,%edi)
+        fmul      %st(6), %st
+        movl      %edx, (%esp)
+        fadd      %st, %st(2)
+        fxch      %st(2)
+        fsubr     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fldt      12+__4onpi_31l@GOTOFF(%edx,%edi)
+        fmul      %st, %st(2)
+        fld       %st(2)
+        fadd      %st(2), %st
+        fld       %st(0)
+        fxch      %st(1)
+        fsub      %st, %st(3)
+        fxch      %st(3)
+        fchs      
+        faddp     %st, %st(4)
+        fxch      %st(3)
+        faddp     %st, %st(4)
+        fxch      %st(2)
+        fadd      %st(3), %st
+        fxch      %st(2)
+        fmul      %st(5), %st
+        fadd      %st, %st(2)
+        fld       %st(4)
+        fldt      24+__4onpi_31l@GOTOFF(%edx,%edi)
+        fmul      %st, %st(1)
+        fxch      %st(1)
+        fadd      %st, %st(4)
+        fxch      %st(4)
+        fstpt     8(%esp)
+        movzwl    16(%esp), %ebx
+        andl      $32767, %ebx
+        cmpl      $16415, %ebx
+        jge       ..B1.13
+..B1.12:
+        negl      %ebx
+        addl      $30, %ebx
+        movl      %ebx, %ecx
+        movl      12(%esp), %eax
+        shrl      %cl, %eax
+        shll      %cl, %eax
+        movl      %eax, 12(%esp)
+        movl      $0, 8(%esp)
+        shrl      %cl, %eax
+        jmp       ..B1.14
+..B1.13:
+        negl      %ebx
+        addl      $30, %ebx
+        movl      %ebx, %ecx
+        movl      8(%esp), %edx
+        shrl      %cl, %edx
+        shll      %cl, %edx
+        negl      %ecx
+        movl      12(%esp), %eax
+        shll      %cl, %eax
+        movl      %ebx, %ecx
+        movl      %edx, 8(%esp)
+        shrl      %cl, %edx
+        orl       %edx, %eax
+..B1.14:
+        fldt      8(%esp)
+        addl      4(%esp), %eax
+        fsubrp    %st, %st(3)
+        fmul      %st(6), %st
+        fld       %st(4)
+        movl      %eax, %edx
+        andl      $1, %edx
+        fadd      %st(3), %st
+        movl      (%esp), %ecx
+        fsubr     %st, %st(3)
+        fxch      %st(3)
+        faddp     %st, %st(5)
+        fld       %st(1)
+        fxch      %st(3)
+        faddl     zero_none@GOTOFF(%edi,%edx,8)
+        fadd      %st, %st(3)
+        fsub      %st(3), %st
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(4)
+        fld       %st(2)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(3)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(3)
+        fld       %st(0)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fld       %st(2)
+        fldt      36+__4onpi_31l@GOTOFF(%ecx,%edi)
+        fmul      %st, %st(1)
+        fld       %st(1)
+        fadd      %st(3), %st
+        fsubr     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fld       %st(0)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fld       %st(2)
+        fldt      48+__4onpi_31l@GOTOFF(%ecx,%edi)
+        fmul      %st, %st(1)
+        fld       %st(1)
+        fadd      %st(3), %st
+        fsubr     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fld       %st(3)
+        fxch      %st(2)
+        fmul      %st(5), %st
+        fldt      60+__4onpi_31l@GOTOFF(%ecx,%edi)
+        fmul      %st, %st(3)
+        fxch      %st(3)
+        faddp     %st, %st(1)
+        fld       %st(0)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(3)
+        fld       %st(3)
+        fxch      %st(2)
+        fmul      %st(5), %st
+        fldt      72+__4onpi_31l@GOTOFF(%ecx,%edi)
+        fmul      %st, %st(3)
+        fxch      %st(3)
+        faddp     %st, %st(1)
+        fld       %st(0)
+        fadd      %st(2), %st
+        fsubr     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        faddp     %st, %st(3)
+        fxch      %st(1)
+        fmulp     %st, %st(4)
+        fldt      84+__4onpi_31l@GOTOFF(%edi,%ecx)
+        fmulp     %st, %st(3)
+        fxch      %st(2)
+        faddp     %st, %st(3)
+        fld       %st(2)
+        fadd      %st(2), %st
+        fldl      _TWO_32H@GOTOFF(%edi)
+        fmul      %st(1), %st
+        fadd      %st, %st(1)
+        fsubrp    %st, %st(1)
+        fsubr     %st, %st(2)
+        fxch      %st(3)
+        faddp     %st, %st(2)
+        faddp     %st, %st(1)
+        fldl      _pi04_2d@GOTOFF(%edi)
+        fld       %st(0)
+        fmul      %st(2), %st
+        fxch      %st(2)
+        fadd      %st(3), %st
+        fxch      %st(1)
+        fmulp     %st, %st(3)
+        fmull     8+_pi04_2d@GOTOFF(%edi)
+        faddp     %st, %st(1)
+..B1.15:
+        fldl      _TWO_12H@GOTOFF(%edi)
+        fld       %st(2)
+        fadd      %st(2), %st
+        fmul      %st, %st(1)
+        fstpt     8(%esp)
+        fldt      8(%esp)
+        fadd      %st(1), %st
+        fsubp     %st, %st(1)
+        fstl      (%esi)
+        fsubrp    %st, %st(2)
+        faddp     %st, %st(1)
+        fstpl     8(%esi)
+        addl      $20, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+        .align    16,0x90
+	.type	__libm_reduce_pi04l,@function
+	.size	__libm_reduce_pi04l,.-__libm_reduce_pi04l
+	.data
+# -- End  __libm_reduce_pi04l
+	.section .rodata, "a"
+	.align 8
+	.align 8
+zero_none:
+	.long	0x00000000,0x00000000
+	.long	0x00000000,0xbff00000
+	.type	zero_none,@object
+	.size	zero_none,16
+	.align 4
+__4onpi_d:
+	.long	1841940611
+	.long	1072979760
+	.type	__4onpi_d,@object
+	.size	__4onpi_d,8
+	.align 4
+_TWO_32H:
+	.long	0
+	.long	1106771968
+	.type	_TWO_32H,@object
+	.size	_TWO_32H,8
+	.align 4
+_pi04_3d:
+	.long	1413754112
+	.long	1072243195
+	.long	2563527040
+	.long	1021855384
+	.long	3417685868
+	.long	3118450936
+	.type	_pi04_3d,@object
+	.size	_pi04_3d,24
+	.align 4
+_pi04_5d:
+	.long	1413480448
+	.long	1072243195
+	.long	442499072
+	.long	1036039265
+	.long	771751936
+	.long	999496074
+	.long	622854144
+	.long	963347354
+	.long	1396597664
+	.long	922906692
+	.type	_pi04_5d,@object
+	.size	_pi04_5d,40
+	.align 4
+_SCALE:
+	.long	0
+	.long	845152256
+	.type	_SCALE,@object
+	.size	_SCALE,8
+	.align 4
+_zeros:
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.type	_zeros,@object
+	.size	_zeros,16
+	.align 4
+_pi04_2d:
+	.long	1413480448
+	.long	1072243195
+	.long	442655537
+	.long	1036039265
+	.type	_pi04_2d,@object
+	.size	_pi04_2d,16
+	.align 4
+_TWO_12H:
+	.long	0
+	.long	1085800448
+	.type	_TWO_12H,@object
+	.size	_TWO_12H,8
+	.align 2
+__4onpi_31l:
+	.word	0
+	.word	0
+	.word	0
+	.word	0
+	.word	0
+	.word	0
+	.word	0
+	.word	0
+	.word	33646
+	.word	41721
+	.word	16600
+	.word	0
+	.word	0
+	.word	0
+	.word	10832
+	.word	40072
+	.word	16567
+	.word	0
+	.word	0
+	.word	0
+	.word	44008
+	.word	65043
+	.word	16537
+	.word	0
+	.word	0
+	.word	0
+	.word	28384
+	.word	64154
+	.word	16505
+	.word	0
+	.word	0
+	.word	0
+	.word	38272
+	.word	56162
+	.word	16472
+	.word	0
+	.word	0
+	.word	0
+	.word	7298
+	.word	51682
+	.word	16445
+	.word	0
+	.word	0
+	.word	0
+	.word	45504
+	.word	65320
+	.word	16409
+	.word	0
+	.word	0
+	.word	0
+	.word	61204
+	.word	44922
+	.word	16382
+	.word	0
+	.word	0
+	.word	0
+	.word	18652
+	.word	50030
+	.word	16351
+	.word	0
+	.word	0
+	.word	0
+	.word	14144
+	.word	59657
+	.word	16318
+	.word	0
+	.word	0
+	.word	0
+	.word	37450
+	.word	47105
+	.word	16290
+	.word	0
+	.word	0
+	.word	0
+	.word	14898
+	.word	56641
+	.word	16259
+	.word	0
+	.word	0
+	.word	0
+	.word	34680
+	.word	34623
+	.word	16226
+	.word	0
+	.word	0
+	.word	0
+	.word	4760
+	.word	45515
+	.word	16196
+	.word	0
+	.word	0
+	.word	0
+	.word	41480
+	.word	40187
+	.word	16166
+	.word	0
+	.word	0
+	.word	0
+	.word	47852
+	.word	55252
+	.word	16134
+	.word	0
+	.word	0
+	.word	0
+	.word	54072
+	.word	35081
+	.word	16103
+	.word	0
+	.word	0
+	.word	0
+	.word	26808
+	.word	57421
+	.word	16071
+	.word	0
+	.word	0
+	.word	0
+	.word	20068
+	.word	57232
+	.word	16042
+	.word	0
+	.word	0
+	.word	0
+	.word	49576
+	.word	60188
+	.word	16009
+	.word	0
+	.word	0
+	.word	0
+	.word	10016
+	.word	52861
+	.word	15978
+	.word	0
+	.word	0
+	.word	0
+	.word	30648
+	.word	35825
+	.word	15947
+	.word	0
+	.word	0
+	.word	0
+	.word	60542
+	.word	58528
+	.word	15918
+	.word	0
+	.word	0
+	.word	0
+	.word	65468
+	.word	61743
+	.word	15887
+	.word	0
+	.word	0
+	.word	0
+	.word	64960
+	.word	45825
+	.word	15851
+	.word	0
+	.word	0
+	.word	0
+	.word	50604
+	.word	38792
+	.word	15825
+	.word	0
+	.word	0
+	.word	0
+	.word	18394
+	.word	33435
+	.word	15794
+	.word	0
+	.word	0
+	.word	0
+	.word	55780
+	.word	42703
+	.word	15763
+	.word	0
+	.word	0
+	.word	0
+	.word	14056
+	.word	63841
+	.word	15731
+	.word	0
+	.word	0
+	.word	0
+	.word	63080
+	.word	62563
+	.word	15700
+	.word	0
+	.word	0
+	.word	0
+	.word	20840
+	.word	62207
+	.word	15669
+	.word	0
+	.word	0
+	.word	0
+	.word	30094
+	.word	59983
+	.word	15639
+	.word	0
+	.word	0
+	.word	0
+	.word	61818
+	.word	60389
+	.word	15608
+	.word	0
+	.word	0
+	.word	0
+	.word	40186
+	.word	40579
+	.word	15577
+	.word	0
+	.word	0
+	.word	0
+	.word	42170
+	.word	58004
+	.word	15546
+	.word	0
+	.word	0
+	.word	0
+	.word	55276
+	.word	39678
+	.word	15514
+	.word	0
+	.word	0
+	.word	0
+	.word	44672
+	.word	36806
+	.word	15481
+	.word	0
+	.word	0
+	.word	0
+	.word	13060
+	.word	34144
+	.word	15452
+	.word	0
+	.word	0
+	.word	0
+	.word	28016
+	.word	57231
+	.word	15419
+	.word	0
+	.word	0
+	.word	0
+	.word	16112
+	.word	44995
+	.word	15390
+	.word	0
+	.word	0
+	.word	0
+	.word	53464
+	.word	33387
+	.word	15358
+	.word	0
+	.word	0
+	.word	0
+	.word	7296
+	.word	60751
+	.word	15325
+	.word	0
+	.word	0
+	.word	0
+	.word	29452
+	.word	45231
+	.word	15297
+	.word	0
+	.word	0
+	.word	0
+	.word	26208
+	.word	49689
+	.word	15266
+	.word	0
+	.word	0
+	.word	0
+	.word	37900
+	.word	44002
+	.word	15235
+	.word	0
+	.word	0
+	.word	0
+	.word	57340
+	.word	33800
+	.word	15204
+	.word	0
+	.word	0
+	.word	0
+	.word	27544
+	.word	50178
+	.word	15173
+	.word	0
+	.word	0
+	.word	0
+	.word	6168
+	.word	40132
+	.word	15142
+	.word	0
+	.word	0
+	.word	0
+	.word	21392
+	.word	43702
+	.word	15109
+	.word	0
+	.word	0
+	.word	0
+	.word	45168
+	.word	54372
+	.word	15081
+	.word	0
+	.word	0
+	.word	0
+	.word	8986
+	.word	40688
+	.word	15050
+	.word	0
+	.word	0
+	.word	0
+	.word	1648
+	.word	53745
+	.word	15018
+	.word	0
+	.word	0
+	.word	0
+	.word	30520
+	.word	55795
+	.word	14986
+	.word	0
+	.word	0
+	.word	0
+	.word	43060
+	.word	32914
+	.word	14956
+	.word	0
+	.word	0
+	.word	0
+	.word	46172
+	.word	52771
+	.word	14925
+	.word	0
+	.word	0
+	.word	0
+	.word	14056
+	.word	45285
+	.word	14893
+	.word	0
+	.word	0
+	.word	0
+	.word	53590
+	.word	44868
+	.word	14864
+	.word	0
+	.word	0
+	.word	0
+	.word	40786
+	.word	35970
+	.word	14833
+	.word	0
+	.word	0
+	.word	0
+	.word	33436
+	.word	65411
+	.word	14801
+	.word	0
+	.word	0
+	.word	0
+	.word	32006
+	.word	61382
+	.word	14771
+	.word	0
+	.word	0
+	.word	0
+	.word	37856
+	.word	45239
+	.word	14738
+	.word	0
+	.word	0
+	.word	0
+	.word	60894
+	.word	49555
+	.word	14709
+	.word	0
+	.word	0
+	.word	0
+	.word	48064
+	.word	53065
+	.word	14674
+	.word	0
+	.word	0
+	.word	0
+	.word	48624
+	.word	54844
+	.word	14647
+	.word	0
+	.word	0
+	.word	0
+	.word	7988
+	.word	40762
+	.word	14616
+	.word	0
+	.word	0
+	.word	0
+	.word	16270
+	.word	58745
+	.word	14585
+	.word	0
+	.word	0
+	.word	0
+	.word	37064
+	.word	50168
+	.word	14553
+	.word	0
+	.word	0
+	.word	0
+	.word	18624
+	.word	63736
+	.word	14519
+	.word	0
+	.word	0
+	.word	0
+	.word	60758
+	.word	44966
+	.word	14492
+	.word	0
+	.word	0
+	.word	0
+	.word	33304
+	.word	47465
+	.word	14461
+	.word	0
+	.word	0
+	.word	0
+	.word	6226
+	.word	60503
+	.word	14430
+	.word	0
+	.word	0
+	.word	0
+	.word	26380
+	.word	54900
+	.word	14398
+	.word	0
+	.word	0
+	.word	0
+	.word	44352
+	.word	49860
+	.word	14368
+	.word	0
+	.word	0
+	.word	0
+	.word	11904
+	.word	42646
+	.word	14337
+	.word	0
+	.word	0
+	.word	0
+	.word	55296
+	.word	50279
+	.word	14300
+	.word	0
+	.word	0
+	.word	0
+	.word	15474
+	.word	50606
+	.word	14275
+	.word	0
+	.word	0
+	.word	0
+	.word	45062
+	.word	44137
+	.word	14244
+	.word	0
+	.word	0
+	.word	0
+	.word	13472
+	.word	36063
+	.word	14210
+	.word	0
+	.word	0
+	.word	0
+	.word	40658
+	.word	53854
+	.word	14182
+	.word	0
+	.word	0
+	.word	0
+	.word	28652
+	.word	43690
+	.word	14151
+	.word	0
+	.word	0
+	.word	0
+	.word	24640
+	.word	64348
+	.word	14118
+	.word	0
+	.word	0
+	.word	0
+	.word	30284
+	.word	41980
+	.word	14088
+	.word	0
+	.word	0
+	.word	0
+	.word	45652
+	.word	38222
+	.word	14057
+	.word	0
+	.word	0
+	.word	0
+	.word	15900
+	.word	62940
+	.word	14026
+	.word	0
+	.word	0
+	.word	0
+	.word	31494
+	.word	50741
+	.word	13996
+	.word	0
+	.word	0
+	.word	0
+	.word	43194
+	.word	55096
+	.word	13965
+	.word	0
+	.word	0
+	.word	0
+	.word	1740
+	.word	45646
+	.word	13933
+	.word	0
+	.word	0
+	.word	0
+	.word	28936
+	.word	44150
+	.word	13903
+	.word	0
+	.word	0
+	.word	0
+	.word	8996
+	.word	42955
+	.word	13872
+	.word	0
+	.word	0
+	.word	0
+	.word	44096
+	.word	61205
+	.word	13839
+	.word	0
+	.word	0
+	.word	0
+	.word	44614
+	.word	54550
+	.word	13810
+	.word	0
+	.word	0
+	.word	0
+	.word	24926
+	.word	57347
+	.word	13779
+	.word	0
+	.word	0
+	.word	0
+	.word	3312
+	.word	61415
+	.word	13745
+	.word	0
+	.word	0
+	.word	0
+	.word	64336
+	.word	63884
+	.word	13717
+	.word	0
+	.word	0
+	.word	0
+	.word	2748
+	.word	62259
+	.word	13685
+	.word	0
+	.word	0
+	.word	0
+	.word	56672
+	.word	51775
+	.word	13653
+	.word	0
+	.word	0
+	.word	0
+	.word	32438
+	.word	55423
+	.word	13624
+	.word	0
+	.word	0
+	.word	0
+	.word	17652
+	.word	45713
+	.word	13593
+	.word	0
+	.word	0
+	.word	0
+	.word	65408
+	.word	51586
+	.word	13558
+	.word	0
+	.word	0
+	.word	0
+	.word	40416
+	.word	55736
+	.word	13531
+	.word	0
+	.word	0
+	.word	0
+	.word	52546
+	.word	37734
+	.word	13500
+	.word	0
+	.word	0
+	.word	0
+	.word	48880
+	.word	64238
+	.word	13469
+	.word	0
+	.word	0
+	.word	0
+	.word	56004
+	.word	46833
+	.word	13437
+	.word	0
+	.word	0
+	.word	0
+	.word	61760
+	.word	38110
+	.word	13405
+	.word	0
+	.word	0
+	.word	0
+	.word	41496
+	.word	35659
+	.word	13374
+	.word	0
+	.word	0
+	.word	0
+	.word	25472
+	.word	41269
+	.word	13342
+	.word	0
+	.word	0
+	.word	0
+	.word	45444
+	.word	36018
+	.word	13314
+	.word	0
+	.word	0
+	.word	0
+	.word	6510
+	.word	56417
+	.word	13283
+	.word	0
+	.word	0
+	.word	0
+	.word	3072
+	.word	56837
+	.word	13252
+	.word	0
+	.word	0
+	.word	0
+	.word	61338
+	.word	48440
+	.word	13221
+	.word	0
+	.word	0
+	.word	0
+	.word	49568
+	.word	57088
+	.word	13189
+	.word	0
+	.word	0
+	.word	0
+	.word	4240
+	.word	39283
+	.word	13157
+	.word	0
+	.word	0
+	.word	0
+	.word	18562
+	.word	33537
+	.word	13128
+	.word	0
+	.word	0
+	.word	0
+	.word	31422
+	.word	44487
+	.word	13097
+	.word	0
+	.word	0
+	.word	0
+	.word	31930
+	.word	60459
+	.word	13066
+	.word	0
+	.word	0
+	.word	0
+	.word	42272
+	.word	36641
+	.word	13033
+	.word	0
+	.word	0
+	.word	0
+	.word	28940
+	.word	36150
+	.word	13004
+	.word	0
+	.word	0
+	.word	0
+	.word	21010
+	.word	50925
+	.word	12973
+	.word	0
+	.word	0
+	.word	0
+	.word	29448
+	.word	64886
+	.word	12941
+	.word	0
+	.word	0
+	.word	0
+	.word	20500
+	.word	54600
+	.word	12911
+	.word	0
+	.word	0
+	.word	0
+	.word	54258
+	.word	46233
+	.word	12880
+	.word	0
+	.word	0
+	.word	0
+	.word	32628
+	.word	42502
+	.word	12848
+	.word	0
+	.word	0
+	.word	0
+	.word	61608
+	.word	55072
+	.word	12818
+	.word	0
+	.word	0
+	.word	0
+	.word	6236
+	.word	57871
+	.word	12786
+	.word	0
+	.word	0
+	.word	0
+	.word	42408
+	.word	34616
+	.word	12756
+	.word	0
+	.word	0
+	.word	0
+	.word	56692
+	.word	51963
+	.word	12724
+	.word	0
+	.word	0
+	.word	0
+	.word	39094
+	.word	48526
+	.word	12694
+	.word	0
+	.word	0
+	.word	0
+	.word	59870
+	.word	38783
+	.word	12663
+	.word	0
+	.word	0
+	.word	0
+	.word	26560
+	.word	33165
+	.word	12632
+	.word	0
+	.word	0
+	.word	0
+	.word	58666
+	.word	37666
+	.word	12601
+	.word	0
+	.word	0
+	.word	0
+	.word	58728
+	.word	39788
+	.word	12569
+	.word	0
+	.word	0
+	.word	0
+	.word	9048
+	.word	43530
+	.word	12538
+	.word	0
+	.word	0
+	.word	0
+	.word	58496
+	.word	57659
+	.word	12505
+	.word	0
+	.word	0
+	.word	0
+	.word	12324
+	.word	37025
+	.word	12477
+	.word	0
+	.word	0
+	.word	0
+	.word	38432
+	.word	55856
+	.word	12445
+	.word	0
+	.word	0
+	.word	0
+	.word	35210
+	.word	45960
+	.word	12415
+	.word	0
+	.word	0
+	.word	0
+	.word	45644
+	.word	51345
+	.word	12384
+	.word	0
+	.word	0
+	.word	0
+	.word	32854
+	.word	63883
+	.word	12353
+	.word	0
+	.word	0
+	.word	0
+	.word	29348
+	.word	41450
+	.word	12321
+	.word	0
+	.word	0
+	.word	0
+	.word	27384
+	.word	38024
+	.word	12289
+	.word	0
+	.word	0
+	.word	0
+	.word	57356
+	.word	57291
+	.word	12260
+	.word	0
+	.word	0
+	.word	0
+	.word	61164
+	.word	51521
+	.word	12228
+	.word	0
+	.word	0
+	.word	0
+	.word	21472
+	.word	59151
+	.word	12196
+	.word	0
+	.word	0
+	.word	0
+	.word	36704
+	.word	39943
+	.word	12165
+	.word	0
+	.word	0
+	.word	0
+	.word	45864
+	.word	50151
+	.word	12136
+	.word	0
+	.word	0
+	.word	0
+	.word	37892
+	.word	63687
+	.word	12104
+	.word	0
+	.word	0
+	.word	0
+	.word	14560
+	.word	51615
+	.word	12073
+	.word	0
+	.word	0
+	.word	0
+	.word	38776
+	.word	55684
+	.word	12041
+	.word	0
+	.word	0
+	.word	0
+	.word	59136
+	.word	53570
+	.word	12010
+	.word	0
+	.word	0
+	.word	0
+	.word	55556
+	.word	37955
+	.word	11981
+	.word	0
+	.word	0
+	.word	0
+	.word	54458
+	.word	44670
+	.word	11950
+	.word	0
+	.word	0
+	.word	0
+	.word	36446
+	.word	34084
+	.word	11919
+	.word	0
+	.word	0
+	.word	0
+	.word	46416
+	.word	51693
+	.word	11886
+	.word	0
+	.word	0
+	.word	0
+	.word	21432
+	.word	34376
+	.word	11857
+	.word	0
+	.word	0
+	.word	0
+	.word	56036
+	.word	34809
+	.word	11826
+	.word	0
+	.word	0
+	.word	0
+	.word	10562
+	.word	55654
+	.word	11795
+	.word	0
+	.word	0
+	.word	0
+	.word	20264
+	.word	53052
+	.word	11763
+	.word	0
+	.word	0
+	.word	0
+	.word	64064
+	.word	50415
+	.word	11729
+	.word	0
+	.word	0
+	.word	0
+	.word	17444
+	.word	48295
+	.word	11701
+	.word	0
+	.word	0
+	.word	0
+	.word	11874
+	.word	52677
+	.word	11671
+	.word	0
+	.word	0
+	.word	0
+	.word	60808
+	.word	39275
+	.word	11640
+	.word	0
+	.word	0
+	.word	0
+	.word	31792
+	.word	55677
+	.word	11606
+	.word	0
+	.word	0
+	.word	0
+	.word	60710
+	.word	49006
+	.word	11578
+	.word	0
+	.word	0
+	.word	0
+	.word	10520
+	.word	37403
+	.word	11546
+	.word	0
+	.word	0
+	.word	0
+	.word	20004
+	.word	59470
+	.word	11515
+	.word	0
+	.word	0
+	.word	0
+	.word	28096
+	.word	37612
+	.word	11485
+	.word	0
+	.word	0
+	.word	0
+	.word	20268
+	.word	44280
+	.word	11453
+	.word	0
+	.word	0
+	.word	0
+	.word	50740
+	.word	61588
+	.word	11422
+	.word	0
+	.word	0
+	.word	0
+	.word	56432
+	.word	58835
+	.word	11390
+	.word	0
+	.word	0
+	.word	0
+	.word	8576
+	.word	42496
+	.word	11355
+	.word	0
+	.word	0
+	.word	0
+	.word	33920
+	.word	54912
+	.word	11324
+	.word	0
+	.word	0
+	.word	0
+	.word	35620
+	.word	54843
+	.word	11298
+	.word	0
+	.word	0
+	.word	0
+	.word	736
+	.word	43591
+	.word	11264
+	.word	0
+	.word	0
+	.word	0
+	.word	39632
+	.word	61060
+	.word	11235
+	.word	0
+	.word	0
+	.word	0
+	.word	63452
+	.word	63129
+	.word	11206
+	.word	0
+	.word	0
+	.word	0
+	.word	56798
+	.word	58512
+	.word	11175
+	.word	0
+	.word	0
+	.word	0
+	.word	13472
+	.word	46333
+	.word	11141
+	.word	0
+	.word	0
+	.word	0
+	.word	37300
+	.word	36598
+	.word	11112
+	.word	0
+	.word	0
+	.word	0
+	.word	41952
+	.word	41639
+	.word	11079
+	.word	0
+	.word	0
+	.word	0
+	.word	52452
+	.word	33459
+	.word	11050
+	.word	0
+	.word	0
+	.word	0
+	.word	58558
+	.word	33287
+	.word	11020
+	.word	0
+	.word	0
+	.word	0
+	.word	7570
+	.word	43843
+	.word	10989
+	.word	0
+	.word	0
+	.word	0
+	.word	59416
+	.word	63990
+	.word	10957
+	.word	0
+	.word	0
+	.word	0
+	.word	65298
+	.word	47744
+	.word	10927
+	.word	0
+	.word	0
+	.word	0
+	.word	21076
+	.word	34089
+	.word	10896
+	.word	0
+	.word	0
+	.word	0
+	.word	7048
+	.word	57394
+	.word	10865
+	.word	0
+	.word	0
+	.word	0
+	.word	12872
+	.word	55405
+	.word	10832
+	.word	0
+	.word	0
+	.word	0
+	.word	12608
+	.word	51669
+	.word	10798
+	.word	0
+	.word	0
+	.word	0
+	.word	5350
+	.word	48455
+	.word	10772
+	.word	0
+	.word	0
+	.word	0
+	.word	23568
+	.word	58692
+	.word	10740
+	.word	0
+	.word	0
+	.word	0
+	.word	40784
+	.word	37046
+	.word	10708
+	.word	0
+	.word	0
+	.word	0
+	.word	38992
+	.word	43861
+	.word	10678
+	.word	0
+	.word	0
+	.word	0
+	.word	10064
+	.word	40199
+	.word	10648
+	.word	0
+	.word	0
+	.word	0
+	.word	26368
+	.word	35771
+	.word	10611
+	.word	0
+	.word	0
+	.word	0
+	.word	23994
+	.word	60721
+	.word	10586
+	.word	0
+	.word	0
+	.word	0
+	.word	25052
+	.word	34302
+	.word	10554
+	.word	0
+	.word	0
+	.word	0
+	.word	39842
+	.word	54964
+	.word	10524
+	.word	0
+	.word	0
+	.word	0
+	.word	11568
+	.word	58277
+	.word	10491
+	.word	0
+	.word	0
+	.word	0
+	.word	26160
+	.word	46438
+	.word	10461
+	.word	0
+	.word	0
+	.word	0
+	.word	23252
+	.word	43049
+	.word	10431
+	.word	0
+	.word	0
+	.word	0
+	.word	35288
+	.word	58000
+	.word	10400
+	.word	0
+	.word	0
+	.word	0
+	.word	14614
+	.word	50216
+	.word	10369
+	.word	0
+	.word	0
+	.word	0
+	.word	1168
+	.word	48804
+	.word	10336
+	.word	0
+	.word	0
+	.word	0
+	.word	60934
+	.word	33006
+	.word	10307
+	.word	0
+	.word	0
+	.word	0
+	.word	64512
+	.word	62247
+	.word	10272
+	.word	0
+	.word	0
+	.word	0
+	.word	59968
+	.word	43121
+	.word	10240
+	.word	0
+	.word	0
+	.word	0
+	.word	25560
+	.word	39974
+	.word	10212
+	.word	0
+	.word	0
+	.word	0
+	.word	1978
+	.word	49353
+	.word	10183
+	.word	0
+	.word	0
+	.word	0
+	.word	16290
+	.word	38807
+	.word	10152
+	.word	0
+	.word	0
+	.word	0
+	.word	8646
+	.word	65226
+	.word	10121
+	.word	0
+	.word	0
+	.word	0
+	.word	56896
+	.word	34317
+	.word	10088
+	.word	0
+	.word	0
+	.word	0
+	.word	40136
+	.word	39118
+	.word	10057
+	.word	0
+	.word	0
+	.word	0
+	.word	14200
+	.word	41756
+	.word	10026
+	.word	0
+	.word	0
+	.word	0
+	.word	59256
+	.word	63202
+	.word	9995
+	.word	0
+	.word	0
+	.word	0
+	.word	22968
+	.word	63553
+	.word	9965
+	.word	0
+	.word	0
+	.word	0
+	.word	736
+	.word	44292
+	.word	9933
+	.word	0
+	.word	0
+	.word	0
+	.word	23186
+	.word	37760
+	.word	9904
+	.word	0
+	.word	0
+	.word	0
+	.word	51008
+	.word	34950
+	.word	9869
+	.word	0
+	.word	0
+	.word	0
+	.word	1664
+	.word	64248
+	.word	9836
+	.word	0
+	.word	0
+	.word	0
+	.word	64352
+	.word	35199
+	.word	9811
+	.word	0
+	.word	0
+	.word	0
+	.word	34656
+	.word	63747
+	.word	9780
+	.word	0
+	.word	0
+	.word	0
+	.word	44330
+	.word	49864
+	.word	9749
+	.word	0
+	.word	0
+	.word	0
+	.word	11654
+	.word	35567
+	.word	9718
+	.word	0
+	.word	0
+	.word	0
+	.word	7924
+	.word	58919
+	.word	9686
+	.word	0
+	.word	0
+	.word	0
+	.word	2532
+	.word	32800
+	.word	9655
+	.word	0
+	.word	0
+	.word	0
+	.word	30024
+	.word	53799
+	.word	9624
+	.word	0
+	.word	0
+	.word	0
+	.word	30172
+	.word	64347
+	.word	9593
+	.word	0
+	.word	0
+	.word	0
+	.word	60036
+	.word	51382
+	.word	9562
+	.word	0
+	.word	0
+	.word	0
+	.word	58576
+	.word	33093
+	.word	9531
+	.word	0
+	.word	0
+	.word	0
+	.word	13888
+	.word	38760
+	.word	9500
+	.word	0
+	.word	0
+	.word	0
+	.word	9322
+	.word	52460
+	.word	9470
+	.word	0
+	.word	0
+	.word	0
+	.word	20944
+	.word	41077
+	.word	9437
+	.word	0
+	.word	0
+	.word	0
+	.word	17976
+	.word	41861
+	.word	9407
+	.word	0
+	.word	0
+	.word	0
+	.word	55176
+	.word	55158
+	.word	9377
+	.word	0
+	.word	0
+	.word	0
+	.word	4976
+	.word	35223
+	.word	9346
+	.word	0
+	.word	0
+	.word	0
+	.word	7816
+	.word	39783
+	.word	9314
+	.word	0
+	.word	0
+	.word	0
+	.word	27656
+	.word	55669
+	.word	9284
+	.word	0
+	.word	0
+	.word	0
+	.word	64944
+	.word	53184
+	.word	9250
+	.word	0
+	.word	0
+	.word	0
+	.word	12544
+	.word	49190
+	.word	9222
+	.word	0
+	.word	0
+	.word	0
+	.word	50612
+	.word	44644
+	.word	9190
+	.word	0
+	.word	0
+	.word	0
+	.word	8832
+	.word	63111
+	.word	9155
+	.word	0
+	.word	0
+	.word	0
+	.word	11744
+	.word	36870
+	.word	9129
+	.word	0
+	.word	0
+	.word	0
+	.word	9404
+	.word	63025
+	.word	9098
+	.word	0
+	.word	0
+	.word	0
+	.word	47316
+	.word	43381
+	.word	9067
+	.word	0
+	.word	0
+	.word	0
+	.word	55716
+	.word	47433
+	.word	9035
+	.word	0
+	.word	0
+	.word	0
+	.word	46414
+	.word	48441
+	.word	9005
+	.word	0
+	.word	0
+	.word	0
+	.word	19116
+	.word	39506
+	.word	8974
+	.word	0
+	.word	0
+	.word	0
+	.word	48060
+	.word	53381
+	.word	8943
+	.word	0
+	.word	0
+	.word	0
+	.word	57112
+	.word	50739
+	.word	8911
+	.word	0
+	.word	0
+	.word	0
+	.word	5840
+	.word	60581
+	.word	8879
+	.word	0
+	.word	0
+	.word	0
+	.word	62112
+	.word	57199
+	.word	8846
+	.word	0
+	.word	0
+	.word	0
+	.word	35908
+	.word	59499
+	.word	8818
+	.word	0
+	.word	0
+	.word	0
+	.word	13760
+	.word	48116
+	.word	8787
+	.word	0
+	.word	0
+	.word	0
+	.word	3136
+	.word	56059
+	.word	8752
+	.word	0
+	.word	0
+	.word	0
+	.word	37596
+	.word	39221
+	.word	8726
+	.word	0
+	.word	0
+	.word	0
+	.word	3232
+	.word	48550
+	.word	8691
+	.word	0
+	.word	0
+	.word	0
+	.word	22872
+	.word	42749
+	.word	8662
+	.word	0
+	.word	0
+	.word	0
+	.word	41948
+	.word	40319
+	.word	8633
+	.word	0
+	.word	0
+	.word	0
+	.word	31196
+	.word	64693
+	.word	8601
+	.word	0
+	.word	0
+	.word	0
+	.word	62052
+	.word	52923
+	.word	8571
+	.word	0
+	.word	0
+	.word	0
+	.word	2750
+	.word	33544
+	.word	8540
+	.word	0
+	.word	0
+	.word	0
+	.word	12462
+	.word	46179
+	.word	8509
+	.word	0
+	.word	0
+	.word	0
+	.word	25128
+	.word	45120
+	.word	8476
+	.word	0
+	.word	0
+	.word	0
+	.word	51634
+	.word	62523
+	.word	8447
+	.word	0
+	.word	0
+	.word	0
+	.word	15758
+	.word	42163
+	.word	8416
+	.word	0
+	.word	0
+	.word	0
+	.word	34022
+	.word	36267
+	.word	8385
+	.word	0
+	.word	0
+	.word	0
+	.word	41252
+	.word	39796
+	.word	8353
+	.word	0
+	.word	0
+	.word	0
+	.word	49782
+	.word	54423
+	.word	8323
+	.word	0
+	.word	0
+	.word	0
+	.word	25428
+	.word	42086
+	.word	8291
+	.word	0
+	.word	0
+	.word	0
+	.word	34388
+	.word	44810
+	.word	8260
+	.word	0
+	.word	0
+	.word	0
+	.word	7456
+	.word	64092
+	.word	8228
+	.word	0
+	.word	0
+	.word	0
+	.word	48336
+	.word	62448
+	.word	8196
+	.word	0
+	.word	0
+	.word	0
+	.word	60912
+	.word	61622
+	.word	8167
+	.word	0
+	.word	0
+	.word	0
+	.word	17852
+	.word	37250
+	.word	8137
+	.word	0
+	.word	0
+	.word	0
+	.word	57940
+	.word	56453
+	.word	8106
+	.word	0
+	.word	0
+	.word	0
+	.word	47256
+	.word	59825
+	.word	8074
+	.word	0
+	.word	0
+	.word	0
+	.word	3774
+	.word	59120
+	.word	8044
+	.word	0
+	.word	0
+	.word	0
+	.word	43448
+	.word	62852
+	.word	8012
+	.word	0
+	.word	0
+	.word	0
+	.word	4840
+	.word	57195
+	.word	7982
+	.word	0
+	.word	0
+	.word	0
+	.word	40862
+	.word	52565
+	.word	7951
+	.word	0
+	.word	0
+	.word	0
+	.word	1440
+	.word	60474
+	.word	7919
+	.word	0
+	.word	0
+	.word	0
+	.word	55520
+	.word	38648
+	.word	7889
+	.word	0
+	.word	0
+	.word	0
+	.word	15316
+	.word	52422
+	.word	7857
+	.word	0
+	.word	0
+	.word	0
+	.word	18704
+	.word	47227
+	.word	7827
+	.word	0
+	.word	0
+	.word	0
+	.word	48892
+	.word	54283
+	.word	7795
+	.word	0
+	.word	0
+	.word	0
+	.word	12670
+	.word	41990
+	.word	7765
+	.word	0
+	.word	0
+	.word	0
+	.word	27570
+	.word	49842
+	.word	7734
+	.word	0
+	.word	0
+	.word	0
+	.word	47230
+	.word	47992
+	.word	7703
+	.word	0
+	.word	0
+	.word	0
+	.word	41020
+	.word	56253
+	.word	7671
+	.word	0
+	.word	0
+	.word	0
+	.word	23404
+	.word	58312
+	.word	7641
+	.word	0
+	.word	0
+	.word	0
+	.word	35176
+	.word	51854
+	.word	7610
+	.word	0
+	.word	0
+	.word	0
+	.word	49188
+	.word	59051
+	.word	7578
+	.word	0
+	.word	0
+	.word	0
+	.word	16656
+	.word	54507
+	.word	7546
+	.word	0
+	.word	0
+	.word	0
+	.word	41320
+	.word	48565
+	.word	7517
+	.word	0
+	.word	0
+	.word	0
+	.word	302
+	.word	42490
+	.word	7486
+	.word	0
+	.word	0
+	.word	0
+	.word	26680
+	.word	39967
+	.word	7454
+	.word	0
+	.word	0
+	.word	0
+	.word	41304
+	.word	43638
+	.word	7424
+	.word	0
+	.word	0
+	.word	0
+	.word	2314
+	.word	48533
+	.word	7393
+	.word	0
+	.word	0
+	.word	0
+	.word	63294
+	.word	35693
+	.word	7362
+	.word	0
+	.word	0
+	.word	0
+	.word	24538
+	.word	48319
+	.word	7331
+	.word	0
+	.word	0
+	.word	0
+	.word	56296
+	.word	47263
+	.word	7300
+	.word	0
+	.word	0
+	.word	0
+	.word	28236
+	.word	38599
+	.word	7268
+	.word	0
+	.word	0
+	.word	0
+	.word	6594
+	.word	62116
+	.word	7238
+	.word	0
+	.word	0
+	.word	0
+	.word	47104
+	.word	63573
+	.word	7198
+	.word	0
+	.word	0
+	.word	0
+	.word	34812
+	.word	34303
+	.word	7176
+	.word	0
+	.word	0
+	.word	0
+	.word	5144
+	.word	33695
+	.word	7145
+	.word	0
+	.word	0
+	.word	0
+	.word	24966
+	.word	55768
+	.word	7114
+	.word	0
+	.word	0
+	.word	0
+	.word	62720
+	.word	43946
+	.word	7078
+	.word	0
+	.word	0
+	.word	0
+	.word	31542
+	.word	56062
+	.word	7052
+	.word	0
+	.word	0
+	.word	0
+	.word	62356
+	.word	59096
+	.word	7020
+	.word	0
+	.word	0
+	.word	0
+	.word	28412
+	.word	40533
+	.word	6990
+	.word	0
+	.word	0
+	.word	0
+	.word	24080
+	.word	50467
+	.word	6958
+	.word	0
+	.word	0
+	.word	0
+	.word	33296
+	.word	46841
+	.word	6925
+	.word	0
+	.word	0
+	.word	0
+	.word	39600
+	.word	38627
+	.word	6897
+	.word	0
+	.word	0
+	.word	0
+	.word	14436
+	.word	37607
+	.word	6865
+	.word	0
+	.word	0
+	.word	0
+	.word	39032
+	.word	56421
+	.word	6833
+	.word	0
+	.word	0
+	.word	0
+	.word	64032
+	.word	54987
+	.word	6804
+	.word	0
+	.word	0
+	.word	0
+	.word	27648
+	.word	42212
+	.word	6768
+	.word	0
+	.word	0
+	.word	0
+	.word	43840
+	.word	46107
+	.word	6739
+	.word	0
+	.word	0
+	.word	0
+	.word	17316
+	.word	36574
+	.word	6711
+	.word	0
+	.word	0
+	.word	0
+	.word	8928
+	.word	37652
+	.word	6677
+	.word	0
+	.word	0
+	.word	0
+	.word	24944
+	.word	47433
+	.word	6648
+	.word	0
+	.word	0
+	.word	0
+	.word	27392
+	.word	57430
+	.word	6616
+	.word	0
+	.word	0
+	.word	0
+	.word	39848
+	.word	43340
+	.word	6585
+	.word	0
+	.word	0
+	.word	0
+	.word	64160
+	.word	43542
+	.word	6555
+	.word	0
+	.word	0
+	.word	0
+	.word	35226
+	.word	63015
+	.word	6525
+	.word	0
+	.word	0
+	.word	0
+	.word	40736
+	.word	64368
+	.word	6493
+	.word	0
+	.word	0
+	.word	0
+	.word	42168
+	.word	49526
+	.word	6462
+	.word	0
+	.word	0
+	.word	0
+	.word	45596
+	.word	34243
+	.word	6432
+	.word	0
+	.word	0
+	.word	0
+	.word	20690
+	.word	39705
+	.word	6401
+	.word	0
+	.word	0
+	.word	0
+	.word	54448
+	.word	46856
+	.word	6368
+	.word	0
+	.word	0
+	.word	0
+	.word	64392
+	.word	62736
+	.word	6337
+	.word	0
+	.word	0
+	.word	0
+	.word	12780
+	.word	56461
+	.word	6307
+	.word	0
+	.word	0
+	.word	0
+	.word	15360
+	.word	49145
+	.word	6277
+	.word	0
+	.word	0
+	.word	0
+	.word	20512
+	.word	49931
+	.word	6242
+	.word	0
+	.word	0
+	.word	0
+	.word	54512
+	.word	55820
+	.word	6212
+	.word	0
+	.word	0
+	.word	0
+	.word	8402
+	.word	39333
+	.word	6184
+	.word	0
+	.word	0
+	.word	0
+	.word	34094
+	.word	53593
+	.word	6153
+	.word	0
+	.word	0
+	.word	0
+	.word	31960
+	.word	38817
+	.word	6121
+	.word	0
+	.word	0
+	.word	0
+	.word	16954
+	.word	39291
+	.word	6091
+	.word	0
+	.word	0
+	.word	0
+	.word	49600
+	.word	48765
+	.word	6056
+	.word	0
+	.word	0
+	.word	0
+	.word	59580
+	.word	56541
+	.word	6029
+	.word	0
+	.word	0
+	.word	0
+	.word	35624
+	.word	44550
+	.word	5998
+	.word	0
+	.word	0
+	.word	0
+	.word	4142
+	.word	47316
+	.word	5967
+	.word	0
+	.word	0
+	.word	0
+	.word	43520
+	.word	43612
+	.word	5935
+	.word	0
+	.word	0
+	.word	0
+	.word	20976
+	.word	40896
+	.word	5902
+	.word	0
+	.word	0
+	.word	0
+	.word	63576
+	.word	57729
+	.word	5874
+	.word	0
+	.word	0
+	.word	0
+	.word	37288
+	.word	33122
+	.word	5843
+	.word	0
+	.word	0
+	.word	0
+	.word	24384
+	.word	52079
+	.word	5809
+	.word	0
+	.word	0
+	.word	0
+	.word	47952
+	.word	58719
+	.word	5779
+	.word	0
+	.word	0
+	.word	0
+	.word	44242
+	.word	55445
+	.word	5750
+	.word	0
+	.word	0
+	.word	0
+	.word	61232
+	.word	38847
+	.word	5716
+	.word	0
+	.word	0
+	.word	0
+	.word	63232
+	.word	46039
+	.word	5683
+	.word	0
+	.word	0
+	.word	0
+	.word	13396
+	.word	42933
+	.word	5657
+	.word	0
+	.word	0
+	.word	0
+	.word	27392
+	.word	43305
+	.word	5622
+	.word	0
+	.word	0
+	.word	0
+	.word	40708
+	.word	35319
+	.word	5595
+	.word	0
+	.word	0
+	.word	0
+	.word	44408
+	.word	55685
+	.word	5564
+	.word	0
+	.word	0
+	.word	0
+	.word	42090
+	.word	44607
+	.word	5533
+	.word	0
+	.word	0
+	.word	0
+	.word	25504
+	.word	53466
+	.word	5500
+	.word	0
+	.word	0
+	.word	0
+	.word	24208
+	.word	33149
+	.word	5470
+	.word	0
+	.word	0
+	.word	0
+	.word	5268
+	.word	45375
+	.word	5440
+	.word	0
+	.word	0
+	.word	0
+	.word	144
+	.word	40000
+	.word	5409
+	.word	0
+	.word	0
+	.word	0
+	.word	56688
+	.word	52358
+	.word	5376
+	.word	0
+	.word	0
+	.word	0
+	.word	25848
+	.word	56175
+	.word	5345
+	.word	0
+	.word	0
+	.word	0
+	.word	57900
+	.word	44055
+	.word	5315
+	.word	0
+	.word	0
+	.word	0
+	.word	24800
+	.word	43437
+	.word	5283
+	.word	0
+	.word	0
+	.word	0
+	.word	17984
+	.word	54872
+	.word	5249
+	.word	0
+	.word	0
+	.word	0
+	.word	25744
+	.word	41345
+	.word	5223
+	.word	0
+	.word	0
+	.word	0
+	.word	7668
+	.word	43682
+	.word	5191
+	.word	0
+	.word	0
+	.word	0
+	.word	47434
+	.word	36705
+	.word	5161
+	.word	0
+	.word	0
+	.word	0
+	.word	20888
+	.word	40323
+	.word	5129
+	.word	0
+	.word	0
+	.word	0
+	.word	3962
+	.word	43032
+	.word	5099
+	.word	0
+	.word	0
+	.word	0
+	.word	50270
+	.word	49260
+	.word	5068
+	.word	0
+	.word	0
+	.word	0
+	.word	20160
+	.word	64041
+	.word	5032
+	.word	0
+	.word	0
+	.word	0
+	.word	25624
+	.word	36013
+	.word	5004
+	.word	0
+	.word	0
+	.word	0
+	.word	48328
+	.word	59345
+	.word	4975
+	.word	0
+	.word	0
+	.word	0
+	.word	51508
+	.word	63920
+	.word	4943
+	.word	0
+	.word	0
+	.word	0
+	.word	27872
+	.word	39135
+	.word	4913
+	.word	0
+	.word	0
+	.word	0
+	.word	13590
+	.word	58857
+	.word	4882
+	.word	0
+	.word	0
+	.word	0
+	.word	50880
+	.word	61323
+	.word	4847
+	.word	0
+	.word	0
+	.word	0
+	.word	44802
+	.word	37181
+	.word	4820
+	.word	0
+	.word	0
+	.word	0
+	.word	53808
+	.word	57813
+	.word	4789
+	.word	0
+	.word	0
+	.word	0
+	.word	64424
+	.word	49714
+	.word	4757
+	.word	0
+	.word	0
+	.word	0
+	.word	31652
+	.word	44011
+	.word	4727
+	.word	0
+	.word	0
+	.word	0
+	.word	28252
+	.word	50834
+	.word	4696
+	.word	0
+	.word	0
+	.word	0
+	.word	30370
+	.word	38742
+	.word	4665
+	.word	0
+	.word	0
+	.word	0
+	.word	57728
+	.word	58403
+	.word	4628
+	.word	0
+	.word	0
+	.word	0
+	.word	35900
+	.word	37112
+	.word	4603
+	.word	0
+	.word	0
+	.word	0
+	.word	40764
+	.word	40914
+	.word	4572
+	.word	0
+	.word	0
+	.word	0
+	.word	21472
+	.word	46910
+	.word	4541
+	.word	0
+	.word	0
+	.word	0
+	.word	17854
+	.word	35030
+	.word	4510
+	.word	0
+	.word	0
+	.word	0
+	.word	4378
+	.word	35776
+	.word	4479
+	.word	0
+	.word	0
+	.word	0
+	.word	57962
+	.word	55295
+	.word	4448
+	.word	0
+	.word	0
+	.word	0
+	.word	64352
+	.word	56717
+	.word	4415
+	.word	0
+	.word	0
+	.word	0
+	.word	37744
+	.word	49416
+	.word	4384
+	.word	0
+	.word	0
+	.word	0
+	.word	38484
+	.word	35759
+	.word	4355
+	.word	0
+	.word	0
+	.word	0
+	.word	55020
+	.word	54969
+	.word	4324
+	.word	0
+	.word	0
+	.word	0
+	.word	9188
+	.word	55223
+	.word	4292
+	.word	0
+	.word	0
+	.word	0
+	.word	6822
+	.word	43079
+	.word	4262
+	.word	0
+	.word	0
+	.word	0
+	.word	48870
+	.word	40943
+	.word	4231
+	.word	0
+	.word	0
+	.word	0
+	.word	9936
+	.word	42731
+	.word	4198
+	.word	0
+	.word	0
+	.word	0
+	.word	23430
+	.word	43136
+	.word	4169
+	.word	0
+	.word	0
+	.word	0
+	.word	4700
+	.word	55665
+	.word	4137
+	.word	0
+	.word	0
+	.word	0
+	.word	8056
+	.word	40216
+	.word	4106
+	.word	0
+	.word	0
+	.word	0
+	.word	3716
+	.word	45403
+	.word	4075
+	.word	0
+	.word	0
+	.word	0
+	.word	53440
+	.word	49488
+	.word	4044
+	.word	0
+	.word	0
+	.word	0
+	.word	41776
+	.word	50188
+	.word	4013
+	.word	0
+	.word	0
+	.word	0
+	.word	20994
+	.word	64556
+	.word	3983
+	.word	0
+	.word	0
+	.word	0
+	.word	16252
+	.word	60661
+	.word	3951
+	.word	0
+	.word	0
+	.word	0
+	.word	61252
+	.word	65021
+	.word	3920
+	.word	0
+	.word	0
+	.word	0
+	.word	16236
+	.word	43803
+	.word	3889
+	.word	0
+	.word	0
+	.word	0
+	.word	63064
+	.word	35308
+	.word	3857
+	.word	0
+	.word	0
+	.word	0
+	.word	49096
+	.word	39848
+	.word	3828
+	.word	0
+	.word	0
+	.word	0
+	.word	15680
+	.word	48673
+	.word	3797
+	.word	0
+	.word	0
+	.word	0
+	.word	48068
+	.word	50957
+	.word	3766
+	.word	0
+	.word	0
+	.word	0
+	.word	20824
+	.word	56086
+	.word	3734
+	.word	0
+	.word	0
+	.word	0
+	.word	46504
+	.word	43224
+	.word	3704
+	.word	0
+	.word	0
+	.word	0
+	.word	52428
+	.word	46094
+	.word	3672
+	.word	0
+	.word	0
+	.word	0
+	.word	17548
+	.word	52066
+	.word	3642
+	.word	0
+	.word	0
+	.word	0
+	.word	61738
+	.word	35565
+	.word	3611
+	.word	0
+	.word	0
+	.word	0
+	.word	31184
+	.word	50588
+	.word	3579
+	.word	0
+	.word	0
+	.word	0
+	.word	1716
+	.word	52681
+	.word	3549
+	.word	0
+	.word	0
+	.word	0
+	.word	44656
+	.word	43385
+	.word	3518
+	.word	0
+	.word	0
+	.word	0
+	.word	12668
+	.word	43259
+	.word	3486
+	.word	0
+	.word	0
+	.word	0
+	.word	24544
+	.word	35408
+	.word	3453
+	.word	0
+	.word	0
+	.word	0
+	.word	28854
+	.word	65018
+	.word	3425
+	.word	0
+	.word	0
+	.word	0
+	.word	5696
+	.word	40391
+	.word	3393
+	.word	0
+	.word	0
+	.word	0
+	.word	39580
+	.word	56400
+	.word	3363
+	.word	0
+	.word	0
+	.word	0
+	.word	20428
+	.word	39579
+	.word	3332
+	.word	0
+	.word	0
+	.word	0
+	.word	32328
+	.word	36727
+	.word	3301
+	.word	0
+	.word	0
+	.word	0
+	.word	34020
+	.word	54457
+	.word	3270
+	.word	0
+	.word	0
+	.word	0
+	.word	34016
+	.word	48400
+	.word	3238
+	.word	0
+	.word	0
+	.word	0
+	.word	6922
+	.word	51417
+	.word	3208
+	.word	0
+	.word	0
+	.word	0
+	.word	27208
+	.word	64641
+	.word	3176
+	.word	0
+	.word	0
+	.word	0
+	.word	1802
+	.word	48886
+	.word	3146
+	.word	0
+	.word	0
+	.word	0
+	.word	35440
+	.word	61590
+	.word	3115
+	.word	0
+	.word	0
+	.word	0
+	.word	60610
+	.word	51604
+	.word	3084
+	.word	0
+	.word	0
+	.word	0
+	.word	5440
+	.word	38199
+	.word	3050
+	.word	0
+	.word	0
+	.word	0
+	.word	6914
+	.word	43867
+	.word	3022
+	.word	0
+	.word	0
+	.word	0
+	.word	24000
+	.word	45256
+	.word	2989
+	.word	0
+	.word	0
+	.word	0
+	.word	51496
+	.word	57396
+	.word	2959
+	.word	0
+	.word	0
+	.word	0
+	.word	11538
+	.word	46256
+	.word	2929
+	.word	0
+	.word	0
+	.word	0
+	.word	36802
+	.word	48020
+	.word	2898
+	.word	0
+	.word	0
+	.word	0
+	.word	57910
+	.word	57903
+	.word	2867
+	.word	0
+	.word	0
+	.word	0
+	.word	47484
+	.word	48798
+	.word	2835
+	.word	0
+	.word	0
+	.word	0
+	.word	57766
+	.word	57709
+	.word	2805
+	.word	0
+	.word	0
+	.word	0
+	.word	54064
+	.word	47856
+	.word	2774
+	.word	0
+	.word	0
+	.word	0
+	.word	49340
+	.word	48080
+	.word	2743
+	.word	0
+	.word	0
+	.word	0
+	.word	36454
+	.word	56731
+	.word	2712
+	.word	0
+	.word	0
+	.word	0
+	.word	51548
+	.word	63385
+	.word	2681
+	.word	0
+	.word	0
+	.word	0
+	.word	56000
+	.word	48716
+	.word	2645
+	.word	0
+	.word	0
+	.word	0
+	.word	44992
+	.word	50040
+	.word	2615
+	.word	0
+	.word	0
+	.word	0
+	.word	43136
+	.word	58177
+	.word	2585
+	.word	0
+	.word	0
+	.word	0
+	.word	49730
+	.word	33270
+	.word	2557
+	.word	0
+	.word	0
+	.word	0
+	.word	29808
+	.word	51063
+	.word	2526
+	.word	0
+	.word	0
+	.word	0
+	.word	25276
+	.word	46724
+	.word	2494
+	.word	0
+	.word	0
+	.word	0
+	.word	17324
+	.word	35928
+	.word	2463
+	.word	0
+	.word	0
+	.word	0
+	.word	52284
+	.word	63916
+	.word	2433
+	.word	0
+	.word	0
+	.word	0
+	.word	5414
+	.word	46704
+	.word	2402
+	.word	0
+	.word	0
+	.word	0
+	.word	51710
+	.word	57168
+	.word	2371
+	.word	0
+	.word	0
+	.word	0
+	.word	27366
+	.word	49253
+	.word	2340
+	.word	0
+	.word	0
+	.word	0
+	.word	45332
+	.word	53033
+	.word	2309
+	.word	0
+	.word	0
+	.word	0
+	.word	54152
+	.word	37418
+	.word	2276
+	.word	0
+	.word	0
+	.word	0
+	.word	53076
+	.word	47398
+	.word	2247
+	.word	0
+	.word	0
+	.word	0
+	.word	14374
+	.word	59477
+	.word	2216
+	.word	0
+	.word	0
+	.word	0
+	.word	59336
+	.word	33435
+	.word	2184
+	.word	0
+	.word	0
+	.word	0
+	.word	21612
+	.word	43267
+	.word	2154
+	.word	0
+	.word	0
+	.word	0
+	.word	34664
+	.word	39372
+	.word	2121
+	.word	0
+	.word	0
+	.word	0
+	.word	172
+	.word	62761
+	.word	2091
+	.word	0
+	.word	0
+	.word	0
+	.word	9816
+	.word	40715
+	.word	2060
+	.word	0
+	.word	0
+	.word	0
+	.word	65116
+	.word	40481
+	.word	2030
+	.word	0
+	.word	0
+	.word	0
+	.word	28066
+	.word	39184
+	.word	1999
+	.word	0
+	.word	0
+	.word	0
+	.word	37408
+	.word	63923
+	.word	1968
+	.word	0
+	.word	0
+	.word	0
+	.word	15760
+	.word	42305
+	.word	1937
+	.word	0
+	.word	0
+	.word	0
+	.word	28236
+	.word	59340
+	.word	1905
+	.word	0
+	.word	0
+	.word	0
+	.word	43258
+	.word	59402
+	.word	1875
+	.word	0
+	.word	0
+	.word	0
+	.word	19988
+	.word	50087
+	.word	1844
+	.word	0
+	.word	0
+	.word	0
+	.word	63456
+	.word	47833
+	.word	1810
+	.word	0
+	.word	0
+	.word	0
+	.word	65184
+	.word	61426
+	.word	1781
+	.word	0
+	.word	0
+	.word	0
+	.word	52982
+	.word	48456
+	.word	1751
+	.word	0
+	.word	0
+	.word	0
+	.word	30020
+	.word	62809
+	.word	1719
+	.word	0
+	.word	0
+	.word	0
+	.word	9096
+	.word	63061
+	.word	1688
+	.word	0
+	.word	0
+	.word	0
+	.word	59648
+	.word	44374
+	.word	1654
+	.word	0
+	.word	0
+	.word	0
+	.word	11456
+	.word	33847
+	.word	1625
+	.word	0
+	.word	0
+	.word	0
+	.word	12392
+	.word	50500
+	.word	1595
+	.word	0
+	.word	0
+	.word	0
+	.word	56432
+	.word	59196
+	.word	1563
+	.word	0
+	.word	0
+	.word	0
+	.word	61008
+	.word	40265
+	.word	1532
+	.word	0
+	.word	0
+	.word	0
+	.word	37842
+	.word	33270
+	.word	1503
+	.word	0
+	.word	0
+	.word	0
+	.word	37916
+	.word	44543
+	.word	1471
+	.word	0
+	.word	0
+	.word	0
+	.word	11490
+	.word	36421
+	.word	1441
+	.word	0
+	.word	0
+	.word	0
+	.word	19040
+	.word	38397
+	.word	1409
+	.word	0
+	.word	0
+	.word	0
+	.word	31224
+	.word	47162
+	.word	1379
+	.word	0
+	.word	0
+	.word	0
+	.word	52056
+	.word	41461
+	.word	1347
+	.word	0
+	.word	0
+	.word	0
+	.word	10810
+	.word	56374
+	.word	1317
+	.word	0
+	.word	0
+	.word	0
+	.word	5358
+	.word	35086
+	.word	1286
+	.word	0
+	.word	0
+	.word	0
+	.word	36640
+	.word	50226
+	.word	1251
+	.word	0
+	.word	0
+	.word	0
+	.word	33856
+	.word	45597
+	.word	1222
+	.word	0
+	.word	0
+	.word	0
+	.word	21552
+	.word	63128
+	.word	1191
+	.word	0
+	.word	0
+	.word	0
+	.word	1198
+	.word	35616
+	.word	1162
+	.word	0
+	.word	0
+	.word	0
+	.word	1232
+	.word	59506
+	.word	1131
+	.word	0
+	.word	0
+	.word	0
+	.word	51086
+	.word	34963
+	.word	1100
+	.word	0
+	.word	0
+	.word	0
+	.word	3960
+	.word	39061
+	.word	1067
+	.word	0
+	.word	0
+	.word	0
+	.word	4564
+	.word	57134
+	.word	1037
+	.word	0
+	.word	0
+	.word	0
+	.word	59468
+	.word	35285
+	.word	1007
+	.word	0
+	.word	0
+	.word	0
+	.word	63422
+	.word	35431
+	.word	976
+	.word	0
+	.word	0
+	.word	0
+	.word	38352
+	.word	51462
+	.word	945
+	.word	0
+	.word	0
+	.word	0
+	.word	25806
+	.word	55660
+	.word	914
+	.word	0
+	.word	0
+	.word	0
+	.word	38842
+	.word	41327
+	.word	883
+	.word	0
+	.word	0
+	.word	0
+	.word	17980
+	.word	50458
+	.word	852
+	.word	0
+	.word	0
+	.word	0
+	.word	61194
+	.word	59710
+	.word	821
+	.word	0
+	.word	0
+	.word	0
+	.word	21098
+	.word	42086
+	.word	790
+	.word	0
+	.word	0
+	.word	0
+	.word	16704
+	.word	43341
+	.word	757
+	.word	0
+	.word	0
+	.word	0
+	.word	46316
+	.word	52840
+	.word	728
+	.word	0
+	.word	0
+	.word	0
+	.word	20386
+	.word	33936
+	.word	697
+	.word	0
+	.word	0
+	.word	0
+	.word	20064
+	.word	51864
+	.word	664
+	.word	0
+	.word	0
+	.word	0
+	.word	2268
+	.word	57500
+	.word	634
+	.word	0
+	.word	0
+	.word	0
+	.word	11152
+	.word	51171
+	.word	604
+	.word	0
+	.word	0
+	.word	0
+	.word	23164
+	.word	63727
+	.word	572
+	.word	0
+	.word	0
+	.word	0
+	.word	20514
+	.word	40280
+	.word	542
+	.word	0
+	.word	0
+	.word	0
+	.word	21818
+	.word	57922
+	.word	511
+	.word	0
+	.word	0
+	.word	0
+	.word	32366
+	.word	46413
+	.word	480
+	.word	0
+	.word	0
+	.word	0
+	.word	53972
+	.word	43148
+	.word	449
+	.word	0
+	.word	0
+	.word	0
+	.word	30134
+	.word	65133
+	.word	418
+	.word	0
+	.word	0
+	.word	0
+	.word	15282
+	.word	61516
+	.word	387
+	.word	0
+	.word	0
+	.word	0
+	.word	49872
+	.word	49222
+	.word	355
+	.word	0
+	.word	0
+	.word	0
+	.word	9484
+	.word	63958
+	.word	325
+	.word	0
+	.word	0
+	.word	0
+	.word	47028
+	.word	35341
+	.word	294
+	.word	0
+	.word	0
+	.word	0
+	.word	6770
+	.word	58613
+	.word	263
+	.word	0
+	.word	0
+	.word	0
+	.word	33372
+	.word	43448
+	.word	232
+	.word	0
+	.word	0
+	.word	0
+	.word	27792
+	.word	51629
+	.word	198
+	.word	0
+	.word	0
+	.word	0
+	.word	19712
+	.word	53691
+	.word	170
+	.word	0
+	.word	0
+	.word	0
+	.word	42144
+	.word	60929
+	.word	135
+	.word	0
+	.word	0
+	.word	0
+	.word	35240
+	.word	48799
+	.word	107
+	.word	0
+	.word	0
+	.word	0
+	.word	910
+	.word	51212
+	.word	77
+	.word	0
+	.word	0
+	.word	0
+	.word	65062
+	.word	33668
+	.word	46
+	.word	0
+	.word	0
+	.word	0
+	.word	52624
+	.word	51799
+	.word	14
+	.word	0
+	.type	__4onpi_31l,@object
+	.size	__4onpi_31l,6444
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/libm_sincos_huge.S b/libm/x86/libm_sincos_huge.S
new file mode 100644
index 0000000..b43d193
--- /dev/null
+++ b/libm/x86/libm_sincos_huge.S
@@ -0,0 +1,668 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+# -- Begin  __libm_sincos_huge
+	.text
+       .align    16,0x90
+	.hidden __libm_sincos_huge
+	.globl __libm_sincos_huge
+__libm_sincos_huge:
+# parameter 1: 8 + %ebp
+# parameter 2: 16 + %ebp
+# parameter 3: 20 + %ebp
+..B1.1:
+        pushl     %ebp
+        movl      %esp, %ebp
+        andl      $-64, %esp
+        pushl     %esi
+        pushl     %edi
+        pushl     %ebx
+        subl      $52, %esp
+        movl      16(%ebp), %eax
+        movl      20(%ebp), %edx
+        movl      %eax, 32(%esp)
+        movl      %edx, 36(%esp)
+..B1.2:
+        fnstcw    30(%esp)
+..B1.3:
+        call      ..L2
+..L2:
+        popl      %edi
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%edi), %edi
+        movsd     8(%ebp), %xmm1
+        movl      12(%ebp), %esi
+        movl      %esi, %eax
+        andl      $2147483647, %eax
+        andps     .L_2il0floatpacket.0@GOTOFF(%edi), %xmm1
+        shrl      $31, %esi
+        movl      %eax, 40(%esp)
+        cmpl      $1104150528, %eax
+        movsd     %xmm1, 8(%ebp)
+        jae       ..B1.11
+..B1.4:
+        movsd     _Pi4Inv@GOTOFF(%edi), %xmm0
+        mulsd     %xmm1, %xmm0
+        movzwl    30(%esp), %edx
+        movl      %edx, %eax
+        andl      $768, %eax
+        movsd     %xmm0, (%esp)
+        cmpl      $768, %eax
+        je        ..B1.42
+..B1.5:
+        orl       $-64768, %edx
+        movw      %dx, 28(%esp)
+..B1.6:
+        fldcw     28(%esp)
+..B1.7:
+        movsd     8(%ebp), %xmm1
+        movl      $1, %ebx
+..B1.8:
+        movl      %ebx, 12(%esp)
+        movl      4(%esp), %ebx
+        movl      %ebx, %eax
+        movl      %esi, 8(%esp)
+        movl      %ebx, %esi
+        shrl      $20, %esi
+        andl      $1048575, %eax
+        movl      %esi, %ecx
+        orl       $1048576, %eax
+        negl      %ecx
+        movl      %eax, %edx
+        addl      $19, %ecx
+        addl      $13, %esi
+        movl      %ecx, 24(%esp)
+        shrl      %cl, %edx
+        movl      %esi, %ecx
+        shll      %cl, %eax
+        movl      24(%esp), %ecx
+        movl      (%esp), %esi
+        shrl      %cl, %esi
+        orl       %esi, %eax
+        cmpl      $1094713344, %ebx
+        movsd     %xmm1, 16(%esp)
+        fldl      16(%esp)
+        cmovb     %edx, %eax
+        movl      8(%esp), %esi
+        lea       1(%eax), %edx
+        movl      %edx, %ebx
+        andl      $-2, %ebx
+        movl      %ebx, 16(%esp)
+        fildl     16(%esp)
+        movl      12(%esp), %ebx
+        cmpl      $1094713344, 40(%esp)
+        jae       ..B1.10
+..B1.9:
+        fldl      _Pi4x3@GOTOFF(%edi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      8+_Pi4x3@GOTOFF(%edi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      16+_Pi4x3@GOTOFF(%edi)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        jmp       ..B1.17
+..B1.10:
+        fldl      _Pi4x4@GOTOFF(%edi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      8+_Pi4x4@GOTOFF(%edi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      16+_Pi4x4@GOTOFF(%edi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      24+_Pi4x4@GOTOFF(%edi)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        jmp       ..B1.17
+..B1.11:
+        movzwl    30(%esp), %edx
+        movl      %edx, %eax
+        andl      $768, %eax
+        cmpl      $768, %eax
+        je        ..B1.43
+..B1.12:
+        orl       $-64768, %edx
+        movw      %dx, 28(%esp)
+..B1.13:
+        fldcw     28(%esp)
+..B1.14:
+        movsd     8(%ebp), %xmm1
+        movl      $1, %ebx
+..B1.15:
+        movsd     %xmm1, 16(%esp)
+        fldl      16(%esp)
+        addl      $-32, %esp
+        lea       32(%esp), %eax
+        fstpt     (%esp)
+        movl      $0, 12(%esp)
+        movl      %eax, 16(%esp)
+        call      __libm_reduce_pi04l
+..B1.46:
+        addl      $32, %esp
+..B1.16:
+        fldl      (%esp)
+        lea       1(%eax), %edx
+        fldl      8(%esp)
+        faddp     %st, %st(1)
+..B1.17:
+        movl      %edx, %ecx
+        addl      $3, %eax
+        shrl      $2, %ecx
+        andl      $1, %ecx
+        shrl      $2, %eax
+        xorl      %ecx, %esi
+        movl      36(%esp), %ecx
+        andl      $1, %eax
+        andl      $3, %ecx
+        cmpl      $3, %ecx
+        jne       ..B1.25
+..B1.18:
+        fldt      84+_SP@GOTOFF(%edi)
+        fld       %st(1)
+        fmul      %st(2), %st
+        testb     $2, %dl
+        fmul      %st, %st(1)
+        fldt      72+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      60+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      48+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      36+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      24+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      12+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      _SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fmul      %st, %st(1)
+        fldt      84+_CP@GOTOFF(%edi)
+        fmul      %st(1), %st
+        fldt      72+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      60+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      48+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      36+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      24+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      12+_CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      _CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(1)
+        fldl      _ones@GOTOFF(%edi,%esi,8)
+        fldl      _ones@GOTOFF(%edi,%eax,8)
+        je        ..B1.22
+..B1.19:
+        fmulp     %st, %st(4)
+        testl     %ebx, %ebx
+        fxch      %st(2)
+        fmul      %st(3), %st
+        movl      32(%esp), %eax
+        faddp     %st, %st(3)
+        fxch      %st(2)
+        fstpl     (%eax)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        fstpl     8(%eax)
+        je        ..B1.21
+..B1.20:
+        fldcw     30(%esp)
+..B1.21:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.22:
+        fxch      %st(1)
+        fmulp     %st, %st(4)
+        testl     %ebx, %ebx
+        fxch      %st(2)
+        fmul      %st(3), %st
+        movl      32(%esp), %eax
+        faddp     %st, %st(3)
+        fxch      %st(2)
+        fstpl     8(%eax)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        fstpl     (%eax)
+        je        ..B1.24
+..B1.23:
+        fldcw     30(%esp)
+..B1.24:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.25:
+        testb     $2, 36(%esp)
+        je        ..B1.33
+..B1.26:
+        fld       %st(0)
+        testb     $2, %dl
+        fmul      %st(1), %st
+        fld       %st(0)
+        fmul      %st(1), %st
+        je        ..B1.30
+..B1.27:
+        fstp      %st(2)
+        fldt      84+_CP@GOTOFF(%edi)
+        testl     %ebx, %ebx
+        fmul      %st(2), %st
+        fldt      72+_CP@GOTOFF(%edi)
+        fmul      %st(3), %st
+        fldt      60+_CP@GOTOFF(%edi)
+        movl      32(%esp), %eax
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      48+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      36+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      24+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      12+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(3)
+        fldt      _CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        fldl      _ones@GOTOFF(%edi,%esi,8)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        fstpl     8(%eax)
+        je        ..B1.29
+..B1.28:
+        fldcw     30(%esp)
+..B1.29:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.30:
+        fldt      84+_SP@GOTOFF(%edi)
+        testl     %ebx, %ebx
+        fmul      %st(1), %st
+        fldt      72+_SP@GOTOFF(%edi)
+        fmul      %st(2), %st
+        fldt      60+_SP@GOTOFF(%edi)
+        movl      32(%esp), %eax
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      48+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      36+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      24+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      12+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(2)
+        fldt      _SP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(2)
+        faddp     %st, %st(1)
+        fldl      _ones@GOTOFF(%edi,%esi,8)
+        fmulp     %st, %st(2)
+        fmul      %st(1), %st
+        faddp     %st, %st(1)
+        fstpl     8(%eax)
+        je        ..B1.32
+..B1.31:
+        fldcw     30(%esp)
+..B1.32:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.33:
+        testb     $1, 36(%esp)
+        je        ..B1.41
+..B1.34:
+        fld       %st(0)
+        testb     $2, %dl
+        fmul      %st(1), %st
+        fld       %st(0)
+        fmul      %st(1), %st
+        je        ..B1.38
+..B1.35:
+        fldt      84+_SP@GOTOFF(%edi)
+        testl     %ebx, %ebx
+        fmul      %st(1), %st
+        fldt      72+_SP@GOTOFF(%edi)
+        fmul      %st(2), %st
+        fldt      60+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      48+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      36+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      24+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      12+_SP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(2)
+        fldt      _SP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(2)
+        faddp     %st, %st(1)
+        fldl      _ones@GOTOFF(%edi,%eax,8)
+        fmulp     %st, %st(2)
+        fmul      %st(1), %st
+        movl      32(%esp), %eax
+        faddp     %st, %st(1)
+        fstpl     (%eax)
+        je        ..B1.37
+..B1.36:
+        fldcw     30(%esp)
+..B1.37:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.38:
+        fstp      %st(2)
+        fldt      84+_CP@GOTOFF(%edi)
+        testl     %ebx, %ebx
+        fmul      %st(2), %st
+        fldt      72+_CP@GOTOFF(%edi)
+        fmul      %st(3), %st
+        fldt      60+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      48+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      36+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      24+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(3), %st
+        fldt      12+_CP@GOTOFF(%edi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(3)
+        fldt      _CP@GOTOFF(%edi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        fldl      _ones@GOTOFF(%edi,%eax,8)
+        fmul      %st, %st(1)
+        movl      32(%esp), %eax
+        faddp     %st, %st(1)
+        fstpl     (%eax)
+        je        ..B1.40
+..B1.39:
+        fldcw     30(%esp)
+..B1.40:
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.41:
+        fstp      %st(0)
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.42:
+        xorl      %ebx, %ebx
+        jmp       ..B1.8
+..B1.43:
+        xorl      %ebx, %ebx
+        jmp       ..B1.15
+        .align    16,0x90
+	.type	__libm_sincos_huge,@function
+	.size	__libm_sincos_huge,.-__libm_sincos_huge
+	.data
+# -- End  __libm_sincos_huge
+	.section .rodata, "a"
+	.align 16
+	.align 16
+.L_2il0floatpacket.0:
+	.long	0xffffffff,0x7fffffff,0x00000000,0x00000000
+	.type	.L_2il0floatpacket.0,@object
+	.size	.L_2il0floatpacket.0,16
+	.align 16
+_Pi4Inv:
+	.long	1841940611
+	.long	1072979760
+	.type	_Pi4Inv,@object
+	.size	_Pi4Inv,8
+	.space 8, 0x00 	# pad
+	.align 16
+_Pi4x3:
+	.long	1413754880
+	.long	3219726843
+	.long	993632256
+	.long	1027030475
+	.long	3773204808
+	.long	3129236486
+	.type	_Pi4x3,@object
+	.size	_Pi4x3,24
+	.space 8, 0x00 	# pad
+	.align 16
+_Pi4x4:
+	.long	1413480448
+	.long	3219726843
+	.long	442499072
+	.long	3183522913
+	.long	771751936
+	.long	3146979722
+	.long	622873025
+	.long	3110831002
+	.type	_Pi4x4,@object
+	.size	_Pi4x4,32
+	.align 16
+_SP:
+	.word	43691
+	.word	43690
+	.word	43690
+	.word	43690
+	.word	49148
+	.word	0
+	.word	34951
+	.word	34952
+	.word	34952
+	.word	34952
+	.word	16376
+	.word	0
+	.word	50471
+	.word	3328
+	.word	208
+	.word	53261
+	.word	49138
+	.word	0
+	.word	17910
+	.word	46614
+	.word	7466
+	.word	47343
+	.word	16364
+	.word	0
+	.word	33371
+	.word	14743
+	.word	11071
+	.word	55090
+	.word	49125
+	.word	0
+	.word	48947
+	.word	35764
+	.word	12250
+	.word	45202
+	.word	16350
+	.word	0
+	.word	17574
+	.word	60698
+	.word	10735
+	.word	55102
+	.word	49110
+	.word	0
+	.word	34320
+	.word	12415
+	.word	25249
+	.word	51489
+	.word	16334
+	.word	0
+	.type	_SP,@object
+	.size	_SP,96
+	.align 16
+_CP:
+	.word	0
+	.word	0
+	.word	0
+	.word	32768
+	.word	49150
+	.word	0
+	.word	43685
+	.word	43690
+	.word	43690
+	.word	43690
+	.word	16378
+	.word	0
+	.word	39983
+	.word	2912
+	.word	24758
+	.word	46603
+	.word	49141
+	.word	0
+	.word	61476
+	.word	3244
+	.word	208
+	.word	53261
+	.word	16367
+	.word	0
+	.word	1022
+	.word	16229
+	.word	32187
+	.word	37874
+	.word	49129
+	.word	0
+	.word	55373
+	.word	44526
+	.word	50840
+	.word	36726
+	.word	16354
+	.word	0
+	.word	55994
+	.word	65145
+	.word	59958
+	.word	51657
+	.word	49114
+	.word	0
+	.word	15046
+	.word	2976
+	.word	1998
+	.word	54661
+	.word	16338
+	.word	0
+	.type	_CP,@object
+	.size	_CP,96
+	.align 16
+_ones:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	3220176896
+	.type	_ones,@object
+	.size	_ones,16
+	.data
+	.hidden __libm_reduce_pi04l
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/libm_tancot_huge.S b/libm/x86/libm_tancot_huge.S
new file mode 100644
index 0000000..80f16d5
--- /dev/null
+++ b/libm/x86/libm_tancot_huge.S
@@ -0,0 +1,750 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+# -- Begin  __libm_tancot_huge
+	.text
+       .align    16,0x90
+	.hidden __libm_tancot_huge
+	.globl __libm_tancot_huge
+__libm_tancot_huge:
+# parameter 1: 8 + %ebp
+# parameter 2: 16 + %ebp
+# parameter 3: 20 + %ebp
+..B1.1:
+        pushl     %ebp
+        movl      %esp, %ebp
+        andl      $-64, %esp
+        pushl     %esi
+        pushl     %edi
+        pushl     %ebx
+        subl      $52, %esp
+        movl      16(%ebp), %eax
+        movl      20(%ebp), %ebx
+        movl      %eax, 40(%esp)
+..B1.2:
+        fnstcw    38(%esp)
+..B1.3:
+        movl      12(%ebp), %edx
+        movl      %edx, %eax
+        andl      $2147483647, %eax
+        shrl      $31, %edx
+        movl      %edx, 44(%esp)
+        cmpl      $1104150528, %eax
+        call      ..L2
+..L2:
+        popl      %esi
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%esi), %esi
+        jae       ..B1.11
+..B1.4:
+        movsd     8(%ebp), %xmm1
+        movzwl    38(%esp), %ecx
+        movl      %ecx, %edx
+        andl      $768, %edx
+        andps     .L_2il0floatpacket.0@GOTOFF(%esi), %xmm1
+        cmpl      $768, %edx
+        movsd     _Pi4Inv@GOTOFF(%esi), %xmm0
+        mulsd     %xmm1, %xmm0
+        movsd     %xmm1, 8(%ebp)
+        movsd     %xmm0, (%esp)
+        je        ..B1.39
+..B1.5:
+        orl       $-64768, %ecx
+        movw      %cx, 36(%esp)
+..B1.6:
+        fldcw     36(%esp)
+..B1.7:
+        movsd     8(%ebp), %xmm1
+        movl      $1, %edi
+..B1.8:
+        movl      %esi, 12(%esp)
+        movl      4(%esp), %esi
+        movl      %esi, %edx
+        movl      %edi, 24(%esp)
+        movl      %esi, %edi
+        shrl      $20, %edi
+        andl      $1048575, %edx
+        movl      %edi, %ecx
+        orl       $1048576, %edx
+        negl      %ecx
+        addl      $13, %edi
+        movl      %ebx, 8(%esp)
+        addl      $19, %ecx
+        movl      %edx, %ebx
+        movl      %ecx, 28(%esp)
+        shrl      %cl, %ebx
+        movl      %edi, %ecx
+        shll      %cl, %edx
+        movl      28(%esp), %ecx
+        movl      (%esp), %edi
+        shrl      %cl, %edi
+        orl       %edi, %edx
+        cmpl      $1094713344, %esi
+        movsd     %xmm1, 16(%esp)
+        fldl      16(%esp)
+        cmovb     %ebx, %edx
+        movl      24(%esp), %edi
+        movl      12(%esp), %esi
+        lea       1(%edx), %ebx
+        andl      $-2, %ebx
+        movl      %ebx, 16(%esp)
+        cmpl      $1094713344, %eax
+        fildl     16(%esp)
+        movl      8(%esp), %ebx
+        jae       ..B1.10
+..B1.9:
+        fldl      _Pi4x3@GOTOFF(%esi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      8+_Pi4x3@GOTOFF(%esi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      16+_Pi4x3@GOTOFF(%esi)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        jmp       ..B1.17
+..B1.10:
+        fldl      _Pi4x4@GOTOFF(%esi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      8+_Pi4x4@GOTOFF(%esi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      16+_Pi4x4@GOTOFF(%esi)
+        fmul      %st(1), %st
+        faddp     %st, %st(2)
+        fldl      24+_Pi4x4@GOTOFF(%esi)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        jmp       ..B1.17
+..B1.11:
+        movzwl    38(%esp), %edx
+        movl      %edx, %eax
+        andl      $768, %eax
+        cmpl      $768, %eax
+        je        ..B1.40
+..B1.12:
+        orl       $-64768, %edx
+        movw      %dx, 36(%esp)
+..B1.13:
+        fldcw     36(%esp)
+..B1.14:
+        movl      $1, %edi
+..B1.15:
+        movsd     8(%ebp), %xmm0
+        addl      $-32, %esp
+        andps     .L_2il0floatpacket.0@GOTOFF(%esi), %xmm0
+        lea       32(%esp), %eax
+        movsd     %xmm0, 16(%eax)
+        fldl      16(%eax)
+        fstpt     (%esp)
+        movl      $0, 12(%esp)
+        movl      %eax, 16(%esp)
+        call      __libm_reduce_pi04l
+..B1.43:
+        movl      %eax, %edx
+        addl      $32, %esp
+..B1.16:
+        fldl      (%esp)
+        fldl      8(%esp)
+        faddp     %st, %st(1)
+..B1.17:
+        movl      %ebx, %eax
+        andl      $3, %eax
+        cmpl      $3, %eax
+        jne       ..B1.24
+..B1.18:
+        fldl      _ones@GOTOFF(%esi)
+        incl      %edx
+        fdiv      %st(1), %st
+        testb     $2, %dl
+        fstpt     24(%esp)
+        fld       %st(0)
+        fmul      %st(1), %st
+        fld       %st(0)
+        fmul      %st(1), %st
+        fldt      36+_TP@GOTOFF(%esi)
+        fmul      %st(2), %st
+        fldt      24+_TP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      12+_TP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      36+_TQ@GOTOFF(%esi)
+        fmul      %st(3), %st
+        fldt      24+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(3), %st
+        fldt      12+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(3), %st
+        fldt      _TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fldt      _TP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fldt      132+_GP@GOTOFF(%esi)
+        fmul      %st(3), %st
+        fldt      120+_GP@GOTOFF(%esi)
+        fmul      %st(4), %st
+        fldt      108+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      96+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      84+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      72+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      60+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      48+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      36+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(4), %st
+        fldt      24+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(4)
+        fldt      12+_GP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(4), %st
+        fmul      %st(5), %st
+        fldt      _GP@GOTOFF(%esi)
+        faddp     %st, %st(4)
+        fxch      %st(3)
+        fmul      %st(5), %st
+        faddp     %st, %st(3)
+        je        ..B1.20
+..B1.19:
+        fldt      24(%esp)
+        fxch      %st(1)
+        fdivrp    %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(3)
+        movl      44(%esp), %eax
+        xorl      $1, %eax
+        fxch      %st(2)
+        fmul      %st(3), %st
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(2)
+        fmul      %st, %st(3)
+        fxch      %st(3)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fstpl     16(%esp)
+        fmul      %st(1), %st
+        fxch      %st(1)
+        fmulp     %st, %st(2)
+        movsd     16(%esp), %xmm0
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm1
+        jmp       ..B1.21
+..B1.20:
+        fdivrp    %st, %st(1)
+        fmulp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        movl      44(%esp), %eax
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(1)
+        fmul      %st, %st(3)
+        fxch      %st(3)
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        fmul      %st(1), %st
+        fldt      24(%esp)
+        fmulp     %st, %st(2)
+        movsd     16(%esp), %xmm0
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm1
+..B1.21:
+        testl     %edi, %edi
+        je        ..B1.23
+..B1.22:
+        fldcw     38(%esp)
+..B1.23:
+        movl      40(%esp), %eax
+        movsd     %xmm0, (%eax)
+        movsd     %xmm1, 8(%eax)
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.24:
+        testb     $2, %bl
+        je        ..B1.31
+..B1.25:
+        incl      %edx
+        fld       %st(0)
+        fmul      %st(1), %st
+        testb     $2, %dl
+        je        ..B1.27
+..B1.26:
+        fldl      _ones@GOTOFF(%esi)
+        fdiv      %st(2), %st
+        fld       %st(1)
+        fmul      %st(2), %st
+        fldt      132+_GP@GOTOFF(%esi)
+        fmul      %st(1), %st
+        fldt      120+_GP@GOTOFF(%esi)
+        fmul      %st(2), %st
+        fldt      108+_GP@GOTOFF(%esi)
+        movl      44(%esp), %eax
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        xorl      $1, %eax
+        fldt      96+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      84+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      72+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      60+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      48+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      36+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      24+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(2)
+        fldt      12+_GP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(3)
+        fldt      _GP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(3), %st
+        fxch      %st(2)
+        fmulp     %st, %st(3)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(2)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm0
+        jmp       ..B1.28
+..B1.27:
+        fldt      36+_TP@GOTOFF(%esi)
+        fmul      %st(1), %st
+        fldt      24+_TP@GOTOFF(%esi)
+        movl      44(%esp), %eax
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        fldt      36+_TQ@GOTOFF(%esi)
+        fmul      %st(2), %st
+        fldt      24+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      12+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      _TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fldt      12+_TP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      _TP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fdivp     %st, %st(1)
+        fmulp     %st, %st(1)
+        fmul      %st(1), %st
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(1)
+        fmulp     %st, %st(2)
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm0
+..B1.28:
+        testl     %edi, %edi
+        je        ..B1.30
+..B1.29:
+        fldcw     38(%esp)
+..B1.30:
+        movl      40(%esp), %eax
+        movsd     %xmm0, (%eax)
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.31:
+        testb     $1, %bl
+        je        ..B1.38
+..B1.32:
+        incl      %edx
+        fld       %st(0)
+        fmul      %st(1), %st
+        testb     $2, %dl
+        je        ..B1.34
+..B1.33:
+        fldt      36+_TP@GOTOFF(%esi)
+        fmul      %st(1), %st
+        fldt      24+_TP@GOTOFF(%esi)
+        movl      44(%esp), %eax
+        faddp     %st, %st(1)
+        fmul      %st(1), %st
+        xorl      $1, %eax
+        fldt      36+_TQ@GOTOFF(%esi)
+        fmul      %st(2), %st
+        fldt      24+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      12+_TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(2), %st
+        fldt      _TQ@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fldt      12+_TP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      _TP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fdivp     %st, %st(1)
+        fmulp     %st, %st(1)
+        fmul      %st(1), %st
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(1)
+        fmulp     %st, %st(2)
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm0
+        jmp       ..B1.35
+..B1.34:
+        fldl      _ones@GOTOFF(%esi)
+        fdiv      %st(2), %st
+        fld       %st(1)
+        fmul      %st(2), %st
+        fldt      132+_GP@GOTOFF(%esi)
+        fmul      %st(1), %st
+        fldt      120+_GP@GOTOFF(%esi)
+        fmul      %st(2), %st
+        fldt      108+_GP@GOTOFF(%esi)
+        movl      44(%esp), %eax
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      96+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      84+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      72+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      60+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      48+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      36+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmul      %st(2), %st
+        fldt      24+_GP@GOTOFF(%esi)
+        faddp     %st, %st(2)
+        fxch      %st(1)
+        fmulp     %st, %st(2)
+        fldt      12+_GP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmulp     %st, %st(3)
+        fldt      _GP@GOTOFF(%esi)
+        faddp     %st, %st(1)
+        fmul      %st(3), %st
+        fxch      %st(2)
+        fmulp     %st, %st(3)
+        fxch      %st(1)
+        faddp     %st, %st(2)
+        fldl      _ones@GOTOFF(%esi,%eax,8)
+        fmul      %st, %st(2)
+        fmulp     %st, %st(1)
+        faddp     %st, %st(1)
+        fstpl     16(%esp)
+        movsd     16(%esp), %xmm0
+..B1.35:
+        testl     %edi, %edi
+        je        ..B1.37
+..B1.36:
+        fldcw     38(%esp)
+..B1.37:
+        movl      40(%esp), %eax
+        movsd     %xmm0, 8(%eax)
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.38:
+        fstp      %st(0)
+        addl      $52, %esp
+        popl      %ebx
+        popl      %edi
+        popl      %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B1.39:
+        xorl      %edi, %edi
+        jmp       ..B1.8
+..B1.40:
+        xorl      %edi, %edi
+        jmp       ..B1.15
+        .align    16,0x90
+	.type	__libm_tancot_huge,@function
+	.size	__libm_tancot_huge,.-__libm_tancot_huge
+	.data
+# -- End  __libm_tancot_huge
+	.section .rodata, "a"
+	.align 16
+	.align 16
+.L_2il0floatpacket.0:
+	.long	0xffffffff,0x7fffffff,0x00000000,0x00000000
+	.type	.L_2il0floatpacket.0,@object
+	.size	.L_2il0floatpacket.0,16
+	.align 16
+_Pi4Inv:
+	.long	1841940611
+	.long	1072979760
+	.type	_Pi4Inv,@object
+	.size	_Pi4Inv,8
+	.space 8, 0x00 	# pad
+	.align 16
+_Pi4x3:
+	.long	1413754880
+	.long	3219726843
+	.long	993632256
+	.long	1027030475
+	.long	3773204808
+	.long	3129236486
+	.type	_Pi4x3,@object
+	.size	_Pi4x3,24
+	.space 8, 0x00 	# pad
+	.align 16
+_Pi4x4:
+	.long	1413480448
+	.long	3219726843
+	.long	442499072
+	.long	3183522913
+	.long	771751936
+	.long	3146979722
+	.long	622873025
+	.long	3110831002
+	.type	_Pi4x4,@object
+	.size	_Pi4x4,32
+	.align 16
+_ones:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	3220176896
+	.type	_ones,@object
+	.size	_ones,16
+	.align 16
+_TP:
+	.word	19670
+	.word	44908
+	.word	50960
+	.word	50786
+	.word	49149
+	.word	0
+	.word	19206
+	.word	45228
+	.word	54194
+	.word	52268
+	.word	16377
+	.word	0
+	.word	227
+	.word	51280
+	.word	43560
+	.word	38195
+	.word	49139
+	.word	0
+	.word	12272
+	.word	18029
+	.word	6715
+	.word	45670
+	.word	16357
+	.word	0
+	.type	_TP,@object
+	.size	_TP,48
+	.align 16
+_TQ:
+	.word	14748
+	.word	33681
+	.word	5452
+	.word	38090
+	.word	49151
+	.word	0
+	.word	46755
+	.word	50026
+	.word	17634
+	.word	35372
+	.word	16382
+	.word	0
+	.word	46863
+	.word	53352
+	.word	42702
+	.word	59869
+	.word	49145
+	.word	0
+	.word	33295
+	.word	20942
+	.word	32118
+	.word	39935
+	.word	16371
+	.word	0
+	.type	_TQ,@object
+	.size	_TQ,48
+	.align 16
+_GP:
+	.word	43691
+	.word	43690
+	.word	43690
+	.word	43690
+	.word	49149
+	.word	0
+	.word	46639
+	.word	2912
+	.word	24758
+	.word	46603
+	.word	49145
+	.word	0
+	.word	57255
+	.word	2218
+	.word	21984
+	.word	35507
+	.word	49142
+	.word	0
+	.word	34208
+	.word	43033
+	.word	48281
+	.word	56811
+	.word	49138
+	.word	0
+	.word	28773
+	.word	27191
+	.word	31071
+	.word	45908
+	.word	49135
+	.word	0
+	.word	43257
+	.word	33777
+	.word	11976
+	.word	37184
+	.word	49132
+	.word	0
+	.word	62410
+	.word	35990
+	.word	36363
+	.word	60269
+	.word	49128
+	.word	0
+	.word	13659
+	.word	55568
+	.word	26569
+	.word	48851
+	.word	49125
+	.word	0
+	.word	10347
+	.word	46238
+	.word	47188
+	.word	39576
+	.word	49122
+	.word	0
+	.word	2161
+	.word	6703
+	.word	25719
+	.word	64708
+	.word	49118
+	.word	0
+	.word	42329
+	.word	7593
+	.word	44754
+	.word	47734
+	.word	49115
+	.word	0
+	.word	163
+	.word	32746
+	.word	39875
+	.word	61957
+	.word	49112
+	.word	0
+	.type	_GP,@object
+	.size	_GP,144
+	.data
+	.hidden __libm_reduce_pi04l
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/lrint.S b/libm/x86/lrint.S
new file mode 100644
index 0000000..48d71dd
--- /dev/null
+++ b/libm/x86/lrint.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrint)
+  // LP32 sizeof(long) == 4.
+  movsd     0x4(%esp),%xmm0
+  cvtsd2si  %xmm0, %eax
+  ret
+END(lrint)
+
+// LP32 sizeof(long double) == sizeof(double).
+ALIAS_SYMBOL(lrintl, lrint);
diff --git a/libm/x86/lrintf.S b/libm/x86/lrintf.S
new file mode 100644
index 0000000..bc8fcb3
--- /dev/null
+++ b/libm/x86/lrintf.S
@@ -0,0 +1,33 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrintf)
+  // LP32 sizeof(long) == 4.
+  movss     0x4(%esp),%xmm0
+  cvtss2si  %xmm0, %eax
+  ret
+END(lrintf)
diff --git a/libm/x86/rint.S b/libm/x86/rint.S
new file mode 100644
index 0000000..85635f2
--- /dev/null
+++ b/libm/x86/rint.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rint)
+  subl    $12,%esp
+  movsd   16(%esp),%xmm0
+  roundsd $4,%xmm0,%xmm0
+  movsd   %xmm0,(%esp)
+  fldl    (%esp)
+  addl    $12,%esp
+  ret
+END(rint)
+
+// LP32 sizeof(long double) == sizeof(double).
+ALIAS_SYMBOL(rintl, rint);
diff --git a/libm/x86/rintf.S b/libm/x86/rintf.S
new file mode 100644
index 0000000..9f82400
--- /dev/null
+++ b/libm/x86/rintf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rintf)
+  subl    $12,%esp
+  movss   16(%esp),%xmm0
+  roundss $4,%xmm0,%xmm0
+  movss   %xmm0,(%esp)
+  flds    (%esp)
+  add     $12,%esp
+  ret
+END(rintf)
diff --git a/libm/x86/s_atan.S b/libm/x86/s_atan.S
new file mode 100644
index 0000000..c4413f1
--- /dev/null
+++ b/libm/x86/s_atan.S
@@ -0,0 +1,934 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// This implementation uses the main path for |x| in [2^{-5},2^65).
+// For |x| in [2^{-64},2^{-5}), a secondary path is used.
+// For the biased exponent of X within 3FFH-64 and 3FF+64, we use one branch.
+// We use the following definition of B and X` so that the formula
+// atan(X) = Tau + atan( (X`-B) / (One + BX) ) is correct
+//
+// X = (-1)^s * 2^k * 1. x1 x2 ... x52
+//
+// Define X`  = 0 if k >= 5; and X`  = |X| otherwise
+// Define One = 0 if k >= 5; and One = 1 otherwise
+// Define B  = 0 if k <= -6; B =  2^k * 1.x1 x2 x3 x4 1  if -5 <= k <= 4
+// Define B  =  2^5 * 1.0 0 ... 0   if  k >= 5
+//
+// Tau is 0 if k <= -6;
+// Tau is atan( B )  if -5 <= k <= 4
+// Tau is pi/2 if k >= 5
+//
+// Special cases:
+//  atan(NaN) = quiet NaN
+//  atan(+/-INF) = +/-Pi/2
+//  atan(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  atan
+ENTRY(atan)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 48(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        movsd     2640(%ebx), %xmm3
+        movsd     2624(%ebx), %xmm5
+        movsd     2656(%ebx), %xmm4
+        movsd     %xmm0, 8(%esp)
+        pextrw    $3, %xmm0, %edx
+        andpd     %xmm0, %xmm3
+        pshufd    $68, %xmm0, %xmm1
+        orpd      %xmm4, %xmm3
+        movl      %edx, %eax
+        andl      $32767, %edx
+        subl      $16288, %edx
+        cmpl      $159, %edx
+        ja        .L_2TAG_PACKET_0.0.2
+        mulsd     %xmm3, %xmm1
+        subsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm1
+        divsd     %xmm1, %xmm0
+        addl      $1, %edx
+        movsd     2672(%ebx), %xmm2
+        movsd     2688(%ebx), %xmm4
+        andl      $32768, %eax
+        xorpd     %xmm7, %xmm7
+        pinsrw    $3, %eax, %xmm7
+        addl      %edx, %edx
+        movsd     (%ebx,%edx,8), %xmm6
+        movsd     8(%ebx,%edx,8), %xmm5
+        xorpd     %xmm7, %xmm5
+        xorpd     %xmm7, %xmm6
+        movsd     2680(%ebx), %xmm7
+        pshufd    $68, %xmm0, %xmm1
+        mulsd     %xmm0, %xmm0
+        pshufd    $68, %xmm1, %xmm3
+        addsd     %xmm6, %xmm1
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm4
+        subsd     %xmm1, %xmm6
+        mulsd     %xmm0, %xmm4
+        addsd     %xmm7, %xmm2
+        mulsd     %xmm3, %xmm0
+        addsd     %xmm3, %xmm6
+        mulsd     %xmm2, %xmm0
+        addsd     2696(%ebx), %xmm4
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm6, %xmm0
+        addsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        addl      $944, %edx
+        cmpl      $1103, %edx
+        ja        .L_2TAG_PACKET_2.0.2
+        movsd     2672(%ebx), %xmm4
+        movsd     2688(%ebx), %xmm7
+        movsd     8(%esp), %xmm0
+        mulsd     %xmm1, %xmm1
+        movsd     2680(%ebx), %xmm2
+        movsd     2696(%ebx), %xmm5
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm1, %xmm7
+        movapd    %xmm1, %xmm6
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm4, %xmm2
+        mulsd     %xmm6, %xmm7
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm7, %xmm2
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        addl      $15344, %edx
+        cmpl      $16368, %edx
+        ja        .L_2TAG_PACKET_3.0.2
+        movsd     8(%esp), %xmm0
+        movsd     8(%esp), %xmm1
+        cmpl      $16, %edx
+        jae       .L_2TAG_PACKET_4.0.2
+        mulsd     %xmm0, %xmm1
+.L_2TAG_PACKET_4.0.2:
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_3.0.2:
+        cmpl      $17392, %edx
+        jae       .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm1, %xmm1
+        movl      $49136, %ecx
+        pinsrw    $3, %ecx, %xmm1
+        divsd     %xmm0, %xmm1
+        movsd     2672(%ebx), %xmm2
+        movsd     2688(%ebx), %xmm4
+        andl      $32768, %eax
+        xorpd     %xmm7, %xmm7
+        pinsrw    $3, %eax, %xmm7
+        addl      %edx, %edx
+        movsd     2592(%ebx), %xmm6
+        movsd     2600(%ebx), %xmm5
+        xorpd     %xmm7, %xmm5
+        xorpd     %xmm7, %xmm6
+        movsd     2680(%ebx), %xmm7
+        pshufd    $68, %xmm1, %xmm0
+        mulsd     %xmm1, %xmm1
+        pshufd    $68, %xmm0, %xmm3
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm1, %xmm4
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm7, %xmm2
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm3, %xmm6
+        mulsd     %xmm2, %xmm1
+        addsd     2696(%ebx), %xmm4
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm4, %xmm1
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_5.0.2:
+        movsd     8(%esp), %xmm4
+        movsd     2608(%ebx), %xmm0
+        movsd     2592(%ebx), %xmm2
+        movsd     2600(%ebx), %xmm3
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        andl      $2147483647, %edx
+        cmpl      $2146435072, %edx
+        jae       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_7.0.2:
+        andnpd    %xmm4, %xmm0
+        orpd      %xmm0, %xmm2
+        orpd      %xmm3, %xmm0
+        addsd     %xmm2, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_6.0.2:
+        subl      $2146435072, %edx
+        orl       %edx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_7.0.2
+        movapd    %xmm4, %xmm0
+        addsd     %xmm0, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+.L_2TAG_PACKET_1.0.2:
+        movl      48(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(atan)
+# -- End  atan
+
+# Start file scope ASM
+ALIAS_SYMBOL(atanl, atan);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3819695742
+	.long	1067482761
+	.long	2398680355
+	.long	3155462074
+	.long	2998791009
+	.long	1067548225
+	.long	3868465248
+	.long	3157182472
+	.long	3339424991
+	.long	1067613680
+	.long	3296670360
+	.long	1010752543
+	.long	2710002256
+	.long	1067679126
+	.long	3403896007
+	.long	1010910768
+	.long	3275701428
+	.long	1067744562
+	.long	119959933
+	.long	1011482843
+	.long	2908636881
+	.long	1067809988
+	.long	2464489612
+	.long	1011545526
+	.long	3777889398
+	.long	1067875403
+	.long	3262682165
+	.long	1009703919
+	.long	3759667419
+	.long	1067940807
+	.long	1838130851
+	.long	3157373556
+	.long	732369940
+	.long	1068006200
+	.long	1203428313
+	.long	1010055371
+	.long	1166616461
+	.long	1068071580
+	.long	2901274051
+	.long	3158549977
+	.long	2945472892
+	.long	1068136947
+	.long	3726120658
+	.long	1009762715
+	.long	3954480976
+	.long	1068202301
+	.long	1289173457
+	.long	1009429861
+	.long	2081752829
+	.long	1068267642
+	.long	1836909874
+	.long	1006212095
+	.long	3807999788
+	.long	1068332968
+	.long	2172459940
+	.long	3156162078
+	.long	2731789884
+	.long	1068398280
+	.long	3450718392
+	.long	3159216547
+	.long	1044477961
+	.long	1068463577
+	.long	2230553229
+	.long	1011424339
+	.long	1486930287
+	.long	1068530218
+	.long	2861547474
+	.long	1012041376
+	.long	2293016881
+	.long	1068595466
+	.long	136843272
+	.long	1012684797
+	.long	201518157
+	.long	1068660680
+	.long	63231984
+	.long	1012427198
+	.long	4054234584
+	.long	1068725856
+	.long	3927006960
+	.long	1011878955
+	.long	1246477213
+	.long	1068790995
+	.long	1494265652
+	.long	3155219350
+	.long	678186699
+	.long	1068856093
+	.long	1264361424
+	.long	3159256693
+	.long	2690594995
+	.long	1068921148
+	.long	3906996379
+	.long	1009288267
+	.long	3362611517
+	.long	1068986159
+	.long	1650970041
+	.long	3158331771
+	.long	3102162111
+	.long	1069051124
+	.long	365917035
+	.long	3160264153
+	.long	2352611067
+	.long	1069116041
+	.long	4008970190
+	.long	3159478182
+	.long	1594134794
+	.long	1069180908
+	.long	466690178
+	.long	1012526501
+	.long	1345079306
+	.long	1069245723
+	.long	2268273568
+	.long	3160164092
+	.long	2163300970
+	.long	1069310484
+	.long	2750834800
+	.long	3158113482
+	.long	352522716
+	.long	1069375190
+	.long	1750411372
+	.long	1011790845
+	.long	848541647
+	.long	1069439838
+	.long	2164207573
+	.long	1011698350
+	.long	40647312
+	.long	1069504427
+	.long	2949165434
+	.long	3159107267
+	.long	2216766270
+	.long	1069574357
+	.long	2197920765
+	.long	3161055954
+	.long	1090914384
+	.long	1069638757
+	.long	2330454674
+	.long	1013365998
+	.long	387601244
+	.long	1069703022
+	.long	3185681168
+	.long	1013434071
+	.long	3991640484
+	.long	1069767144
+	.long	1313211590
+	.long	3161087959
+	.long	3322489502
+	.long	1069831118
+	.long	3013977995
+	.long	1013053011
+	.long	3121698570
+	.long	1069894936
+	.long	4069015667
+	.long	1013023362
+	.long	4289964660
+	.long	1069958591
+	.long	1736191156
+	.long	3158266731
+	.long	3903312386
+	.long	1070022077
+	.long	1833592413
+	.long	3159731471
+	.long	3818449864
+	.long	1070085387
+	.long	851036429
+	.long	3159730451
+	.long	2097480306
+	.long	1070148515
+	.long	3506390884
+	.long	3160462302
+	.long	1611694502
+	.long	1070211454
+	.long	2785735540
+	.long	3160465144
+	.long	1464694796
+	.long	1070274198
+	.long	4229277299
+	.long	3159907000
+	.long	1299612775
+	.long	1070336741
+	.long	4116653788
+	.long	3160427739
+	.long	1310544789
+	.long	1070399077
+	.long	1064430331
+	.long	1013218202
+	.long	2253168030
+	.long	1070461200
+	.long	1405044609
+	.long	3157623179
+	.long	1159567373
+	.long	1070523105
+	.long	2353445521
+	.long	3159992176
+	.long	1359373750
+	.long	1070605818
+	.long	1748171336
+	.long	3161879263
+	.long	908341706
+	.long	1070667034
+	.long	3372710815
+	.long	3161775245
+	.long	1743027350
+	.long	1070727765
+	.long	687089934
+	.long	3160507171
+	.long	2055355646
+	.long	1070787992
+	.long	2392855242
+	.long	1013682469
+	.long	690426164
+	.long	1070847697
+	.long	1103926666
+	.long	1014052810
+	.long	1483247847
+	.long	1070906862
+	.long	2082645847
+	.long	3161345479
+	.long	392040270
+	.long	1070965472
+	.long	2407720023
+	.long	1014053754
+	.long	2673846014
+	.long	1071023511
+	.long	1293605532
+	.long	3158464385
+	.long	1384215810
+	.long	1071080967
+	.long	2446095872
+	.long	3159216407
+	.long	3101660631
+	.long	1071137826
+	.long	698040758
+	.long	1014855328
+	.long	2094057058
+	.long	1071194078
+	.long	2282048339
+	.long	1014040385
+	.long	1712750594
+	.long	1071249712
+	.long	1204372378
+	.long	3162276464
+	.long	1411515787
+	.long	1071304719
+	.long	949080808
+	.long	1015006403
+	.long	931538085
+	.long	1071359091
+	.long	3027127039
+	.long	1014307233
+	.long	179139065
+	.long	1071412821
+	.long	4285547492
+	.long	3161934731
+	.long	3387721259
+	.long	1071465902
+	.long	373225773
+	.long	1013486625
+	.long	2132236852
+	.long	1071544299
+	.long	3250533429
+	.long	1014031677
+	.long	1942070284
+	.long	1071645596
+	.long	1237964179
+	.long	3163239113
+	.long	1532707802
+	.long	1071695380
+	.long	330645583
+	.long	1012495610
+	.long	2294184979
+	.long	1071743834
+	.long	3959472897
+	.long	1015833116
+	.long	3805060714
+	.long	1071790961
+	.long	2671256142
+	.long	1013727772
+	.long	2215037898
+	.long	1071836770
+	.long	2683359117
+	.long	1015831902
+	.long	483661594
+	.long	1071881273
+	.long	836288326
+	.long	3162648643
+	.long	1534679894
+	.long	1071924486
+	.long	373258696
+	.long	3162470096
+	.long	1538714628
+	.long	1071966430
+	.long	3199433068
+	.long	1015325501
+	.long	527642555
+	.long	1072007128
+	.long	3636832592
+	.long	3161843145
+	.long	291339150
+	.long	1072046605
+	.long	890169537
+	.long	3160586117
+	.long	2450210201
+	.long	1072084888
+	.long	1636353294
+	.long	3163193400
+	.long	2411367951
+	.long	1072122007
+	.long	374899873
+	.long	1011331750
+	.long	681549971
+	.long	1072157992
+	.long	506411689
+	.long	1015373954
+	.long	1466745541
+	.long	1072192873
+	.long	2143860931
+	.long	1013364334
+	.long	2845622366
+	.long	1072226682
+	.long	2869178209
+	.long	3162423682
+	.long	2838871438
+	.long	1072275456
+	.long	3742223599
+	.long	1014338577
+	.long	4200275274
+	.long	1072337034
+	.long	1566539915
+	.long	3161839550
+	.long	3034733530
+	.long	1072394897
+	.long	652621408
+	.long	3162261964
+	.long	3207412993
+	.long	1072449290
+	.long	3206124665
+	.long	1014408733
+	.long	624461478
+	.long	1072500450
+	.long	932437485
+	.long	1015204343
+	.long	767665908
+	.long	1072548600
+	.long	1037911952
+	.long	3163527627
+	.long	1110773639
+	.long	1072593952
+	.long	2371517912
+	.long	3160465741
+	.long	1940828530
+	.long	1072636704
+	.long	2731408428
+	.long	3162895795
+	.long	1911329388
+	.long	1072677041
+	.long	1773089615
+	.long	3159569267
+	.long	1764715788
+	.long	1072704191
+	.long	691346949
+	.long	3164069946
+	.long	3332979233
+	.long	1072722195
+	.long	3550733983
+	.long	1014770628
+	.long	1321870254
+	.long	1072739231
+	.long	1415315820
+	.long	1016224052
+	.long	3657429030
+	.long	1072755365
+	.long	3910539033
+	.long	1015966402
+	.long	4197624557
+	.long	1072770661
+	.long	2333399254
+	.long	3164546480
+	.long	1512059493
+	.long	1072785177
+	.long	2701510318
+	.long	1016178092
+	.long	453379037
+	.long	1072798965
+	.long	4046344253
+	.long	3162814364
+	.long	1942345162
+	.long	1072818388
+	.long	621134147
+	.long	1016335195
+	.long	4210176273
+	.long	1072842164
+	.long	2701013387
+	.long	3164326619
+	.long	4185644010
+	.long	1072863795
+	.long	4163699341
+	.long	1016203112
+	.long	679688788
+	.long	1072883543
+	.long	4147276762
+	.long	1014066750
+	.long	29432865
+	.long	1072901630
+	.long	970415797
+	.long	1016902063
+	.long	4070721092
+	.long	1072918247
+	.long	2539004411
+	.long	3163736096
+	.long	2252468843
+	.long	1072933561
+	.long	3424082887
+	.long	3163407177
+	.long	2929724825
+	.long	1072947712
+	.long	3661482235
+	.long	3163846989
+	.long	1377513368
+	.long	1072960824
+	.long	3987926680
+	.long	1013647908
+	.long	1031632908
+	.long	1072973003
+	.long	3672217151
+	.long	1016614619
+	.long	2516508130
+	.long	1072984342
+	.long	545855020
+	.long	3162728930
+	.long	3792452178
+	.long	1072994923
+	.long	3420119467
+	.long	1016471430
+	.long	3147791459
+	.long	1073004818
+	.long	1342204979
+	.long	1013937254
+	.long	999189752
+	.long	1073014090
+	.long	1006335472
+	.long	3162850919
+	.long	711011011
+	.long	1073022794
+	.long	4633488
+	.long	3162966895
+	.long	15640363
+	.long	1073030980
+	.long	1686389560
+	.long	3164376226
+	.long	1218463589
+	.long	1073042382
+	.long	1526837110
+	.long	3163533985
+	.long	2538470555
+	.long	1073056144
+	.long	2273304406
+	.long	3163784996
+	.long	1229720947
+	.long	1073068489
+	.long	2971628206
+	.long	3162356540
+	.long	3115427016
+	.long	1073079621
+	.long	4215132957
+	.long	3164282762
+	.long	4030612557
+	.long	1073089709
+	.long	1913251691
+	.long	3163671292
+	.long	2728521257
+	.long	1073098892
+	.long	2861089500
+	.long	1015454459
+	.long	1118696283
+	.long	1073107285
+	.long	1628948053
+	.long	1016179658
+	.long	2682711255
+	.long	1073114984
+	.long	2906306266
+	.long	1014142643
+	.long	2073898081
+	.long	1073122072
+	.long	1322740454
+	.long	3164497217
+	.long	1403700297
+	.long	1073128618
+	.long	416137895
+	.long	3162781466
+	.long	2502685617
+	.long	1073134681
+	.long	3242008732
+	.long	1014593495
+	.long	1531926851
+	.long	1073140313
+	.long	1362708094
+	.long	1016517604
+	.long	3572814411
+	.long	1073145557
+	.long	3709790527
+	.long	1012646874
+	.long	1695536111
+	.long	1073150453
+	.long	3980346340
+	.long	1016705136
+	.long	2363057203
+	.long	1073155033
+	.long	2551194792
+	.long	1012569695
+	.long	2873365682
+	.long	1073159327
+	.long	3181154748
+	.long	1017041450
+	.long	1053384691
+	.long	1073165288
+	.long	3074536879
+	.long	1016965660
+	.long	3270542712
+	.long	1073172451
+	.long	2535319415
+	.long	3163051778
+	.long	1353631484
+	.long	1073178850
+	.long	1173833755
+	.long	1015534537
+	.long	3511218460
+	.long	1073184599
+	.long	1243608109
+	.long	3161592122
+	.long	4121259284
+	.long	1073189793
+	.long	398584912
+	.long	3163829923
+	.long	1193862106
+	.long	1073194509
+	.long	1873745539
+	.long	3163802819
+	.long	3861949790
+	.long	1073198808
+	.long	3841261147
+	.long	1015587248
+	.long	1486904578
+	.long	1073202745
+	.long	1634726776
+	.long	3163847886
+	.long	2879153715
+	.long	1073206362
+	.long	200456242
+	.long	3164138657
+	.long	385353253
+	.long	1073209698
+	.long	1186355517
+	.long	1014887155
+	.long	1125865839
+	.long	1073212783
+	.long	203561262
+	.long	3161244927
+	.long	1221361475
+	.long	1073215645
+	.long	3382476563
+	.long	1014936138
+	.long	2077323573
+	.long	1073218307
+	.long	1005121005
+	.long	3164430752
+	.long	215611373
+	.long	1073220790
+	.long	353198764
+	.long	3164485137
+	.long	2347419265
+	.long	1073223110
+	.long	1103143360
+	.long	1016542137
+	.long	1379112765
+	.long	1073225284
+	.long	381583533
+	.long	3162870833
+	.long	3891198463
+	.long	1073228298
+	.long	1771275754
+	.long	1014654681
+	.long	3395914051
+	.long	1073231917
+	.long	2350900914
+	.long	3164013978
+	.long	2799919478
+	.long	1073235146
+	.long	2893950164
+	.long	3163260901
+	.long	1138673476
+	.long	1073238045
+	.long	2622204785
+	.long	3164174388
+	.long	3408855940
+	.long	1073240661
+	.long	2800881650
+	.long	1016008624
+	.long	2044858738
+	.long	1073243035
+	.long	604544785
+	.long	1017022901
+	.long	2578795176
+	.long	1073245198
+	.long	2557332925
+	.long	1016135165
+	.long	4196285314
+	.long	1073247177
+	.long	2032365307
+	.long	1016194735
+	.long	224877747
+	.long	1073248996
+	.long	497926916
+	.long	1016947111
+	.long	3271386490
+	.long	1073250671
+	.long	2689994846
+	.long	1016631513
+	.long	813635989
+	.long	1073252221
+	.long	747035277
+	.long	3164530136
+	.long	369829519
+	.long	1073253658
+	.long	2182033858
+	.long	3163190340
+	.long	1187679052
+	.long	1073254994
+	.long	673954443
+	.long	1016149821
+	.long	4232586098
+	.long	1073256239
+	.long	497775200
+	.long	3162179015
+	.long	426690558
+	.long	1073257404
+	.long	3063343247
+	.long	1016865578
+	.long	1624065902
+	.long	1073258494
+	.long	1354224996
+	.long	3163503778
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	4294901760
+	.long	0
+	.long	0
+	.long	0
+	.long	32768
+	.long	0
+	.long	0
+	.long	2006262985
+	.long	1069310863
+	.long	2358449471
+	.long	3217342131
+	.long	3845454352
+	.long	1069952297
+	.long	2829679149
+	.long	1073771565
+	.type	static_const_table,@object
+	.size	static_const_table,2704
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_cbrt.S b/libm/x86/s_cbrt.S
new file mode 100644
index 0000000..0c98c99
--- /dev/null
+++ b/libm/x86/s_cbrt.S
@@ -0,0 +1,738 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//   Assume x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52, where j = 0,1,2.
+//   Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
+//   where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in double precision
+//   cbrt(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
+//   (T stores the high 53 bits, D stores the low order bits)
+//   Result=2^k*T+(2^k*T*r)*P+2^k*D
+//   where P=p1+p2*r+..+p8*r^7
+//
+// Special cases:
+//  cbrt(NaN) = quiet NaN, and raise invalid exception
+//  cbrt(INF) = that INF
+//  cbrt(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  cbrt
+ENTRY(cbrt)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %esi, 52(%esp)
+        call      static_func
+        movl      %eax, %esi
+        movsd     128(%esp), %xmm0
+        movapd    %xmm0, %xmm7
+        movsd     %xmm0, 8(%esp)
+        movl      $524032, %edx
+        movsd     64(%esi), %xmm5
+        movsd     80(%esi), %xmm3
+        psrlq     $44, %xmm7
+        pextrw    $0, %xmm7, %ecx
+        movd      %xmm7, %eax
+        movsd     96(%esi), %xmm1
+        movsd     112(%esi), %xmm2
+        movl      %ebx, 16(%esp)
+        andl      $248, %ecx
+        movsd     128(%ecx,%esi), %xmm4
+        movl      %eax, %ebx
+        andl      %eax, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_0.0.2
+        cmpl      $524032, %edx
+        je        .L_2TAG_PACKET_1.0.2
+        shrl      $8, %edx
+        shrl      $8, %ebx
+        andpd     %xmm0, %xmm2
+        andpd     %xmm5, %xmm0
+        orpd      %xmm2, %xmm3
+        orpd      %xmm0, %xmm1
+        movapd    (%esi), %xmm5
+        movl      $5462, %eax
+        movapd    16(%esi), %xmm6
+        mull      %edx
+        movl      %ebx, %edx
+        andl      $2047, %ebx
+        shrl      $14, %eax
+        andl      $2048, %edx
+        subl      %eax, %ebx
+        subl      %eax, %ebx
+        subl      %eax, %ebx
+        shll      $8, %ebx
+        addl      $682, %eax
+        orl       %edx, %eax
+        movd      %eax, %xmm7
+        addl      %ebx, %ecx
+        psllq     $52, %xmm7
+.L_2TAG_PACKET_2.0.2:
+        movapd    32(%esi), %xmm2
+        movapd    48(%esi), %xmm0
+        subsd     %xmm3, %xmm1
+        movq      %xmm7, %xmm3
+        mulsd     384(%ecx,%esi), %xmm7
+        mulsd     %xmm4, %xmm1
+        mulsd     1152(%ecx,%esi), %xmm3
+        movapd    %xmm1, %xmm4
+        unpcklpd  %xmm1, %xmm1
+        mulpd     %xmm1, %xmm5
+        mulpd     %xmm1, %xmm6
+        mulpd     %xmm1, %xmm1
+        addpd     %xmm5, %xmm2
+        addpd     %xmm6, %xmm0
+        mulpd     %xmm1, %xmm2
+        mulpd     %xmm1, %xmm1
+        mulsd     %xmm7, %xmm4
+        addpd     %xmm2, %xmm0
+        movl      16(%esp), %ebx
+        mulsd     %xmm0, %xmm1
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm3, %xmm0
+        addsd     %xmm7, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_0.0.2:
+        mulsd     1984(%esi), %xmm0
+        movq      %xmm0, %xmm7
+        movl      $524032, %edx
+        psrlq     $44, %xmm7
+        pextrw    $0, %xmm7, %ecx
+        movd      %xmm7, %eax
+        andl      $248, %ecx
+        movsd     128(%ecx,%esi), %xmm4
+        movl      %eax, %ebx
+        andl      %eax, %edx
+        shrl      $8, %edx
+        shrl      $8, %ebx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_4.0.2
+        andpd     %xmm0, %xmm2
+        andpd     %xmm5, %xmm0
+        orpd      %xmm2, %xmm3
+        orpd      %xmm0, %xmm1
+        movapd    (%esi), %xmm5
+        movl      $5462, %eax
+        movapd    16(%esi), %xmm6
+        mull      %edx
+        movl      %ebx, %edx
+        andl      $2047, %ebx
+        shrl      $14, %eax
+        andl      $2048, %edx
+        subl      %eax, %ebx
+        subl      %eax, %ebx
+        subl      %eax, %ebx
+        shll      $8, %ebx
+        addl      $661, %eax
+        orl       %edx, %eax
+        movd      %eax, %xmm7
+        addl      %ebx, %ecx
+        psllq     $52, %xmm7
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_4.0.2:
+        cmpl      $0, %ebx
+        jne       .L_2TAG_PACKET_5.0.2
+        movl      16(%esp), %ebx
+        fldl      1952(%esi)
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_5.0.2:
+        movl      16(%esp), %ebx
+        fldl      1968(%esi)
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_1.0.2:
+        movl      16(%esp), %ebx
+        movl      132(%esp), %eax
+        movl      128(%esp), %edx
+        movl      %eax, %ecx
+        andl      $2147483647, %ecx
+        cmpl      $2146435072, %ecx
+        ja        .L_2TAG_PACKET_6.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_6.0.2
+        cmpl      $2146435072, %eax
+        jne       .L_2TAG_PACKET_7.0.2
+        fldl      1920(%esi)
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_7.0.2:
+        fldl      1936(%esi)
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_6.0.2:
+        movsd     8(%esp), %xmm0
+        addsd     %xmm0, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+.L_2TAG_PACKET_3.0.2:
+        movl      52(%esp), %esi
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(cbrt)
+# -- End  cbrt
+
+# Start file scope ASM
+ALIAS_SYMBOL(cbrtl, cbrt);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	1553778919
+	.long	3213899486
+	.long	3534952507
+	.long	3215266280
+	.long	1646371399
+	.long	3214412045
+	.long	477218588
+	.long	3216798151
+	.long	3582521621
+	.long	1066628362
+	.long	1007461464
+	.long	1068473053
+	.long	889629714
+	.long	1067378449
+	.long	1431655765
+	.long	1070945621
+	.long	4294967295
+	.long	1048575
+	.long	0
+	.long	0
+	.long	0
+	.long	3220193280
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	1032192
+	.long	0
+	.long	0
+	.long	528611360
+	.long	3220144632
+	.long	2884679527
+	.long	3220082993
+	.long	1991868891
+	.long	3220024928
+	.long	2298714891
+	.long	3219970134
+	.long	58835168
+	.long	3219918343
+	.long	3035110223
+	.long	3219869313
+	.long	1617585086
+	.long	3219822831
+	.long	2500867033
+	.long	3219778702
+	.long	4241943008
+	.long	3219736752
+	.long	258732970
+	.long	3219696825
+	.long	404232216
+	.long	3219658776
+	.long	2172167368
+	.long	3219622476
+	.long	1544257904
+	.long	3219587808
+	.long	377579543
+	.long	3219554664
+	.long	1616385542
+	.long	3219522945
+	.long	813783277
+	.long	3219492562
+	.long	3940743189
+	.long	3219463431
+	.long	2689777499
+	.long	3219435478
+	.long	1700977147
+	.long	3219408632
+	.long	3169102082
+	.long	3219382828
+	.long	327235604
+	.long	3219358008
+	.long	1244336319
+	.long	3219334115
+	.long	1300311200
+	.long	3219311099
+	.long	3095471925
+	.long	3219288912
+	.long	2166487928
+	.long	3219267511
+	.long	2913108253
+	.long	3219246854
+	.long	293672978
+	.long	3219226904
+	.long	288737297
+	.long	3219207624
+	.long	1810275472
+	.long	3219188981
+	.long	174592167
+	.long	3219170945
+	.long	3539053052
+	.long	3219153485
+	.long	2164392968
+	.long	3219136576
+	.long	572345495
+	.long	1072698681
+	.long	1998204467
+	.long	1072709382
+	.long	3861501553
+	.long	1072719872
+	.long	2268192434
+	.long	1072730162
+	.long	2981979308
+	.long	1072740260
+	.long	270859143
+	.long	1072750176
+	.long	2958651392
+	.long	1072759916
+	.long	313113243
+	.long	1072769490
+	.long	919449400
+	.long	1072778903
+	.long	2809328903
+	.long	1072788162
+	.long	2222981587
+	.long	1072797274
+	.long	2352530781
+	.long	1072806244
+	.long	594152517
+	.long	1072815078
+	.long	1555767199
+	.long	1072823780
+	.long	4282421314
+	.long	1072832355
+	.long	2355578597
+	.long	1072840809
+	.long	1162590619
+	.long	1072849145
+	.long	797864051
+	.long	1072857367
+	.long	431273680
+	.long	1072865479
+	.long	2669831148
+	.long	1072873484
+	.long	733477752
+	.long	1072881387
+	.long	4280220604
+	.long	1072889189
+	.long	801961634
+	.long	1072896896
+	.long	2915370760
+	.long	1072904508
+	.long	1159613482
+	.long	1072912030
+	.long	2689944798
+	.long	1072919463
+	.long	1248687822
+	.long	1072926811
+	.long	2967951030
+	.long	1072934075
+	.long	630170432
+	.long	1072941259
+	.long	3760898254
+	.long	1072948363
+	.long	0
+	.long	1072955392
+	.long	2370273294
+	.long	1072962345
+	.long	1261754802
+	.long	1072972640
+	.long	546334065
+	.long	1072986123
+	.long	1054893830
+	.long	1072999340
+	.long	1571187597
+	.long	1073012304
+	.long	1107975175
+	.long	1073025027
+	.long	3606909377
+	.long	1073037519
+	.long	1113616747
+	.long	1073049792
+	.long	4154744632
+	.long	1073061853
+	.long	3358931423
+	.long	1073073713
+	.long	4060702372
+	.long	1073085379
+	.long	747576176
+	.long	1073096860
+	.long	3023138255
+	.long	1073108161
+	.long	1419988548
+	.long	1073119291
+	.long	1914185305
+	.long	1073130255
+	.long	294389948
+	.long	1073141060
+	.long	3761802570
+	.long	1073151710
+	.long	978281566
+	.long	1073162213
+	.long	823148820
+	.long	1073172572
+	.long	2420954441
+	.long	1073182792
+	.long	3815449908
+	.long	1073192878
+	.long	2046058587
+	.long	1073202835
+	.long	1807524753
+	.long	1073212666
+	.long	2628681401
+	.long	1073222375
+	.long	3225667357
+	.long	1073231966
+	.long	1555307421
+	.long	1073241443
+	.long	3454043099
+	.long	1073250808
+	.long	1208137896
+	.long	1073260066
+	.long	3659916772
+	.long	1073269218
+	.long	1886261264
+	.long	1073278269
+	.long	3593647839
+	.long	1073287220
+	.long	3086012205
+	.long	1073296075
+	.long	2769796922
+	.long	1073304836
+	.long	888716057
+	.long	1073317807
+	.long	2201465623
+	.long	1073334794
+	.long	164369365
+	.long	1073351447
+	.long	3462666733
+	.long	1073367780
+	.long	2773905457
+	.long	1073383810
+	.long	1342879088
+	.long	1073399550
+	.long	2543933975
+	.long	1073415012
+	.long	1684477781
+	.long	1073430209
+	.long	3532178543
+	.long	1073445151
+	.long	1147747300
+	.long	1073459850
+	.long	1928031793
+	.long	1073474314
+	.long	2079717015
+	.long	1073488553
+	.long	4016765315
+	.long	1073502575
+	.long	3670431139
+	.long	1073516389
+	.long	3549227225
+	.long	1073530002
+	.long	11637607
+	.long	1073543422
+	.long	588220169
+	.long	1073556654
+	.long	2635407503
+	.long	1073569705
+	.long	2042029317
+	.long	1073582582
+	.long	1925128962
+	.long	1073595290
+	.long	4136375664
+	.long	1073607834
+	.long	759964600
+	.long	1073620221
+	.long	4257606771
+	.long	1073632453
+	.long	297278907
+	.long	1073644538
+	.long	3655053093
+	.long	1073656477
+	.long	2442253172
+	.long	1073668277
+	.long	1111876799
+	.long	1073679941
+	.long	3330973139
+	.long	1073691472
+	.long	3438879452
+	.long	1073702875
+	.long	3671565478
+	.long	1073714153
+	.long	1317849547
+	.long	1073725310
+	.long	1642364115
+	.long	1073736348
+	.long	4050900474
+	.long	1014427190
+	.long	1157977860
+	.long	1016444461
+	.long	1374568199
+	.long	1017271387
+	.long	2809163288
+	.long	1016882676
+	.long	3742377377
+	.long	1013168191
+	.long	3101606597
+	.long	1017541672
+	.long	65224358
+	.long	1017217597
+	.long	2691591250
+	.long	1017266643
+	.long	4020758549
+	.long	1017689313
+	.long	1316310992
+	.long	1018030788
+	.long	1031537856
+	.long	1014090882
+	.long	3261395239
+	.long	1016413641
+	.long	886424999
+	.long	1016313335
+	.long	3114776834
+	.long	1014195875
+	.long	1681120620
+	.long	1017825416
+	.long	1329600273
+	.long	1016625740
+	.long	465474623
+	.long	1017097119
+	.long	4251633980
+	.long	1017169077
+	.long	1986990133
+	.long	1017710645
+	.long	752958613
+	.long	1017159641
+	.long	2216216792
+	.long	1018020163
+	.long	4282860129
+	.long	1015924861
+	.long	1557627859
+	.long	1016039538
+	.long	3889219754
+	.long	1018086237
+	.long	3684996408
+	.long	1017353275
+	.long	723532103
+	.long	1017717141
+	.long	2951149676
+	.long	1012528470
+	.long	831890937
+	.long	1017830553
+	.long	1031212645
+	.long	1017387331
+	.long	2741737450
+	.long	1017604974
+	.long	2863311531
+	.long	1003776682
+	.long	4276736099
+	.long	1013153088
+	.long	4111778382
+	.long	1015673686
+	.long	1728065769
+	.long	1016413986
+	.long	2708718031
+	.long	1018078833
+	.long	1069335005
+	.long	1015291224
+	.long	700037144
+	.long	1016482032
+	.long	2904566452
+	.long	1017226861
+	.long	4074156649
+	.long	1017622651
+	.long	25019565
+	.long	1015245366
+	.long	3601952608
+	.long	1015771755
+	.long	3267129373
+	.long	1017904664
+	.long	503203103
+	.long	1014921629
+	.long	2122011730
+	.long	1018027866
+	.long	3927295461
+	.long	1014189456
+	.long	2790625147
+	.long	1016024251
+	.long	1330460186
+	.long	1016940346
+	.long	4033568463
+	.long	1015538390
+	.long	3695818227
+	.long	1017509621
+	.long	257573361
+	.long	1017208868
+	.long	3227697852
+	.long	1017337964
+	.long	234118548
+	.long	1017169577
+	.long	4009025803
+	.long	1017278524
+	.long	1948343394
+	.long	1017749310
+	.long	678398162
+	.long	1018144239
+	.long	3083864863
+	.long	1016669086
+	.long	2415453452
+	.long	1017890370
+	.long	175467344
+	.long	1017330033
+	.long	3197359580
+	.long	1010339928
+	.long	2071276951
+	.long	1015941358
+	.long	268372543
+	.long	1016737773
+	.long	938132959
+	.long	1017389108
+	.long	1816750559
+	.long	1017337448
+	.long	4119203749
+	.long	1017152174
+	.long	2578653878
+	.long	1013108497
+	.long	2470331096
+	.long	1014678606
+	.long	123855735
+	.long	1016553320
+	.long	1265650889
+	.long	1014782687
+	.long	3414398172
+	.long	1017182638
+	.long	1040773369
+	.long	1016158401
+	.long	3483628886
+	.long	1016886550
+	.long	4140499405
+	.long	1016191425
+	.long	3893477850
+	.long	1016964495
+	.long	3935319771
+	.long	1009634717
+	.long	2978982660
+	.long	1015027112
+	.long	2452709923
+	.long	1017990229
+	.long	3190365712
+	.long	1015835149
+	.long	4237588139
+	.long	1015832925
+	.long	2610678389
+	.long	1017962711
+	.long	2127316774
+	.long	1017405770
+	.long	824267502
+	.long	1017959463
+	.long	2165924042
+	.long	1017912225
+	.long	2774007076
+	.long	1013257418
+	.long	4123916326
+	.long	1017582284
+	.long	1976417958
+	.long	1016959909
+	.long	4092806412
+	.long	1017711279
+	.long	119251817
+	.long	1015363631
+	.long	3475418768
+	.long	1017675415
+	.long	1972580503
+	.long	1015470684
+	.long	815541017
+	.long	1017517969
+	.long	2429917451
+	.long	1017397776
+	.long	4062888482
+	.long	1016749897
+	.long	68284153
+	.long	1017925678
+	.long	2207779246
+	.long	1016320298
+	.long	1183466520
+	.long	1017408657
+	.long	143326427
+	.long	1017060403
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	0
+	.long	0
+	.long	4293918720
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	1138753536
+	.long	0
+	.long	0
+	.type	static_const_table,@object
+	.size	static_const_table,2000
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_cos.S b/libm/x86/s_cos.S
new file mode 100644
index 0000000..fd5ef5d
--- /dev/null
+++ b/libm/x86/s_cos.S
@@ -0,0 +1,892 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//     1. RANGE REDUCTION
+//
+//     We perform an initial range reduction from X to r with
+//
+//          X =~= N * pi/32 + r
+//
+//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
+//     where |N| <= 932560. Beyond this, the range reduction is
+//     insufficiently accurate. For extremely small inputs, 
+//     denormalization can occur internally, impacting performance.
+//     This means that the main path is actually only taken for
+//     2^-252 <= |X| < 90112.
+//
+//     To avoid branches, we perform the range reduction to full
+//     accuracy each time.
+//
+//          X - N * (P_1 + P_2 + P_3)
+//
+//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
+//     is exact) and P_3 is a 53-bit number. Together, these
+//     approximate pi well enough for all cases in the restricted
+//     range.
+//
+//     The main reduction sequence is:
+//
+//             y = 32/pi * x
+//             N = integer(y)
+//     (computed by adding and subtracting off SHIFTER)
+//
+//             m_1 = N * P_1
+//             m_2 = N * P_2
+//             r_1 = x - m_1
+//             r = r_1 - m_2
+//     (this r can be used for most of the calculation)
+//
+//             c_1 = r_1 - r
+//             m_3 = N * P_3
+//             c_2 = c_1 - m_2
+//             c = c_2 - m_3
+//
+//     2. MAIN ALGORITHM
+//
+//     The algorithm uses a table lookup based on B = M * pi / 32
+//     where M = N mod 64. The stored values are:
+//       sigma             closest power of 2 to cos(B)
+//       C_hl              53-bit cos(B) - sigma
+//       S_hi + S_lo       2 * 53-bit sin(B)
+//
+//     The computation is organized as follows:
+//
+//          sin(B + r + c) = [sin(B) + sigma * r] +
+//                           r * (cos(B) - sigma) +
+//                           sin(B) * [cos(r + c) - 1] +
+//                           cos(B) * [sin(r + c) - r]
+//
+//     which is approximately:
+//
+//          [S_hi + sigma * r] +
+//          C_hl * r +
+//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
+//          (C_hl + sigma) * [(sin(r) - r) + c]
+//
+//     and this is what is actually computed. We separate this sum
+//     into four parts:
+//
+//          hi + med + pols + corr
+//
+//     where
+//
+//          hi       = S_hi + sigma r
+//          med      = C_hl * r
+//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+//     3. POLYNOMIAL
+//
+//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+//     (sin(r) - r) can be rearranged freely, since it is quite
+//     small, so we exploit parallelism to the fullest.
+//
+//          psc4       =   SC_4 * r_1
+//          msc4       =   psc4 * r
+//          r2         =   r * r
+//          msc2       =   SC_2 * r2
+//          r4         =   r2 * r2
+//          psc3       =   SC_3 + msc4
+//          psc1       =   SC_1 + msc2
+//          msc3       =   r4 * psc3
+//          sincospols =   psc1 + msc3
+//          pols       =   sincospols *
+//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+//     4. CORRECTION TERM
+//
+//     This is where the "c" component of the range reduction is
+//     taken into account; recall that just "r" is used for most of
+//     the calculation.
+//
+//          -c   = m_3 - c_2
+//          -d   = S_hi * r - (C_hl + sigma)
+//          corr = -c * -d + S_lo
+//
+//     5. COMPENSATED SUMMATIONS
+//
+//     The two successive compensated summations add up the high
+//     and medium parts, leaving just the low parts to add up at
+//     the end.
+//
+//          rs        =  sigma * r
+//          res_int   =  S_hi + rs
+//          k_0       =  S_hi - res_int
+//          k_2       =  k_0 + rs
+//          med       =  C_hl * r
+//          res_hi    =  res_int + med
+//          k_1       =  res_int - res_hi
+//          k_3       =  k_1 + med
+//
+//     6. FINAL SUMMATION
+//
+//     We now add up all the small parts:
+//
+//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+//     Now the overall result is just:
+//
+//          res_hi + res_lo
+//
+//     7. SMALL ARGUMENTS
+//
+//     Inputs with |X| < 2^-252 are treated specially as
+//     1 - |x|.
+//
+// Special cases:
+//  cos(NaN) = quiet NaN, and raise invalid exception
+//  cos(INF) = NaN and raise invalid exception
+//  cos(0) = 1
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  cos
+ENTRY(cos)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 56(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        subl      $12336, %eax
+        cmpl      $4293, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        movsd     2160(%ebx), %xmm1
+        mulsd     %xmm0, %xmm1
+        movapd    2240(%ebx), %xmm5
+        movsd     2224(%ebx), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        movsd     2128(%ebx), %xmm3
+        movapd    2112(%ebx), %xmm2
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %edx
+        cvtsi2sdl %edx, %xmm1
+        mulsd     %xmm1, %xmm3
+        unpcklpd  %xmm1, %xmm1
+        addl      $1865232, %edx
+        movapd    %xmm0, %xmm4
+        andl      $63, %edx
+        movapd    2096(%ebx), %xmm5
+        lea       (%ebx), %eax
+        shll      $5, %edx
+        addl      %edx, %eax
+        mulpd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm0
+        mulsd     2144(%ebx), %xmm1
+        subsd     %xmm3, %xmm4
+        movsd     8(%eax), %xmm7
+        unpcklpd  %xmm0, %xmm0
+        movapd    %xmm4, %xmm3
+        subsd     %xmm2, %xmm4
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm2, %xmm0
+        movapd    2064(%ebx), %xmm6
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm2, %xmm3
+        movapd    (%eax), %xmm2
+        subsd     %xmm3, %xmm1
+        movsd     24(%eax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     2080(%ebx), %xmm5
+        mulsd     (%eax), %xmm4
+        addpd     2048(%ebx), %xmm6
+        mulpd     %xmm0, %xmm5
+        movapd    %xmm3, %xmm0
+        addsd     8(%eax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movapd    %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movsd     8(%eax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%eax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm0, %xmm5
+        addsd     %xmm7, %xmm3
+        addsd     %xmm5, %xmm1
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        unpckhpd  %xmm6, %xmm6
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm4
+        movsd     %xmm4, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        jg        .L_2TAG_PACKET_2.0.2
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        pinsrw    $3, %eax, %xmm0
+        movsd     2192(%ebx), %xmm1
+        subsd     %xmm0, %xmm1
+        movsd     %xmm1, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movl      132(%esp), %eax
+        andl      $2146435072, %eax
+        cmpl      $2146435072, %eax
+        je        .L_2TAG_PACKET_3.0.2
+        subl      $32, %esp
+        movsd     %xmm0, (%esp)
+        lea       40(%esp), %eax
+        movl      %eax, 8(%esp)
+        movl      $1, %eax
+        movl      %eax, 12(%esp)
+        call      __libm_sincos_huge
+        addl      $32, %esp
+        fldl      8(%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_3.0.2:
+        fldl      128(%esp)
+        fmull     2208(%ebx)
+.L_2TAG_PACKET_1.0.2:
+        movl      56(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(cos)
+# -- End  cos
+
+# Start file scope ASM
+ALIAS_SYMBOL(cosl, cos);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	1072693248
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	1072693248
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	1071644672
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	1071644672
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	1070596096
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	1070596096
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	1069547520
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	3217031168
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	3218079744
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	3218079744
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	3219128320
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	3219128320
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	3220176896
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	3220176896
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	3219128320
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	3219128320
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	3218079744
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	3218079744
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	3217031168
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	1069547520
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	1070596096
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	1070596096
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	1071644672
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	1071644672
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	1072693248
+	.long	1431655765
+	.long	3217380693
+	.long	0
+	.long	3219128320
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1067799893
+	.long	436314138
+	.long	3207201184
+	.long	381774871
+	.long	3210133868
+	.long	2773927732
+	.long	1053236707
+	.long	436314138
+	.long	1056571808
+	.long	442499072
+	.long	1032893537
+	.long	442499072
+	.long	1032893537
+	.long	1413480448
+	.long	1069097467
+	.long	0
+	.long	0
+	.long	771977331
+	.long	996350346
+	.long	0
+	.long	0
+	.long	1841940611
+	.long	1076125488
+	.long	0
+	.long	0
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.type	static_const_table,@object
+	.size	static_const_table,2256
+	.data
+	.hidden __libm_sincos_huge
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_expm1.S b/libm/x86/s_expm1.S
new file mode 100644
index 0000000..1f9e87b
--- /dev/null
+++ b/libm/x86/s_expm1.S
@@ -0,0 +1,702 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Description:
+//  Let K = 64 (table size).
+//
+//  Four sub-domains:
+//    1. |x| < 1/(2*K)
+//      expm1(x) ~ P(x)
+//    2. 1/(2*K) <= |x| <= 56*log(2)
+//       x       x/log(2)    n
+//      e - 1 = 2         = 2 * T[j] * (1 + P(y)) - 1
+//    3. 56*log(2) < x < MAX_LOG
+//       x       x   x/log(2)    n
+//      e - 1 ~ e = 2         = 2 * T[j] * (1 + P(y))
+//    4. x < -56*log(2)
+//       x            x
+//      e - 1 = -1 + e ~ -1
+//    where
+//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
+//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
+//                  j/K
+//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
+//
+//       P(y) is a minimax polynomial approximation of exp(x)-1
+//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
+//
+//    In case 3, to avoid problems with arithmetic overflow and underflow,
+//              n                        n1  n2
+//    value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
+//    and BIAS is a value of exponent bias.
+//
+// Special cases:
+//  expm1(NaN) is NaN
+//  expm1(+INF) is +INF
+//  expm1(-INF) is -1
+//  expm1(x) is x for subnormals
+//  for finite argument, only expm1(0)=0 is exact.
+//  For IEEE double
+//    if x > 709.782712893383973096 then expm1(x) overflow
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  expm1
+ENTRY(expm1)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 64(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        unpcklpd  %xmm0, %xmm0
+        movapd    64(%ebx), %xmm1
+        movapd    48(%ebx), %xmm6
+        movapd    80(%ebx), %xmm2
+        movapd    96(%ebx), %xmm3
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        movl      $16527, %edx
+        subl      %eax, %edx
+        subl      $16304, %eax
+        orl       %eax, %edx
+        cmpl      $-2147483648, %edx
+        jae       .L_2TAG_PACKET_0.0.2
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm6, %xmm1
+        movapd    %xmm1, %xmm7
+        subpd     %xmm6, %xmm1
+        mulpd     %xmm1, %xmm2
+        movapd    112(%ebx), %xmm4
+        mulpd     %xmm1, %xmm3
+        movapd    128(%ebx), %xmm5
+        subpd     %xmm2, %xmm0
+        movd      %xmm7, %eax
+        movl      %eax, %ecx
+        andl      $63, %ecx
+        shll      $4, %ecx
+        sarl      $6, %eax
+        movl      %eax, %edx
+        subpd     %xmm3, %xmm0
+        movapd    160(%ebx,%ecx), %xmm2
+        movsd     144(%ebx), %xmm3
+        mulpd     %xmm0, %xmm4
+        movapd    %xmm0, %xmm1
+        mulpd     %xmm0, %xmm0
+        mulsd     %xmm0, %xmm3
+        addpd     %xmm4, %xmm5
+        mulsd     %xmm0, %xmm0
+        movapd    %xmm2, %xmm4
+        unpckhpd  %xmm2, %xmm2
+        movdqa    16(%ebx), %xmm6
+        pand      %xmm6, %xmm7
+        movdqa    32(%ebx), %xmm6
+        paddq     %xmm6, %xmm7
+        psllq     $46, %xmm7
+        mulsd     %xmm0, %xmm3
+        mulpd     %xmm5, %xmm0
+        addl      $894, %edx
+        cmpl      $1916, %edx
+        ja        .L_2TAG_PACKET_1.0.2
+        addsd     %xmm3, %xmm0
+        xorpd     %xmm3, %xmm3
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm3
+        orpd      %xmm7, %xmm2
+        mulsd     %xmm4, %xmm7
+        movapd    %xmm3, %xmm6
+        addsd     %xmm1, %xmm3
+        pextrw    $3, %xmm2, %edx
+        pshufd    $238, %xmm0, %xmm5
+        psrlq     $38, %xmm3
+        psllq     $38, %xmm3
+        movapd    %xmm2, %xmm4
+        subsd     %xmm3, %xmm6
+        addsd     %xmm5, %xmm0
+        addsd     %xmm6, %xmm1
+        addsd     %xmm7, %xmm4
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm2, %xmm3
+        xorpd     %xmm5, %xmm5
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm5
+        addsd     %xmm1, %xmm0
+        movl      $17184, %ecx
+        subl      %edx, %ecx
+        subl      $16256, %edx
+        orl       %edx, %ecx
+        jl        .L_2TAG_PACKET_2.0.2
+        mulsd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm3
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+.L_2TAG_PACKET_3.0.2:
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_2.0.2:
+        cmpl      $0, %edx
+        jl        .L_2TAG_PACKET_5.0.2
+        mulsd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm7
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_5.0.2:
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        subsd     %xmm5, %xmm0
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_1.0.2:
+        movl      132(%esp), %ecx
+        addsd     %xmm0, %xmm1
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        cmpl      $0, %ecx
+        jl        .L_2TAG_PACKET_6.0.2
+        fstcw     24(%esp)
+        movzwl    24(%esp), %edx
+        orl       $768, %edx
+        movw      %dx, 28(%esp)
+        fldcw     28(%esp)
+        movl      %eax, %edx
+        sarl      $1, %eax
+        subl      %eax, %edx
+        movdqa    (%ebx), %xmm6
+        pandn     %xmm2, %xmm6
+        addl      $1023, %eax
+        movd      %eax, %xmm3
+        psllq     $52, %xmm3
+        orpd      %xmm3, %xmm6
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm0, 8(%esp)
+        fldl      8(%esp)
+        movsd     %xmm6, 16(%esp)
+        fldl      16(%esp)
+        movsd     %xmm4, 16(%esp)
+        fldl      16(%esp)
+        addl      $1023, %edx
+        movd      %edx, %xmm4
+        psllq     $52, %xmm4
+        faddp     %st, %st(1)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        movsd     %xmm4, 8(%esp)
+        fldl      8(%esp)
+        fmulp     %st, %st(1)
+        fstpl     8(%esp)
+        movsd     8(%esp), %xmm0
+        fldcw     24(%esp)
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_7.0.2
+        jmp       .L_2TAG_PACKET_4.0.2
+        cmpl      $-2147483648, %ecx
+        jb        .L_2TAG_PACKET_7.0.2
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_7.0.2:
+        movl      $41, %edx
+.L_2TAG_PACKET_8.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     128(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_10.0.2:
+        cmpl      $2146435072, %eax
+        jae       .L_2TAG_PACKET_11.0.2
+        movsd     1272(%ebx), %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $41, %edx
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_11.0.2:
+        movl      132(%esp), %eax
+        movl      128(%esp), %edx
+        movl      %eax, %ecx
+        andl      $2147483647, %eax
+        cmpl      $2146435072, %eax
+        ja        .L_2TAG_PACKET_12.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_12.0.2
+        cmpl      $0, %ecx
+        jl        .L_2TAG_PACKET_13.0.2
+        movsd     1256(%ebx), %xmm0
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_13.0.2:
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_12.0.2:
+        movsd     128(%esp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_14.0.2:
+        addl      $16304, %eax
+        cmpl      $15504, %eax
+        jb        .L_2TAG_PACKET_15.0.2
+        movapd    1184(%ebx), %xmm2
+        pshufd    $68, %xmm0, %xmm1
+        movapd    1200(%ebx), %xmm3
+        movapd    1216(%ebx), %xmm4
+        movsd     1232(%ebx), %xmm5
+        mulsd     %xmm1, %xmm1
+        xorpd     %xmm6, %xmm6
+        movl      $16352, %eax
+        pinsrw    $3, %eax, %xmm6
+        mulpd     %xmm0, %xmm2
+        xorpd     %xmm7, %xmm7
+        movl      $16368, %edx
+        pinsrw    $3, %edx, %xmm7
+        addpd     %xmm3, %xmm2
+        mulsd     %xmm1, %xmm5
+        pshufd    $228, %xmm1, %xmm3
+        mulpd     %xmm1, %xmm1
+        mulsd     %xmm0, %xmm6
+        mulpd     %xmm0, %xmm2
+        addpd     %xmm4, %xmm2
+        movapd    %xmm7, %xmm4
+        addsd     %xmm6, %xmm7
+        mulpd     %xmm3, %xmm1
+        psrlq     $27, %xmm7
+        psllq     $27, %xmm7
+        movsd     1288(%ebx), %xmm3
+        subsd     %xmm7, %xmm4
+        mulpd     %xmm1, %xmm2
+        addsd     %xmm4, %xmm6
+        pshufd    $238, %xmm2, %xmm1
+        addsd     %xmm2, %xmm6
+        andpd     %xmm0, %xmm3
+        movapd    %xmm0, %xmm4
+        addsd     %xmm6, %xmm1
+        subsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm1
+        mulsd     %xmm7, %xmm3
+        mulsd     %xmm7, %xmm0
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm4, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_15.0.2:
+        cmpl      $16, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        movapd    %xmm0, %xmm2
+        movd      %xmm0, %eax
+        psrlq     $31, %xmm2
+        movd      %xmm2, %ecx
+        orl       %ecx, %eax
+        je        .L_2TAG_PACKET_3.0.2
+        movl      $16, %edx
+        xorpd     %xmm1, %xmm1
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm1
+        movl      $42, %edx
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_0.0.2:
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_14.0.2
+        movl      132(%esp), %eax
+        cmpl      $1083179008, %eax
+        jge       .L_2TAG_PACKET_10.0.2
+        cmpl      $-1048576, %eax
+        jae       .L_2TAG_PACKET_11.0.2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_4.0.2:
+        movsd     %xmm0, 48(%esp)
+        fldl      48(%esp)
+.L_2TAG_PACKET_9.0.2:
+        movl      64(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(expm1)
+# -- End  expm1
+
+# Start file scope ASM
+ALIAS_SYMBOL(expm1l, expm1);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	4293918720
+	.long	0
+	.long	4293918720
+	.long	4294967232
+	.long	0
+	.long	4294967232
+	.long	0
+	.long	65472
+	.long	0
+	.long	65472
+	.long	0
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	1127743488
+	.long	1697350398
+	.long	1079448903
+	.long	1697350398
+	.long	1079448903
+	.long	4277796864
+	.long	1065758274
+	.long	4277796864
+	.long	1065758274
+	.long	3164486458
+	.long	1025308570
+	.long	3164486458
+	.long	1025308570
+	.long	1963358694
+	.long	1065423121
+	.long	1431655765
+	.long	1069897045
+	.long	1431655765
+	.long	1067799893
+	.long	0
+	.long	1071644672
+	.long	381774871
+	.long	1062650220
+	.long	381774871
+	.long	1062650220
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1000070955
+	.long	1042145304
+	.long	1040187392
+	.long	11418
+	.long	988267849
+	.long	1039500660
+	.long	3539992576
+	.long	22960
+	.long	36755401
+	.long	1042114290
+	.long	402653184
+	.long	34629
+	.long	3634769483
+	.long	1042178627
+	.long	1820327936
+	.long	46424
+	.long	2155991225
+	.long	1041560680
+	.long	847249408
+	.long	58348
+	.long	2766913307
+	.long	1039293264
+	.long	3489660928
+	.long	70401
+	.long	3651174602
+	.long	1040488175
+	.long	2927624192
+	.long	82586
+	.long	3073892131
+	.long	1042240606
+	.long	1006632960
+	.long	94904
+	.long	1328391742
+	.long	1042019037
+	.long	3942645760
+	.long	107355
+	.long	2650893825
+	.long	1041903210
+	.long	822083584
+	.long	119943
+	.long	2397289153
+	.long	1041802037
+	.long	2281701376
+	.long	132667
+	.long	430997175
+	.long	1042110606
+	.long	1845493760
+	.long	145530
+	.long	1230936525
+	.long	1041801015
+	.long	1702887424
+	.long	158533
+	.long	740675935
+	.long	1040178913
+	.long	4110417920
+	.long	171677
+	.long	3489810261
+	.long	1041825986
+	.long	2793406464
+	.long	184965
+	.long	2532600530
+	.long	1040767882
+	.long	167772160
+	.long	198398
+	.long	3542557060
+	.long	1041827263
+	.long	2986344448
+	.long	211976
+	.long	1401563777
+	.long	1041061093
+	.long	922746880
+	.long	225703
+	.long	3129406026
+	.long	1041852413
+	.long	880803840
+	.long	239579
+	.long	900993572
+	.long	1039283234
+	.long	1275068416
+	.long	253606
+	.long	2115029358
+	.long	1042140042
+	.long	562036736
+	.long	267786
+	.long	1086643152
+	.long	1041785419
+	.long	1610612736
+	.long	282120
+	.long	82864366
+	.long	1041256244
+	.long	3045064704
+	.long	296610
+	.long	2392968152
+	.long	1040913683
+	.long	3573547008
+	.long	311258
+	.long	2905856183
+	.long	1040002214
+	.long	1988100096
+	.long	326066
+	.long	3742008261
+	.long	1040011137
+	.long	1451229184
+	.long	341035
+	.long	863393794
+	.long	1040880621
+	.long	914358272
+	.long	356167
+	.long	1446136837
+	.long	1041372426
+	.long	3707764736
+	.long	371463
+	.long	927855201
+	.long	1040617636
+	.long	360710144
+	.long	386927
+	.long	1492679939
+	.long	1041050306
+	.long	2952790016
+	.long	402558
+	.long	608827001
+	.long	1041582217
+	.long	2181038080
+	.long	418360
+	.long	606260204
+	.long	1042271987
+	.long	1711276032
+	.long	434334
+	.long	3163044019
+	.long	1041843851
+	.long	1006632960
+	.long	450482
+	.long	4148747325
+	.long	1041962972
+	.long	3900702720
+	.long	466805
+	.long	802924201
+	.long	1041275378
+	.long	1442840576
+	.long	483307
+	.long	3052749833
+	.long	1041940577
+	.long	1937768448
+	.long	499988
+	.long	2216116399
+	.long	1041486744
+	.long	914358272
+	.long	516851
+	.long	2729697836
+	.long	1041445764
+	.long	2566914048
+	.long	533897
+	.long	540608356
+	.long	1041310907
+	.long	2600468480
+	.long	551129
+	.long	2916344493
+	.long	1040535661
+	.long	1107296256
+	.long	568549
+	.long	731391814
+	.long	1039497014
+	.long	2566914048
+	.long	586158
+	.long	1024722704
+	.long	1041461625
+	.long	2961178624
+	.long	603959
+	.long	3806831748
+	.long	1041732499
+	.long	2675965952
+	.long	621954
+	.long	238953304
+	.long	1040316488
+	.long	2189426688
+	.long	640145
+	.long	749123235
+	.long	1041725785
+	.long	2063597568
+	.long	658534
+	.long	1168187977
+	.long	1041175214
+	.long	2986344448
+	.long	677123
+	.long	3506096399
+	.long	1042186095
+	.long	1426063360
+	.long	695915
+	.long	1470221620
+	.long	1041675499
+	.long	2566914048
+	.long	714911
+	.long	3182425146
+	.long	1041483134
+	.long	3087007744
+	.long	734114
+	.long	3131698208
+	.long	1042208657
+	.long	4068474880
+	.long	753526
+	.long	2300504125
+	.long	1041428596
+	.long	2415919104
+	.long	773150
+	.long	2290297931
+	.long	1037388400
+	.long	3716153344
+	.long	792987
+	.long	3532148223
+	.long	1041626194
+	.long	771751936
+	.long	813041
+	.long	1161884404
+	.long	1042015258
+	.long	3699376128
+	.long	833312
+	.long	876383176
+	.long	1037968878
+	.long	1241513984
+	.long	853805
+	.long	3379986796
+	.long	1042213153
+	.long	3699376128
+	.long	874520
+	.long	1545797737
+	.long	1041681569
+	.long	58720256
+	.long	895462
+	.long	2925146801
+	.long	1042212567
+	.long	855638016
+	.long	916631
+	.long	1316627971
+	.long	1038516204
+	.long	3883925504
+	.long	938030
+	.long	3267869137
+	.long	1040337004
+	.long	2726297600
+	.long	959663
+	.long	3720868999
+	.long	1041782409
+	.long	3992977408
+	.long	981531
+	.long	433316142
+	.long	1041994064
+	.long	1526726656
+	.long	1003638
+	.long	781232103
+	.long	1040093400
+	.long	2172649472
+	.long	1025985
+	.long	2773927732
+	.long	1053236707
+	.long	381774871
+	.long	1062650220
+	.long	379653899
+	.long	1056571845
+	.long	286331153
+	.long	1065423121
+	.long	436314138
+	.long	1059717536
+	.long	1431655765
+	.long	1067799893
+	.long	1431655765
+	.long	1069897045
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	2146435071
+	.long	0
+	.long	1048576
+	.long	4227858432
+	.long	4294967295
+	.type	static_const_table,@object
+	.size	static_const_table,1296
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_log1p.S b/libm/x86/s_log1p.S
new file mode 100644
index 0000000..7a6d845
--- /dev/null
+++ b/libm/x86/s_log1p.S
@@ -0,0 +1,827 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpps instruction (B0)
+//    B = int((B0*2^7+0.5))/2^7
+//
+//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
+//
+//    Result:  k*log(2) - log(B) + p(r)
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//   log1p(NaN) = quiet NaN, and raise invalid exception
+//   log1p(+INF) = that INF
+//   log1p(x) = NaN if x < -1 or x = -INF, and raises invalid exception
+//   log1p(-1) = -INF, and raises divide-by-zero exception
+//   log1p(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  log1p
+ENTRY(log1p)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        xorpd     %xmm3, %xmm3
+        movl      $32768, %ecx
+        movd      %ecx, %xmm4
+        movsd     2128(%ebx), %xmm5
+        pshufd    $68, %xmm0, %xmm7
+        movapd    %xmm2, %xmm6
+        pextrw    $3, %xmm0, %ecx
+        addsd     %xmm2, %xmm0
+        movapd    %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        subsd     %xmm0, %xmm6
+        orpd      %xmm2, %xmm0
+        psllq     $5, %xmm0
+        psrlq     $34, %xmm0
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        addsd     %xmm6, %xmm7
+        rcpss     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        andl      $32752, %ecx
+        cmpl      $16256, %ecx
+        jb        .L_2TAG_PACKET_1.0.2
+        andl      $32752, %eax
+        movl      $32720, %ecx
+        subl      %eax, %ecx
+        pinsrw    $3, %ecx, %xmm3
+.L_2TAG_PACKET_2.0.2:
+        mulsd     %xmm3, %xmm7
+        paddd     %xmm4, %xmm0
+        xorpd     %xmm4, %xmm4
+        movl      $14336, %ecx
+        pinsrw    $3, %ecx, %xmm4
+        orpd      %xmm2, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm1, %xmm5
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm1
+        paddd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm5
+        movl      $16352, %ecx
+        subl      %ecx, %eax
+        cvtsi2sdl %eax, %xmm4
+        mulsd     %xmm0, %xmm7
+        mulsd     %xmm0, %xmm1
+        movsd     2064(%ebx), %xmm6
+        movapd    2080(%ebx), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    (%ebx,%edx), %xmm0
+        movapd    2096(%ebx), %xmm2
+        addsd     %xmm5, %xmm1
+        movapd    %xmm1, %xmm5
+        addsd     %xmm7, %xmm1
+        subsd     %xmm1, %xmm5
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm4, %xmm6
+        mulsd     2072(%ebx), %xmm4
+        mulsd     %xmm1, %xmm3
+        pshufd    $68, %xmm1, %xmm5
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm2
+        mulpd     %xmm5, %xmm5
+        pshufd    $228, %xmm0, %xmm6
+        addsd     %xmm1, %xmm0
+        addpd     2112(%ebx), %xmm2
+        mulpd     %xmm5, %xmm3
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm7, %xmm4
+        mulsd     %xmm1, %xmm7
+        addsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm6
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm6, %xmm4
+        subsd     %xmm7, %xmm1
+        addpd     %xmm3, %xmm2
+        addsd     %xmm4, %xmm1
+        mulpd     %xmm5, %xmm2
+        addsd     %xmm2, %xmm1
+        pshufd    $238, %xmm2, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_0.0.2:
+        movsd     112(%esp), %xmm0
+        movapd    %xmm0, %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_4.0.2
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_6.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_7.0.2:
+        ja        .L_2TAG_PACKET_6.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_6.0.2
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_4.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_7.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_8.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        movl      $141, %edx
+        mulsd     %xmm1, %xmm0
+.L_2TAG_PACKET_9.0.2:
+        movsd     %xmm0, (%esp)
+        movsd     112(%esp), %xmm0
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_10.0.2
+.L_2TAG_PACKET_5.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $140, %edx
+        jmp       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_1.0.2:
+        movsd     112(%esp), %xmm0
+        cmpl      $15504, %ecx
+        jb        .L_2TAG_PACKET_11.0.2
+        movapd    2144(%ebx), %xmm1
+        pshufd    $68, %xmm0, %xmm0
+        movapd    2160(%ebx), %xmm2
+        pshufd    $68, %xmm0, %xmm4
+        movapd    2176(%ebx), %xmm3
+        mulpd     %xmm0, %xmm1
+        xorpd     %xmm6, %xmm6
+        mulpd     %xmm4, %xmm4
+        addpd     %xmm2, %xmm1
+        pshufd    $68, %xmm4, %xmm5
+        mulpd     %xmm0, %xmm4
+        movl      $49120, %eax
+        pinsrw    $3, %eax, %xmm6
+        mulpd     %xmm0, %xmm1
+        mulsd     %xmm4, %xmm4
+        addpd     %xmm3, %xmm1
+        mulsd     %xmm6, %xmm5
+        mulpd     %xmm4, %xmm1
+        pshufd    $238, %xmm1, %xmm7
+        addsd     %xmm7, %xmm1
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_11.0.2:
+        cmpl      $16, %ecx
+        jb        .L_2TAG_PACKET_12.0.2
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_12.0.2:
+        movapd    %xmm0, %xmm1
+        mulsd     %xmm1, %xmm1
+        jmp       .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_3.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_10.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(log1p)
+# -- End  log1p
+
+# Start file scope ASM
+ALIAS_SYMBOL(log1pl, log1p);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	4277811200
+	.long	1072049730
+	.long	2479318832
+	.long	1026487127
+	.long	2854492160
+	.long	1072033410
+	.long	215631550
+	.long	1025638968
+	.long	1547061248
+	.long	1072017216
+	.long	2886781435
+	.long	1026423395
+	.long	649825280
+	.long	1072001146
+	.long	4281533405
+	.long	1024038923
+	.long	646346752
+	.long	1071985198
+	.long	1562735921
+	.long	1023790276
+	.long	2203734016
+	.long	1071969370
+	.long	1838397691
+	.long	3173936209
+	.long	1872169984
+	.long	1071953661
+	.long	3981202460
+	.long	1022325013
+	.long	669557760
+	.long	1071938069
+	.long	4182597802
+	.long	3173174122
+	.long	4076413952
+	.long	1071922591
+	.long	1209029111
+	.long	3170736207
+	.long	556125184
+	.long	1071907228
+	.long	821086028
+	.long	3173437049
+	.long	204914688
+	.long	1071891976
+	.long	2097025986
+	.long	3171071798
+	.long	387545088
+	.long	1071876834
+	.long	3142936996
+	.long	3173092218
+	.long	2912783360
+	.long	1071861800
+	.long	2502420140
+	.long	1024505919
+	.long	1144260608
+	.long	1071846874
+	.long	3315658140
+	.long	3173469843
+	.long	1471209472
+	.long	1071832053
+	.long	129621009
+	.long	3172443877
+	.long	1829683200
+	.long	1071817336
+	.long	3885467693
+	.long	1025535275
+	.long	288676864
+	.long	1071802722
+	.long	86139472
+	.long	3171639793
+	.long	3636378624
+	.long	1071788208
+	.long	1850238587
+	.long	1024654342
+	.long	1606817792
+	.long	1071773795
+	.long	3388899795
+	.long	3173675586
+	.long	1236164608
+	.long	1071759480
+	.long	3983599207
+	.long	1020046558
+	.long	1089616896
+	.long	1071745262
+	.long	4171974224
+	.long	1024773198
+	.long	4143093760
+	.long	1071731139
+	.long	2727587401
+	.long	3173965207
+	.long	600267776
+	.long	1071717112
+	.long	3147685042
+	.long	3173353031
+	.long	2249313280
+	.long	1071703177
+	.long	125835074
+	.long	1025255832
+	.long	3805303808
+	.long	1071689334
+	.long	2289991207
+	.long	1025460331
+	.long	87278592
+	.long	1071675583
+	.long	1106114045
+	.long	1025933602
+	.long	3195405312
+	.long	1071661920
+	.long	3885316576
+	.long	3171206239
+	.long	3853649920
+	.long	1071648346
+	.long	2977069852
+	.long	3171236771
+	.long	2944026624
+	.long	1071625048
+	.long	1008093493
+	.long	1023444474
+	.long	3993180160
+	.long	1071598247
+	.long	1862355595
+	.long	1024642533
+	.long	1454641152
+	.long	1071571617
+	.long	1514603089
+	.long	1026500596
+	.long	3286085632
+	.long	1071545154
+	.long	1400028424
+	.long	3173279056
+	.long	438773760
+	.long	1071518858
+	.long	120727864
+	.long	3172148914
+	.long	1212979200
+	.long	1071492725
+	.long	1625055594
+	.long	3172901933
+	.long	1189017600
+	.long	1071466754
+	.long	3920062376
+	.long	1025727407
+	.long	403064832
+	.long	1071440943
+	.long	1053271728
+	.long	3171391427
+	.long	3343210496
+	.long	1071415289
+	.long	3243395502
+	.long	3173627613
+	.long	1765777408
+	.long	1071389792
+	.long	2145968512
+	.long	1026354304
+	.long	461430784
+	.long	1071364449
+	.long	4094322285
+	.long	1026021467
+	.long	71706624
+	.long	1071339258
+	.long	763632021
+	.long	1024496933
+	.long	1380503552
+	.long	1071314217
+	.long	1383547992
+	.long	3173088453
+	.long	1015732224
+	.long	1071289325
+	.long	3198646877
+	.long	1025390322
+	.long	35977216
+	.long	1071264580
+	.long	2141026805
+	.long	1025754693
+	.long	3927306240
+	.long	1071239979
+	.long	282116272
+	.long	3173394334
+	.long	1125341184
+	.long	1071215523
+	.long	2768427504
+	.long	3172279059
+	.long	1666971648
+	.long	1071191208
+	.long	786837629
+	.long	3172427445
+	.long	2827694080
+	.long	1071167033
+	.long	3857122416
+	.long	3173014241
+	.long	2003683328
+	.long	1071142997
+	.long	859010954
+	.long	1026545007
+	.long	1004017664
+	.long	1071119098
+	.long	3356644970
+	.long	3173458064
+	.long	1753020416
+	.long	1071095334
+	.long	788338552
+	.long	1026157693
+	.long	1992718336
+	.long	1071071704
+	.long	1239179443
+	.long	1026394889
+	.long	3870234624
+	.long	1071048206
+	.long	2082614663
+	.long	1024926053
+	.long	1050437632
+	.long	1071024840
+	.long	660007840
+	.long	1025548499
+	.long	188395520
+	.long	1071001603
+	.long	3878792704
+	.long	3173889571
+	.long	3747176448
+	.long	1070978493
+	.long	144991708
+	.long	3171552042
+	.long	1405669376
+	.long	1070955511
+	.long	3999088879
+	.long	1025486317
+	.long	121151488
+	.long	1070932654
+	.long	2170865497
+	.long	1026473584
+	.long	2652319744
+	.long	1070909920
+	.long	453695652
+	.long	3173916809
+	.long	3262236672
+	.long	1070887309
+	.long	157800053
+	.long	3173984206
+	.long	601221120
+	.long	1070864820
+	.long	3968917661
+	.long	1023992886
+	.long	1999843328
+	.long	1070842450
+	.long	3053895004
+	.long	1024998228
+	.long	1992167424
+	.long	1070820199
+	.long	2968614856
+	.long	1024552653
+	.long	3788726272
+	.long	1070798065
+	.long	3542170808
+	.long	3173573242
+	.long	2094829568
+	.long	1070776048
+	.long	1246758132
+	.long	1026202874
+	.long	288675840
+	.long	1070754146
+	.long	3747328950
+	.long	1026331585
+	.long	1829681152
+	.long	1070732357
+	.long	3125197546
+	.long	1024100318
+	.long	1666869248
+	.long	1070710681
+	.long	1363656119
+	.long	1026336493
+	.long	3417110528
+	.long	1070689116
+	.long	4154791553
+	.long	1026267853
+	.long	2183653376
+	.long	1070667662
+	.long	1671819292
+	.long	3173785870
+	.long	1734434816
+	.long	1070646317
+	.long	373091049
+	.long	1025972363
+	.long	1615681536
+	.long	1070625080
+	.long	384650897
+	.long	1022926043
+	.long	1445382144
+	.long	1070603950
+	.long	344320330
+	.long	3172397196
+	.long	1823715328
+	.long	1070569756
+	.long	3389841200
+	.long	1025231852
+	.long	3839688704
+	.long	1070527917
+	.long	1706790417
+	.long	3167363349
+	.long	4293332992
+	.long	1070486286
+	.long	1614935088
+	.long	1019351591
+	.long	2966720512
+	.long	1070444861
+	.long	4145393717
+	.long	3173711658
+	.long	4066729984
+	.long	1070403639
+	.long	1974925028
+	.long	3171437182
+	.long	3337621504
+	.long	1070362619
+	.long	3314953170
+	.long	3169971314
+	.long	943448064
+	.long	1070321799
+	.long	1498682038
+	.long	3173862340
+	.long	1465634816
+	.long	1070281176
+	.long	1319952810
+	.long	3171693965
+	.long	1015734272
+	.long	1070240749
+	.long	1347821929
+	.long	3173544515
+	.long	118001664
+	.long	1070200516
+	.long	1751482746
+	.long	1026134093
+	.long	3707174912
+	.long	1070160474
+	.long	1486946159
+	.long	1023930920
+	.long	3946381312
+	.long	1070120623
+	.long	2867408081
+	.long	3171368276
+	.long	1699848192
+	.long	1070080961
+	.long	2590187139
+	.long	1025379803
+	.long	2235846656
+	.long	1070041485
+	.long	1888568069
+	.long	3172754960
+	.long	2339729408
+	.long	1070002194
+	.long	3852214753
+	.long	3173323149
+	.long	3196850176
+	.long	1069963086
+	.long	742141560
+	.long	1025101707
+	.long	1800683520
+	.long	1069924160
+	.long	3949500444
+	.long	3172102179
+	.long	3835801600
+	.long	1069885413
+	.long	3848895943
+	.long	1025913832
+	.long	2201202688
+	.long	1069846845
+	.long	1425913464
+	.long	1025868665
+	.long	2778279936
+	.long	1069808453
+	.long	2120889677
+	.long	3173831128
+	.long	2954203136
+	.long	1069770236
+	.long	592147081
+	.long	1019621288
+	.long	210141184
+	.long	1069732193
+	.long	3414275233
+	.long	1023647084
+	.long	709476352
+	.long	1069694321
+	.long	2413027164
+	.long	1024462115
+	.long	2116284416
+	.long	1069656619
+	.long	1144559924
+	.long	1026336654
+	.long	2183651328
+	.long	1069619086
+	.long	3459057650
+	.long	1025634168
+	.long	3047047168
+	.long	1069581720
+	.long	1879674924
+	.long	3173508573
+	.long	970711040
+	.long	1069541521
+	.long	1335954173
+	.long	3173332182
+	.long	2198478848
+	.long	1069467449
+	.long	2951103968
+	.long	3173892200
+	.long	1669611520
+	.long	1069393703
+	.long	531044147
+	.long	1025149248
+	.long	29114368
+	.long	1069320280
+	.long	3327831251
+	.long	1025918673
+	.long	2376949760
+	.long	1069247176
+	.long	737634533
+	.long	3172176000
+	.long	1085390848
+	.long	1069174390
+	.long	3108243400
+	.long	3171828406
+	.long	1566130176
+	.long	1069101918
+	.long	985483226
+	.long	1025708380
+	.long	792780800
+	.long	1069029758
+	.long	4184866295
+	.long	1024426204
+	.long	183156736
+	.long	1068957907
+	.long	2845699378
+	.long	1022107277
+	.long	1301782528
+	.long	1068886362
+	.long	1012735262
+	.long	3173804294
+	.long	1562411008
+	.long	1068815121
+	.long	2197086703
+	.long	3170187813
+	.long	2815549440
+	.long	1068744181
+	.long	2782613207
+	.long	1026345054
+	.long	2756124672
+	.long	1068673540
+	.long	2929486205
+	.long	3173037800
+	.long	3511050240
+	.long	1068603195
+	.long	1443733147
+	.long	3173331549
+	.long	3047047168
+	.long	1068533144
+	.long	1879674924
+	.long	3172459997
+	.long	3221667840
+	.long	1068427825
+	.long	1338588027
+	.long	3171815742
+	.long	3453861888
+	.long	1068288883
+	.long	1205348359
+	.long	3172624626
+	.long	3506110464
+	.long	1068150514
+	.long	893105198
+	.long	1025571866
+	.long	346013696
+	.long	1068012714
+	.long	3495569021
+	.long	3172563349
+	.long	4074029056
+	.long	1067875476
+	.long	3961106338
+	.long	3171065595
+	.long	3559784448
+	.long	1067738798
+	.long	1975385384
+	.long	3173783155
+	.long	797769728
+	.long	1067602675
+	.long	3760305787
+	.long	1026047642
+	.long	2313633792
+	.long	1067467101
+	.long	1559353171
+	.long	1023480256
+	.long	3960766464
+	.long	1067213778
+	.long	1067365107
+	.long	1025865926
+	.long	684261376
+	.long	1066944805
+	.long	844762164
+	.long	3173687482
+	.long	630718464
+	.long	1066676905
+	.long	2458269694
+	.long	1024033081
+	.long	1486061568
+	.long	1066410070
+	.long	115537874
+	.long	3173243995
+	.long	2743664640
+	.long	1065886792
+	.long	3665098304
+	.long	3173471607
+	.long	1971912704
+	.long	1065357333
+	.long	2577214440
+	.long	3171993451
+	.long	1498939392
+	.long	1064306693
+	.long	3409036923
+	.long	1025599151
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	4277811200
+	.long	1067855426
+	.long	2479318832
+	.long	1022292823
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1030730101
+	.long	3217380702
+	.long	1431655765
+	.long	1070945621
+	.long	2576980378
+	.long	1070176665
+	.long	0
+	.long	3219128320
+	.long	0
+	.long	4294959104
+	.long	0
+	.long	4294959104
+	.long	0
+	.long	3217031168
+	.long	2576980378
+	.long	1070176665
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1431655765
+	.long	3217380693
+	.long	1431655765
+	.long	1070945621
+	.type	static_const_table,@object
+	.size	static_const_table,2192
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_sin.S b/libm/x86/s_sin.S
new file mode 100644
index 0000000..1e6cbd4
--- /dev/null
+++ b/libm/x86/s_sin.S
@@ -0,0 +1,907 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//     1. RANGE REDUCTION
+//
+//     We perform an initial range reduction from X to r with
+//
+//          X =~= N * pi/32 + r
+//
+//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
+//     where |N| <= 932560. Beyond this, the range reduction is
+//     insufficiently accurate. For extremely small inputs, 
+//     denormalization can occur internally, impacting performance.
+//     This means that the main path is actually only taken for
+//     2^-252 <= |X| < 90112.
+//
+//     To avoid branches, we perform the range reduction to full
+//     accuracy each time.
+//
+//          X - N * (P_1 + P_2 + P_3)
+//
+//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
+//     is exact) and P_3 is a 53-bit number. Together, these
+//     approximate pi well enough for all cases in the restricted
+//     range.
+//
+//     The main reduction sequence is:
+//
+//             y = 32/pi * x
+//             N = integer(y)
+//     (computed by adding and subtracting off SHIFTER)
+//
+//             m_1 = N * P_1
+//             m_2 = N * P_2
+//             r_1 = x - m_1
+//             r = r_1 - m_2
+//     (this r can be used for most of the calculation)
+//
+//             c_1 = r_1 - r
+//             m_3 = N * P_3
+//             c_2 = c_1 - m_2
+//             c = c_2 - m_3
+//
+//     2. MAIN ALGORITHM
+//
+//     The algorithm uses a table lookup based on B = M * pi / 32
+//     where M = N mod 64. The stored values are:
+//       sigma             closest power of 2 to cos(B)
+//       C_hl              53-bit cos(B) - sigma
+//       S_hi + S_lo       2 * 53-bit sin(B)
+//
+//     The computation is organized as follows:
+//
+//          sin(B + r + c) = [sin(B) + sigma * r] +
+//                           r * (cos(B) - sigma) +
+//                           sin(B) * [cos(r + c) - 1] +
+//                           cos(B) * [sin(r + c) - r]
+//
+//     which is approximately:
+//
+//          [S_hi + sigma * r] +
+//          C_hl * r +
+//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
+//          (C_hl + sigma) * [(sin(r) - r) + c]
+//
+//     and this is what is actually computed. We separate this sum
+//     into four parts:
+//
+//          hi + med + pols + corr
+//
+//     where
+//
+//          hi       = S_hi + sigma r
+//          med      = C_hl * r
+//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+//     3. POLYNOMIAL
+//
+//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+//     (sin(r) - r) can be rearranged freely, since it is quite
+//     small, so we exploit parallelism to the fullest.
+//
+//          psc4       =   SC_4 * r_1
+//          msc4       =   psc4 * r
+//          r2         =   r * r
+//          msc2       =   SC_2 * r2
+//          r4         =   r2 * r2
+//          psc3       =   SC_3 + msc4
+//          psc1       =   SC_1 + msc2
+//          msc3       =   r4 * psc3
+//          sincospols =   psc1 + msc3
+//          pols       =   sincospols *
+//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+//     4. CORRECTION TERM
+//
+//     This is where the "c" component of the range reduction is
+//     taken into account; recall that just "r" is used for most of
+//     the calculation.
+//
+//          -c   = m_3 - c_2
+//          -d   = S_hi * r - (C_hl + sigma)
+//          corr = -c * -d + S_lo
+//
+//     5. COMPENSATED SUMMATIONS
+//
+//     The two successive compensated summations add up the high
+//     and medium parts, leaving just the low parts to add up at
+//     the end.
+//
+//          rs        =  sigma * r
+//          res_int   =  S_hi + rs
+//          k_0       =  S_hi - res_int
+//          k_2       =  k_0 + rs
+//          med       =  C_hl * r
+//          res_hi    =  res_int + med
+//          k_1       =  res_int - res_hi
+//          k_3       =  k_1 + med
+//
+//     6. FINAL SUMMATION
+//
+//     We now add up all the small parts:
+//
+//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+//     Now the overall result is just:
+//
+//          res_hi + res_lo
+//
+//     7. SMALL ARGUMENTS
+//
+//     If |x| < SNN (SNN meaning the smallest normal number), we
+//     simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
+//     do 2^-55 * (2^55 * x - x).
+//
+// Special cases:
+//  sin(NaN) = quiet NaN, and raise invalid exception
+//  sin(INF) = NaN and raise invalid exception
+//  sin(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  sin
+ENTRY(sin)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 56(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        subl      $12336, %eax
+        cmpl      $4293, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        movsd     2160(%ebx), %xmm1
+        mulsd     %xmm0, %xmm1
+        movsd     2272(%ebx), %xmm5
+        movapd    2256(%ebx), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        movsd     2128(%ebx), %xmm3
+        movapd    2112(%ebx), %xmm2
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %edx
+        cvtsi2sdl %edx, %xmm1
+        mulsd     %xmm1, %xmm3
+        unpcklpd  %xmm1, %xmm1
+        addl      $1865216, %edx
+        movapd    %xmm0, %xmm4
+        andl      $63, %edx
+        movapd    2096(%ebx), %xmm5
+        lea       (%ebx), %eax
+        shll      $5, %edx
+        addl      %edx, %eax
+        mulpd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm0
+        mulsd     2144(%ebx), %xmm1
+        subsd     %xmm3, %xmm4
+        movsd     8(%eax), %xmm7
+        unpcklpd  %xmm0, %xmm0
+        movapd    %xmm4, %xmm3
+        subsd     %xmm2, %xmm4
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm2, %xmm0
+        movapd    2064(%ebx), %xmm6
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm2, %xmm3
+        movapd    (%eax), %xmm2
+        subsd     %xmm3, %xmm1
+        movsd     24(%eax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     2080(%ebx), %xmm5
+        mulsd     (%eax), %xmm4
+        addpd     2048(%ebx), %xmm6
+        mulpd     %xmm0, %xmm5
+        movapd    %xmm3, %xmm0
+        addsd     8(%eax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movapd    %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movsd     8(%eax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%eax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm0, %xmm5
+        addsd     %xmm7, %xmm3
+        addsd     %xmm5, %xmm1
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        unpckhpd  %xmm6, %xmm6
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm4
+        movsd     %xmm4, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        jg        .L_2TAG_PACKET_2.0.2
+        shrl      $4, %eax
+        cmpl      $268434685, %eax
+        jne       .L_2TAG_PACKET_3.0.2
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_3.0.2:
+        movsd     2192(%ebx), %xmm3
+        mulsd     %xmm0, %xmm3
+        subsd     %xmm0, %xmm3
+        mulsd     2208(%ebx), %xmm3
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movl      132(%esp), %eax
+        andl      $2146435072, %eax
+        cmpl      $2146435072, %eax
+        je        .L_2TAG_PACKET_4.0.2
+        subl      $32, %esp
+        movsd     %xmm0, (%esp)
+        lea       40(%esp), %eax
+        movl      %eax, 8(%esp)
+        movl      $2, %eax
+        movl      %eax, 12(%esp)
+        call      __libm_sincos_huge
+        addl      $32, %esp
+        fldl      16(%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_4.0.2:
+        fldl      128(%esp)
+        fmull     2240(%ebx)
+.L_2TAG_PACKET_1.0.2:
+        movl      56(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(sin)
+# -- End  sin
+
+# Start file scope ASM
+ALIAS_SYMBOL(sinl, sin);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	1072693248
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	1072693248
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	1071644672
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	1071644672
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	1070596096
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	1070596096
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	1069547520
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	3217031168
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	3218079744
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	3218079744
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	3219128320
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	3219128320
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	3220176896
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	3220176896
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	3219128320
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	3219128320
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	3218079744
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	3218079744
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	3217031168
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	1069547520
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	1070596096
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	1070596096
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	1071644672
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	1071644672
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	1072693248
+	.long	1431655765
+	.long	3217380693
+	.long	0
+	.long	3219128320
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1067799893
+	.long	436314138
+	.long	3207201184
+	.long	381774871
+	.long	3210133868
+	.long	2773927732
+	.long	1053236707
+	.long	436314138
+	.long	1056571808
+	.long	442499072
+	.long	1032893537
+	.long	442499072
+	.long	1032893537
+	.long	1413480448
+	.long	1069097467
+	.long	0
+	.long	0
+	.long	771977331
+	.long	996350346
+	.long	0
+	.long	0
+	.long	1841940611
+	.long	1076125488
+	.long	0
+	.long	0
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	0
+	.long	0
+	.long	1130364928
+	.long	0
+	.long	0
+	.long	0
+	.long	1015021568
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	1072693247
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.type	static_const_table,@object
+	.size	static_const_table,2288
+	.data
+	.hidden __libm_sincos_huge
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_tan.S b/libm/x86/s_tan.S
new file mode 100644
index 0000000..3ee2107
--- /dev/null
+++ b/libm/x86/s_tan.S
@@ -0,0 +1,1766 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Polynomials coefficients and other constants.
+//
+// Note that in this algorithm, there is a different polynomial for
+// each breakpoint, so there are 32 sets of polynomial coefficients
+// as well as 32 instances of the other constants.
+//
+// The polynomial coefficients and constants are offset from the start
+// of the main block as follows:
+//
+//   0:  c8 | c0
+//  16:  c9 | c1
+//  32: c10 | c2
+//  48: c11 | c3
+//  64: c12 | c4
+//  80: c13 | c5
+//  96: c14 | c6
+// 112: c15 | c7
+// 128: T_hi
+// 136: T_lo
+// 144: Sigma
+// 152: T_hl
+// 160: Tau
+// 168: Mask
+// 176: (end of block)
+//
+// The total table size is therefore 5632 bytes.
+//
+// Note that c0 and c1 are always zero. We could try storing
+// other constants here, and just loading the low part of the
+// SIMD register in these cases, after ensuring the high part
+// is zero.
+//
+// The higher terms of the polynomial are computed in the *low*
+// part of the SIMD register. This is so we can overlap the
+// multiplication by r^8 and the unpacking of the other part.
+//
+// The constants are:
+// T_hi + T_lo = accurate constant term in power series
+// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
+// Tau = multiplier for the reciprocal, always -1 or 0
+//
+// The basic reconstruction formula using these constants is:
+//
+// High = tau * recip_hi + t_hi
+// Med = (sgn * r + t_hl * r)_hi
+// Low = (sgn * r + t_hl * r)_lo +
+//       tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
+//
+// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
+//
+// (c0 = c1 = 0, but using them keeps SIMD regularity)
+//
+// We then do a compensated sum High + Med, add the low parts together
+// and then do the final sum.
+//
+// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
+// modulo pi/2
+//
+// Special cases:
+//  tan(NaN) = quiet NaN, and raise invalid exception
+//  tan(INF) = NaN and raise invalid exception
+//  tan(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  tan
+ENTRY(tan)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $120, %esp
+        movl      %ebx, 56(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     128(%esp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        subl      $14368, %eax
+        cmpl      $2216, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        movapd    5840(%ebx), %xmm5
+        movapd    5856(%ebx), %xmm6
+        unpcklpd  %xmm0, %xmm0
+        movapd    5712(%ebx), %xmm4
+        andpd     %xmm0, %xmm4
+        movapd    5632(%ebx), %xmm1
+        mulpd     %xmm0, %xmm1
+        orpd      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        movapd    %xmm1, %xmm7
+        unpckhpd  %xmm7, %xmm7
+        cvttsd2si %xmm7, %edx
+        cvttpd2dq %xmm1, %xmm1
+        cvtdq2pd  %xmm1, %xmm1
+        mulpd     %xmm6, %xmm1
+        movapd    5664(%ebx), %xmm3
+        movsd     5728(%ebx), %xmm5
+        addl      $469248, %edx
+        movapd    5680(%ebx), %xmm4
+        mulpd     %xmm1, %xmm3
+        andl      $31, %edx
+        mulsd     %xmm1, %xmm5
+        movl      %edx, %ecx
+        mulpd     %xmm1, %xmm4
+        shll      $1, %ecx
+        subpd     %xmm3, %xmm0
+        mulpd     5696(%ebx), %xmm1
+        addl      %ecx, %edx
+        shll      $2, %ecx
+        addl      %ecx, %edx
+        addsd     %xmm0, %xmm5
+        movapd    %xmm0, %xmm2
+        subpd     %xmm4, %xmm0
+        movsd     5744(%ebx), %xmm6
+        shll      $4, %edx
+        lea       (%ebx), %eax
+        andpd     5776(%ebx), %xmm5
+        movapd    %xmm0, %xmm3
+        addl      %edx, %eax
+        subpd     %xmm0, %xmm2
+        unpckhpd  %xmm0, %xmm0
+        divsd     %xmm5, %xmm6
+        subpd     %xmm4, %xmm2
+        movapd    16(%eax), %xmm7
+        subsd     %xmm5, %xmm3
+        mulpd     %xmm0, %xmm7
+        subpd     %xmm1, %xmm2
+        movapd    48(%eax), %xmm1
+        mulpd     %xmm0, %xmm1
+        movapd    96(%eax), %xmm4
+        mulpd     %xmm0, %xmm4
+        addsd     %xmm3, %xmm2
+        movapd    %xmm0, %xmm3
+        mulpd     %xmm0, %xmm0
+        addpd     (%eax), %xmm7
+        addpd     32(%eax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     80(%eax), %xmm4
+        addpd     %xmm1, %xmm7
+        movapd    112(%eax), %xmm1
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm0
+        addpd     %xmm1, %xmm4
+        movapd    64(%eax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm1, %xmm7
+        movapd    %xmm3, %xmm1
+        mulpd     %xmm0, %xmm3
+        mulsd     %xmm0, %xmm0
+        mulpd     144(%eax), %xmm1
+        mulpd     %xmm3, %xmm4
+        movapd    %xmm1, %xmm3
+        addpd     %xmm4, %xmm7
+        movapd    %xmm1, %xmm4
+        mulsd     %xmm7, %xmm0
+        unpckhpd  %xmm7, %xmm7
+        addsd     %xmm7, %xmm0
+        unpckhpd  %xmm1, %xmm1
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        movapd    %xmm2, %xmm4
+        movsd     144(%eax), %xmm7
+        unpckhpd  %xmm2, %xmm2
+        addsd     152(%eax), %xmm7
+        mulsd     %xmm2, %xmm7
+        addsd     136(%eax), %xmm7
+        addsd     %xmm1, %xmm7
+        addsd     %xmm7, %xmm0
+        movsd     5744(%ebx), %xmm7
+        mulsd     %xmm6, %xmm4
+        movsd     168(%eax), %xmm2
+        andpd     %xmm6, %xmm2
+        mulsd     %xmm2, %xmm5
+        mulsd     160(%eax), %xmm6
+        subsd     %xmm5, %xmm7
+        subsd     128(%eax), %xmm2
+        subsd     %xmm4, %xmm7
+        mulsd     %xmm6, %xmm7
+        movapd    %xmm3, %xmm4
+        subsd     %xmm2, %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm0
+        subsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        movsd     %xmm0, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        jg        .L_2TAG_PACKET_2.0.2
+        shrl      $4, %eax
+        cmpl      $268434558, %eax
+        jne       .L_2TAG_PACKET_3.0.2
+        movapd    %xmm0, %xmm3
+        mulsd     5808(%ebx), %xmm3
+.L_2TAG_PACKET_3.0.2:
+        movsd     5792(%ebx), %xmm3
+        mulsd     %xmm0, %xmm3
+        addsd     %xmm0, %xmm3
+        mulsd     5808(%ebx), %xmm3
+        movsd     %xmm3, (%esp)
+        fldl      (%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movq      5712(%ebx), %xmm7
+        andpd     %xmm0, %xmm7
+        xorpd     %xmm0, %xmm7
+        ucomisd   5760(%ebx), %xmm7
+        je        .L_2TAG_PACKET_4.0.2
+        subl      $32, %esp
+        movsd     %xmm0, (%esp)
+        lea       40(%esp), %eax
+        movl      %eax, 8(%esp)
+        movl      $2, %eax
+        movl      %eax, 12(%esp)
+        call      __libm_tancot_huge
+        addl      $32, %esp
+        fldl      8(%esp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_4.0.2:
+        movq      %xmm0, (%esp)
+        fldl      (%esp)
+        fsubl     (%esp)
+.L_2TAG_PACKET_1.0.2:
+        movl      56(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(tan)
+# -- End  tan
+
+# Start file scope ASM
+ALIAS_SYMBOL(tanl, tan);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1066820852
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1441186365
+	.long	1065494243
+	.long	1431655765
+	.long	1070945621
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	236289504
+	.long	1064135997
+	.long	286331153
+	.long	1069617425
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1160476131
+	.long	1062722102
+	.long	463583772
+	.long	1068212666
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1313038235
+	.long	1066745731
+	.long	0
+	.long	0
+	.long	1013878342
+	.long	1067152618
+	.long	0
+	.long	0
+	.long	3663426833
+	.long	1065725283
+	.long	3693284251
+	.long	1069118808
+	.long	650852232
+	.long	1065882376
+	.long	1996245381
+	.long	1071000265
+	.long	2008746170
+	.long	1064664197
+	.long	3055842593
+	.long	1068578846
+	.long	1495406348
+	.long	1064652437
+	.long	2269530157
+	.long	1069711235
+	.long	285563696
+	.long	1063576465
+	.long	1046897440
+	.long	1067705865
+	.long	233429731
+	.long	1063453151
+	.long	522045958
+	.long	1068476590
+	.long	2354785698
+	.long	1069102779
+	.long	1317599141
+	.long	1012432133
+	.long	0
+	.long	1072693248
+	.long	2828230105
+	.long	1065606626
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1512545955
+	.long	1068119047
+	.long	0
+	.long	0
+	.long	1127048698
+	.long	1067909459
+	.long	0
+	.long	0
+	.long	2300200450
+	.long	1067254767
+	.long	3593250296
+	.long	1070233561
+	.long	3009365544
+	.long	1066902117
+	.long	1127373050
+	.long	1071173457
+	.long	3046103305
+	.long	1066371299
+	.long	24583402
+	.long	1069723988
+	.long	4082511758
+	.long	1065914199
+	.long	3223889699
+	.long	1070020367
+	.long	548927984
+	.long	1065415756
+	.long	558065897
+	.long	1068949418
+	.long	680073315
+	.long	1064940726
+	.long	388873200
+	.long	1068944270
+	.long	3763679576
+	.long	1070167541
+	.long	1497360404
+	.long	1009710547
+	.long	0
+	.long	1072693248
+	.long	64931152
+	.long	1067729411
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2467582782
+	.long	1069256389
+	.long	0
+	.long	0
+	.long	162150096
+	.long	1068946420
+	.long	0
+	.long	0
+	.long	3702794237
+	.long	1068579152
+	.long	3631919291
+	.long	1070936926
+	.long	3456821413
+	.long	1068217218
+	.long	2031366438
+	.long	1071495745
+	.long	1596664020
+	.long	1067799281
+	.long	1509038701
+	.long	1070601643
+	.long	583171477
+	.long	1067510148
+	.long	3785344682
+	.long	1070618476
+	.long	2402036048
+	.long	1067075736
+	.long	3233018412
+	.long	1069913186
+	.long	411280568
+	.long	1066710556
+	.long	1065584192
+	.long	1069747896
+	.long	895247324
+	.long	1070819848
+	.long	500078909
+	.long	3161288781
+	.long	0
+	.long	1072693248
+	.long	729983843
+	.long	1068994194
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1458794562
+	.long	1070398550
+	.long	0
+	.long	0
+	.long	2857777489
+	.long	1070137637
+	.long	0
+	.long	0
+	.long	1024359517
+	.long	1069876531
+	.long	2616040238
+	.long	1071582937
+	.long	1609024636
+	.long	1069675088
+	.long	2529240549
+	.long	1071836633
+	.long	1510128600
+	.long	1069440113
+	.long	2251697184
+	.long	1071253687
+	.long	1262761453
+	.long	1069142850
+	.long	1263091857
+	.long	1071190461
+	.long	3043383486
+	.long	1068885191
+	.long	2476932470
+	.long	1070842002
+	.long	3659995028
+	.long	1068669200
+	.long	855891755
+	.long	1070696894
+	.long	2583490354
+	.long	1071284857
+	.long	3062633575
+	.long	1014008623
+	.long	0
+	.long	1072693248
+	.long	2550940471
+	.long	1069938201
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3422807297
+	.long	1071640847
+	.long	0
+	.long	0
+	.long	1151658053
+	.long	1071494715
+	.long	0
+	.long	0
+	.long	929607071
+	.long	1071346340
+	.long	1037049034
+	.long	1072037305
+	.long	2786928657
+	.long	1071215282
+	.long	1447406859
+	.long	1072265209
+	.long	3490952107
+	.long	1071090851
+	.long	3205232916
+	.long	1071968658
+	.long	1297344304
+	.long	1070977120
+	.long	1066110976
+	.long	1071946035
+	.long	3803721480
+	.long	1070871082
+	.long	1496754229
+	.long	1071807201
+	.long	2982550683
+	.long	1070773243
+	.long	4014441989
+	.long	1071736222
+	.long	419968236
+	.long	1071717047
+	.long	3451266538
+	.long	3163444811
+	.long	0
+	.long	1072693248
+	.long	2960267235
+	.long	1070745841
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	724322768
+	.long	1072881308
+	.long	0
+	.long	0
+	.long	643153048
+	.long	1072905816
+	.long	0
+	.long	0
+	.long	4285079458
+	.long	1072928558
+	.long	3912524733
+	.long	1072622983
+	.long	118362272
+	.long	1072952754
+	.long	4107767972
+	.long	1072827408
+	.long	2689502883
+	.long	1072976922
+	.long	946523347
+	.long	1072772766
+	.long	573204189
+	.long	1073001761
+	.long	581531518
+	.long	1072826391
+	.long	1386236526
+	.long	1073026959
+	.long	3718905905
+	.long	1072832823
+	.long	1145558140
+	.long	1073052673
+	.long	513572637
+	.long	1072861969
+	.long	716700048
+	.long	1071997368
+	.long	547126769
+	.long	1015523525
+	.long	0
+	.long	1072693248
+	.long	1097907398
+	.long	1071420120
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3349892442
+	.long	1074290212
+	.long	0
+	.long	0
+	.long	3913197405
+	.long	1074501181
+	.long	0
+	.long	0
+	.long	2494034522
+	.long	1074739170
+	.long	1264738763
+	.long	1073084804
+	.long	1520293906
+	.long	1074899632
+	.long	1958936600
+	.long	1073411493
+	.long	2133649635
+	.long	1075052171
+	.long	4270740730
+	.long	1073574708
+	.long	1728930189
+	.long	1075224844
+	.long	1303998552
+	.long	1073799186
+	.long	618611933
+	.long	1075420255
+	.long	1769828046
+	.long	1073938542
+	.long	2200537986
+	.long	1075641421
+	.long	433361110
+	.long	1074105369
+	.long	719595600
+	.long	1072317184
+	.long	294527206
+	.long	3162140088
+	.long	0
+	.long	1073741824
+	.long	3811788216
+	.long	3218400550
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1704352102
+	.long	1075943001
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1076258036
+	.long	0
+	.long	0
+	.long	2211264291
+	.long	1076659010
+	.long	0
+	.long	1073741824
+	.long	1441186365
+	.long	1077028579
+	.long	1431655765
+	.long	1074091349
+	.long	876943673
+	.long	1077353622
+	.long	2863311531
+	.long	1074440874
+	.long	236289504
+	.long	1077767485
+	.long	286331153
+	.long	1074860305
+	.long	2805473311
+	.long	1078115278
+	.long	95443718
+	.long	1075163227
+	.long	1160476131
+	.long	1078450742
+	.long	463583772
+	.long	1075552698
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	1073741824
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1330165971
+	.long	3207850745
+	.long	0
+	.long	0
+	.long	217536623
+	.long	1059109098
+	.long	0
+	.long	0
+	.long	3492120849
+	.long	3205151475
+	.long	602185705
+	.long	3215678092
+	.long	760422958
+	.long	1056312597
+	.long	555127889
+	.long	1067545266
+	.long	3139784124
+	.long	3202470837
+	.long	3690544014
+	.long	3213150171
+	.long	95707915
+	.long	1053635428
+	.long	4003114407
+	.long	1064581412
+	.long	2034926231
+	.long	3199711161
+	.long	3759536023
+	.long	3210559989
+	.long	3826928214
+	.long	1050893819
+	.long	3837960785
+	.long	1061790379
+	.long	1526325248
+	.long	3217967566
+	.long	2356426521
+	.long	1025423456
+	.long	0
+	.long	0
+	.long	457728975
+	.long	1071088276
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1398462608
+	.long	3207303968
+	.long	0
+	.long	0
+	.long	26205983
+	.long	1058461213
+	.long	0
+	.long	0
+	.long	56226238
+	.long	3204528612
+	.long	2754706541
+	.long	3215359511
+	.long	2187799823
+	.long	1055634437
+	.long	790323742
+	.long	1067402587
+	.long	1372385848
+	.long	3201651479
+	.long	4097292716
+	.long	3212856302
+	.long	3348210357
+	.long	1052830099
+	.long	2442796466
+	.long	1064337602
+	.long	862608142
+	.long	3198830754
+	.long	170296152
+	.long	3210060867
+	.long	3755571428
+	.long	1049933343
+	.long	3614866008
+	.long	1061361670
+	.long	719978496
+	.long	3217669096
+	.long	1998842465
+	.long	3174703977
+	.long	0
+	.long	0
+	.long	3749156607
+	.long	1071048258
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3120498638
+	.long	3206749304
+	.long	0
+	.long	0
+	.long	2773578114
+	.long	1058009312
+	.long	0
+	.long	0
+	.long	2030783676
+	.long	3203817873
+	.long	2223654598
+	.long	3215071936
+	.long	2976134650
+	.long	1054987244
+	.long	706390066
+	.long	1067217386
+	.long	4258437615
+	.long	3200900378
+	.long	1066252975
+	.long	3212391267
+	.long	815777514
+	.long	1051989462
+	.long	3202745457
+	.long	1064010682
+	.long	2493556375
+	.long	3198004753
+	.long	1046243251
+	.long	3209678971
+	.long	2593078846
+	.long	1049017717
+	.long	2763962276
+	.long	1060970161
+	.long	701480960
+	.long	3217377742
+	.long	3205862232
+	.long	3174660915
+	.long	0
+	.long	0
+	.long	2267016812
+	.long	1071015664
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	2107155798
+	.long	3206166872
+	.long	0
+	.long	0
+	.long	2642992129
+	.long	1057424578
+	.long	0
+	.long	0
+	.long	1936992811
+	.long	3203204426
+	.long	1485063559
+	.long	3214682643
+	.long	1432914553
+	.long	1054319398
+	.long	3996381654
+	.long	1067075828
+	.long	2833029256
+	.long	3200223545
+	.long	2866066872
+	.long	3211982662
+	.long	2432888737
+	.long	1051234178
+	.long	3669764559
+	.long	1063748136
+	.long	2458496952
+	.long	3197170774
+	.long	1948234989
+	.long	3209098147
+	.long	2843698787
+	.long	1048163519
+	.long	3398041407
+	.long	1060559728
+	.long	2829230080
+	.long	3217092115
+	.long	1034046433
+	.long	3174271903
+	.long	0
+	.long	0
+	.long	298675305
+	.long	1070989821
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	437603223
+	.long	3205589761
+	.long	0
+	.long	0
+	.long	759330352
+	.long	1057048511
+	.long	0
+	.long	0
+	.long	3107463368
+	.long	3202507988
+	.long	3144465176
+	.long	3214191500
+	.long	2290961810
+	.long	1053841035
+	.long	1618153340
+	.long	1066971547
+	.long	3836869393
+	.long	3199400272
+	.long	584032116
+	.long	3211469261
+	.long	1245704358
+	.long	1050626462
+	.long	4247487438
+	.long	1063561943
+	.long	1669034927
+	.long	3196274812
+	.long	3844233498
+	.long	3208626322
+	.long	2706958524
+	.long	1047411374
+	.long	3857199098
+	.long	1060281647
+	.long	3593904128
+	.long	3216590719
+	.long	3267547836
+	.long	3172163321
+	.long	0
+	.long	0
+	.long	4076712227
+	.long	1070970214
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3290090340
+	.long	3204793485
+	.long	0
+	.long	0
+	.long	3685760367
+	.long	1056668370
+	.long	0
+	.long	0
+	.long	2655163949
+	.long	3201674917
+	.long	628750575
+	.long	3213566872
+	.long	680140505
+	.long	1053299777
+	.long	2954464709
+	.long	1066900026
+	.long	803201619
+	.long	3198516435
+	.long	1466315631
+	.long	3210837162
+	.long	1611220163
+	.long	1049972438
+	.long	2766187256
+	.long	1063437894
+	.long	1804579484
+	.long	3195331491
+	.long	3695969289
+	.long	3207854418
+	.long	2617238373
+	.long	1046675948
+	.long	3095830084
+	.long	1060095334
+	.long	3789570048
+	.long	3216034914
+	.long	23826559
+	.long	3172048060
+	.long	0
+	.long	0
+	.long	3870939386
+	.long	1070956467
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1571758758
+	.long	3203672535
+	.long	0
+	.long	0
+	.long	113026373
+	.long	1056416381
+	.long	0
+	.long	0
+	.long	1913766298
+	.long	3200523326
+	.long	2507068734
+	.long	3212502004
+	.long	4000648818
+	.long	1053003803
+	.long	2446607349
+	.long	1066858259
+	.long	912662124
+	.long	3197333001
+	.long	1349489537
+	.long	3209765608
+	.long	3412972607
+	.long	1049641401
+	.long	1721283327
+	.long	1063366855
+	.long	1466691883
+	.long	3194116746
+	.long	3852528092
+	.long	3206760861
+	.long	285443293
+	.long	1046158380
+	.long	1758739894
+	.long	1059895449
+	.long	1858781184
+	.long	3214984212
+	.long	3447575948
+	.long	1024675855
+	.long	0
+	.long	0
+	.long	2242038011
+	.long	1070948320
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	737611454
+	.long	1056336527
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3594790527
+	.long	1052911621
+	.long	381774871
+	.long	1066844524
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3303051618
+	.long	1049456050
+	.long	3154187623
+	.long	1063343722
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	528061788
+	.long	1045944910
+	.long	2469719819
+	.long	1059831159
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1431655765
+	.long	1070945621
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1571758758
+	.long	1056188887
+	.long	0
+	.long	0
+	.long	113026373
+	.long	1056416381
+	.long	0
+	.long	0
+	.long	1913766298
+	.long	1053039678
+	.long	2507068734
+	.long	1065018356
+	.long	4000648818
+	.long	1053003803
+	.long	2446607349
+	.long	1066858259
+	.long	912662124
+	.long	1049849353
+	.long	1349489537
+	.long	1062281960
+	.long	3412972607
+	.long	1049641401
+	.long	1721283327
+	.long	1063366855
+	.long	1466691883
+	.long	1046633098
+	.long	3852528092
+	.long	1059277213
+	.long	285443293
+	.long	1046158380
+	.long	1758739894
+	.long	1059895449
+	.long	1858781184
+	.long	1067500564
+	.long	3447575948
+	.long	3172159503
+	.long	0
+	.long	0
+	.long	2242038011
+	.long	1070948320
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3290090340
+	.long	1057309837
+	.long	0
+	.long	0
+	.long	3685760367
+	.long	1056668370
+	.long	0
+	.long	0
+	.long	2655163949
+	.long	1054191269
+	.long	628750575
+	.long	1066083224
+	.long	680140505
+	.long	1053299777
+	.long	2954464709
+	.long	1066900026
+	.long	803201619
+	.long	1051032787
+	.long	1466315631
+	.long	1063353514
+	.long	1611220163
+	.long	1049972438
+	.long	2766187256
+	.long	1063437894
+	.long	1804579484
+	.long	1047847843
+	.long	3695969289
+	.long	1060370770
+	.long	2617238373
+	.long	1046675948
+	.long	3095830084
+	.long	1060095334
+	.long	3789570048
+	.long	1068551266
+	.long	23826559
+	.long	1024564412
+	.long	0
+	.long	0
+	.long	3870939386
+	.long	1070956467
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	437603223
+	.long	1058106113
+	.long	0
+	.long	0
+	.long	759330352
+	.long	1057048511
+	.long	0
+	.long	0
+	.long	3107463368
+	.long	1055024340
+	.long	3144465176
+	.long	1066707852
+	.long	2290961810
+	.long	1053841035
+	.long	1618153340
+	.long	1066971547
+	.long	3836869393
+	.long	1051916624
+	.long	584032116
+	.long	1063985613
+	.long	1245704358
+	.long	1050626462
+	.long	4247487438
+	.long	1063561943
+	.long	1669034927
+	.long	1048791164
+	.long	3844233498
+	.long	1061142674
+	.long	2706958524
+	.long	1047411374
+	.long	3857199098
+	.long	1060281647
+	.long	3593904128
+	.long	1069107071
+	.long	3267547836
+	.long	1024679673
+	.long	0
+	.long	0
+	.long	4076712227
+	.long	1070970214
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	2107155798
+	.long	1058683224
+	.long	0
+	.long	0
+	.long	2642992129
+	.long	1057424578
+	.long	0
+	.long	0
+	.long	1936992811
+	.long	1055720778
+	.long	1485063559
+	.long	1067198995
+	.long	1432914553
+	.long	1054319398
+	.long	3996381654
+	.long	1067075828
+	.long	2833029256
+	.long	1052739897
+	.long	2866066872
+	.long	1064499014
+	.long	2432888737
+	.long	1051234178
+	.long	3669764559
+	.long	1063748136
+	.long	2458496952
+	.long	1049687126
+	.long	1948234989
+	.long	1061614499
+	.long	2843698787
+	.long	1048163519
+	.long	3398041407
+	.long	1060559728
+	.long	2829230080
+	.long	1069608467
+	.long	1034046433
+	.long	1026788255
+	.long	0
+	.long	0
+	.long	298675305
+	.long	1070989821
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3120498638
+	.long	1059265656
+	.long	0
+	.long	0
+	.long	2773578114
+	.long	1058009312
+	.long	0
+	.long	0
+	.long	2030783676
+	.long	1056334225
+	.long	2223654598
+	.long	1067588288
+	.long	2976134650
+	.long	1054987244
+	.long	706390066
+	.long	1067217386
+	.long	4258437615
+	.long	1053416730
+	.long	1066252975
+	.long	1064907619
+	.long	815777514
+	.long	1051989462
+	.long	3202745457
+	.long	1064010682
+	.long	2493556375
+	.long	1050521105
+	.long	1046243251
+	.long	1062195323
+	.long	2593078846
+	.long	1049017717
+	.long	2763962276
+	.long	1060970161
+	.long	701480960
+	.long	1069894094
+	.long	3205862232
+	.long	1027177267
+	.long	0
+	.long	0
+	.long	2267016812
+	.long	1071015664
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1398462608
+	.long	1059820320
+	.long	0
+	.long	0
+	.long	26205983
+	.long	1058461213
+	.long	0
+	.long	0
+	.long	56226238
+	.long	1057044964
+	.long	2754706541
+	.long	1067875863
+	.long	2187799823
+	.long	1055634437
+	.long	790323742
+	.long	1067402587
+	.long	1372385848
+	.long	1054167831
+	.long	4097292716
+	.long	1065372654
+	.long	3348210357
+	.long	1052830099
+	.long	2442796466
+	.long	1064337602
+	.long	862608142
+	.long	1051347106
+	.long	170296152
+	.long	1062577219
+	.long	3755571428
+	.long	1049933343
+	.long	3614866008
+	.long	1061361670
+	.long	719978496
+	.long	1070185448
+	.long	1998842465
+	.long	1027220329
+	.long	0
+	.long	0
+	.long	3749156607
+	.long	1071048258
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1330165971
+	.long	1060367097
+	.long	0
+	.long	0
+	.long	217536623
+	.long	1059109098
+	.long	0
+	.long	0
+	.long	3492120849
+	.long	1057667827
+	.long	602185705
+	.long	1068194444
+	.long	760422958
+	.long	1056312597
+	.long	555127889
+	.long	1067545266
+	.long	3139784124
+	.long	1054987189
+	.long	3690544014
+	.long	1065666523
+	.long	95707915
+	.long	1053635428
+	.long	4003114407
+	.long	1064581412
+	.long	2034926231
+	.long	1052227513
+	.long	3759536023
+	.long	1063076341
+	.long	3826928214
+	.long	1050893819
+	.long	3837960785
+	.long	1061790379
+	.long	1526325248
+	.long	1070483918
+	.long	2356426521
+	.long	3172907104
+	.long	0
+	.long	0
+	.long	457728975
+	.long	1071088276
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1704352102
+	.long	3223426649
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1076258036
+	.long	0
+	.long	0
+	.long	2211264291
+	.long	3224142658
+	.long	0
+	.long	3221225472
+	.long	1441186365
+	.long	1077028579
+	.long	1431655765
+	.long	1074091349
+	.long	876943673
+	.long	3224837270
+	.long	2863311531
+	.long	3221924522
+	.long	236289504
+	.long	1077767485
+	.long	286331153
+	.long	1074860305
+	.long	2805473311
+	.long	3225598926
+	.long	95443718
+	.long	3222646875
+	.long	1160476131
+	.long	1078450742
+	.long	463583772
+	.long	1075552698
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	1073741824
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3349892442
+	.long	3221773860
+	.long	0
+	.long	0
+	.long	3913197405
+	.long	1074501181
+	.long	0
+	.long	0
+	.long	2494034522
+	.long	3222222818
+	.long	1264738763
+	.long	3220568452
+	.long	1520293906
+	.long	1074899632
+	.long	1958936600
+	.long	1073411493
+	.long	2133649635
+	.long	3222535819
+	.long	4270740730
+	.long	3221058356
+	.long	1728930189
+	.long	1075224844
+	.long	1303998552
+	.long	1073799186
+	.long	618611933
+	.long	3222903903
+	.long	1769828046
+	.long	3221422190
+	.long	2200537986
+	.long	1075641421
+	.long	433361110
+	.long	1074105369
+	.long	719595600
+	.long	3219800832
+	.long	294527206
+	.long	1014656440
+	.long	0
+	.long	1073741824
+	.long	3811788216
+	.long	3218400550
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	724322768
+	.long	3220364956
+	.long	0
+	.long	0
+	.long	643153048
+	.long	1072905816
+	.long	0
+	.long	0
+	.long	4285079458
+	.long	3220412206
+	.long	3912524733
+	.long	3220106631
+	.long	118362272
+	.long	1072952754
+	.long	4107767972
+	.long	1072827408
+	.long	2689502883
+	.long	3220460570
+	.long	946523347
+	.long	3220256414
+	.long	573204189
+	.long	1073001761
+	.long	581531518
+	.long	1072826391
+	.long	1386236526
+	.long	3220510607
+	.long	3718905905
+	.long	3220316471
+	.long	1145558140
+	.long	1073052673
+	.long	513572637
+	.long	1072861969
+	.long	716700048
+	.long	3219481016
+	.long	547126769
+	.long	3163007173
+	.long	0
+	.long	1072693248
+	.long	1097907398
+	.long	1071420120
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3422807297
+	.long	3219124495
+	.long	0
+	.long	0
+	.long	1151658053
+	.long	1071494715
+	.long	0
+	.long	0
+	.long	929607071
+	.long	3218829988
+	.long	1037049034
+	.long	3219520953
+	.long	2786928657
+	.long	1071215282
+	.long	1447406859
+	.long	1072265209
+	.long	3490952107
+	.long	3218574499
+	.long	3205232916
+	.long	3219452306
+	.long	1297344304
+	.long	1070977120
+	.long	1066110976
+	.long	1071946035
+	.long	3803721480
+	.long	3218354730
+	.long	1496754229
+	.long	3219290849
+	.long	2982550683
+	.long	1070773243
+	.long	4014441989
+	.long	1071736222
+	.long	419968236
+	.long	3219200695
+	.long	3451266538
+	.long	1015961163
+	.long	0
+	.long	1072693248
+	.long	2960267235
+	.long	1070745841
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1458794562
+	.long	3217882198
+	.long	0
+	.long	0
+	.long	2857777489
+	.long	1070137637
+	.long	0
+	.long	0
+	.long	1024359517
+	.long	3217360179
+	.long	2616040238
+	.long	3219066585
+	.long	1609024636
+	.long	1069675088
+	.long	2529240549
+	.long	1071836633
+	.long	1510128600
+	.long	3216923761
+	.long	2251697184
+	.long	3218737335
+	.long	1262761453
+	.long	1069142850
+	.long	1263091857
+	.long	1071190461
+	.long	3043383486
+	.long	3216368839
+	.long	2476932470
+	.long	3218325650
+	.long	3659995028
+	.long	1068669200
+	.long	855891755
+	.long	1070696894
+	.long	2583490354
+	.long	3218768505
+	.long	3062633575
+	.long	3161492271
+	.long	0
+	.long	1072693248
+	.long	2550940471
+	.long	1069938201
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2467582782
+	.long	3216740037
+	.long	0
+	.long	0
+	.long	162150096
+	.long	1068946420
+	.long	0
+	.long	0
+	.long	3702794237
+	.long	3216062800
+	.long	3631919291
+	.long	3218420574
+	.long	3456821413
+	.long	1068217218
+	.long	2031366438
+	.long	1071495745
+	.long	1596664020
+	.long	3215282929
+	.long	1509038701
+	.long	3218085291
+	.long	583171477
+	.long	1067510148
+	.long	3785344682
+	.long	1070618476
+	.long	2402036048
+	.long	3214559384
+	.long	3233018412
+	.long	3217396834
+	.long	411280568
+	.long	1066710556
+	.long	1065584192
+	.long	1069747896
+	.long	895247324
+	.long	3218303496
+	.long	500078909
+	.long	1013805133
+	.long	0
+	.long	1072693248
+	.long	729983843
+	.long	1068994194
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1512545955
+	.long	3215602695
+	.long	0
+	.long	0
+	.long	1127048698
+	.long	1067909459
+	.long	0
+	.long	0
+	.long	2300200450
+	.long	3214738415
+	.long	3593250296
+	.long	3217717209
+	.long	3009365544
+	.long	1066902117
+	.long	1127373050
+	.long	1071173457
+	.long	3046103305
+	.long	3213854947
+	.long	24583402
+	.long	3217207636
+	.long	4082511758
+	.long	1065914199
+	.long	3223889699
+	.long	1070020367
+	.long	548927984
+	.long	3212899404
+	.long	558065897
+	.long	3216433066
+	.long	680073315
+	.long	1064940726
+	.long	388873200
+	.long	1068944270
+	.long	3763679576
+	.long	3217651189
+	.long	1497360404
+	.long	3157194195
+	.long	0
+	.long	1072693248
+	.long	64931152
+	.long	1067729411
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1313038235
+	.long	3214229379
+	.long	0
+	.long	0
+	.long	1013878342
+	.long	1067152618
+	.long	0
+	.long	0
+	.long	3663426833
+	.long	3213208931
+	.long	3693284251
+	.long	3216602456
+	.long	650852232
+	.long	1065882376
+	.long	1996245381
+	.long	1071000265
+	.long	2008746170
+	.long	3212147845
+	.long	3055842593
+	.long	3216062494
+	.long	1495406348
+	.long	1064652437
+	.long	2269530157
+	.long	1069711235
+	.long	285563696
+	.long	3211060113
+	.long	1046897440
+	.long	3215189513
+	.long	233429731
+	.long	1063453151
+	.long	522045958
+	.long	1068476590
+	.long	2354785698
+	.long	3216586427
+	.long	1317599141
+	.long	3159915781
+	.long	0
+	.long	1072693248
+	.long	2828230105
+	.long	1065606626
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1841940611
+	.long	1071931184
+	.long	1841940611
+	.long	1076125488
+	.long	0
+	.long	1131937792
+	.long	0
+	.long	1127743488
+	.long	1413758976
+	.long	1069097467
+	.long	1413742592
+	.long	1069097467
+	.long	1734819840
+	.long	3174229945
+	.long	1280049152
+	.long	1028033571
+	.long	923219018
+	.long	984130272
+	.long	57701189
+	.long	988383790
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	1734816687
+	.long	1026746297
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	0
+	.long	4294705152
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	0
+	.long	1130364928
+	.long	0
+	.long	0
+	.long	0
+	.long	1015021568
+	.long	0
+	.long	0
+	.long	0
+	.long	1017118720
+	.long	0
+	.long	0
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1076887552
+	.long	0
+	.long	1072693248
+	.type	static_const_table,@object
+	.size	static_const_table,5872
+	.data
+	.hidden __libm_tancot_huge
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/s_tanh.S b/libm/x86/s_tanh.S
new file mode 100644
index 0000000..737bcbb
--- /dev/null
+++ b/libm/x86/s_tanh.S
@@ -0,0 +1,1361 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))=(1-exp(-2*x))/(1+exp(-2*x))
+//
+// Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+// log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//         L2EH+L2EL (upper 26, lower 53 bits)
+//
+// Let xH*L2EH=k+f+r`, where (k+f)*2^8*2=int(xH*L2EH*2^9),
+//                             f=0.b1 b2 ... b8, k integer
+// 2^{-f} is approximated as Tn[f]+Dn[f]
+// Tn stores the high 53 bits, Dn stores (2^{-f}-Tn[f]) rounded to double precision
+//
+//  r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-9}+2^{-14},
+//                      for |x| in [23/64,3*2^7)
+// e^{-2*|x|}=2^{-k-f}*2^{-r} ~ 2^{-k}*(Tn+Dn)*(1+p)=(T0+D0)*(1+p)
+//
+// For |x| in [2^{-4},2^5):
+//         2^{-r}-1 ~ p=c1*r+c2*r^2+..+c5*r^5
+//      Let R=1/(1+T0+p*T0), truncated to 35 significant bits
+//  R=1/(1+T0+D0+p*(T0+D0))*(1+eps), |eps|<2^{-33}
+//  1+T0+D0+p*(T0+D0)=KH+KL, where
+//       KH=(1+T0+c1*r*T0)_high (leading 17 bits)
+//       KL=T0_low+D0+(c1*r*T0)_low+c1*r*D0+(c2*r^2+..c5*r^5)*T0
+//  eps ~ (R*KH-1)+R*KL
+//  1/(1+T0+D0+p*(T0+D0)) ~ R-R*eps
+//  The result is approximated as (1-T0-D0-(T0+D0)*p)*(R-R*eps)
+//  1-T0-D0-(T0+D0)*p=-((KH-2)+KL)
+//    The result is formed as
+//    (KH-2)*R+(-(KH-2)*R*eps+(KL*R-KL*R*eps)), with the correct sign
+//                                                  set at the end
+//
+// For |x| in [2^{-64},2^{-4}):
+//  A Taylor series expansion is used  (x+p3*x^3+..+p13*x^{13})
+//
+// For |x|<2^{-64}:  x is returned
+//
+// For |x|>=2^32: return +/-1
+//
+// Special cases:
+//  tanh(NaN) = quiet NaN, and raise invalid exception
+//  tanh(INF) = that INF
+//  tanh(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  static_func
+        .text
+        .align __bionic_asm_align
+        .type static_func, @function
+static_func:
+..B1.1:
+        call      ..L2
+..L2:
+        popl      %eax
+        lea       _GLOBAL_OFFSET_TABLE_+[. - ..L2](%eax), %eax
+        lea       static_const_table@GOTOFF(%eax), %eax
+        ret
+        .size   static_func,.-static_func
+# -- End  static_func
+
+# -- Begin  tanh
+ENTRY(tanh)
+# parameter 1: 8 + %ebp
+..B2.1:
+..B2.2:
+        pushl     %ebp
+        movl      %esp, %ebp
+        subl      $104, %esp
+        movl      %ebx, 40(%esp)
+        call      static_func
+        movl      %eax, %ebx
+        movsd     112(%esp), %xmm0
+        movsd     4256(%ebx), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     4112(%ebx), %xmm1
+        movsd     4120(%ebx), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     4096(%ebx), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        movl      $32768, %edx
+        andl      %ecx, %edx
+        andl      $32767, %ecx
+        subl      $16304, %ecx
+        cmpl      $144, %ecx
+        jae       .L_2TAG_PACKET_0.0.2
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        movapd    %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        movsd     4264(%ebx), %xmm4
+        subsd     %xmm6, %xmm3
+        xorpd     %xmm0, %xmm0
+        addsd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm7
+        movapd    4128(%ebx), %xmm6
+        addsd     %xmm7, %xmm2
+        movl      $255, %ecx
+        andl      %eax, %ecx
+        addl      %ecx, %ecx
+        movapd    (%ebx,%ecx,8), %xmm5
+        shrl      $4, %eax
+        andl      $65520, %eax
+        subl      $16368, %eax
+        negl      %eax
+        pinsrw    $3, %eax, %xmm0
+        movapd    4144(%ebx), %xmm1
+        pshufd    $68, %xmm0, %xmm0
+        mulpd     %xmm5, %xmm0
+        movsd     4160(%ebx), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        movapd    %xmm4, %xmm5
+        addsd     %xmm0, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm7
+        mulpd     %xmm2, %xmm2
+        addpd     %xmm6, %xmm1
+        mulsd     %xmm2, %xmm2
+        movsd     4264(%ebx), %xmm3
+        mulpd     %xmm2, %xmm1
+        pshufd    $78, %xmm1, %xmm6
+        addsd     %xmm6, %xmm1
+        movapd    %xmm1, %xmm6
+        addsd     %xmm7, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm4, %xmm1
+        andpd     4224(%ebx), %xmm4
+        divsd     %xmm1, %xmm5
+        subsd     %xmm4, %xmm3
+        pshufd    $238, %xmm0, %xmm1
+        addsd     %xmm0, %xmm3
+        movapd    %xmm4, %xmm2
+        addsd     %xmm1, %xmm3
+        mulsd     %xmm7, %xmm1
+        mulsd     %xmm0, %xmm7
+        addsd     %xmm1, %xmm3
+        addsd     %xmm7, %xmm4
+        movsd     4240(%ebx), %xmm1
+        mulsd     %xmm0, %xmm6
+        andpd     4224(%ebx), %xmm4
+        addsd     %xmm6, %xmm3
+        movapd    %xmm4, %xmm6
+        subsd     %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        movsd     4264(%ebx), %xmm7
+        andpd     %xmm1, %xmm5
+        addsd     %xmm2, %xmm3
+        mulsd     %xmm5, %xmm4
+        xorpd     %xmm2, %xmm2
+        mulsd     %xmm5, %xmm3
+        subsd     4272(%ebx), %xmm6
+        subsd     %xmm7, %xmm4
+        xorl      $32768, %edx
+        pinsrw    $3, %edx, %xmm2
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm5, %xmm6
+        movapd    %xmm3, %xmm1
+        mulsd     %xmm4, %xmm3
+        movapd    %xmm6, %xmm0
+        mulsd     %xmm4, %xmm6
+        subsd     %xmm3, %xmm1
+        subsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_0.0.2:
+        addl      $960, %ecx
+        cmpl      $1104, %ecx
+        jae       .L_2TAG_PACKET_2.0.2
+        movapd    4176(%ebx), %xmm2
+        pshufd    $68, %xmm0, %xmm1
+        movapd    4192(%ebx), %xmm3
+        mulpd     %xmm1, %xmm1
+        movapd    4208(%ebx), %xmm4
+        mulpd     %xmm1, %xmm2
+        pshufd    $68, %xmm1, %xmm5
+        addpd     %xmm3, %xmm2
+        mulsd     %xmm5, %xmm5
+        mulpd     %xmm1, %xmm2
+        mulsd     %xmm5, %xmm5
+        addpd     %xmm4, %xmm2
+        mulpd     %xmm5, %xmm2
+        pshufd    $238, %xmm2, %xmm5
+        addsd     %xmm5, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        addl      $15344, %ecx
+        cmpl      $16448, %ecx
+        jae       .L_2TAG_PACKET_3.0.2
+        cmpl      $16, %ecx
+        jb        .L_2TAG_PACKET_4.0.2
+        xorpd     %xmm2, %xmm2
+        movl      $17392, %eax
+        pinsrw    $3, %eax, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm2
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_4.0.2:
+        movapd    %xmm0, %xmm2
+        mulsd     %xmm2, %xmm2
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_3.0.2:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm2, %xmm2
+        movl      $15344, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        movapd    %xmm2, %xmm3
+        mulsd     %xmm2, %xmm2
+        addsd     %xmm3, %xmm2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm0, %xmm0
+        orl       $16368, %edx
+        pinsrw    $3, %edx, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_5.0.2:
+        movapd    %xmm0, %xmm2
+        movd      %xmm0, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_6.0.2
+        addsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_1.0.2:
+        movsd     %xmm0, 24(%esp)
+        fldl      24(%esp)
+.L_2TAG_PACKET_7.0.2:
+        movl      40(%esp), %ebx
+        movl      %ebp, %esp
+        popl      %ebp
+        ret       
+..B2.3:
+END(tanh)
+# -- End  tanh
+
+# Start file scope ASM
+ALIAS_SYMBOL(tanhl, tanh);
+# End file scope ASM
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	1797923801
+	.long	1072687577
+	.long	1950547427
+	.long	1013229059
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	915592468
+	.long	1072676282
+	.long	352947894
+	.long	3161024371
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	35929225
+	.long	1072665048
+	.long	2809788041
+	.long	3159436968
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	2038973688
+	.long	1072653874
+	.long	892941374
+	.long	1016046459
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	1222472308
+	.long	1072642761
+	.long	1054357470
+	.long	3161021018
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	481706282
+	.long	1072631708
+	.long	1696079173
+	.long	3162710528
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	2719515920
+	.long	1072620714
+	.long	2760332941
+	.long	1015137933
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2256325230
+	.long	1072609780
+	.long	580117746
+	.long	1015317295
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	2009970496
+	.long	1072598905
+	.long	2159039665
+	.long	3162572948
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	610758006
+	.long	1072588089
+	.long	1965209397
+	.long	3161866232
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	991358482
+	.long	1072577331
+	.long	838715019
+	.long	3163157668
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	1796832535
+	.long	1072566631
+	.long	3176955716
+	.long	3160585513
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	1679558232
+	.long	1072555989
+	.long	2390342287
+	.long	3163333970
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	3594158869
+	.long	1072545404
+	.long	2456521700
+	.long	3163256561
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	1912561781
+	.long	1072534877
+	.long	3147495102
+	.long	1015678253
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3898795731
+	.long	1072524406
+	.long	1249994144
+	.long	1011869818
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	3939148246
+	.long	1072513992
+	.long	3210352148
+	.long	1015274323
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	721996136
+	.long	1072503635
+	.long	563754734
+	.long	1015371318
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1532734324
+	.long	1072493333
+	.long	3094216535
+	.long	3163162857
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	778901109
+	.long	1072483087
+	.long	2248183955
+	.long	3161268751
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	1464976603
+	.long	1072472896
+	.long	3507292405
+	.long	3161977534
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	2307442995
+	.long	1072462760
+	.long	3190117721
+	.long	3162404539
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	2029714210
+	.long	1072452679
+	.long	613660079
+	.long	1015099143
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3657065772
+	.long	1072442652
+	.long	399025623
+	.long	3162957078
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1631695677
+	.long	1072432680
+	.long	2717633076
+	.long	3162344026
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	3287523847
+	.long	1072422761
+	.long	1625971539
+	.long	3157009955
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	3080351519
+	.long	1072412896
+	.long	3379126788
+	.long	3157218001
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4062661092
+	.long	1072403084
+	.long	1422616006
+	.long	3163255318
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	703710506
+	.long	1072393326
+	.long	1384660846
+	.long	1015195891
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	364333489
+	.long	1072383620
+	.long	3923737744
+	.long	3161421373
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	1822067026
+	.long	1072373966
+	.long	1241994956
+	.long	1015340290
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	3861050111
+	.long	1072364364
+	.long	254893773
+	.long	3162813180
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	977020788
+	.long	1072354815
+	.long	3065100517
+	.long	1015541563
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	557149882
+	.long	1072345317
+	.long	3672720709
+	.long	1014537265
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	1405169241
+	.long	1072335870
+	.long	2998539689
+	.long	3162830951
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2331271250
+	.long	1072326474
+	.long	812057446
+	.long	1012207446
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	2152073944
+	.long	1072317129
+	.long	1486860576
+	.long	3163203456
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	3985553595
+	.long	1072307834
+	.long	4002146062
+	.long	1015834136
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	2366108318
+	.long	1072298590
+	.long	2867985102
+	.long	3161762254
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	424392917
+	.long	1072289396
+	.long	2749202995
+	.long	3162838718
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1297350157
+	.long	1072280251
+	.long	1308022040
+	.long	3163412558
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	3833209506
+	.long	1072271155
+	.long	2722920684
+	.long	1013754842
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	2591453363
+	.long	1072262109
+	.long	2132396182
+	.long	3159074198
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	727685349
+	.long	1072253112
+	.long	2038246809
+	.long	3162358742
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	1403662306
+	.long	1072244163
+	.long	2788809599
+	.long	3161671007
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	3492293770
+	.long	1072235262
+	.long	2248032210
+	.long	1015386826
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	1577608921
+	.long	1072226410
+	.long	1875489510
+	.long	3162968394
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	3134592888
+	.long	1072217605
+	.long	4232266862
+	.long	1015991134
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	2759350287
+	.long	1072208848
+	.long	1148526634
+	.long	1015894933
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	3643909174
+	.long	1072200138
+	.long	3537586109
+	.long	1014354647
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	396319521
+	.long	1072191476
+	.long	4172420816
+	.long	3159074632
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	515457527
+	.long	1072182860
+	.long	836709333
+	.long	1015651226
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	2916157145
+	.long	1072174290
+	.long	219487565
+	.long	1015309367
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	2224145553
+	.long	1072165767
+	.long	3482522030
+	.long	3161489169
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	1660913392
+	.long	1072157290
+	.long	4218599604
+	.long	1015135707
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	158781403
+	.long	1072148859
+	.long	2221464712
+	.long	3163286453
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	950803702
+	.long	1072140473
+	.long	1655364926
+	.long	1015237032
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	2980802057
+	.long	1072132132
+	.long	378619896
+	.long	1015773303
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	903334909
+	.long	1072123837
+	.long	1636462108
+	.long	1015039997
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	2263535754
+	.long	1072115586
+	.long	752233586
+	.long	3162639008
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	1727278727
+	.long	1072107380
+	.long	3562710623
+	.long	1011471940
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	2555984613
+	.long	1072099218
+	.long	2652555442
+	.long	3162552692
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	3721688645
+	.long	1072091100
+	.long	3069276937
+	.long	1015839401
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	4201977662
+	.long	1072083026
+	.long	748330254
+	.long	1013594357
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	2979960120
+	.long	1072074996
+	.long	2599109725
+	.long	1014498493
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	3339203574
+	.long	1072067009
+	.long	1483497780
+	.long	3162408754
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	4273770423
+	.long	1072059065
+	.long	3383180809
+	.long	3163218901
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	488188413
+	.long	1072051165
+	.long	3199821029
+	.long	1015564048
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3872257780
+	.long	1072043306
+	.long	1253592103
+	.long	1015958334
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	551349105
+	.long	1072035491
+	.long	3821916050
+	.long	3162106589
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2425981843
+	.long	1072027717
+	.long	2830390851
+	.long	3163346599
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	4222122499
+	.long	1072019985
+	.long	1277378074
+	.long	3163256737
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	671025100
+	.long	1072012296
+	.long	3832014351
+	.long	3163022030
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	3689071823
+	.long	1072004647
+	.long	2321004996
+	.long	3162552716
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3723038930
+	.long	1071997040
+	.long	378465264
+	.long	3162569582
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	4109806887
+	.long	1071989474
+	.long	422403966
+	.long	1014469229
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	3896463087
+	.long	1071981949
+	.long	1139797873
+	.long	3161233805
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	2135241198
+	.long	1071974465
+	.long	1236747871
+	.long	1013589147
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2178460671
+	.long	1071967021
+	.long	777878098
+	.long	3162842493
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3088564500
+	.long	1071959617
+	.long	1762311517
+	.long	1015045673
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	3933059031
+	.long	1071952253
+	.long	2133366768
+	.long	3161531832
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3784486610
+	.long	1071944929
+	.long	1581883040
+	.long	3161698953
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	1720398391
+	.long	1071937645
+	.long	3980678963
+	.long	3163300080
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1118294578
+	.long	1071930400
+	.long	2197495694
+	.long	3159909401
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	1065662932
+	.long	1071923194
+	.long	2533670915
+	.long	1014530238
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	654919306
+	.long	1071916027
+	.long	3232961757
+	.long	3163047469
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	3278348324
+	.long	1071908898
+	.long	3069497416
+	.long	1014750712
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	3743175029
+	.long	1071901808
+	.long	2072812490
+	.long	3162175075
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	1156440435
+	.long	1071894757
+	.long	2351451249
+	.long	1013967056
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	3219942644
+	.long	1071887743
+	.long	3798990616
+	.long	1015368806
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	460407023
+	.long	1071880768
+	.long	4237175092
+	.long	3163138469
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	589198666
+	.long	1071873830
+	.long	2664346172
+	.long	3163157962
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	2732492859
+	.long	1071866929
+	.long	2691479646
+	.long	3162255684
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	1726216749
+	.long	1071860066
+	.long	2466808228
+	.long	3161676405
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	1000925746
+	.long	1071853240
+	.long	1018491672
+	.long	3163309544
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	3991843581
+	.long	1071846450
+	.long	4092853457
+	.long	1014585763
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	1253935211
+	.long	1071839698
+	.long	1395382931
+	.long	3159702613
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	526652809
+	.long	1071832982
+	.long	4223459736
+	.long	1015879375
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	964107055
+	.long	1071826302
+	.long	2800439588
+	.long	3162833221
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	1724976915
+	.long	1071819658
+	.long	420909223
+	.long	3163117379
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	1972484976
+	.long	1071813050
+	.long	675290301
+	.long	3161640050
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	874372905
+	.long	1071806478
+	.long	100263788
+	.long	1015940732
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1897844341
+	.long	1071799941
+	.long	1254300460
+	.long	1015275938
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	4219606026
+	.long	1071793439
+	.long	2434574742
+	.long	1014681548
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2725843665
+	.long	1071786973
+	.long	1433917087
+	.long	1014838523
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	897099801
+	.long	1071780542
+	.long	754756297
+	.long	1015241005
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	2218315341
+	.long	1071774145
+	.long	2694295388
+	.long	3163288868
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	1588871207
+	.long	1071767783
+	.long	143439582
+	.long	3162963416
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2502433899
+	.long	1071761455
+	.long	2148595913
+	.long	1015023991
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	4162030108
+	.long	1071755161
+	.long	2763428480
+	.long	1015529349
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	1480023343
+	.long	1071748902
+	.long	2247196168
+	.long	1015327453
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	2257959872
+	.long	1071742676
+	.long	3802946148
+	.long	1012964927
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	1416741826
+	.long	1071736484
+	.long	2196380210
+	.long	1011413563
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2471440686
+	.long	1071730325
+	.long	968836267
+	.long	3162214888
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	351405227
+	.long	1071724200
+	.long	3125337328
+	.long	3159822479
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	2875075254
+	.long	1071718107
+	.long	4144233330
+	.long	3163333716
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	685187902
+	.long	1071712048
+	.long	378731989
+	.long	1014843115
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	1608493509
+	.long	1071706021
+	.long	3159622171
+	.long	3162807737
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	590962156
+	.long	1071700027
+	.long	3829346666
+	.long	3163275597
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1172597893
+	.long	1071694065
+	.long	114433263
+	.long	1015347593
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	2602514713
+	.long	1071688135
+	.long	2268929336
+	.long	1014354284
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	4133881824
+	.long	1071682237
+	.long	2148155345
+	.long	3162931299
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	728934454
+	.long	1071676372
+	.long	1413842688
+	.long	1014178612
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	238821257
+	.long	1071670538
+	.long	1469694871
+	.long	3162884987
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	1928746161
+	.long	1071664735
+	.long	983617676
+	.long	1014285177
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	772914124
+	.long	1071658964
+	.long	4004372762
+	.long	1012230161
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	339411585
+	.long	1071653224
+	.long	264588982
+	.long	3161636657
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.long	4200250559
+	.long	1071647514
+	.long	2808127345
+	.long	3161781938
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.long	1610612736
+	.long	1082594631
+	.long	4166901572
+	.long	1055174155
+	.long	3884607281
+	.long	3168131199
+	.long	3607404735
+	.long	3190582024
+	.long	1874480759
+	.long	1032041131
+	.long	4286760334
+	.long	1053736893
+	.long	4277811695
+	.long	3211144770
+	.long	0
+	.long	0
+	.long	236289503
+	.long	1064135997
+	.long	463583772
+	.long	3215696314
+	.long	1441186365
+	.long	3212977891
+	.long	286331153
+	.long	1069617425
+	.long	2284589306
+	.long	1066820852
+	.long	1431655765
+	.long	3218429269
+	.long	0
+	.long	4294967280
+	.long	0
+	.long	4294967280
+	.long	4294705152
+	.long	4294967295
+	.long	4294705152
+	.long	4294967295
+	.long	4160749568
+	.long	2147483647
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	1073741824
+	.type	static_const_table,@object
+	.size	static_const_table,4280
+	.data
+	.section .note.GNU-stack, ""
+# End
diff --git a/libm/x86/sqrt.S b/libm/x86/sqrt.S
new file mode 100644
index 0000000..c9d434d
--- /dev/null
+++ b/libm/x86/sqrt.S
@@ -0,0 +1,43 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(sqrt)
+	mov		%esp,%eax
+	and		$0xfffffff8,%eax
+	movsd	0x4(%esp),%xmm0
+	sqrtsd	%xmm0,%xmm0
+	movlpd	%xmm0,-0x8(%eax)
+	fldl   -0x8(%eax)
+	ret
+END(sqrt)
+
+ALIAS_SYMBOL(sqrtl, sqrt);
diff --git a/libm/x86/sqrtf.S b/libm/x86/sqrtf.S
new file mode 100644
index 0000000..78c183b
--- /dev/null
+++ b/libm/x86/sqrtf.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(sqrtf)
+	movss  0x4(%esp),%xmm0
+	sqrtss %xmm0,%xmm0
+	movss  %xmm0,-0x4(%esp)
+	flds   -0x4(%esp)
+	ret
+END(sqrtf)
diff --git a/libm/x86/trunc.S b/libm/x86/trunc.S
new file mode 100644
index 0000000..da9d5fb
--- /dev/null
+++ b/libm/x86/trunc.S
@@ -0,0 +1,43 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(trunc)
+	mov    %esp,%eax
+	and    $0xfffffff8,%eax
+	movsd  0x4(%esp),%xmm0
+	roundsd $0x3,%xmm0,%xmm0
+	movlpd %xmm0,-0x8(%eax)
+	fldl   -0x8(%eax)
+	ret
+END(trunc)
+
+ALIAS_SYMBOL(truncl, trunc);
diff --git a/libm/x86/truncf.S b/libm/x86/truncf.S
new file mode 100644
index 0000000..d3e3f4a
--- /dev/null
+++ b/libm/x86/truncf.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(truncf)
+	movss  0x4(%esp),%xmm0
+	roundss $0x3,%xmm0,%xmm0
+	movss  %xmm0,-0x4(%esp)
+	flds   -0x4(%esp)
+	ret
+END(truncf)
diff --git a/libm/x86_64/ceil.S b/libm/x86_64/ceil.S
new file mode 100644
index 0000000..d4492c4
--- /dev/null
+++ b/libm/x86_64/ceil.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(ceil)
+roundsd $0x2,%xmm0,%xmm0
+retq
+END(ceil)
diff --git a/libm/x86_64/ceilf.S b/libm/x86_64/ceilf.S
new file mode 100644
index 0000000..0e1ca95
--- /dev/null
+++ b/libm/x86_64/ceilf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(ceilf)
+roundss $0x2,%xmm0,%xmm0
+retq
+END(ceilf)
diff --git a/libm/x86_64/e_acos.S b/libm/x86_64/e_acos.S
new file mode 100644
index 0000000..d83c66b
--- /dev/null
+++ b/libm/x86_64/e_acos.S
@@ -0,0 +1,1957 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  To compute acos(s), separate schemes are used when s is in different
+//  intervals.
+//
+//  |s| in [2^{-4}, sqrt(3)/2):
+//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
+//       acos(s)=pi/2-asin(t)-asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
+//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
+//       For the first degree term, r is evaluated as
+//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
+//       (sqrt(1-t^2) read from table)
+//  The main source of error is still R (may still be affected by up to 3 ulps
+//  of rounding error). The table size must be sufficiently large, to minimize
+//  this effect.
+//
+//  |s| in [sqrt(3)/2, 255/256):
+//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
+//       acos(|s|)=asin(t)-asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
+//   acos(-|s|)=pi-acos(|s|)
+//       (The -PI constant, or 0, is added to the result. The sign is set at
+//        the end)
+//       asin(r) evaluated as a polynomial (same as above)
+//       The first degree term is evaluated as
+//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
+//
+//  |s|<2^{-4}: acos(s)=pi/2-asin(s)
+//              evaluate asin(s) as 13-degree polynomial
+//
+//  |s| in [255/256,1): acos(|s|)=2*asin(q), where q=sqrt((1-|s|)/2)
+//  asin(q) is evaluated as 13-degree polynomial
+//      q^2=(1-|s|)/2 is obtained in advance
+//         2*q*eps ~ ((1-|s|)/2-q^2)/q used for first term
+//   acos(-|s|)=pi-acos(|s|)
+//       (The -PI constant, or 0, is added to the result. The sign is set at
+//        the end)
+//
+// Special cases:
+//  acos(NaN) = quiet NaN, and raise invalid exception
+//  acos(INF) = QNaN and raise invalid exception
+//  acos(x) = QNaN and raise invalid exception, for |x|>1.0
+//  acos(1) = +0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  acos
+ENTRY(acos)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_acos.1:
+        subq      $24, %rsp
+..___tag_value_acos.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        movsd     ABSVALMASK(%rip), %xmm4
+        movsd     ONEMASK(%rip), %xmm3
+        xorpd     %xmm5, %xmm5
+        movsd     TMASK(%rip), %xmm2
+        movq      %xmm0, %xmm1
+        psrlq     $44, %xmm0
+        movd      %xmm0, %edx
+        movq      %xmm1, %xmm7
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movq      %xmm1, %xmm0
+        movl      $524287, %eax
+        andl      %edx, %eax
+        subl      $260864, %eax
+        cmpl      $955, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        mulsd     %xmm1, %xmm1
+        andl      $65535, %edx
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andpd     %xmm7, %xmm2
+        andl      $-4, %edx
+        subl      $64256, %edx
+        lea       T_table(%rip), %r8
+        movsd     (%r8,%rdx,2), %xmm1
+        orpd      %xmm5, %xmm2
+        lea       Tbl_addr(%rip), %r8
+        movapd    (%r8,%rdx,4), %xmm4
+        movq      %xmm7, %xmm6
+        addsd     %xmm2, %xmm7
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm0, %xmm7
+        mulsd     %xmm1, %xmm6
+        mulsd     %xmm2, %xmm3
+        movq      %xmm6, %xmm1
+        addsd     %xmm3, %xmm6
+        divsd     %xmm6, %xmm7
+        movsd     24+cv(%rip), %xmm0
+        movsd     8+cv(%rip), %xmm5
+        subsd     %xmm3, %xmm1
+        psrlq     $63, %xmm2
+        movq      %xmm1, %xmm3
+        psllq     $63, %xmm2
+        mulsd     %xmm1, %xmm1
+        pshufd    $68, %xmm2, %xmm2
+        movsd     16+cv(%rip), %xmm6
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm4
+        mulsd     %xmm3, %xmm5
+        subpd     PI_BY_2(%rip), %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm3, %xmm0
+        subsd     %xmm4, %xmm5
+        pshufd    $238, %xmm4, %xmm4
+        addsd     %xmm5, %xmm0
+        subsd     %xmm7, %xmm0
+        subsd     %xmm4, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        subl      $955, %eax
+        cmpl      $65, %eax
+        jae       .L_2TAG_PACKET_1.0.2
+        psrlq     $38, %xmm7
+        psllq     $38, %xmm7
+        pmovmskb  %xmm0, %eax
+        andnpd    %xmm0, %xmm4
+        subsd     %xmm7, %xmm1
+        movq      %xmm7, %xmm6
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm6, %xmm0
+        orpd      %xmm4, %xmm5
+        subsd     %xmm7, %xmm3
+        mulsd     %xmm1, %xmm0
+        movq      %xmm3, %xmm4
+        subsd     %xmm0, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andl      $128, %eax
+        shrl      $7, %eax
+        negl      %eax
+        movq      %xmm3, %xmm7
+        andpd     %xmm3, %xmm2
+        psllq     $2, %xmm3
+        pextrw    $3, %xmm3, %edx
+        orpd      %xmm5, %xmm2
+        movd      %eax, %xmm3
+        pshufd    $0, %xmm3, %xmm3
+        subl      $65216, %edx
+        addl      %edx, %edx
+        lea       T_table(%rip), %r8
+        mulsd     (%r8,%rdx,4), %xmm7
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm2, %xmm2
+        subsd     %xmm7, %xmm6
+        andpd     NEG_PI(%rip), %xmm3
+        addsd     %xmm1, %xmm6
+        subsd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm7
+        movsd     8+cv(%rip), %xmm5
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm7
+        movsd     24+cv(%rip), %xmm0
+        divsd     %xmm7, %xmm4
+        movsd     16+cv(%rip), %xmm2
+        lea       Tbl_addr(%rip), %r8
+        addpd     (%r8,%rdx,8), %xmm3
+        movq      %xmm6, %xmm1
+        mulsd     %xmm6, %xmm6
+        mulsd     %xmm6, %xmm0
+        mulsd     %xmm6, %xmm1
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm6, %xmm1
+        addsd     %xmm2, %xmm0
+        pxor      %xmm6, %xmm6
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm5
+        addsd     %xmm5, %xmm0
+        andl      $32768, %eax
+        pinsrw    $3, %eax, %xmm6
+        movq      %xmm4, %xmm5
+        pshufd    $238, %xmm3, %xmm3
+        addsd     %xmm3, %xmm4
+        subsd     %xmm4, %xmm3
+        addsd     %xmm3, %xmm5
+        addsd     %xmm5, %xmm0
+        addsd     %xmm4, %xmm0
+        xorpd     %xmm6, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_1.0.2:
+        addl      $15291, %eax
+        cmpl      $14336, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        unpcklpd  %xmm0, %xmm0
+        movapd    cv2(%rip), %xmm6
+        unpcklpd  %xmm0, %xmm1
+        movapd    16+cv2(%rip), %xmm2
+        movapd    32+cv2(%rip), %xmm4
+        mulpd     %xmm0, %xmm0
+        movapd    PI_BY_2(%rip), %xmm5
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm6
+        mulpd     %xmm0, %xmm0
+        movq      %xmm1, %xmm3
+        mulsd     %xmm1, %xmm1
+        addpd     %xmm2, %xmm6
+        mulpd     %xmm0, %xmm4
+        mulsd     %xmm3, %xmm1
+        addpd     %xmm4, %xmm6
+        pshufd    $238, %xmm5, %xmm0
+        mulpd     %xmm6, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        subsd     %xmm7, %xmm0
+        pshufd    $238, %xmm1, %xmm2
+        subsd     %xmm1, %xmm5
+        subsd     %xmm0, %xmm6
+        subsd     %xmm2, %xmm5
+        subsd     %xmm6, %xmm7
+        subsd     %xmm7, %xmm5
+        addsd     %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        subl      $15356, %eax
+        cmpl      $4, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        xorpd     %xmm6, %xmm6
+        andpd     ABSVALMASK(%rip), %xmm7
+        movsd     ONE_BY_2(%rip), %xmm4
+        movapd    cv2(%rip), %xmm1
+        mulsd     %xmm4, %xmm7
+        movapd    16+cv2(%rip), %xmm2
+        subsd     %xmm7, %xmm4
+        movapd    32+cv2(%rip), %xmm3
+        pshufd    $68, %xmm4, %xmm7
+        sqrtsd    %xmm4, %xmm4
+        mulpd     %xmm7, %xmm1
+        pshufd    $68, %xmm7, %xmm5
+        pextrw    $3, %xmm0, %eax
+        mulpd     %xmm7, %xmm7
+        addpd     %xmm1, %xmm2
+        movsd     HALFMASK(%rip), %xmm1
+        mulpd     %xmm7, %xmm3
+        cmpsd     $1, %xmm6, %xmm0
+        mulsd     %xmm5, %xmm7
+        addpd     %xmm3, %xmm2
+        pshufd    $68, %xmm0, %xmm0
+        mulsd     %xmm7, %xmm2
+        andpd     NEG_PI(%rip), %xmm0
+        mulpd     %xmm5, %xmm2
+        andpd     %xmm4, %xmm1
+        pshufd    $68, %xmm4, %xmm3
+        subsd     %xmm1, %xmm4
+        addsd     %xmm3, %xmm3
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm4, %xmm3
+        subsd     %xmm1, %xmm5
+        mulsd     %xmm3, %xmm4
+        pshufd    $238, %xmm3, %xmm3
+        subsd     %xmm4, %xmm5
+        divsd     %xmm3, %xmm5
+        addpd     %xmm3, %xmm3
+        mulpd     %xmm3, %xmm2
+        pshufd    $238, %xmm2, %xmm4
+        addsd     %xmm0, %xmm2
+        andl      $32768, %eax
+        pinsrw    $3, %eax, %xmm6
+        pshufd    $238, %xmm0, %xmm0
+        addsd     %xmm4, %xmm2
+        addsd     %xmm5, %xmm2
+        addsd     %xmm3, %xmm2
+        addsd     %xmm2, %xmm0
+        xorpd     %xmm6, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_3.0.2:
+        addl      $261884, %eax
+        cmpl      $261888, %eax
+        jb        .L_2TAG_PACKET_4.0.2
+        movd      %xmm7, %ecx
+        psrlq     $32, %xmm7
+        movd      %xmm7, %edx
+        andl      $2147483647, %edx
+        movl      $1072693248, %eax
+        subl      %edx, %eax
+        orl       %ecx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_5.0.2
+        movsd     (%rsp), %xmm2
+        movd      %xmm2, %edx
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $2147483647, %ecx
+        subl      $1, %edx
+        sbbl      $2146435072, %ecx
+        cmpl      $0, %ecx
+        jge       .L_2TAG_PACKET_6.0.2
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_5.0.2:
+        pextrw    $1, %xmm7, %edx
+        shrl      $15, %edx
+        negl      %edx
+        movd      %edx, %xmm7
+        pshufd    $0, %xmm7, %xmm7
+        movsd     PI(%rip), %xmm2
+        movsd     8+PI(%rip), %xmm0
+        andpd     %xmm7, %xmm2
+        andpd     %xmm7, %xmm0
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        movsd     PI_BY_2(%rip), %xmm2
+        movsd     8+PI_BY_2(%rip), %xmm0
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm6, %xmm6
+        addsd     %xmm6, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_7.0.2:
+        movq      %xmm0, 8(%rsp)
+..B1.3:
+        movq      8(%rsp), %xmm0
+.L_2TAG_PACKET_8.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_acos.4:
+        ret       
+..___tag_value_acos.5:
+END(acos)
+# -- End  acos
+	.section .rodata, "a"
+	.align 16
+	.align 16
+ABSVALMASK:
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	0
+	.type	ABSVALMASK,@object
+	.size	ABSVALMASK,16
+	.align 16
+T_table:
+	.long	2642784509
+	.long	1072689083
+	.long	1514442531
+	.long	1072688953
+	.long	333108933
+	.long	1072688821
+	.long	3392112024
+	.long	1072688686
+	.long	2099852862
+	.long	1072688550
+	.long	749609004
+	.long	1072688412
+	.long	3634632596
+	.long	1072688271
+	.long	2163248461
+	.long	1072688129
+	.long	628657846
+	.long	1072687985
+	.long	3324036511
+	.long	1072687838
+	.long	1657632815
+	.long	1072687690
+	.long	4217538760
+	.long	1072687539
+	.long	2411951597
+	.long	1072687387
+	.long	533944872
+	.long	1072687233
+	.long	2876566508
+	.long	1072687076
+	.long	847936891
+	.long	1072686918
+	.long	3036019913
+	.long	1072686757
+	.long	848884575
+	.long	1072686595
+	.long	2874443326
+	.long	1072686430
+	.long	520713666
+	.long	1072686264
+	.long	2375556481
+	.long	1072686095
+	.long	4141904948
+	.long	1072685924
+	.long	1522666382
+	.long	1072685752
+	.long	3105624104
+	.long	1072685577
+	.long	298666327
+	.long	1072685401
+	.long	1689524500
+	.long	1072685222
+	.long	2981002200
+	.long	1072685041
+	.long	4170844284
+	.long	1072684858
+	.long	961802263
+	.long	1072684674
+	.long	1941503454
+	.long	1072684487
+	.long	2812647170
+	.long	1072684298
+	.long	3572873869
+	.long	1072684107
+	.long	4219797823
+	.long	1072683914
+	.long	456039788
+	.long	1072683720
+	.long	869096151
+	.long	1072683523
+	.long	1161535119
+	.long	1072683324
+	.long	1330865866
+	.long	1072683123
+	.long	1374571204
+	.long	1072682920
+	.long	1290107538
+	.long	1072682715
+	.long	1074904836
+	.long	1072682508
+	.long	726366587
+	.long	1072682299
+	.long	241869763
+	.long	1072682088
+	.long	3913732079
+	.long	1072681874
+	.long	3149342765
+	.long	1072681659
+	.long	2240966306
+	.long	1072681442
+	.long	1185873216
+	.long	1072681223
+	.long	4276274591
+	.long	1072681001
+	.long	2919452883
+	.long	1072680778
+	.long	1407565635
+	.long	1072680553
+	.long	4032743551
+	.long	1072680325
+	.long	2202188565
+	.long	1072680096
+	.long	207977577
+	.long	1072679865
+	.long	2342160518
+	.long	1072679631
+	.long	11858423
+	.long	1072679396
+	.long	1804034453
+	.long	1072679158
+	.long	3420722787
+	.long	1072678918
+	.long	563930456
+	.long	1072678677
+	.long	1820539192
+	.long	1072678433
+	.long	2892501606
+	.long	1072678187
+	.long	3776710320
+	.long	1072677939
+	.long	175063337
+	.long	1072677690
+	.long	674333171
+	.long	1072677438
+	.long	976363026
+	.long	1072677184
+	.long	1077935934
+	.long	1072676928
+	.long	1921075490
+	.long	1072676540
+	.long	881493302
+	.long	1072676016
+	.long	3275752439
+	.long	1072675483
+	.long	486855588
+	.long	1072674943
+	.long	1077229111
+	.long	1072674394
+	.long	723950308
+	.long	1072673837
+	.long	3693582199
+	.long	1072673271
+	.long	1367335316
+	.long	1072672698
+	.long	2305837020
+	.long	1072672116
+	.long	2184358641
+	.long	1072671526
+	.long	972682840
+	.long	1072670928
+	.long	2935101762
+	.long	1072670321
+	.long	3745513263
+	.long	1072669706
+	.long	3372320886
+	.long	1072669083
+	.long	1783464620
+	.long	1072668452
+	.long	3241386215
+	.long	1072667812
+	.long	3418125284
+	.long	1072667164
+	.long	2280219148
+	.long	1072666508
+	.long	4088700758
+	.long	1072665843
+	.long	219227400
+	.long	1072665171
+	.long	3521816918
+	.long	1072664489
+	.long	1076205279
+	.long	1072663800
+	.long	1436484616
+	.long	1072663102
+	.long	271362610
+	.long	1072662396
+	.long	1838996688
+	.long	1072661681
+	.long	1807122518
+	.long	1072660958
+	.long	137953542
+	.long	1072660227
+	.long	1088178584
+	.long	1072659487
+	.long	324057537
+	.long	1072658739
+	.long	2101288076
+	.long	1072657982
+	.long	2085133974
+	.long	1072657217
+	.long	235324451
+	.long	1072656444
+	.long	806051592
+	.long	1072655662
+	.long	3756033140
+	.long	1072654871
+	.long	453542543
+	.long	1072654073
+	.long	3741177327
+	.long	1072653265
+	.long	691216109
+	.long	1072652450
+	.long	4145223372
+	.long	1072651625
+	.long	1174439091
+	.long	1072650793
+	.long	324416139
+	.long	1072649952
+	.long	1550246310
+	.long	1072649102
+	.long	511524674
+	.long	1072648244
+	.long	1457248482
+	.long	1072647377
+	.long	45944955
+	.long	1072646502
+	.long	525537397
+	.long	1072645618
+	.long	2848440188
+	.long	1072644725
+	.long	2671555633
+	.long	1072643824
+	.long	4241172637
+	.long	1072642914
+	.long	3213094278
+	.long	1072641996
+	.long	3832503688
+	.long	1072641069
+	.long	1754091534
+	.long	1072640134
+	.long	1221921804
+	.long	1072639190
+	.long	2184526489
+	.long	1072638237
+	.long	294902089
+	.long	1072637276
+	.long	4090375270
+	.long	1072636305
+	.long	632860906
+	.long	1072635327
+	.long	2753498702
+	.long	1072634339
+	.long	1808009252
+	.long	1072633343
+	.long	2036428672
+	.long	1072632338
+	.long	3383235626
+	.long	1072631324
+	.long	1497347484
+	.long	1072630302
+	.long	617018317
+	.long	1072629271
+	.long	684933058
+	.long	1072628231
+	.long	1643170798
+	.long	1072627182
+	.long	3011066360
+	.long	1072625592
+	.long	957158713
+	.long	1072623442
+	.long	1390907941
+	.long	1072621256
+	.long	3819155270
+	.long	1072619034
+	.long	3443571196
+	.long	1072616777
+	.long	4045412458
+	.long	1072614484
+	.long	805503923
+	.long	1072612156
+	.long	1778922015
+	.long	1072609791
+	.long	2125033665
+	.long	1072607390
+	.long	1287203863
+	.long	1072604953
+	.long	2992629568
+	.long	1072602479
+	.long	2367267127
+	.long	1072599969
+	.long	3115526047
+	.long	1072597422
+	.long	340219539
+	.long	1072594839
+	.long	2017215719
+	.long	1072592218
+	.long	3225443424
+	.long	1072589560
+	.long	3326565673
+	.long	1072586865
+	.long	1669811211
+	.long	1072584133
+	.long	1886735022
+	.long	1072581363
+	.long	3301071171
+	.long	1072578555
+	.long	928514283
+	.long	1072575710
+	.long	2656364059
+	.long	1072572826
+	.long	3473490507
+	.long	1072569904
+	.long	2649965606
+	.long	1072566944
+	.long	3736819052
+	.long	1072563945
+	.long	1680885175
+	.long	1072560908
+	.long	4413771
+	.long	1072557832
+	.long	2214869753
+	.long	1072554716
+	.long	3214725184
+	.long	1072551561
+	.long	2186079903
+	.long	1072548367
+	.long	2590372131
+	.long	1072545133
+	.long	3578146079
+	.long	1072541859
+	.long	4283712755
+	.long	1072538545
+	.long	3824834510
+	.long	1072535191
+	.long	1302400298
+	.long	1072531797
+	.long	95058636
+	.long	1072528362
+	.long	3563906063
+	.long	1072524885
+	.long	2167230730
+	.long	1072521368
+	.long	3524918334
+	.long	1072517809
+	.long	2353304918
+	.long	1072514209
+	.long	1939625839
+	.long	1072510567
+	.long	1256714581
+	.long	1072506883
+	.long	3552525848
+	.long	1072503156
+	.long	3464809522
+	.long	1072499387
+	.long	4200542593
+	.long	1072495575
+	.long	355609124
+	.long	1072491721
+	.long	3684139099
+	.long	1072487822
+	.long	148355918
+	.long	1072483881
+	.long	1457689242
+	.long	1072479895
+	.long	2118591596
+	.long	1072475865
+	.long	908848089
+	.long	1072471791
+	.long	877032689
+	.long	1072467672
+	.long	752012304
+	.long	1072463508
+	.long	3532301749
+	.long	1072459298
+	.long	3600563221
+	.long	1072455043
+	.long	3902857084
+	.long	1072450742
+	.long	3063101036
+	.long	1072446395
+	.long	3972344374
+	.long	1072442001
+	.long	903183549
+	.long	1072437561
+	.long	983892938
+	.long	1072433073
+	.long	2722858568
+	.long	1072428537
+	.long	302790515
+	.long	1072423954
+	.long	759811057
+	.long	1072419322
+	.long	2507809922
+	.long	1072414641
+	.long	2388408813
+	.long	1072407528
+	.long	2084492942
+	.long	1072397870
+	.long	2435703301
+	.long	1072388010
+	.long	1935433360
+	.long	1072377945
+	.long	2742047290
+	.long	1072367671
+	.long	2053284205
+	.long	1072357185
+	.long	657783367
+	.long	1072346483
+	.long	2893664841
+	.long	1072335560
+	.long	3718906405
+	.long	1072324413
+	.long	1547896303
+	.long	1072313038
+	.long	2494058440
+	.long	1072301429
+	.long	3133238742
+	.long	1072289582
+	.long	3327000086
+	.long	1072277492
+	.long	1860667274
+	.long	1072265154
+	.long	665340747
+	.long	1072252562
+	.long	443347841
+	.long	1072239710
+	.long	581282618
+	.long	1072226592
+	.long	3349780465
+	.long	1072213201
+	.long	914217606
+	.long	1072199532
+	.long	989797661
+	.long	1072185576
+	.long	945436416
+	.long	1072171326
+	.long	549291300
+	.long	1072156774
+	.long	1814636389
+	.long	1072141911
+	.long	239092858
+	.long	1072126729
+	.long	1794680724
+	.long	1072111217
+	.long	1241534678
+	.long	1072095366
+	.long	3366566214
+	.long	1072079164
+	.long	1244090828
+	.long	1072062601
+	.long	1708448120
+	.long	1072045663
+	.long	3544260650
+	.long	1072028337
+	.long	1402741403
+	.long	1072010610
+	.long	2551936888
+	.long	1071992465
+	.long	617669739
+	.long	1071973887
+	.long	794002186
+	.long	1071954857
+	.long	2021237693
+	.long	1071935356
+	.long	540450384
+	.long	1071915364
+	.long	1920555537
+	.long	1071894857
+	.long	2879585206
+	.long	1071873811
+	.long	3000237455
+	.long	1071852199
+	.long	3352974346
+	.long	1071829991
+	.long	569629937
+	.long	1071807155
+	.long	2077237208
+	.long	1071783653
+	.long	2284891805
+	.long	1071759446
+	.long	1226651784
+	.long	1071734489
+	.long	1102047405
+	.long	1071708731
+	.long	2009896384
+	.long	1071682115
+	.long	927419082
+	.long	1071654577
+	.long	85010366
+	.long	1071607413
+	.long	696431025
+	.long	1071548180
+	.long	2611410541
+	.long	1071486585
+	.long	2612593658
+	.long	1071422396
+	.long	3548155306
+	.long	1071355336
+	.long	3887997484
+	.long	1071285073
+	.long	244854763
+	.long	1071211202
+	.long	4214445648
+	.long	1071133216
+	.long	2303966727
+	.long	1071050478
+	.long	3991040013
+	.long	1070962152
+	.long	3126952278
+	.long	1070867118
+	.long	1817448378
+	.long	1070763804
+	.long	1793814864
+	.long	1070649884
+	.long	3507224072
+	.long	1070447193
+	.long	4027609105
+	.long	1070148772
+	.long	577507993
+	.long	1069779414
+	.long	2310232419
+	.long	1068931829
+	.type	T_table,@object
+	.size	T_table,2048
+	.align 16
+Tbl_addr:
+	.long	3822952792
+	.long	1021639372
+	.long	182792448
+	.long	1068507836
+	.long	2264213271
+	.long	1019558908
+	.long	649052928
+	.long	1068524253
+	.long	1797139609
+	.long	1022295143
+	.long	1243095296
+	.long	1068540671
+	.long	1415938756
+	.long	1021439537
+	.long	2033294592
+	.long	1068557090
+	.long	2356809978
+	.long	1021777916
+	.long	3088063744
+	.long	1068573510
+	.long	2669055318
+	.long	1022124482
+	.long	180888576
+	.long	1068589932
+	.long	3566445325
+	.long	1021358712
+	.long	1970196992
+	.long	1068606354
+	.long	896980323
+	.long	1021319659
+	.long	4229555456
+	.long	1068622777
+	.long	436049712
+	.long	1021319758
+	.long	2732572160
+	.long	1068639202
+	.long	583123209
+	.long	1020797960
+	.long	1842831872
+	.long	1068655628
+	.long	1370449804
+	.long	1021429270
+	.long	1628994560
+	.long	1068672055
+	.long	2411391464
+	.long	1021057980
+	.long	2159763712
+	.long	1068688483
+	.long	1208692749
+	.long	1021943903
+	.long	3503886336
+	.long	1068704912
+	.long	538793309
+	.long	1019744063
+	.long	1435187200
+	.long	1068721343
+	.long	4085087612
+	.long	1020608419
+	.long	317469952
+	.long	1068737775
+	.long	144386942
+	.long	1021440732
+	.long	219617280
+	.long	1068754208
+	.long	2940088361
+	.long	1019981122
+	.long	1210558208
+	.long	1068770642
+	.long	2176850347
+	.long	1018373705
+	.long	3359268352
+	.long	1068787077
+	.long	2395611454
+	.long	1021889042
+	.long	2439803648
+	.long	1068803514
+	.long	1650705253
+	.long	1020227966
+	.long	2816203520
+	.long	1068819952
+	.long	3702166386
+	.long	1019379914
+	.long	262620672
+	.long	1068836392
+	.long	1855649370
+	.long	1020453124
+	.long	3438159616
+	.long	1068852832
+	.long	923063860
+	.long	1019273834
+	.long	3822105856
+	.long	1068869274
+	.long	4289947947
+	.long	1019434249
+	.long	1483729920
+	.long	1068885718
+	.long	787455814
+	.long	1020738379
+	.long	787321088
+	.long	1068902163
+	.long	3321653337
+	.long	1021842569
+	.long	1802253312
+	.long	1068918609
+	.long	2653633526
+	.long	1021821525
+	.long	302985984
+	.long	1068935057
+	.long	161272028
+	.long	1021655149
+	.long	653966080
+	.long	1068951506
+	.long	2566098667
+	.long	1020066219
+	.long	2924727296
+	.long	1068967956
+	.long	3646493722
+	.long	1014292285
+	.long	2889890304
+	.long	1068984408
+	.long	1081009196
+	.long	1022189620
+	.long	619098112
+	.long	1069000862
+	.long	4011643355
+	.long	1021773297
+	.long	477017600
+	.long	1069017317
+	.long	4030305534
+	.long	1021292252
+	.long	2533403904
+	.long	1069033773
+	.long	2645187591
+	.long	1019527099
+	.long	2563102208
+	.long	1069050231
+	.long	3857293792
+	.long	1022311697
+	.long	635982336
+	.long	1069066691
+	.long	3625936637
+	.long	1017511744
+	.long	1116940800
+	.long	1069083152
+	.long	3653872993
+	.long	1022016631
+	.long	4075964160
+	.long	1069099614
+	.long	2468900271
+	.long	1021769532
+	.long	993165568
+	.long	1069116079
+	.long	1358104224
+	.long	1021199776
+	.long	528586752
+	.long	1069132545
+	.long	2200950332
+	.long	1022024872
+	.long	2752395776
+	.long	1069149012
+	.long	3197072454
+	.long	1017751319
+	.long	3439855616
+	.long	1069165481
+	.long	1651081806
+	.long	1020809338
+	.long	2661257728
+	.long	1069181952
+	.long	539032752
+	.long	1021728805
+	.long	486957312
+	.long	1069198425
+	.long	3136045149
+	.long	1016888671
+	.long	1282340352
+	.long	1069214899
+	.long	2593963259
+	.long	1018956103
+	.long	822921728
+	.long	1069231375
+	.long	2146032737
+	.long	1022306465
+	.long	3474216192
+	.long	1069247852
+	.long	3976811625
+	.long	1021350207
+	.long	716902656
+	.long	1069264332
+	.long	718267222
+	.long	1018624727
+	.long	1211594496
+	.long	1069280813
+	.long	1485641389
+	.long	1018447451
+	.long	734070272
+	.long	1069297296
+	.long	354455128
+	.long	1021341291
+	.long	3650110720
+	.long	1069313780
+	.long	682185947
+	.long	1021651853
+	.long	1440663040
+	.long	1069330267
+	.long	3558574550
+	.long	1021615110
+	.long	2766612224
+	.long	1069346755
+	.long	874607978
+	.long	1017746872
+	.long	3404011008
+	.long	1069363245
+	.long	4154988502
+	.long	1021439906
+	.long	3423949056
+	.long	1069379737
+	.long	2263202309
+	.long	1021479615
+	.long	2897587712
+	.long	1069396231
+	.long	2562065031
+	.long	1022090363
+	.long	1896159232
+	.long	1069412727
+	.long	3836237663
+	.long	1019867288
+	.long	490968576
+	.long	1069429225
+	.long	3322056743
+	.long	1006752762
+	.long	3048360192
+	.long	1069445724
+	.long	1152314833
+	.long	1013122252
+	.long	1049850624
+	.long	1069462226
+	.long	3601590727
+	.long	1022214610
+	.long	3156899584
+	.long	1069478729
+	.long	1855169970
+	.long	1019487271
+	.long	851173376
+	.long	1069495235
+	.long	312649594
+	.long	1020868604
+	.long	2794281728
+	.long	1069511742
+	.long	1093490181
+	.long	1020777577
+	.long	468042496
+	.long	1069528252
+	.long	1152540679
+	.long	1021403732
+	.long	2534219264
+	.long	1069544763
+	.long	2292126035
+	.long	1021872430
+	.long	1376146432
+	.long	1069558527
+	.long	3293753641
+	.long	1020500454
+	.long	4175442432
+	.long	1069575044
+	.long	3626347564
+	.long	1021610969
+	.long	3523113472
+	.long	1069591566
+	.long	339956500
+	.long	1021119039
+	.long	4003350528
+	.long	1069608092
+	.long	3429333082
+	.long	1022813542
+	.long	1611067392
+	.long	1069624623
+	.long	2298017544
+	.long	1021977587
+	.long	931782144
+	.long	1069641158
+	.long	2164684743
+	.long	1021250988
+	.long	2256725504
+	.long	1069657697
+	.long	1138762335
+	.long	1021443776
+	.long	1582853120
+	.long	1069674241
+	.long	1084010382
+	.long	1022994693
+	.long	3497758720
+	.long	1069690789
+	.long	406366244
+	.long	1022713586
+	.long	3999816960
+	.long	1069707342
+	.long	1488723042
+	.long	1023381290
+	.long	3383096064
+	.long	1069723900
+	.long	2541558953
+	.long	1019137887
+	.long	1942403584
+	.long	1069740463
+	.long	1879620343
+	.long	1022653642
+	.long	4268263680
+	.long	1069757030
+	.long	3039077047
+	.long	1022252545
+	.long	2067062272
+	.long	1069773603
+	.long	4190670677
+	.long	1020725863
+	.long	4225828096
+	.long	1069790180
+	.long	1998567321
+	.long	1022014385
+	.long	2452507136
+	.long	1069806763
+	.long	1511628873
+	.long	1021900300
+	.long	1340746240
+	.long	1069823351
+	.long	788367341
+	.long	1022726208
+	.long	1190035456
+	.long	1069839944
+	.long	3856337230
+	.long	1021834118
+	.long	2300688384
+	.long	1069856542
+	.long	3211396579
+	.long	1022621365
+	.long	678886400
+	.long	1069873146
+	.long	4001011887
+	.long	1022042646
+	.long	921594112
+	.long	1069889755
+	.long	557811968
+	.long	1023065533
+	.long	3331668992
+	.long	1069906369
+	.long	1877060679
+	.long	1022419742
+	.long	3917875200
+	.long	1069922989
+	.long	1181055171
+	.long	1022752712
+	.long	2984829696
+	.long	1069939615
+	.long	4294526932
+	.long	1021499988
+	.long	838049024
+	.long	1069956247
+	.long	3658081878
+	.long	1022957952
+	.long	2078928384
+	.long	1069972884
+	.long	820353701
+	.long	1019391107
+	.long	2719854336
+	.long	1069989527
+	.long	1644022489
+	.long	1023378240
+	.long	3069117696
+	.long	1070006176
+	.long	2771393702
+	.long	1019319954
+	.long	3435962368
+	.long	1070022831
+	.long	3876394145
+	.long	1023024433
+	.long	4130595328
+	.long	1070039492
+	.long	1630447748
+	.long	1021465882
+	.long	1169236224
+	.long	1070056160
+	.long	2828355997
+	.long	1020458120
+	.long	3453997312
+	.long	1070072833
+	.long	164091641
+	.long	1020388279
+	.long	2708127744
+	.long	1070089513
+	.long	3036550223
+	.long	1023328684
+	.long	3540797696
+	.long	1070106199
+	.long	3710949463
+	.long	1022568805
+	.long	1972276736
+	.long	1070122892
+	.long	3885277950
+	.long	1019761674
+	.long	2613815552
+	.long	1070139591
+	.long	2764165077
+	.long	1022921023
+	.long	1487791616
+	.long	1070156297
+	.long	1330644769
+	.long	1023162679
+	.long	3207593472
+	.long	1070173009
+	.long	3911007221
+	.long	1022993496
+	.long	3797764608
+	.long	1070189728
+	.long	979712598
+	.long	1022554580
+	.long	3578920448
+	.long	1070206454
+	.long	2825738223
+	.long	1020223708
+	.long	2872795648
+	.long	1070223187
+	.long	392451124
+	.long	1022666279
+	.long	2002258432
+	.long	1070239927
+	.long	3730407632
+	.long	1023148291
+	.long	1291326464
+	.long	1070256674
+	.long	3723802980
+	.long	1022514089
+	.long	1065180928
+	.long	1070273428
+	.long	2635617463
+	.long	1022654470
+	.long	1650181632
+	.long	1070290189
+	.long	2061982883
+	.long	1022853411
+	.long	3373882880
+	.long	1070306957
+	.long	319732785
+	.long	1022017175
+	.long	2270081280
+	.long	1070323733
+	.long	2237757411
+	.long	1023064087
+	.long	2963732736
+	.long	1070340516
+	.long	468839165
+	.long	1023293774
+	.long	1491099904
+	.long	1070357307
+	.long	1502657946
+	.long	1021533479
+	.long	2479636480
+	.long	1070374105
+	.long	482913562
+	.long	1021986286
+	.long	1968133632
+	.long	1070390911
+	.long	3281474337
+	.long	1022646400
+	.long	291639040
+	.long	1070407725
+	.long	2453320259
+	.long	1022812423
+	.long	2081472512
+	.long	1070424546
+	.long	2939989570
+	.long	1023091888
+	.long	3380340480
+	.long	1070441375
+	.long	2850707499
+	.long	1021921109
+	.long	232287488
+	.long	1070458213
+	.long	3674625342
+	.long	1020725130
+	.long	1567614208
+	.long	1070475058
+	.long	9347334
+	.long	1022024009
+	.long	3433091072
+	.long	1070491911
+	.long	282524999
+	.long	1021433523
+	.long	1876877312
+	.long	1070508773
+	.long	3470449440
+	.long	1019309721
+	.long	1538472192
+	.long	1070525643
+	.long	2089486825
+	.long	1019698916
+	.long	2763830784
+	.long	1070542521
+	.long	443498115
+	.long	1020505194
+	.long	1605381632
+	.long	1070559408
+	.long	3018871601
+	.long	1022869913
+	.long	2706946048
+	.long	1070576303
+	.long	3936260892
+	.long	1023175875
+	.long	2123887360
+	.long	1070593207
+	.long	2994220655
+	.long	1022825948
+	.long	104015104
+	.long	1070603108
+	.long	335054493
+	.long	1023441853
+	.long	2904568832
+	.long	1070615800
+	.long	1451215633
+	.long	1023853857
+	.long	3456197120
+	.long	1070632739
+	.long	436334733
+	.long	1024026432
+	.long	252452352
+	.long	1070649697
+	.long	34596167
+	.long	1024031396
+	.long	3328018432
+	.long	1070666672
+	.long	2644547073
+	.long	1024296758
+	.long	1255829248
+	.long	1070683667
+	.long	552832586
+	.long	1023763122
+	.long	4097058560
+	.long	1070700680
+	.long	1955640623
+	.long	1021394654
+	.long	451770112
+	.long	1070717714
+	.long	3428903777
+	.long	1022941142
+	.long	408920832
+	.long	1070734767
+	.long	165503263
+	.long	1023894958
+	.long	1186960640
+	.long	1070751840
+	.long	435826450
+	.long	1024026134
+	.long	19078656
+	.long	1070768934
+	.long	1834169749
+	.long	1022899284
+	.long	2743490304
+	.long	1070786048
+	.long	494581074
+	.long	1018818479
+	.long	2328961024
+	.long	1070803184
+	.long	2987908834
+	.long	1022581110
+	.long	350011392
+	.long	1070820342
+	.long	240771184
+	.long	1024143083
+	.long	2692326912
+	.long	1070837521
+	.long	666056837
+	.long	1022394776
+	.long	2373274368
+	.long	1070854723
+	.long	2484337770
+	.long	1024228156
+	.long	1017131520
+	.long	1070871948
+	.long	3285648279
+	.long	1024025789
+	.long	265558272
+	.long	1070889196
+	.long	392241896
+	.long	1024252809
+	.long	1778008064
+	.long	1070906467
+	.long	1536107943
+	.long	1023949300
+	.long	2937184768
+	.long	1070923762
+	.long	3541062251
+	.long	1019448646
+	.long	1144442880
+	.long	1070941082
+	.long	3691683781
+	.long	1022123948
+	.long	2410165504
+	.long	1070958426
+	.long	1804181960
+	.long	1023945221
+	.long	4174350848
+	.long	1070975795
+	.long	2016094861
+	.long	1021716585
+	.long	3897012480
+	.long	1070993190
+	.long	175294410
+	.long	1023703404
+	.long	3353623040
+	.long	1071010611
+	.long	167973242
+	.long	1023240839
+	.long	45671168
+	.long	1071028059
+	.long	2166856113
+	.long	1021565413
+	.long	86063872
+	.long	1071045533
+	.long	2676254727
+	.long	1023985299
+	.long	1019772672
+	.long	1071063034
+	.long	989043593
+	.long	1021549587
+	.long	414297344
+	.long	1071080563
+	.long	3960972046
+	.long	1024307251
+	.long	155173120
+	.long	1071098120
+	.long	1830919291
+	.long	1021592251
+	.long	2151562240
+	.long	1071115705
+	.long	405408666
+	.long	1023423128
+	.long	4041854720
+	.long	1071133319
+	.long	2043497827
+	.long	1024411503
+	.long	3489224192
+	.long	1071150963
+	.long	3072215864
+	.long	1022698635
+	.long	2477196288
+	.long	1071168637
+	.long	1812195139
+	.long	1022689192
+	.long	3015298816
+	.long	1071186341
+	.long	764841969
+	.long	1021027331
+	.long	2844731136
+	.long	1071204076
+	.long	2878117321
+	.long	1019116513
+	.long	4028950528
+	.long	1071221842
+	.long	698911452
+	.long	1023265602
+	.long	69441536
+	.long	1071239641
+	.long	3253467847
+	.long	1020795075
+	.long	1676209920
+	.long	1071257471
+	.long	4272431167
+	.long	1022873982
+	.long	2408752384
+	.long	1071275334
+	.long	648519100
+	.long	1024385717
+	.long	151623680
+	.long	1071293231
+	.long	345257017
+	.long	1019561408
+	.long	1410154240
+	.long	1071311161
+	.long	197863993
+	.long	1023224207
+	.long	4131351552
+	.long	1071329125
+	.long	2620801789
+	.long	1024411169
+	.long	1999664384
+	.long	1071347125
+	.long	3952692616
+	.long	1024168086
+	.long	1617668864
+	.long	1071365160
+	.long	3019889809
+	.long	1021907692
+	.long	1032074240
+	.long	1071383231
+	.long	59469899
+	.long	1023656194
+	.long	2619492096
+	.long	1071401338
+	.long	1417526820
+	.long	1021457783
+	.long	202429440
+	.long	1071419483
+	.long	2927667935
+	.long	1019175447
+	.long	525044224
+	.long	1071437665
+	.long	38166811
+	.long	1023981879
+	.long	1779258880
+	.long	1071455885
+	.long	481252500
+	.long	1023310234
+	.long	2195673600
+	.long	1071474144
+	.long	3962395981
+	.long	1021339088
+	.long	44573696
+	.long	1071492443
+	.long	3936281395
+	.long	1023014829
+	.long	2226905344
+	.long	1071510781
+	.long	1515320476
+	.long	1024320623
+	.long	2800512512
+	.long	1071529160
+	.long	1225403697
+	.long	1021081846
+	.long	161113600
+	.long	1071547581
+	.long	3064809733
+	.long	1024173917
+	.long	1338410240
+	.long	1071566043
+	.long	2027604973
+	.long	1024362526
+	.long	522433280
+	.long	1071584548
+	.long	2055171723
+	.long	1023858825
+	.long	539595776
+	.long	1071603096
+	.long	3868820135
+	.long	1022936424
+	.long	4264017664
+	.long	1071621687
+	.long	3228065145
+	.long	1023479578
+	.long	1733924096
+	.long	1071640324
+	.long	3511934475
+	.long	1022496355
+	.long	108880384
+	.long	1071651839
+	.long	615880967
+	.long	1023519706
+	.long	3517856512
+	.long	1071661202
+	.long	3113108559
+	.long	1025190289
+	.long	4043153152
+	.long	1071670589
+	.long	1571836218
+	.long	1023106116
+	.long	3251299072
+	.long	1071680000
+	.long	3444076102
+	.long	1022187841
+	.long	2736921600
+	.long	1071689435
+	.long	272771483
+	.long	1025095280
+	.long	3897698560
+	.long	1071703633
+	.long	2075390188
+	.long	1022489022
+	.long	3209485056
+	.long	1071722652
+	.long	1438094065
+	.long	1021844944
+	.long	3781432064
+	.long	1071741774
+	.long	1675017145
+	.long	1024143828
+	.long	2684184064
+	.long	1071761003
+	.long	2259963753
+	.long	1024731393
+	.long	1840489728
+	.long	1071780342
+	.long	3372883597
+	.long	1023431408
+	.long	3764087808
+	.long	1071799794
+	.long	3307523102
+	.long	1024485788
+	.long	3006232320
+	.long	1071819364
+	.long	3088971966
+	.long	1025213251
+	.long	3374881280
+	.long	1071839055
+	.long	834437749
+	.long	1025236452
+	.long	797284864
+	.long	1071858872
+	.long	3122663941
+	.long	1025320473
+	.long	545765120
+	.long	1071878818
+	.long	826539625
+	.long	1022450955
+	.long	107562240
+	.long	1071898898
+	.long	339584600
+	.long	1022481255
+	.long	2123649024
+	.long	1071919116
+	.long	3912959833
+	.long	1024321009
+	.long	1562385664
+	.long	1071939478
+	.long	2846067230
+	.long	1023343981
+	.long	2963085824
+	.long	1071959988
+	.long	954548627
+	.long	1021475211
+	.long	3325550592
+	.long	1071980652
+	.long	3459651155
+	.long	1025305573
+	.long	775752448
+	.long	1072001476
+	.long	3582746667
+	.long	1023859460
+	.long	3238590720
+	.long	1072022464
+	.long	634636162
+	.long	1024472353
+	.long	2758801920
+	.long	1072043624
+	.long	3078216319
+	.long	1025304516
+	.long	1370319104
+	.long	1072064962
+	.long	2570569078
+	.long	1025099442
+	.long	2615805184
+	.long	1072086484
+	.long	3729933412
+	.long	1024605112
+	.long	3077336576
+	.long	1072108198
+	.long	1948916066
+	.long	1024781603
+	.long	1099528192
+	.long	1072130112
+	.long	3139143157
+	.long	1023729360
+	.long	1231903232
+	.long	1072152233
+	.long	1349513477
+	.long	1024737515
+	.long	1507504128
+	.long	1072174570
+	.long	3484516322
+	.long	1024000959
+	.long	2214659840
+	.long	1072197132
+	.long	2563820917
+	.long	1025225535
+	.long	1804739840
+	.long	1072219929
+	.long	760038746
+	.long	1024482855
+	.long	1413746688
+	.long	1072242971
+	.long	3401734714
+	.long	1025129838
+	.long	821409536
+	.long	1072266269
+	.long	3729772551
+	.long	1025484796
+	.long	3031825664
+	.long	1072289834
+	.long	122256749
+	.long	1024752594
+	.long	1710784256
+	.long	1072313680
+	.long	1518205483
+	.long	1024724809
+	.long	3025265152
+	.long	1072337819
+	.long	409951989
+	.long	1022835555
+	.long	287769088
+	.long	1072362267
+	.long	800355594
+	.long	1022484850
+	.long	198179840
+	.long	1072387038
+	.long	3502926213
+	.long	1024209373
+	.long	1909130496
+	.long	1072412149
+	.long	3064694319
+	.long	1025380823
+	.long	1941732096
+	.long	1072437619
+	.long	4112930390
+	.long	1024294679
+	.long	3492010496
+	.long	1072463467
+	.long	2684918107
+	.long	1023220233
+	.long	81959680
+	.long	1072489716
+	.long	220021366
+	.long	1020635131
+	.long	2297837056
+	.long	1072516387
+	.long	4027683826
+	.long	1021041185
+	.long	270404096
+	.long	1072543508
+	.long	2012766065
+	.long	1021780753
+	.long	3667376896
+	.long	1072571105
+	.long	2727981522
+	.long	1023009874
+	.long	330400256
+	.long	1072599212
+	.long	2940017003
+	.long	1025393439
+	.long	1119293952
+	.long	1072627861
+	.long	1608550416
+	.long	1022675612
+	.long	3536155904
+	.long	1072657091
+	.long	349665778
+	.long	1025156751
+	.long	3078046720
+	.long	1072686946
+	.long	2016159996
+	.long	1022193169
+	.long	455228416
+	.long	1072705361
+	.long	1908539328
+	.long	1026126332
+	.long	1871505664
+	.long	1072720988
+	.long	2784700894
+	.long	1025922277
+	.long	1630994432
+	.long	1072737010
+	.long	361107678
+	.long	1022887244
+	.long	2084558336
+	.long	1072753462
+	.type	Tbl_addr,@object
+	.size	Tbl_addr,3840
+	.space 768, 0x00 	# pad
+	.align 16
+cv:
+	.long	0
+	.long	0
+	.long	1431655765
+	.long	3217380693
+	.long	858993459
+	.long	3216192307
+	.long	3067833783
+	.long	3215383405
+	.type	cv,@object
+	.size	cv,32
+	.align 16
+PI_BY_2:
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.type	PI_BY_2,@object
+	.size	PI_BY_2,16
+	.align 16
+NEG_PI:
+	.long	856972295
+	.long	3164710438
+	.long	1413754136
+	.long	3221823995
+	.type	NEG_PI,@object
+	.size	NEG_PI,16
+	.align 16
+cv2:
+	.long	780903145
+	.long	1066854586
+	.long	858993459
+	.long	1068708659
+	.long	3340530119
+	.long	1067392113
+	.long	1431655765
+	.long	1069897045
+	.long	1321528399
+	.long	1066517740
+	.long	3067833783
+	.long	1067899757
+	.long	2021159460
+	.long	1065855096
+	.long	2576980378
+	.long	1066178969
+	.type	cv2,@object
+	.size	cv2,64
+	.align 16
+HALFMASK:
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.type	HALFMASK,@object
+	.size	HALFMASK,16
+	.align 16
+PI:
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	1074340347
+	.type	PI,@object
+	.size	PI,16
+	.align 4
+ONEMASK:
+	.long	0
+	.long	1072693248
+	.type	ONEMASK,@object
+	.size	ONEMASK,8
+	.align 4
+TMASK:
+	.long	0
+	.long	4294950912
+	.type	TMASK,@object
+	.size	TMASK,8
+	.align 4
+ONE_BY_2:
+	.long	0
+	.long	1071644672
+	.type	ONE_BY_2,@object
+	.size	ONE_BY_2,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_acos.1-.
+	.4byte ..___tag_value_acos.5-..___tag_value_acos.1
+	.2byte 0x0400
+	.4byte ..___tag_value_acos.3-..___tag_value_acos.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_acos.4-..___tag_value_acos.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_asin.S b/libm/x86_64/e_asin.S
new file mode 100644
index 0000000..9f41c7c
--- /dev/null
+++ b/libm/x86_64/e_asin.S
@@ -0,0 +1,2036 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  To compute asin(s), separate schemes are used when s is in different
+//  intervals.
+//
+//  |s| in [2^{-4}, sqrt(3)/2):
+//       Let t=2^k*1.b1 b2..b6 1, where s=2^k*1.b1 b2 .. b52
+//       asin(s)=asin(t)+asin(r), where r=s*sqrt(1-t^2)-t*sqrt(1-s^2)
+//       asin(r)-r evaluated as 7-degree polynomial (c3*r^3+c5*r^5+c7*r^7)
+//       For the first degree term, r is evaluated as
+//                R=(s^2-t^2)/(sqrt(1-t^2)*s+sqrt(1-s^2)*t)
+//       (sqrt(1-t^2) read from table)
+//  The main source of error is still R (may still be affected by up to 3 ulps
+//  of rounding error). The table size must be sufficiently large, to minimize
+//  this effect.
+//
+//  |s| in [sqrt(3)/2, 255/256):
+//       Let t=2^k*1.b1 b2..b6 1, where sqrt(1-s^2)=2^k*1.b1 b2 .. b52 (rounded)
+//       asin(|s|)=pi/2-asin(t)+asin(r), r=s*t-sqrt(1-s^2)*sqrt(1-t^2)
+//       asin(r) evaluated as polynomial (same as above)
+//       The first degree term is evaluated as
+//                        r=(s^2+t^2-1)/(s*t+sqrt(1-s^2)*sqrt(1-t^2))
+//
+//  |s|<2^{-4}: evaluate as 13-degree polynomial
+//
+//  |s| in [255/256,1): asin(|s|)=pi/2-asin(sqrt(1-s^2))
+//         use 17-degree polynomial, get error term
+//         Q*eps ~ (1-s^2-Q^2)/(2*Q) for first term
+//                 ( Q(1+eps)=sqrt(1-s^2) )
+//
+// Special cases:
+//  asin(NaN) = quiet NaN, and raise invalid exception
+//  asin(INF) = QNaN and raise invalid exception
+//  asin(x) = QNaN and raise invalid exception, for |x|>1.0
+//  asin(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  asin
+ENTRY(asin)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_asin.1:
+        subq      $24, %rsp
+..___tag_value_asin.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        stmxcsr   16(%rsp)
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        jne       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        movsd     ABSVALMASK(%rip), %xmm4
+        movsd     ONEMASK(%rip), %xmm3
+        xorpd     %xmm5, %xmm5
+        movsd     TMASK(%rip), %xmm2
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movq      %xmm0, %xmm1
+        psrlq     $44, %xmm0
+        movd      %xmm0, %edx
+        movq      %xmm1, %xmm7
+        movl      $8192, %ecx
+        pinsrw    $2, %ecx, %xmm5
+        movq      %xmm1, %xmm0
+        movl      $524287, %eax
+        andl      %edx, %eax
+        subl      $260864, %eax
+        cmpl      $955, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        mulsd     %xmm1, %xmm1
+        andl      $65535, %edx
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        andpd     %xmm7, %xmm2
+        andl      $-4, %edx
+        subl      $64256, %edx
+        lea       T_table(%rip), %r8
+        movsd     (%r8,%rdx,2), %xmm1
+        orpd      %xmm5, %xmm2
+        lea       Tbl_addr(%rip), %r8
+        movapd    (%r8,%rdx,4), %xmm4
+        movq      %xmm7, %xmm6
+        addsd     %xmm2, %xmm7
+        subsd     %xmm2, %xmm0
+        mulsd     %xmm7, %xmm0
+        mulsd     %xmm1, %xmm6
+        mulsd     %xmm2, %xmm3
+        movq      %xmm6, %xmm1
+        addsd     %xmm3, %xmm6
+        divsd     %xmm6, %xmm0
+        movsd     16+cv(%rip), %xmm7
+        movsd     cv(%rip), %xmm5
+        subsd     %xmm3, %xmm1
+        andpd     SIGNMASK(%rip), %xmm2
+        movq      %xmm1, %xmm3
+        mulsd     %xmm1, %xmm1
+        movsd     8+cv(%rip), %xmm6
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm1, %xmm7
+        mulsd     %xmm3, %xmm5
+        xorpd     %xmm2, %xmm4
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm7, %xmm6
+        mulsd     %xmm3, %xmm6
+        addsd     %xmm4, %xmm5
+        pshufd    $238, %xmm4, %xmm4
+        addsd     %xmm5, %xmm6
+        orpd      %xmm2, %xmm4
+        addsd     %xmm6, %xmm0
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_3.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_3.0.2:
+        addsd     %xmm4, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        subl      $955, %eax
+        cmpl      $67, %eax
+        jae       .L_2TAG_PACKET_4.0.2
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        movl      %edx, %eax
+        andpd     ABSVALMASK(%rip), %xmm0
+        andpd     HALFMASK2(%rip), %xmm7
+        movq      %xmm0, %xmm1
+        movsd     ONEMASK(%rip), %xmm4
+        movq      %xmm7, %xmm6
+        subsd     %xmm7, %xmm1
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm6, %xmm0
+        subsd     %xmm7, %xmm4
+        mulsd     %xmm1, %xmm0
+        movq      %xmm3, %xmm7
+        andpd     %xmm3, %xmm2
+        psllq     $2, %xmm3
+        pextrw    $3, %xmm3, %edx
+        orpd      %xmm5, %xmm2
+        subl      $65216, %edx
+        addl      %edx, %edx
+        lea       T_table(%rip), %r8
+        mulsd     (%r8,%rdx,4), %xmm7
+        mulsd     %xmm2, %xmm6
+        movapd    PI_BY_2(%rip), %xmm3
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm2, %xmm2
+        subsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm6
+        subsd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm7
+        movsd     cv(%rip), %xmm5
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm7
+        movsd     16+cv(%rip), %xmm0
+        divsd     %xmm7, %xmm4
+        movsd     8+cv(%rip), %xmm2
+        lea       Tbl_addr(%rip), %r8
+        subpd     (%r8,%rdx,8), %xmm3
+        movq      %xmm6, %xmm1
+        mulsd     %xmm6, %xmm6
+        andl      $524288, %eax
+        shrl      $4, %eax
+        mulsd     %xmm6, %xmm0
+        mulsd     %xmm6, %xmm1
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm6, %xmm1
+        addsd     %xmm2, %xmm0
+        pxor      %xmm6, %xmm6
+        mulsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm5
+        pinsrw    $3, %eax, %xmm6
+        addsd     %xmm5, %xmm0
+        movq      %xmm4, %xmm5
+        pshufd    $238, %xmm3, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm3
+        subsd     %xmm3, %xmm5
+        subsd     %xmm5, %xmm0
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_5.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_5.0.2:
+        xorpd     %xmm6, %xmm0
+        xorpd     %xmm6, %xmm4
+        subsd     %xmm4, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        addl      $15291, %eax
+        cmpl      $14336, %eax
+        jae       .L_2TAG_PACKET_6.0.2
+        unpcklpd  %xmm7, %xmm7
+        movapd    cv2(%rip), %xmm1
+        movapd    %xmm7, %xmm6
+        movapd    16+cv2(%rip), %xmm2
+        movapd    32+cv2(%rip), %xmm4
+        mulpd     %xmm7, %xmm7
+        mulpd     %xmm7, %xmm6
+        mulpd     %xmm7, %xmm1
+        mulpd     %xmm7, %xmm7
+        movq      %xmm6, %xmm3
+        mulsd     %xmm6, %xmm6
+        addpd     %xmm2, %xmm1
+        mulpd     %xmm7, %xmm4
+        mulsd     %xmm3, %xmm6
+        addpd     %xmm4, %xmm1
+        mulpd     %xmm6, %xmm1
+        pshufd    $238, %xmm1, %xmm2
+        addsd     %xmm2, %xmm1
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_7.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_7.0.2:
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        subl      $15358, %eax
+        cmpl      $2, %eax
+        jae       .L_2TAG_PACKET_8.0.2
+        mulsd     %xmm1, %xmm1
+        subsd     %xmm1, %xmm3
+        sqrtsd    %xmm3, %xmm3
+        movl      %edx, %eax
+        andpd     HALFMASK(%rip), %xmm7
+        pshufd    $68, %xmm3, %xmm5
+        andpd     HALFMASK(%rip), %xmm3
+        movq      %xmm7, %xmm1
+        movsd     ONEMASK(%rip), %xmm4
+        movq      %xmm7, %xmm6
+        subsd     %xmm7, %xmm0
+        mulsd     %xmm7, %xmm7
+        addsd     %xmm1, %xmm1
+        mulsd     %xmm0, %xmm1
+        subsd     %xmm7, %xmm4
+        movq      %xmm3, %xmm6
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm0, %xmm0
+        subsd     %xmm1, %xmm4
+        subsd     %xmm5, %xmm6
+        addsd     %xmm5, %xmm5
+        subsd     %xmm3, %xmm4
+        movapd    cv2(%rip), %xmm2
+        pshufd    $238, %xmm5, %xmm3
+        subsd     %xmm0, %xmm4
+        addsd     %xmm6, %xmm5
+        pshufd    $238, %xmm3, %xmm7
+        addsd     %xmm3, %xmm3
+        mulsd     %xmm6, %xmm5
+        addsd     %xmm5, %xmm4
+        pshufd    $238, %xmm7, %xmm6
+        divsd     %xmm3, %xmm4
+        movapd    48+cv2(%rip), %xmm1
+        movapd    16+cv2(%rip), %xmm5
+        movapd    32+cv2(%rip), %xmm0
+        mulpd     %xmm7, %xmm7
+        movq      %xmm6, %xmm3
+        mulpd     %xmm7, %xmm2
+        mulpd     %xmm7, %xmm6
+        shrl      $4, %eax
+        andl      $32768, %eax
+        mulsd     %xmm7, %xmm1
+        mulpd     %xmm7, %xmm7
+        addpd     %xmm2, %xmm5
+        movapd    %xmm6, %xmm2
+        mulsd     %xmm6, %xmm6
+        mulpd     %xmm0, %xmm7
+        movapd    PI_BY_2(%rip), %xmm0
+        mulsd     %xmm6, %xmm2
+        addpd     %xmm5, %xmm7
+        pshufd    $238, %xmm1, %xmm5
+        mulsd     %xmm2, %xmm6
+        mulpd     %xmm2, %xmm7
+        addsd     %xmm5, %xmm1
+        xorpd     %xmm5, %xmm5
+        pshufd    $238, %xmm7, %xmm2
+        mulsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm2, %xmm7
+        movq      %xmm3, %xmm2
+        pinsrw    $3, %eax, %xmm5
+        subsd     %xmm6, %xmm3
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm6
+        addsd     %xmm4, %xmm7
+        subsd     %xmm6, %xmm2
+        subsd     %xmm7, %xmm0
+        subsd     %xmm2, %xmm0
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_9.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_9.0.2:
+        xorpd     %xmm5, %xmm0
+        xorpd     %xmm5, %xmm3
+        subsd     %xmm3, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_8.0.2:
+        addl      $261886, %eax
+        cmpl      $261888, %eax
+        jb        .L_2TAG_PACKET_10.0.2
+        movd      %xmm0, %ecx
+        psrlq     $32, %xmm0
+        movd      %xmm0, %edx
+        andl      $2147483647, %edx
+        movl      $1072693248, %eax
+        subl      %edx, %eax
+        orl       %ecx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_11.0.2
+        movsd     (%rsp), %xmm2
+        movd      %xmm2, %edx
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $2147483647, %ecx
+        subl      $1, %edx
+        sbbl      $2146435072, %ecx
+        cmpl      $0, %ecx
+        jge       .L_2TAG_PACKET_10.0.2
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_12.0.2
+.L_2TAG_PACKET_11.0.2:
+        movsd     ABSVALMASK(%rip), %xmm1
+        movsd     PI_BY_2(%rip), %xmm2
+        movsd     8+PI_BY_2(%rip), %xmm0
+        addsd     %xmm2, %xmm0
+        andnpd    %xmm7, %xmm1
+        orpd      %xmm1, %xmm0
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_13.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_13.0.2:
+        jmp       ..B1.5
+.L_2TAG_PACKET_10.0.2:
+        movsd     (%rsp), %xmm0
+        xorpd     %xmm6, %xmm6
+        movq      %xmm0, %xmm7
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_14.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_14.0.2:
+        pextrw    $3, %xmm0, %edx
+        andl      $32752, %edx
+        subl      $16, %edx
+        cmpl      $32736, %edx
+        jb        .L_2TAG_PACKET_15.0.2
+        addsd     %xmm0, %xmm6
+        orpd      %xmm6, %xmm0
+        mulsd     %xmm0, %xmm7
+.L_2TAG_PACKET_15.0.2:
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        movl      %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_12.0.2:
+        movl      16(%rsp), %eax
+        andl      $-24577, %eax
+        cmpl      16(%rsp), %eax
+        je        .L_2TAG_PACKET_16.0.2
+        stmxcsr   20(%rsp)
+        movl      16(%rsp), %eax
+        andl      $24576, %eax
+        orl       %eax, 20(%rsp)
+        ldmxcsr   20(%rsp)
+.L_2TAG_PACKET_16.0.2:
+        movq      %xmm0, 8(%rsp)
+..B1.3:
+        movq      8(%rsp), %xmm0
+.L_2TAG_PACKET_17.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_asin.4:
+        ret       
+..___tag_value_asin.5:
+END(asin)
+# -- End  asin
+	.section .rodata, "a"
+	.align 16
+	.align 16
+ABSVALMASK:
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	0
+	.type	ABSVALMASK,@object
+	.size	ABSVALMASK,16
+	.align 16
+T_table:
+	.long	2642784509
+	.long	1072689083
+	.long	1514442531
+	.long	1072688953
+	.long	333108933
+	.long	1072688821
+	.long	3392112024
+	.long	1072688686
+	.long	2099852862
+	.long	1072688550
+	.long	749609004
+	.long	1072688412
+	.long	3634632596
+	.long	1072688271
+	.long	2163248461
+	.long	1072688129
+	.long	628657846
+	.long	1072687985
+	.long	3324036511
+	.long	1072687838
+	.long	1657632815
+	.long	1072687690
+	.long	4217538760
+	.long	1072687539
+	.long	2411951597
+	.long	1072687387
+	.long	533944872
+	.long	1072687233
+	.long	2876566508
+	.long	1072687076
+	.long	847936891
+	.long	1072686918
+	.long	3036019913
+	.long	1072686757
+	.long	848884575
+	.long	1072686595
+	.long	2874443326
+	.long	1072686430
+	.long	520713666
+	.long	1072686264
+	.long	2375556481
+	.long	1072686095
+	.long	4141904948
+	.long	1072685924
+	.long	1522666382
+	.long	1072685752
+	.long	3105624104
+	.long	1072685577
+	.long	298666327
+	.long	1072685401
+	.long	1689524500
+	.long	1072685222
+	.long	2981002200
+	.long	1072685041
+	.long	4170844284
+	.long	1072684858
+	.long	961802263
+	.long	1072684674
+	.long	1941503454
+	.long	1072684487
+	.long	2812647170
+	.long	1072684298
+	.long	3572873869
+	.long	1072684107
+	.long	4219797823
+	.long	1072683914
+	.long	456039788
+	.long	1072683720
+	.long	869096151
+	.long	1072683523
+	.long	1161535119
+	.long	1072683324
+	.long	1330865866
+	.long	1072683123
+	.long	1374571204
+	.long	1072682920
+	.long	1290107538
+	.long	1072682715
+	.long	1074904836
+	.long	1072682508
+	.long	726366587
+	.long	1072682299
+	.long	241869763
+	.long	1072682088
+	.long	3913732079
+	.long	1072681874
+	.long	3149342765
+	.long	1072681659
+	.long	2240966306
+	.long	1072681442
+	.long	1185873216
+	.long	1072681223
+	.long	4276274591
+	.long	1072681001
+	.long	2919452883
+	.long	1072680778
+	.long	1407565635
+	.long	1072680553
+	.long	4032743551
+	.long	1072680325
+	.long	2202188565
+	.long	1072680096
+	.long	207977577
+	.long	1072679865
+	.long	2342160518
+	.long	1072679631
+	.long	11858423
+	.long	1072679396
+	.long	1804034453
+	.long	1072679158
+	.long	3420722787
+	.long	1072678918
+	.long	563930456
+	.long	1072678677
+	.long	1820539192
+	.long	1072678433
+	.long	2892501606
+	.long	1072678187
+	.long	3776710320
+	.long	1072677939
+	.long	175063337
+	.long	1072677690
+	.long	674333171
+	.long	1072677438
+	.long	976363026
+	.long	1072677184
+	.long	1077935934
+	.long	1072676928
+	.long	1921075490
+	.long	1072676540
+	.long	881493302
+	.long	1072676016
+	.long	3275752439
+	.long	1072675483
+	.long	486855588
+	.long	1072674943
+	.long	1077229111
+	.long	1072674394
+	.long	723950308
+	.long	1072673837
+	.long	3693582199
+	.long	1072673271
+	.long	1367335316
+	.long	1072672698
+	.long	2305837020
+	.long	1072672116
+	.long	2184358641
+	.long	1072671526
+	.long	972682840
+	.long	1072670928
+	.long	2935101762
+	.long	1072670321
+	.long	3745513263
+	.long	1072669706
+	.long	3372320886
+	.long	1072669083
+	.long	1783464620
+	.long	1072668452
+	.long	3241386215
+	.long	1072667812
+	.long	3418125284
+	.long	1072667164
+	.long	2280219148
+	.long	1072666508
+	.long	4088700758
+	.long	1072665843
+	.long	219227400
+	.long	1072665171
+	.long	3521816918
+	.long	1072664489
+	.long	1076205279
+	.long	1072663800
+	.long	1436484616
+	.long	1072663102
+	.long	271362610
+	.long	1072662396
+	.long	1838996688
+	.long	1072661681
+	.long	1807122518
+	.long	1072660958
+	.long	137953542
+	.long	1072660227
+	.long	1088178584
+	.long	1072659487
+	.long	324057537
+	.long	1072658739
+	.long	2101288076
+	.long	1072657982
+	.long	2085133974
+	.long	1072657217
+	.long	235324451
+	.long	1072656444
+	.long	806051592
+	.long	1072655662
+	.long	3756033140
+	.long	1072654871
+	.long	453542543
+	.long	1072654073
+	.long	3741177327
+	.long	1072653265
+	.long	691216109
+	.long	1072652450
+	.long	4145223372
+	.long	1072651625
+	.long	1174439091
+	.long	1072650793
+	.long	324416139
+	.long	1072649952
+	.long	1550246310
+	.long	1072649102
+	.long	511524674
+	.long	1072648244
+	.long	1457248482
+	.long	1072647377
+	.long	45944955
+	.long	1072646502
+	.long	525537397
+	.long	1072645618
+	.long	2848440188
+	.long	1072644725
+	.long	2671555633
+	.long	1072643824
+	.long	4241172637
+	.long	1072642914
+	.long	3213094278
+	.long	1072641996
+	.long	3832503688
+	.long	1072641069
+	.long	1754091534
+	.long	1072640134
+	.long	1221921804
+	.long	1072639190
+	.long	2184526489
+	.long	1072638237
+	.long	294902089
+	.long	1072637276
+	.long	4090375270
+	.long	1072636305
+	.long	632860906
+	.long	1072635327
+	.long	2753498702
+	.long	1072634339
+	.long	1808009252
+	.long	1072633343
+	.long	2036428672
+	.long	1072632338
+	.long	3383235626
+	.long	1072631324
+	.long	1497347484
+	.long	1072630302
+	.long	617018317
+	.long	1072629271
+	.long	684933058
+	.long	1072628231
+	.long	1643170798
+	.long	1072627182
+	.long	3011066360
+	.long	1072625592
+	.long	957158713
+	.long	1072623442
+	.long	1390907941
+	.long	1072621256
+	.long	3819155270
+	.long	1072619034
+	.long	3443571196
+	.long	1072616777
+	.long	4045412458
+	.long	1072614484
+	.long	805503923
+	.long	1072612156
+	.long	1778922015
+	.long	1072609791
+	.long	2125033665
+	.long	1072607390
+	.long	1287203863
+	.long	1072604953
+	.long	2992629568
+	.long	1072602479
+	.long	2367267127
+	.long	1072599969
+	.long	3115526047
+	.long	1072597422
+	.long	340219539
+	.long	1072594839
+	.long	2017215719
+	.long	1072592218
+	.long	3225443424
+	.long	1072589560
+	.long	3326565673
+	.long	1072586865
+	.long	1669811211
+	.long	1072584133
+	.long	1886735022
+	.long	1072581363
+	.long	3301071171
+	.long	1072578555
+	.long	928514283
+	.long	1072575710
+	.long	2656364059
+	.long	1072572826
+	.long	3473490507
+	.long	1072569904
+	.long	2649965606
+	.long	1072566944
+	.long	3736819052
+	.long	1072563945
+	.long	1680885175
+	.long	1072560908
+	.long	4413771
+	.long	1072557832
+	.long	2214869753
+	.long	1072554716
+	.long	3214725184
+	.long	1072551561
+	.long	2186079903
+	.long	1072548367
+	.long	2590372131
+	.long	1072545133
+	.long	3578146079
+	.long	1072541859
+	.long	4283712755
+	.long	1072538545
+	.long	3824834510
+	.long	1072535191
+	.long	1302400298
+	.long	1072531797
+	.long	95058636
+	.long	1072528362
+	.long	3563906063
+	.long	1072524885
+	.long	2167230730
+	.long	1072521368
+	.long	3524918334
+	.long	1072517809
+	.long	2353304918
+	.long	1072514209
+	.long	1939625839
+	.long	1072510567
+	.long	1256714581
+	.long	1072506883
+	.long	3552525848
+	.long	1072503156
+	.long	3464809522
+	.long	1072499387
+	.long	4200542593
+	.long	1072495575
+	.long	355609124
+	.long	1072491721
+	.long	3684139099
+	.long	1072487822
+	.long	148355918
+	.long	1072483881
+	.long	1457689242
+	.long	1072479895
+	.long	2118591596
+	.long	1072475865
+	.long	908848089
+	.long	1072471791
+	.long	877032689
+	.long	1072467672
+	.long	752012304
+	.long	1072463508
+	.long	3532301749
+	.long	1072459298
+	.long	3600563221
+	.long	1072455043
+	.long	3902857084
+	.long	1072450742
+	.long	3063101036
+	.long	1072446395
+	.long	3972344374
+	.long	1072442001
+	.long	903183549
+	.long	1072437561
+	.long	983892938
+	.long	1072433073
+	.long	2722858568
+	.long	1072428537
+	.long	302790515
+	.long	1072423954
+	.long	759811057
+	.long	1072419322
+	.long	2507809922
+	.long	1072414641
+	.long	2388408813
+	.long	1072407528
+	.long	2084492942
+	.long	1072397870
+	.long	2435703301
+	.long	1072388010
+	.long	1935433360
+	.long	1072377945
+	.long	2742047290
+	.long	1072367671
+	.long	2053284205
+	.long	1072357185
+	.long	657783367
+	.long	1072346483
+	.long	2893664841
+	.long	1072335560
+	.long	3718906405
+	.long	1072324413
+	.long	1547896303
+	.long	1072313038
+	.long	2494058440
+	.long	1072301429
+	.long	3133238742
+	.long	1072289582
+	.long	3327000086
+	.long	1072277492
+	.long	1860667274
+	.long	1072265154
+	.long	665340747
+	.long	1072252562
+	.long	443347841
+	.long	1072239710
+	.long	581282618
+	.long	1072226592
+	.long	3349780465
+	.long	1072213201
+	.long	914217606
+	.long	1072199532
+	.long	989797661
+	.long	1072185576
+	.long	945436416
+	.long	1072171326
+	.long	549291300
+	.long	1072156774
+	.long	1814636389
+	.long	1072141911
+	.long	239092858
+	.long	1072126729
+	.long	1794680724
+	.long	1072111217
+	.long	1241534678
+	.long	1072095366
+	.long	3366566214
+	.long	1072079164
+	.long	1244090828
+	.long	1072062601
+	.long	1708448120
+	.long	1072045663
+	.long	3544260650
+	.long	1072028337
+	.long	1402741403
+	.long	1072010610
+	.long	2551936888
+	.long	1071992465
+	.long	617669739
+	.long	1071973887
+	.long	794002186
+	.long	1071954857
+	.long	2021237693
+	.long	1071935356
+	.long	540450384
+	.long	1071915364
+	.long	1920555537
+	.long	1071894857
+	.long	2879585206
+	.long	1071873811
+	.long	3000237455
+	.long	1071852199
+	.long	3352974346
+	.long	1071829991
+	.long	569629937
+	.long	1071807155
+	.long	2077237208
+	.long	1071783653
+	.long	2284891805
+	.long	1071759446
+	.long	1226651784
+	.long	1071734489
+	.long	1102047405
+	.long	1071708731
+	.long	2009896384
+	.long	1071682115
+	.long	927419082
+	.long	1071654577
+	.long	85010366
+	.long	1071607413
+	.long	696431025
+	.long	1071548180
+	.long	2611410541
+	.long	1071486585
+	.long	2612593658
+	.long	1071422396
+	.long	3548155306
+	.long	1071355336
+	.long	3887997484
+	.long	1071285073
+	.long	244854763
+	.long	1071211202
+	.long	4214445648
+	.long	1071133216
+	.long	2303966727
+	.long	1071050478
+	.long	3991040013
+	.long	1070962152
+	.long	3126952278
+	.long	1070867118
+	.long	1817448378
+	.long	1070763804
+	.long	1793814864
+	.long	1070649884
+	.long	3507224072
+	.long	1070447193
+	.long	4027609105
+	.long	1070148772
+	.long	577507993
+	.long	1069779414
+	.long	2310232419
+	.long	1068931829
+	.type	T_table,@object
+	.size	T_table,2048
+	.align 16
+Tbl_addr:
+	.long	3822952792
+	.long	1021639372
+	.long	182792448
+	.long	1068507836
+	.long	2264213271
+	.long	1019558908
+	.long	649052928
+	.long	1068524253
+	.long	1797139609
+	.long	1022295143
+	.long	1243095296
+	.long	1068540671
+	.long	1415938756
+	.long	1021439537
+	.long	2033294592
+	.long	1068557090
+	.long	2356809978
+	.long	1021777916
+	.long	3088063744
+	.long	1068573510
+	.long	2669055318
+	.long	1022124482
+	.long	180888576
+	.long	1068589932
+	.long	3566445325
+	.long	1021358712
+	.long	1970196992
+	.long	1068606354
+	.long	896980323
+	.long	1021319659
+	.long	4229555456
+	.long	1068622777
+	.long	436049712
+	.long	1021319758
+	.long	2732572160
+	.long	1068639202
+	.long	583123209
+	.long	1020797960
+	.long	1842831872
+	.long	1068655628
+	.long	1370449804
+	.long	1021429270
+	.long	1628994560
+	.long	1068672055
+	.long	2411391464
+	.long	1021057980
+	.long	2159763712
+	.long	1068688483
+	.long	1208692749
+	.long	1021943903
+	.long	3503886336
+	.long	1068704912
+	.long	538793309
+	.long	1019744063
+	.long	1435187200
+	.long	1068721343
+	.long	4085087612
+	.long	1020608419
+	.long	317469952
+	.long	1068737775
+	.long	144386942
+	.long	1021440732
+	.long	219617280
+	.long	1068754208
+	.long	2940088361
+	.long	1019981122
+	.long	1210558208
+	.long	1068770642
+	.long	2176850347
+	.long	1018373705
+	.long	3359268352
+	.long	1068787077
+	.long	2395611454
+	.long	1021889042
+	.long	2439803648
+	.long	1068803514
+	.long	1650705253
+	.long	1020227966
+	.long	2816203520
+	.long	1068819952
+	.long	3702166386
+	.long	1019379914
+	.long	262620672
+	.long	1068836392
+	.long	1855649370
+	.long	1020453124
+	.long	3438159616
+	.long	1068852832
+	.long	923063860
+	.long	1019273834
+	.long	3822105856
+	.long	1068869274
+	.long	4289947947
+	.long	1019434249
+	.long	1483729920
+	.long	1068885718
+	.long	787455814
+	.long	1020738379
+	.long	787321088
+	.long	1068902163
+	.long	3321653337
+	.long	1021842569
+	.long	1802253312
+	.long	1068918609
+	.long	2653633526
+	.long	1021821525
+	.long	302985984
+	.long	1068935057
+	.long	161272028
+	.long	1021655149
+	.long	653966080
+	.long	1068951506
+	.long	2566098667
+	.long	1020066219
+	.long	2924727296
+	.long	1068967956
+	.long	3646493722
+	.long	1014292285
+	.long	2889890304
+	.long	1068984408
+	.long	1081009196
+	.long	1022189620
+	.long	619098112
+	.long	1069000862
+	.long	4011643355
+	.long	1021773297
+	.long	477017600
+	.long	1069017317
+	.long	4030305534
+	.long	1021292252
+	.long	2533403904
+	.long	1069033773
+	.long	2645187591
+	.long	1019527099
+	.long	2563102208
+	.long	1069050231
+	.long	3857293792
+	.long	1022311697
+	.long	635982336
+	.long	1069066691
+	.long	3625936637
+	.long	1017511744
+	.long	1116940800
+	.long	1069083152
+	.long	3653872993
+	.long	1022016631
+	.long	4075964160
+	.long	1069099614
+	.long	2468900271
+	.long	1021769532
+	.long	993165568
+	.long	1069116079
+	.long	1358104224
+	.long	1021199776
+	.long	528586752
+	.long	1069132545
+	.long	2200950332
+	.long	1022024872
+	.long	2752395776
+	.long	1069149012
+	.long	3197072454
+	.long	1017751319
+	.long	3439855616
+	.long	1069165481
+	.long	1651081806
+	.long	1020809338
+	.long	2661257728
+	.long	1069181952
+	.long	539032752
+	.long	1021728805
+	.long	486957312
+	.long	1069198425
+	.long	3136045149
+	.long	1016888671
+	.long	1282340352
+	.long	1069214899
+	.long	2593963259
+	.long	1018956103
+	.long	822921728
+	.long	1069231375
+	.long	2146032737
+	.long	1022306465
+	.long	3474216192
+	.long	1069247852
+	.long	3976811625
+	.long	1021350207
+	.long	716902656
+	.long	1069264332
+	.long	718267222
+	.long	1018624727
+	.long	1211594496
+	.long	1069280813
+	.long	1485641389
+	.long	1018447451
+	.long	734070272
+	.long	1069297296
+	.long	354455128
+	.long	1021341291
+	.long	3650110720
+	.long	1069313780
+	.long	682185947
+	.long	1021651853
+	.long	1440663040
+	.long	1069330267
+	.long	3558574550
+	.long	1021615110
+	.long	2766612224
+	.long	1069346755
+	.long	874607978
+	.long	1017746872
+	.long	3404011008
+	.long	1069363245
+	.long	4154988502
+	.long	1021439906
+	.long	3423949056
+	.long	1069379737
+	.long	2263202309
+	.long	1021479615
+	.long	2897587712
+	.long	1069396231
+	.long	2562065031
+	.long	1022090363
+	.long	1896159232
+	.long	1069412727
+	.long	3836237663
+	.long	1019867288
+	.long	490968576
+	.long	1069429225
+	.long	3322056743
+	.long	1006752762
+	.long	3048360192
+	.long	1069445724
+	.long	1152314833
+	.long	1013122252
+	.long	1049850624
+	.long	1069462226
+	.long	3601590727
+	.long	1022214610
+	.long	3156899584
+	.long	1069478729
+	.long	1855169970
+	.long	1019487271
+	.long	851173376
+	.long	1069495235
+	.long	312649594
+	.long	1020868604
+	.long	2794281728
+	.long	1069511742
+	.long	1093490181
+	.long	1020777577
+	.long	468042496
+	.long	1069528252
+	.long	1152540679
+	.long	1021403732
+	.long	2534219264
+	.long	1069544763
+	.long	2292126035
+	.long	1021872430
+	.long	1376146432
+	.long	1069558527
+	.long	3293753641
+	.long	1020500454
+	.long	4175442432
+	.long	1069575044
+	.long	3626347564
+	.long	1021610969
+	.long	3523113472
+	.long	1069591566
+	.long	339956500
+	.long	1021119039
+	.long	4003350528
+	.long	1069608092
+	.long	3429333082
+	.long	1022813542
+	.long	1611067392
+	.long	1069624623
+	.long	2298017544
+	.long	1021977587
+	.long	931782144
+	.long	1069641158
+	.long	2164684743
+	.long	1021250988
+	.long	2256725504
+	.long	1069657697
+	.long	1138762335
+	.long	1021443776
+	.long	1582853120
+	.long	1069674241
+	.long	1084010382
+	.long	1022994693
+	.long	3497758720
+	.long	1069690789
+	.long	406366244
+	.long	1022713586
+	.long	3999816960
+	.long	1069707342
+	.long	1488723042
+	.long	1023381290
+	.long	3383096064
+	.long	1069723900
+	.long	2541558953
+	.long	1019137887
+	.long	1942403584
+	.long	1069740463
+	.long	1879620343
+	.long	1022653642
+	.long	4268263680
+	.long	1069757030
+	.long	3039077047
+	.long	1022252545
+	.long	2067062272
+	.long	1069773603
+	.long	4190670677
+	.long	1020725863
+	.long	4225828096
+	.long	1069790180
+	.long	1998567321
+	.long	1022014385
+	.long	2452507136
+	.long	1069806763
+	.long	1511628873
+	.long	1021900300
+	.long	1340746240
+	.long	1069823351
+	.long	788367341
+	.long	1022726208
+	.long	1190035456
+	.long	1069839944
+	.long	3856337230
+	.long	1021834118
+	.long	2300688384
+	.long	1069856542
+	.long	3211396579
+	.long	1022621365
+	.long	678886400
+	.long	1069873146
+	.long	4001011887
+	.long	1022042646
+	.long	921594112
+	.long	1069889755
+	.long	557811968
+	.long	1023065533
+	.long	3331668992
+	.long	1069906369
+	.long	1877060679
+	.long	1022419742
+	.long	3917875200
+	.long	1069922989
+	.long	1181055171
+	.long	1022752712
+	.long	2984829696
+	.long	1069939615
+	.long	4294526932
+	.long	1021499988
+	.long	838049024
+	.long	1069956247
+	.long	3658081878
+	.long	1022957952
+	.long	2078928384
+	.long	1069972884
+	.long	820353701
+	.long	1019391107
+	.long	2719854336
+	.long	1069989527
+	.long	1644022489
+	.long	1023378240
+	.long	3069117696
+	.long	1070006176
+	.long	2771393702
+	.long	1019319954
+	.long	3435962368
+	.long	1070022831
+	.long	3876394145
+	.long	1023024433
+	.long	4130595328
+	.long	1070039492
+	.long	1630447748
+	.long	1021465882
+	.long	1169236224
+	.long	1070056160
+	.long	2828355997
+	.long	1020458120
+	.long	3453997312
+	.long	1070072833
+	.long	164091641
+	.long	1020388279
+	.long	2708127744
+	.long	1070089513
+	.long	3036550223
+	.long	1023328684
+	.long	3540797696
+	.long	1070106199
+	.long	3710949463
+	.long	1022568805
+	.long	1972276736
+	.long	1070122892
+	.long	3885277950
+	.long	1019761674
+	.long	2613815552
+	.long	1070139591
+	.long	2764165077
+	.long	1022921023
+	.long	1487791616
+	.long	1070156297
+	.long	1330644769
+	.long	1023162679
+	.long	3207593472
+	.long	1070173009
+	.long	3911007221
+	.long	1022993496
+	.long	3797764608
+	.long	1070189728
+	.long	979712598
+	.long	1022554580
+	.long	3578920448
+	.long	1070206454
+	.long	2825738223
+	.long	1020223708
+	.long	2872795648
+	.long	1070223187
+	.long	392451124
+	.long	1022666279
+	.long	2002258432
+	.long	1070239927
+	.long	3730407632
+	.long	1023148291
+	.long	1291326464
+	.long	1070256674
+	.long	3723802980
+	.long	1022514089
+	.long	1065180928
+	.long	1070273428
+	.long	2635617463
+	.long	1022654470
+	.long	1650181632
+	.long	1070290189
+	.long	2061982883
+	.long	1022853411
+	.long	3373882880
+	.long	1070306957
+	.long	319732785
+	.long	1022017175
+	.long	2270081280
+	.long	1070323733
+	.long	2237757411
+	.long	1023064087
+	.long	2963732736
+	.long	1070340516
+	.long	468839165
+	.long	1023293774
+	.long	1491099904
+	.long	1070357307
+	.long	1502657946
+	.long	1021533479
+	.long	2479636480
+	.long	1070374105
+	.long	482913562
+	.long	1021986286
+	.long	1968133632
+	.long	1070390911
+	.long	3281474337
+	.long	1022646400
+	.long	291639040
+	.long	1070407725
+	.long	2453320259
+	.long	1022812423
+	.long	2081472512
+	.long	1070424546
+	.long	2939989570
+	.long	1023091888
+	.long	3380340480
+	.long	1070441375
+	.long	2850707499
+	.long	1021921109
+	.long	232287488
+	.long	1070458213
+	.long	3674625342
+	.long	1020725130
+	.long	1567614208
+	.long	1070475058
+	.long	9347334
+	.long	1022024009
+	.long	3433091072
+	.long	1070491911
+	.long	282524999
+	.long	1021433523
+	.long	1876877312
+	.long	1070508773
+	.long	3470449440
+	.long	1019309721
+	.long	1538472192
+	.long	1070525643
+	.long	2089486825
+	.long	1019698916
+	.long	2763830784
+	.long	1070542521
+	.long	443498115
+	.long	1020505194
+	.long	1605381632
+	.long	1070559408
+	.long	3018871601
+	.long	1022869913
+	.long	2706946048
+	.long	1070576303
+	.long	3936260892
+	.long	1023175875
+	.long	2123887360
+	.long	1070593207
+	.long	2994220655
+	.long	1022825948
+	.long	104015104
+	.long	1070603108
+	.long	335054493
+	.long	1023441853
+	.long	2904568832
+	.long	1070615800
+	.long	1451215633
+	.long	1023853857
+	.long	3456197120
+	.long	1070632739
+	.long	436334733
+	.long	1024026432
+	.long	252452352
+	.long	1070649697
+	.long	34596167
+	.long	1024031396
+	.long	3328018432
+	.long	1070666672
+	.long	2644547073
+	.long	1024296758
+	.long	1255829248
+	.long	1070683667
+	.long	552832586
+	.long	1023763122
+	.long	4097058560
+	.long	1070700680
+	.long	1955640623
+	.long	1021394654
+	.long	451770112
+	.long	1070717714
+	.long	3428903777
+	.long	1022941142
+	.long	408920832
+	.long	1070734767
+	.long	165503263
+	.long	1023894958
+	.long	1186960640
+	.long	1070751840
+	.long	435826450
+	.long	1024026134
+	.long	19078656
+	.long	1070768934
+	.long	1834169749
+	.long	1022899284
+	.long	2743490304
+	.long	1070786048
+	.long	494581074
+	.long	1018818479
+	.long	2328961024
+	.long	1070803184
+	.long	2987908834
+	.long	1022581110
+	.long	350011392
+	.long	1070820342
+	.long	240771184
+	.long	1024143083
+	.long	2692326912
+	.long	1070837521
+	.long	666056837
+	.long	1022394776
+	.long	2373274368
+	.long	1070854723
+	.long	2484337770
+	.long	1024228156
+	.long	1017131520
+	.long	1070871948
+	.long	3285648279
+	.long	1024025789
+	.long	265558272
+	.long	1070889196
+	.long	392241896
+	.long	1024252809
+	.long	1778008064
+	.long	1070906467
+	.long	1536107943
+	.long	1023949300
+	.long	2937184768
+	.long	1070923762
+	.long	3541062251
+	.long	1019448646
+	.long	1144442880
+	.long	1070941082
+	.long	3691683781
+	.long	1022123948
+	.long	2410165504
+	.long	1070958426
+	.long	1804181960
+	.long	1023945221
+	.long	4174350848
+	.long	1070975795
+	.long	2016094861
+	.long	1021716585
+	.long	3897012480
+	.long	1070993190
+	.long	175294410
+	.long	1023703404
+	.long	3353623040
+	.long	1071010611
+	.long	167973242
+	.long	1023240839
+	.long	45671168
+	.long	1071028059
+	.long	2166856113
+	.long	1021565413
+	.long	86063872
+	.long	1071045533
+	.long	2676254727
+	.long	1023985299
+	.long	1019772672
+	.long	1071063034
+	.long	989043593
+	.long	1021549587
+	.long	414297344
+	.long	1071080563
+	.long	3960972046
+	.long	1024307251
+	.long	155173120
+	.long	1071098120
+	.long	1830919291
+	.long	1021592251
+	.long	2151562240
+	.long	1071115705
+	.long	405408666
+	.long	1023423128
+	.long	4041854720
+	.long	1071133319
+	.long	2043497827
+	.long	1024411503
+	.long	3489224192
+	.long	1071150963
+	.long	3072215864
+	.long	1022698635
+	.long	2477196288
+	.long	1071168637
+	.long	1812195139
+	.long	1022689192
+	.long	3015298816
+	.long	1071186341
+	.long	764841969
+	.long	1021027331
+	.long	2844731136
+	.long	1071204076
+	.long	2878117321
+	.long	1019116513
+	.long	4028950528
+	.long	1071221842
+	.long	698911452
+	.long	1023265602
+	.long	69441536
+	.long	1071239641
+	.long	3253467847
+	.long	1020795075
+	.long	1676209920
+	.long	1071257471
+	.long	4272431167
+	.long	1022873982
+	.long	2408752384
+	.long	1071275334
+	.long	648519100
+	.long	1024385717
+	.long	151623680
+	.long	1071293231
+	.long	345257017
+	.long	1019561408
+	.long	1410154240
+	.long	1071311161
+	.long	197863993
+	.long	1023224207
+	.long	4131351552
+	.long	1071329125
+	.long	2620801789
+	.long	1024411169
+	.long	1999664384
+	.long	1071347125
+	.long	3952692616
+	.long	1024168086
+	.long	1617668864
+	.long	1071365160
+	.long	3019889809
+	.long	1021907692
+	.long	1032074240
+	.long	1071383231
+	.long	59469899
+	.long	1023656194
+	.long	2619492096
+	.long	1071401338
+	.long	1417526820
+	.long	1021457783
+	.long	202429440
+	.long	1071419483
+	.long	2927667935
+	.long	1019175447
+	.long	525044224
+	.long	1071437665
+	.long	38166811
+	.long	1023981879
+	.long	1779258880
+	.long	1071455885
+	.long	481252500
+	.long	1023310234
+	.long	2195673600
+	.long	1071474144
+	.long	3962395981
+	.long	1021339088
+	.long	44573696
+	.long	1071492443
+	.long	3936281395
+	.long	1023014829
+	.long	2226905344
+	.long	1071510781
+	.long	1515320476
+	.long	1024320623
+	.long	2800512512
+	.long	1071529160
+	.long	1225403697
+	.long	1021081846
+	.long	161113600
+	.long	1071547581
+	.long	3064809733
+	.long	1024173917
+	.long	1338410240
+	.long	1071566043
+	.long	2027604973
+	.long	1024362526
+	.long	522433280
+	.long	1071584548
+	.long	2055171723
+	.long	1023858825
+	.long	539595776
+	.long	1071603096
+	.long	3868820135
+	.long	1022936424
+	.long	4264017664
+	.long	1071621687
+	.long	3228065145
+	.long	1023479578
+	.long	1733924096
+	.long	1071640324
+	.long	3511934475
+	.long	1022496355
+	.long	108880384
+	.long	1071651839
+	.long	615880967
+	.long	1023519706
+	.long	3517856512
+	.long	1071661202
+	.long	3113108559
+	.long	1025190289
+	.long	4043153152
+	.long	1071670589
+	.long	1571836218
+	.long	1023106116
+	.long	3251299072
+	.long	1071680000
+	.long	3444076102
+	.long	1022187841
+	.long	2736921600
+	.long	1071689435
+	.long	272771483
+	.long	1025095280
+	.long	3897698560
+	.long	1071703633
+	.long	2075390188
+	.long	1022489022
+	.long	3209485056
+	.long	1071722652
+	.long	1438094065
+	.long	1021844944
+	.long	3781432064
+	.long	1071741774
+	.long	1675017145
+	.long	1024143828
+	.long	2684184064
+	.long	1071761003
+	.long	2259963753
+	.long	1024731393
+	.long	1840489728
+	.long	1071780342
+	.long	3372883597
+	.long	1023431408
+	.long	3764087808
+	.long	1071799794
+	.long	3307523102
+	.long	1024485788
+	.long	3006232320
+	.long	1071819364
+	.long	3088971966
+	.long	1025213251
+	.long	3374881280
+	.long	1071839055
+	.long	834437749
+	.long	1025236452
+	.long	797284864
+	.long	1071858872
+	.long	3122663941
+	.long	1025320473
+	.long	545765120
+	.long	1071878818
+	.long	826539625
+	.long	1022450955
+	.long	107562240
+	.long	1071898898
+	.long	339584600
+	.long	1022481255
+	.long	2123649024
+	.long	1071919116
+	.long	3912959833
+	.long	1024321009
+	.long	1562385664
+	.long	1071939478
+	.long	2846067230
+	.long	1023343981
+	.long	2963085824
+	.long	1071959988
+	.long	954548627
+	.long	1021475211
+	.long	3325550592
+	.long	1071980652
+	.long	3459651155
+	.long	1025305573
+	.long	775752448
+	.long	1072001476
+	.long	3582746667
+	.long	1023859460
+	.long	3238590720
+	.long	1072022464
+	.long	634636162
+	.long	1024472353
+	.long	2758801920
+	.long	1072043624
+	.long	3078216319
+	.long	1025304516
+	.long	1370319104
+	.long	1072064962
+	.long	2570569078
+	.long	1025099442
+	.long	2615805184
+	.long	1072086484
+	.long	3729933412
+	.long	1024605112
+	.long	3077336576
+	.long	1072108198
+	.long	1948916066
+	.long	1024781603
+	.long	1099528192
+	.long	1072130112
+	.long	3139143157
+	.long	1023729360
+	.long	1231903232
+	.long	1072152233
+	.long	1349513477
+	.long	1024737515
+	.long	1507504128
+	.long	1072174570
+	.long	3484516322
+	.long	1024000959
+	.long	2214659840
+	.long	1072197132
+	.long	2563820917
+	.long	1025225535
+	.long	1804739840
+	.long	1072219929
+	.long	760038746
+	.long	1024482855
+	.long	1413746688
+	.long	1072242971
+	.long	3401734714
+	.long	1025129838
+	.long	821409536
+	.long	1072266269
+	.long	3729772551
+	.long	1025484796
+	.long	3031825664
+	.long	1072289834
+	.long	122256749
+	.long	1024752594
+	.long	1710784256
+	.long	1072313680
+	.long	1518205483
+	.long	1024724809
+	.long	3025265152
+	.long	1072337819
+	.long	409951989
+	.long	1022835555
+	.long	287769088
+	.long	1072362267
+	.long	800355594
+	.long	1022484850
+	.long	198179840
+	.long	1072387038
+	.long	3502926213
+	.long	1024209373
+	.long	1909130496
+	.long	1072412149
+	.long	3064694319
+	.long	1025380823
+	.long	1941732096
+	.long	1072437619
+	.long	4112930390
+	.long	1024294679
+	.long	3492010496
+	.long	1072463467
+	.long	2684918107
+	.long	1023220233
+	.long	81959680
+	.long	1072489716
+	.long	220021366
+	.long	1020635131
+	.long	2297837056
+	.long	1072516387
+	.long	4027683826
+	.long	1021041185
+	.long	270404096
+	.long	1072543508
+	.long	2012766065
+	.long	1021780753
+	.long	3667376896
+	.long	1072571105
+	.long	2727981522
+	.long	1023009874
+	.long	330400256
+	.long	1072599212
+	.long	2940017003
+	.long	1025393439
+	.long	1119293952
+	.long	1072627861
+	.long	1608550416
+	.long	1022675612
+	.long	3536155904
+	.long	1072657091
+	.long	349665778
+	.long	1025156751
+	.long	3078046720
+	.long	1072686946
+	.long	2016159996
+	.long	1022193169
+	.long	455228416
+	.long	1072705361
+	.long	1908539328
+	.long	1026126332
+	.long	1871505664
+	.long	1072720988
+	.long	2784700894
+	.long	1025922277
+	.long	1630994432
+	.long	1072737010
+	.long	361107678
+	.long	1022887244
+	.long	2084558336
+	.long	1072753462
+	.type	Tbl_addr,@object
+	.size	Tbl_addr,3840
+	.space 768, 0x00 	# pad
+	.align 16
+SIGNMASK:
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.type	SIGNMASK,@object
+	.size	SIGNMASK,16
+	.align 16
+HALFMASK2:
+	.long	0
+	.long	2147483584
+	.long	0
+	.long	0
+	.type	HALFMASK2,@object
+	.size	HALFMASK2,16
+	.align 16
+PI_BY_2:
+	.long	856972295
+	.long	1016178214
+	.long	1413754136
+	.long	1073291771
+	.type	PI_BY_2,@object
+	.size	PI_BY_2,16
+	.align 16
+cv2:
+	.long	780903145
+	.long	1066854586
+	.long	858993459
+	.long	1068708659
+	.long	3340530119
+	.long	1067392113
+	.long	1431655765
+	.long	1069897045
+	.long	1321528399
+	.long	1066517740
+	.long	3067833783
+	.long	1067899757
+	.long	2021159460
+	.long	1065855096
+	.long	2576980378
+	.long	1066178969
+	.type	cv2,@object
+	.size	cv2,64
+	.align 16
+HALFMASK:
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.type	HALFMASK,@object
+	.size	HALFMASK,16
+	.align 4
+ONEMASK:
+	.long	0
+	.long	1072693248
+	.type	ONEMASK,@object
+	.size	ONEMASK,8
+	.align 4
+TMASK:
+	.long	0
+	.long	4294950912
+	.type	TMASK,@object
+	.size	TMASK,8
+	.align 4
+cv:
+	.long	1431655765
+	.long	1069897045
+	.long	858993459
+	.long	1068708659
+	.long	3067833783
+	.long	1067899757
+	.type	cv,@object
+	.size	cv,24
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_asin.1-.
+	.4byte ..___tag_value_asin.5-..___tag_value_asin.1
+	.2byte 0x0400
+	.4byte ..___tag_value_asin.3-..___tag_value_asin.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_asin.4-..___tag_value_asin.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_atan2.S b/libm/x86_64/e_atan2.S
new file mode 100644
index 0000000..f9baea9
--- /dev/null
+++ b/libm/x86_64/e_atan2.S
@@ -0,0 +1,1242 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//
+//1. The method is based on the relationship of atan2(Y,X) to atan(|Y/X|)
+//   as follows.
+//                   /  sign(Y) atan(|Y/X|)                if X > 0
+//       atan2(Y,X) =
+//                   \  sign(Y)*pi  - sign(Y)*atan(|Y/X|)  if X < 0
+//
+//   Thus, atan2(Y,X) is of the form  atan2(Y,X) = PI + sgn*atan(|Y/X|)
+//   where PI and sgn can be determined by the four possible combinations of
+//   of the pair (sign(X),sign(Y)). We concentrate on the numerical method
+//   for atan(|Y/X|).
+//
+//2. For |Y/X| < 2^(-64), atan(|Y/X|) ~=~ |Y/X|. Hence, atan2(Y,X) is  Y/X
+//   if X > 0, and sign(Y)*pi otherwise.
+//3. For |Y/X| >= 2^(65), atan(|Y/X|) ~=~ pi/2. Hence atan2(Y,X) is sign(Y)pi/2.
+//4. For 2^(-64) <= |Y/X| < 2^(-5), atan(|Y/X|) is approximated by a polynomial
+//   of the form  Z + Z*E*polynomial(E), where Z = |Y/X| and E = Z*Z.
+//5. For |Y/X| > 2^(5), atan(|Y/X|) = pi/2 + atan(-|X/Y|), and atan(-|X/Y|) is
+//   calculated using the polynomial in 4 above.
+//6. For 2^(-5) <= |Y/X| <= 2^(5), we employ a table lookup method. First,
+//   we obtain B = 2^k * 1.b1 b2 b3 b4 = 2^k * (1+k/16) that approximate
+//   |Y/X| to approximately 5 significant bits. Hence, atan(|Y/X|) is
+//
+//      atan(|Y/X|)  =  atan(B) + atan(Z), where  Z = (|Y|-B|X|)/(|X|+B|Y|).
+//                  ~=~   tau   + Z + Z*E*polynomial(E), where E = Z*Z.
+//
+//   B has the range from 2^(-6)*(1+14/16) to 2^5 = 2^(5)*(1+0/16), totally
+//   163 possible values. These values are calculated beforehand and stored
+//   in a table. The polynomial is the one used in 4.
+//
+// Special cases:
+//  atan2(+-0, +0) = +-0
+//  atan2(+-0, -0) = +-pi
+//  atan2(+-0, x) = +-0, for x > 0, and +-pi, for x < 0
+//  atan2(y, +-0) = +pi/2 for y > 0, and -pi/2 for y < 0
+//  atan2(+-y, +INF) = +-0, for finite y > 0
+//  atan2(+-y, -INF) = +-pi, for finite y > 0
+//  atan2(+-INF, x) = +-pi/2, for finite x
+//  atan2(+-INF, +INF) = +-pi/4
+//  atan2(+-INF, -INF) = +-3*pi/4
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  atan2
+ENTRY(atan2)
+# parameter 1: %xmm0
+# parameter 2: %xmm1
+..B1.1:
+..___tag_value_atan2.1:
+        subq      $24, %rsp
+..___tag_value_atan2.3:
+        movsd     %xmm0, (%rsp)
+        movsd     %xmm1, 8(%rsp)
+..B1.2:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        subl      $14448, %eax
+        cmpl      $3840, %eax
+        ja        .L_2TAG_PACKET_0.0.2
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        subl      $14448, %eax
+        cmpl      $3840, %eax
+        ja        .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        unpcklpd  %xmm1, %xmm0
+        xorpd     %xmm5, %xmm5
+        xorpd     %xmm3, %xmm3
+        movl      $2048, %eax
+        pinsrw    $3, %eax, %xmm5
+        paddw     %xmm1, %xmm5
+        psrlq     $29, %xmm5
+        rcpss     %xmm5, %xmm3
+        xorpd     %xmm4, %xmm4
+        movl      $14336, %ecx
+        pinsrw    $3, %ecx, %xmm4
+        psllq     $29, %xmm3
+        paddw     %xmm4, %xmm3
+        mulsd     %xmm0, %xmm3
+        xorpd     %xmm2, %xmm2
+        xorpd     %xmm6, %xmm6
+        xorpd     %xmm7, %xmm7
+        movl      $32768, %eax
+        pinsrw    $2, %eax, %xmm6
+        movl      $32767, %ecx
+        pinsrw    $3, %ecx, %xmm7
+        paddd     %xmm6, %xmm3
+        andpd     %xmm7, %xmm3
+        movq      %xmm3, %xmm5
+        pextrw    $3, %xmm3, %eax
+        movl      $16448, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        minsd     %xmm2, %xmm3
+        movmskpd  %xmm0, %edx
+        psllq     $1, %xmm0
+        psrlq     $1, %xmm0
+        cmpsd     $2, %xmm2, %xmm5
+        psllq     $1, %xmm1
+        psrlq     $1, %xmm1
+        movq      %xmm1, %xmm6
+        movq      %xmm1, %xmm7
+        movq      %xmm0, %xmm2
+        movl      $0, %ecx
+        pinsrw    $0, %ecx, %xmm6
+        subsd     %xmm6, %xmm7
+        movq      %xmm0, %xmm4
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm3, %xmm4
+        mulsd     %xmm3, %xmm7
+        andpd     %xmm5, %xmm0
+        subsd     %xmm6, %xmm0
+        andpd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm4
+        subsd     %xmm7, %xmm0
+        andl      $32752, %eax
+        subl      $16286, %eax
+        cmpl      $1121, %eax
+        ja        .L_2TAG_PACKET_3.0.2
+        divsd     %xmm4, %xmm0
+        pextrw    $3, %xmm3, %ecx
+        movsd     a2(%rip), %xmm2
+        movsd     b2(%rip), %xmm3
+        pextrw    $0, %xmm5, %eax
+        addl      %edx, %edx
+        lea       P_TBL(%rip), %r8
+        movapd    (%r8,%rdx,8), %xmm6
+        lea       SGN_TBL(%rip), %r8
+        movapd    (%r8,%rdx,8), %xmm1
+        subl      $16286, %ecx
+        notl      %eax
+        andl      $1, %eax
+        addl      %eax, %ecx
+        addl      %ecx, %ecx
+        lea       ATAN_TBL(%rip), %r8
+        movapd    (%r8,%rcx,8), %xmm5
+        xorpd     %xmm1, %xmm5
+        addpd     %xmm6, %xmm5
+        movq      %xmm5, %xmm6
+        unpckhpd  %xmm5, %xmm5
+        xorpd     %xmm0, %xmm1
+        movq      %xmm1, %xmm4
+        mulsd     %xmm0, %xmm0
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm3
+        addsd     %xmm6, %xmm1
+        subsd     %xmm1, %xmm6
+        addsd     %xmm4, %xmm6
+        addsd     8+a2(%rip), %xmm2
+        mulsd     %xmm0, %xmm3
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm2, %xmm0
+        addsd     8+b2(%rip), %xmm3
+        mulsd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm0
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_3.0.2:
+        addl      $942, %eax
+        cmpl      $942, %eax
+        ja        .L_2TAG_PACKET_4.0.2
+        xorpd     %xmm4, %xmm4
+        movl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm4
+        divsd     %xmm1, %xmm4
+        addl      %edx, %edx
+        lea       SGN_TBL(%rip), %r8
+        movapd    (%r8,%rdx,8), %xmm6
+        unpcklpd  %xmm3, %xmm3
+        xorpd     %xmm6, %xmm0
+        xorpd     %xmm6, %xmm2
+        xorpd     %xmm6, %xmm3
+        lea       P_TBL2(%rip), %r8
+        movapd    (%r8,%rdx,8), %xmm7
+        movsd     a2(%rip), %xmm1
+        movsd     b2(%rip), %xmm5
+        lea       SELECT_B(%rip), %r8
+        andpd     (%r8,%rdx,8), %xmm3
+        mulsd     %xmm4, %xmm2
+        mulsd     %xmm4, %xmm0
+        movq      %xmm2, %xmm6
+        mulsd     %xmm2, %xmm2
+        mulsd     %xmm2, %xmm1
+        addsd     %xmm2, %xmm5
+        mulsd     %xmm2, %xmm6
+        addsd     8+a2(%rip), %xmm1
+        mulsd     %xmm2, %xmm5
+        addsd     %xmm0, %xmm7
+        addpd     %xmm3, %xmm7
+        mulsd     %xmm6, %xmm1
+        addsd     8+b2(%rip), %xmm5
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm7, %xmm5
+        pshufd    $238, %xmm7, %xmm0
+        addsd     %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        movsd     8(%rsp), %xmm1
+        movsd     (%rsp), %xmm0
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      %eax, %ecx
+        jg        .L_2TAG_PACKET_5.0.2
+        pextrw    $3, %xmm1, %ecx
+        cmpl      $32767, %ecx
+        jg        .L_2TAG_PACKET_6.0.2
+        divsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        andpd     SGNMASK(%rip), %xmm0
+        movsd     pi_table(%rip), %xmm2
+        xorpd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_5.0.2:
+        andpd     SGNMASK(%rip), %xmm0
+        movsd     pi2_table(%rip), %xmm2
+        xorpd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+.L_2TAG_PACKET_1.0.2:
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_7.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_8.0.2
+        movsd     POW55(%rip), %xmm3
+        movl      $1024, %edx
+        movsd     INVEXPMASK(%rip), %xmm4
+        xorpd     %xmm6, %xmm6
+        movsd     EXPMASK(%rip), %xmm7
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_10.0.2:
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_11.0.2
+.L_2TAG_PACKET_12.0.2:
+        addl      %ecx, %edx
+        subl      %eax, %edx
+        cmpl      $2048, %edx
+        ja        .L_2TAG_PACKET_4.0.2
+        addl      $15344, %edx
+        pinsrw    $3, %edx, %xmm6
+        andpd     %xmm4, %xmm0
+        andpd     %xmm4, %xmm1
+        orpd      %xmm6, %xmm0
+        orpd      %xmm7, %xmm1
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_9.0.2:
+        subl      $880, %edx
+        mulsd     %xmm3, %xmm0
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_13.0.2
+        jmp       .L_2TAG_PACKET_10.0.2
+.L_2TAG_PACKET_11.0.2:
+        addl      $880, %edx
+        mulsd     %xmm3, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_14.0.2
+        jmp       .L_2TAG_PACKET_12.0.2
+.L_2TAG_PACKET_7.0.2:
+        movd      %xmm0, %edx
+        movq      %xmm0, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        andl      $1048575, %ecx
+        orl       %edx, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_15.0.2
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        cmpl      $32752, %eax
+        jae       .L_2TAG_PACKET_16.0.2
+        movapd    pi2_table(%rip), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_15.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_16.0.2:
+        movd      %xmm1, %eax
+        movq      %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        movl      $-2147483648, %edx
+        andl      %ecx, %edx
+        andl      $1048575, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_17.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_18.0.2
+        movapd    pi4_table(%rip), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_17.0.2:
+        movq      %xmm1, %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_18.0.2:
+        movapd    pi4_table(%rip), %xmm5
+        movapd    pi2_table(%rip), %xmm6
+        addpd     %xmm6, %xmm5
+        pshufd    $238, %xmm5, %xmm6
+        addpd     %xmm6, %xmm5
+        orpd      %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_8.0.2:
+        movd      %xmm1, %eax
+        movq      %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        movl      $-2147483648, %edx
+        andl      %ecx, %edx
+        andl      $1048575, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        jne       .L_2TAG_PACKET_17.0.2
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_19.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_19.0.2:
+        movapd    pi_table(%rip), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_13.0.2:
+        pextrw    $3, %xmm1, %edx
+        andl      $32768, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_20.0.2
+        movapd    pi_table(%rip), %xmm5
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        comisd    %xmm0, %xmm1
+        orpd      %xmm5, %xmm0
+        je        .L_2TAG_PACKET_21.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_20.0.2:
+        comisd    %xmm0, %xmm1
+        je        .L_2TAG_PACKET_21.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_14.0.2:
+        movapd    pi2_table(%rip), %xmm5
+        psrlq     $63, %xmm0
+        psllq     $63, %xmm0
+        pshufd    $238, %xmm5, %xmm4
+        addsd     %xmm4, %xmm5
+        orpd      %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_21.0.2:
+        movq      %xmm0, 16(%rsp)
+..B1.3:
+        movq      16(%rsp), %xmm0
+.L_2TAG_PACKET_22.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_atan2.4:
+        ret       
+..___tag_value_atan2.5:
+END(atan2)
+# -- End  atan2
+	.section .rodata, "a"
+	.align 16
+	.align 16
+a2:
+	.long	2006262985
+	.long	1069310863
+	.long	2358449471
+	.long	3217342131
+	.type	a2,@object
+	.size	a2,16
+	.align 16
+b2:
+	.long	3845454352
+	.long	1069952297
+	.long	2829679149
+	.long	1073771565
+	.type	b2,@object
+	.size	b2,16
+	.align 16
+P_TBL:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	3221823995
+	.long	856972295
+	.long	3164710438
+	.type	P_TBL,@object
+	.size	P_TBL,64
+	.align 16
+SGN_TBL:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.type	SGN_TBL,@object
+	.size	SGN_TBL,64
+	.align 16
+ATAN_TBL:
+	.long	3390881280
+	.long	1067318733
+	.long	1411116779
+	.long	1018950063
+	.long	2985987840
+	.long	1067384211
+	.long	2088903695
+	.long	1018086027
+	.long	3148445184
+	.long	1067449685
+	.long	2044163806
+	.long	1017271335
+	.long	3667629184
+	.long	1067515494
+	.long	2353092775
+	.long	1019967309
+	.long	1546568832
+	.long	1067580954
+	.long	611991315
+	.long	1017602584
+	.long	3815996800
+	.long	1067646404
+	.long	466038598
+	.long	1019686426
+	.long	4050241920
+	.long	1067711845
+	.long	3265026328
+	.long	1019626952
+	.long	120454912
+	.long	1067777277
+	.long	1542207696
+	.long	1020155608
+	.long	2784639744
+	.long	1067842697
+	.long	3883834623
+	.long	1018602870
+	.long	1328010624
+	.long	1067908107
+	.long	1791097456
+	.long	1019053126
+	.long	2217794048
+	.long	1067973505
+	.long	551619938
+	.long	1018494194
+	.long	3333520000
+	.long	1068038891
+	.long	2390331823
+	.long	1019033022
+	.long	2557052032
+	.long	1068104265
+	.long	2423976108
+	.long	1019728674
+	.long	2067649536
+	.long	1068169626
+	.long	3757397745
+	.long	1018672362
+	.long	4047094784
+	.long	1068234973
+	.long	481613184
+	.long	1019275104
+	.long	2089853184
+	.long	1068300307
+	.long	1733914374
+	.long	1020124677
+	.long	2678003840
+	.long	1068365626
+	.long	1373600282
+	.long	1013935474
+	.long	3706496128
+	.long	1068430930
+	.long	1000610902
+	.long	1019673285
+	.long	3073179008
+	.long	1068496219
+	.long	1497143008
+	.long	1019900342
+	.long	2803716736
+	.long	1068562846
+	.long	1476677416
+	.long	1019444094
+	.long	3204984128
+	.long	1068628077
+	.long	1192335905
+	.long	1018748628
+	.long	831146624
+	.long	1068693273
+	.long	2733586224
+	.long	1018823295
+	.long	243029376
+	.long	1068758431
+	.long	950106081
+	.long	1019046675
+	.long	1735561920
+	.long	1068823549
+	.long	3546440856
+	.long	1020104712
+	.long	1339217792
+	.long	1068888626
+	.long	3028812387
+	.long	1019818321
+	.long	3706342144
+	.long	1068953659
+	.long	3814564029
+	.long	1017763871
+	.long	637726976
+	.long	1069018648
+	.long	3584007699
+	.long	1017976868
+	.long	1148779264
+	.long	1069083589
+	.long	2282532133
+	.long	1019483954
+	.long	1406131392
+	.long	1069148481
+	.long	1547359113
+	.long	1019786342
+	.long	1908875904
+	.long	1069213322
+	.long	1315508410
+	.long	1020009473
+	.long	3194947520
+	.long	1069278110
+	.long	3845393201
+	.long	1015803761
+	.long	1547487744
+	.long	1069342844
+	.long	3863107865
+	.long	1019810104
+	.long	1881061952
+	.long	1069407521
+	.long	4288343548
+	.long	1019687581
+	.long	563086336
+	.long	1069472140
+	.long	2582230241
+	.long	1020099350
+	.long	2594975552
+	.long	1069536698
+	.long	2306443764
+	.long	1019667244
+	.long	3438545024
+	.long	1069606573
+	.long	957455549
+	.long	1015587735
+	.long	4211357472
+	.long	1069670906
+	.long	2611778754
+	.long	1017877214
+	.long	3002835424
+	.long	1069735101
+	.long	235580458
+	.long	1020211685
+	.long	3905315424
+	.long	1069799150
+	.long	3630647617
+	.long	1018736849
+	.long	2849656576
+	.long	1069863047
+	.long	2412165062
+	.long	1019693004
+	.long	507429472
+	.long	1069926785
+	.long	1397750723
+	.long	1018412717
+	.long	2307470272
+	.long	1069990356
+	.long	1796470904
+	.long	1019796181
+	.long	1271814912
+	.long	1070053755
+	.long	189761565
+	.long	1016149115
+	.long	3800538144
+	.long	1070116974
+	.long	2524871582
+	.long	1018263353
+	.long	3916203552
+	.long	1070180008
+	.long	127848658
+	.long	1017672664
+	.long	457192032
+	.long	1070242851
+	.long	4020400938
+	.long	1019823010
+	.long	1385324704
+	.long	1070305495
+	.long	564511179
+	.long	1016079094
+	.long	2322869856
+	.long	1070367935
+	.long	2347103319
+	.long	1018927760
+	.long	3743438624
+	.long	1070430165
+	.long	877973862
+	.long	1019638162
+	.long	2392255552
+	.long	1070492180
+	.long	2432782267
+	.long	1018872629
+	.long	4180443328
+	.long	1070553973
+	.long	3102990015
+	.long	1020093101
+	.long	2547540832
+	.long	1070636485
+	.long	3877738253
+	.long	1017300424
+	.long	2735468912
+	.long	1070697461
+	.long	2446470256
+	.long	1019235378
+	.long	542633792
+	.long	1070757943
+	.long	583606328
+	.long	1018624131
+	.long	923265984
+	.long	1070817911
+	.long	1793926708
+	.long	1019714161
+	.long	918728448
+	.long	1070877348
+	.long	3726463586
+	.long	1019433296
+	.long	2572275008
+	.long	1070936237
+	.long	1845354238
+	.long	1019459238
+	.long	50974688
+	.long	1070994564
+	.long	983808064
+	.long	1016685418
+	.long	1105518320
+	.long	1071052313
+	.long	2357496692
+	.long	1015139882
+	.long	1264825328
+	.long	1071109472
+	.long	2244129354
+	.long	1019046344
+	.long	961157920
+	.long	1071166029
+	.long	3124185339
+	.long	1018541776
+	.long	1162701584
+	.long	1071221973
+	.long	1279780948
+	.long	1019268918
+	.long	3284935664
+	.long	1071277294
+	.long	2670033472
+	.long	1019833744
+	.long	497441888
+	.long	1071331985
+	.long	1032737410
+	.long	1019795212
+	.long	3377383904
+	.long	1071386036
+	.long	2356897182
+	.long	1020205553
+	.long	1126962000
+	.long	1071439443
+	.long	3723724586
+	.long	1015212418
+	.long	90291008
+	.long	1071492199
+	.long	4178672431
+	.long	1020186971
+	.long	190059536
+	.long	1071595741
+	.long	1763589807
+	.long	1019162163
+	.long	2497392840
+	.long	1071670654
+	.long	3036997041
+	.long	1020204325
+	.long	2616971944
+	.long	1071719773
+	.long	300151069
+	.long	1017041957
+	.long	2883518128
+	.long	1071767563
+	.long	2203981414
+	.long	1019190108
+	.long	1496354352
+	.long	1071814030
+	.long	332287966
+	.long	1016846435
+	.long	483276728
+	.long	1071859184
+	.long	653845024
+	.long	1018830914
+	.long	3097401072
+	.long	1071903039
+	.long	1514746408
+	.long	1019278972
+	.long	2737217248
+	.long	1071945615
+	.long	1358845067
+	.long	1017268275
+	.long	2072577560
+	.long	1071986933
+	.long	3041024735
+	.long	1019929672
+	.long	2266405656
+	.long	1072027017
+	.long	1271261130
+	.long	1012925070
+	.long	958652544
+	.long	1072065894
+	.long	2158017058
+	.long	1019955372
+	.long	3312993840
+	.long	1072103591
+	.long	765809169
+	.long	1019114443
+	.long	3177001304
+	.long	1072140139
+	.long	144180084
+	.long	1019822186
+	.long	3071642184
+	.long	1072175568
+	.long	4004602424
+	.long	1019420740
+	.long	4283953648
+	.long	1072209909
+	.long	1511950430
+	.long	1020176966
+	.long	1413754136
+	.long	1072243195
+	.long	856972295
+	.long	1015129638
+	.long	4073202944
+	.long	1072306725
+	.long	4068194804
+	.long	1019714860
+	.long	946117760
+	.long	1072366415
+	.long	694980733
+	.long	1020150135
+	.long	3980632032
+	.long	1072422512
+	.long	1313251280
+	.long	1019948709
+	.long	1468297112
+	.long	1072475260
+	.long	330111143
+	.long	1019809198
+	.long	3478063816
+	.long	1072524887
+	.long	2930067044
+	.long	1017784081
+	.long	1153979856
+	.long	1072571613
+	.long	2225786102
+	.long	1017634481
+	.long	2089828808
+	.long	1072615641
+	.long	474621367
+	.long	1017043414
+	.long	3531732632
+	.long	1072657163
+	.long	2276396220
+	.long	1018757240
+	.long	775214612
+	.long	1072694803
+	.long	3209744818
+	.long	1019963015
+	.long	662307284
+	.long	1072713319
+	.long	1381696763
+	.long	1019763781
+	.long	1192776652
+	.long	1072730830
+	.long	3017932994
+	.long	1015179769
+	.long	744202396
+	.long	1072747407
+	.long	2073854034
+	.long	1019512292
+	.long	8337908
+	.long	1072763115
+	.long	16004448
+	.long	1019599514
+	.long	3589868768
+	.long	1072778013
+	.long	1374369804
+	.long	1018019237
+	.long	121647320
+	.long	1072792159
+	.long	128481634
+	.long	1018115438
+	.long	2464923204
+	.long	1072805601
+	.long	1787331214
+	.long	1016798022
+	.long	4093304372
+	.long	1072830562
+	.long	3306868969
+	.long	1019384078
+	.long	1436891684
+	.long	1072853231
+	.long	676347266
+	.long	1017302183
+	.long	1104571840
+	.long	1072873890
+	.long	2870400285
+	.long	1019938149
+	.long	2037009832
+	.long	1072892781
+	.long	2956702105
+	.long	1016472908
+	.long	3139037960
+	.long	1072910111
+	.long	916057147
+	.long	1018364335
+	.long	1826698064
+	.long	1072926058
+	.long	2171961098
+	.long	1019669816
+	.long	1353941060
+	.long	1072940774
+	.long	1722928782
+	.long	1019926215
+	.long	1803191644
+	.long	1072954391
+	.long	1547878639
+	.long	1020259262
+	.long	1092591296
+	.long	1072967024
+	.long	3070107923
+	.long	1018320401
+	.long	2205372832
+	.long	1072978772
+	.long	787328196
+	.long	1014621351
+	.long	1291577100
+	.long	1072989723
+	.long	2964757301
+	.long	1020242528
+	.long	4234512804
+	.long	1072999952
+	.long	3136030038
+	.long	1017522144
+	.long	3248069132
+	.long	1073009528
+	.long	1506192355
+	.long	1018050472
+	.long	3932628500
+	.long	1073018509
+	.long	1045823554
+	.long	1019946655
+	.long	4195697848
+	.long	1073026948
+	.long	233443322
+	.long	1018917447
+	.long	2501811452
+	.long	1073034892
+	.long	901427976
+	.long	1017333852
+	.long	866379428
+	.long	1073049455
+	.long	2437443742
+	.long	1019678792
+	.long	1376865888
+	.long	1073062480
+	.long	3365790232
+	.long	1014547152
+	.long	3290094268
+	.long	1073074195
+	.long	3898947415
+	.long	1018683566
+	.long	354764884
+	.long	1073084787
+	.long	3854322404
+	.long	1019662058
+	.long	3332975496
+	.long	1073094406
+	.long	3171701655
+	.long	1017830922
+	.long	1141460088
+	.long	1073103181
+	.long	3946082701
+	.long	1020032019
+	.long	745761284
+	.long	1073111216
+	.long	1347210591
+	.long	1019106121
+	.long	1673304508
+	.long	1073118600
+	.long	1760606642
+	.long	1017324577
+	.long	983388240
+	.long	1073125409
+	.long	3740651204
+	.long	1019514104
+	.long	3895509100
+	.long	1073131706
+	.long	2409629983
+	.long	1020069322
+	.long	2128523668
+	.long	1073137548
+	.long	3045605368
+	.long	1018579174
+	.long	2075485692
+	.long	1073142981
+	.long	3720571789
+	.long	1017557436
+	.long	121855976
+	.long	1073148047
+	.long	2391744767
+	.long	1020160645
+	.long	4181733780
+	.long	1073152780
+	.long	995028816
+	.long	1019681295
+	.long	2887813280
+	.long	1073157214
+	.long	218733247
+	.long	1020003509
+	.long	2862180896
+	.long	1073161375
+	.long	2043806490
+	.long	1018602288
+	.long	3909375184
+	.long	1073168973
+	.long	1559903412
+	.long	1020103444
+	.long	3533966292
+	.long	1073175738
+	.long	734884149
+	.long	1018462962
+	.long	3815044608
+	.long	1073181799
+	.long	3630523428
+	.long	1017250093
+	.long	739639376
+	.long	1073187261
+	.long	4167476661
+	.long	1020008277
+	.long	1068309648
+	.long	1073192207
+	.long	2110061437
+	.long	1019295858
+	.long	2350566352
+	.long	1073196707
+	.long	582596516
+	.long	1018568821
+	.long	2529520024
+	.long	1073200819
+	.long	745552787
+	.long	1019053165
+	.long	1841667508
+	.long	1073204591
+	.long	3982568700
+	.long	1016503327
+	.long	2242261080
+	.long	1073208063
+	.long	3433582258
+	.long	1016196763
+	.long	715134328
+	.long	1073211270
+	.long	355901358
+	.long	1020087916
+	.long	2700735876
+	.long	1073214240
+	.long	3640957736
+	.long	1019780205
+	.long	141607580
+	.long	1073217000
+	.long	2488245051
+	.long	1020262395
+	.long	287934404
+	.long	1073219570
+	.long	2392691085
+	.long	1019883292
+	.long	2363373988
+	.long	1073221969
+	.long	4194561737
+	.long	1019237447
+	.long	3829340424
+	.long	1073224214
+	.long	429455526
+	.long	1019490975
+	.long	1988805928
+	.long	1073226320
+	.long	3029848706
+	.long	1018104889
+	.long	1647572320
+	.long	1073230161
+	.long	10289938
+	.long	1017394880
+	.long	3988000624
+	.long	1073233576
+	.long	1957559169
+	.long	1019434816
+	.long	4263843944
+	.long	1073236633
+	.long	204710264
+	.long	1019908761
+	.long	663197724
+	.long	1073239386
+	.long	1921757578
+	.long	1019778948
+	.long	3560800700
+	.long	1073241876
+	.long	3994348896
+	.long	1019230192
+	.long	2441785656
+	.long	1073244141
+	.long	871468611
+	.long	1014800505
+	.long	3277400272
+	.long	1073246209
+	.long	4092218139
+	.long	1020040842
+	.long	3951990120
+	.long	1073248105
+	.long	4276546478
+	.long	1019763677
+	.long	2737338540
+	.long	1073249850
+	.long	252776012
+	.long	1018794951
+	.long	1511361316
+	.long	1073251461
+	.long	3119653999
+	.long	1018514803
+	.long	3969162516
+	.long	1073252952
+	.long	1037069016
+	.long	1016792900
+	.long	413985240
+	.long	1073254338
+	.long	4110171432
+	.long	1020001345
+	.long	3681283576
+	.long	1073255627
+	.long	1463092818
+	.long	1020260354
+	.long	3146455488
+	.long	1073256831
+	.long	1031209123
+	.long	1016554799
+	.long	95214512
+	.long	1073257958
+	.long	1373808632
+	.long	1019493031
+	.long	4250240828
+	.long	1073259013
+	.long	3891047882
+	.long	1020108730
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.type	ATAN_TBL,@object
+	.size	ATAN_TBL,2624
+	.align 16
+P_TBL2:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	856972295
+	.long	1017226790
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	3164710438
+	.long	1413754136
+	.long	3221823995
+	.type	P_TBL2,@object
+	.size	P_TBL2,64
+	.align 16
+SELECT_B:
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.long	4294967295
+	.long	4294967295
+	.long	0
+	.long	0
+	.type	SELECT_B,@object
+	.size	SELECT_B,64
+	.align 16
+SGNMASK:
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.type	SGNMASK,@object
+	.size	SGNMASK,16
+	.align 16
+pi_table:
+	.long	1413754136
+	.long	1074340347
+	.long	856972295
+	.long	1017226790
+	.type	pi_table,@object
+	.size	pi_table,16
+	.align 16
+pi2_table:
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.type	pi2_table,@object
+	.size	pi2_table,16
+	.align 16
+pi4_table:
+	.long	1413754136
+	.long	1072243195
+	.long	856972295
+	.long	1015129638
+	.type	pi4_table,@object
+	.size	pi4_table,16
+	.align 4
+POW55:
+	.long	0
+	.long	1130364928
+	.type	POW55,@object
+	.size	POW55,8
+	.align 4
+INVEXPMASK:
+	.long	4294967295
+	.long	2148532223
+	.type	INVEXPMASK,@object
+	.size	INVEXPMASK,8
+	.align 4
+EXPMASK:
+	.long	0
+	.long	1072693248
+	.type	EXPMASK,@object
+	.size	EXPMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_atan2.1-.
+	.4byte ..___tag_value_atan2.5-..___tag_value_atan2.1
+	.2byte 0x0400
+	.4byte ..___tag_value_atan2.3-..___tag_value_atan2.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_atan2.4-..___tag_value_atan2.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_cosh.S b/libm/x86_64/e_cosh.S
new file mode 100644
index 0000000..8cdbca6
--- /dev/null
+++ b/libm/x86_64/e_cosh.S
@@ -0,0 +1,1372 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  cosh(x)=(exp(x)+exp(-x))/2
+//
+//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//          L2EH+L2EL (upper 26, lower 53 bits)
+//
+//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
+//                              f=0.b1 b2 ... b7, k integer
+//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
+//  Tp stores higher 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
+//
+//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
+//                       for |x| in [1/8,3*2^8)
+//  e^{-|x|}=2^{-k-f}*2^{-r}
+//
+//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
+//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
+//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)
+//
+//  For |x| in [1/8, 3*2^7), cosh(x) is formed as
+//   RN(2^k*Tp+2^{-k}*Tn)+2^k*Tp*P15+2^{-k}*Tn*P`15+2^{-k}*TnL+2^{-k}*Dn+2^k*Dp
+//
+//  For |x| in [3*2^7, 3*2^8), (e^|x|)/2 is returned, and
+//  the result is checked for overflow.
+//
+//  For |x|<1/8, a Taylor polynomial expansion is used (degree 10)
+//  (error bound for polynomial expansion is below 0.501 ulp)
+//
+// Special cases:
+//  cosh(NaN) = quiet NaN, and raise invalid exception
+//  cosh(INF) = that INF
+//  cosh(0)=1
+//  for finite argument, only cosh(0)=1 is exact
+//  For IEEE double
+//  cosh(x) overflows
+//  for x > 710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+
+# -- Begin  cosh
+ENTRY(cosh)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_cosh.1:
+        pushq     %rsi
+..___tag_value_cosh.3:
+..B1.2:
+        movsd     HALFMASK(%rip), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     L2E(%rip), %xmm1
+        movsd     8+L2E(%rip), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     Shifter(%rip), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        andl      $32767, %ecx
+        subl      $16320, %ecx
+        cmpl      $200, %ecx
+        jae       .L_2TAG_PACKET_0.0.2
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        movq      %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        xorpd     %xmm5, %xmm5
+        subsd     %xmm6, %xmm3
+        movapd    cv(%rip), %xmm4
+        addsd     %xmm1, %xmm2
+        movapd    16+cv(%rip), %xmm6
+        subsd     %xmm3, %xmm7
+        movl      $32704, %edx
+        pinsrw    $3, %edx, %xmm5
+        movapd    32+cv(%rip), %xmm1
+        addsd     %xmm7, %xmm2
+        movl      $127, %edx
+        andl      %eax, %edx
+        addl      %edx, %edx
+        shrl      $3, %eax
+        andl      $65520, %eax
+        addl      $16352, %eax
+        xorpd     %xmm0, %xmm0
+        cmpl      $184, %ecx
+        jae       .L_2TAG_PACKET_1.0.2
+        pshufd    $68, %xmm5, %xmm5
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        psubw     %xmm0, %xmm5
+        lea       T2f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm0
+        lea       T2_neg_f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm5
+        pshufd    $68, %xmm2, %xmm3
+        movapd    48+cv(%rip), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        mulpd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulpd     64+cv(%rip), %xmm2
+        mulpd     %xmm3, %xmm1
+        mulpd     %xmm3, %xmm7
+        mulpd     %xmm3, %xmm4
+        mulpd     %xmm3, %xmm1
+        addpd     %xmm7, %xmm6
+        movq      %xmm0, %xmm7
+        addpd     %xmm1, %xmm4
+        shufpd    $0, %xmm5, %xmm7
+        addpd     %xmm5, %xmm0
+        mulpd     %xmm7, %xmm2
+        addpd     %xmm6, %xmm4
+        subsd     %xmm0, %xmm7
+        mulpd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm5, %xmm7
+        addpd     %xmm2, %xmm4
+        addsd     %xmm6, %xmm7
+        pshufd    $238, %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        addl      $16320, %ecx
+        cmpl      $16320, %ecx
+        ja        .L_2TAG_PACKET_2.0.2
+        cmpl      $15952, %ecx
+        jae       .L_2TAG_PACKET_3.0.2
+        addsd     %xmm2, %xmm6
+        movq      ONEMASK(%rip), %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_1.0.2:
+        subl      $16352, %eax
+        movl      %eax, %ecx
+        andl      $32752, %eax
+        shrl      $1, %eax
+        andl      $65520, %eax
+        subl      %eax, %ecx
+        addl      $16352, %eax
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        lea       T2f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm0
+        pshufd    $68, %xmm2, %xmm3
+        movsd     48+cv(%rip), %xmm7
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     64+cv(%rip), %xmm2
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm3, %xmm4
+        addl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm5
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm6, %xmm4
+        mulsd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm6, %xmm4
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm5, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_4.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_3.0.2:
+        movapd    pv(%rip), %xmm1
+        mulpd     %xmm5, %xmm5
+        movapd    16+pv(%rip), %xmm2
+        xorpd     %xmm3, %xmm3
+        movq      %xmm5, %xmm0
+        mulpd     %xmm5, %xmm1
+        movsd     ONEMASK(%rip), %xmm6
+        mulpd     %xmm5, %xmm5
+        movl      $16352, %eax
+        pinsrw    $3, %eax, %xmm3
+        addpd     %xmm2, %xmm1
+        mulpd     %xmm5, %xmm1
+        pshufd    $238, %xmm1, %xmm2
+        mulsd     %xmm1, %xmm5
+        mulsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm2
+        addsd     %xmm2, %xmm0
+        addsd     %xmm6, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        mulsd     %xmm0, %xmm0
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        mulsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        movq      %xmm0, (%rsp)
+..B1.3:
+        movq      (%rsp), %xmm0
+.L_2TAG_PACKET_6.0.2:
+..B1.5:
+        popq      %rcx
+..___tag_value_cosh.4:
+        ret       
+..___tag_value_cosh.5:
+END(cosh)
+# -- End  cosh
+	.section .rodata, "a"
+	.align 16
+	.align 16
+L2E:
+	.long	1610612736
+	.long	1080497479
+	.long	4166901572
+	.long	1053077003
+	.type	L2E,@object
+	.size	L2E,16
+	.align 16
+Shifter:
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.type	Shifter,@object
+	.size	Shifter,16
+	.align 16
+cv:
+	.long	3607404736
+	.long	1044146952
+	.long	3607404736
+	.long	3191630600
+	.long	4277811695
+	.long	1063661122
+	.long	4277811695
+	.long	3211144770
+	.long	2140175755
+	.long	1033864261
+	.long	2140175755
+	.long	1033864261
+	.long	4289495988
+	.long	1054113747
+	.long	4289495988
+	.long	1054113747
+	.long	4277811695
+	.long	1064709698
+	.long	4277811695
+	.long	3212193346
+	.type	cv,@object
+	.size	cv,80
+	.align 16
+T2f:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	3706687593
+	.long	1073526560
+	.long	3521726940
+	.long	1014301643
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.type	T2f,@object
+	.size	T2f,2048
+	.align 16
+T2_neg_f:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.type	T2_neg_f,@object
+	.size	T2_neg_f,2048
+	.align 16
+pv:
+	.long	3078135644
+	.long	1049787983
+	.long	381774870
+	.long	1062650220
+	.long	436314137
+	.long	1056571808
+	.long	1431655765
+	.long	1067799893
+	.type	pv,@object
+	.size	pv,32
+	.align 4
+HALFMASK:
+	.long	4160749568
+	.long	2147483647
+	.type	HALFMASK,@object
+	.size	HALFMASK,8
+	.align 4
+ONEMASK:
+	.long	0
+	.long	1072693248
+	.type	ONEMASK,@object
+	.size	ONEMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_cosh.1-.
+	.4byte ..___tag_value_cosh.5-..___tag_value_cosh.1
+	.2byte 0x0400
+	.4byte ..___tag_value_cosh.3-..___tag_value_cosh.1
+	.2byte 0x100e
+	.byte 0x04
+	.4byte ..___tag_value_cosh.4-..___tag_value_cosh.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_exp.S b/libm/x86_64/e_exp.S
new file mode 100644
index 0000000..6882dfc
--- /dev/null
+++ b/libm/x86_64/e_exp.S
@@ -0,0 +1,636 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Description:
+//  Let K = 64 (table size).
+//        x    x/log(2)     n
+//       e  = 2          = 2 * T[j] * (1 + P(y))
+//  where
+//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
+//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
+//                  j/K
+//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
+//
+//       P(y) is a minimax polynomial approximation of exp(x)-1
+//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
+//
+//  To avoid problems with arithmetic overflow and underflow,
+//            n                        n1  n2
+//  value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
+//  where BIAS is a value of exponent bias.
+//
+// Special cases:
+//  exp(NaN) = NaN
+//  exp(+INF) = +INF
+//  exp(-INF) = 0
+//  exp(x) = 1 for subnormals
+//  for finite argument, only exp(0)=1 is exact
+//  For IEEE double
+//    if x >  709.782712893383973096 then exp(x) overflow
+//    if x < -745.133219101941108420 then exp(x) underflow
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  exp
+ENTRY(exp)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_exp.1:
+        subq      $24, %rsp
+..___tag_value_exp.3:
+        movsd     %xmm0, 8(%rsp)
+..B1.2:
+        unpcklpd  %xmm0, %xmm0
+        movapd    cv(%rip), %xmm1
+        movapd    Shifter(%rip), %xmm6
+        movapd    16+cv(%rip), %xmm2
+        movapd    32+cv(%rip), %xmm3
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        movl      $16527, %edx
+        subl      %eax, %edx
+        subl      $15504, %eax
+        orl       %eax, %edx
+        cmpl      $-2147483648, %edx
+        jae       .L_2TAG_PACKET_0.0.2
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm6, %xmm1
+        movapd    %xmm1, %xmm7
+        subpd     %xmm6, %xmm1
+        mulpd     %xmm1, %xmm2
+        movapd    64+cv(%rip), %xmm4
+        mulpd     %xmm1, %xmm3
+        movapd    80+cv(%rip), %xmm5
+        subpd     %xmm2, %xmm0
+        movd      %xmm7, %eax
+        movl      %eax, %ecx
+        andl      $63, %ecx
+        shll      $4, %ecx
+        sarl      $6, %eax
+        movl      %eax, %edx
+        movdqa    mmask(%rip), %xmm6
+        pand      %xmm6, %xmm7
+        movdqa    bias(%rip), %xmm6
+        paddq     %xmm6, %xmm7
+        psllq     $46, %xmm7
+        subpd     %xmm3, %xmm0
+        lea       Tbl_addr(%rip), %r8
+        movapd    (%rcx,%r8), %xmm2
+        mulpd     %xmm0, %xmm4
+        movapd    %xmm0, %xmm6
+        movapd    %xmm0, %xmm1
+        mulpd     %xmm6, %xmm6
+        mulpd     %xmm6, %xmm0
+        addpd     %xmm4, %xmm5
+        mulsd     %xmm6, %xmm0
+        mulpd     48+cv(%rip), %xmm6
+        addsd     %xmm2, %xmm1
+        unpckhpd  %xmm2, %xmm2
+        mulpd     %xmm5, %xmm0
+        addsd     %xmm0, %xmm1
+        orpd      %xmm7, %xmm2
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        addsd     %xmm6, %xmm0
+        addl      $894, %edx
+        cmpl      $1916, %edx
+        ja        .L_2TAG_PACKET_1.0.2
+        mulsd     %xmm2, %xmm0
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_1.0.2:
+        xorpd     %xmm3, %xmm3
+        movapd    ALLONES(%rip), %xmm4
+        movl      $-1022, %edx
+        subl      %eax, %edx
+        movd      %edx, %xmm5
+        psllq     %xmm5, %xmm4
+        movl      %eax, %ecx
+        sarl      $1, %eax
+        pinsrw    $3, %eax, %xmm3
+        movapd    ebias(%rip), %xmm6
+        psllq     $4, %xmm3
+        psubd     %xmm3, %xmm2
+        mulsd     %xmm2, %xmm0
+        cmpl      $52, %edx
+        jg        .L_2TAG_PACKET_2.0.2
+        andpd     %xmm2, %xmm4
+        paddd     %xmm6, %xmm3
+        subsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        cmpl      $1023, %ecx
+        jge       .L_2TAG_PACKET_3.0.2
+        pextrw    $3, %xmm0, %ecx
+        andl      $32768, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_4.0.2
+        movapd    %xmm0, %xmm6
+        addsd     %xmm4, %xmm0
+        mulsd     %xmm3, %xmm0
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_5.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_5.0.2:
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm3, %xmm4
+        movq      %xmm6, %xmm0
+        pxor      %xmm4, %xmm6
+        psrad     $31, %xmm6
+        pshufd    $85, %xmm6, %xmm6
+        psllq     $1, %xmm0
+        psrlq     $1, %xmm0
+        pxor      %xmm6, %xmm0
+        psrlq     $63, %xmm6
+        paddq     %xmm6, %xmm0
+        paddq     %xmm4, %xmm0
+        movl      $15, (%rsp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_4.0.2:
+        addsd     %xmm4, %xmm0
+        mulsd     %xmm3, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_3.0.2:
+        addsd     %xmm4, %xmm0
+        mulsd     %xmm3, %xmm0
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        jnb       .L_2TAG_PACKET_7.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        paddd     %xmm6, %xmm3
+        addpd     %xmm2, %xmm0
+        mulsd     %xmm3, %xmm0
+        movl      $15, (%rsp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_8.0.2:
+        cmpl      $2146435072, %eax
+        jae       .L_2TAG_PACKET_9.0.2
+        movl      12(%rsp), %eax
+        cmpl      $-2147483648, %eax
+        jae       .L_2TAG_PACKET_10.0.2
+        movsd     XMAX(%rip), %xmm0
+        mulsd     %xmm0, %xmm0
+.L_2TAG_PACKET_7.0.2:
+        movl      $14, (%rsp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_10.0.2:
+        movsd     XMIN(%rip), %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $15, (%rsp)
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_9.0.2:
+        movl      8(%rsp), %edx
+        cmpl      $2146435072, %eax
+        ja        .L_2TAG_PACKET_11.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_11.0.2
+        movl      12(%rsp), %eax
+        cmpl      $2146435072, %eax
+        jne       .L_2TAG_PACKET_12.0.2
+        movsd     INF(%rip), %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_12.0.2:
+        movsd     ZERO(%rip), %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_11.0.2:
+        movsd     8(%rsp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        movl      12(%rsp), %eax
+        andl      $2147483647, %eax
+        cmpl      $1083179008, %eax
+        jae       .L_2TAG_PACKET_8.0.2
+        movsd     8(%rsp), %xmm0
+        addsd     ONE_val(%rip), %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        movq      %xmm0, 16(%rsp)
+..B1.3:
+        movq      16(%rsp), %xmm0
+.L_2TAG_PACKET_13.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_exp.4:
+        ret       
+..___tag_value_exp.5:
+END(exp)
+# -- End  exp
+	.section .rodata, "a"
+	.align 16
+	.align 16
+cv:
+	.long	1697350398
+	.long	1079448903
+	.long	1697350398
+	.long	1079448903
+	.long	4277796864
+	.long	1065758274
+	.long	4277796864
+	.long	1065758274
+	.long	3164486458
+	.long	1025308570
+	.long	3164486458
+	.long	1025308570
+	.long	4294967294
+	.long	1071644671
+	.long	4294967294
+	.long	1071644671
+	.long	3811088480
+	.long	1062650204
+	.long	1432067621
+	.long	1067799893
+	.long	3230715663
+	.long	1065423125
+	.long	1431604129
+	.long	1069897045
+	.type	cv,@object
+	.size	cv,96
+	.align 16
+Shifter:
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	1127743488
+	.type	Shifter,@object
+	.size	Shifter,16
+	.align 16
+mmask:
+	.long	4294967232
+	.long	0
+	.long	4294967232
+	.long	0
+	.type	mmask,@object
+	.size	mmask,16
+	.align 16
+bias:
+	.long	65472
+	.long	0
+	.long	65472
+	.long	0
+	.type	bias,@object
+	.size	bias,16
+	.align 16
+Tbl_addr:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	235107661
+	.long	1018002367
+	.long	1048019040
+	.long	11418
+	.long	896005651
+	.long	1015861842
+	.long	3541402996
+	.long	22960
+	.long	1642514529
+	.long	1012987726
+	.long	410360776
+	.long	34629
+	.long	1568897900
+	.long	1016568486
+	.long	1828292879
+	.long	46424
+	.long	1882168529
+	.long	1010744893
+	.long	852742562
+	.long	58348
+	.long	509852888
+	.long	1017336174
+	.long	3490863952
+	.long	70401
+	.long	653277307
+	.long	1017431380
+	.long	2930322911
+	.long	82586
+	.long	1649557430
+	.long	1017729363
+	.long	1014845818
+	.long	94904
+	.long	1058231231
+	.long	1015777676
+	.long	3949972341
+	.long	107355
+	.long	1044000607
+	.long	1016786167
+	.long	828946858
+	.long	119943
+	.long	1151779725
+	.long	1015705409
+	.long	2288159958
+	.long	132667
+	.long	3819481236
+	.long	1016499965
+	.long	1853186616
+	.long	145530
+	.long	2552227826
+	.long	1015039787
+	.long	1709341917
+	.long	158533
+	.long	1829350193
+	.long	1015216097
+	.long	4112506593
+	.long	171677
+	.long	1913391795
+	.long	1015756674
+	.long	2799960843
+	.long	184965
+	.long	1303423926
+	.long	1015238005
+	.long	171030293
+	.long	198398
+	.long	1574172746
+	.long	1016061241
+	.long	2992903935
+	.long	211976
+	.long	3424156969
+	.long	1017196428
+	.long	926591434
+	.long	225703
+	.long	1938513547
+	.long	1017631273
+	.long	887463926
+	.long	239579
+	.long	2804567149
+	.long	1015390024
+	.long	1276261410
+	.long	253606
+	.long	631083525
+	.long	1017690182
+	.long	569847337
+	.long	267786
+	.long	1623370770
+	.long	1011049453
+	.long	1617004845
+	.long	282120
+	.long	3667985273
+	.long	1013894369
+	.long	3049340112
+	.long	296610
+	.long	3145379760
+	.long	1014403278
+	.long	3577096743
+	.long	311258
+	.long	2603100681
+	.long	1017152460
+	.long	1990012070
+	.long	326066
+	.long	3249202951
+	.long	1017448880
+	.long	1453150081
+	.long	341035
+	.long	419288974
+	.long	1016280325
+	.long	917841882
+	.long	356167
+	.long	3793507337
+	.long	1016095713
+	.long	3712504873
+	.long	371463
+	.long	728023093
+	.long	1016345318
+	.long	363667784
+	.long	386927
+	.long	2582678538
+	.long	1017123460
+	.long	2956612996
+	.long	402558
+	.long	7592966
+	.long	1016721543
+	.long	2186617380
+	.long	418360
+	.long	228611441
+	.long	1016696141
+	.long	1719614412
+	.long	434334
+	.long	2261665670
+	.long	1017457593
+	.long	1013258798
+	.long	450482
+	.long	544148907
+	.long	1017323666
+	.long	3907805043
+	.long	466805
+	.long	2383914918
+	.long	1017143586
+	.long	1447192520
+	.long	483307
+	.long	1176412038
+	.long	1017267372
+	.long	1944781190
+	.long	499988
+	.long	2882956373
+	.long	1013312481
+	.long	919555682
+	.long	516851
+	.long	3154077648
+	.long	1016528543
+	.long	2571947538
+	.long	533897
+	.long	348651999
+	.long	1016405780
+	.long	2604962540
+	.long	551129
+	.long	3253791412
+	.long	1015920431
+	.long	1110089947
+	.long	568549
+	.long	1509121860
+	.long	1014756995
+	.long	2568320822
+	.long	586158
+	.long	2617649212
+	.long	1017340090
+	.long	2966275556
+	.long	603959
+	.long	553214634
+	.long	1016457425
+	.long	2682146383
+	.long	621954
+	.long	730975783
+	.long	1014083580
+	.long	2191782032
+	.long	640145
+	.long	1486499517
+	.long	1016818996
+	.long	2069751140
+	.long	658534
+	.long	2595788928
+	.long	1016407932
+	.long	2990417244
+	.long	677123
+	.long	1853053619
+	.long	1015310724
+	.long	1434058175
+	.long	695915
+	.long	2462790535
+	.long	1015814775
+	.long	2572866477
+	.long	714911
+	.long	3693944214
+	.long	1017259110
+	.long	3092190714
+	.long	734114
+	.long	2979333550
+	.long	1017188654
+	.long	4076559942
+	.long	753526
+	.long	174054861
+	.long	1014300631
+	.long	2420883922
+	.long	773150
+	.long	816778419
+	.long	1014197934
+	.long	3716502172
+	.long	792987
+	.long	3507050924
+	.long	1015341199
+	.long	777507147
+	.long	813041
+	.long	1821514088
+	.long	1013410604
+	.long	3706687593
+	.long	833312
+	.long	920623539
+	.long	1016295433
+	.long	1242007931
+	.long	853805
+	.long	2789017511
+	.long	1014276997
+	.long	3707479175
+	.long	874520
+	.long	3586233004
+	.long	1015962192
+	.long	64696965
+	.long	895462
+	.long	474650514
+	.long	1016642419
+	.long	863738718
+	.long	916631
+	.long	1614448851
+	.long	1014281732
+	.long	3884662774
+	.long	938030
+	.long	2450082086
+	.long	1016164135
+	.long	2728693977
+	.long	959663
+	.long	1101668360
+	.long	1015989180
+	.long	3999357479
+	.long	981531
+	.long	835814894
+	.long	1015702697
+	.long	1533953344
+	.long	1003638
+	.long	1301400989
+	.long	1014466875
+	.long	2174652632
+	.long	1025985
+	.type	Tbl_addr,@object
+	.size	Tbl_addr,1024
+	.align 16
+ALLONES:
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.long	4294967295
+	.type	ALLONES,@object
+	.size	ALLONES,16
+	.align 16
+ebias:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	1072693248
+	.type	ebias,@object
+	.size	ebias,16
+	.align 4
+XMAX:
+	.long	4294967295
+	.long	2146435071
+	.type	XMAX,@object
+	.size	XMAX,8
+	.align 4
+XMIN:
+	.long	0
+	.long	1048576
+	.type	XMIN,@object
+	.size	XMIN,8
+	.align 4
+INF:
+	.long	0
+	.long	2146435072
+	.type	INF,@object
+	.size	INF,8
+	.align 4
+ZERO:
+	.long	0
+	.long	0
+	.type	ZERO,@object
+	.size	ZERO,8
+	.align 4
+ONE_val:
+	.long	0
+	.long	1072693248
+	.type	ONE_val,@object
+	.size	ONE_val,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_exp.1-.
+	.4byte ..___tag_value_exp.5-..___tag_value_exp.1
+	.2byte 0x0400
+	.4byte ..___tag_value_exp.3-..___tag_value_exp.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_exp.4-..___tag_value_exp.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_hypot.S b/libm/x86_64/e_hypot.S
new file mode 100644
index 0000000..089b2b4
--- /dev/null
+++ b/libm/x86_64/e_hypot.S
@@ -0,0 +1,210 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// X87 version:
+// Use 80-bit FPU precision fmul, fsqrt to compute square and sqrt.
+//
+// SSE version:
+// Swap x, y if |x|<|y|
+// For x=2^k*x, get y=y*2^(-k)
+// Get S ~ sqrt(x^2+y^2)  (leading 1 + leading 25 mantissa bits)
+//
+// Get D = ( RN(x^2+y^2) - S^2 ) + ( x^2 - RN(x^2) ) +
+//                               + ( y^2 - ((RN(x^2+y^2)-RN(x^2)) )
+//
+// Result is 2^k*(S + Se),  where Se = S*e
+//        S*e is approximated as (D/2S)*( 1 - (D/2S)^2*1.0/S )
+//
+// Return 2^k*(S+Se)
+//
+// For |y/x|<2^(-64), return x
+//
+// For cases where maximum biased exponent is either greater than 7fdh or
+// below 32, take a special path to check for special cases (0, NaN, Inf),
+// possible overflow, and more accurate computation for denormal results
+//
+// Special cases:
+//  hypot(x,y), hypot(y,x), and hypot(x,-y) are equivalent
+//  hypot(x,+-0) is equivalent to fabs(x)
+//  hypot(x,y) = y if (x==NaN or x==INF) and y==INF
+//  hypot(x,y) = x if (x==NaN or x==INF) and y!=INF (even if y==NaN!)
+//  hypot(x,y) = y if (x!=NaN and x!=INF) and (y==NaN or y==INF)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  hypot
+ENTRY(hypot)
+# parameter 1: %xmm0
+# parameter 2: %xmm1
+..B1.1:
+..___tag_value_hypot.1:
+..___tag_value_hypot.3:
+..B1.2:
+        subq      $64, %rsp
+        movapd    static_const_table(%rip), %xmm3
+        movsd     %xmm0, 48(%rsp)
+        movsd     %xmm1, 56(%rsp)
+        andpd     %xmm3, %xmm0
+        andpd     %xmm3, %xmm1
+        pextrw    $3, %xmm0, %eax
+        pextrw    $3, %xmm1, %edx
+        cmpl      $24528, %eax
+        ja        .L_2TAG_PACKET_0.0.1
+        cmpl      $24528, %edx
+        ja        .L_2TAG_PACKET_0.0.1
+.L_2TAG_PACKET_1.0.1:
+        fldl      48(%rsp)
+        fldl      56(%rsp)
+        fxch      %st(1)
+        fmul      %st(0), %st
+        fxch      %st(1)
+        nop       
+        fmul      %st(0), %st
+        faddp     %st, %st(1)
+        fsqrt     
+        jmp       .L_2TAG_PACKET_2.0.1
+.L_2TAG_PACKET_0.0.1:
+        cmpl      $32752, %eax
+        movl      %eax, %ecx
+        jae       .L_2TAG_PACKET_3.0.1
+        subl      %edx, %ecx
+        cmpl      $32752, %edx
+        jae       .L_2TAG_PACKET_3.0.1
+        addl      $928, %ecx
+        addl      %edx, %eax
+        cmpl      $1856, %ecx
+        ja        .L_2TAG_PACKET_4.0.1
+        cmpl      $49056, %eax
+        jb        .L_2TAG_PACKET_1.0.1
+        fldl      48(%rsp)
+        fldl      56(%rsp)
+        fxch      %st(1)
+        fmul      %st(0), %st
+        fxch      %st(1)
+        nop       
+        fmul      %st(0), %st
+        faddp     %st, %st(1)
+        fsqrt     
+.L_2TAG_PACKET_5.0.1:
+        fstl      (%rsp)
+        fstpt     16(%rsp)
+        xorl      %eax, %eax
+        movw      24(%rsp), %ax
+        cmpl      $17407, %eax
+        jae       .L_2TAG_PACKET_6.0.1
+        fldl      (%rsp)
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_4.0.1:
+        movsd     %xmm0, 32(%rsp)
+        movsd     %xmm1, 40(%rsp)
+        fldl      32(%rsp)
+        faddl     40(%rsp)
+        jmp       .L_2TAG_PACKET_5.0.1
+.L_2TAG_PACKET_6.0.1:
+        fldl      (%rsp)
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_3.0.1:
+        shufpd    $0, %xmm1, %xmm0
+        movdqa    %xmm0, %xmm2
+        movdqa    16+static_const_table(%rip), %xmm3
+        movsd     %xmm0, 32(%rsp)
+        movsd     %xmm1, 40(%rsp)
+        cmppd     $3, %xmm0, %xmm2
+        cmppd     $0, %xmm0, %xmm3
+        movmskpd  %xmm2, %edx
+        movmskpd  %xmm3, %rax
+        testl     %edx, %edx
+        je        .L_2TAG_PACKET_8.0.1
+        fldl      32(%rsp)
+        fmull     40(%rsp)
+        testq     $1, %rax
+        jne       .L_2TAG_PACKET_9.0.1
+        testq     $2, %rax
+        jne       .L_2TAG_PACKET_10.0.1
+        jmp       .L_2TAG_PACKET_2.0.1
+.L_2TAG_PACKET_8.0.1:
+        fldl      32(%rsp)
+        faddl     40(%rsp)
+        jmp       .L_2TAG_PACKET_2.0.1
+.L_2TAG_PACKET_9.0.1:
+        fstpl     40(%rsp)
+        fldl      32(%rsp)
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_10.0.1:
+        fstpl     32(%rsp)
+        fldl      40(%rsp)
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_2.0.1:
+.L_2TAG_PACKET_7.0.1:
+        fstpl     16(%rsp)
+        movq      16(%rsp), %xmm0
+        addq      $64, %rsp
+        ret       
+..B1.3:
+..___tag_value_hypot.4:
+END(hypot)
+# -- End  hypot
+	.section .rodata, "a"
+	.align 16
+	.align 16
+static_const_table:
+	.long	4294967295
+	.long	2147483647
+	.long	4294967295
+	.long	2147483647
+	.long	0
+	.long	2146435072
+	.long	0
+	.long	2146435072
+	.type	static_const_table,@object
+	.size	static_const_table,32
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x00000014
+	.4byte 0x0000001c
+	.4byte ..___tag_value_hypot.1-.
+	.4byte ..___tag_value_hypot.4-..___tag_value_hypot.1
+	.2byte 0x0400
+	.4byte ..___tag_value_hypot.3-..___tag_value_hypot.1
+	.2byte 0x100e
+# End
diff --git a/libm/x86_64/e_log.S b/libm/x86_64/e_log.S
new file mode 100644
index 0000000..40cb5e2
--- /dev/null
+++ b/libm/x86_64/e_log.S
@@ -0,0 +1,779 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpss instruction (B0)
+//    B = int((B0*2^7+0.5))/2^7
+//
+//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
+//
+//    Result:  k*log(2) - log(B) + p(r) if |x-1| >= small value (2^-6)  and
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//  log(NaN) = quiet NaN, and raise invalid exception
+//  log(+INF) = that INF
+//  log(0) = -INF with divide-by-zero exception raised
+//  log(1) = +0
+//  log(x) = NaN with invalid exception raised if x < -0, including -INF
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  log
+ENTRY(log)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_log.1:
+        subq      $24, %rsp
+..___tag_value_log.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        movq      $0x3ff0000000000000, %rax
+        movd      %rax, %xmm2
+        movq      $0x77f0000000000000, %rdx
+        movd      %rdx, %xmm3
+        movl      $32768, %ecx
+        movd      %rcx, %xmm4
+        movq      $0xffffe00000000000, %r8
+        movd      %r8, %xmm5
+        movq      %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $16352, %ecx
+        psrlq     $27, %xmm0
+        lea       L_tbl(%rip), %r11
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        paddd     %xmm4, %xmm0
+        orpd      %xmm3, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm1, %xmm5
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm1
+        mulpd     %xmm0, %xmm5
+        andl      $32752, %eax
+        subl      %ecx, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulsd     %xmm0, %xmm1
+        movq      log2(%rip), %xmm6
+        movapd    coeff(%rip), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    (%r11,%rdx), %xmm0
+        movapd    16+coeff(%rip), %xmm4
+        addsd     %xmm5, %xmm1
+        movapd    32+coeff(%rip), %xmm2
+        mulsd     %xmm7, %xmm6
+        movddup   %xmm1, %xmm5
+        mulsd     8+log2(%rip), %xmm7
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm4
+        mulpd     %xmm5, %xmm5
+        movddup   %xmm0, %xmm6
+        addsd     %xmm1, %xmm0
+        addpd     %xmm2, %xmm4
+        mulpd     %xmm5, %xmm3
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm4
+        pshufd    $238, %xmm0, %xmm2
+        addsd     %xmm6, %xmm1
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm2, %xmm7
+        addpd     %xmm3, %xmm4
+        addsd     %xmm7, %xmm1
+        mulpd     %xmm5, %xmm4
+        addsd     %xmm4, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        movq      (%rsp), %xmm0
+        movq      (%rsp), %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        cmpl      $16, %eax
+        jb        .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_4.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_5.0.2:
+        ja        .L_2TAG_PACKET_4.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_4.0.2
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_3.0.2:
+        xorpd     %xmm1, %xmm1
+        addsd     %xmm0, %xmm1
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_7.0.2
+        xorpd     %xmm1, %xmm1
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        movq      %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        psrlq     $27, %xmm0
+        movl      $18416, %ecx
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_5.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        movl      $3, 16(%rsp)
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $2, 16(%rsp)
+.L_2TAG_PACKET_8.0.2:
+        movq      %xmm0, 8(%rsp)
+..B1.3:
+        movq      8(%rsp), %xmm0
+.L_2TAG_PACKET_9.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_log.4:
+        ret       
+..___tag_value_log.5:
+END(log)
+# -- End  log
+	.section .rodata, "a"
+	.align 16
+	.align 16
+L_tbl:
+	.long	4277811200
+	.long	1072049730
+	.long	2479318832
+	.long	1026487127
+	.long	2854492160
+	.long	1072033410
+	.long	215631550
+	.long	1025638968
+	.long	1547061248
+	.long	1072017216
+	.long	2886781435
+	.long	1026423395
+	.long	649825280
+	.long	1072001146
+	.long	4281533405
+	.long	1024038923
+	.long	646346752
+	.long	1071985198
+	.long	1562735921
+	.long	1023790276
+	.long	2203734016
+	.long	1071969370
+	.long	1838397691
+	.long	3173936209
+	.long	1872169984
+	.long	1071953661
+	.long	3981202460
+	.long	1022325013
+	.long	669557760
+	.long	1071938069
+	.long	4182597802
+	.long	3173174122
+	.long	4076413952
+	.long	1071922591
+	.long	1209029111
+	.long	3170736207
+	.long	556125184
+	.long	1071907228
+	.long	821086028
+	.long	3173437049
+	.long	204914688
+	.long	1071891976
+	.long	2097025986
+	.long	3171071798
+	.long	387545088
+	.long	1071876834
+	.long	3142936996
+	.long	3173092218
+	.long	2912783360
+	.long	1071861800
+	.long	2502420140
+	.long	1024505919
+	.long	1144260608
+	.long	1071846874
+	.long	3315658140
+	.long	3173469843
+	.long	1471209472
+	.long	1071832053
+	.long	129621009
+	.long	3172443877
+	.long	1829683200
+	.long	1071817336
+	.long	3885467693
+	.long	1025535275
+	.long	288676864
+	.long	1071802722
+	.long	86139472
+	.long	3171639793
+	.long	3636378624
+	.long	1071788208
+	.long	1850238587
+	.long	1024654342
+	.long	1606817792
+	.long	1071773795
+	.long	3388899795
+	.long	3173675586
+	.long	1236164608
+	.long	1071759480
+	.long	3983599207
+	.long	1020046558
+	.long	1089616896
+	.long	1071745262
+	.long	4171974224
+	.long	1024773198
+	.long	4143093760
+	.long	1071731139
+	.long	2727587401
+	.long	3173965207
+	.long	600267776
+	.long	1071717112
+	.long	3147685042
+	.long	3173353031
+	.long	2249313280
+	.long	1071703177
+	.long	125835074
+	.long	1025255832
+	.long	3805303808
+	.long	1071689334
+	.long	2289991207
+	.long	1025460331
+	.long	87278592
+	.long	1071675583
+	.long	1106114045
+	.long	1025933602
+	.long	3195405312
+	.long	1071661920
+	.long	3885316576
+	.long	3171206239
+	.long	3853649920
+	.long	1071648346
+	.long	2977069852
+	.long	3171236771
+	.long	2944026624
+	.long	1071625048
+	.long	1008093493
+	.long	1023444474
+	.long	3993180160
+	.long	1071598247
+	.long	1862355595
+	.long	1024642533
+	.long	1454641152
+	.long	1071571617
+	.long	1514603089
+	.long	1026500596
+	.long	3286085632
+	.long	1071545154
+	.long	1400028424
+	.long	3173279056
+	.long	438773760
+	.long	1071518858
+	.long	120727864
+	.long	3172148914
+	.long	1212979200
+	.long	1071492725
+	.long	1625055594
+	.long	3172901933
+	.long	1189017600
+	.long	1071466754
+	.long	3920062376
+	.long	1025727407
+	.long	403064832
+	.long	1071440943
+	.long	1053271728
+	.long	3171391427
+	.long	3343210496
+	.long	1071415289
+	.long	3243395502
+	.long	3173627613
+	.long	1765777408
+	.long	1071389792
+	.long	2145968512
+	.long	1026354304
+	.long	461430784
+	.long	1071364449
+	.long	4094322285
+	.long	1026021467
+	.long	71706624
+	.long	1071339258
+	.long	763632021
+	.long	1024496933
+	.long	1380503552
+	.long	1071314217
+	.long	1383547992
+	.long	3173088453
+	.long	1015732224
+	.long	1071289325
+	.long	3198646877
+	.long	1025390322
+	.long	35977216
+	.long	1071264580
+	.long	2141026805
+	.long	1025754693
+	.long	3927306240
+	.long	1071239979
+	.long	282116272
+	.long	3173394334
+	.long	1125341184
+	.long	1071215523
+	.long	2768427504
+	.long	3172279059
+	.long	1666971648
+	.long	1071191208
+	.long	786837629
+	.long	3172427445
+	.long	2827694080
+	.long	1071167033
+	.long	3857122416
+	.long	3173014241
+	.long	2003683328
+	.long	1071142997
+	.long	859010954
+	.long	1026545007
+	.long	1004017664
+	.long	1071119098
+	.long	3356644970
+	.long	3173458064
+	.long	1753020416
+	.long	1071095334
+	.long	788338552
+	.long	1026157693
+	.long	1992718336
+	.long	1071071704
+	.long	1239179443
+	.long	1026394889
+	.long	3870234624
+	.long	1071048206
+	.long	2082614663
+	.long	1024926053
+	.long	1050437632
+	.long	1071024840
+	.long	660007840
+	.long	1025548499
+	.long	188395520
+	.long	1071001603
+	.long	3878792704
+	.long	3173889571
+	.long	3747176448
+	.long	1070978493
+	.long	144991708
+	.long	3171552042
+	.long	1405669376
+	.long	1070955511
+	.long	3999088879
+	.long	1025486317
+	.long	121151488
+	.long	1070932654
+	.long	2170865497
+	.long	1026473584
+	.long	2652319744
+	.long	1070909920
+	.long	453695652
+	.long	3173916809
+	.long	3262236672
+	.long	1070887309
+	.long	157800053
+	.long	3173984206
+	.long	601221120
+	.long	1070864820
+	.long	3968917661
+	.long	1023992886
+	.long	1999843328
+	.long	1070842450
+	.long	3053895004
+	.long	1024998228
+	.long	1992167424
+	.long	1070820199
+	.long	2968614856
+	.long	1024552653
+	.long	3788726272
+	.long	1070798065
+	.long	3542170808
+	.long	3173573242
+	.long	2094829568
+	.long	1070776048
+	.long	1246758132
+	.long	1026202874
+	.long	288675840
+	.long	1070754146
+	.long	3747328950
+	.long	1026331585
+	.long	1829681152
+	.long	1070732357
+	.long	3125197546
+	.long	1024100318
+	.long	1666869248
+	.long	1070710681
+	.long	1363656119
+	.long	1026336493
+	.long	3417110528
+	.long	1070689116
+	.long	4154791553
+	.long	1026267853
+	.long	2183653376
+	.long	1070667662
+	.long	1671819292
+	.long	3173785870
+	.long	1734434816
+	.long	1070646317
+	.long	373091049
+	.long	1025972363
+	.long	1615681536
+	.long	1070625080
+	.long	384650897
+	.long	1022926043
+	.long	1445382144
+	.long	1070603950
+	.long	344320330
+	.long	3172397196
+	.long	1823715328
+	.long	1070569756
+	.long	3389841200
+	.long	1025231852
+	.long	3839688704
+	.long	1070527917
+	.long	1706790417
+	.long	3167363349
+	.long	4293332992
+	.long	1070486286
+	.long	1614935088
+	.long	1019351591
+	.long	2966720512
+	.long	1070444861
+	.long	4145393717
+	.long	3173711658
+	.long	4066729984
+	.long	1070403639
+	.long	1974925028
+	.long	3171437182
+	.long	3337621504
+	.long	1070362619
+	.long	3314953170
+	.long	3169971314
+	.long	943448064
+	.long	1070321799
+	.long	1498682038
+	.long	3173862340
+	.long	1465634816
+	.long	1070281176
+	.long	1319952810
+	.long	3171693965
+	.long	1015734272
+	.long	1070240749
+	.long	1347821929
+	.long	3173544515
+	.long	118001664
+	.long	1070200516
+	.long	1751482746
+	.long	1026134093
+	.long	3707174912
+	.long	1070160474
+	.long	1486946159
+	.long	1023930920
+	.long	3946381312
+	.long	1070120623
+	.long	2867408081
+	.long	3171368276
+	.long	1699848192
+	.long	1070080961
+	.long	2590187139
+	.long	1025379803
+	.long	2235846656
+	.long	1070041485
+	.long	1888568069
+	.long	3172754960
+	.long	2339729408
+	.long	1070002194
+	.long	3852214753
+	.long	3173323149
+	.long	3196850176
+	.long	1069963086
+	.long	742141560
+	.long	1025101707
+	.long	1800683520
+	.long	1069924160
+	.long	3949500444
+	.long	3172102179
+	.long	3835801600
+	.long	1069885413
+	.long	3848895943
+	.long	1025913832
+	.long	2201202688
+	.long	1069846845
+	.long	1425913464
+	.long	1025868665
+	.long	2778279936
+	.long	1069808453
+	.long	2120889677
+	.long	3173831128
+	.long	2954203136
+	.long	1069770236
+	.long	592147081
+	.long	1019621288
+	.long	210141184
+	.long	1069732193
+	.long	3414275233
+	.long	1023647084
+	.long	709476352
+	.long	1069694321
+	.long	2413027164
+	.long	1024462115
+	.long	2116284416
+	.long	1069656619
+	.long	1144559924
+	.long	1026336654
+	.long	2183651328
+	.long	1069619086
+	.long	3459057650
+	.long	1025634168
+	.long	3047047168
+	.long	1069581720
+	.long	1879674924
+	.long	3173508573
+	.long	970711040
+	.long	1069541521
+	.long	1335954173
+	.long	3173332182
+	.long	2198478848
+	.long	1069467449
+	.long	2951103968
+	.long	3173892200
+	.long	1669611520
+	.long	1069393703
+	.long	531044147
+	.long	1025149248
+	.long	29114368
+	.long	1069320280
+	.long	3327831251
+	.long	1025918673
+	.long	2376949760
+	.long	1069247176
+	.long	737634533
+	.long	3172176000
+	.long	1085390848
+	.long	1069174390
+	.long	3108243400
+	.long	3171828406
+	.long	1566130176
+	.long	1069101918
+	.long	985483226
+	.long	1025708380
+	.long	792780800
+	.long	1069029758
+	.long	4184866295
+	.long	1024426204
+	.long	183156736
+	.long	1068957907
+	.long	2845699378
+	.long	1022107277
+	.long	1301782528
+	.long	1068886362
+	.long	1012735262
+	.long	3173804294
+	.long	1562411008
+	.long	1068815121
+	.long	2197086703
+	.long	3170187813
+	.long	2815549440
+	.long	1068744181
+	.long	2782613207
+	.long	1026345054
+	.long	2756124672
+	.long	1068673540
+	.long	2929486205
+	.long	3173037800
+	.long	3511050240
+	.long	1068603195
+	.long	1443733147
+	.long	3173331549
+	.long	3047047168
+	.long	1068533144
+	.long	1879674924
+	.long	3172459997
+	.long	3221667840
+	.long	1068427825
+	.long	1338588027
+	.long	3171815742
+	.long	3453861888
+	.long	1068288883
+	.long	1205348359
+	.long	3172624626
+	.long	3506110464
+	.long	1068150514
+	.long	893105198
+	.long	1025571866
+	.long	346013696
+	.long	1068012714
+	.long	3495569021
+	.long	3172563349
+	.long	4074029056
+	.long	1067875476
+	.long	3961106338
+	.long	3171065595
+	.long	3559784448
+	.long	1067738798
+	.long	1975385384
+	.long	3173783155
+	.long	797769728
+	.long	1067602675
+	.long	3760305787
+	.long	1026047642
+	.long	2313633792
+	.long	1067467101
+	.long	1559353171
+	.long	1023480256
+	.long	3960766464
+	.long	1067213778
+	.long	1067365107
+	.long	1025865926
+	.long	684261376
+	.long	1066944805
+	.long	844762164
+	.long	3173687482
+	.long	630718464
+	.long	1066676905
+	.long	2458269694
+	.long	1024033081
+	.long	1486061568
+	.long	1066410070
+	.long	115537874
+	.long	3173243995
+	.long	2743664640
+	.long	1065886792
+	.long	3665098304
+	.long	3173471607
+	.long	1971912704
+	.long	1065357333
+	.long	2577214440
+	.long	3171993451
+	.long	1498939392
+	.long	1064306693
+	.long	3409036923
+	.long	1025599151
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.type	L_tbl,@object
+	.size	L_tbl,2064
+	.align 16
+log2:
+	.long	4277811200
+	.long	1067855426
+	.long	2479318832
+	.long	1022292823
+	.type	log2,@object
+	.size	log2,16
+	.align 16
+coeff:
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1030730101
+	.long	3217380702
+	.long	1431655765
+	.long	1070945621
+	.long	2576980378
+	.long	1070176665
+	.long	0
+	.long	3219128320
+	.type	coeff,@object
+	.size	coeff,48
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_log.1-.
+	.4byte ..___tag_value_log.5-..___tag_value_log.1
+	.2byte 0x0400
+	.4byte ..___tag_value_log.3-..___tag_value_log.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_log.4-..___tag_value_log.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_log10.S b/libm/x86_64/e_log10.S
new file mode 100644
index 0000000..4f43a36
--- /dev/null
+++ b/libm/x86_64/e_log10.S
@@ -0,0 +1,807 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpss instruction (B0)
+//    B = int((B0*LH*2^7+0.5))/2^7
+//    LH is a short approximation for log10(e)
+//
+//    Reduced argument: r=B*mx-LH (computed accurately in high and low parts)
+//
+//    Result:  k*log10(2) - log(B) + p(r)
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//  log10(0) = -INF with divide-by-zero exception raised                                           
+//  log10(1) = +0
+//  log10(x) = NaN with invalid exception raised if x < -0, including -INF
+//  log10(+INF) = +INF
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  log10
+ENTRY(log10)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_log10.1:
+        subq      $24, %rsp
+..___tag_value_log10.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movl      $1054736384, %ecx
+        movd      %ecx, %xmm7
+        xorpd     %xmm3, %xmm3
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm3
+        movq      %xmm0, %xmm1
+        movl      $32768, %edx
+        movd      %edx, %xmm4
+        movapd    HIGHSIGMASK(%rip), %xmm5
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $16352, %ecx
+        psrlq     $27, %xmm0
+        movq      LOG10_E(%rip), %xmm2
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $78, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+.L_2TAG_PACKET_1.0.2:
+        mulss     %xmm7, %xmm0
+        orpd      %xmm3, %xmm1
+        lea       L_tbl(%rip), %r11
+        andpd     %xmm1, %xmm5
+        paddd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm6, %xmm0
+        andl      $32752, %eax
+        subl      %ecx, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        mulsd     %xmm0, %xmm1
+        movq      log2(%rip), %xmm6
+        movapd    coeff(%rip), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    -1504(%r11,%rdx), %xmm0
+        movapd    16+coeff(%rip), %xmm4
+        addsd     %xmm5, %xmm1
+        movapd    32+coeff(%rip), %xmm2
+        mulsd     %xmm7, %xmm6
+        pshufd    $68, %xmm1, %xmm5
+        mulsd     8+log2(%rip), %xmm7
+        mulsd     %xmm1, %xmm3
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm4
+        movq      8+LOG10_E(%rip), %xmm6
+        mulpd     %xmm5, %xmm5
+        addpd     %xmm2, %xmm4
+        mulpd     %xmm5, %xmm3
+        pshufd    $228, %xmm0, %xmm2
+        addsd     %xmm1, %xmm0
+        mulsd     %xmm1, %xmm4
+        subsd     %xmm0, %xmm2
+        mulsd     %xmm1, %xmm6
+        addsd     %xmm2, %xmm1
+        pshufd    $238, %xmm0, %xmm2
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm2, %xmm7
+        addsd     %xmm6, %xmm1
+        addpd     %xmm3, %xmm4
+        addsd     %xmm7, %xmm1
+        mulpd     %xmm5, %xmm4
+        addsd     %xmm4, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        movq      (%rsp), %xmm0
+        movq      (%rsp), %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_2.0.2
+        cmpl      $16, %eax
+        jb        .L_2TAG_PACKET_3.0.2
+.L_2TAG_PACKET_4.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_5.0.2:
+        ja        .L_2TAG_PACKET_4.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_4.0.2
+        jmp       .L_2TAG_PACKET_6.0.2
+.L_2TAG_PACKET_3.0.2:
+        xorpd     %xmm1, %xmm1
+        addsd     %xmm0, %xmm1
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_7.0.2
+        xorpd     %xmm1, %xmm1
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movq      %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psrlq     $27, %xmm0
+        movq      LOG10_E(%rip), %xmm2
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $78, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_2.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_5.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        movl      $9, 16(%rsp)
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $8, 16(%rsp)
+.L_2TAG_PACKET_8.0.2:
+        movq      %xmm0, 8(%rsp)
+..B1.3:
+        movq      8(%rsp), %xmm0
+.L_2TAG_PACKET_9.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_log10.4:
+        ret       
+..___tag_value_log10.5:
+END(log10)
+# -- End  log10
+	.section .rodata, "a"
+	.align 16
+	.align 16
+HIGHSIGMASK:
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	4294959104
+	.type	HIGHSIGMASK,@object
+	.size	HIGHSIGMASK,16
+	.align 16
+LOG10_E:
+	.long	0
+	.long	1071366144
+	.long	3207479560
+	.long	1062894188
+	.type	LOG10_E,@object
+	.size	LOG10_E,16
+	.align 16
+L_tbl:
+	.long	1352628224
+	.long	1070810131
+	.long	521319256
+	.long	1025503025
+	.long	2150839296
+	.long	1070801944
+	.long	3329350096
+	.long	3170190015
+	.long	1360613376
+	.long	1070793794
+	.long	2024059075
+	.long	1024991594
+	.long	1875350528
+	.long	1070785680
+	.long	2163882141
+	.long	3163564137
+	.long	2312126464
+	.long	1070777602
+	.long	1975711076
+	.long	1023674196
+	.long	1306336256
+	.long	1070769560
+	.long	3524899523
+	.long	3170508164
+	.long	1806334976
+	.long	1070761553
+	.long	4254777025
+	.long	1025238739
+	.long	2483193856
+	.long	1070753581
+	.long	3800671317
+	.long	3172916830
+	.long	2025350144
+	.long	1070745644
+	.long	1731514745
+	.long	1025501083
+	.long	3433285632
+	.long	1070737741
+	.long	2551857336
+	.long	3169662186
+	.long	1134317568
+	.long	1070729873
+	.long	3426297655
+	.long	3172637891
+	.long	2457152512
+	.long	1070722038
+	.long	63549415
+	.long	1025415416
+	.long	1861803008
+	.long	1070714237
+	.long	1910171636
+	.long	1023977580
+	.long	2414140416
+	.long	1070706469
+	.long	4002514337
+	.long	3170841618
+	.long	2900726784
+	.long	1070698734
+	.long	3268064083
+	.long	1022459609
+	.long	2123517952
+	.long	1070691032
+	.long	1767031218
+	.long	1022448156
+	.long	3194569728
+	.long	1070683362
+	.long	3402332618
+	.long	3171671160
+	.long	650882048
+	.long	1070675725
+	.long	4146023905
+	.long	3171023038
+	.long	1928988672
+	.long	1070668119
+	.long	1438617867
+	.long	1016360491
+	.long	1594908672
+	.long	1070660545
+	.long	971389377
+	.long	1024763979
+	.long	2818746368
+	.long	1070653002
+	.long	3555925341
+	.long	3172434821
+	.long	194584576
+	.long	1070645491
+	.long	943919215
+	.long	3172950063
+	.long	1215096832
+	.long	1070638010
+	.long	2283358588
+	.long	1022335098
+	.long	501519360
+	.long	1070630560
+	.long	480904295
+	.long	1024437959
+	.long	1278266368
+	.long	1070623140
+	.long	2755806066
+	.long	3172342012
+	.long	2487812096
+	.long	1070615750
+	.long	2489653202
+	.long	3172481099
+	.long	3085451264
+	.long	1070608390
+	.long	3759184951
+	.long	3172574892
+	.long	2039090176
+	.long	1070601060
+	.long	1361176676
+	.long	3172355319
+	.long	953057280
+	.long	1070591423
+	.long	1176587546
+	.long	3166422018
+	.long	3370524672
+	.long	1070576879
+	.long	3669570051
+	.long	1025376630
+	.long	749742080
+	.long	1070562394
+	.long	707700964
+	.long	3170814058
+	.long	4008353792
+	.long	1070547965
+	.long	3247327652
+	.long	1022431400
+	.long	2612455424
+	.long	1070533594
+	.long	2453457344
+	.long	3172322969
+	.long	3230920704
+	.long	1070519279
+	.long	1296781801
+	.long	1025115335
+	.long	3965253632
+	.long	1070505020
+	.long	373075289
+	.long	1017938528
+	.long	2593157120
+	.long	1070476669
+	.long	1068054086
+	.long	1021616576
+	.long	925962240
+	.long	1070448537
+	.long	850121213
+	.long	1023928989
+	.long	1732556800
+	.long	1070420620
+	.long	1305206740
+	.long	3172665570
+	.long	3815630848
+	.long	1070392915
+	.long	192642943
+	.long	3172699907
+	.long	2001758208
+	.long	1070365420
+	.long	2820786683
+	.long	1024704867
+	.long	16746496
+	.long	1070338131
+	.long	1399573110
+	.long	3171372773
+	.long	1886492672
+	.long	1070311044
+	.long	3621428075
+	.long	3172974358
+	.long	3338196992
+	.long	1070284157
+	.long	3793882035
+	.long	1025124701
+	.long	381769728
+	.long	1070257468
+	.long	3877933342
+	.long	3170195490
+	.long	2186491904
+	.long	1070230972
+	.long	1838687089
+	.long	1017927292
+	.long	1008330752
+	.long	1070204668
+	.long	2228321664
+	.long	1025352196
+	.long	2247065600
+	.long	1070178552
+	.long	1413900906
+	.long	3170902532
+	.long	2964070400
+	.long	1070152622
+	.long	3590454629
+	.long	1025016844
+	.long	465154048
+	.long	1070126876
+	.long	2079688550
+	.long	3172268183
+	.long	883615744
+	.long	1070101310
+	.long	989244452
+	.long	3171900485
+	.long	1993768960
+	.long	1070075922
+	.long	1124327841
+	.long	3172964992
+	.long	1794471936
+	.long	1070050710
+	.long	1140575046
+	.long	1022673726
+	.long	2797932544
+	.long	1070025671
+	.long	1894836933
+	.long	3172544059
+	.long	3433797632
+	.long	1070000803
+	.long	3221831166
+	.long	3171921685
+	.long	2338371584
+	.long	1069976104
+	.long	3732461053
+	.long	3164513518
+	.long	2644013056
+	.long	1069951571
+	.long	2519460462
+	.long	3172548740
+	.long	3383814144
+	.long	1069927202
+	.long	2290997657
+	.long	1025499649
+	.long	3781380096
+	.long	1069902995
+	.long	380479405
+	.long	1025184136
+	.long	3245785088
+	.long	1069878948
+	.long	1096398261
+	.long	3169885192
+	.long	1366712320
+	.long	1069855059
+	.long	2218343715
+	.long	3170281628
+	.long	2204717056
+	.long	1069831325
+	.long	2668334011
+	.long	1025264524
+	.long	1401772032
+	.long	1069807745
+	.long	4103993159
+	.long	1022925721
+	.long	3356721152
+	.long	1069784316
+	.long	3573790772
+	.long	3172186527
+	.long	4041148416
+	.long	1069761037
+	.long	4027691910
+	.long	3171276990
+	.long	3880151040
+	.long	1069737906
+	.long	4087118786
+	.long	3172710734
+	.long	3453364224
+	.long	1069714921
+	.long	99014299
+	.long	3172003077
+	.long	3491092480
+	.long	1069692080
+	.long	3801836701
+	.long	3172989287
+	.long	575580160
+	.long	1069669382
+	.long	1920406012
+	.long	3170874125
+	.long	22282240
+	.long	1069646824
+	.long	964193370
+	.long	1019363159
+	.long	2991429632
+	.long	1069624404
+	.long	3372589890
+	.long	1023425053
+	.long	2189645824
+	.long	1069602122
+	.long	2610503872
+	.long	1023652442
+	.long	3341467648
+	.long	1069579975
+	.long	1190292004
+	.long	1022425665
+	.long	3711293440
+	.long	1069557962
+	.long	1104795356
+	.long	1023625829
+	.long	1380401152
+	.long	1069524644
+	.long	1156998217
+	.long	1025100499
+	.long	765710336
+	.long	1069481144
+	.long	1736649113
+	.long	1024999439
+	.long	849412096
+	.long	1069437902
+	.long	2618178330
+	.long	3170853629
+	.long	1433104384
+	.long	1069394915
+	.long	43477267
+	.long	3170378811
+	.long	2548596736
+	.long	1069352180
+	.long	3967367063
+	.long	1025246584
+	.long	157577216
+	.long	1069309695
+	.long	100402533
+	.long	3172825502
+	.long	3326238720
+	.long	1069267455
+	.long	1176892909
+	.long	1025464099
+	.long	4155494400
+	.long	1069225459
+	.long	3713707617
+	.long	3172630046
+	.long	3545804800
+	.long	1069183704
+	.long	857007315
+	.long	1024965777
+	.long	2602520576
+	.long	1069142187
+	.long	2588758347
+	.long	1022463131
+	.long	2631196672
+	.long	1069100905
+	.long	2118424235
+	.long	1022490989
+	.long	838135808
+	.long	1069059856
+	.long	4117002727
+	.long	1024874520
+	.long	3210903552
+	.long	1069019036
+	.long	650070125
+	.long	3172012966
+	.long	3039211520
+	.long	1068978444
+	.long	438055812
+	.long	1017743757
+	.long	2385633280
+	.long	1068938077
+	.long	3011990369
+	.long	3171312044
+	.long	3491618816
+	.long	1068897932
+	.long	712813818
+	.long	3172720400
+	.long	183644160
+	.long	1068858008
+	.long	4287006742
+	.long	1022379728
+	.long	3639214080
+	.long	1068818300
+	.long	353762279
+	.long	3172980009
+	.long	3728416768
+	.long	1068778808
+	.long	1851367730
+	.long	1025486574
+	.long	3370094592
+	.long	1068739529
+	.long	4046594913
+	.long	3172567047
+	.long	1348407296
+	.long	1068700461
+	.long	143189675
+	.long	1025397632
+	.long	899403776
+	.long	1068661601
+	.long	3753687842
+	.long	3170772772
+	.long	1117708288
+	.long	1068622947
+	.long	1857340812
+	.long	3170782678
+	.long	1248276480
+	.long	1068584497
+	.long	1289858203
+	.long	1025222289
+	.long	683237376
+	.long	1068546249
+	.long	2356679608
+	.long	3171629170
+	.long	3253764096
+	.long	1068508200
+	.long	3267136556
+	.long	1018554987
+	.long	94478336
+	.long	1068441756
+	.long	1927868814
+	.long	3169378180
+	.long	3233144832
+	.long	1068366445
+	.long	2682188854
+	.long	1023964004
+	.long	2940297216
+	.long	1068291522
+	.long	275301289
+	.long	1023944679
+	.long	3677708288
+	.long	1068216982
+	.long	302658771
+	.long	1024465567
+	.long	1576968192
+	.long	1068142822
+	.long	3672035940
+	.long	3172254610
+	.long	1614069760
+	.long	1068069037
+	.long	480052905
+	.long	3172692062
+	.long	424435712
+	.long	1067995624
+	.long	2207869657
+	.long	3170965436
+	.long	3477782528
+	.long	1067922578
+	.long	2980661858
+	.long	3164990018
+	.long	3598401536
+	.long	1067849897
+	.long	1974393034
+	.long	3171357083
+	.long	2435235840
+	.long	1067777577
+	.long	1385289011
+	.long	1024615823
+	.long	1867333632
+	.long	1067705614
+	.long	3442236633
+	.long	1025334384
+	.long	3999301632
+	.long	1067634004
+	.long	3506472073
+	.long	1025132546
+	.long	2566971392
+	.long	1067562745
+	.long	1425757592
+	.long	3172358463
+	.long	112943104
+	.long	1067491833
+	.long	1693407156
+	.long	3172426603
+	.long	3079929856
+	.long	1067392159
+	.long	3999942455
+	.long	1018549369
+	.long	2443837440
+	.long	1067251701
+	.long	974534460
+	.long	1023963412
+	.long	359366656
+	.long	1067111917
+	.long	2204915018
+	.long	1013514416
+	.long	3564519424
+	.long	1066972799
+	.long	3977441659
+	.long	3170879860
+	.long	2011086848
+	.long	1066834343
+	.long	590145514
+	.long	1025390011
+	.long	3216982016
+	.long	1066696541
+	.long	3629120110
+	.long	1024330313
+	.long	2194128896
+	.long	1066559388
+	.long	2367098512
+	.long	3172260338
+	.long	2916220928
+	.long	1066422877
+	.long	2262431886
+	.long	1021229446
+	.long	2263941120
+	.long	1066172214
+	.long	3118507287
+	.long	1021484970
+	.long	3076292608
+	.long	1065901726
+	.long	1411737803
+	.long	3172957147
+	.long	1186136064
+	.long	1065632488
+	.long	3109349337
+	.long	1025397383
+	.long	3085303808
+	.long	1065364487
+	.long	584715031
+	.long	3172596519
+	.long	1821048832
+	.long	1064842211
+	.long	2182246895
+	.long	3172536214
+	.long	697368576
+	.long	1064311094
+	.long	3157561765
+	.long	3172716357
+	.long	894042112
+	.long	1063260131
+	.long	3237958154
+	.long	3172587292
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.type	L_tbl,@object
+	.size	L_tbl,2064
+	.align 16
+log2:
+	.long	1352628224
+	.long	1066615827
+	.long	521319256
+	.long	1021308721
+	.type	log2,@object
+	.size	log2,16
+	.align 16
+coeff:
+	.long	3248877870
+	.long	1077250164
+	.long	1691676429
+	.long	3221787401
+	.long	945132465
+	.long	3223701783
+	.long	3700831335
+	.long	1073506818
+	.long	2141010593
+	.long	1075227551
+	.long	3698831637
+	.long	3220339442
+	.type	coeff,@object
+	.size	coeff,48
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_log10.1-.
+	.4byte ..___tag_value_log10.5-..___tag_value_log10.1
+	.2byte 0x0400
+	.4byte ..___tag_value_log10.3-..___tag_value_log10.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_log10.4-..___tag_value_log10.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_pow.S b/libm/x86_64/e_pow.S
new file mode 100644
index 0000000..9ec3828
--- /dev/null
+++ b/libm/x86_64/e_pow.S
@@ -0,0 +1,4282 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    log2(x) calculation:
+//
+//    Get B~1/mx based on the output of rcpps instruction (B0)
+//    B = int((B0*LH*2^9+0.5))/2^9
+//    LH is a short approximation for log2(e)
+//
+//    Reduced argument, scaled by LH:
+//                r=B*mx-LH (computed accurately in high and low parts)
+//
+//    log2(x) result:  k - log2(B) + p(r)
+//             p(r) is a degree 8 polynomial
+//             -log2(B) read from data table (high, low parts)
+//             log2(x) is formed from high and low parts
+//    For |x| in [1-1/32, 1+1/16), a slower but more accurate computation
+//    based om the same table design is performed.
+//
+//   Main path is taken if | floor(log2(|log2(|x|)|) + floor(log2|y|) | < 8,
+//   to filter out all potential OF/UF cases.
+//   exp2(y*log2(x)) is computed using an 8-bit index table and a degree 5
+//   polynomial
+//
+// Special cases:
+//  pow(-0,y) = -INF and raises the divide-by-zero exception for y an odd 
+//  integer < 0.
+//  pow(-0,y) = +INF and raises the divide-by-zero exception for y < 0 and 
+//  not an odd integer.
+//  pow(-0,y) = -0 for y an odd integer > 0.
+//  pow(-0,y) = +0 for y > 0 and not an odd integer.
+//  pow(-1,-INF) = 1.
+//  pow(+1,y) = 1 for any y, even a NaN.
+//  pow(x,-0) = 1 for any x, even a NaN.
+//  pow(x,y) = a NaN and raises the invalid exception for finite x < 0 and
+//  finite non-integer y.
+//  pow(x,-INF) = +INF for |x|<1.
+//  pow(x,-INF) = +0 for |x|>1.
+//  pow(x,+INF) = +0 for |x|<1.
+//  pow(x,+INF) = +INF for |x|>1.
+//  pow(-INF,y) = -0 for y an odd integer < 0.
+//  pow(-INF,y) = +0 for y < 0 and not an odd integer.
+//  pow(-INF,y) = -INF for y an odd integer > 0.
+//  pow(-INF,y) = +INF for y > 0 and not an odd integer.
+//  pow(+INF,y) = +0 for y <0.
+//  pow(+INF,y) = +INF for y >0.
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  pow
+ENTRY(pow)
+# parameter 1: %xmm0
+# parameter 2: %xmm1
+..B1.1:
+..___tag_value_pow.1:
+        subq      $40, %rsp
+..___tag_value_pow.3:
+        movsd     %xmm0, 8(%rsp)
+        movsd     %xmm1, 16(%rsp)
+..B1.2:
+        pextrw    $3, %xmm0, %eax
+        xorpd     %xmm2, %xmm2
+        movq      $0x3ff0000000000000, %r9
+        movd      %r9, %xmm2
+        movl      $1069088768, %r8d
+        movd      %r8, %xmm7
+        xorpd     %xmm1, %xmm1
+        movq      $0x77f0000000000000, %r10
+        movd      %r10, %xmm1
+        movq      %xmm0, %xmm3
+        movl      $32752, %edx
+        andl      %eax, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        orpd      %xmm2, %xmm0
+        movapd    HIGHSIGMASK(%rip), %xmm6
+        psrlq     $27, %xmm0
+        movq      LOG2_E(%rip), %xmm2
+        psrld     $2, %xmm0
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        movl      $8192, %r11d
+        movd      %r11, %xmm4
+        psrlq     $12, %xmm3
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        movq      $0, %r8
+.L_2TAG_PACKET_1.0.2:
+        mulss     %xmm7, %xmm0
+        movl      $-1, %edx
+        subl      $4, %ecx
+        shll      %cl, %edx
+        shlq      $32, %rdx
+        movd      %rdx, %xmm5
+        orpd      %xmm1, %xmm3
+        subl      $16351, %eax
+        cmpl      $1, %eax
+        jbe       .L_2TAG_PACKET_2.0.2
+        paddd     %xmm4, %xmm0
+        andpd     %xmm3, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+.L_2TAG_PACKET_3.0.2:
+        subsd     %xmm5, %xmm3
+        andpd     %xmm6, %xmm0
+        subl      $1, %eax
+        sarl      $4, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+.L_2TAG_PACKET_4.0.2:
+        mulsd     %xmm0, %xmm3
+        movapd    coeff(%rip), %xmm1
+        lea       L_tbl(%rip), %r11
+        subsd     %xmm2, %xmm5
+        movapd    16+coeff(%rip), %xmm4
+        movl      %eax, %ecx
+        sarl      $31, %eax
+        addl      %eax, %ecx
+        xorl      %ecx, %eax
+        addl      $1, %eax
+        bsr       %eax, %eax
+        unpcklpd  %xmm3, %xmm5
+        movapd    32+coeff(%rip), %xmm6
+        addsd     %xmm5, %xmm3
+        andl      $16760832, %edx
+        shrl      $10, %edx
+        addpd     -3648(%r11,%rdx), %xmm5
+        movapd    48+coeff(%rip), %xmm0
+        pshufd    $68, %xmm3, %xmm2
+        mulsd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm1
+        mulpd     %xmm2, %xmm4
+        addsd     %xmm7, %xmm5
+        mulsd     %xmm3, %xmm2
+        addpd     %xmm1, %xmm6
+        mulsd     %xmm3, %xmm3
+        addpd     %xmm4, %xmm0
+        movq      16(%rsp), %xmm1
+        movw      22(%rsp), %cx
+        pshufd    $238, %xmm5, %xmm7
+        movq      HIGHMASK_Y(%rip), %xmm4
+        mulpd     %xmm2, %xmm6
+        pshufd    $68, %xmm3, %xmm3
+        mulpd     %xmm2, %xmm0
+        shll      $4, %eax
+        subl      $15872, %eax
+        andl      $32752, %ecx
+        addl      %ecx, %eax
+        mulpd     %xmm6, %xmm3
+        cmpl      $624, %eax
+        jae       .L_2TAG_PACKET_5.0.2
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %edx
+        pinsrw    $3, %edx, %xmm6
+        movq      %xmm1, %xmm2
+        andpd     %xmm1, %xmm4
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm7, %xmm0
+        mulsd     %xmm5, %xmm1
+        movq      %xmm6, %xmm7
+        addsd     %xmm4, %xmm6
+        lea       T_exp(%rip), %r11
+        addpd     %xmm0, %xmm3
+        movd      %xmm6, %edx
+        subsd     %xmm7, %xmm6
+        pshufd    $238, %xmm3, %xmm0
+        subsd     %xmm6, %xmm4
+        addsd     %xmm3, %xmm0
+        movl      %edx, %ecx
+        andl      $255, %edx
+        addl      %edx, %edx
+        movapd    (%r11,%rdx,8), %xmm5
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        movapd    e_coeff(%rip), %xmm7
+        movapd    16+e_coeff(%rip), %xmm3
+        shll      $12, %ecx
+        xorl      %r8d, %ecx
+        andl      $-1048576, %ecx
+        movd      %rcx, %xmm6
+        addsd     %xmm4, %xmm2
+        movq      $0x3fe62e42fefa39ef, %r9
+        movd      %r9, %xmm1
+        pshufd    $68, %xmm2, %xmm0
+        pshufd    $68, %xmm2, %xmm4
+        mulsd     %xmm2, %xmm1
+        pshufd    $17, %xmm6, %xmm6
+        mulpd     %xmm0, %xmm0
+        mulpd     %xmm4, %xmm7
+        paddd     %xmm6, %xmm5
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        mulsd     %xmm0, %xmm0
+        addpd     %xmm7, %xmm3
+        addsd     %xmm6, %xmm1
+        mulpd     %xmm3, %xmm0
+        pshufd    $238, %xmm0, %xmm3
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        addl      $16, %eax
+        movl      $32752, %edx
+        andl      %eax, %edx
+        cmpl      $32752, %edx
+        je        .L_2TAG_PACKET_6.0.2
+        testl     $32768, %eax
+        jne       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_8.0.2:
+        movq      8(%rsp), %xmm0
+        movq      8(%rsp), %xmm3
+        movd      %xmm3, %edx
+        psrlq     $32, %xmm3
+        movd      %xmm3, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_9.0.2
+        xorpd     %xmm3, %xmm3
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm3
+        mulsd     %xmm3, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movq      %xmm0, %xmm3
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psrlq     $27, %xmm0
+        movq      LOG2_E(%rip), %xmm2
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        movapd    HIGHSIGMASK(%rip), %xmm6
+        psrlq     $12, %xmm3
+        mulss     %xmm7, %xmm0
+        movl      $-1024, %edx
+        movd      %edx, %xmm5
+        orpd      %xmm1, %xmm3
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm3, %xmm5
+        movl      $0, %r8d
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        andl      $32752, %eax
+        subl      $18416, %eax
+        sarl      $4, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_10.0.2:
+        movq      8(%rsp), %xmm0
+        movq      8(%rsp), %xmm3
+        movd      %xmm3, %edx
+        psrlq     $32, %xmm3
+        movd      %xmm3, %ecx
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_9.0.2
+        xorpd     %xmm3, %xmm3
+        movl      $18416, %eax
+        pinsrw    $3, %eax, %xmm3
+        mulsd     %xmm3, %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm2
+        movq      %xmm0, %xmm3
+        pextrw    $3, %xmm0, %eax
+        orpd      %xmm2, %xmm0
+        movl      $18416, %ecx
+        psrlq     $27, %xmm0
+        movq      LOG2_E(%rip), %xmm2
+        psrld     $2, %xmm0
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm3
+        movapd    HIGHSIGMASK(%rip), %xmm6
+        psrlq     $12, %xmm3
+        mulss     %xmm7, %xmm0
+        movl      $-1024, %edx
+        movd      %edx, %xmm5
+        orpd      %xmm1, %xmm3
+        paddd     %xmm4, %xmm0
+        psllq     $32, %xmm5
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm3, %xmm5
+        movl      $-2147483648, %r8d
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        andl      $32752, %eax
+        subl      $18416, %eax
+        sarl      $4, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        jmp       .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_11.0.2
+        cmpl      $736, %eax
+        jae       .L_2TAG_PACKET_12.0.2
+        addsd     %xmm7, %xmm0
+        movq      HALFMASK(%rip), %xmm2
+        addpd     %xmm0, %xmm3
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %eax
+        pinsrw    $3, %eax, %xmm6
+        pshufd    $238, %xmm3, %xmm0
+        addsd     %xmm3, %xmm0
+        movq      %xmm5, %xmm3
+        addsd     %xmm0, %xmm5
+        movq      %xmm2, %xmm4
+        subsd     %xmm5, %xmm3
+        movq      %xmm5, %xmm7
+        andpd     %xmm2, %xmm5
+        movq      %xmm1, %xmm2
+        andpd     %xmm1, %xmm4
+        subsd     %xmm5, %xmm7
+        addsd     %xmm3, %xmm0
+        subsd     %xmm4, %xmm1
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm7, %xmm0
+        mulsd     %xmm0, %xmm2
+        movq      %xmm6, %xmm7
+        mulsd     %xmm5, %xmm1
+        addsd     %xmm4, %xmm6
+        movd      %xmm6, %eax
+        subsd     %xmm7, %xmm6
+        lea       T_exp(%rip), %r11
+        addsd     %xmm1, %xmm2
+        movapd    e_coeff(%rip), %xmm7
+        movapd    16+e_coeff(%rip), %xmm3
+        subsd     %xmm6, %xmm4
+        pextrw    $3, %xmm6, %edx
+        movl      %eax, %ecx
+        andl      $255, %eax
+        addl      %eax, %eax
+        movapd    (%r11,%rax,8), %xmm5
+        addsd     %xmm4, %xmm2
+        sarl      $8, %ecx
+        movl      %ecx, %eax
+        sarl      $1, %ecx
+        subl      %ecx, %eax
+        shll      $20, %ecx
+        xorl      %r8d, %ecx
+        movd      %ecx, %xmm6
+        movq      32+e_coeff(%rip), %xmm1
+        andl      $32767, %edx
+        cmpl      $16529, %edx
+        ja        .L_2TAG_PACKET_12.0.2
+        pshufd    $68, %xmm2, %xmm0
+        pshufd    $68, %xmm2, %xmm4
+        mulpd     %xmm0, %xmm0
+        mulpd     %xmm4, %xmm7
+        pshufd    $17, %xmm6, %xmm6
+        mulsd     %xmm2, %xmm1
+        mulsd     %xmm0, %xmm0
+        paddd     %xmm6, %xmm5
+        addpd     %xmm7, %xmm3
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm5, %xmm6
+        mulpd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm3
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        shll      $4, %eax
+        xorpd     %xmm4, %xmm4
+        addl      $16368, %eax
+        pinsrw    $3, %eax, %xmm4
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm0
+        movq      %xmm0, %xmm1
+        addsd     %xmm5, %xmm0
+        mulsd     %xmm4, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        je        .L_2TAG_PACKET_13.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_14.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        movq      16(%rsp), %xmm1
+        movq      8(%rsp), %xmm0
+        movq      %xmm0, %xmm2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_15.0.2
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_16.0.2
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_16.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        movl      $29, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_18.0.2:
+        movq      16(%rsp), %xmm0
+        addpd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_15.0.2:
+        movd      %xmm1, %eax
+        movq      %xmm1, %xmm2
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_19.0.2
+        pextrw    $3, %xmm2, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        jne       .L_2TAG_PACKET_20.0.2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        jne       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_20.0.2:
+        pextrw    $3, %xmm0, %eax
+        testl     $32768, %eax
+        jne       .L_2TAG_PACKET_21.0.2
+        testl     $-2147483648, %ecx
+        jne       .L_2TAG_PACKET_22.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_23.0.2:
+        movq      16(%rsp), %xmm1
+        movd      %xmm1, %eax
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_24.0.2
+        testl     $2, %eax
+        jne       .L_2TAG_PACKET_25.0.2
+        jmp       .L_2TAG_PACKET_24.0.2
+.L_2TAG_PACKET_21.0.2:
+        shrl      $20, %ecx
+        andl      $2047, %ecx
+        cmpl      $1075, %ecx
+        ja        .L_2TAG_PACKET_24.0.2
+        je        .L_2TAG_PACKET_26.0.2
+        cmpl      $1074, %ecx
+        ja        .L_2TAG_PACKET_23.0.2
+        cmpl      $1023, %ecx
+        jb        .L_2TAG_PACKET_24.0.2
+        movq      16(%rsp), %xmm1
+        movl      $17208, %eax
+        xorpd     %xmm3, %xmm3
+        pinsrw    $3, %eax, %xmm3
+        movq      %xmm3, %xmm4
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        jne       .L_2TAG_PACKET_24.0.2
+        movd      %xmm3, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_24.0.2
+.L_2TAG_PACKET_25.0.2:
+        movq      16(%rsp), %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32768, %eax
+        jne       .L_2TAG_PACKET_27.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_27.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_24.0.2:
+        movq      16(%rsp), %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32768, %eax
+        jne       .L_2TAG_PACKET_22.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_26.0.2:
+        movq      16(%rsp), %xmm1
+        movd      %xmm1, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_24.0.2
+        jmp       .L_2TAG_PACKET_25.0.2
+.L_2TAG_PACKET_28.0.2:
+        movd      %xmm1, %eax
+        psrlq     $20, %xmm1
+        movd      %xmm1, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_29.0.2
+        movq      16(%rsp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_29.0.2:
+        movq      8(%rsp), %xmm0
+        pextrw    $3, %xmm0, %eax
+        cmpl      $49136, %eax
+        jne       .L_2TAG_PACKET_30.0.2
+        movd      %xmm0, %ecx
+        psrlq     $20, %xmm0
+        movd      %xmm0, %edx
+        orl       %edx, %ecx
+        jne       .L_2TAG_PACKET_30.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_30.0.2:
+        movq      16(%rsp), %xmm1
+        andl      $32752, %eax
+        subl      $16368, %eax
+        pextrw    $3, %xmm1, %edx
+        xorpd     %xmm0, %xmm0
+        xorl      %edx, %eax
+        andl      $32768, %eax
+        je        .L_2TAG_PACKET_31.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_31.0.2:
+        movl      $32752, %ecx
+        pinsrw    $3, %ecx, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_32.0.2:
+        movd      %xmm1, %eax
+        cmpl      $17184, %edx
+        ja        .L_2TAG_PACKET_33.0.2
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_34.0.2
+        testl     $2, %eax
+        je        .L_2TAG_PACKET_35.0.2
+        jmp       .L_2TAG_PACKET_36.0.2
+.L_2TAG_PACKET_33.0.2:
+        testl     $1, %eax
+        je        .L_2TAG_PACKET_35.0.2
+        jmp       .L_2TAG_PACKET_36.0.2
+.L_2TAG_PACKET_7.0.2:
+        movq      8(%rsp), %xmm2
+        movd      %xmm2, %eax
+        psrlq     $31, %xmm2
+        movd      %xmm2, %ecx
+        orl       %ecx, %eax
+        je        .L_2TAG_PACKET_9.0.2
+        movq      16(%rsp), %xmm1
+        pextrw    $3, %xmm1, %edx
+        movd      %xmm1, %eax
+        movq      %xmm1, %xmm2
+        psrlq     $32, %xmm2
+        movd      %xmm2, %ecx
+        addl      %ecx, %ecx
+        orl       %eax, %ecx
+        je        .L_2TAG_PACKET_37.0.2
+        andl      $32752, %edx
+        cmpl      $32752, %edx
+        je        .L_2TAG_PACKET_28.0.2
+        cmpl      $17200, %edx
+        ja        .L_2TAG_PACKET_35.0.2
+        cmpl      $17184, %edx
+        jae       .L_2TAG_PACKET_32.0.2
+        cmpl      $16368, %edx
+        jb        .L_2TAG_PACKET_34.0.2
+        movl      $17208, %eax
+        xorpd     %xmm2, %xmm2
+        pinsrw    $3, %eax, %xmm2
+        movq      %xmm2, %xmm4
+        addsd     %xmm1, %xmm2
+        subsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32767, %eax
+        jne       .L_2TAG_PACKET_34.0.2
+        movd      %xmm2, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_35.0.2
+.L_2TAG_PACKET_36.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm1
+        movq      LOG2_E(%rip), %xmm2
+        movq      8(%rsp), %xmm4
+        pextrw    $3, %xmm4, %eax
+        movl      $8192, %edx
+        movd      %edx, %xmm4
+        andl      $32767, %eax
+        subl      $16, %eax
+        jl        .L_2TAG_PACKET_10.0.2
+        movl      %eax, %edx
+        andl      $32752, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        movl      $-2147483648, %r8d
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_34.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        xorpd     %xmm0, %xmm0
+        mulsd     %xmm1, %xmm0
+        movl      $28, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_35.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $30704, %edx
+        pinsrw    $3, %edx, %xmm1
+        movq      LOG2_E(%rip), %xmm2
+        movq      8(%rsp), %xmm4
+        pextrw    $3, %xmm4, %eax
+        movl      $8192, %edx
+        movd      %edx, %xmm4
+        andl      $32767, %eax
+        subl      $16, %eax
+        jl        .L_2TAG_PACKET_8.0.2
+        movl      %eax, %edx
+        andl      $32752, %edx
+        subl      $16368, %edx
+        movl      %edx, %ecx
+        sarl      $31, %edx
+        addl      %edx, %ecx
+        xorl      %edx, %ecx
+        addl      $16, %ecx
+        bsr       %ecx, %ecx
+        movl      $0, %r8d
+        jmp       .L_2TAG_PACKET_1.0.2
+.L_2TAG_PACKET_19.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_22.0.2:
+        xorpd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_11.0.2:
+        addl      $384, %eax
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_38.0.2
+        mulsd     %xmm1, %xmm5
+        addsd     %xmm7, %xmm0
+        shrl      $31, %r8d
+        addpd     %xmm0, %xmm3
+        pshufd    $238, %xmm3, %xmm0
+        addsd     %xmm0, %xmm3
+        lea       log2(%rip), %r11
+        movq      (%r11,%r8,8), %xmm4
+        mulsd     %xmm3, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        shll      $15, %r8d
+        orl       %r8d, %eax
+        pinsrw    $3, %eax, %xmm0
+        addsd     %xmm1, %xmm5
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_38.0.2:
+.L_2TAG_PACKET_37.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_39.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm0
+        movl      $26, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_9.0.2:
+        movq      16(%rsp), %xmm1
+        movq      %xmm1, %xmm2
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        jne       .L_2TAG_PACKET_40.0.2
+        movd      %xmm2, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %edx
+        orl       %edx, %eax
+        jne       .L_2TAG_PACKET_18.0.2
+.L_2TAG_PACKET_40.0.2:
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        movl      %edx, %ecx
+        addl      %edx, %edx
+        orl       %edx, %eax
+        je        .L_2TAG_PACKET_39.0.2
+        shrl      $21, %edx
+        cmpl      $1075, %edx
+        ja        .L_2TAG_PACKET_41.0.2
+        je        .L_2TAG_PACKET_42.0.2
+        cmpl      $1023, %edx
+        jb        .L_2TAG_PACKET_41.0.2
+        movq      16(%rsp), %xmm1
+        movl      $17208, %eax
+        xorpd     %xmm3, %xmm3
+        pinsrw    $3, %eax, %xmm3
+        movq      %xmm3, %xmm4
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        pextrw    $3, %xmm1, %eax
+        andl      $32752, %eax
+        jne       .L_2TAG_PACKET_41.0.2
+        movd      %xmm3, %eax
+        andl      $1, %eax
+        je        .L_2TAG_PACKET_41.0.2
+.L_2TAG_PACKET_43.0.2:
+        movq      8(%rsp), %xmm0
+        testl     $-2147483648, %ecx
+        jne       .L_2TAG_PACKET_44.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_42.0.2:
+        movq      16(%rsp), %xmm1
+        movd      %xmm1, %eax
+        testl     $1, %eax
+        jne       .L_2TAG_PACKET_43.0.2
+.L_2TAG_PACKET_41.0.2:
+        testl     $-2147483648, %ecx
+        je        .L_2TAG_PACKET_22.0.2
+        xorpd     %xmm0, %xmm0
+.L_2TAG_PACKET_44.0.2:
+        movl      $16368, %eax
+        xorpd     %xmm1, %xmm1
+        pinsrw    $3, %eax, %xmm1
+        divsd     %xmm0, %xmm1
+        movq      %xmm1, %xmm0
+        movl      $27, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_12.0.2:
+        movq      8(%rsp), %xmm2
+        movq      16(%rsp), %xmm6
+        pextrw    $3, %xmm2, %eax
+        pextrw    $3, %xmm6, %edx
+        movl      $32752, %ecx
+        andl      %edx, %ecx
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_45.0.2
+        andl      $32752, %eax
+        subl      $16368, %eax
+        xorl      %eax, %edx
+        testl     $32768, %edx
+        jne       .L_2TAG_PACKET_46.0.2
+.L_2TAG_PACKET_47.0.2:
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        shrl      $16, %r8d
+        orl       %r8d, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+.L_2TAG_PACKET_14.0.2:
+        movl      $24, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_46.0.2:
+        movl      $16, %eax
+        pinsrw    $3, %eax, %xmm0
+        mulsd     %xmm0, %xmm0
+        testl     $-2147483648, %r8d
+        je        .L_2TAG_PACKET_48.0.2
+        movq      $0x8000000000000000, %r9
+        movd      %r9, %xmm2
+        xorpd     %xmm2, %xmm0
+.L_2TAG_PACKET_48.0.2:
+        movl      $25, (%rsp)
+        jmp       .L_2TAG_PACKET_17.0.2
+.L_2TAG_PACKET_13.0.2:
+        pextrw    $3, %xmm5, %ecx
+        pextrw    $3, %xmm4, %edx
+        movl      $-1, %eax
+        andl      $32752, %ecx
+        subl      $16368, %ecx
+        andl      $32752, %edx
+        addl      %ecx, %edx
+        movl      $-31, %ecx
+        sarl      $4, %edx
+        subl      %edx, %ecx
+        jle       .L_2TAG_PACKET_49.0.2
+        cmpl      $20, %ecx
+        ja        .L_2TAG_PACKET_50.0.2
+        shll      %cl, %eax
+.L_2TAG_PACKET_49.0.2:
+        movd      %eax, %xmm0
+        psllq     $32, %xmm0
+        andpd     %xmm5, %xmm0
+        subsd     %xmm0, %xmm5
+        addsd     %xmm1, %xmm5
+        mulsd     %xmm4, %xmm0
+        mulsd     %xmm4, %xmm5
+        addsd     %xmm5, %xmm0
+.L_2TAG_PACKET_50.0.2:
+        jmp       .L_2TAG_PACKET_48.0.2
+.L_2TAG_PACKET_2.0.2:
+        movw      22(%rsp), %cx
+        movl      $-2147483648, %edx
+        movd      %rdx, %xmm1
+        xorpd     %xmm7, %xmm7
+        paddd     %xmm4, %xmm0
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        paddq     %xmm3, %xmm1
+        andpd     %xmm1, %xmm5
+        andw      $32752, %cx
+        cmpw      $16560, %cx
+        jb        .L_2TAG_PACKET_3.0.2
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm3
+        addl      $16351, %eax
+        shrl      $4, %eax
+        subl      $1022, %eax
+        cvtsi2sd  %eax, %xmm7
+        mulpd     %xmm0, %xmm5
+        lea       L_tbl(%rip), %r11
+        movq      coeff_h(%rip), %xmm4
+        mulsd     %xmm0, %xmm3
+        movq      coeff_h(%rip), %xmm6
+        subsd     %xmm2, %xmm5
+        movq      8+coeff_h(%rip), %xmm1
+        pshufd    $68, %xmm3, %xmm2
+        unpcklpd  %xmm3, %xmm5
+        addsd     %xmm5, %xmm3
+        movq      8+coeff_h(%rip), %xmm0
+        andl      $16760832, %edx
+        shrl      $10, %edx
+        addpd     -3648(%r11,%rdx), %xmm7
+        mulsd     %xmm5, %xmm4
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm1
+        movq      %xmm5, %xmm2
+        mulsd     %xmm5, %xmm4
+        addsd     %xmm0, %xmm5
+        movq      %xmm7, %xmm0
+        addsd     %xmm3, %xmm2
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm2, %xmm6
+        subsd     %xmm7, %xmm0
+        movq      %xmm7, %xmm2
+        addsd     %xmm4, %xmm7
+        addsd     %xmm5, %xmm0
+        subsd     %xmm7, %xmm2
+        addsd     %xmm2, %xmm4
+        pshufd    $238, %xmm5, %xmm2
+        movq      %xmm7, %xmm5
+        addsd     %xmm2, %xmm7
+        addsd     %xmm0, %xmm4
+        movapd    coeff(%rip), %xmm0
+        subsd     %xmm7, %xmm5
+        addsd     %xmm4, %xmm6
+        movq      %xmm7, %xmm4
+        addsd     %xmm2, %xmm5
+        addsd     %xmm1, %xmm7
+        movapd    64+coeff(%rip), %xmm2
+        subsd     %xmm7, %xmm4
+        addsd     %xmm5, %xmm6
+        addsd     %xmm1, %xmm4
+        pshufd    $238, %xmm7, %xmm5
+        movapd    %xmm7, %xmm1
+        addsd     %xmm5, %xmm7
+        subsd     %xmm7, %xmm1
+        addsd     %xmm5, %xmm1
+        movapd    80+coeff(%rip), %xmm5
+        pshufd    $68, %xmm3, %xmm3
+        addsd     %xmm4, %xmm6
+        addsd     %xmm1, %xmm6
+        movapd    32+coeff(%rip), %xmm1
+        mulpd     %xmm3, %xmm0
+        mulpd     %xmm3, %xmm2
+        pshufd    $68, %xmm3, %xmm4
+        mulpd     %xmm3, %xmm3
+        addpd     %xmm1, %xmm0
+        addpd     %xmm2, %xmm5
+        mulsd     %xmm3, %xmm4
+        movq      HIGHMASK_LOG_X(%rip), %xmm2
+        mulpd     %xmm3, %xmm3
+        movq      16(%rsp), %xmm1
+        movw      22(%rsp), %cx
+        mulpd     %xmm4, %xmm0
+        pextrw    $3, %xmm7, %eax
+        mulpd     %xmm4, %xmm5
+        mulpd     %xmm3, %xmm0
+        movq      8+HIGHMASK_Y(%rip), %xmm4
+        andpd     %xmm7, %xmm2
+        addsd     %xmm6, %xmm5
+        subsd     %xmm2, %xmm7
+        addpd     %xmm0, %xmm5
+        andl      $32752, %eax
+        subl      $16368, %eax
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        je        .L_2TAG_PACKET_45.0.2
+        addl      %eax, %ecx
+        cmpl      $16576, %ecx
+        jae       .L_2TAG_PACKET_51.0.2
+        pshufd    $238, %xmm5, %xmm0
+        andpd     %xmm1, %xmm4
+        movq      %xmm1, %xmm3
+        addsd     %xmm0, %xmm5
+        subsd     %xmm4, %xmm1
+        xorpd     %xmm6, %xmm6
+        movl      $17080, %edx
+        pinsrw    $3, %edx, %xmm6
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm1
+        movq      %xmm6, %xmm5
+        mulsd     %xmm7, %xmm3
+        addsd     %xmm4, %xmm6
+        addsd     %xmm3, %xmm1
+        movapd    e_coeff(%rip), %xmm7
+        movd      %xmm6, %edx
+        subsd     %xmm5, %xmm6
+        lea       T_exp(%rip), %r11
+        movapd    16+e_coeff(%rip), %xmm3
+        movq      32+e_coeff(%rip), %xmm2
+        subsd     %xmm6, %xmm4
+        movl      %edx, %ecx
+        andl      $255, %edx
+        addl      %edx, %edx
+        movapd    (%r11,%rdx,8), %xmm5
+        addsd     %xmm1, %xmm4
+        pextrw    $3, %xmm6, %edx
+        shrl      $8, %ecx
+        movl      %ecx, %eax
+        shrl      $1, %ecx
+        subl      %ecx, %eax
+        shll      $20, %ecx
+        movd      %ecx, %xmm6
+        pshufd    $68, %xmm4, %xmm0
+        pshufd    $68, %xmm4, %xmm1
+        mulpd     %xmm0, %xmm0
+        mulpd     %xmm1, %xmm7
+        pshufd    $17, %xmm6, %xmm6
+        mulsd     %xmm4, %xmm2
+        andl      $32767, %edx
+        cmpl      $16529, %edx
+        ja        .L_2TAG_PACKET_12.0.2
+        mulsd     %xmm0, %xmm0
+        paddd     %xmm6, %xmm5
+        addpd     %xmm7, %xmm3
+        mulsd     %xmm5, %xmm2
+        pshufd    $238, %xmm5, %xmm6
+        mulpd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm2
+        pshufd    $238, %xmm0, %xmm3
+        addl      $1023, %eax
+        shll      $20, %eax
+        orl       %r8d, %eax
+        movd      %eax, %xmm4
+        mulsd     %xmm5, %xmm0
+        mulsd     %xmm5, %xmm3
+        addsd     %xmm2, %xmm0
+        psllq     $32, %xmm4
+        addsd     %xmm3, %xmm0
+        movq      %xmm0, %xmm1
+        addsd     %xmm5, %xmm0
+        mulsd     %xmm4, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        je        .L_2TAG_PACKET_13.0.2
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_14.0.2
+.L_2TAG_PACKET_52.0.2:
+        jmp       ..B1.5
+.L_2TAG_PACKET_45.0.2:
+        movq      8(%rsp), %xmm0
+        xorpd     %xmm2, %xmm2
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm2
+        addsd     %xmm0, %xmm2
+        pextrw    $3, %xmm2, %eax
+        cmpl      $0, %eax
+        jne       .L_2TAG_PACKET_53.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_53.0.2:
+        movq      16(%rsp), %xmm1
+        movd      %xmm1, %edx
+        movq      %xmm1, %xmm3
+        psrlq     $20, %xmm3
+        movd      %xmm3, %ecx
+        orl       %edx, %ecx
+        je        .L_2TAG_PACKET_54.0.2
+        addsd     %xmm1, %xmm1
+        movq      %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_51.0.2:
+        pextrw    $3, %xmm1, %eax
+        pextrw    $3, %xmm2, %ecx
+        xorl      %ecx, %eax
+        testl     $32768, %eax
+        je        .L_2TAG_PACKET_47.0.2
+        jmp       .L_2TAG_PACKET_46.0.2
+.L_2TAG_PACKET_54.0.2:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        pextrw    $3, %xmm1, %edx
+        xorpd     %xmm0, %xmm0
+        subl      $16368, %eax
+        xorl      %edx, %eax
+        testl     $32768, %eax
+        je        .L_2TAG_PACKET_55.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_55.0.2:
+        movl      $32752, %edx
+        pinsrw    $3, %edx, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_17.0.2:
+        movq      %xmm0, 24(%rsp)
+..B1.3:
+        movq      24(%rsp), %xmm0
+.L_2TAG_PACKET_56.0.2:
+..B1.5:
+        addq      $40, %rsp
+..___tag_value_pow.4:
+        ret       
+..___tag_value_pow.5:
+END(pow)
+# -- End  pow
+	.section .rodata, "a"
+	.align 16
+	.align 16
+HIGHSIGMASK:
+	.long	0
+	.long	4294965248
+	.long	0
+	.long	4294965248
+	.type	HIGHSIGMASK,@object
+	.size	HIGHSIGMASK,16
+	.align 16
+LOG2_E:
+	.long	0
+	.long	1073160192
+	.long	370913857
+	.long	3210587105
+	.type	LOG2_E,@object
+	.size	LOG2_E,16
+	.align 16
+coeff:
+	.long	1841914130
+	.long	3213059448
+	.long	3995341938
+	.long	3214607105
+	.long	2677381210
+	.long	3216320731
+	.long	3011779882
+	.long	3218479542
+	.long	1367832035
+	.long	1066403058
+	.long	2894285243
+	.long	1067936923
+	.long	1215221452
+	.long	1069835102
+	.long	370913857
+	.long	3210587105
+	.long	2677381210
+	.long	3216320731
+	.long	4172642429
+	.long	1056068382
+	.long	1215221451
+	.long	1069835102
+	.long	1092638156
+	.long	3184925618
+	.type	coeff,@object
+	.size	coeff,96
+	.align 16
+L_tbl:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	536870912
+	.long	1072689162
+	.long	2523013013
+	.long	1046157398
+	.long	3758096384
+	.long	1072685081
+	.long	3851513758
+	.long	3190968952
+	.long	0
+	.long	1072681007
+	.long	2241466466
+	.long	1046044599
+	.long	3221225472
+	.long	1072676937
+	.long	2990928271
+	.long	3193084984
+	.long	3758096384
+	.long	1072672873
+	.long	2905112743
+	.long	3192918576
+	.long	1610612736
+	.long	1072668815
+	.long	3370591264
+	.long	1046051793
+	.long	2147483648
+	.long	1072664762
+	.long	3272361216
+	.long	3193793653
+	.long	3758096384
+	.long	1072660714
+	.long	46546755
+	.long	1043206936
+	.long	3221225472
+	.long	1072656672
+	.long	3017067724
+	.long	3192177962
+	.long	0
+	.long	1072652636
+	.long	3688436631
+	.long	3192814956
+	.long	2684354560
+	.long	1072648604
+	.long	1707461992
+	.long	3193056712
+	.long	2684354560
+	.long	1072644578
+	.long	1188114540
+	.long	3193603086
+	.long	3758096384
+	.long	1072640557
+	.long	3533180564
+	.long	1045459375
+	.long	2684354560
+	.long	1072636542
+	.long	2000337630
+	.long	3193475557
+	.long	2684354560
+	.long	1072632532
+	.long	3698062443
+	.long	3193752766
+	.long	3758096384
+	.long	1072628527
+	.long	3161606138
+	.long	3190532995
+	.long	2147483648
+	.long	1072624528
+	.long	3165265478
+	.long	3193158459
+	.long	1610612736
+	.long	1072620534
+	.long	1600940077
+	.long	3193226777
+	.long	2147483648
+	.long	1072616545
+	.long	1363272552
+	.long	3192614278
+	.long	3758096384
+	.long	1072612561
+	.long	3966209910
+	.long	3191249654
+	.long	2147483648
+	.long	1072608583
+	.long	1093672789
+	.long	3190637330
+	.long	1610612736
+	.long	1072604610
+	.long	1735239357
+	.long	3192753616
+	.long	1610612736
+	.long	1072600642
+	.long	1470665156
+	.long	1045559697
+	.long	2684354560
+	.long	1072596679
+	.long	3840624926
+	.long	1045928953
+	.long	536870912
+	.long	1072592722
+	.long	4259072556
+	.long	3191035622
+	.long	3221225472
+	.long	1072588769
+	.long	3613088753
+	.long	3192165681
+	.long	2147483648
+	.long	1072584822
+	.long	3175234446
+	.long	1039486948
+	.long	1610612736
+	.long	1072580880
+	.long	856576441
+	.long	1045702812
+	.long	2147483648
+	.long	1072576943
+	.long	2253498719
+	.long	3193285334
+	.long	2684354560
+	.long	1072573011
+	.long	1587070728
+	.long	3190801577
+	.long	3758096384
+	.long	1072569084
+	.long	159986317
+	.long	1042519436
+	.long	1073741824
+	.long	1072565163
+	.long	3999541949
+	.long	3192020440
+	.long	2684354560
+	.long	1072561246
+	.long	3281310262
+	.long	1045586786
+	.long	536870912
+	.long	1072557335
+	.long	3775179406
+	.long	1045226055
+	.long	3221225472
+	.long	1072553428
+	.long	643472356
+	.long	3193681786
+	.long	1073741824
+	.long	1072549527
+	.long	248169775
+	.long	1045068977
+	.long	3758096384
+	.long	1072545630
+	.long	307016632
+	.long	1042640932
+	.long	2147483648
+	.long	1072541739
+	.long	3872718526
+	.long	3189781486
+	.long	536870912
+	.long	1072537853
+	.long	969711630
+	.long	3191724732
+	.long	3221225472
+	.long	1072533971
+	.long	4018820394
+	.long	3193189264
+	.long	1073741824
+	.long	1072530095
+	.long	3102233092
+	.long	1045510224
+	.long	3758096384
+	.long	1072526223
+	.long	1029307912
+	.long	3193812776
+	.long	1073741824
+	.long	1072522357
+	.long	984083153
+	.long	1045987403
+	.long	3221225472
+	.long	1072518495
+	.long	4171455401
+	.long	3193084080
+	.long	0
+	.long	1072514639
+	.long	2592660757
+	.long	1046121691
+	.long	1073741824
+	.long	1072510787
+	.long	2964365712
+	.long	1046054453
+	.long	2147483648
+	.long	1072506940
+	.long	3792777877
+	.long	3193704729
+	.long	2147483648
+	.long	1072503098
+	.long	2948536104
+	.long	3192467100
+	.long	1610612736
+	.long	1072499261
+	.long	3836005619
+	.long	1041873166
+	.long	536870912
+	.long	1072495429
+	.long	3124543160
+	.long	1044409168
+	.long	3221225472
+	.long	1072491601
+	.long	286227933
+	.long	1041065990
+	.long	1073741824
+	.long	1072487779
+	.long	2111296776
+	.long	3193604419
+	.long	2147483648
+	.long	1072483961
+	.long	2606822001
+	.long	3192940394
+	.long	2147483648
+	.long	1072480148
+	.long	194696800
+	.long	1046026063
+	.long	1610612736
+	.long	1072476340
+	.long	8535452
+	.long	1046200178
+	.long	536870912
+	.long	1072472537
+	.long	950463625
+	.long	3192731897
+	.long	2147483648
+	.long	1072468738
+	.long	973831566
+	.long	1045683197
+	.long	3221225472
+	.long	1072464944
+	.long	3330435892
+	.long	3190277577
+	.long	3221225472
+	.long	1072461155
+	.long	208692097
+	.long	3193517651
+	.long	1610612736
+	.long	1072457371
+	.long	2113097415
+	.long	1044781749
+	.long	3758096384
+	.long	1072453591
+	.long	1088808936
+	.long	3193716142
+	.long	0
+	.long	1072449817
+	.long	1443002127
+	.long	3193250205
+	.long	3221225472
+	.long	1072446046
+	.long	3967357419
+	.long	1046109477
+	.long	1610612736
+	.long	1072442281
+	.long	3013517861
+	.long	3193159691
+	.long	2147483648
+	.long	1072438520
+	.long	2524586286
+	.long	1046121951
+	.long	1610612736
+	.long	1072434764
+	.long	1476892861
+	.long	1046434731
+	.long	0
+	.long	1072431013
+	.long	3089640950
+	.long	3192305780
+	.long	536870912
+	.long	1072427266
+	.long	3812255529
+	.long	1045730879
+	.long	0
+	.long	1072423524
+	.long	995354762
+	.long	3191528673
+	.long	1610612736
+	.long	1072419786
+	.long	3260567684
+	.long	1046273695
+	.long	2147483648
+	.long	1072416053
+	.long	2738210286
+	.long	3191471516
+	.long	536870912
+	.long	1072412325
+	.long	1931849805
+	.long	1044560405
+	.long	1610612736
+	.long	1072408601
+	.long	358896655
+	.long	1044029237
+	.long	1073741824
+	.long	1072404882
+	.long	2214589842
+	.long	3193202126
+	.long	2684354560
+	.long	1072401167
+	.long	3118097363
+	.long	3192592906
+	.long	2147483648
+	.long	1072397457
+	.long	1835998884
+	.long	1045788247
+	.long	0
+	.long	1072393752
+	.long	1585488319
+	.long	1045289910
+	.long	0
+	.long	1072390051
+	.long	480160949
+	.long	1046030455
+	.long	2684354560
+	.long	1072386354
+	.long	1832959667
+	.long	3193013644
+	.long	2684354560
+	.long	1072382662
+	.long	3611346555
+	.long	1044544210
+	.long	1073741824
+	.long	1072378975
+	.long	2749418734
+	.long	3193712580
+	.long	1073741824
+	.long	1072375292
+	.long	2390043472
+	.long	3191710658
+	.long	3221225472
+	.long	1072371613
+	.long	2828199902
+	.long	1042265217
+	.long	3221225472
+	.long	1072367939
+	.long	569209321
+	.long	3191230982
+	.long	536870912
+	.long	1072364270
+	.long	236159139
+	.long	1046240123
+	.long	536870912
+	.long	1072360605
+	.long	1010656270
+	.long	3193813968
+	.long	1610612736
+	.long	1072356944
+	.long	2409080597
+	.long	1044025029
+	.long	536870912
+	.long	1072353288
+	.long	598419513
+	.long	1043327370
+	.long	1073741824
+	.long	1072349636
+	.long	4105950479
+	.long	1045747958
+	.long	3758096384
+	.long	1072345988
+	.long	343243853
+	.long	3192420172
+	.long	3221225472
+	.long	1072342345
+	.long	2088439530
+	.long	1046172091
+	.long	536870912
+	.long	1072338707
+	.long	4117721107
+	.long	1043882496
+	.long	3758096384
+	.long	1072335072
+	.long	3192032958
+	.long	3192998645
+	.long	3758096384
+	.long	1072331442
+	.long	2366522518
+	.long	1045401957
+	.long	1610612736
+	.long	1072327817
+	.long	3685533141
+	.long	3193701947
+	.long	536870912
+	.long	1072324196
+	.long	1058658672
+	.long	3193572492
+	.long	536870912
+	.long	1072320579
+	.long	166346347
+	.long	1045456348
+	.long	2147483648
+	.long	1072316966
+	.long	2027889772
+	.long	1046349302
+	.long	1073741824
+	.long	1072313358
+	.long	1079497888
+	.long	1044585259
+	.long	1073741824
+	.long	1072309754
+	.long	2189851573
+	.long	1045132990
+	.long	2684354560
+	.long	1072306154
+	.long	2486629386
+	.long	3193613625
+	.long	536870912
+	.long	1072302559
+	.long	1263686579
+	.long	1044789259
+	.long	0
+	.long	1072298968
+	.long	2412061798
+	.long	3191369627
+	.long	536870912
+	.long	1072295381
+	.long	584315716
+	.long	3193144135
+	.long	1610612736
+	.long	1072291798
+	.long	449000738
+	.long	1046330451
+	.long	0
+	.long	1072288220
+	.long	3938320157
+	.long	1044446220
+	.long	3758096384
+	.long	1072284645
+	.long	2949844595
+	.long	3193462371
+	.long	3758096384
+	.long	1072281075
+	.long	2771329642
+	.long	3192121593
+	.long	536870912
+	.long	1072277510
+	.long	3971508621
+	.long	3193002806
+	.long	2147483648
+	.long	1072273948
+	.long	4071942301
+	.long	1044952619
+	.long	536870912
+	.long	1072270391
+	.long	2090502395
+	.long	1044660556
+	.long	0
+	.long	1072266838
+	.long	3657520961
+	.long	3193770938
+	.long	3758096384
+	.long	1072263288
+	.long	1608175110
+	.long	1045543239
+	.long	0
+	.long	1072259744
+	.long	2506924180
+	.long	1045530501
+	.long	1073741824
+	.long	1072256203
+	.long	18238493
+	.long	1046305623
+	.long	3221225472
+	.long	1072252666
+	.long	3862640487
+	.long	3192882407
+	.long	1073741824
+	.long	1072249134
+	.long	3850158761
+	.long	1043656099
+	.long	3758096384
+	.long	1072245605
+	.long	2356524356
+	.long	1045915296
+	.long	3221225472
+	.long	1072242081
+	.long	936497287
+	.long	3193842353
+	.long	2147483648
+	.long	1072238561
+	.long	2840845344
+	.long	1046454771
+	.long	2147483648
+	.long	1072235045
+	.long	3688100713
+	.long	1044895451
+	.long	2684354560
+	.long	1072231533
+	.long	479979913
+	.long	3193842442
+	.long	2684354560
+	.long	1072228025
+	.long	1016321898
+	.long	1046251032
+	.long	3758096384
+	.long	1072224521
+	.long	562232474
+	.long	3191974558
+	.long	536870912
+	.long	1072221022
+	.long	3870512029
+	.long	3193113881
+	.long	1610612736
+	.long	1072217526
+	.long	1239780547
+	.long	3191583604
+	.long	2684354560
+	.long	1072214034
+	.long	2815421327
+	.long	1045873682
+	.long	0
+	.long	1072210547
+	.long	2371009561
+	.long	1041508792
+	.long	1610612736
+	.long	1072207063
+	.long	1304636524
+	.long	3192414284
+	.long	3221225472
+	.long	1072203583
+	.long	210144854
+	.long	3193327333
+	.long	0
+	.long	1072200108
+	.long	1454303272
+	.long	1046360024
+	.long	1610612736
+	.long	1072196636
+	.long	2095757548
+	.long	1044984677
+	.long	3221225472
+	.long	1072193168
+	.long	2027215580
+	.long	3192880933
+	.long	0
+	.long	1072189705
+	.long	214794880
+	.long	1043457954
+	.long	1073741824
+	.long	1072186245
+	.long	884624917
+	.long	1043497079
+	.long	2147483648
+	.long	1072182789
+	.long	2792396634
+	.long	3193171685
+	.long	2684354560
+	.long	1072179337
+	.long	4128995250
+	.long	3192103434
+	.long	2684354560
+	.long	1072175889
+	.long	333866043
+	.long	1046372325
+	.long	3221225472
+	.long	1072172445
+	.long	2194445544
+	.long	3193958905
+	.long	2684354560
+	.long	1072169005
+	.long	2316082269
+	.long	3192041703
+	.long	1610612736
+	.long	1072165569
+	.long	581005057
+	.long	1046322848
+	.long	536870912
+	.long	1072162137
+	.long	3280786513
+	.long	1045457251
+	.long	3221225472
+	.long	1072158708
+	.long	2567093361
+	.long	1044710359
+	.long	1073741824
+	.long	1072155284
+	.long	3740443584
+	.long	1044224237
+	.long	2684354560
+	.long	1072151863
+	.long	3981028272
+	.long	1042596351
+	.long	3758096384
+	.long	1072148446
+	.long	3820011120
+	.long	3191915623
+	.long	0
+	.long	1072145034
+	.long	2946439484
+	.long	3193831276
+	.long	3758096384
+	.long	1072141624
+	.long	3075274422
+	.long	3190132432
+	.long	2684354560
+	.long	1072138219
+	.long	496052167
+	.long	1043619760
+	.long	1073741824
+	.long	1072134818
+	.long	271106589
+	.long	3192265149
+	.long	2684354560
+	.long	1072131420
+	.long	2091955684
+	.long	1044443554
+	.long	3758096384
+	.long	1072128026
+	.long	723240109
+	.long	3191007419
+	.long	3758096384
+	.long	1072124636
+	.long	1748629070
+	.long	1044510075
+	.long	3221225472
+	.long	1072121250
+	.long	3289522046
+	.long	3193095178
+	.long	1610612736
+	.long	1072117868
+	.long	3599052146
+	.long	3193720427
+	.long	3221225472
+	.long	1072114489
+	.long	2446758135
+	.long	3193436303
+	.long	3758096384
+	.long	1072111114
+	.long	1652171097
+	.long	3192137173
+	.long	3221225472
+	.long	1072107743
+	.long	1353007155
+	.long	1044523902
+	.long	1610612736
+	.long	1072104376
+	.long	990601105
+	.long	1046296663
+	.long	3758096384
+	.long	1072101012
+	.long	2228627618
+	.long	3193041040
+	.long	0
+	.long	1072097653
+	.long	812484756
+	.long	3191950723
+	.long	3758096384
+	.long	1072094296
+	.long	817833130
+	.long	3192279242
+	.long	2147483648
+	.long	1072090944
+	.long	3563228521
+	.long	3193810951
+	.long	3221225472
+	.long	1072087595
+	.long	2729108859
+	.long	3190936185
+	.long	3221225472
+	.long	1072084250
+	.long	2249121662
+	.long	3190639690
+	.long	2147483648
+	.long	1072080909
+	.long	4082471745
+	.long	3193929368
+	.long	3758096384
+	.long	1072077571
+	.long	2827323806
+	.long	3193708561
+	.long	3758096384
+	.long	1072074237
+	.long	735866167
+	.long	1042434690
+	.long	2684354560
+	.long	1072070907
+	.long	3240808889
+	.long	3191918422
+	.long	0
+	.long	1072067581
+	.long	466482777
+	.long	3186962221
+	.long	0
+	.long	1072064258
+	.long	1576076296
+	.long	1045849056
+	.long	3221225472
+	.long	1072060938
+	.long	2751923560
+	.long	3191910703
+	.long	0
+	.long	1072057623
+	.long	1908755527
+	.long	1046437515
+	.long	0
+	.long	1072054311
+	.long	3175841411
+	.long	1044572886
+	.long	2684354560
+	.long	1072051002
+	.long	1633258450
+	.long	3192670420
+	.long	3221225472
+	.long	1072047697
+	.long	1867746657
+	.long	1045726209
+	.long	2684354560
+	.long	1072044396
+	.long	338968864
+	.long	3193084662
+	.long	0
+	.long	1072041099
+	.long	1501742471
+	.long	3191742031
+	.long	0
+	.long	1072037805
+	.long	4266775786
+	.long	3192686970
+	.long	2147483648
+	.long	1072034514
+	.long	4249283553
+	.long	1045769728
+	.long	2684354560
+	.long	1072031227
+	.long	2758366873
+	.long	1046402161
+	.long	1610612736
+	.long	1072027944
+	.long	2161186990
+	.long	1044736865
+	.long	2684354560
+	.long	1072024664
+	.long	810300171
+	.long	1045748777
+	.long	2147483648
+	.long	1072021388
+	.long	183688927
+	.long	3191515581
+	.long	3758096384
+	.long	1072018115
+	.long	368874072
+	.long	3192363575
+	.long	3221225472
+	.long	1072014846
+	.long	2459092970
+	.long	1041794640
+	.long	536870912
+	.long	1072011581
+	.long	867488640
+	.long	1046310291
+	.long	536870912
+	.long	1072008319
+	.long	50140871
+	.long	1043327329
+	.long	2684354560
+	.long	1072005060
+	.long	1241902518
+	.long	3192739252
+	.long	2684354560
+	.long	1072001805
+	.long	1027881659
+	.long	3193858388
+	.long	0
+	.long	1071998554
+	.long	38457322
+	.long	1045489179
+	.long	0
+	.long	1071995306
+	.long	3432963337
+	.long	3190969347
+	.long	1610612736
+	.long	1071992061
+	.long	534931792
+	.long	1046302734
+	.long	1610612736
+	.long	1071988820
+	.long	1817895268
+	.long	3192551860
+	.long	3221225472
+	.long	1071985582
+	.long	357237383
+	.long	3191870833
+	.long	2684354560
+	.long	1071982348
+	.long	108262401
+	.long	3193365867
+	.long	3758096384
+	.long	1071979117
+	.long	1964729244
+	.long	1042502249
+	.long	2684354560
+	.long	1071975890
+	.long	2088446957
+	.long	1038010503
+	.long	3221225472
+	.long	1071972666
+	.long	2947239447
+	.long	1046377845
+	.long	1610612736
+	.long	1071969446
+	.long	774932072
+	.long	1046064854
+	.long	2147483648
+	.long	1071966229
+	.long	4080937590
+	.long	3193041284
+	.long	3758096384
+	.long	1071963015
+	.long	2208251454
+	.long	1045945089
+	.long	3221225472
+	.long	1071959805
+	.long	2850924475
+	.long	1045650959
+	.long	0
+	.long	1071956599
+	.long	714040997
+	.long	1046275153
+	.long	3221225472
+	.long	1071953395
+	.long	85533782
+	.long	3192816920
+	.long	3221225472
+	.long	1071950195
+	.long	1252511005
+	.long	1044805706
+	.long	1073741824
+	.long	1071946999
+	.long	2384659038
+	.long	3193391602
+	.long	0
+	.long	1071943806
+	.long	416481813
+	.long	1043730233
+	.long	536870912
+	.long	1071940616
+	.long	1675424499
+	.long	1046348030
+	.long	3221225472
+	.long	1071937429
+	.long	1175989513
+	.long	3193009113
+	.long	2684354560
+	.long	1071934246
+	.long	2400084650
+	.long	3192451713
+	.long	3758096384
+	.long	1071931066
+	.long	1467335692
+	.long	3193350868
+	.long	1610612736
+	.long	1071927890
+	.long	266493801
+	.long	1044954481
+	.long	1073741824
+	.long	1071924717
+	.long	3919093445
+	.long	1046023575
+	.long	2147483648
+	.long	1071921547
+	.long	3017408483
+	.long	1044880828
+	.long	536870912
+	.long	1071918381
+	.long	948849966
+	.long	3193892224
+	.long	3758096384
+	.long	1071915217
+	.long	1870232600
+	.long	1045777228
+	.long	536870912
+	.long	1071912058
+	.long	822381492
+	.long	3193639186
+	.long	2147483648
+	.long	1071908901
+	.long	788243705
+	.long	1044966343
+	.long	1073741824
+	.long	1071905748
+	.long	1344278809
+	.long	1044428545
+	.long	1073741824
+	.long	1071902598
+	.long	172864300
+	.long	1045765608
+	.long	2684354560
+	.long	1071899451
+	.long	211555467
+	.long	3192963574
+	.long	536870912
+	.long	1071896308
+	.long	3373438023
+	.long	1045643168
+	.long	0
+	.long	1071893168
+	.long	2867180960
+	.long	3189945998
+	.long	536870912
+	.long	1071890031
+	.long	36724362
+	.long	3193240584
+	.long	1610612736
+	.long	1071886897
+	.long	2140176984
+	.long	1045945349
+	.long	0
+	.long	1071883767
+	.long	436842360
+	.long	1040712587
+	.long	3758096384
+	.long	1071880639
+	.long	1225147329
+	.long	3193814594
+	.long	3758096384
+	.long	1071877515
+	.long	1586157348
+	.long	3191614322
+	.long	536870912
+	.long	1071874395
+	.long	3329332918
+	.long	1041699791
+	.long	2684354560
+	.long	1071871277
+	.long	1635968041
+	.long	3191783756
+	.long	1073741824
+	.long	1071868163
+	.long	2876158382
+	.long	1046097093
+	.long	1073741824
+	.long	1071865052
+	.long	4267556964
+	.long	3193723000
+	.long	1073741824
+	.long	1071861944
+	.long	195475940
+	.long	1045520795
+	.long	2147483648
+	.long	1071858839
+	.long	2239193514
+	.long	1046478675
+	.long	0
+	.long	1071855738
+	.long	4168275596
+	.long	1044926285
+	.long	2684354560
+	.long	1071852639
+	.long	142514114
+	.long	1045595182
+	.long	2147483648
+	.long	1071849544
+	.long	1943457984
+	.long	3192930015
+	.long	2147483648
+	.long	1071846452
+	.long	202659489
+	.long	3193926317
+	.long	2684354560
+	.long	1071843363
+	.long	2208408789
+	.long	3193857484
+	.long	3758096384
+	.long	1071840277
+	.long	2237297552
+	.long	3192939576
+	.long	1073741824
+	.long	1071837195
+	.long	2726920839
+	.long	1044193954
+	.long	3758096384
+	.long	1071834115
+	.long	2337732207
+	.long	3193611773
+	.long	2147483648
+	.long	1071831039
+	.long	1390088602
+	.long	1044000317
+	.long	1610612736
+	.long	1071827966
+	.long	3806188736
+	.long	3193463913
+	.long	1073741824
+	.long	1071824896
+	.long	1795276560
+	.long	1043671965
+	.long	1073741824
+	.long	1071821829
+	.long	2960792799
+	.long	1046240474
+	.long	2147483648
+	.long	1071818765
+	.long	3350591592
+	.long	3193333939
+	.long	3221225472
+	.long	1071815704
+	.long	408870754
+	.long	3193322854
+	.long	0
+	.long	1071812647
+	.long	4146717132
+	.long	1046063520
+	.long	2147483648
+	.long	1071809592
+	.long	1681114919
+	.long	3192114313
+	.long	0
+	.long	1071806541
+	.long	1098393137
+	.long	3190846732
+	.long	2684354560
+	.long	1071803492
+	.long	2437484983
+	.long	3193448718
+	.long	1073741824
+	.long	1071800447
+	.long	1036809185
+	.long	3192023501
+	.long	0
+	.long	1071797405
+	.long	659668848
+	.long	3193596312
+	.long	3221225472
+	.long	1071794365
+	.long	1112062459
+	.long	3192773376
+	.long	2147483648
+	.long	1071791329
+	.long	4082956335
+	.long	1045830513
+	.long	1610612736
+	.long	1071788296
+	.long	2387089965
+	.long	1045532601
+	.long	1610612736
+	.long	1071785266
+	.long	1522101980
+	.long	3193941957
+	.long	1073741824
+	.long	1071782239
+	.long	2157197585
+	.long	3188193305
+	.long	1073741824
+	.long	1071779215
+	.long	946810220
+	.long	3193223819
+	.long	1073741824
+	.long	1071776194
+	.long	4069942444
+	.long	3193878549
+	.long	536870912
+	.long	1071773176
+	.long	1693463440
+	.long	1046360588
+	.long	536870912
+	.long	1071770161
+	.long	1954543254
+	.long	1046409381
+	.long	1073741824
+	.long	1071767149
+	.long	1050471249
+	.long	3193933095
+	.long	536870912
+	.long	1071764140
+	.long	1256240478
+	.long	1046456865
+	.long	536870912
+	.long	1071761134
+	.long	676764254
+	.long	1046055503
+	.long	536870912
+	.long	1071758131
+	.long	1421032967
+	.long	1044779786
+	.long	536870912
+	.long	1071755131
+	.long	38735992
+	.long	3192766355
+	.long	0
+	.long	1071752134
+	.long	2960669690
+	.long	1044484680
+	.long	3758096384
+	.long	1071749139
+	.long	788707382
+	.long	1045299895
+	.long	3221225472
+	.long	1071746148
+	.long	685689300
+	.long	1040778831
+	.long	2147483648
+	.long	1071743160
+	.long	1170994182
+	.long	1046159174
+	.long	1073741824
+	.long	1071740175
+	.long	64591436
+	.long	1046153849
+	.long	0
+	.long	1071737193
+	.long	2338031659
+	.long	3189997702
+	.long	2684354560
+	.long	1071734213
+	.long	1941624568
+	.long	3186752676
+	.long	536870912
+	.long	1071731237
+	.long	1401255580
+	.long	1046383990
+	.long	2684354560
+	.long	1071728263
+	.long	376888427
+	.long	1045896456
+	.long	536870912
+	.long	1071725293
+	.long	2831424639
+	.long	3193539109
+	.long	1610612736
+	.long	1071722325
+	.long	3303123696
+	.long	1044599415
+	.long	2684354560
+	.long	1071719360
+	.long	1077295329
+	.long	3189877372
+	.long	3221225472
+	.long	1071716398
+	.long	1434061099
+	.long	3184529771
+	.long	3221225472
+	.long	1071713439
+	.long	2104991590
+	.long	1045062074
+	.long	3221225472
+	.long	1071710483
+	.long	722060869
+	.long	3193788526
+	.long	536870912
+	.long	1071704580
+	.long	3928796486
+	.long	1046129020
+	.long	536870912
+	.long	1071698688
+	.long	588844628
+	.long	1045492135
+	.long	2684354560
+	.long	1071692807
+	.long	326739366
+	.long	3193004445
+	.long	1610612736
+	.long	1071686938
+	.long	2456436042
+	.long	1046278169
+	.long	2684354560
+	.long	1071681080
+	.long	2831303512
+	.long	1043670046
+	.long	536870912
+	.long	1071675234
+	.long	607223418
+	.long	1045507322
+	.long	0
+	.long	1071669399
+	.long	4254921332
+	.long	3193290483
+	.long	0
+	.long	1071663575
+	.long	914994333
+	.long	3191263853
+	.long	1073741824
+	.long	1071657762
+	.long	4147050180
+	.long	3193228552
+	.long	2684354560
+	.long	1071651960
+	.long	594554157
+	.long	3193503935
+	.long	0
+	.long	1071646170
+	.long	1062846796
+	.long	1045944331
+	.long	1073741824
+	.long	1071636109
+	.long	2909238893
+	.long	3193436884
+	.long	1073741824
+	.long	1071624572
+	.long	1682918119
+	.long	1042211899
+	.long	1073741824
+	.long	1071613057
+	.long	2419209426
+	.long	1045437062
+	.long	1073741824
+	.long	1071601564
+	.long	2951341321
+	.long	3190193214
+	.long	0
+	.long	1071590093
+	.long	3084900875
+	.long	3192394907
+	.long	1073741824
+	.long	1071578643
+	.long	999567454
+	.long	1046433447
+	.long	2147483648
+	.long	1071567215
+	.long	1570101857
+	.long	3193291160
+	.long	0
+	.long	1071555809
+	.long	1080647881
+	.long	3185154585
+	.long	0
+	.long	1071544424
+	.long	3526309177
+	.long	1044843640
+	.long	2147483648
+	.long	1071533060
+	.long	2213463349
+	.long	3191738930
+	.long	1073741824
+	.long	1071521718
+	.long	1039925195
+	.long	3192618353
+	.long	1073741824
+	.long	1071510397
+	.long	2115757280
+	.long	3193671567
+	.long	1073741824
+	.long	1071499097
+	.long	1188751495
+	.long	3191145560
+	.long	2147483648
+	.long	1071487818
+	.long	3983461449
+	.long	3193897029
+	.long	2147483648
+	.long	1071476560
+	.long	782141500
+	.long	1042879962
+	.long	2147483648
+	.long	1071465323
+	.long	4038904626
+	.long	1045063881
+	.long	2147483648
+	.long	1071454107
+	.long	2613036921
+	.long	3193217642
+	.long	0
+	.long	1071442912
+	.long	2095723435
+	.long	1044629175
+	.long	1073741824
+	.long	1071431737
+	.long	3879795974
+	.long	1045767874
+	.long	1073741824
+	.long	1071420583
+	.long	2662198042
+	.long	3191434637
+	.long	3221225472
+	.long	1071409449
+	.long	4037605722
+	.long	3193703090
+	.long	2147483648
+	.long	1071398336
+	.long	1860331835
+	.long	1040814822
+	.long	3221225472
+	.long	1071387243
+	.long	1522972033
+	.long	3190305974
+	.long	1073741824
+	.long	1071376171
+	.long	2361534207
+	.long	1043699366
+	.long	0
+	.long	1071365119
+	.long	4180309179
+	.long	1044142099
+	.long	0
+	.long	1071354087
+	.long	1201038528
+	.long	3192968772
+	.long	0
+	.long	1071343075
+	.long	1342478171
+	.long	3193251215
+	.long	0
+	.long	1071332083
+	.long	3836883348
+	.long	3193472007
+	.long	3221225472
+	.long	1071321110
+	.long	3864874250
+	.long	1045593126
+	.long	2147483648
+	.long	1071310158
+	.long	2169494998
+	.long	1046045346
+	.long	1073741824
+	.long	1071299226
+	.long	3785165075
+	.long	3193319246
+	.long	2147483648
+	.long	1071288313
+	.long	1137692678
+	.long	3192716779
+	.long	1073741824
+	.long	1071277420
+	.long	1752107598
+	.long	1046366120
+	.long	3221225472
+	.long	1071266546
+	.long	1912656912
+	.long	1046352281
+	.long	3221225472
+	.long	1071255692
+	.long	2882676334
+	.long	1046406353
+	.long	1073741824
+	.long	1071244858
+	.long	963612460
+	.long	1045282811
+	.long	0
+	.long	1071234043
+	.long	3811255773
+	.long	1046231636
+	.long	1073741824
+	.long	1071223247
+	.long	1126055989
+	.long	3192224037
+	.long	2147483648
+	.long	1071212470
+	.long	2079145427
+	.long	1044432413
+	.long	0
+	.long	1071201713
+	.long	3611595621
+	.long	1043358745
+	.long	2147483648
+	.long	1071190974
+	.long	390522769
+	.long	1045888252
+	.long	1073741824
+	.long	1071180255
+	.long	4087939723
+	.long	3192930745
+	.long	3221225472
+	.long	1071169554
+	.long	1451494480
+	.long	3190219274
+	.long	1073741824
+	.long	1071158873
+	.long	427176194
+	.long	3193042022
+	.long	2147483648
+	.long	1071148210
+	.long	1882381948
+	.long	3192727946
+	.long	2147483648
+	.long	1071137566
+	.long	3736313771
+	.long	3192087019
+	.long	1073741824
+	.long	1071126941
+	.long	1560398816
+	.long	3193185715
+	.long	2147483648
+	.long	1071116334
+	.long	1021942441
+	.long	1041526696
+	.long	2147483648
+	.long	1071105746
+	.long	3517080249
+	.long	3193576041
+	.long	3221225472
+	.long	1071095176
+	.long	2248589878
+	.long	1044527624
+	.long	2147483648
+	.long	1071084625
+	.long	2412896695
+	.long	1046112867
+	.long	3221225472
+	.long	1071074092
+	.long	3834725738
+	.long	1044562378
+	.long	1073741824
+	.long	1071063578
+	.long	1150920407
+	.long	1043768986
+	.long	0
+	.long	1071053082
+	.long	1379393428
+	.long	3188690690
+	.long	0
+	.long	1071042604
+	.long	3058183278
+	.long	3193617655
+	.long	0
+	.long	1071032144
+	.long	421133665
+	.long	3193417186
+	.long	0
+	.long	1071021702
+	.long	2860161357
+	.long	3191816125
+	.long	0
+	.long	1071011278
+	.long	1742405964
+	.long	1043580240
+	.long	0
+	.long	1071000872
+	.long	2821215927
+	.long	3188984273
+	.long	3221225472
+	.long	1070990483
+	.long	510275597
+	.long	1045813401
+	.long	2147483648
+	.long	1070980113
+	.long	304266588
+	.long	3191193536
+	.long	3221225472
+	.long	1070969760
+	.long	1854784211
+	.long	1046302073
+	.long	0
+	.long	1070959426
+	.long	3773082854
+	.long	3193008899
+	.long	2147483648
+	.long	1070949108
+	.long	3003572392
+	.long	1046404879
+	.long	3221225472
+	.long	1070938808
+	.long	1702149204
+	.long	1046407257
+	.long	2147483648
+	.long	1070928526
+	.long	3935314439
+	.long	1046438280
+	.long	3221225472
+	.long	1070918261
+	.long	2677087609
+	.long	1045501749
+	.long	2147483648
+	.long	1070908014
+	.long	4190598039
+	.long	3193640515
+	.long	1073741824
+	.long	1070897784
+	.long	368874072
+	.long	1044879927
+	.long	2147483648
+	.long	1070887571
+	.long	3584052697
+	.long	3192024662
+	.long	3221225472
+	.long	1070877375
+	.long	3762307829
+	.long	1045886918
+	.long	1073741824
+	.long	1070867197
+	.long	495710920
+	.long	1046317072
+	.long	0
+	.long	1070857036
+	.long	2292768238
+	.long	3190887508
+	.long	3221225472
+	.long	1070846891
+	.long	1044078151
+	.long	3193772914
+	.long	1073741824
+	.long	1070836764
+	.long	3266010457
+	.long	1043443755
+	.long	3221225472
+	.long	1070826653
+	.long	3571665822
+	.long	1045547823
+	.long	1073741824
+	.long	1070816560
+	.long	393348347
+	.long	3190525143
+	.long	2147483648
+	.long	1070806483
+	.long	4241722498
+	.long	3192084193
+	.long	2147483648
+	.long	1070796423
+	.long	1693797068
+	.long	3192807972
+	.long	0
+	.long	1070786380
+	.long	2860086745
+	.long	1046331646
+	.long	2147483648
+	.long	1070776353
+	.long	1366141759
+	.long	3192979363
+	.long	1073741824
+	.long	1070766343
+	.long	737899283
+	.long	1045853346
+	.long	3221225472
+	.long	1070756349
+	.long	88734873
+	.long	1043881257
+	.long	3221225472
+	.long	1070746372
+	.long	1438003315
+	.long	3192917101
+	.long	0
+	.long	1070736412
+	.long	1066505530
+	.long	1043896695
+	.long	3221225472
+	.long	1070726467
+	.long	2706653041
+	.long	3191113643
+	.long	3221225472
+	.long	1070716539
+	.long	1321764476
+	.long	1039573724
+	.long	0
+	.long	1070706628
+	.long	1126753211
+	.long	1044502976
+	.long	2147483648
+	.long	1070696732
+	.long	773642884
+	.long	1044110727
+	.long	1073741824
+	.long	1070686853
+	.long	1263743406
+	.long	3193115278
+	.long	0
+	.long	1070676990
+	.long	3115237732
+	.long	3193089176
+	.long	3221225472
+	.long	1070667142
+	.long	3642626838
+	.long	3191146032
+	.long	2147483648
+	.long	1070657311
+	.long	2091696428
+	.long	1044337177
+	.long	1073741824
+	.long	1070647496
+	.long	3168958391
+	.long	1044197568
+	.long	0
+	.long	1070637697
+	.long	711148669
+	.long	3193181047
+	.long	2147483648
+	.long	1070627913
+	.long	4207182773
+	.long	3193402092
+	.long	3221225472
+	.long	1070618145
+	.long	918070640
+	.long	3192902845
+	.long	3221225472
+	.long	1070608393
+	.long	3135571447
+	.long	3192193928
+	.long	2147483648
+	.long	1070598657
+	.long	1043705517
+	.long	3193188604
+	.long	2147483648
+	.long	1070581777
+	.long	1886680492
+	.long	1043890286
+	.long	2147483648
+	.long	1070562367
+	.long	3373799420
+	.long	3191917802
+	.long	2147483648
+	.long	1070542988
+	.long	2919618025
+	.long	3192461752
+	.long	2147483648
+	.long	1070523640
+	.long	2926365158
+	.long	3193113492
+	.long	0
+	.long	1070504323
+	.long	519978638
+	.long	1045918846
+	.long	0
+	.long	1070485037
+	.long	3665353151
+	.long	3193546248
+	.long	0
+	.long	1070465781
+	.long	2327718958
+	.long	1045050797
+	.long	0
+	.long	1070446556
+	.long	345326861
+	.long	3188224716
+	.long	2147483648
+	.long	1070427361
+	.long	2263747488
+	.long	3192871328
+	.long	0
+	.long	1070408197
+	.long	3894192264
+	.long	1045693123
+	.long	0
+	.long	1070389063
+	.long	994321593
+	.long	1046347203
+	.long	2147483648
+	.long	1070369959
+	.long	3540366700
+	.long	1042296230
+	.long	0
+	.long	1070350886
+	.long	966420752
+	.long	3192400412
+	.long	2147483648
+	.long	1070331842
+	.long	1954511160
+	.long	3193467762
+	.long	2147483648
+	.long	1070312828
+	.long	1875003040
+	.long	1045485629
+	.long	0
+	.long	1070293845
+	.long	4003372005
+	.long	3193714109
+	.long	2147483648
+	.long	1070274890
+	.long	2216083644
+	.long	1045720399
+	.long	0
+	.long	1070255966
+	.long	1240985743
+	.long	1045879414
+	.long	0
+	.long	1070237071
+	.long	1573064162
+	.long	1046427916
+	.long	0
+	.long	1070218206
+	.long	2500166582
+	.long	3193848169
+	.long	2147483648
+	.long	1070199369
+	.long	862131539
+	.long	1045606065
+	.long	0
+	.long	1070180563
+	.long	3733427622
+	.long	3193545988
+	.long	0
+	.long	1070161785
+	.long	124515358
+	.long	1045504766
+	.long	2147483648
+	.long	1070143036
+	.long	689228007
+	.long	1044238436
+	.long	0
+	.long	1070124317
+	.long	976284835
+	.long	3189879978
+	.long	2147483648
+	.long	1070105626
+	.long	2997446224
+	.long	3193394244
+	.long	2147483648
+	.long	1070086964
+	.long	594985163
+	.long	3190453447
+	.long	2147483648
+	.long	1070068331
+	.long	3634411091
+	.long	3193012662
+	.long	0
+	.long	1070049727
+	.long	841316482
+	.long	3192551604
+	.long	0
+	.long	1070031151
+	.long	518949849
+	.long	3189505693
+	.long	2147483648
+	.long	1070012603
+	.long	207633604
+	.long	1043791305
+	.long	2147483648
+	.long	1069994084
+	.long	925415631
+	.long	3189658670
+	.long	2147483648
+	.long	1069975593
+	.long	3348775015
+	.long	1046231055
+	.long	0
+	.long	1069957131
+	.long	4137593961
+	.long	1045760644
+	.long	2147483648
+	.long	1069938696
+	.long	3081207972
+	.long	1046319652
+	.long	2147483648
+	.long	1069920290
+	.long	2912811806
+	.long	3193250863
+	.long	0
+	.long	1069901912
+	.long	1704663230
+	.long	3192651171
+	.long	2147483648
+	.long	1069883561
+	.long	1726887473
+	.long	3193427817
+	.long	2147483648
+	.long	1069865238
+	.long	516302873
+	.long	1042556919
+	.long	2147483648
+	.long	1069846943
+	.long	3737277289
+	.long	3192083505
+	.long	0
+	.long	1069828676
+	.long	2829909067
+	.long	3191628520
+	.long	0
+	.long	1069810436
+	.long	3474800299
+	.long	3187384991
+	.long	2147483648
+	.long	1069792223
+	.long	2041291754
+	.long	3186735048
+	.long	2147483648
+	.long	1069774038
+	.long	3100739290
+	.long	3192991951
+	.long	2147483648
+	.long	1069755880
+	.long	2641686866
+	.long	1042449846
+	.long	0
+	.long	1069737750
+	.long	1353612457
+	.long	3192928544
+	.long	2147483648
+	.long	1069719646
+	.long	1823398190
+	.long	3193125156
+	.long	0
+	.long	1069701570
+	.long	2629108558
+	.long	3192983089
+	.long	2147483648
+	.long	1069683520
+	.long	314889080
+	.long	3193178947
+	.long	2147483648
+	.long	1069665497
+	.long	3426846470
+	.long	1046055034
+	.long	0
+	.long	1069647502
+	.long	2451521798
+	.long	3193081447
+	.long	2147483648
+	.long	1069629532
+	.long	963200030
+	.long	1046315089
+	.long	0
+	.long	1069611590
+	.long	3644976987
+	.long	1046450297
+	.long	2147483648
+	.long	1069593674
+	.long	1514045874
+	.long	3193337489
+	.long	0
+	.long	1069575785
+	.long	2640752615
+	.long	3192734715
+	.long	0
+	.long	1069557922
+	.long	177381730
+	.long	3193107348
+	.long	0
+	.long	1069532650
+	.long	546871269
+	.long	1045601847
+	.long	0
+	.long	1069497029
+	.long	2220408187
+	.long	1045964849
+	.long	0
+	.long	1069461461
+	.long	3101209784
+	.long	3192417098
+	.long	0
+	.long	1069425944
+	.long	3768825782
+	.long	1046196178
+	.long	0
+	.long	1069390480
+	.long	737308942
+	.long	1043872555
+	.long	0
+	.long	1069355068
+	.long	1944808119
+	.long	3193362317
+	.long	0
+	.long	1069319707
+	.long	852406261
+	.long	3191004250
+	.long	0
+	.long	1069284398
+	.long	3202370743
+	.long	3192549796
+	.long	0
+	.long	1069249140
+	.long	900633975
+	.long	1043862575
+	.long	0
+	.long	1069213934
+	.long	3417168564
+	.long	3193213168
+	.long	0
+	.long	1069178778
+	.long	2513309972
+	.long	1046051953
+	.long	0
+	.long	1069143674
+	.long	1836846968
+	.long	1044036653
+	.long	0
+	.long	1069108621
+	.long	675391362
+	.long	3193334972
+	.long	0
+	.long	1069073618
+	.long	1859398086
+	.long	3191668729
+	.long	0
+	.long	1069038666
+	.long	3835994043
+	.long	3193252196
+	.long	0
+	.long	1069003764
+	.long	563337246
+	.long	3192060530
+	.long	0
+	.long	1068968912
+	.long	3715154210
+	.long	1045592716
+	.long	0
+	.long	1068934111
+	.long	51415636
+	.long	3192193939
+	.long	0
+	.long	1068899359
+	.long	822049108
+	.long	1045846080
+	.long	0
+	.long	1068864658
+	.long	3739043340
+	.long	3193184949
+	.long	0
+	.long	1068830006
+	.long	2500828997
+	.long	3193115638
+	.long	0
+	.long	1068795403
+	.long	1479335089
+	.long	1045458233
+	.long	0
+	.long	1068760850
+	.long	1914098598
+	.long	1045079833
+	.long	0
+	.long	1068726346
+	.long	1470374909
+	.long	1046125471
+	.long	0
+	.long	1068691892
+	.long	2048101185
+	.long	3192960024
+	.long	0
+	.long	1068657486
+	.long	801101802
+	.long	1042523454
+	.long	0
+	.long	1068623129
+	.long	412171467
+	.long	1044799425
+	.long	0
+	.long	1068588821
+	.long	2124566049
+	.long	1040459843
+	.long	0
+	.long	1068554561
+	.long	2087558263
+	.long	1046083102
+	.long	0
+	.long	1068520350
+	.long	290389316
+	.long	1045220023
+	.long	0
+	.long	1068473430
+	.long	393737815
+	.long	1045770085
+	.long	0
+	.long	1068405202
+	.long	3273111658
+	.long	3193594336
+	.long	0
+	.long	1068337068
+	.long	3076935419
+	.long	3191993934
+	.long	0
+	.long	1068269030
+	.long	1564279721
+	.long	1040713632
+	.long	0
+	.long	1068201088
+	.long	1950103787
+	.long	3191285473
+	.long	0
+	.long	1068133240
+	.long	111301617
+	.long	1046140470
+	.long	0
+	.long	1068065488
+	.long	2740933659
+	.long	1046091898
+	.long	0
+	.long	1067997832
+	.long	1267131462
+	.long	3192947024
+	.long	0
+	.long	1067930268
+	.long	629787343
+	.long	1045599114
+	.long	0
+	.long	1067862800
+	.long	2943029746
+	.long	3191100621
+	.long	0
+	.long	1067795426
+	.long	2538631151
+	.long	3193953989
+	.long	0
+	.long	1067728144
+	.long	3881795033
+	.long	3191377363
+	.long	0
+	.long	1067660956
+	.long	2752747058
+	.long	3186250103
+	.long	0
+	.long	1067593862
+	.long	892170014
+	.long	3193330390
+	.long	0
+	.long	1067526860
+	.long	2000985783
+	.long	3192968647
+	.long	0
+	.long	1067459950
+	.long	1954077304
+	.long	1044399908
+	.long	0
+	.long	1067335900
+	.long	4120702847
+	.long	3193150730
+	.long	0
+	.long	1067202448
+	.long	353489980
+	.long	1045676744
+	.long	0
+	.long	1067069184
+	.long	2609643324
+	.long	3192108001
+	.long	0
+	.long	1066936100
+	.long	2904433317
+	.long	1044836541
+	.long	0
+	.long	1066803200
+	.long	319656790
+	.long	1044863904
+	.long	0
+	.long	1066670484
+	.long	2407987331
+	.long	3192995083
+	.long	0
+	.long	1066537948
+	.long	2437746120
+	.long	3193127733
+	.long	0
+	.long	1066405592
+	.long	762570215
+	.long	3189946997
+	.long	0
+	.long	1066145040
+	.long	3317159694
+	.long	1046060125
+	.long	0
+	.long	1065881056
+	.long	2317845886
+	.long	3191679176
+	.long	0
+	.long	1065617424
+	.long	3665195816
+	.long	1045633853
+	.long	0
+	.long	1065354160
+	.long	2008730355
+	.long	3193898211
+	.long	0
+	.long	1064829264
+	.long	3746236192
+	.long	1046121471
+	.long	0
+	.long	1064303680
+	.long	885296753
+	.long	3191852441
+	.long	0
+	.long	1063253696
+	.long	449976495
+	.long	3192682663
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.type	L_tbl,@object
+	.size	L_tbl,8208
+	.space 496, 0x00 	# pad
+	.align 16
+HIGHMASK_Y:
+	.long	0
+	.long	4294967288
+	.long	0
+	.long	4294967295
+	.type	HIGHMASK_Y,@object
+	.size	HIGHMASK_Y,16
+	.align 16
+T_exp:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	997195776
+	.long	4200250559
+	.long	1072696090
+	.long	2808127345
+	.long	3162830514
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	339411585
+	.long	1072701800
+	.long	264588982
+	.long	3162685233
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	772914124
+	.long	1072707540
+	.long	4004372762
+	.long	1013278737
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	1928746161
+	.long	1072713311
+	.long	983617676
+	.long	1015333753
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	238821257
+	.long	1072719114
+	.long	1469694871
+	.long	3163933563
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	728934454
+	.long	1072724948
+	.long	1413842688
+	.long	1015227188
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	4133881824
+	.long	1072730813
+	.long	2148155345
+	.long	3163979875
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	2602514713
+	.long	1072736711
+	.long	2268929336
+	.long	1015402860
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	1172597893
+	.long	1072742641
+	.long	114433263
+	.long	1016396169
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	590962156
+	.long	1072748603
+	.long	3829346666
+	.long	3164324173
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	1608493509
+	.long	1072754597
+	.long	3159622171
+	.long	3163856313
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	685187902
+	.long	1072760624
+	.long	378731989
+	.long	1015891691
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	2875075254
+	.long	1072766683
+	.long	4144233330
+	.long	3164382292
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	351405227
+	.long	1072772776
+	.long	3125337328
+	.long	3160871055
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	2471440686
+	.long	1072778901
+	.long	968836267
+	.long	3163263464
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1416741826
+	.long	1072785060
+	.long	2196380210
+	.long	1012462139
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	2257959872
+	.long	1072791252
+	.long	3802946148
+	.long	1014013503
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	1480023343
+	.long	1072797478
+	.long	2247196168
+	.long	1016376029
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	4162030108
+	.long	1072803737
+	.long	2763428480
+	.long	1016577925
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	2502433899
+	.long	1072810031
+	.long	2148595913
+	.long	1016072567
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	1588871207
+	.long	1072816359
+	.long	143439582
+	.long	3164011992
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2218315341
+	.long	1072822721
+	.long	2694295388
+	.long	3164337444
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	897099801
+	.long	1072829118
+	.long	754756297
+	.long	1016289581
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	2725843665
+	.long	1072835549
+	.long	1433917087
+	.long	1015887099
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	4219606026
+	.long	1072842015
+	.long	2434574742
+	.long	1015730124
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1897844341
+	.long	1072848517
+	.long	1254300460
+	.long	1016324514
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	874372905
+	.long	1072855054
+	.long	100263788
+	.long	1016989308
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	1972484976
+	.long	1072861626
+	.long	675290301
+	.long	3162688626
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	1724976915
+	.long	1072868234
+	.long	420909223
+	.long	3164165955
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	964107055
+	.long	1072874878
+	.long	2800439588
+	.long	3163881797
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	526652809
+	.long	1072881558
+	.long	4223459736
+	.long	1016927951
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	1253935211
+	.long	1072888274
+	.long	1395382931
+	.long	3160751189
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	3991843581
+	.long	1072895026
+	.long	4092853457
+	.long	1015634339
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	1000925746
+	.long	1072901816
+	.long	1018491672
+	.long	3164358120
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1726216749
+	.long	1072908642
+	.long	2466808228
+	.long	3162724981
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	2732492859
+	.long	1072915505
+	.long	2691479646
+	.long	3163304260
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	589198666
+	.long	1072922406
+	.long	2664346172
+	.long	3164206538
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	460407023
+	.long	1072929344
+	.long	4237175092
+	.long	3164187045
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3219942644
+	.long	1072936319
+	.long	3798990616
+	.long	1016417382
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1156440435
+	.long	1072943333
+	.long	2351451249
+	.long	1015015632
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	3743175029
+	.long	1072950384
+	.long	2072812490
+	.long	3163223651
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	3278348324
+	.long	1072957474
+	.long	3069497416
+	.long	1015799288
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	654919306
+	.long	1072964603
+	.long	3232961757
+	.long	3164096045
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1065662932
+	.long	1072971770
+	.long	2533670915
+	.long	1015578814
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	1118294578
+	.long	1072978976
+	.long	2197495694
+	.long	3160957977
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	1720398391
+	.long	1072986221
+	.long	3980678963
+	.long	3164348656
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	3784486610
+	.long	1072993505
+	.long	1581883040
+	.long	3162747529
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3933059031
+	.long	1073000829
+	.long	2133366768
+	.long	3162580408
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	3088564500
+	.long	1073008193
+	.long	1762311517
+	.long	1016094249
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	2178460671
+	.long	1073015597
+	.long	777878098
+	.long	3163891069
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2135241198
+	.long	1073023041
+	.long	1236747871
+	.long	1014637723
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	3896463087
+	.long	1073030525
+	.long	1139797873
+	.long	3162282381
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	4109806887
+	.long	1073038050
+	.long	422403966
+	.long	1015517805
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	3723038930
+	.long	1073045616
+	.long	378465264
+	.long	3163618158
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3689071823
+	.long	1073053223
+	.long	2321004996
+	.long	3163601292
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	671025100
+	.long	1073060872
+	.long	3832014351
+	.long	3164070606
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	4222122499
+	.long	1073068561
+	.long	1277378074
+	.long	3164305313
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	2425981843
+	.long	1073076293
+	.long	2830390851
+	.long	3164395175
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	551349105
+	.long	1073084067
+	.long	3821916050
+	.long	3163155165
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	3872257780
+	.long	1073091882
+	.long	1253592103
+	.long	1017006910
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	488188413
+	.long	1073099741
+	.long	3199821029
+	.long	1016612624
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	4273770423
+	.long	1073107641
+	.long	3383180809
+	.long	3164267477
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3339203574
+	.long	1073115585
+	.long	1483497780
+	.long	3163457330
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	2979960120
+	.long	1073123572
+	.long	2599109725
+	.long	1015547069
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	4201977662
+	.long	1073131602
+	.long	748330254
+	.long	1014642933
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	3721688645
+	.long	1073139676
+	.long	3069276937
+	.long	1016887977
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	2555984613
+	.long	1073147794
+	.long	2652555442
+	.long	3163601268
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	1727278727
+	.long	1073155956
+	.long	3562710623
+	.long	1012520516
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	2263535754
+	.long	1073164162
+	.long	752233586
+	.long	3163687584
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	903334909
+	.long	1073172413
+	.long	1636462108
+	.long	1016088573
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	2980802057
+	.long	1073180708
+	.long	378619896
+	.long	1016821879
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	950803702
+	.long	1073189049
+	.long	1655364926
+	.long	1016285608
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	158781403
+	.long	1073197435
+	.long	2221464712
+	.long	3164335029
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	1660913392
+	.long	1073205866
+	.long	4218599604
+	.long	1016184283
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	2224145553
+	.long	1073214343
+	.long	3482522030
+	.long	3162537745
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2916157145
+	.long	1073222866
+	.long	219487565
+	.long	1016357943
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	515457527
+	.long	1073231436
+	.long	836709333
+	.long	1016699802
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	396319521
+	.long	1073240052
+	.long	4172420816
+	.long	3160123208
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3643909174
+	.long	1073248714
+	.long	3537586109
+	.long	1015403223
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	2759350287
+	.long	1073257424
+	.long	1148526634
+	.long	1016943509
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	3134592888
+	.long	1073266181
+	.long	4232266862
+	.long	1017039710
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	1577608921
+	.long	1073274986
+	.long	1875489510
+	.long	3164016970
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	3492293770
+	.long	1073283838
+	.long	2248032210
+	.long	1016435402
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	1403662306
+	.long	1073292739
+	.long	2788809599
+	.long	3162719583
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	727685349
+	.long	1073301688
+	.long	2038246809
+	.long	3163407318
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2591453363
+	.long	1073310685
+	.long	2132396182
+	.long	3160122774
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	3833209506
+	.long	1073319731
+	.long	2722920684
+	.long	1014803418
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	1297350157
+	.long	1073328827
+	.long	1308022040
+	.long	3164461134
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	424392917
+	.long	1073337972
+	.long	2749202995
+	.long	3163887294
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2366108318
+	.long	1073347166
+	.long	2867985102
+	.long	3162810830
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3985553595
+	.long	1073356410
+	.long	4002146062
+	.long	1016882712
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2152073944
+	.long	1073365705
+	.long	1486860576
+	.long	3164252032
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	2331271250
+	.long	1073375050
+	.long	812057446
+	.long	1013256022
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1405169241
+	.long	1073384446
+	.long	2998539689
+	.long	3163879527
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	557149882
+	.long	1073393893
+	.long	3672720709
+	.long	1015585841
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	977020788
+	.long	1073403391
+	.long	3065100517
+	.long	1016590139
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	3861050111
+	.long	1073412940
+	.long	254893773
+	.long	3163861756
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	1822067026
+	.long	1073422542
+	.long	1241994956
+	.long	1016388866
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	364333489
+	.long	1073432196
+	.long	3923737744
+	.long	3162469949
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	703710506
+	.long	1073441902
+	.long	1384660846
+	.long	1016244467
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	4062661092
+	.long	1073451660
+	.long	1422616006
+	.long	3164303894
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	3080351519
+	.long	1073461472
+	.long	3379126789
+	.long	3158266577
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	3287523847
+	.long	1073471337
+	.long	1625971539
+	.long	3158058531
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	1631695677
+	.long	1073481256
+	.long	2717633076
+	.long	3163392602
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	3657065772
+	.long	1073491228
+	.long	399025623
+	.long	3164005654
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	2029714210
+	.long	1073501255
+	.long	613660079
+	.long	1016147719
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2307442995
+	.long	1073511336
+	.long	3190117721
+	.long	3163453115
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	1464976603
+	.long	1073521472
+	.long	3507292405
+	.long	3163026110
+	.long	3706687593
+	.long	1073526560
+	.long	3521726939
+	.long	1014301643
+	.long	778901109
+	.long	1073531663
+	.long	2248183954
+	.long	3162317327
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1532734324
+	.long	1073541909
+	.long	3094216535
+	.long	3164211433
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	721996136
+	.long	1073552211
+	.long	563754734
+	.long	1016419894
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3939148246
+	.long	1073562568
+	.long	3210352148
+	.long	1016322899
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	3898795731
+	.long	1073572982
+	.long	1249994144
+	.long	1012918394
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	1912561781
+	.long	1073583453
+	.long	3147495102
+	.long	1016726829
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	3594158869
+	.long	1073593980
+	.long	2456521700
+	.long	3164305137
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	1679558232
+	.long	1073604565
+	.long	2390342287
+	.long	3164382546
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	1796832535
+	.long	1073615207
+	.long	3176955716
+	.long	3161634089
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	991358482
+	.long	1073625907
+	.long	838715019
+	.long	3164206244
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	610758006
+	.long	1073636665
+	.long	1965209397
+	.long	3162914808
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2009970496
+	.long	1073647481
+	.long	2159039665
+	.long	3163621524
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	2256325230
+	.long	1073658356
+	.long	580117746
+	.long	1016365871
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	2719515920
+	.long	1073669290
+	.long	2760332941
+	.long	1016186509
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	481706282
+	.long	1073680284
+	.long	1696079173
+	.long	3163759104
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1222472308
+	.long	1073691337
+	.long	1054357470
+	.long	3162069594
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2038973688
+	.long	1073702450
+	.long	892941374
+	.long	1017095035
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	35929225
+	.long	1073713624
+	.long	2809788041
+	.long	3160485544
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	915592468
+	.long	1073724858
+	.long	352947894
+	.long	3162072947
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.long	1797923801
+	.long	1073736153
+	.long	1950547427
+	.long	1014277635
+	.type	T_exp,@object
+	.size	T_exp,4096
+	.space 512, 0x00 	# pad
+	.align 16
+e_coeff:
+	.long	3884607281
+	.long	1062590591
+	.long	3607404736
+	.long	1068264200
+	.long	1874480759
+	.long	1065595563
+	.long	4286760335
+	.long	1070514109
+	.long	4277811695
+	.long	1072049730
+	.long	0
+	.long	0
+	.type	e_coeff,@object
+	.size	e_coeff,48
+	.align 16
+coeff_h:
+	.long	0
+	.long	3218479616
+	.long	0
+	.long	3210587105
+	.type	coeff_h,@object
+	.size	coeff_h,16
+	.align 16
+HIGHMASK_LOG_X:
+	.long	4160749568
+	.long	4294967295
+	.long	0
+	.long	4294965248
+	.type	HIGHMASK_LOG_X,@object
+	.size	HIGHMASK_LOG_X,16
+	.align 8
+HALFMASK:
+	.long	4160749568
+	.long	4294967295
+	.long	4160749568
+	.long	4294967295
+	.type	HALFMASK,@object
+	.size	HALFMASK,16
+	.align 8
+log2:
+	.long	4277811695
+	.long	1072049730
+	.long	4277811695
+	.long	3219533378
+	.type	log2,@object
+	.size	log2,16
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_pow.1-.
+	.4byte ..___tag_value_pow.5-..___tag_value_pow.1
+	.2byte 0x0400
+	.4byte ..___tag_value_pow.3-..___tag_value_pow.1
+	.2byte 0x300e
+	.byte 0x04
+	.4byte ..___tag_value_pow.4-..___tag_value_pow.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/e_sinh.S b/libm/x86_64/e_sinh.S
new file mode 100644
index 0000000..4d8db63
--- /dev/null
+++ b/libm/x86_64/e_sinh.S
@@ -0,0 +1,1430 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//  sinh(x)=(exp(x)-exp(-x))/2
+//
+//  Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+//  log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//          L2EH+L2EL (upper 26, lower 53 bits)
+//
+//  Let xH*L2EH=k+f+r`, where (k+f)*2^7=int(xH*L2EH*2^7),
+//                              f=0.b1 b2 ... b7, k integer
+//  2^f is approximated as Tp[f]+Dp[f], and 2^{-f} as Tn[f]+Dn[f]
+//  Tp stores the high 53 bits, Dp stores (2^f-Tp[f]) rounded to double precision
+//
+//  e^|x|=2^{k+f}*2^r, r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-8}+2^{-14},
+//                       for |x| in [23/64,3*2^7)
+//  e^{-|x|}=2^{-k-f}*2^{-r}
+//
+//  e^|x| is approximated as 2^k*Tp+2^k*Tp*c1*r(1+c2*r+..+c5*r^4)+2^k*Dp=
+//                           =2^k*Tp+2^k*Tp*P15+2^k*Dp
+//  e^{-|x|} approximated as 2^{-k}*Tn-2^{-k}*Tn*c1*r(1-c2*r+..+c5*r^4)+2^{-k}*Dn
+//
+//  For |x| in [1/8, 3*2^7), sinh(x) is formed as
+//      RN(2^k*Tp-2^{-k}*Tn)+2^k*Tp*P15-2^{-k}*Tn*P`15-2^{-k}*TnL-2^{-k}*Dn+2^k*Dp
+//
+//  For x in (3*2^7, 3*2^8), sign(x)*(e^|x|)/2 is returned, and
+//  the result is checked for overflow.
+//
+//  For |x|<23/64, a Taylor polynomial expansion is used (degree 13)
+//  To reduce rounding errors, the p3*x^3 term is computed as
+//     (p3*xh^3)_high+[(p3*xl*(3*x*xh+xl^2))+(p3*xh^3)_low],
+//  where x=xh+xl, (xh are the leading 17 bits of x), and
+//     (p3*xh^3)_high=RN(x+p3*xh^3)-x
+//  (error bound for polynomial expansion is below 0.51 ulp)
+//
+// Special cases:
+//  sinh(NaN) = quiet NaN, and raise invalid exception
+//  sinh(+/-INF) = +/-INF
+//  sinh(x) = x for subnormals
+//  for finite argument, only sinh(0)=0 is exact
+//  For IEEE double
+//    sinh(x) overflows  for x > 
+//    710.47586007394386342639336362481117248535156250 = MAXLOG+log(2)
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  sinh
+ENTRY(sinh)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_sinh.1:
+        pushq     %rsi
+..___tag_value_sinh.3:
+..B1.2:
+        movsd     HALFMASK(%rip), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     L2E(%rip), %xmm1
+        movsd     8+L2E(%rip), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     Shifter(%rip), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        movl      $32768, %edx
+        andl      %ecx, %edx
+        andl      $32767, %ecx
+        subl      $16343, %ecx
+        cmpl      $177, %ecx
+        jae       .L_2TAG_PACKET_0.0.2
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        shll      $3, %edx
+        orl       %edx, %eax
+        movq      %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        xorpd     %xmm5, %xmm5
+        subsd     %xmm6, %xmm3
+        movapd    cv(%rip), %xmm4
+        addsd     %xmm1, %xmm2
+        movapd    16+cv(%rip), %xmm6
+        subsd     %xmm3, %xmm7
+        movl      $32704, %edx
+        pinsrw    $3, %edx, %xmm5
+        movapd    32+cv(%rip), %xmm1
+        addsd     %xmm7, %xmm2
+        movl      $127, %edx
+        andl      %eax, %edx
+        addl      %edx, %edx
+        shrl      $3, %eax
+        andl      $65520, %eax
+        addl      $16352, %eax
+        xorpd     %xmm0, %xmm0
+        cmpl      $161, %ecx
+        jae       .L_2TAG_PACKET_1.0.2
+        pshufd    $68, %xmm5, %xmm5
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        psubw     %xmm0, %xmm5
+        lea       T2f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm0
+        lea       T2_neg_f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm5
+        pshufd    $68, %xmm2, %xmm3
+        movapd    48+cv(%rip), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        mulpd     %xmm3, %xmm3
+        mulpd     %xmm2, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulpd     64+cv(%rip), %xmm2
+        mulpd     %xmm3, %xmm1
+        mulpd     %xmm3, %xmm7
+        mulpd     %xmm3, %xmm4
+        mulpd     %xmm3, %xmm1
+        addpd     %xmm7, %xmm6
+        movq      %xmm0, %xmm7
+        addpd     %xmm1, %xmm4
+        shufpd    $0, %xmm5, %xmm7
+        subpd     %xmm5, %xmm0
+        mulpd     %xmm7, %xmm2
+        addpd     %xmm6, %xmm4
+        subsd     %xmm0, %xmm7
+        mulpd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        subsd     %xmm5, %xmm7
+        addpd     %xmm2, %xmm4
+        addsd     %xmm6, %xmm7
+        pshufd    $238, %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_1.0.2:
+        subl      $16352, %eax
+        movl      %eax, %ecx
+        andl      $32752, %eax
+        shrl      $1, %eax
+        andl      $65520, %eax
+        subl      %eax, %ecx
+        addl      $16352, %eax
+        pinsrw    $3, %eax, %xmm0
+        pshufd    $68, %xmm0, %xmm0
+        lea       T2f(%rip), %r8
+        mulpd     (%r8,%rdx,8), %xmm0
+        pshufd    $68, %xmm2, %xmm3
+        movsd     48+cv(%rip), %xmm7
+        mulsd     %xmm3, %xmm3
+        mulsd     %xmm2, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     64+cv(%rip), %xmm2
+        mulsd     %xmm3, %xmm1
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm3, %xmm4
+        addl      $16368, %ecx
+        pinsrw    $3, %ecx, %xmm5
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm7, %xmm6
+        addsd     %xmm1, %xmm4
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm6, %xmm4
+        mulsd     %xmm2, %xmm4
+        pshufd    $238, %xmm0, %xmm6
+        addsd     %xmm6, %xmm4
+        addsd     %xmm4, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm5, %xmm0
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        movl      $127, %edx
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_2.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        addl      $16343, %ecx
+        cmpl      $16343, %ecx
+        ja        .L_2TAG_PACKET_3.0.2
+        cmpl      $15856, %ecx
+        jb        .L_2TAG_PACKET_4.0.2
+        movapd    pv(%rip), %xmm1
+        pshufd    $68, %xmm0, %xmm6
+        mulpd     %xmm5, %xmm5
+        movapd    16+pv(%rip), %xmm2
+        pshufd    $68, %xmm0, %xmm7
+        movapd    32+pv(%rip), %xmm3
+        pshufd    $68, %xmm0, %xmm4
+        andpd     MASK3(%rip), %xmm6
+        mulpd     %xmm5, %xmm1
+        mulsd     %xmm5, %xmm2
+        subpd     %xmm6, %xmm4
+        mulpd     %xmm5, %xmm7
+        addpd     %xmm3, %xmm1
+        pshufd    $68, %xmm6, %xmm3
+        mulpd     %xmm5, %xmm5
+        mulsd     %xmm7, %xmm2
+        mulpd     %xmm7, %xmm1
+        pshufd    $68, %xmm0, %xmm7
+        mulsd     %xmm6, %xmm6
+        addsd     %xmm7, %xmm7
+        mulsd     %xmm4, %xmm4
+        mulpd     %xmm5, %xmm1
+        addsd     %xmm0, %xmm7
+        mulsd     %xmm3, %xmm6
+        mulsd     %xmm3, %xmm7
+        pshufd    $238, %xmm1, %xmm3
+        mulsd     %xmm5, %xmm1
+        pshufd    $238, %xmm4, %xmm5
+        addsd     %xmm2, %xmm3
+        pshufd    $238, %xmm2, %xmm2
+        addsd     %xmm4, %xmm7
+        movq      %xmm0, %xmm4
+        mulsd     %xmm2, %xmm6
+        mulsd     %xmm5, %xmm7
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm2, %xmm7
+        subsd     %xmm0, %xmm4
+        addsd     %xmm7, %xmm1
+        addsd     %xmm4, %xmm6
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        cmpl      $16, %ecx
+        jae       .L_2TAG_PACKET_5.0.2
+        movq      %xmm0, %xmm1
+        mulsd     %xmm1, %xmm1
+        jmp       ..B1.5
+.L_2TAG_PACKET_5.0.2:
+        xorpd     %xmm2, %xmm2
+        movl      $17392, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        xorpd     %xmm3, %xmm3
+        movl      $15344, %edx
+        pinsrw    $3, %edx, %xmm3
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        mulsd     %xmm3, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_3.0.2:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        xorpd     %xmm0, %xmm0
+        movl      $32736, %eax
+        pinsrw    $3, %eax, %xmm0
+        orl       %edx, %eax
+        pinsrw    $3, %eax, %xmm1
+        mulsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_2.0.2
+.L_2TAG_PACKET_6.0.2:
+        xorpd     %xmm1, %xmm1
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm1
+        andnpd    %xmm0, %xmm1
+        mulsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        movq      %xmm0, (%rsp)
+..B1.3:
+        movq      (%rsp), %xmm0
+.L_2TAG_PACKET_7.0.2:
+..B1.5:
+        popq      %rcx
+..___tag_value_sinh.4:
+        ret       
+..___tag_value_sinh.5:
+END(sinh)
+# -- End  sinh
+	.section .rodata, "a"
+	.align 16
+	.align 16
+L2E:
+	.long	1610612736
+	.long	1080497479
+	.long	4166901572
+	.long	1053077003
+	.type	L2E,@object
+	.size	L2E,16
+	.align 16
+Shifter:
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.type	Shifter,@object
+	.size	Shifter,16
+	.align 16
+cv:
+	.long	3607404736
+	.long	1044146952
+	.long	3607404736
+	.long	3191630600
+	.long	4277811695
+	.long	1063661122
+	.long	4277811695
+	.long	3211144770
+	.long	2140175755
+	.long	1033864261
+	.long	2140175755
+	.long	1033864261
+	.long	4289495988
+	.long	1054113747
+	.long	4289495988
+	.long	1054113747
+	.long	4277811695
+	.long	1064709698
+	.long	4277811695
+	.long	1064709698
+	.type	cv,@object
+	.size	cv,80
+	.align 16
+T2f:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	2851812149
+	.long	1072698941
+	.long	2595802551
+	.long	1016815913
+	.long	1048019041
+	.long	1072704666
+	.long	1398474845
+	.long	3161559171
+	.long	3899555717
+	.long	1072710421
+	.long	427280750
+	.long	3163595548
+	.long	3541402996
+	.long	1072716208
+	.long	2759177317
+	.long	1015903202
+	.long	702412510
+	.long	1072722027
+	.long	3803266087
+	.long	3163328991
+	.long	410360776
+	.long	1072727877
+	.long	1269990655
+	.long	1013024446
+	.long	3402036099
+	.long	1072733758
+	.long	405889334
+	.long	1016154232
+	.long	1828292879
+	.long	1072739672
+	.long	1255956747
+	.long	1016636974
+	.long	728909815
+	.long	1072745618
+	.long	383930225
+	.long	1016078044
+	.long	852742562
+	.long	1072751596
+	.long	667253586
+	.long	1010842135
+	.long	2952712987
+	.long	1072757606
+	.long	3293494651
+	.long	3161168877
+	.long	3490863953
+	.long	1072763649
+	.long	960797498
+	.long	3163997456
+	.long	3228316108
+	.long	1072769725
+	.long	3010241991
+	.long	3159471380
+	.long	2930322912
+	.long	1072775834
+	.long	2599499422
+	.long	3163762623
+	.long	3366293073
+	.long	1072781976
+	.long	3119426314
+	.long	1015169130
+	.long	1014845819
+	.long	1072788152
+	.long	3117910646
+	.long	3162607681
+	.long	948735466
+	.long	1072794361
+	.long	3516338028
+	.long	3163623459
+	.long	3949972341
+	.long	1072800603
+	.long	2068408548
+	.long	1015962444
+	.long	2214878420
+	.long	1072806880
+	.long	892270087
+	.long	3164164998
+	.long	828946858
+	.long	1072813191
+	.long	10642492
+	.long	1016988014
+	.long	586995997
+	.long	1072819536
+	.long	41662348
+	.long	3163676568
+	.long	2288159958
+	.long	1072825915
+	.long	2169144469
+	.long	1015924597
+	.long	2440944790
+	.long	1072832329
+	.long	2492769774
+	.long	1015196030
+	.long	1853186616
+	.long	1072838778
+	.long	3066496371
+	.long	1016705150
+	.long	1337108031
+	.long	1072845262
+	.long	3203724452
+	.long	1015726421
+	.long	1709341917
+	.long	1072851781
+	.long	2571168217
+	.long	1015201075
+	.long	3790955393
+	.long	1072858335
+	.long	2352942462
+	.long	3164228666
+	.long	4112506593
+	.long	1072864925
+	.long	2947355221
+	.long	1015419624
+	.long	3504003472
+	.long	1072871551
+	.long	3594001060
+	.long	3158379228
+	.long	2799960843
+	.long	1072878213
+	.long	1423655381
+	.long	1016070727
+	.long	2839424854
+	.long	1072884911
+	.long	1171596163
+	.long	1014090255
+	.long	171030293
+	.long	1072891646
+	.long	3526460132
+	.long	1015477354
+	.long	4232894513
+	.long	1072898416
+	.long	2383938684
+	.long	1015717095
+	.long	2992903935
+	.long	1072905224
+	.long	2218154406
+	.long	1016276769
+	.long	1603444721
+	.long	1072912069
+	.long	1548633640
+	.long	3163249902
+	.long	926591435
+	.long	1072918951
+	.long	3208833762
+	.long	3163962090
+	.long	1829099622
+	.long	1072925870
+	.long	1016661181
+	.long	3164509581
+	.long	887463927
+	.long	1072932827
+	.long	3596744163
+	.long	3161842742
+	.long	3272845541
+	.long	1072939821
+	.long	928852419
+	.long	3164536824
+	.long	1276261410
+	.long	1072946854
+	.long	300981948
+	.long	1015732745
+	.long	78413852
+	.long	1072953925
+	.long	4183226867
+	.long	3164065827
+	.long	569847338
+	.long	1072961034
+	.long	472945272
+	.long	3160339305
+	.long	3645941911
+	.long	1072968181
+	.long	3814685081
+	.long	3162621917
+	.long	1617004845
+	.long	1072975368
+	.long	82804944
+	.long	1011391354
+	.long	3978100823
+	.long	1072982593
+	.long	3513027190
+	.long	1016894539
+	.long	3049340112
+	.long	1072989858
+	.long	3062915824
+	.long	1014219171
+	.long	4040676318
+	.long	1072997162
+	.long	4090609238
+	.long	1016712034
+	.long	3577096743
+	.long	1073004506
+	.long	2951496418
+	.long	1014842263
+	.long	2583551245
+	.long	1073011890
+	.long	3161094195
+	.long	1016655067
+	.long	1990012071
+	.long	1073019314
+	.long	3529070563
+	.long	3163861769
+	.long	2731501122
+	.long	1073026778
+	.long	1774031855
+	.long	3163518597
+	.long	1453150082
+	.long	1073034283
+	.long	498154669
+	.long	3162536638
+	.long	3395129871
+	.long	1073041828
+	.long	4025345435
+	.long	3163383964
+	.long	917841882
+	.long	1073049415
+	.long	18715565
+	.long	1016707884
+	.long	3566716925
+	.long	1073057042
+	.long	1536826856
+	.long	1015191009
+	.long	3712504873
+	.long	1073064711
+	.long	88491949
+	.long	1016476236
+	.long	2321106615
+	.long	1073072422
+	.long	2171176610
+	.long	1010584347
+	.long	363667784
+	.long	1073080175
+	.long	813753950
+	.long	1016833785
+	.long	3111574537
+	.long	1073087969
+	.long	2606161479
+	.long	3163808322
+	.long	2956612997
+	.long	1073095806
+	.long	2118169751
+	.long	3163784129
+	.long	885834528
+	.long	1073103686
+	.long	1973258547
+	.long	3163310140
+	.long	2186617381
+	.long	1073111608
+	.long	2270764084
+	.long	3164321289
+	.long	3561793907
+	.long	1073119573
+	.long	1157054053
+	.long	1012938926
+	.long	1719614413
+	.long	1073127582
+	.long	330458198
+	.long	3164331316
+	.long	1963711167
+	.long	1073135634
+	.long	1744767757
+	.long	3161622870
+	.long	1013258799
+	.long	1073143730
+	.long	1748797611
+	.long	3161177658
+	.long	4182873220
+	.long	1073151869
+	.long	629542646
+	.long	3163044879
+	.long	3907805044
+	.long	1073160053
+	.long	2257091225
+	.long	3162598983
+	.long	1218806132
+	.long	1073168282
+	.long	1818613052
+	.long	3163597017
+	.long	1447192521
+	.long	1073176555
+	.long	1462857171
+	.long	3163563097
+	.long	1339972927
+	.long	1073184873
+	.long	167908909
+	.long	1016620728
+	.long	1944781191
+	.long	1073193236
+	.long	3993278767
+	.long	3162772855
+	.long	19972402
+	.long	1073201645
+	.long	3507899862
+	.long	1017057868
+	.long	919555682
+	.long	1073210099
+	.long	3121969534
+	.long	1013996802
+	.long	1413356050
+	.long	1073218599
+	.long	1651349291
+	.long	3163716742
+	.long	2571947539
+	.long	1073227145
+	.long	3558159064
+	.long	3164425245
+	.long	1176749997
+	.long	1073235738
+	.long	2738998779
+	.long	3163084420
+	.long	2604962541
+	.long	1073244377
+	.long	2614425274
+	.long	3164587768
+	.long	3649726105
+	.long	1073253063
+	.long	4085036346
+	.long	1016698050
+	.long	1110089947
+	.long	1073261797
+	.long	1451641639
+	.long	1016523249
+	.long	380978316
+	.long	1073270578
+	.long	854188970
+	.long	3161511262
+	.long	2568320822
+	.long	1073279406
+	.long	2732824428
+	.long	1015401491
+	.long	194117574
+	.long	1073288283
+	.long	777528612
+	.long	3164460665
+	.long	2966275557
+	.long	1073297207
+	.long	2176155324
+	.long	3160891335
+	.long	3418903055
+	.long	1073306180
+	.long	2527457337
+	.long	3161869180
+	.long	2682146384
+	.long	1073315202
+	.long	2082178513
+	.long	3164411995
+	.long	1892288442
+	.long	1073324273
+	.long	2446255666
+	.long	3163648957
+	.long	2191782032
+	.long	1073333393
+	.long	2960257726
+	.long	1014791238
+	.long	434316067
+	.long	1073342563
+	.long	2028358766
+	.long	1014506698
+	.long	2069751141
+	.long	1073351782
+	.long	1562170675
+	.long	3163773257
+	.long	3964284211
+	.long	1073361051
+	.long	2111583915
+	.long	1016475740
+	.long	2990417245
+	.long	1073370371
+	.long	3683467745
+	.long	3164417902
+	.long	321958744
+	.long	1073379742
+	.long	3401933767
+	.long	1016843134
+	.long	1434058175
+	.long	1073389163
+	.long	251133233
+	.long	1016134345
+	.long	3218338682
+	.long	1073398635
+	.long	3404164304
+	.long	3163525684
+	.long	2572866477
+	.long	1073408159
+	.long	878562433
+	.long	1016570317
+	.long	697153126
+	.long	1073417735
+	.long	1283515429
+	.long	3164331765
+	.long	3092190715
+	.long	1073427362
+	.long	814012168
+	.long	3160571998
+	.long	2380618042
+	.long	1073437042
+	.long	3149557219
+	.long	3164369375
+	.long	4076559943
+	.long	1073446774
+	.long	2119478331
+	.long	3161806927
+	.long	815859274
+	.long	1073456560
+	.long	240396590
+	.long	3164536019
+	.long	2420883922
+	.long	1073466398
+	.long	2049810052
+	.long	1015168464
+	.long	1540824585
+	.long	1073476290
+	.long	1064017011
+	.long	3164536266
+	.long	3716502172
+	.long	1073486235
+	.long	2303740125
+	.long	1015091301
+	.long	1610600570
+	.long	1073496235
+	.long	3766732298
+	.long	1016808759
+	.long	777507147
+	.long	1073506289
+	.long	4282924205
+	.long	1016236109
+	.long	2483480501
+	.long	1073516397
+	.long	1216371780
+	.long	1014082748
+	.long	3706687593
+	.long	1073526560
+	.long	3521726940
+	.long	1014301643
+	.long	1432208378
+	.long	1073536779
+	.long	1401068914
+	.long	3163412539
+	.long	1242007932
+	.long	1073547053
+	.long	1132034716
+	.long	3164388407
+	.long	135105010
+	.long	1073557383
+	.long	1906148728
+	.long	3164424315
+	.long	3707479175
+	.long	1073567768
+	.long	3613079303
+	.long	1015213314
+	.long	382305176
+	.long	1073578211
+	.long	2347622376
+	.long	3163627201
+	.long	64696965
+	.long	1073588710
+	.long	1768797490
+	.long	1016865536
+	.long	4076975200
+	.long	1073599265
+	.long	2029000899
+	.long	1016257111
+	.long	863738719
+	.long	1073609879
+	.long	1326992220
+	.long	3163661773
+	.long	351641897
+	.long	1073620550
+	.long	2172261526
+	.long	3164059175
+	.long	3884662774
+	.long	1073631278
+	.long	2158611599
+	.long	1015258761
+	.long	4224142467
+	.long	1073642065
+	.long	3389820386
+	.long	1016255778
+	.long	2728693978
+	.long	1073652911
+	.long	396109971
+	.long	3164511267
+	.long	764307441
+	.long	1073663816
+	.long	3021057420
+	.long	3164378099
+	.long	3999357479
+	.long	1073674779
+	.long	2258941616
+	.long	1016973300
+	.long	929806999
+	.long	1073685803
+	.long	3205336643
+	.long	1016308133
+	.long	1533953344
+	.long	1073696886
+	.long	769171851
+	.long	1016714209
+	.long	2912730644
+	.long	1073708029
+	.long	3490067722
+	.long	3164453650
+	.long	2174652632
+	.long	1073719233
+	.long	4087714590
+	.long	1015498835
+	.long	730821105
+	.long	1073730498
+	.long	2523232743
+	.long	1013115764
+	.type	T2f,@object
+	.size	T2f,2048
+	.align 16
+T2_neg_f:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.type	T2_neg_f,@object
+	.size	T2_neg_f,2048
+	.align 16
+pv:
+	.long	329805064
+	.long	1038488134
+	.long	2773927730
+	.long	1053236707
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1069897045
+	.long	1744127201
+	.long	1046144581
+	.long	436314137
+	.long	1059717536
+	.type	pv,@object
+	.size	pv,48
+	.align 16
+MASK3:
+	.long	0
+	.long	4294967280
+	.long	0
+	.long	4294967280
+	.type	MASK3,@object
+	.size	MASK3,16
+	.align 8
+HALFMASK:
+	.long	4160749568
+	.long	2147483647
+	.type	HALFMASK,@object
+	.size	HALFMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_sinh.1-.
+	.4byte ..___tag_value_sinh.5-..___tag_value_sinh.1
+	.2byte 0x0400
+	.4byte ..___tag_value_sinh.3-..___tag_value_sinh.1
+	.2byte 0x100e
+	.byte 0x04
+	.4byte ..___tag_value_sinh.4-..___tag_value_sinh.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/floor.S b/libm/x86_64/floor.S
new file mode 100644
index 0000000..dc80e88
--- /dev/null
+++ b/libm/x86_64/floor.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(floor)
+roundsd $0x1,%xmm0,%xmm0
+retq
+END(floor)
diff --git a/libm/x86_64/floorf.S b/libm/x86_64/floorf.S
new file mode 100644
index 0000000..832f9c5
--- /dev/null
+++ b/libm/x86_64/floorf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(floorf)
+roundss $0x1,%xmm0,%xmm0
+retq
+END(floorf)
diff --git a/libm/x86_64/lrint.S b/libm/x86_64/lrint.S
new file mode 100644
index 0000000..f809a1f
--- /dev/null
+++ b/libm/x86_64/lrint.S
@@ -0,0 +1,35 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrint)
+  // LP64 sizeof(long) == 8.
+  cvtsd2si  %xmm0, %rax
+  ret
+END(lrint)
+
+// LP64 sizeof(long long) == sizeof(long).
+ALIAS_SYMBOL(llrint, lrint);
diff --git a/libm/x86_64/lrintf.S b/libm/x86_64/lrintf.S
new file mode 100644
index 0000000..a661cbc
--- /dev/null
+++ b/libm/x86_64/lrintf.S
@@ -0,0 +1,35 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrintf)
+  // LP64 sizeof(long) == 8.
+  cvtss2si  %xmm0, %rax
+  ret
+END(lrintf)
+
+// LP64 sizeof(long long) == sizeof(long).
+ALIAS_SYMBOL(llrintf, lrintf);
diff --git a/libm/x86_64/rint.S b/libm/x86_64/rint.S
new file mode 100644
index 0000000..098fdc5
--- /dev/null
+++ b/libm/x86_64/rint.S
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rint)
+  roundsd $0x4,%xmm0,%xmm0
+  retq
+END(rint)
diff --git a/libm/x86_64/rintf.S b/libm/x86_64/rintf.S
new file mode 100644
index 0000000..09f5e9c
--- /dev/null
+++ b/libm/x86_64/rintf.S
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rintf)
+  roundss $0x4,%xmm0,%xmm0
+  retq
+END(rintf)
diff --git a/libm/x86_64/s_atan.S b/libm/x86_64/s_atan.S
new file mode 100644
index 0000000..2453e10
--- /dev/null
+++ b/libm/x86_64/s_atan.S
@@ -0,0 +1,927 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// This implementation uses the main path for |x| in [2^{-5},2^65).
+// For |x| in [2^{-64},2^{-5}), a secondary path is used.
+// For the biased exponent of X within 3FFH-64 and 3FF+64, we use one branch.
+// We use the following definition of B and X` so that the formula
+// atan(X) = Tau + atan( (X`-B) / (One + BX) ) is correct
+//
+// X = (-1)^s * 2^k * 1. x1 x2 ... x52
+//
+// Define X`  = 0 if k >= 5; and X`  = |X| otherwise
+// Define One = 0 if k >= 5; and One = 1 otherwise
+// Define B  = 0 if k <= -6; B =  2^k * 1.x1 x2 x3 x4 1  if -5 <= k <= 4
+// Define B  =  2^5 * 1.0 0 ... 0   if  k >= 5
+//
+// Tau is 0 if k <= -6;
+// Tau is atan( B )  if -5 <= k <= 4
+// Tau is pi/2 if k >= 5
+//
+// Special cases:
+//  atan(NaN) = quiet NaN
+//  atan(+/-INF) = +/-Pi/2
+//  atan(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  atan
+ENTRY(atan)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_atan.1:
+        pushq     %rsi
+..___tag_value_atan.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        movq      $0xffff000000000000, %r8
+        movd      %r8, %xmm3
+        movq      ONEMASK(%rip), %xmm5
+        movq      $0x800000000000, %r9
+        movd      %r9, %xmm4
+        pextrw    $3, %xmm0, %edx
+        andpd     %xmm0, %xmm3
+        pshufd    $68, %xmm0, %xmm1
+        orpd      %xmm4, %xmm3
+        movl      %edx, %eax
+        andl      $32767, %edx
+        subl      $16288, %edx
+        cmpl      $159, %edx
+        ja        .L_2TAG_PACKET_0.0.1
+        mulsd     %xmm3, %xmm1
+        subsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm1
+        divsd     %xmm1, %xmm0
+        addl      $1, %edx
+        movq      a2(%rip), %xmm2
+        movq      b2(%rip), %xmm4
+        andl      $32768, %eax
+        xorpd     %xmm7, %xmm7
+        pinsrw    $3, %eax, %xmm7
+        addl      %edx, %edx
+        lea       atan_tbl(%rip), %r8
+        movq      (%r8,%rdx,8), %xmm6
+        movq      8(%r8,%rdx,8), %xmm5
+        xorpd     %xmm7, %xmm5
+        xorpd     %xmm7, %xmm6
+        movq      8+a2(%rip), %xmm7
+        movddup   %xmm0, %xmm1
+        mulsd     %xmm0, %xmm0
+        movddup   %xmm1, %xmm3
+        addsd     %xmm6, %xmm1
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm4
+        subsd     %xmm1, %xmm6
+        mulsd     %xmm0, %xmm4
+        addsd     %xmm7, %xmm2
+        mulsd     %xmm3, %xmm0
+        addsd     %xmm3, %xmm6
+        mulsd     %xmm2, %xmm0
+        addsd     8+b2(%rip), %xmm4
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm6, %xmm0
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.1
+.L_2TAG_PACKET_0.0.1:
+        addl      $944, %edx
+        cmpl      $1103, %edx
+        ja        .L_2TAG_PACKET_2.0.1
+        movq      a2(%rip), %xmm4
+        movq      b2(%rip), %xmm7
+        movq      (%rsp), %xmm0
+        mulsd     %xmm1, %xmm1
+        movq      8+a2(%rip), %xmm2
+        movq      8+b2(%rip), %xmm5
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm1, %xmm7
+        movq      %xmm1, %xmm6
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm4, %xmm2
+        mulsd     %xmm6, %xmm7
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm7, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.1
+.L_2TAG_PACKET_2.0.1:
+        addl      $15344, %edx
+        cmpl      $16368, %edx
+        ja        .L_2TAG_PACKET_3.0.1
+        movq      (%rsp), %xmm0
+        movq      (%rsp), %xmm1
+        cmpl      $16, %edx
+        jae       .L_2TAG_PACKET_1.0.1
+        mulsd     %xmm0, %xmm1
+        jmp       .L_2TAG_PACKET_1.0.1
+.L_2TAG_PACKET_3.0.1:
+        cmpl      $17392, %edx
+        jae       .L_2TAG_PACKET_4.0.1
+        movq      $0xbff0000000000000, %r8
+        movd      %r8, %xmm1
+        divsd     %xmm0, %xmm1
+        movq      a2(%rip), %xmm2
+        movq      b2(%rip), %xmm4
+        andl      $32768, %eax
+        xorpd     %xmm7, %xmm7
+        pinsrw    $3, %eax, %xmm7
+        addl      %edx, %edx
+        movq      pi_table(%rip), %xmm6
+        movq      8+pi_table(%rip), %xmm5
+        xorpd     %xmm7, %xmm5
+        xorpd     %xmm7, %xmm6
+        movq      8+a2(%rip), %xmm7
+        movddup   %xmm1, %xmm0
+        mulsd     %xmm1, %xmm1
+        movddup   %xmm0, %xmm3
+        addsd     %xmm6, %xmm0
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm1, %xmm4
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm7, %xmm2
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm3, %xmm6
+        mulsd     %xmm2, %xmm1
+        addsd     8+b2(%rip), %xmm4
+        addsd     %xmm5, %xmm6
+        mulsd     %xmm4, %xmm1
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.1
+.L_2TAG_PACKET_4.0.1:
+        movq      (%rsp), %xmm4
+        movq      SGNMASK(%rip), %xmm0
+        movq      pi_table(%rip), %xmm2
+        movq      8+pi_table(%rip), %xmm3
+        movd      %xmm1, %eax
+        psrlq     $32, %xmm1
+        movd      %xmm1, %edx
+        andl      $2147483647, %edx
+        cmpl      $2146435072, %edx
+        jae       .L_2TAG_PACKET_5.0.1
+.L_2TAG_PACKET_6.0.1:
+        andnpd    %xmm4, %xmm0
+        orpd      %xmm0, %xmm2
+        orpd      %xmm3, %xmm0
+        addsd     %xmm2, %xmm0
+        jmp       .L_2TAG_PACKET_1.0.1
+.L_2TAG_PACKET_5.0.1:
+        subl      $2146435072, %edx
+        orl       %edx, %eax
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_6.0.1
+        movq      %xmm4, %xmm0
+        addsd     %xmm0, %xmm0
+.L_2TAG_PACKET_1.0.1:
+..B1.3:
+        popq      %rcx
+..___tag_value_atan.4:
+        ret       
+..___tag_value_atan.5:
+END(atan)
+# -- End  atan
+	.section .rodata, "a"
+	.align 4
+	.align 4
+ONEMASK:
+	.long	0
+	.long	1072693248
+	.type	ONEMASK,@object
+	.size	ONEMASK,8
+	.align 4
+a2:
+	.long	2006262985
+	.long	1069310863
+	.long	2358449471
+	.long	3217342131
+	.type	a2,@object
+	.size	a2,16
+	.align 4
+b2:
+	.long	3845454352
+	.long	1069952297
+	.long	2829679149
+	.long	1073771565
+	.type	b2,@object
+	.size	b2,16
+	.align 4
+atan_tbl:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3819695742
+	.long	1067482761
+	.long	2398680355
+	.long	3155462074
+	.long	2998791009
+	.long	1067548225
+	.long	3868465248
+	.long	3157182472
+	.long	3339424991
+	.long	1067613680
+	.long	3296670360
+	.long	1010752543
+	.long	2710002256
+	.long	1067679126
+	.long	3403896007
+	.long	1010910768
+	.long	3275701428
+	.long	1067744562
+	.long	119959933
+	.long	1011482843
+	.long	2908636881
+	.long	1067809988
+	.long	2464489612
+	.long	1011545526
+	.long	3777889398
+	.long	1067875403
+	.long	3262682165
+	.long	1009703919
+	.long	3759667419
+	.long	1067940807
+	.long	1838130851
+	.long	3157373556
+	.long	732369940
+	.long	1068006200
+	.long	1203428313
+	.long	1010055371
+	.long	1166616461
+	.long	1068071580
+	.long	2901274051
+	.long	3158549977
+	.long	2945472892
+	.long	1068136947
+	.long	3726120658
+	.long	1009762715
+	.long	3954480976
+	.long	1068202301
+	.long	1289173457
+	.long	1009429861
+	.long	2081752829
+	.long	1068267642
+	.long	1836909874
+	.long	1006212095
+	.long	3807999788
+	.long	1068332968
+	.long	2172459940
+	.long	3156162078
+	.long	2731789884
+	.long	1068398280
+	.long	3450718392
+	.long	3159216547
+	.long	1044477961
+	.long	1068463577
+	.long	2230553229
+	.long	1011424339
+	.long	1486930287
+	.long	1068530218
+	.long	2861547474
+	.long	1012041376
+	.long	2293016881
+	.long	1068595466
+	.long	136843272
+	.long	1012684797
+	.long	201518157
+	.long	1068660680
+	.long	63231984
+	.long	1012427198
+	.long	4054234584
+	.long	1068725856
+	.long	3927006960
+	.long	1011878955
+	.long	1246477213
+	.long	1068790995
+	.long	1494265652
+	.long	3155219350
+	.long	678186699
+	.long	1068856093
+	.long	1264361424
+	.long	3159256693
+	.long	2690594995
+	.long	1068921148
+	.long	3906996379
+	.long	1009288267
+	.long	3362611517
+	.long	1068986159
+	.long	1650970041
+	.long	3158331771
+	.long	3102162111
+	.long	1069051124
+	.long	365917035
+	.long	3160264153
+	.long	2352611067
+	.long	1069116041
+	.long	4008970190
+	.long	3159478182
+	.long	1594134794
+	.long	1069180908
+	.long	466690178
+	.long	1012526501
+	.long	1345079306
+	.long	1069245723
+	.long	2268273568
+	.long	3160164092
+	.long	2163300970
+	.long	1069310484
+	.long	2750834800
+	.long	3158113482
+	.long	352522716
+	.long	1069375190
+	.long	1750411372
+	.long	1011790845
+	.long	848541647
+	.long	1069439838
+	.long	2164207573
+	.long	1011698350
+	.long	40647312
+	.long	1069504427
+	.long	2949165434
+	.long	3159107267
+	.long	2216766270
+	.long	1069574357
+	.long	2197920765
+	.long	3161055954
+	.long	1090914384
+	.long	1069638757
+	.long	2330454674
+	.long	1013365998
+	.long	387601244
+	.long	1069703022
+	.long	3185681168
+	.long	1013434071
+	.long	3991640484
+	.long	1069767144
+	.long	1313211590
+	.long	3161087959
+	.long	3322489502
+	.long	1069831118
+	.long	3013977995
+	.long	1013053011
+	.long	3121698570
+	.long	1069894936
+	.long	4069015667
+	.long	1013023362
+	.long	4289964660
+	.long	1069958591
+	.long	1736191156
+	.long	3158266731
+	.long	3903312386
+	.long	1070022077
+	.long	1833592413
+	.long	3159731471
+	.long	3818449864
+	.long	1070085387
+	.long	851036429
+	.long	3159730451
+	.long	2097480306
+	.long	1070148515
+	.long	3506390884
+	.long	3160462302
+	.long	1611694502
+	.long	1070211454
+	.long	2785735540
+	.long	3160465144
+	.long	1464694796
+	.long	1070274198
+	.long	4229277299
+	.long	3159907000
+	.long	1299612775
+	.long	1070336741
+	.long	4116653788
+	.long	3160427739
+	.long	1310544789
+	.long	1070399077
+	.long	1064430331
+	.long	1013218202
+	.long	2253168030
+	.long	1070461200
+	.long	1405044609
+	.long	3157623179
+	.long	1159567373
+	.long	1070523105
+	.long	2353445521
+	.long	3159992176
+	.long	1359373750
+	.long	1070605818
+	.long	1748171336
+	.long	3161879263
+	.long	908341706
+	.long	1070667034
+	.long	3372710815
+	.long	3161775245
+	.long	1743027350
+	.long	1070727765
+	.long	687089934
+	.long	3160507171
+	.long	2055355646
+	.long	1070787992
+	.long	2392855242
+	.long	1013682469
+	.long	690426164
+	.long	1070847697
+	.long	1103926666
+	.long	1014052810
+	.long	1483247847
+	.long	1070906862
+	.long	2082645847
+	.long	3161345479
+	.long	392040270
+	.long	1070965472
+	.long	2407720023
+	.long	1014053754
+	.long	2673846014
+	.long	1071023511
+	.long	1293605532
+	.long	3158464385
+	.long	1384215810
+	.long	1071080967
+	.long	2446095872
+	.long	3159216407
+	.long	3101660631
+	.long	1071137826
+	.long	698040758
+	.long	1014855328
+	.long	2094057058
+	.long	1071194078
+	.long	2282048339
+	.long	1014040385
+	.long	1712750594
+	.long	1071249712
+	.long	1204372378
+	.long	3162276464
+	.long	1411515787
+	.long	1071304719
+	.long	949080808
+	.long	1015006403
+	.long	931538085
+	.long	1071359091
+	.long	3027127039
+	.long	1014307233
+	.long	179139065
+	.long	1071412821
+	.long	4285547492
+	.long	3161934731
+	.long	3387721259
+	.long	1071465902
+	.long	373225773
+	.long	1013486625
+	.long	2132236852
+	.long	1071544299
+	.long	3250533429
+	.long	1014031677
+	.long	1942070284
+	.long	1071645596
+	.long	1237964179
+	.long	3163239113
+	.long	1532707802
+	.long	1071695380
+	.long	330645583
+	.long	1012495610
+	.long	2294184979
+	.long	1071743834
+	.long	3959472897
+	.long	1015833116
+	.long	3805060714
+	.long	1071790961
+	.long	2671256142
+	.long	1013727772
+	.long	2215037898
+	.long	1071836770
+	.long	2683359117
+	.long	1015831902
+	.long	483661594
+	.long	1071881273
+	.long	836288326
+	.long	3162648643
+	.long	1534679894
+	.long	1071924486
+	.long	373258696
+	.long	3162470096
+	.long	1538714628
+	.long	1071966430
+	.long	3199433068
+	.long	1015325501
+	.long	527642555
+	.long	1072007128
+	.long	3636832592
+	.long	3161843145
+	.long	291339150
+	.long	1072046605
+	.long	890169537
+	.long	3160586117
+	.long	2450210201
+	.long	1072084888
+	.long	1636353294
+	.long	3163193400
+	.long	2411367951
+	.long	1072122007
+	.long	374899873
+	.long	1011331750
+	.long	681549971
+	.long	1072157992
+	.long	506411689
+	.long	1015373954
+	.long	1466745541
+	.long	1072192873
+	.long	2143860931
+	.long	1013364334
+	.long	2845622366
+	.long	1072226682
+	.long	2869178209
+	.long	3162423682
+	.long	2838871438
+	.long	1072275456
+	.long	3742223599
+	.long	1014338577
+	.long	4200275274
+	.long	1072337034
+	.long	1566539915
+	.long	3161839550
+	.long	3034733530
+	.long	1072394897
+	.long	652621408
+	.long	3162261964
+	.long	3207412993
+	.long	1072449290
+	.long	3206124665
+	.long	1014408733
+	.long	624461478
+	.long	1072500450
+	.long	932437485
+	.long	1015204343
+	.long	767665908
+	.long	1072548600
+	.long	1037911952
+	.long	3163527627
+	.long	1110773639
+	.long	1072593952
+	.long	2371517912
+	.long	3160465741
+	.long	1940828530
+	.long	1072636704
+	.long	2731408428
+	.long	3162895795
+	.long	1911329388
+	.long	1072677041
+	.long	1773089615
+	.long	3159569267
+	.long	1764715788
+	.long	1072704191
+	.long	691346949
+	.long	3164069946
+	.long	3332979233
+	.long	1072722195
+	.long	3550733983
+	.long	1014770628
+	.long	1321870254
+	.long	1072739231
+	.long	1415315820
+	.long	1016224052
+	.long	3657429030
+	.long	1072755365
+	.long	3910539033
+	.long	1015966402
+	.long	4197624557
+	.long	1072770661
+	.long	2333399254
+	.long	3164546480
+	.long	1512059493
+	.long	1072785177
+	.long	2701510318
+	.long	1016178092
+	.long	453379037
+	.long	1072798965
+	.long	4046344253
+	.long	3162814364
+	.long	1942345162
+	.long	1072818388
+	.long	621134147
+	.long	1016335195
+	.long	4210176273
+	.long	1072842164
+	.long	2701013387
+	.long	3164326619
+	.long	4185644010
+	.long	1072863795
+	.long	4163699341
+	.long	1016203112
+	.long	679688788
+	.long	1072883543
+	.long	4147276762
+	.long	1014066750
+	.long	29432865
+	.long	1072901630
+	.long	970415797
+	.long	1016902063
+	.long	4070721092
+	.long	1072918247
+	.long	2539004411
+	.long	3163736096
+	.long	2252468843
+	.long	1072933561
+	.long	3424082887
+	.long	3163407177
+	.long	2929724825
+	.long	1072947712
+	.long	3661482235
+	.long	3163846989
+	.long	1377513368
+	.long	1072960824
+	.long	3987926680
+	.long	1013647908
+	.long	1031632908
+	.long	1072973003
+	.long	3672217151
+	.long	1016614619
+	.long	2516508130
+	.long	1072984342
+	.long	545855020
+	.long	3162728930
+	.long	3792452178
+	.long	1072994923
+	.long	3420119467
+	.long	1016471430
+	.long	3147791459
+	.long	1073004818
+	.long	1342204979
+	.long	1013937254
+	.long	999189752
+	.long	1073014090
+	.long	1006335472
+	.long	3162850919
+	.long	711011011
+	.long	1073022794
+	.long	4633488
+	.long	3162966895
+	.long	15640363
+	.long	1073030980
+	.long	1686389560
+	.long	3164376226
+	.long	1218463589
+	.long	1073042382
+	.long	1526837110
+	.long	3163533985
+	.long	2538470555
+	.long	1073056144
+	.long	2273304406
+	.long	3163784996
+	.long	1229720947
+	.long	1073068489
+	.long	2971628206
+	.long	3162356540
+	.long	3115427016
+	.long	1073079621
+	.long	4215132957
+	.long	3164282762
+	.long	4030612557
+	.long	1073089709
+	.long	1913251691
+	.long	3163671292
+	.long	2728521257
+	.long	1073098892
+	.long	2861089500
+	.long	1015454459
+	.long	1118696283
+	.long	1073107285
+	.long	1628948053
+	.long	1016179658
+	.long	2682711255
+	.long	1073114984
+	.long	2906306266
+	.long	1014142643
+	.long	2073898081
+	.long	1073122072
+	.long	1322740454
+	.long	3164497217
+	.long	1403700297
+	.long	1073128618
+	.long	416137895
+	.long	3162781466
+	.long	2502685617
+	.long	1073134681
+	.long	3242008732
+	.long	1014593495
+	.long	1531926851
+	.long	1073140313
+	.long	1362708094
+	.long	1016517604
+	.long	3572814411
+	.long	1073145557
+	.long	3709790527
+	.long	1012646874
+	.long	1695536111
+	.long	1073150453
+	.long	3980346340
+	.long	1016705136
+	.long	2363057203
+	.long	1073155033
+	.long	2551194792
+	.long	1012569695
+	.long	2873365682
+	.long	1073159327
+	.long	3181154748
+	.long	1017041450
+	.long	1053384691
+	.long	1073165288
+	.long	3074536879
+	.long	1016965660
+	.long	3270542712
+	.long	1073172451
+	.long	2535319415
+	.long	3163051778
+	.long	1353631484
+	.long	1073178850
+	.long	1173833755
+	.long	1015534537
+	.long	3511218460
+	.long	1073184599
+	.long	1243608109
+	.long	3161592122
+	.long	4121259284
+	.long	1073189793
+	.long	398584912
+	.long	3163829923
+	.long	1193862106
+	.long	1073194509
+	.long	1873745539
+	.long	3163802819
+	.long	3861949790
+	.long	1073198808
+	.long	3841261147
+	.long	1015587248
+	.long	1486904578
+	.long	1073202745
+	.long	1634726776
+	.long	3163847886
+	.long	2879153715
+	.long	1073206362
+	.long	200456242
+	.long	3164138657
+	.long	385353253
+	.long	1073209698
+	.long	1186355517
+	.long	1014887155
+	.long	1125865839
+	.long	1073212783
+	.long	203561262
+	.long	3161244927
+	.long	1221361475
+	.long	1073215645
+	.long	3382476563
+	.long	1014936138
+	.long	2077323573
+	.long	1073218307
+	.long	1005121005
+	.long	3164430752
+	.long	215611373
+	.long	1073220790
+	.long	353198764
+	.long	3164485137
+	.long	2347419265
+	.long	1073223110
+	.long	1103143360
+	.long	1016542137
+	.long	1379112765
+	.long	1073225284
+	.long	381583533
+	.long	3162870833
+	.long	3891198463
+	.long	1073228298
+	.long	1771275754
+	.long	1014654681
+	.long	3395914051
+	.long	1073231917
+	.long	2350900914
+	.long	3164013978
+	.long	2799919478
+	.long	1073235146
+	.long	2893950164
+	.long	3163260901
+	.long	1138673476
+	.long	1073238045
+	.long	2622204785
+	.long	3164174388
+	.long	3408855940
+	.long	1073240661
+	.long	2800881650
+	.long	1016008624
+	.long	2044858738
+	.long	1073243035
+	.long	604544785
+	.long	1017022901
+	.long	2578795176
+	.long	1073245198
+	.long	2557332925
+	.long	1016135165
+	.long	4196285314
+	.long	1073247177
+	.long	2032365307
+	.long	1016194735
+	.long	224877747
+	.long	1073248996
+	.long	497926916
+	.long	1016947111
+	.long	3271386490
+	.long	1073250671
+	.long	2689994846
+	.long	1016631513
+	.long	813635989
+	.long	1073252221
+	.long	747035277
+	.long	3164530136
+	.long	369829519
+	.long	1073253658
+	.long	2182033858
+	.long	3163190340
+	.long	1187679052
+	.long	1073254994
+	.long	673954443
+	.long	1016149821
+	.long	4232586098
+	.long	1073256239
+	.long	497775200
+	.long	3162179015
+	.long	426690558
+	.long	1073257404
+	.long	3063343247
+	.long	1016865578
+	.long	1624065902
+	.long	1073258494
+	.long	1354224996
+	.long	3163503778
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.type	atan_tbl,@object
+	.size	atan_tbl,2592
+	.align 4
+pi_table:
+	.long	1413754136
+	.long	1073291771
+	.long	856972295
+	.long	1016178214
+	.type	pi_table,@object
+	.size	pi_table,16
+	.align 4
+SGNMASK:
+	.long	4294967295
+	.long	2147483647
+	.type	SGNMASK,@object
+	.size	SGNMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_atan.1-.
+	.4byte ..___tag_value_atan.5-..___tag_value_atan.1
+	.2byte 0x0400
+	.4byte ..___tag_value_atan.3-..___tag_value_atan.1
+	.2byte 0x100e
+	.byte 0x04
+	.4byte ..___tag_value_atan.4-..___tag_value_atan.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/s_cbrt.S b/libm/x86_64/s_cbrt.S
new file mode 100644
index 0000000..4aa4373
--- /dev/null
+++ b/libm/x86_64/s_cbrt.S
@@ -0,0 +1,754 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//   Assume x=2^{3*k+j} * 1.b1 b2 ... b5 b6 ... b52, where j = 0,1,2.
+//   Let r=(x*2^{-3k-j} - 1.b1 b2 ... b5 1)* rcp[b1 b2 ..b5],
+//   where rcp[b1 b2 .. b5]=1/(1.b1 b2 b3 b4 b5 1) in double precision
+//   cbrt(2^j * 1. b1 b2 .. b5 1) is approximated as T[j][b1..b5]+D[j][b1..b5]
+//   (T stores the high 53 bits, D stores the low order bits)
+//   Result=2^k*T+(2^k*T*r)*P+2^k*D
+//   where P=p1+p2*r+..+p8*r^7
+//
+// Special cases:
+//  cbrt(NaN) = quiet NaN, and raise invalid exception
+//  cbrt(INF) = that INF
+//  cbrt(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  cbrt
+ENTRY(cbrt)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_cbrt.1:
+        subq      $24, %rsp
+..___tag_value_cbrt.3:
+        movsd     %xmm0, (%rsp)
+..B1.2:
+        movq      %xmm0, %xmm7
+        movl      $524032, %edx
+        movsd     EXP_MSK3(%rip), %xmm5
+        movsd     EXP_MSK2(%rip), %xmm3
+        psrlq     $44, %xmm7
+        pextrw    $0, %xmm7, %ecx
+        movd      %xmm7, %eax
+        movsd     EXP_MASK(%rip), %xmm1
+        movsd     SIG_MASK(%rip), %xmm2
+        andl      $248, %ecx
+        lea       rcp_table(%rip), %r8
+        movsd     (%rcx,%r8), %xmm4
+        movq      %rax, %r9
+        andl      %eax, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_0.0.1
+        cmpl      $524032, %edx
+        je        .L_2TAG_PACKET_1.0.1
+        shrl      $8, %edx
+        shrq      $8, %r9
+        andpd     %xmm0, %xmm2
+        andpd     %xmm5, %xmm0
+        orpd      %xmm2, %xmm3
+        orpd      %xmm0, %xmm1
+        movapd    coeff_table(%rip), %xmm5
+        movl      $5462, %eax
+        movapd    16+coeff_table(%rip), %xmm6
+        mull      %edx
+        movq      %r9, %rdx
+        andq      $2047, %r9
+        shrl      $14, %eax
+        andl      $2048, %edx
+        subq      %rax, %r9
+        subq      %rax, %r9
+        subq      %rax, %r9
+        shlq      $8, %r9
+        addl      $682, %eax
+        orl       %edx, %eax
+        movd      %eax, %xmm7
+        addq      %r9, %rcx
+        psllq     $52, %xmm7
+.L_2TAG_PACKET_2.0.1:
+        movapd    32+coeff_table(%rip), %xmm2
+        movapd    48+coeff_table(%rip), %xmm0
+        subsd     %xmm3, %xmm1
+        movq      %xmm7, %xmm3
+        lea       cbrt_table(%rip), %r8
+        mulsd     (%rcx,%r8), %xmm7
+        mulsd     %xmm4, %xmm1
+        lea       D_table(%rip), %r8
+        mulsd     (%rcx,%r8), %xmm3
+        movapd    %xmm1, %xmm4
+        unpcklpd  %xmm1, %xmm1
+        mulpd     %xmm1, %xmm5
+        mulpd     %xmm1, %xmm6
+        mulpd     %xmm1, %xmm1
+        addpd     %xmm5, %xmm2
+        addpd     %xmm6, %xmm0
+        mulpd     %xmm1, %xmm2
+        mulpd     %xmm1, %xmm1
+        mulsd     %xmm7, %xmm4
+        addpd     %xmm2, %xmm0
+        mulsd     %xmm0, %xmm1
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm3, %xmm0
+        addsd     %xmm7, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_0.0.1:
+        mulsd     SCALE63(%rip), %xmm0
+        movq      %xmm0, %xmm7
+        movl      $524032, %edx
+        psrlq     $44, %xmm7
+        pextrw    $0, %xmm7, %ecx
+        movd      %xmm7, %eax
+        andl      $248, %ecx
+        lea       rcp_table(%rip), %r8
+        movsd     (%rcx,%r8), %xmm4
+        movq      %rax, %r9
+        andl      %eax, %edx
+        shrl      $8, %edx
+        shrq      $8, %r9
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_3.0.1
+        andpd     %xmm0, %xmm2
+        andpd     %xmm5, %xmm0
+        orpd      %xmm2, %xmm3
+        orpd      %xmm0, %xmm1
+        movapd    coeff_table(%rip), %xmm5
+        movl      $5462, %eax
+        movapd    16+coeff_table(%rip), %xmm6
+        mull      %edx
+        movq      %r9, %rdx
+        andq      $2047, %r9
+        shrl      $14, %eax
+        andl      $2048, %edx
+        subq      %rax, %r9
+        subq      %rax, %r9
+        subq      %rax, %r9
+        shlq      $8, %r9
+        addl      $661, %eax
+        orl       %edx, %eax
+        movd      %eax, %xmm7
+        addq      %r9, %rcx
+        psllq     $52, %xmm7
+        jmp       .L_2TAG_PACKET_2.0.1
+.L_2TAG_PACKET_3.0.1:
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_4.0.1
+        xorpd     %xmm0, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_4.0.1:
+        movsd     ZERON(%rip), %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_1.0.1:
+        movl      4(%rsp), %eax
+        movl      (%rsp), %edx
+        movl      %eax, %ecx
+        andl      $2147483647, %ecx
+        cmpl      $2146435072, %ecx
+        ja        .L_2TAG_PACKET_5.0.1
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_5.0.1
+        cmpl      $2146435072, %eax
+        jne       .L_2TAG_PACKET_6.0.1
+        movsd     INF(%rip), %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_6.0.1:
+        movsd     NEG_INF(%rip), %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_5.0.1:
+        movsd     (%rsp), %xmm0
+        addsd     %xmm0, %xmm0
+        movq      %xmm0, 8(%rsp)
+.L_2TAG_PACKET_7.0.1:
+..B1.4:
+        addq      $24, %rsp
+..___tag_value_cbrt.4:
+        ret       
+..___tag_value_cbrt.5:
+END(cbrt)
+# -- End  cbrt
+	.section .rodata, "a"
+	.align 16
+	.align 16
+coeff_table:
+	.long	1553778919
+	.long	3213899486
+	.long	3534952507
+	.long	3215266280
+	.long	1646371399
+	.long	3214412045
+	.long	477218588
+	.long	3216798151
+	.long	3582521621
+	.long	1066628362
+	.long	1007461464
+	.long	1068473053
+	.long	889629714
+	.long	1067378449
+	.long	1431655765
+	.long	1070945621
+	.type	coeff_table,@object
+	.size	coeff_table,64
+	.align 4
+EXP_MSK3:
+	.long	4294967295
+	.long	1048575
+	.type	EXP_MSK3,@object
+	.size	EXP_MSK3,8
+	.align 4
+EXP_MSK2:
+	.long	0
+	.long	3220193280
+	.type	EXP_MSK2,@object
+	.size	EXP_MSK2,8
+	.align 4
+EXP_MASK:
+	.long	0
+	.long	3220176896
+	.type	EXP_MASK,@object
+	.size	EXP_MASK,8
+	.align 4
+SIG_MASK:
+	.long	0
+	.long	1032192
+	.type	SIG_MASK,@object
+	.size	SIG_MASK,8
+	.align 4
+rcp_table:
+	.long	528611360
+	.long	3220144632
+	.long	2884679527
+	.long	3220082993
+	.long	1991868891
+	.long	3220024928
+	.long	2298714891
+	.long	3219970134
+	.long	58835168
+	.long	3219918343
+	.long	3035110223
+	.long	3219869313
+	.long	1617585086
+	.long	3219822831
+	.long	2500867033
+	.long	3219778702
+	.long	4241943008
+	.long	3219736752
+	.long	258732970
+	.long	3219696825
+	.long	404232216
+	.long	3219658776
+	.long	2172167368
+	.long	3219622476
+	.long	1544257904
+	.long	3219587808
+	.long	377579543
+	.long	3219554664
+	.long	1616385542
+	.long	3219522945
+	.long	813783277
+	.long	3219492562
+	.long	3940743189
+	.long	3219463431
+	.long	2689777499
+	.long	3219435478
+	.long	1700977147
+	.long	3219408632
+	.long	3169102082
+	.long	3219382828
+	.long	327235604
+	.long	3219358008
+	.long	1244336319
+	.long	3219334115
+	.long	1300311200
+	.long	3219311099
+	.long	3095471925
+	.long	3219288912
+	.long	2166487928
+	.long	3219267511
+	.long	2913108253
+	.long	3219246854
+	.long	293672978
+	.long	3219226904
+	.long	288737297
+	.long	3219207624
+	.long	1810275472
+	.long	3219188981
+	.long	174592167
+	.long	3219170945
+	.long	3539053052
+	.long	3219153485
+	.long	2164392968
+	.long	3219136576
+	.type	rcp_table,@object
+	.size	rcp_table,256
+	.align 4
+cbrt_table:
+	.long	572345495
+	.long	1072698681
+	.long	1998204467
+	.long	1072709382
+	.long	3861501553
+	.long	1072719872
+	.long	2268192434
+	.long	1072730162
+	.long	2981979308
+	.long	1072740260
+	.long	270859143
+	.long	1072750176
+	.long	2958651392
+	.long	1072759916
+	.long	313113243
+	.long	1072769490
+	.long	919449400
+	.long	1072778903
+	.long	2809328903
+	.long	1072788162
+	.long	2222981587
+	.long	1072797274
+	.long	2352530781
+	.long	1072806244
+	.long	594152517
+	.long	1072815078
+	.long	1555767199
+	.long	1072823780
+	.long	4282421314
+	.long	1072832355
+	.long	2355578597
+	.long	1072840809
+	.long	1162590619
+	.long	1072849145
+	.long	797864051
+	.long	1072857367
+	.long	431273680
+	.long	1072865479
+	.long	2669831148
+	.long	1072873484
+	.long	733477752
+	.long	1072881387
+	.long	4280220604
+	.long	1072889189
+	.long	801961634
+	.long	1072896896
+	.long	2915370760
+	.long	1072904508
+	.long	1159613482
+	.long	1072912030
+	.long	2689944798
+	.long	1072919463
+	.long	1248687822
+	.long	1072926811
+	.long	2967951030
+	.long	1072934075
+	.long	630170432
+	.long	1072941259
+	.long	3760898254
+	.long	1072948363
+	.long	0
+	.long	1072955392
+	.long	2370273294
+	.long	1072962345
+	.long	1261754802
+	.long	1072972640
+	.long	546334065
+	.long	1072986123
+	.long	1054893830
+	.long	1072999340
+	.long	1571187597
+	.long	1073012304
+	.long	1107975175
+	.long	1073025027
+	.long	3606909377
+	.long	1073037519
+	.long	1113616747
+	.long	1073049792
+	.long	4154744632
+	.long	1073061853
+	.long	3358931423
+	.long	1073073713
+	.long	4060702372
+	.long	1073085379
+	.long	747576176
+	.long	1073096860
+	.long	3023138255
+	.long	1073108161
+	.long	1419988548
+	.long	1073119291
+	.long	1914185305
+	.long	1073130255
+	.long	294389948
+	.long	1073141060
+	.long	3761802570
+	.long	1073151710
+	.long	978281566
+	.long	1073162213
+	.long	823148820
+	.long	1073172572
+	.long	2420954441
+	.long	1073182792
+	.long	3815449908
+	.long	1073192878
+	.long	2046058587
+	.long	1073202835
+	.long	1807524753
+	.long	1073212666
+	.long	2628681401
+	.long	1073222375
+	.long	3225667357
+	.long	1073231966
+	.long	1555307421
+	.long	1073241443
+	.long	3454043099
+	.long	1073250808
+	.long	1208137896
+	.long	1073260066
+	.long	3659916772
+	.long	1073269218
+	.long	1886261264
+	.long	1073278269
+	.long	3593647839
+	.long	1073287220
+	.long	3086012205
+	.long	1073296075
+	.long	2769796922
+	.long	1073304836
+	.long	888716057
+	.long	1073317807
+	.long	2201465623
+	.long	1073334794
+	.long	164369365
+	.long	1073351447
+	.long	3462666733
+	.long	1073367780
+	.long	2773905457
+	.long	1073383810
+	.long	1342879088
+	.long	1073399550
+	.long	2543933975
+	.long	1073415012
+	.long	1684477781
+	.long	1073430209
+	.long	3532178543
+	.long	1073445151
+	.long	1147747300
+	.long	1073459850
+	.long	1928031793
+	.long	1073474314
+	.long	2079717015
+	.long	1073488553
+	.long	4016765315
+	.long	1073502575
+	.long	3670431139
+	.long	1073516389
+	.long	3549227225
+	.long	1073530002
+	.long	11637607
+	.long	1073543422
+	.long	588220169
+	.long	1073556654
+	.long	2635407503
+	.long	1073569705
+	.long	2042029317
+	.long	1073582582
+	.long	1925128962
+	.long	1073595290
+	.long	4136375664
+	.long	1073607834
+	.long	759964600
+	.long	1073620221
+	.long	4257606771
+	.long	1073632453
+	.long	297278907
+	.long	1073644538
+	.long	3655053093
+	.long	1073656477
+	.long	2442253172
+	.long	1073668277
+	.long	1111876799
+	.long	1073679941
+	.long	3330973139
+	.long	1073691472
+	.long	3438879452
+	.long	1073702875
+	.long	3671565478
+	.long	1073714153
+	.long	1317849547
+	.long	1073725310
+	.long	1642364115
+	.long	1073736348
+	.type	cbrt_table,@object
+	.size	cbrt_table,768
+	.align 4
+D_table:
+	.long	4050900474
+	.long	1014427190
+	.long	1157977860
+	.long	1016444461
+	.long	1374568199
+	.long	1017271387
+	.long	2809163288
+	.long	1016882676
+	.long	3742377377
+	.long	1013168191
+	.long	3101606597
+	.long	1017541672
+	.long	65224358
+	.long	1017217597
+	.long	2691591250
+	.long	1017266643
+	.long	4020758549
+	.long	1017689313
+	.long	1316310992
+	.long	1018030788
+	.long	1031537856
+	.long	1014090882
+	.long	3261395239
+	.long	1016413641
+	.long	886424999
+	.long	1016313335
+	.long	3114776834
+	.long	1014195875
+	.long	1681120620
+	.long	1017825416
+	.long	1329600273
+	.long	1016625740
+	.long	465474623
+	.long	1017097119
+	.long	4251633980
+	.long	1017169077
+	.long	1986990133
+	.long	1017710645
+	.long	752958613
+	.long	1017159641
+	.long	2216216792
+	.long	1018020163
+	.long	4282860129
+	.long	1015924861
+	.long	1557627859
+	.long	1016039538
+	.long	3889219754
+	.long	1018086237
+	.long	3684996408
+	.long	1017353275
+	.long	723532103
+	.long	1017717141
+	.long	2951149676
+	.long	1012528470
+	.long	831890937
+	.long	1017830553
+	.long	1031212645
+	.long	1017387331
+	.long	2741737450
+	.long	1017604974
+	.long	2863311531
+	.long	1003776682
+	.long	4276736099
+	.long	1013153088
+	.long	4111778382
+	.long	1015673686
+	.long	1728065769
+	.long	1016413986
+	.long	2708718031
+	.long	1018078833
+	.long	1069335005
+	.long	1015291224
+	.long	700037144
+	.long	1016482032
+	.long	2904566452
+	.long	1017226861
+	.long	4074156649
+	.long	1017622651
+	.long	25019565
+	.long	1015245366
+	.long	3601952608
+	.long	1015771755
+	.long	3267129373
+	.long	1017904664
+	.long	503203103
+	.long	1014921629
+	.long	2122011730
+	.long	1018027866
+	.long	3927295461
+	.long	1014189456
+	.long	2790625147
+	.long	1016024251
+	.long	1330460186
+	.long	1016940346
+	.long	4033568463
+	.long	1015538390
+	.long	3695818227
+	.long	1017509621
+	.long	257573361
+	.long	1017208868
+	.long	3227697852
+	.long	1017337964
+	.long	234118548
+	.long	1017169577
+	.long	4009025803
+	.long	1017278524
+	.long	1948343394
+	.long	1017749310
+	.long	678398162
+	.long	1018144239
+	.long	3083864863
+	.long	1016669086
+	.long	2415453452
+	.long	1017890370
+	.long	175467344
+	.long	1017330033
+	.long	3197359580
+	.long	1010339928
+	.long	2071276951
+	.long	1015941358
+	.long	268372543
+	.long	1016737773
+	.long	938132959
+	.long	1017389108
+	.long	1816750559
+	.long	1017337448
+	.long	4119203749
+	.long	1017152174
+	.long	2578653878
+	.long	1013108497
+	.long	2470331096
+	.long	1014678606
+	.long	123855735
+	.long	1016553320
+	.long	1265650889
+	.long	1014782687
+	.long	3414398172
+	.long	1017182638
+	.long	1040773369
+	.long	1016158401
+	.long	3483628886
+	.long	1016886550
+	.long	4140499405
+	.long	1016191425
+	.long	3893477850
+	.long	1016964495
+	.long	3935319771
+	.long	1009634717
+	.long	2978982660
+	.long	1015027112
+	.long	2452709923
+	.long	1017990229
+	.long	3190365712
+	.long	1015835149
+	.long	4237588139
+	.long	1015832925
+	.long	2610678389
+	.long	1017962711
+	.long	2127316774
+	.long	1017405770
+	.long	824267502
+	.long	1017959463
+	.long	2165924042
+	.long	1017912225
+	.long	2774007076
+	.long	1013257418
+	.long	4123916326
+	.long	1017582284
+	.long	1976417958
+	.long	1016959909
+	.long	4092806412
+	.long	1017711279
+	.long	119251817
+	.long	1015363631
+	.long	3475418768
+	.long	1017675415
+	.long	1972580503
+	.long	1015470684
+	.long	815541017
+	.long	1017517969
+	.long	2429917451
+	.long	1017397776
+	.long	4062888482
+	.long	1016749897
+	.long	68284153
+	.long	1017925678
+	.long	2207779246
+	.long	1016320298
+	.long	1183466520
+	.long	1017408657
+	.long	143326427
+	.long	1017060403
+	.type	D_table,@object
+	.size	D_table,768
+	.align 4
+SCALE63:
+	.long	0
+	.long	1138753536
+	.type	SCALE63,@object
+	.size	SCALE63,8
+	.align 4
+ZERON:
+	.long	0
+	.long	2147483648
+	.type	ZERON,@object
+	.size	ZERON,8
+	.align 4
+INF:
+	.long	0
+	.long	2146435072
+	.type	INF,@object
+	.size	INF,8
+	.align 4
+NEG_INF:
+	.long	0
+	.long	4293918720
+	.type	NEG_INF,@object
+	.size	NEG_INF,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_cbrt.1-.
+	.4byte ..___tag_value_cbrt.5-..___tag_value_cbrt.1
+	.2byte 0x0400
+	.4byte ..___tag_value_cbrt.3-..___tag_value_cbrt.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_cbrt.4-..___tag_value_cbrt.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/s_cos.S b/libm/x86_64/s_cos.S
new file mode 100644
index 0000000..ab5a0e1
--- /dev/null
+++ b/libm/x86_64/s_cos.S
@@ -0,0 +1,1275 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//     1. RANGE REDUCTION
+//
+//     We perform an initial range reduction from X to r with
+//
+//          X =~= N * pi/32 + r
+//
+//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
+//     where |N| <= 932560. Beyond this, the range reduction is
+//     insufficiently accurate. For extremely small inputs, 
+//     denormalization can occur internally, impacting performance.
+//     This means that the main path is actually only taken for
+//     2^-252 <= |X| < 90112.
+//
+//     To avoid branches, we perform the range reduction to full
+//     accuracy each time.
+//
+//          X - N * (P_1 + P_2 + P_3)
+//
+//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
+//     is exact) and P_3 is a 53-bit number. Together, these
+//     approximate pi well enough for all cases in the restricted
+//     range.
+//
+//     The main reduction sequence is:
+//
+//             y = 32/pi * x
+//             N = integer(y)
+//     (computed by adding and subtracting off SHIFTER)
+//
+//             m_1 = N * P_1
+//             m_2 = N * P_2
+//             r_1 = x - m_1
+//             r = r_1 - m_2
+//     (this r can be used for most of the calculation)
+//
+//             c_1 = r_1 - r
+//             m_3 = N * P_3
+//             c_2 = c_1 - m_2
+//             c = c_2 - m_3
+//
+//     2. MAIN ALGORITHM
+//
+//     The algorithm uses a table lookup based on B = M * pi / 32
+//     where M = N mod 64. The stored values are:
+//       sigma             closest power of 2 to cos(B)
+//       C_hl              53-bit cos(B) - sigma
+//       S_hi + S_lo       2 * 53-bit sin(B)
+//
+//     The computation is organized as follows:
+//
+//          sin(B + r + c) = [sin(B) + sigma * r] +
+//                           r * (cos(B) - sigma) +
+//                           sin(B) * [cos(r + c) - 1] +
+//                           cos(B) * [sin(r + c) - r]
+//
+//     which is approximately:
+//
+//          [S_hi + sigma * r] +
+//          C_hl * r +
+//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
+//          (C_hl + sigma) * [(sin(r) - r) + c]
+//
+//     and this is what is actually computed. We separate this sum
+//     into four parts:
+//
+//          hi + med + pols + corr
+//
+//     where
+//
+//          hi       = S_hi + sigma r
+//          med      = C_hl * r
+//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+//     3. POLYNOMIAL
+//
+//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+//     (sin(r) - r) can be rearranged freely, since it is quite
+//     small, so we exploit parallelism to the fullest.
+//
+//          psc4       =   SC_4 * r_1
+//          msc4       =   psc4 * r
+//          r2         =   r * r
+//          msc2       =   SC_2 * r2
+//          r4         =   r2 * r2
+//          psc3       =   SC_3 + msc4
+//          psc1       =   SC_1 + msc2
+//          msc3       =   r4 * psc3
+//          sincospols =   psc1 + msc3
+//          pols       =   sincospols *
+//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+//     4. CORRECTION TERM
+//
+//     This is where the "c" component of the range reduction is
+//     taken into account; recall that just "r" is used for most of
+//     the calculation.
+//
+//          -c   = m_3 - c_2
+//          -d   = S_hi * r - (C_hl + sigma)
+//          corr = -c * -d + S_lo
+//
+//     5. COMPENSATED SUMMATIONS
+//
+//     The two successive compensated summations add up the high
+//     and medium parts, leaving just the low parts to add up at
+//     the end.
+//
+//          rs        =  sigma * r
+//          res_int   =  S_hi + rs
+//          k_0       =  S_hi - res_int
+//          k_2       =  k_0 + rs
+//          med       =  C_hl * r
+//          res_hi    =  res_int + med
+//          k_1       =  res_int - res_hi
+//          k_3       =  k_1 + med
+//
+//     6. FINAL SUMMATION
+//
+//     We now add up all the small parts:
+//
+//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+//     Now the overall result is just:
+//
+//          res_hi + res_lo
+//
+//     7. SMALL ARGUMENTS
+//
+//     Inputs with |X| < 2^-252 are treated specially as
+//     1 - |x|.
+//
+// Special cases:
+//  cos(NaN) = quiet NaN, and raise invalid exception
+//  cos(INF) = NaN and raise invalid exception
+//  cos(0) = 1
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  cos
+ENTRY(cos)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_cos.1:
+        pushq     %rbx
+..___tag_value_cos.3:
+        subq      $16, %rsp
+..___tag_value_cos.5:
+        movsd     %xmm0, 8(%rsp)
+..B1.2:
+        movl      12(%rsp), %eax
+        movq      PI32INV(%rip), %xmm1
+        andl      $2147418112, %eax
+        subl      $808452096, %eax
+        cmpl      $281346048, %eax
+        ja        .L_2TAG_PACKET_0.0.1
+        mulsd     %xmm0, %xmm1
+        movapd    ONEHALF(%rip), %xmm5
+        movq      SIGN_MASK(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %edx
+        cvtsi2sd  %edx, %xmm1
+        movapd    P_2(%rip), %xmm2
+        movq      P_1(%rip), %xmm3
+        mulsd     %xmm1, %xmm3
+        unpcklpd  %xmm1, %xmm1
+        addq      $1865232, %rdx
+        movq      %xmm0, %xmm4
+        andq      $63, %rdx
+        movapd    SC_4(%rip), %xmm5
+        lea       Ctable(%rip), %rax
+        shlq      $5, %rdx
+        addq      %rdx, %rax
+        mulpd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm0
+        mulsd     P_3(%rip), %xmm1
+        subsd     %xmm3, %xmm4
+        movq      8(%rax), %xmm7
+        unpcklpd  %xmm0, %xmm0
+        movq      %xmm4, %xmm3
+        subsd     %xmm2, %xmm4
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm2, %xmm0
+        movapd    SC_2(%rip), %xmm6
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm2, %xmm3
+        movapd    (%rax), %xmm2
+        subsd     %xmm3, %xmm1
+        movq      24(%rax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     SC_3(%rip), %xmm5
+        mulsd     (%rax), %xmm4
+        addpd     SC_1(%rip), %xmm6
+        mulpd     %xmm0, %xmm5
+        movq      %xmm3, %xmm0
+        addsd     8(%rax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movq      %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movq      8(%rax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%rax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm5, %xmm0
+        addsd     %xmm7, %xmm3
+        addsd     %xmm1, %xmm0
+        addsd     %xmm3, %xmm0
+        addsd     %xmm6, %xmm0
+        unpckhpd  %xmm6, %xmm6
+        addsd     %xmm6, %xmm0
+        addsd     %xmm4, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_0.0.1:
+        jg        .L_2TAG_PACKET_1.0.1
+        pextrw    $3, %xmm0, %eax
+        andw      $32767, %ax
+        pinsrw    $3, %eax, %xmm0
+        movq      ONE(%rip), %xmm1
+        subsd     %xmm0, %xmm1
+        movq      %xmm1, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_1.0.1:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_2.0.1
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        subl      $16224, %ecx
+        shrl      $7, %ecx
+        andl      $65532, %ecx
+        lea       PI_INV_TABLE(%rip), %r11
+        addq      %r11, %rcx
+        movd      %xmm0, %rax
+        movl      20(%rcx), %r10d
+        movl      24(%rcx), %r8d
+        movl      %eax, %edx
+        shrq      $21, %rax
+        orl       $-2147483648, %eax
+        shrl      $11, %eax
+        movl      %r10d, %r9d
+        imulq     %rdx, %r10
+        imulq     %rax, %r9
+        imulq     %rax, %r8
+        movl      16(%rcx), %esi
+        movl      12(%rcx), %edi
+        movl      %r10d, %r11d
+        shrq      $32, %r10
+        addq      %r10, %r9
+        addq      %r8, %r11
+        movl      %r11d, %r8d
+        shrq      $32, %r11
+        addq      %r11, %r9
+        movl      %esi, %r10d
+        imulq     %rdx, %rsi
+        imulq     %rax, %r10
+        movl      %edi, %r11d
+        imulq     %rdx, %rdi
+        movl      %esi, %ebx
+        shrq      $32, %rsi
+        addq      %rbx, %r9
+        movl      %r9d, %ebx
+        shrq      $32, %r9
+        addq      %rsi, %r10
+        addq      %r9, %r10
+        shlq      $32, %rbx
+        orq       %rbx, %r8
+        imulq     %rax, %r11
+        movl      8(%rcx), %r9d
+        movl      4(%rcx), %esi
+        movl      %edi, %ebx
+        shrq      $32, %rdi
+        addq      %rbx, %r10
+        movl      %r10d, %ebx
+        shrq      $32, %r10
+        addq      %rdi, %r11
+        addq      %r10, %r11
+        movq      %r9, %rdi
+        imulq     %rdx, %r9
+        imulq     %rax, %rdi
+        movl      %r9d, %r10d
+        shrq      $32, %r9
+        addq      %r10, %r11
+        movl      %r11d, %r10d
+        shrq      $32, %r11
+        addq      %r9, %rdi
+        addq      %r11, %rdi
+        movq      %rsi, %r9
+        imulq     %rdx, %rsi
+        imulq     %rax, %r9
+        shlq      $32, %r10
+        orq       %rbx, %r10
+        movl      (%rcx), %eax
+        movl      %esi, %r11d
+        shrq      $32, %rsi
+        addq      %r11, %rdi
+        movl      %edi, %r11d
+        shrq      $32, %rdi
+        addq      %rsi, %r9
+        addq      %rdi, %r9
+        imulq     %rax, %rdx
+        pextrw    $3, %xmm0, %ebx
+        lea       PI_INV_TABLE(%rip), %rdi
+        subq      %rdi, %rcx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      $19, %ecx
+        movl      $32768, %esi
+        andl      %ebx, %esi
+        shrl      $4, %ebx
+        andl      $2047, %ebx
+        subl      $1023, %ebx
+        subl      %ebx, %ecx
+        addq      %rdx, %r9
+        movl      %ecx, %edx
+        addl      $32, %edx
+        cmpl      $1, %ecx
+        jl        .L_2TAG_PACKET_3.0.1
+        negl      %ecx
+        addl      $29, %ecx
+        shll      %cl, %r9d
+        movl      %r9d, %edi
+        andl      $536870911, %r9d
+        testl     $268435456, %r9d
+        jne       .L_2TAG_PACKET_4.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+.L_2TAG_PACKET_5.0.1:
+.L_2TAG_PACKET_6.0.1:
+        cmpq      $0, %r9
+        je        .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_8.0.1:
+        bsr       %r9, %r11
+        movl      $29, %ecx
+        subl      %r11d, %ecx
+        jle       .L_2TAG_PACKET_9.0.1
+        shlq      %cl, %r9
+        movq      %r10, %rax
+        shlq      %cl, %r10
+        addl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shrq      %cl, %rax
+        shrq      %cl, %r8
+        orq       %rax, %r9
+        orq       %r8, %r10
+.L_2TAG_PACKET_10.0.1:
+        cvtsi2sdq %r9, %xmm0
+        shrq      $1, %r10
+        cvtsi2sdq %r10, %xmm3
+        xorpd     %xmm4, %xmm4
+        shll      $4, %edx
+        negl      %edx
+        addl      $16368, %edx
+        orl       %esi, %edx
+        xorl      %ebx, %edx
+        pinsrw    $3, %edx, %xmm4
+        movq      PI_4(%rip), %xmm2
+        movq      8+PI_4(%rip), %xmm6
+        xorpd     %xmm5, %xmm5
+        subl      $1008, %edx
+        pinsrw    $3, %edx, %xmm5
+        mulsd     %xmm4, %xmm0
+        shll      $16, %esi
+        sarl      $31, %esi
+        mulsd     %xmm5, %xmm3
+        movq      %xmm0, %xmm1
+        mulsd     %xmm2, %xmm0
+        shrl      $29, %edi
+        addsd     %xmm3, %xmm1
+        mulsd     %xmm2, %xmm3
+        addl      %esi, %edi
+        xorl      %esi, %edi
+        mulsd     %xmm1, %xmm6
+        movl      %edi, %eax
+        addsd     %xmm3, %xmm6
+        movq      %xmm0, %xmm2
+        addsd     %xmm6, %xmm0
+        subsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm6
+.L_2TAG_PACKET_11.0.1:
+        movq      PI32INV(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        movq      ONEHALF(%rip), %xmm5
+        movq      SIGN_MASK(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %rdx
+        cvtsi2sdq %rdx, %xmm1
+        movq      P_1(%rip), %xmm3
+        movapd    P_2(%rip), %xmm2
+        mulsd     %xmm1, %xmm3
+        unpcklpd  %xmm1, %xmm1
+        shll      $3, %eax
+        addl      $1865232, %edx
+        movq      %xmm0, %xmm4
+        addl      %eax, %edx
+        andl      $63, %edx
+        movapd    SC_4(%rip), %xmm5
+        lea       Ctable(%rip), %rax
+        shll      $5, %edx
+        addq      %rdx, %rax
+        mulpd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm0
+        mulsd     P_3(%rip), %xmm1
+        subsd     %xmm3, %xmm4
+        movq      8(%rax), %xmm7
+        unpcklpd  %xmm0, %xmm0
+        movq      %xmm4, %xmm3
+        subsd     %xmm2, %xmm4
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm2, %xmm0
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm2, %xmm3
+        movapd    (%rax), %xmm2
+        subsd     %xmm3, %xmm1
+        movq      24(%rax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        subsd     %xmm6, %xmm1
+        movapd    SC_2(%rip), %xmm6
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     SC_3(%rip), %xmm5
+        mulsd     (%rax), %xmm4
+        addpd     SC_1(%rip), %xmm6
+        mulpd     %xmm0, %xmm5
+        movq      %xmm3, %xmm0
+        addsd     8(%rax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movq      %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movq      8(%rax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%rax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm0, %xmm5
+        addsd     %xmm7, %xmm3
+        addsd     %xmm5, %xmm1
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        unpckhpd  %xmm6, %xmm6
+        movq      %xmm4, %xmm0
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_7.0.1:
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        movq      $0, %r8
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_8.0.1
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_8.0.1
+        xorpd     %xmm0, %xmm0
+        xorpd     %xmm6, %xmm6
+        jmp       .L_2TAG_PACKET_11.0.1
+.L_2TAG_PACKET_9.0.1:
+        je        .L_2TAG_PACKET_10.0.1
+        negl      %ecx
+        shrq      %cl, %r10
+        movq      %r9, %rax
+        shrq      %cl, %r9
+        subl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shlq      %cl, %rax
+        orq       %rax, %r10
+        jmp       .L_2TAG_PACKET_10.0.1
+.L_2TAG_PACKET_3.0.1:
+        negl      %ecx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      %cl, %r9
+        movq      %r9, %rdi
+        testl     $-2147483648, %r9d
+        jne       .L_2TAG_PACKET_12.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shrq      $3, %rdi
+        jmp       .L_2TAG_PACKET_6.0.1
+.L_2TAG_PACKET_4.0.1:
+        shrl      %cl, %r9d
+        movl      $536870912, %ebx
+        shrl      %cl, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      $32, %rbx
+        addl      $536870912, %edi
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        jmp       .L_2TAG_PACKET_5.0.1
+.L_2TAG_PACKET_12.0.1:
+        shrl      %cl, %r9d
+        movq      $0x100000000, %rbx
+        shrq      %cl, %rbx
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        shrq      $3, %rdi
+        addl      $536870912, %edi
+        jmp       .L_2TAG_PACKET_6.0.1
+.L_2TAG_PACKET_2.0.1:
+        movsd     8(%rsp), %xmm0
+        mulsd     NEG_ZERO(%rip), %xmm0
+        movq      %xmm0, (%rsp)
+.L_2TAG_PACKET_13.0.1:
+..B1.4:
+        addq      $16, %rsp
+..___tag_value_cos.6:
+        popq      %rbx
+..___tag_value_cos.8:
+        ret       
+..___tag_value_cos.9:
+END(cos)
+# -- End  cos
+	.section .rodata, "a"
+	.align 16
+	.align 16
+ONEHALF:
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.type	ONEHALF,@object
+	.size	ONEHALF,16
+	.align 16
+P_2:
+	.long	442499072
+	.long	1032893537
+	.long	442499072
+	.long	1032893537
+	.type	P_2,@object
+	.size	P_2,16
+	.align 16
+SC_4:
+	.long	2773927732
+	.long	1053236707
+	.long	436314138
+	.long	1056571808
+	.type	SC_4,@object
+	.size	SC_4,16
+	.align 16
+Ctable:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	1072693248
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	1072693248
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	1071644672
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	1071644672
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	1070596096
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	1070596096
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	1069547520
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	3217031168
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	3218079744
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	3218079744
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	3219128320
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	3219128320
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	3220176896
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	3220176896
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	3219128320
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	3219128320
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	3218079744
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	3218079744
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	3217031168
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	1069547520
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	1070596096
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	1070596096
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	1071644672
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	1071644672
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	1072693248
+	.type	Ctable,@object
+	.size	Ctable,2048
+	.align 16
+SC_2:
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1067799893
+	.type	SC_2,@object
+	.size	SC_2,16
+	.align 16
+SC_3:
+	.long	436314138
+	.long	3207201184
+	.long	381774871
+	.long	3210133868
+	.type	SC_3,@object
+	.size	SC_3,16
+	.align 16
+SC_1:
+	.long	1431655765
+	.long	3217380693
+	.long	0
+	.long	3219128320
+	.type	SC_1,@object
+	.size	SC_1,16
+	.align 16
+PI_INV_TABLE:
+	.long	0
+	.long	0
+	.long	2734261102
+	.long	1313084713
+	.long	4230436817
+	.long	4113882560
+	.long	3680671129
+	.long	1011060801
+	.long	4266746795
+	.long	3736847713
+	.long	3072618042
+	.long	1112396512
+	.long	105459434
+	.long	164729372
+	.long	4263373596
+	.long	2972297022
+	.long	3900847605
+	.long	784024708
+	.long	3919343654
+	.long	3026157121
+	.long	965858873
+	.long	2203269620
+	.long	2625920907
+	.long	3187222587
+	.long	536385535
+	.long	3724908559
+	.long	4012839307
+	.long	1510632735
+	.long	1832287951
+	.long	667617719
+	.long	1330003814
+	.long	2657085997
+	.long	1965537991
+	.long	3957715323
+	.long	1023883767
+	.long	2320667370
+	.long	1811636145
+	.long	529358088
+	.long	1443049542
+	.long	4235946923
+	.long	4040145953
+	.type	PI_INV_TABLE,@object
+	.size	PI_INV_TABLE,164
+	.space 12, 0x00 	# pad
+	.align 16
+PI_4:
+	.long	1073741824
+	.long	1072243195
+	.long	407279769
+	.long	1046758445
+	.type	PI_4,@object
+	.size	PI_4,16
+	.align 8
+PI32INV:
+	.long	1841940611
+	.long	1076125488
+	.type	PI32INV,@object
+	.size	PI32INV,8
+	.align 8
+SIGN_MASK:
+	.long	0
+	.long	2147483648
+	.type	SIGN_MASK,@object
+	.size	SIGN_MASK,8
+	.align 8
+P_1:
+	.long	1413480448
+	.long	1069097467
+	.type	P_1,@object
+	.size	P_1,8
+	.align 8
+P_3:
+	.long	771977331
+	.long	996350346
+	.type	P_3,@object
+	.size	P_3,8
+	.align 8
+ONE:
+	.long	0
+	.long	1072693248
+	.type	ONE,@object
+	.size	ONE,8
+	.align 8
+NEG_ZERO:
+	.long	0
+	.long	2147483648
+	.type	NEG_ZERO,@object
+	.size	NEG_ZERO,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000002c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_cos.1-.
+	.4byte ..___tag_value_cos.9-..___tag_value_cos.1
+	.2byte 0x0400
+	.4byte ..___tag_value_cos.3-..___tag_value_cos.1
+	.4byte 0x0283100e
+	.byte 0x04
+	.4byte ..___tag_value_cos.5-..___tag_value_cos.3
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_cos.6-..___tag_value_cos.5
+	.4byte 0x04c3100e
+	.4byte ..___tag_value_cos.8-..___tag_value_cos.6
+	.2byte 0x080e
+# End
diff --git a/libm/x86_64/s_expm1.S b/libm/x86_64/s_expm1.S
new file mode 100644
index 0000000..9da1d9d
--- /dev/null
+++ b/libm/x86_64/s_expm1.S
@@ -0,0 +1,727 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Description:
+//  Let K = 64 (table size).
+//
+//  Four sub-domains:
+//    1. |x| < 1/(2*K)
+//      expm1(x) ~ P(x)
+//    2. 1/(2*K) <= |x| <= 56*log(2)
+//       x       x/log(2)    n
+//      e - 1 = 2         = 2 * T[j] * (1 + P(y)) - 1
+//    3. 56*log(2) < x < MAX_LOG
+//       x       x   x/log(2)    n
+//      e - 1 ~ e = 2         = 2 * T[j] * (1 + P(y))
+//    4. x < -56*log(2)
+//       x            x
+//      e - 1 = -1 + e ~ -1
+//    where
+//       x = m*log(2)/K + y,    y in [-log(2)/K..log(2)/K]
+//       m = n*K + j,           m,n,j - signed integer, j in [-K/2..K/2]
+//                  j/K
+//       values of 2   are tabulated as T[j] = T_hi[j] ( 1 + T_lo[j]).
+//
+//       P(y) is a minimax polynomial approximation of exp(x)-1
+//       on small interval [-log(2)/K..log(2)/K] (were calculated by Maple V).
+//
+//    In case 3, to avoid problems with arithmetic overflow and underflow,
+//              n                        n1  n2
+//    value of 2  is safely computed as 2 * 2 where n1 in [-BIAS/2..BIAS/2]
+//    and BIAS is a value of exponent bias.
+//
+// Special cases:
+//  expm1(NaN) is NaN
+//  expm1(+INF) is +INF
+//  expm1(-INF) is -1
+//  expm1(x) is x for subnormals
+//  for finite argument, only expm1(0)=0 is exact.
+//  For IEEE double
+//    if x > 709.782712893383973096 then expm1(x) overflow
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  expm1
+ENTRY(expm1)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_expm1.1:
+        subq      $56, %rsp
+..___tag_value_expm1.3:
+        movsd     %xmm0, 32(%rsp)
+..B1.2:
+        unpcklpd  %xmm0, %xmm0
+        movapd    cv(%rip), %xmm1
+        movapd    Shifter(%rip), %xmm6
+        movapd    16+cv(%rip), %xmm2
+        movapd    32+cv(%rip), %xmm3
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        movl      $16527, %edx
+        subl      %eax, %edx
+        subl      $16304, %eax
+        orl       %eax, %edx
+        cmpl      $-2147483648, %edx
+        jae       .L_2TAG_PACKET_0.0.2
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm6, %xmm1
+        movapd    %xmm1, %xmm7
+        subpd     %xmm6, %xmm1
+        mulpd     %xmm1, %xmm2
+        movapd    48+cv(%rip), %xmm4
+        mulpd     %xmm1, %xmm3
+        movapd    64+cv(%rip), %xmm5
+        subpd     %xmm2, %xmm0
+        movd      %xmm7, %eax
+        movl      %eax, %ecx
+        andl      $63, %ecx
+        shll      $4, %ecx
+        sarl      $6, %eax
+        movl      %eax, %edx
+        subpd     %xmm3, %xmm0
+        lea       Tbl_addr(%rip), %r11
+        movapd    (%rcx,%r11), %xmm2
+        movq      80+cv(%rip), %xmm3
+        mulpd     %xmm0, %xmm4
+        movapd    %xmm0, %xmm1
+        mulpd     %xmm0, %xmm0
+        mulsd     %xmm0, %xmm3
+        addpd     %xmm4, %xmm5
+        mulsd     %xmm0, %xmm0
+        movq      %xmm2, %xmm4
+        unpckhpd  %xmm2, %xmm2
+        movdqa    mmask(%rip), %xmm6
+        pand      %xmm6, %xmm7
+        movdqa    bias(%rip), %xmm6
+        paddq     %xmm6, %xmm7
+        psllq     $46, %xmm7
+        mulsd     %xmm0, %xmm3
+        mulpd     %xmm5, %xmm0
+        addl      $894, %edx
+        cmpl      $1916, %edx
+        ja        .L_2TAG_PACKET_1.0.2
+        addsd     %xmm3, %xmm0
+        xorpd     %xmm3, %xmm3
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm3
+        orpd      %xmm7, %xmm2
+        mulsd     %xmm4, %xmm7
+        movq      %xmm3, %xmm6
+        addsd     %xmm1, %xmm3
+        pextrw    $3, %xmm2, %edx
+        pshufd    $238, %xmm0, %xmm5
+        psrlq     $38, %xmm3
+        psllq     $38, %xmm3
+        movq      %xmm2, %xmm4
+        subsd     %xmm3, %xmm6
+        addsd     %xmm5, %xmm0
+        addsd     %xmm6, %xmm1
+        addsd     %xmm7, %xmm4
+        mulsd     %xmm3, %xmm7
+        mulsd     %xmm2, %xmm3
+        xorpd     %xmm5, %xmm5
+        movl      $16368, %eax
+        pinsrw    $3, %eax, %xmm5
+        addsd     %xmm1, %xmm0
+        movl      $17184, %ecx
+        subl      %edx, %ecx
+        subl      $16256, %edx
+        orl       %edx, %ecx
+        jl        .L_2TAG_PACKET_2.0.2
+        mulsd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm3
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+.L_2TAG_PACKET_3.0.2:
+        jmp       ..B1.5
+.L_2TAG_PACKET_2.0.2:
+        cmpl      $0, %edx
+        jl        .L_2TAG_PACKET_4.0.2
+        mulsd     %xmm4, %xmm0
+        subsd     %xmm5, %xmm7
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_4.0.2:
+        mulsd     %xmm4, %xmm0
+        addsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        subsd     %xmm5, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_1.0.2:
+        movl      36(%rsp), %ecx
+        addsd     %xmm0, %xmm1
+        unpckhpd  %xmm0, %xmm0
+        addsd     %xmm1, %xmm0
+        cmpl      $0, %ecx
+        jl        .L_2TAG_PACKET_5.0.2
+        fstcw     (%rsp)
+        movw      (%rsp), %dx
+        orw       $768, %dx
+        movw      %dx, 4(%rsp)
+        fldcw     4(%rsp)
+        movl      %eax, %edx
+        sarl      $1, %eax
+        subl      %eax, %edx
+        movdqa    emask(%rip), %xmm6
+        pandn     %xmm2, %xmm6
+        addl      $1023, %eax
+        movd      %eax, %xmm3
+        psllq     $52, %xmm3
+        orpd      %xmm3, %xmm6
+        mulsd     %xmm3, %xmm4
+        movsd     %xmm0, 16(%rsp)
+        fldl      16(%rsp)
+        movsd     %xmm6, 24(%rsp)
+        fldl      24(%rsp)
+        movsd     %xmm4, 16(%rsp)
+        fldl      16(%rsp)
+        addl      $1023, %edx
+        movd      %edx, %xmm4
+        psllq     $52, %xmm4
+        faddp     %st, %st(1)
+        fmul      %st, %st(1)
+        faddp     %st, %st(1)
+        movsd     %xmm4, 24(%rsp)
+        fldl      24(%rsp)
+        fmulp     %st, %st(1)
+        fstpl     16(%rsp)
+        movsd     16(%rsp), %xmm0
+        fldcw     (%rsp)
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        jmp       ..B1.5
+        cmpl      $-2147483648, %ecx
+        jb        .L_2TAG_PACKET_6.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        movl      $41, 8(%rsp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_8.0.2:
+        cmpl      $2146435072, %eax
+        jae       .L_2TAG_PACKET_9.0.2
+        movsd     XMAX(%rip), %xmm0
+        mulsd     %xmm0, %xmm0
+        movl      $41, 8(%rsp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_9.0.2:
+        movl      36(%rsp), %eax
+        movl      32(%rsp), %edx
+        movl      %eax, %ecx
+        andl      $2147483647, %eax
+        cmpl      $2146435072, %eax
+        ja        .L_2TAG_PACKET_10.0.2
+        cmpl      $0, %edx
+        jne       .L_2TAG_PACKET_10.0.2
+        cmpl      $0, %ecx
+        jl        .L_2TAG_PACKET_11.0.2
+        movq      INF(%rip), %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_11.0.2:
+        jmp       .L_2TAG_PACKET_5.0.2
+.L_2TAG_PACKET_10.0.2:
+        movsd     32(%rsp), %xmm0
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_12.0.2:
+        addl      $16304, %eax
+        cmpl      $15504, %eax
+        jb        .L_2TAG_PACKET_13.0.2
+        movapd    cvl(%rip), %xmm2
+        pshufd    $68, %xmm0, %xmm1
+        movapd    16+cvl(%rip), %xmm3
+        movapd    32+cvl(%rip), %xmm4
+        movq      48+cvl(%rip), %xmm5
+        mulsd     %xmm1, %xmm1
+        xorpd     %xmm6, %xmm6
+        movl      $16352, %eax
+        pinsrw    $3, %eax, %xmm6
+        mulpd     %xmm0, %xmm2
+        xorpd     %xmm7, %xmm7
+        movl      $16368, %edx
+        pinsrw    $3, %edx, %xmm7
+        addpd     %xmm3, %xmm2
+        mulsd     %xmm1, %xmm5
+        pshufd    $228, %xmm1, %xmm3
+        mulpd     %xmm1, %xmm1
+        mulsd     %xmm0, %xmm6
+        mulpd     %xmm0, %xmm2
+        addpd     %xmm4, %xmm2
+        movq      %xmm7, %xmm4
+        addsd     %xmm6, %xmm7
+        mulpd     %xmm3, %xmm1
+        psrlq     $27, %xmm7
+        psllq     $27, %xmm7
+        movq      HIGHMASK(%rip), %xmm3
+        subsd     %xmm7, %xmm4
+        mulpd     %xmm1, %xmm2
+        addsd     %xmm4, %xmm6
+        pshufd    $238, %xmm2, %xmm1
+        addsd     %xmm2, %xmm6
+        andpd     %xmm0, %xmm3
+        movq      %xmm0, %xmm4
+        addsd     %xmm6, %xmm1
+        subsd     %xmm3, %xmm0
+        addsd     %xmm5, %xmm1
+        mulsd     %xmm7, %xmm3
+        mulsd     %xmm7, %xmm0
+        mulsd     %xmm1, %xmm4
+        addsd     %xmm4, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_13.0.2:
+        cmpl      $16, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        movq      %xmm0, %xmm2
+        movd      %xmm0, %eax
+        psrlq     $31, %xmm2
+        movd      %xmm2, %ecx
+        orl       %ecx, %eax
+        je        .L_2TAG_PACKET_3.0.2
+        movl      $16, %edx
+        xorpd     %xmm1, %xmm1
+        pinsrw    $3, %edx, %xmm1
+        mulsd     %xmm1, %xmm1
+        movl      $42, 8(%rsp)
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_0.0.2:
+        cmpl      $0, %eax
+        jl        .L_2TAG_PACKET_12.0.2
+        movl      36(%rsp), %eax
+        cmpl      $1083179008, %eax
+        jge       .L_2TAG_PACKET_8.0.2
+        cmpl      $-1048576, %eax
+        jae       .L_2TAG_PACKET_9.0.2
+.L_2TAG_PACKET_5.0.2:
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_7.0.2:
+        movq      %xmm0, 40(%rsp)
+..B1.3:
+        movq      40(%rsp), %xmm0
+.L_2TAG_PACKET_14.0.2:
+..B1.5:
+        addq      $56, %rsp
+..___tag_value_expm1.4:
+        ret       
+..___tag_value_expm1.5:
+END(expm1)
+# -- End  expm1
+	.section .rodata, "a"
+	.align 16
+	.align 16
+cv:
+	.long	1697350398
+	.long	1079448903
+	.long	1697350398
+	.long	1079448903
+	.long	4277796864
+	.long	1065758274
+	.long	4277796864
+	.long	1065758274
+	.long	3164486458
+	.long	1025308570
+	.long	3164486458
+	.long	1025308570
+	.long	1963358694
+	.long	1065423121
+	.long	1431655765
+	.long	1069897045
+	.long	1431655765
+	.long	1067799893
+	.long	0
+	.long	1071644672
+	.long	381774871
+	.long	1062650220
+	.long	381774871
+	.long	1062650220
+	.type	cv,@object
+	.size	cv,96
+	.align 16
+Shifter:
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	1127743488
+	.type	Shifter,@object
+	.size	Shifter,16
+	.align 16
+Tbl_addr:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1000070955
+	.long	1042145304
+	.long	1040187392
+	.long	11418
+	.long	988267849
+	.long	1039500660
+	.long	3539992576
+	.long	22960
+	.long	36755401
+	.long	1042114290
+	.long	402653184
+	.long	34629
+	.long	3634769483
+	.long	1042178627
+	.long	1820327936
+	.long	46424
+	.long	2155991225
+	.long	1041560680
+	.long	847249408
+	.long	58348
+	.long	2766913307
+	.long	1039293264
+	.long	3489660928
+	.long	70401
+	.long	3651174602
+	.long	1040488175
+	.long	2927624192
+	.long	82586
+	.long	3073892131
+	.long	1042240606
+	.long	1006632960
+	.long	94904
+	.long	1328391742
+	.long	1042019037
+	.long	3942645760
+	.long	107355
+	.long	2650893825
+	.long	1041903210
+	.long	822083584
+	.long	119943
+	.long	2397289153
+	.long	1041802037
+	.long	2281701376
+	.long	132667
+	.long	430997175
+	.long	1042110606
+	.long	1845493760
+	.long	145530
+	.long	1230936525
+	.long	1041801015
+	.long	1702887424
+	.long	158533
+	.long	740675935
+	.long	1040178913
+	.long	4110417920
+	.long	171677
+	.long	3489810261
+	.long	1041825986
+	.long	2793406464
+	.long	184965
+	.long	2532600530
+	.long	1040767882
+	.long	167772160
+	.long	198398
+	.long	3542557060
+	.long	1041827263
+	.long	2986344448
+	.long	211976
+	.long	1401563777
+	.long	1041061093
+	.long	922746880
+	.long	225703
+	.long	3129406026
+	.long	1041852413
+	.long	880803840
+	.long	239579
+	.long	900993572
+	.long	1039283234
+	.long	1275068416
+	.long	253606
+	.long	2115029358
+	.long	1042140042
+	.long	562036736
+	.long	267786
+	.long	1086643152
+	.long	1041785419
+	.long	1610612736
+	.long	282120
+	.long	82864366
+	.long	1041256244
+	.long	3045064704
+	.long	296610
+	.long	2392968152
+	.long	1040913683
+	.long	3573547008
+	.long	311258
+	.long	2905856183
+	.long	1040002214
+	.long	1988100096
+	.long	326066
+	.long	3742008261
+	.long	1040011137
+	.long	1451229184
+	.long	341035
+	.long	863393794
+	.long	1040880621
+	.long	914358272
+	.long	356167
+	.long	1446136837
+	.long	1041372426
+	.long	3707764736
+	.long	371463
+	.long	927855201
+	.long	1040617636
+	.long	360710144
+	.long	386927
+	.long	1492679939
+	.long	1041050306
+	.long	2952790016
+	.long	402558
+	.long	608827001
+	.long	1041582217
+	.long	2181038080
+	.long	418360
+	.long	606260204
+	.long	1042271987
+	.long	1711276032
+	.long	434334
+	.long	3163044019
+	.long	1041843851
+	.long	1006632960
+	.long	450482
+	.long	4148747325
+	.long	1041962972
+	.long	3900702720
+	.long	466805
+	.long	802924201
+	.long	1041275378
+	.long	1442840576
+	.long	483307
+	.long	3052749833
+	.long	1041940577
+	.long	1937768448
+	.long	499988
+	.long	2216116399
+	.long	1041486744
+	.long	914358272
+	.long	516851
+	.long	2729697836
+	.long	1041445764
+	.long	2566914048
+	.long	533897
+	.long	540608356
+	.long	1041310907
+	.long	2600468480
+	.long	551129
+	.long	2916344493
+	.long	1040535661
+	.long	1107296256
+	.long	568549
+	.long	731391814
+	.long	1039497014
+	.long	2566914048
+	.long	586158
+	.long	1024722704
+	.long	1041461625
+	.long	2961178624
+	.long	603959
+	.long	3806831748
+	.long	1041732499
+	.long	2675965952
+	.long	621954
+	.long	238953304
+	.long	1040316488
+	.long	2189426688
+	.long	640145
+	.long	749123235
+	.long	1041725785
+	.long	2063597568
+	.long	658534
+	.long	1168187977
+	.long	1041175214
+	.long	2986344448
+	.long	677123
+	.long	3506096399
+	.long	1042186095
+	.long	1426063360
+	.long	695915
+	.long	1470221620
+	.long	1041675499
+	.long	2566914048
+	.long	714911
+	.long	3182425146
+	.long	1041483134
+	.long	3087007744
+	.long	734114
+	.long	3131698208
+	.long	1042208657
+	.long	4068474880
+	.long	753526
+	.long	2300504125
+	.long	1041428596
+	.long	2415919104
+	.long	773150
+	.long	2290297931
+	.long	1037388400
+	.long	3716153344
+	.long	792987
+	.long	3532148223
+	.long	1041626194
+	.long	771751936
+	.long	813041
+	.long	1161884404
+	.long	1042015258
+	.long	3699376128
+	.long	833312
+	.long	876383176
+	.long	1037968878
+	.long	1241513984
+	.long	853805
+	.long	3379986796
+	.long	1042213153
+	.long	3699376128
+	.long	874520
+	.long	1545797737
+	.long	1041681569
+	.long	58720256
+	.long	895462
+	.long	2925146801
+	.long	1042212567
+	.long	855638016
+	.long	916631
+	.long	1316627971
+	.long	1038516204
+	.long	3883925504
+	.long	938030
+	.long	3267869137
+	.long	1040337004
+	.long	2726297600
+	.long	959663
+	.long	3720868999
+	.long	1041782409
+	.long	3992977408
+	.long	981531
+	.long	433316142
+	.long	1041994064
+	.long	1526726656
+	.long	1003638
+	.long	781232103
+	.long	1040093400
+	.long	2172649472
+	.long	1025985
+	.type	Tbl_addr,@object
+	.size	Tbl_addr,1024
+	.align 16
+mmask:
+	.long	4294967232
+	.long	0
+	.long	4294967232
+	.long	0
+	.type	mmask,@object
+	.size	mmask,16
+	.align 16
+bias:
+	.long	65472
+	.long	0
+	.long	65472
+	.long	0
+	.type	bias,@object
+	.size	bias,16
+	.align 16
+emask:
+	.long	0
+	.long	4293918720
+	.long	0
+	.long	4293918720
+	.type	emask,@object
+	.size	emask,16
+	.align 16
+cvl:
+	.long	2773927732
+	.long	1053236707
+	.long	381774871
+	.long	1062650220
+	.long	379653899
+	.long	1056571845
+	.long	286331153
+	.long	1065423121
+	.long	436314138
+	.long	1059717536
+	.long	1431655765
+	.long	1067799893
+	.long	1431655765
+	.long	1069897045
+	.long	0
+	.long	1071644672
+	.type	cvl,@object
+	.size	cvl,64
+	.align 8
+XMAX:
+	.long	4294967295
+	.long	2146435071
+	.type	XMAX,@object
+	.size	XMAX,8
+	.align 8
+INF:
+	.long	0
+	.long	2146435072
+	.type	INF,@object
+	.size	INF,8
+	.align 8
+HIGHMASK:
+	.long	4227858432
+	.long	4294967295
+	.type	HIGHMASK,@object
+	.size	HIGHMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_expm1.1-.
+	.4byte ..___tag_value_expm1.5-..___tag_value_expm1.1
+	.2byte 0x0400
+	.4byte ..___tag_value_expm1.3-..___tag_value_expm1.1
+	.2byte 0x400e
+	.byte 0x04
+	.4byte ..___tag_value_expm1.4-..___tag_value_expm1.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/s_log1p.S b/libm/x86_64/s_log1p.S
new file mode 100644
index 0000000..1ff2d39
--- /dev/null
+++ b/libm/x86_64/s_log1p.S
@@ -0,0 +1,829 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//    Let x=2^k * mx, mx in [1,2)
+//
+//    Get B~1/mx based on the output of rcpps instruction (B0)
+//    B = int((B0*2^7+0.5))/2^7
+//
+//    Reduced argument: r=B*mx-1.0 (computed accurately in high and low parts)
+//
+//    Result:  k*log(2) - log(B) + p(r)
+//             p(r) is a degree 7 polynomial
+//             -log(B) read from data table (high, low parts)
+//             Result is formed from high and low parts
+//
+// Special cases:
+//   log1p(NaN) = quiet NaN, and raise invalid exception
+//   log1p(+INF) = that INF
+//   log1p(x) = NaN if x < -1 or x = -INF, and raises invalid exception
+//   log1p(-1) = -INF, and raises divide-by-zero exception
+//   log1p(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  log1p
+ENTRY(log1p)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_log1p.1:
+        subq      $24, %rsp
+..___tag_value_log1p.3:
+        movsd     %xmm0, 8(%rsp)
+..B1.2:
+        movq      $0x3ff0000000000000, %rax
+        movd      %rax, %xmm2
+        xorpd     %xmm3, %xmm3
+        movl      $32768, %ecx
+        movd      %rcx, %xmm4
+        movq      $0xffffe00000000000, %r8
+        movd      %r8, %xmm5
+        movddup   %xmm0, %xmm7
+        pshufd    $68, %xmm2, %xmm6
+        pextrw    $3, %xmm0, %ecx
+        addsd     %xmm2, %xmm0
+        movq      %xmm0, %xmm1
+        pextrw    $3, %xmm0, %eax
+        subsd     %xmm0, %xmm6
+        orpd      %xmm2, %xmm0
+        psrlq     $27, %xmm0
+        lea       L_tbl(%rip), %r11
+        psrld     $2, %xmm0
+        subl      $16, %eax
+        cmpl      $32736, %eax
+        jae       .L_2TAG_PACKET_0.0.2
+        addsd     %xmm6, %xmm7
+        rcpps     %xmm0, %xmm0
+        psllq     $12, %xmm1
+        pshufd    $228, %xmm5, %xmm6
+        psrlq     $12, %xmm1
+        andl      $32752, %ecx
+        cmpl      $16256, %ecx
+        jb        .L_2TAG_PACKET_1.0.2
+        andl      $32752, %eax
+        movl      $32720, %ecx
+        subl      %eax, %ecx
+        pinsrw    $3, %ecx, %xmm3
+.L_2TAG_PACKET_2.0.2:
+        mulsd     %xmm3, %xmm7
+        paddd     %xmm4, %xmm0
+        movq      $0x3800000000000000, %rcx
+        movd      %rcx, %xmm4
+        orpd      %xmm2, %xmm1
+        movd      %xmm0, %edx
+        psllq     $29, %xmm0
+        andpd     %xmm1, %xmm5
+        andpd     %xmm6, %xmm0
+        subsd     %xmm5, %xmm1
+        paddd     %xmm4, %xmm0
+        mulsd     %xmm0, %xmm5
+        movl      $16352, %ecx
+        subl      %ecx, %eax
+        cvtsi2sd  %eax, %xmm4
+        mulsd     %xmm0, %xmm7
+        mulsd     %xmm0, %xmm1
+        movq      log2(%rip), %xmm6
+        movapd    coeff(%rip), %xmm3
+        subsd     %xmm2, %xmm5
+        andl      $16711680, %edx
+        shrl      $12, %edx
+        movapd    (%r11,%rdx), %xmm0
+        movapd    16+coeff(%rip), %xmm2
+        addsd     %xmm5, %xmm1
+        movq      %xmm1, %xmm5
+        addsd     %xmm7, %xmm1
+        subsd     %xmm1, %xmm5
+        addsd     %xmm5, %xmm7
+        mulsd     %xmm4, %xmm6
+        mulsd     8+log2(%rip), %xmm4
+        mulsd     %xmm1, %xmm3
+        movddup   %xmm1, %xmm5
+        addsd     %xmm6, %xmm0
+        mulpd     %xmm5, %xmm2
+        mulpd     %xmm5, %xmm5
+        movddup   %xmm0, %xmm6
+        addsd     %xmm1, %xmm0
+        addpd     32+coeff(%rip), %xmm2
+        mulpd     %xmm5, %xmm3
+        subsd     %xmm0, %xmm6
+        mulsd     %xmm1, %xmm2
+        addsd     %xmm7, %xmm4
+        mulsd     %xmm1, %xmm7
+        addsd     %xmm6, %xmm1
+        pshufd    $238, %xmm0, %xmm6
+        mulsd     %xmm5, %xmm5
+        addsd     %xmm6, %xmm4
+        subsd     %xmm7, %xmm1
+        addpd     %xmm3, %xmm2
+        addsd     %xmm4, %xmm1
+        mulpd     %xmm5, %xmm2
+        addsd     %xmm2, %xmm1
+        pshufd    $238, %xmm2, %xmm5
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_0.0.2:
+        movq      8(%rsp), %xmm0
+        movq      8(%rsp), %xmm1
+        addl      $16, %eax
+        cmpl      $32768, %eax
+        jae       .L_2TAG_PACKET_3.0.2
+        cmpl      $0, %eax
+        je        .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_5.0.2:
+        addsd     %xmm0, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_6.0.2:
+        ja        .L_2TAG_PACKET_5.0.2
+        cmpl      $0, %edx
+        ja        .L_2TAG_PACKET_5.0.2
+        jmp       .L_2TAG_PACKET_7.0.2
+.L_2TAG_PACKET_3.0.2:
+        movd      %xmm1, %edx
+        psrlq     $32, %xmm1
+        movd      %xmm1, %ecx
+        addl      %ecx, %ecx
+        cmpl      $-2097152, %ecx
+        jae       .L_2TAG_PACKET_6.0.2
+        orl       %ecx, %edx
+        cmpl      $0, %edx
+        je        .L_2TAG_PACKET_4.0.2
+.L_2TAG_PACKET_7.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $32752, %eax
+        pinsrw    $3, %eax, %xmm1
+        movl      $141, (%rsp)
+        mulsd     %xmm1, %xmm0
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_4.0.2:
+        xorpd     %xmm1, %xmm1
+        xorpd     %xmm0, %xmm0
+        movl      $49136, %eax
+        pinsrw    $3, %eax, %xmm0
+        divsd     %xmm1, %xmm0
+        movl      $140, (%rsp)
+        jmp       .L_2TAG_PACKET_8.0.2
+.L_2TAG_PACKET_1.0.2:
+        movq      8(%rsp), %xmm0
+        cmpl      $15504, %ecx
+        jb        .L_2TAG_PACKET_9.0.2
+        movapd    coeff2(%rip), %xmm1
+        pshufd    $68, %xmm0, %xmm0
+        movapd    16+coeff2(%rip), %xmm2
+        pshufd    $68, %xmm0, %xmm4
+        movapd    32+coeff2(%rip), %xmm3
+        mulpd     %xmm0, %xmm1
+        xorpd     %xmm6, %xmm6
+        mulpd     %xmm4, %xmm4
+        addpd     %xmm2, %xmm1
+        pshufd    $68, %xmm4, %xmm5
+        mulpd     %xmm0, %xmm4
+        movl      $49120, %eax
+        pinsrw    $3, %eax, %xmm6
+        mulpd     %xmm0, %xmm1
+        mulsd     %xmm4, %xmm4
+        addpd     %xmm3, %xmm1
+        mulsd     %xmm6, %xmm5
+        mulpd     %xmm4, %xmm1
+        pshufd    $238, %xmm1, %xmm7
+        addsd     %xmm7, %xmm1
+        addsd     %xmm5, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.5
+.L_2TAG_PACKET_9.0.2:
+        cmpl      $16, %ecx
+        jb        .L_2TAG_PACKET_10.0.2
+        jmp       ..B1.5
+.L_2TAG_PACKET_10.0.2:
+        movq      %xmm0, %xmm1
+        mulsd     %xmm1, %xmm1
+        jmp       ..B1.5
+.L_2TAG_PACKET_8.0.2:
+        movq      %xmm0, 16(%rsp)
+..B1.3:
+        movq      16(%rsp), %xmm0
+.L_2TAG_PACKET_11.0.2:
+..B1.5:
+        addq      $24, %rsp
+..___tag_value_log1p.4:
+        ret       
+..___tag_value_log1p.5:
+END(log1p)
+# -- End  log1p
+	.section .rodata, "a"
+	.align 16
+	.align 16
+L_tbl:
+	.long	4277811200
+	.long	1072049730
+	.long	2479318832
+	.long	1026487127
+	.long	2854492160
+	.long	1072033410
+	.long	215631550
+	.long	1025638968
+	.long	1547061248
+	.long	1072017216
+	.long	2886781435
+	.long	1026423395
+	.long	649825280
+	.long	1072001146
+	.long	4281533405
+	.long	1024038923
+	.long	646346752
+	.long	1071985198
+	.long	1562735921
+	.long	1023790276
+	.long	2203734016
+	.long	1071969370
+	.long	1838397691
+	.long	3173936209
+	.long	1872169984
+	.long	1071953661
+	.long	3981202460
+	.long	1022325013
+	.long	669557760
+	.long	1071938069
+	.long	4182597802
+	.long	3173174122
+	.long	4076413952
+	.long	1071922591
+	.long	1209029111
+	.long	3170736207
+	.long	556125184
+	.long	1071907228
+	.long	821086028
+	.long	3173437049
+	.long	204914688
+	.long	1071891976
+	.long	2097025986
+	.long	3171071798
+	.long	387545088
+	.long	1071876834
+	.long	3142936996
+	.long	3173092218
+	.long	2912783360
+	.long	1071861800
+	.long	2502420140
+	.long	1024505919
+	.long	1144260608
+	.long	1071846874
+	.long	3315658140
+	.long	3173469843
+	.long	1471209472
+	.long	1071832053
+	.long	129621009
+	.long	3172443877
+	.long	1829683200
+	.long	1071817336
+	.long	3885467693
+	.long	1025535275
+	.long	288676864
+	.long	1071802722
+	.long	86139472
+	.long	3171639793
+	.long	3636378624
+	.long	1071788208
+	.long	1850238587
+	.long	1024654342
+	.long	1606817792
+	.long	1071773795
+	.long	3388899795
+	.long	3173675586
+	.long	1236164608
+	.long	1071759480
+	.long	3983599207
+	.long	1020046558
+	.long	1089616896
+	.long	1071745262
+	.long	4171974224
+	.long	1024773198
+	.long	4143093760
+	.long	1071731139
+	.long	2727587401
+	.long	3173965207
+	.long	600267776
+	.long	1071717112
+	.long	3147685042
+	.long	3173353031
+	.long	2249313280
+	.long	1071703177
+	.long	125835074
+	.long	1025255832
+	.long	3805303808
+	.long	1071689334
+	.long	2289991207
+	.long	1025460331
+	.long	87278592
+	.long	1071675583
+	.long	1106114045
+	.long	1025933602
+	.long	3195405312
+	.long	1071661920
+	.long	3885316576
+	.long	3171206239
+	.long	3853649920
+	.long	1071648346
+	.long	2977069852
+	.long	3171236771
+	.long	2944026624
+	.long	1071625048
+	.long	1008093493
+	.long	1023444474
+	.long	3993180160
+	.long	1071598247
+	.long	1862355595
+	.long	1024642533
+	.long	1454641152
+	.long	1071571617
+	.long	1514603089
+	.long	1026500596
+	.long	3286085632
+	.long	1071545154
+	.long	1400028424
+	.long	3173279056
+	.long	438773760
+	.long	1071518858
+	.long	120727864
+	.long	3172148914
+	.long	1212979200
+	.long	1071492725
+	.long	1625055594
+	.long	3172901933
+	.long	1189017600
+	.long	1071466754
+	.long	3920062376
+	.long	1025727407
+	.long	403064832
+	.long	1071440943
+	.long	1053271728
+	.long	3171391427
+	.long	3343210496
+	.long	1071415289
+	.long	3243395502
+	.long	3173627613
+	.long	1765777408
+	.long	1071389792
+	.long	2145968512
+	.long	1026354304
+	.long	461430784
+	.long	1071364449
+	.long	4094322285
+	.long	1026021467
+	.long	71706624
+	.long	1071339258
+	.long	763632021
+	.long	1024496933
+	.long	1380503552
+	.long	1071314217
+	.long	1383547992
+	.long	3173088453
+	.long	1015732224
+	.long	1071289325
+	.long	3198646877
+	.long	1025390322
+	.long	35977216
+	.long	1071264580
+	.long	2141026805
+	.long	1025754693
+	.long	3927306240
+	.long	1071239979
+	.long	282116272
+	.long	3173394334
+	.long	1125341184
+	.long	1071215523
+	.long	2768427504
+	.long	3172279059
+	.long	1666971648
+	.long	1071191208
+	.long	786837629
+	.long	3172427445
+	.long	2827694080
+	.long	1071167033
+	.long	3857122416
+	.long	3173014241
+	.long	2003683328
+	.long	1071142997
+	.long	859010954
+	.long	1026545007
+	.long	1004017664
+	.long	1071119098
+	.long	3356644970
+	.long	3173458064
+	.long	1753020416
+	.long	1071095334
+	.long	788338552
+	.long	1026157693
+	.long	1992718336
+	.long	1071071704
+	.long	1239179443
+	.long	1026394889
+	.long	3870234624
+	.long	1071048206
+	.long	2082614663
+	.long	1024926053
+	.long	1050437632
+	.long	1071024840
+	.long	660007840
+	.long	1025548499
+	.long	188395520
+	.long	1071001603
+	.long	3878792704
+	.long	3173889571
+	.long	3747176448
+	.long	1070978493
+	.long	144991708
+	.long	3171552042
+	.long	1405669376
+	.long	1070955511
+	.long	3999088879
+	.long	1025486317
+	.long	121151488
+	.long	1070932654
+	.long	2170865497
+	.long	1026473584
+	.long	2652319744
+	.long	1070909920
+	.long	453695652
+	.long	3173916809
+	.long	3262236672
+	.long	1070887309
+	.long	157800053
+	.long	3173984206
+	.long	601221120
+	.long	1070864820
+	.long	3968917661
+	.long	1023992886
+	.long	1999843328
+	.long	1070842450
+	.long	3053895004
+	.long	1024998228
+	.long	1992167424
+	.long	1070820199
+	.long	2968614856
+	.long	1024552653
+	.long	3788726272
+	.long	1070798065
+	.long	3542170808
+	.long	3173573242
+	.long	2094829568
+	.long	1070776048
+	.long	1246758132
+	.long	1026202874
+	.long	288675840
+	.long	1070754146
+	.long	3747328950
+	.long	1026331585
+	.long	1829681152
+	.long	1070732357
+	.long	3125197546
+	.long	1024100318
+	.long	1666869248
+	.long	1070710681
+	.long	1363656119
+	.long	1026336493
+	.long	3417110528
+	.long	1070689116
+	.long	4154791553
+	.long	1026267853
+	.long	2183653376
+	.long	1070667662
+	.long	1671819292
+	.long	3173785870
+	.long	1734434816
+	.long	1070646317
+	.long	373091049
+	.long	1025972363
+	.long	1615681536
+	.long	1070625080
+	.long	384650897
+	.long	1022926043
+	.long	1445382144
+	.long	1070603950
+	.long	344320330
+	.long	3172397196
+	.long	1823715328
+	.long	1070569756
+	.long	3389841200
+	.long	1025231852
+	.long	3839688704
+	.long	1070527917
+	.long	1706790417
+	.long	3167363349
+	.long	4293332992
+	.long	1070486286
+	.long	1614935088
+	.long	1019351591
+	.long	2966720512
+	.long	1070444861
+	.long	4145393717
+	.long	3173711658
+	.long	4066729984
+	.long	1070403639
+	.long	1974925028
+	.long	3171437182
+	.long	3337621504
+	.long	1070362619
+	.long	3314953170
+	.long	3169971314
+	.long	943448064
+	.long	1070321799
+	.long	1498682038
+	.long	3173862340
+	.long	1465634816
+	.long	1070281176
+	.long	1319952810
+	.long	3171693965
+	.long	1015734272
+	.long	1070240749
+	.long	1347821929
+	.long	3173544515
+	.long	118001664
+	.long	1070200516
+	.long	1751482746
+	.long	1026134093
+	.long	3707174912
+	.long	1070160474
+	.long	1486946159
+	.long	1023930920
+	.long	3946381312
+	.long	1070120623
+	.long	2867408081
+	.long	3171368276
+	.long	1699848192
+	.long	1070080961
+	.long	2590187139
+	.long	1025379803
+	.long	2235846656
+	.long	1070041485
+	.long	1888568069
+	.long	3172754960
+	.long	2339729408
+	.long	1070002194
+	.long	3852214753
+	.long	3173323149
+	.long	3196850176
+	.long	1069963086
+	.long	742141560
+	.long	1025101707
+	.long	1800683520
+	.long	1069924160
+	.long	3949500444
+	.long	3172102179
+	.long	3835801600
+	.long	1069885413
+	.long	3848895943
+	.long	1025913832
+	.long	2201202688
+	.long	1069846845
+	.long	1425913464
+	.long	1025868665
+	.long	2778279936
+	.long	1069808453
+	.long	2120889677
+	.long	3173831128
+	.long	2954203136
+	.long	1069770236
+	.long	592147081
+	.long	1019621288
+	.long	210141184
+	.long	1069732193
+	.long	3414275233
+	.long	1023647084
+	.long	709476352
+	.long	1069694321
+	.long	2413027164
+	.long	1024462115
+	.long	2116284416
+	.long	1069656619
+	.long	1144559924
+	.long	1026336654
+	.long	2183651328
+	.long	1069619086
+	.long	3459057650
+	.long	1025634168
+	.long	3047047168
+	.long	1069581720
+	.long	1879674924
+	.long	3173508573
+	.long	970711040
+	.long	1069541521
+	.long	1335954173
+	.long	3173332182
+	.long	2198478848
+	.long	1069467449
+	.long	2951103968
+	.long	3173892200
+	.long	1669611520
+	.long	1069393703
+	.long	531044147
+	.long	1025149248
+	.long	29114368
+	.long	1069320280
+	.long	3327831251
+	.long	1025918673
+	.long	2376949760
+	.long	1069247176
+	.long	737634533
+	.long	3172176000
+	.long	1085390848
+	.long	1069174390
+	.long	3108243400
+	.long	3171828406
+	.long	1566130176
+	.long	1069101918
+	.long	985483226
+	.long	1025708380
+	.long	792780800
+	.long	1069029758
+	.long	4184866295
+	.long	1024426204
+	.long	183156736
+	.long	1068957907
+	.long	2845699378
+	.long	1022107277
+	.long	1301782528
+	.long	1068886362
+	.long	1012735262
+	.long	3173804294
+	.long	1562411008
+	.long	1068815121
+	.long	2197086703
+	.long	3170187813
+	.long	2815549440
+	.long	1068744181
+	.long	2782613207
+	.long	1026345054
+	.long	2756124672
+	.long	1068673540
+	.long	2929486205
+	.long	3173037800
+	.long	3511050240
+	.long	1068603195
+	.long	1443733147
+	.long	3173331549
+	.long	3047047168
+	.long	1068533144
+	.long	1879674924
+	.long	3172459997
+	.long	3221667840
+	.long	1068427825
+	.long	1338588027
+	.long	3171815742
+	.long	3453861888
+	.long	1068288883
+	.long	1205348359
+	.long	3172624626
+	.long	3506110464
+	.long	1068150514
+	.long	893105198
+	.long	1025571866
+	.long	346013696
+	.long	1068012714
+	.long	3495569021
+	.long	3172563349
+	.long	4074029056
+	.long	1067875476
+	.long	3961106338
+	.long	3171065595
+	.long	3559784448
+	.long	1067738798
+	.long	1975385384
+	.long	3173783155
+	.long	797769728
+	.long	1067602675
+	.long	3760305787
+	.long	1026047642
+	.long	2313633792
+	.long	1067467101
+	.long	1559353171
+	.long	1023480256
+	.long	3960766464
+	.long	1067213778
+	.long	1067365107
+	.long	1025865926
+	.long	684261376
+	.long	1066944805
+	.long	844762164
+	.long	3173687482
+	.long	630718464
+	.long	1066676905
+	.long	2458269694
+	.long	1024033081
+	.long	1486061568
+	.long	1066410070
+	.long	115537874
+	.long	3173243995
+	.long	2743664640
+	.long	1065886792
+	.long	3665098304
+	.long	3173471607
+	.long	1971912704
+	.long	1065357333
+	.long	2577214440
+	.long	3171993451
+	.long	1498939392
+	.long	1064306693
+	.long	3409036923
+	.long	1025599151
+	.long	0
+	.long	0
+	.long	0
+	.long	2147483648
+	.type	L_tbl,@object
+	.size	L_tbl,2064
+	.align 16
+log2:
+	.long	4277811200
+	.long	1067855426
+	.long	2479318832
+	.long	1022292823
+	.type	log2,@object
+	.size	log2,16
+	.align 16
+coeff:
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1030730101
+	.long	3217380702
+	.long	1431655765
+	.long	1070945621
+	.long	2576980378
+	.long	1070176665
+	.long	0
+	.long	3219128320
+	.type	coeff,@object
+	.size	coeff,48
+	.align 16
+coeff2:
+	.long	0
+	.long	3217031168
+	.long	2576980378
+	.long	1070176665
+	.long	2454267026
+	.long	1069697316
+	.long	0
+	.long	3218079744
+	.long	1431655765
+	.long	3217380693
+	.long	1431655765
+	.long	1070945621
+	.type	coeff2,@object
+	.size	coeff2,48
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_log1p.1-.
+	.4byte ..___tag_value_log1p.5-..___tag_value_log1p.1
+	.2byte 0x0400
+	.4byte ..___tag_value_log1p.3-..___tag_value_log1p.1
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_log1p.4-..___tag_value_log1p.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/s_sin.S b/libm/x86_64/s_sin.S
new file mode 100644
index 0000000..2f93a34
--- /dev/null
+++ b/libm/x86_64/s_sin.S
@@ -0,0 +1,1300 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+//     1. RANGE REDUCTION
+//
+//     We perform an initial range reduction from X to r with
+//
+//          X =~= N * pi/32 + r
+//
+//     so that |r| <= pi/64 + epsilon. We restrict inputs to those
+//     where |N| <= 932560. Beyond this, the range reduction is
+//     insufficiently accurate. For extremely small inputs, 
+//     denormalization can occur internally, impacting performance.
+//     This means that the main path is actually only taken for
+//     2^-252 <= |X| < 90112.
+//
+//     To avoid branches, we perform the range reduction to full
+//     accuracy each time.
+//
+//          X - N * (P_1 + P_2 + P_3)
+//
+//     where P_1 and P_2 are 32-bit numbers (so multiplication by N
+//     is exact) and P_3 is a 53-bit number. Together, these
+//     approximate pi well enough for all cases in the restricted
+//     range.
+//
+//     The main reduction sequence is:
+//
+//             y = 32/pi * x
+//             N = integer(y)
+//     (computed by adding and subtracting off SHIFTER)
+//
+//             m_1 = N * P_1
+//             m_2 = N * P_2
+//             r_1 = x - m_1
+//             r = r_1 - m_2
+//     (this r can be used for most of the calculation)
+//
+//             c_1 = r_1 - r
+//             m_3 = N * P_3
+//             c_2 = c_1 - m_2
+//             c = c_2 - m_3
+//
+//     2. MAIN ALGORITHM
+//
+//     The algorithm uses a table lookup based on B = M * pi / 32
+//     where M = N mod 64. The stored values are:
+//       sigma             closest power of 2 to cos(B)
+//       C_hl              53-bit cos(B) - sigma
+//       S_hi + S_lo       2 * 53-bit sin(B)
+//
+//     The computation is organized as follows:
+//
+//          sin(B + r + c) = [sin(B) + sigma * r] +
+//                           r * (cos(B) - sigma) +
+//                           sin(B) * [cos(r + c) - 1] +
+//                           cos(B) * [sin(r + c) - r]
+//
+//     which is approximately:
+//
+//          [S_hi + sigma * r] +
+//          C_hl * r +
+//          S_lo + S_hi * [(cos(r) - 1) - r * c] +
+//          (C_hl + sigma) * [(sin(r) - r) + c]
+//
+//     and this is what is actually computed. We separate this sum
+//     into four parts:
+//
+//          hi + med + pols + corr
+//
+//     where
+//
+//          hi       = S_hi + sigma r
+//          med      = C_hl * r
+//          pols     = S_hi * (cos(r) - 1) + (C_hl + sigma) * (sin(r) - r)
+//          corr     = S_lo + c * ((C_hl + sigma) - S_hi * r)
+//
+//     3. POLYNOMIAL
+//
+//     The polynomial S_hi * (cos(r) - 1) + (C_hl + sigma) *
+//     (sin(r) - r) can be rearranged freely, since it is quite
+//     small, so we exploit parallelism to the fullest.
+//
+//          psc4       =   SC_4 * r_1
+//          msc4       =   psc4 * r
+//          r2         =   r * r
+//          msc2       =   SC_2 * r2
+//          r4         =   r2 * r2
+//          psc3       =   SC_3 + msc4
+//          psc1       =   SC_1 + msc2
+//          msc3       =   r4 * psc3
+//          sincospols =   psc1 + msc3
+//          pols       =   sincospols *
+//                         <S_hi * r^2 | (C_hl + sigma) * r^3>
+//
+//     4. CORRECTION TERM
+//
+//     This is where the "c" component of the range reduction is
+//     taken into account; recall that just "r" is used for most of
+//     the calculation.
+//
+//          -c   = m_3 - c_2
+//          -d   = S_hi * r - (C_hl + sigma)
+//          corr = -c * -d + S_lo
+//
+//     5. COMPENSATED SUMMATIONS
+//
+//     The two successive compensated summations add up the high
+//     and medium parts, leaving just the low parts to add up at
+//     the end.
+//
+//          rs        =  sigma * r
+//          res_int   =  S_hi + rs
+//          k_0       =  S_hi - res_int
+//          k_2       =  k_0 + rs
+//          med       =  C_hl * r
+//          res_hi    =  res_int + med
+//          k_1       =  res_int - res_hi
+//          k_3       =  k_1 + med
+//
+//     6. FINAL SUMMATION
+//
+//     We now add up all the small parts:
+//
+//          res_lo = pols(hi) + pols(lo) + corr + k_1 + k_3
+//
+//     Now the overall result is just:
+//
+//          res_hi + res_lo
+//
+//     7. SMALL ARGUMENTS
+//
+//     If |x| < SNN (SNN meaning the smallest normal number), we
+//     simply perform 0.1111111 cdots 1111 * x. For SNN <= |x|, we
+//     do 2^-55 * (2^55 * x - x).
+//
+// Special cases:
+//  sin(NaN) = quiet NaN, and raise invalid exception
+//  sin(INF) = NaN and raise invalid exception
+//  sin(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  sin
+ENTRY(sin)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_sin.1:
+        pushq     %rbx
+..___tag_value_sin.3:
+        subq      $16, %rsp
+..___tag_value_sin.5:
+        movsd     %xmm0, 8(%rsp)
+..B1.2:
+        movl      12(%rsp), %eax
+        movq      PI32INV(%rip), %xmm1
+        movq      SHIFTER(%rip), %xmm2
+        andl      $2147418112, %eax
+        subl      $808452096, %eax
+        cmpl      $281346048, %eax
+        ja        .L_2TAG_PACKET_0.0.1
+        mulsd     %xmm0, %xmm1
+        movapd    ONEHALF(%rip), %xmm5
+        movq      SIGN_MASK(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %edx
+        cvtsi2sd  %edx, %xmm1
+        movapd    P_2(%rip), %xmm6
+        movq      $0x3fb921fb54400000, %r8
+        movd      %r8, %xmm3
+        movapd    SC_4(%rip), %xmm5
+        pshufd    $68, %xmm0, %xmm4
+        mulsd     %xmm1, %xmm3
+        movddup   %xmm1, %xmm1
+        andl      $63, %edx
+        shll      $5, %edx
+        lea       Ctable(%rip), %rax
+        addq      %rdx, %rax
+        mulpd     %xmm1, %xmm6
+        mulsd     P_3(%rip), %xmm1
+        subsd     %xmm3, %xmm4
+        movq      8(%rax), %xmm7
+        subsd     %xmm3, %xmm0
+        movddup   %xmm4, %xmm3
+        subsd     %xmm6, %xmm4
+        pshufd    $68, %xmm0, %xmm0
+        movapd    (%rax), %xmm2
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm6, %xmm0
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm6, %xmm3
+        movapd    SC_2(%rip), %xmm6
+        subsd     %xmm3, %xmm1
+        movq      24(%rax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     SC_3(%rip), %xmm5
+        mulsd     (%rax), %xmm4
+        addpd     SC_1(%rip), %xmm6
+        mulpd     %xmm0, %xmm5
+        movq      %xmm3, %xmm0
+        addsd     8(%rax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movq      %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movq      8(%rax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%rax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm0, %xmm5
+        addsd     %xmm7, %xmm3
+        addsd     %xmm5, %xmm1
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        unpckhpd  %xmm6, %xmm6
+        movq      %xmm4, %xmm0
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_0.0.1:
+        jg        .L_2TAG_PACKET_1.0.1
+        shrl      $20, %eax
+        cmpw      $3325, %ax
+        jne       .L_2TAG_PACKET_2.0.1
+        mulsd     ALL_ONES(%rip), %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_2.0.1:
+        movq      TWO_POW_55(%rip), %xmm3
+        mulsd     %xmm0, %xmm3
+        subsd     %xmm0, %xmm3
+        mulsd     TWO_POW_M55(%rip), %xmm3
+        jmp       ..B1.4
+.L_2TAG_PACKET_1.0.1:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_3.0.1
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        subl      $16224, %ecx
+        shrl      $7, %ecx
+        andl      $65532, %ecx
+        lea       PI_INV_TABLE(%rip), %r11
+        addq      %r11, %rcx
+        movd      %xmm0, %rax
+        movl      20(%rcx), %r10d
+        movl      24(%rcx), %r8d
+        movl      %eax, %edx
+        shrq      $21, %rax
+        orl       $-2147483648, %eax
+        shrl      $11, %eax
+        movl      %r10d, %r9d
+        imulq     %rdx, %r10
+        imulq     %rax, %r9
+        imulq     %rax, %r8
+        movl      16(%rcx), %esi
+        movl      12(%rcx), %edi
+        movl      %r10d, %r11d
+        shrq      $32, %r10
+        addq      %r10, %r9
+        addq      %r8, %r11
+        movl      %r11d, %r8d
+        shrq      $32, %r11
+        addq      %r11, %r9
+        movl      %esi, %r10d
+        imulq     %rdx, %rsi
+        imulq     %rax, %r10
+        movl      %edi, %r11d
+        imulq     %rdx, %rdi
+        movl      %esi, %ebx
+        shrq      $32, %rsi
+        addq      %rbx, %r9
+        movl      %r9d, %ebx
+        shrq      $32, %r9
+        addq      %rsi, %r10
+        addq      %r9, %r10
+        shlq      $32, %rbx
+        orq       %rbx, %r8
+        imulq     %rax, %r11
+        movl      8(%rcx), %r9d
+        movl      4(%rcx), %esi
+        movl      %edi, %ebx
+        shrq      $32, %rdi
+        addq      %rbx, %r10
+        movl      %r10d, %ebx
+        shrq      $32, %r10
+        addq      %rdi, %r11
+        addq      %r10, %r11
+        movq      %r9, %rdi
+        imulq     %rdx, %r9
+        imulq     %rax, %rdi
+        movl      %r9d, %r10d
+        shrq      $32, %r9
+        addq      %r10, %r11
+        movl      %r11d, %r10d
+        shrq      $32, %r11
+        addq      %r9, %rdi
+        addq      %r11, %rdi
+        movq      %rsi, %r9
+        imulq     %rdx, %rsi
+        imulq     %rax, %r9
+        shlq      $32, %r10
+        orq       %rbx, %r10
+        movl      (%rcx), %eax
+        movl      %esi, %r11d
+        shrq      $32, %rsi
+        addq      %r11, %rdi
+        movl      %edi, %r11d
+        shrq      $32, %rdi
+        addq      %rsi, %r9
+        addq      %rdi, %r9
+        imulq     %rax, %rdx
+        pextrw    $3, %xmm0, %ebx
+        lea       PI_INV_TABLE(%rip), %rdi
+        subq      %rdi, %rcx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      $19, %ecx
+        movl      $32768, %esi
+        andl      %ebx, %esi
+        shrl      $4, %ebx
+        andl      $2047, %ebx
+        subl      $1023, %ebx
+        subl      %ebx, %ecx
+        addq      %rdx, %r9
+        movl      %ecx, %edx
+        addl      $32, %edx
+        cmpl      $1, %ecx
+        jl        .L_2TAG_PACKET_4.0.1
+        negl      %ecx
+        addl      $29, %ecx
+        shll      %cl, %r9d
+        movl      %r9d, %edi
+        andl      $536870911, %r9d
+        testl     $268435456, %r9d
+        jne       .L_2TAG_PACKET_5.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+.L_2TAG_PACKET_6.0.1:
+.L_2TAG_PACKET_7.0.1:
+        cmpq      $0, %r9
+        je        .L_2TAG_PACKET_8.0.1
+.L_2TAG_PACKET_9.0.1:
+        bsr       %r9, %r11
+        movl      $29, %ecx
+        subl      %r11d, %ecx
+        jle       .L_2TAG_PACKET_10.0.1
+        shlq      %cl, %r9
+        movq      %r10, %rax
+        shlq      %cl, %r10
+        addl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shrq      %cl, %rax
+        shrq      %cl, %r8
+        orq       %rax, %r9
+        orq       %r8, %r10
+.L_2TAG_PACKET_11.0.1:
+        cvtsi2sdq %r9, %xmm0
+        shrq      $1, %r10
+        cvtsi2sdq %r10, %xmm3
+        xorpd     %xmm4, %xmm4
+        shll      $4, %edx
+        negl      %edx
+        addl      $16368, %edx
+        orl       %esi, %edx
+        xorl      %ebx, %edx
+        pinsrw    $3, %edx, %xmm4
+        movq      PI_4(%rip), %xmm2
+        movq      8+PI_4(%rip), %xmm6
+        xorpd     %xmm5, %xmm5
+        subl      $1008, %edx
+        pinsrw    $3, %edx, %xmm5
+        mulsd     %xmm4, %xmm0
+        shll      $16, %esi
+        sarl      $31, %esi
+        mulsd     %xmm5, %xmm3
+        movq      %xmm0, %xmm1
+        mulsd     %xmm2, %xmm0
+        shrl      $29, %edi
+        addsd     %xmm3, %xmm1
+        mulsd     %xmm2, %xmm3
+        addl      %esi, %edi
+        xorl      %esi, %edi
+        mulsd     %xmm1, %xmm6
+        movl      %edi, %eax
+        addsd     %xmm3, %xmm6
+        movq      %xmm0, %xmm2
+        addsd     %xmm6, %xmm0
+        subsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm6
+.L_2TAG_PACKET_12.0.1:
+        movq      PI32INV(%rip), %xmm1
+        mulsd     %xmm0, %xmm1
+        movq      ONEHALF(%rip), %xmm5
+        movq      SIGN_MASK(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        cvttsd2si %xmm1, %edx
+        cvtsi2sd  %edx, %xmm1
+        movq      P_1(%rip), %xmm3
+        movapd    P_2(%rip), %xmm2
+        mulsd     %xmm1, %xmm3
+        unpcklpd  %xmm1, %xmm1
+        shll      $3, %eax
+        addl      $1865216, %edx
+        movq      %xmm0, %xmm4
+        addl      %eax, %edx
+        andl      $63, %edx
+        movapd    SC_4(%rip), %xmm5
+        lea       Ctable(%rip), %rax
+        shll      $5, %edx
+        addq      %rdx, %rax
+        mulpd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm0
+        mulsd     P_3(%rip), %xmm1
+        subsd     %xmm3, %xmm4
+        movq      8(%rax), %xmm7
+        unpcklpd  %xmm0, %xmm0
+        movq      %xmm4, %xmm3
+        subsd     %xmm2, %xmm4
+        mulpd     %xmm0, %xmm5
+        subpd     %xmm2, %xmm0
+        mulsd     %xmm4, %xmm7
+        subsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm5
+        mulpd     %xmm0, %xmm0
+        subsd     %xmm2, %xmm3
+        movapd    (%rax), %xmm2
+        subsd     %xmm3, %xmm1
+        movq      24(%rax), %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm7
+        subsd     %xmm6, %xmm1
+        movapd    SC_2(%rip), %xmm6
+        mulsd     %xmm4, %xmm2
+        mulpd     %xmm0, %xmm6
+        mulsd     %xmm4, %xmm3
+        mulpd     %xmm0, %xmm2
+        mulpd     %xmm0, %xmm0
+        addpd     SC_3(%rip), %xmm5
+        mulsd     (%rax), %xmm4
+        addpd     SC_1(%rip), %xmm6
+        mulpd     %xmm0, %xmm5
+        movq      %xmm3, %xmm0
+        addsd     8(%rax), %xmm3
+        mulpd     %xmm7, %xmm1
+        movq      %xmm4, %xmm7
+        addsd     %xmm3, %xmm4
+        addpd     %xmm5, %xmm6
+        movq      8(%rax), %xmm5
+        subsd     %xmm3, %xmm5
+        subsd     %xmm4, %xmm3
+        addsd     16(%rax), %xmm1
+        mulpd     %xmm2, %xmm6
+        addsd     %xmm0, %xmm5
+        addsd     %xmm7, %xmm3
+        addsd     %xmm5, %xmm1
+        addsd     %xmm3, %xmm1
+        addsd     %xmm6, %xmm1
+        unpckhpd  %xmm6, %xmm6
+        movq      %xmm4, %xmm0
+        addsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_8.0.1:
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        movq      $0, %r8
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_9.0.1
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_9.0.1
+        xorpd     %xmm0, %xmm0
+        xorpd     %xmm6, %xmm6
+        jmp       .L_2TAG_PACKET_12.0.1
+.L_2TAG_PACKET_10.0.1:
+        je        .L_2TAG_PACKET_11.0.1
+        negl      %ecx
+        shrq      %cl, %r10
+        movq      %r9, %rax
+        shrq      %cl, %r9
+        subl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shlq      %cl, %rax
+        orq       %rax, %r10
+        jmp       .L_2TAG_PACKET_11.0.1
+.L_2TAG_PACKET_4.0.1:
+        negl      %ecx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      %cl, %r9
+        movq      %r9, %rdi
+        testl     $-2147483648, %r9d
+        jne       .L_2TAG_PACKET_13.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shrq      $3, %rdi
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_5.0.1:
+        shrl      %cl, %r9d
+        movl      $536870912, %ebx
+        shrl      %cl, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      $32, %rbx
+        addl      $536870912, %edi
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        jmp       .L_2TAG_PACKET_6.0.1
+.L_2TAG_PACKET_13.0.1:
+        shrl      %cl, %r9d
+        movq      $0x100000000, %rbx
+        shrq      %cl, %rbx
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        shrq      $3, %rdi
+        addl      $536870912, %edi
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_3.0.1:
+        movq      8(%rsp), %xmm0
+        mulsd     NEG_ZERO(%rip), %xmm0
+        movq      %xmm0, (%rsp)
+.L_2TAG_PACKET_14.0.1:
+..B1.4:
+        addq      $16, %rsp
+..___tag_value_sin.6:
+        popq      %rbx
+..___tag_value_sin.8:
+        ret       
+..___tag_value_sin.9:
+END(sin)
+# -- End  sin
+	.section .rodata, "a"
+	.align 16
+	.align 16
+ONEHALF:
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.type	ONEHALF,@object
+	.size	ONEHALF,16
+	.align 16
+P_2:
+	.long	442499072
+	.long	1032893537
+	.long	442499072
+	.long	1032893537
+	.type	P_2,@object
+	.size	P_2,16
+	.align 16
+SC_4:
+	.long	2773927732
+	.long	1053236707
+	.long	436314138
+	.long	1056571808
+	.type	SC_4,@object
+	.size	SC_4,16
+	.align 16
+Ctable:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	1072693248
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	1072693248
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	1071644672
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	1071644672
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	1070596096
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	1070596096
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	1069547520
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	1072683149
+	.long	1073741824
+	.long	3163061750
+	.long	0
+	.long	3217031168
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	1072652951
+	.long	536870912
+	.long	1014325783
+	.long	0
+	.long	3218079744
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	1072602945
+	.long	3758096384
+	.long	1015505073
+	.long	0
+	.long	3218079744
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	1072533611
+	.long	536870912
+	.long	1014257638
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	1072445618
+	.long	2147483648
+	.long	3161907377
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	1072339814
+	.long	3758096384
+	.long	1010431536
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	1072217216
+	.long	536870912
+	.long	3162686945
+	.long	0
+	.long	3219128320
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	1072079006
+	.long	536870912
+	.long	3163282740
+	.long	0
+	.long	3219128320
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	1071926515
+	.long	536870912
+	.long	1013450602
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	1071761211
+	.long	536870912
+	.long	1015752157
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	1071524701
+	.long	536870912
+	.long	1012796809
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	1071152610
+	.long	3758096384
+	.long	3160878317
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	1070765062
+	.long	2684354560
+	.long	3161838221
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	1070135480
+	.long	3221225472
+	.long	3160567065
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	1069094822
+	.long	3758096384
+	.long	3158189848
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	393047345
+	.long	1064548654
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	3220176896
+	.long	18115067
+	.long	1066642694
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	3220176896
+	.long	2476548698
+	.long	1067846634
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	3220176896
+	.long	2255197647
+	.long	1068727457
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	3220176896
+	.long	1945768569
+	.long	1069431400
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	3220176896
+	.long	1539668340
+	.long	1069912679
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	3220176896
+	.long	1403757309
+	.long	1070403070
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	3220176896
+	.long	2583490354
+	.long	3217719929
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	3219128320
+	.long	2485417816
+	.long	3217109964
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	3219128320
+	.long	2598800519
+	.long	3215750067
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	3219128320
+	.long	2140183630
+	.long	1067272748
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	3219128320
+	.long	1699043957
+	.long	1069418613
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	3219128320
+	.long	1991047213
+	.long	3215237169
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	3218079744
+	.long	240740309
+	.long	1068244255
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	3218079744
+	.long	257503056
+	.long	1067164005
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	3217031168
+	.long	0
+	.long	0
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	257503056
+	.long	3214647653
+	.long	2748392742
+	.long	3220166797
+	.long	1073741824
+	.long	1015578102
+	.long	0
+	.long	1069547520
+	.long	240740309
+	.long	3215727903
+	.long	3489094832
+	.long	3220136599
+	.long	536870912
+	.long	3161809431
+	.long	0
+	.long	1070596096
+	.long	1991047213
+	.long	1067753521
+	.long	1455828442
+	.long	3220086593
+	.long	3758096384
+	.long	3162988721
+	.long	0
+	.long	1070596096
+	.long	1699043957
+	.long	3216902261
+	.long	3476196678
+	.long	3220017259
+	.long	536870912
+	.long	3161741286
+	.long	0
+	.long	1071644672
+	.long	2140183630
+	.long	3214756396
+	.long	4051746225
+	.long	3219929266
+	.long	2147483648
+	.long	1014423729
+	.long	0
+	.long	1071644672
+	.long	2598800519
+	.long	1068266419
+	.long	688824739
+	.long	3219823462
+	.long	3758096384
+	.long	3157915184
+	.long	0
+	.long	1071644672
+	.long	2485417816
+	.long	1069626316
+	.long	1796544321
+	.long	3219700864
+	.long	536870912
+	.long	1015203297
+	.long	0
+	.long	1071644672
+	.long	2583490354
+	.long	1070236281
+	.long	1719614413
+	.long	3219562654
+	.long	536870912
+	.long	1015799092
+	.long	0
+	.long	1071644672
+	.long	1403757309
+	.long	3217886718
+	.long	621354454
+	.long	3219410163
+	.long	536870912
+	.long	3160934250
+	.long	0
+	.long	1072693248
+	.long	1539668340
+	.long	3217396327
+	.long	967731400
+	.long	3219244859
+	.long	536870912
+	.long	3163235805
+	.long	0
+	.long	1072693248
+	.long	1945768569
+	.long	3216915048
+	.long	939980347
+	.long	3219008349
+	.long	536870912
+	.long	3160280457
+	.long	0
+	.long	1072693248
+	.long	2255197647
+	.long	3216211105
+	.long	2796464483
+	.long	3218636258
+	.long	3758096384
+	.long	1013394669
+	.long	0
+	.long	1072693248
+	.long	2476548698
+	.long	3215330282
+	.long	785751814
+	.long	3218248710
+	.long	2684354560
+	.long	1014354573
+	.long	0
+	.long	1072693248
+	.long	18115067
+	.long	3214126342
+	.long	1013556747
+	.long	3217619128
+	.long	3221225472
+	.long	1013083417
+	.long	0
+	.long	1072693248
+	.long	393047345
+	.long	3212032302
+	.long	3156849708
+	.long	3216578470
+	.long	3758096384
+	.long	1010706200
+	.long	0
+	.long	1072693248
+	.type	Ctable,@object
+	.size	Ctable,2048
+	.align 16
+SC_2:
+	.long	286331153
+	.long	1065423121
+	.long	1431655765
+	.long	1067799893
+	.type	SC_2,@object
+	.size	SC_2,16
+	.align 16
+SC_3:
+	.long	436314138
+	.long	3207201184
+	.long	381774871
+	.long	3210133868
+	.type	SC_3,@object
+	.size	SC_3,16
+	.align 16
+SC_1:
+	.long	1431655765
+	.long	3217380693
+	.long	0
+	.long	3219128320
+	.type	SC_1,@object
+	.size	SC_1,16
+	.align 16
+PI_INV_TABLE:
+	.long	0
+	.long	0
+	.long	2734261102
+	.long	1313084713
+	.long	4230436817
+	.long	4113882560
+	.long	3680671129
+	.long	1011060801
+	.long	4266746795
+	.long	3736847713
+	.long	3072618042
+	.long	1112396512
+	.long	105459434
+	.long	164729372
+	.long	4263373596
+	.long	2972297022
+	.long	3900847605
+	.long	784024708
+	.long	3919343654
+	.long	3026157121
+	.long	965858873
+	.long	2203269620
+	.long	2625920907
+	.long	3187222587
+	.long	536385535
+	.long	3724908559
+	.long	4012839307
+	.long	1510632735
+	.long	1832287951
+	.long	667617719
+	.long	1330003814
+	.long	2657085997
+	.long	1965537991
+	.long	3957715323
+	.long	1023883767
+	.long	2320667370
+	.long	1811636145
+	.long	529358088
+	.long	1443049542
+	.long	4235946923
+	.long	4040145953
+	.type	PI_INV_TABLE,@object
+	.size	PI_INV_TABLE,164
+	.space 12, 0x00 	# pad
+	.align 16
+PI_4:
+	.long	1073741824
+	.long	1072243195
+	.long	407279769
+	.long	1046758445
+	.type	PI_4,@object
+	.size	PI_4,16
+	.align 8
+PI32INV:
+	.long	1841940611
+	.long	1076125488
+	.type	PI32INV,@object
+	.size	PI32INV,8
+	.align 8
+SHIFTER:
+	.long	0
+	.long	1127743488
+	.type	SHIFTER,@object
+	.size	SHIFTER,8
+	.align 8
+SIGN_MASK:
+	.long	0
+	.long	2147483648
+	.type	SIGN_MASK,@object
+	.size	SIGN_MASK,8
+	.align 8
+P_3:
+	.long	771977331
+	.long	996350346
+	.type	P_3,@object
+	.size	P_3,8
+	.align 8
+ALL_ONES:
+	.long	4294967295
+	.long	1072693247
+	.type	ALL_ONES,@object
+	.size	ALL_ONES,8
+	.align 8
+TWO_POW_55:
+	.long	0
+	.long	1130364928
+	.type	TWO_POW_55,@object
+	.size	TWO_POW_55,8
+	.align 8
+TWO_POW_M55:
+	.long	0
+	.long	1015021568
+	.type	TWO_POW_M55,@object
+	.size	TWO_POW_M55,8
+	.align 8
+P_1:
+	.long	1413480448
+	.long	1069097467
+	.type	P_1,@object
+	.size	P_1,8
+	.align 8
+NEG_ZERO:
+	.long	0
+	.long	2147483648
+	.type	NEG_ZERO,@object
+	.size	NEG_ZERO,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000002c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_sin.1-.
+	.4byte ..___tag_value_sin.9-..___tag_value_sin.1
+	.2byte 0x0400
+	.4byte ..___tag_value_sin.3-..___tag_value_sin.1
+	.4byte 0x0283100e
+	.byte 0x04
+	.4byte ..___tag_value_sin.5-..___tag_value_sin.3
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_sin.6-..___tag_value_sin.5
+	.4byte 0x04c3100e
+	.4byte ..___tag_value_sin.8-..___tag_value_sin.6
+	.2byte 0x080e
+# End
diff --git a/libm/x86_64/s_tan.S b/libm/x86_64/s_tan.S
new file mode 100644
index 0000000..74cb044
--- /dev/null
+++ b/libm/x86_64/s_tan.S
@@ -0,0 +1,2239 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// Polynomials coefficients and other constants.
+//
+// Note that in this algorithm, there is a different polynomial for
+// each breakpoint, so there are 32 sets of polynomial coefficients
+// as well as 32 instances of the other constants.
+//
+// The polynomial coefficients and constants are offset from the start
+// of the main block as follows:
+//
+//   0:  c8 | c0
+//  16:  c9 | c1
+//  32: c10 | c2
+//  48: c11 | c3
+//  64: c12 | c4
+//  80: c13 | c5
+//  96: c14 | c6
+// 112: c15 | c7
+// 128: T_hi
+// 136: T_lo
+// 144: Sigma
+// 152: T_hl
+// 160: Tau
+// 168: Mask
+// 176: (end of block)
+//
+// The total table size is therefore 5632 bytes.
+//
+// Note that c0 and c1 are always zero. We could try storing
+// other constants here, and just loading the low part of the
+// SIMD register in these cases, after ensuring the high part
+// is zero.
+//
+// The higher terms of the polynomial are computed in the *low*
+// part of the SIMD register. This is so we can overlap the
+// multiplication by r^8 and the unpacking of the other part.
+//
+// The constants are:
+// T_hi + T_lo = accurate constant term in power series
+// Sigma + T_hl = accurate coefficient of r in power series (Sigma=1 bit)
+// Tau = multiplier for the reciprocal, always -1 or 0
+//
+// The basic reconstruction formula using these constants is:
+//
+// High = tau * recip_hi + t_hi
+// Med = (sgn * r + t_hl * r)_hi
+// Low = (sgn * r + t_hl * r)_lo +
+//       tau * recip_lo + T_lo + (T_hl + sigma) * c + pol
+//
+// where pol = c0 + c1 * r + c2 * r^2 + ... + c15 * r^15
+//
+// (c0 = c1 = 0, but using them keeps SIMD regularity)
+//
+// We then do a compensated sum High + Med, add the low parts together
+// and then do the final sum.
+//
+// Here recip_hi + recip_lo is an accurate reciprocal of the remainder
+// modulo pi/2
+//
+// Special cases:
+//  tan(NaN) = quiet NaN, and raise invalid exception
+//  tan(INF) = NaN and raise invalid exception
+//  tan(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  tan
+ENTRY(tan)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_tan.1:
+        pushq     %rbx
+..___tag_value_tan.3:
+        subq      $16, %rsp
+..___tag_value_tan.5:
+        movsd     %xmm0, 8(%rsp)
+..B1.2:
+        pextrw    $3, %xmm0, %eax
+        andl      $32767, %eax
+        subl      $16314, %eax
+        cmpl      $270, %eax
+        ja        .L_2TAG_PACKET_0.0.1
+        movapd    ONEHALF(%rip), %xmm5
+        movapd    MUL16(%rip), %xmm6
+        unpcklpd  %xmm0, %xmm0
+        movapd    sign_mask(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        movapd    PI32INV(%rip), %xmm1
+        mulpd     %xmm0, %xmm1
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        movapd    %xmm1, %xmm7
+        unpckhpd  %xmm7, %xmm7
+        cvttsd2si %xmm7, %edx
+        cvttpd2dq %xmm1, %xmm1
+        cvtdq2pd  %xmm1, %xmm1
+        mulpd     %xmm6, %xmm1
+        movapd    P_1(%rip), %xmm3
+        movq      QQ_2(%rip), %xmm5
+        addq      $469248, %rdx
+        movapd    P_2(%rip), %xmm4
+        mulpd     %xmm1, %xmm3
+        andq      $31, %rdx
+        mulsd     %xmm1, %xmm5
+        movq      %rdx, %rcx
+        mulpd     %xmm1, %xmm4
+        shlq      $1, %rcx
+        subpd     %xmm3, %xmm0
+        mulpd     P_3(%rip), %xmm1
+        addq      %rcx, %rdx
+        shlq      $2, %rcx
+        addq      %rcx, %rdx
+        addsd     %xmm0, %xmm5
+        movapd    %xmm0, %xmm2
+        subpd     %xmm4, %xmm0
+        movq      ONE(%rip), %xmm6
+        shlq      $4, %rdx
+        lea       Ctable(%rip), %rax
+        andpd     MASK_35(%rip), %xmm5
+        movapd    %xmm0, %xmm3
+        addq      %rdx, %rax
+        subpd     %xmm0, %xmm2
+        unpckhpd  %xmm0, %xmm0
+        divsd     %xmm5, %xmm6
+        subpd     %xmm4, %xmm2
+        movapd    16(%rax), %xmm7
+        subsd     %xmm5, %xmm3
+        mulpd     %xmm0, %xmm7
+        subpd     %xmm1, %xmm2
+        movapd    48(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        movapd    96(%rax), %xmm4
+        mulpd     %xmm0, %xmm4
+        addsd     %xmm3, %xmm2
+        movapd    %xmm0, %xmm3
+        mulpd     %xmm0, %xmm0
+        addpd     (%rax), %xmm7
+        addpd     32(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     80(%rax), %xmm4
+        addpd     %xmm1, %xmm7
+        movapd    112(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm0
+        addpd     %xmm1, %xmm4
+        movapd    64(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm1, %xmm7
+        movapd    %xmm3, %xmm1
+        mulpd     %xmm0, %xmm3
+        mulsd     %xmm0, %xmm0
+        mulpd     144(%rax), %xmm1
+        mulpd     %xmm3, %xmm4
+        movq      %xmm1, %xmm3
+        addpd     %xmm4, %xmm7
+        movq      %xmm1, %xmm4
+        mulsd     %xmm7, %xmm0
+        unpckhpd  %xmm7, %xmm7
+        addsd     %xmm7, %xmm0
+        unpckhpd  %xmm1, %xmm1
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        movq      %xmm2, %xmm4
+        movq      144(%rax), %xmm7
+        unpckhpd  %xmm2, %xmm2
+        addsd     152(%rax), %xmm7
+        mulsd     %xmm2, %xmm7
+        addsd     136(%rax), %xmm7
+        addsd     %xmm1, %xmm7
+        addsd     %xmm7, %xmm0
+        movq      ONE(%rip), %xmm7
+        mulsd     %xmm6, %xmm4
+        movq      168(%rax), %xmm2
+        andpd     %xmm6, %xmm2
+        mulsd     %xmm2, %xmm5
+        mulsd     160(%rax), %xmm6
+        subsd     %xmm5, %xmm7
+        subsd     128(%rax), %xmm2
+        subsd     %xmm4, %xmm7
+        mulsd     %xmm6, %xmm7
+        movq      %xmm3, %xmm4
+        subsd     %xmm2, %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm0
+        subsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_0.0.1:
+        jg        .L_2TAG_PACKET_1.0.1
+        pextrw    $3, %xmm0, %eax
+        movl      %eax, %edx
+        andl      $32752, %eax
+        je        .L_2TAG_PACKET_2.0.1
+        andl      $32767, %edx
+        cmpl      $15904, %edx
+        jb        .L_2TAG_PACKET_3.0.1
+        movq      %xmm0, %xmm2
+        movq      %xmm0, %xmm3
+        movq      Q_11(%rip), %xmm1
+        mulsd     %xmm0, %xmm2
+        mulsd     %xmm2, %xmm3
+        mulsd     %xmm2, %xmm1
+        addsd     Q_9(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     Q_7(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     Q_5(%rip), %xmm1
+        mulsd     %xmm2, %xmm1
+        addsd     Q_3(%rip), %xmm1
+        mulsd     %xmm3, %xmm1
+        addsd     %xmm1, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_3.0.1:
+        movq      TWO_POW_55(%rip), %xmm3
+        mulsd     %xmm0, %xmm3
+        addsd     %xmm3, %xmm0
+        mulsd     TWO_POW_M55(%rip), %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_2.0.1:
+        movq      %xmm0, %xmm1
+        mulsd     %xmm1, %xmm1
+        jmp       ..B1.4
+.L_2TAG_PACKET_1.0.1:
+        pextrw    $3, %xmm0, %eax
+        andl      $32752, %eax
+        cmpl      $32752, %eax
+        je        .L_2TAG_PACKET_4.0.1
+        pextrw    $3, %xmm0, %ecx
+        andl      $32752, %ecx
+        subl      $16224, %ecx
+        shrl      $7, %ecx
+        andl      $65532, %ecx
+        lea       PI_INV_TABLE(%rip), %r11
+        addq      %r11, %rcx
+        movd      %xmm0, %rax
+        movl      20(%rcx), %r10d
+        movl      24(%rcx), %r8d
+        movl      %eax, %edx
+        shrq      $21, %rax
+        orl       $-2147483648, %eax
+        shrl      $11, %eax
+        movl      %r10d, %r9d
+        imulq     %rdx, %r10
+        imulq     %rax, %r9
+        imulq     %rax, %r8
+        movl      16(%rcx), %esi
+        movl      12(%rcx), %edi
+        movl      %r10d, %r11d
+        shrq      $32, %r10
+        addq      %r10, %r9
+        addq      %r8, %r11
+        movl      %r11d, %r8d
+        shrq      $32, %r11
+        addq      %r11, %r9
+        movl      %esi, %r10d
+        imulq     %rdx, %rsi
+        imulq     %rax, %r10
+        movl      %edi, %r11d
+        imulq     %rdx, %rdi
+        movl      %esi, %ebx
+        shrq      $32, %rsi
+        addq      %rbx, %r9
+        movl      %r9d, %ebx
+        shrq      $32, %r9
+        addq      %rsi, %r10
+        addq      %r9, %r10
+        shlq      $32, %rbx
+        orq       %rbx, %r8
+        imulq     %rax, %r11
+        movl      8(%rcx), %r9d
+        movl      4(%rcx), %esi
+        movl      %edi, %ebx
+        shrq      $32, %rdi
+        addq      %rbx, %r10
+        movl      %r10d, %ebx
+        shrq      $32, %r10
+        addq      %rdi, %r11
+        addq      %r10, %r11
+        movq      %r9, %rdi
+        imulq     %rdx, %r9
+        imulq     %rax, %rdi
+        movl      %r9d, %r10d
+        shrq      $32, %r9
+        addq      %r10, %r11
+        movl      %r11d, %r10d
+        shrq      $32, %r11
+        addq      %r9, %rdi
+        addq      %r11, %rdi
+        movq      %rsi, %r9
+        imulq     %rdx, %rsi
+        imulq     %rax, %r9
+        shlq      $32, %r10
+        orq       %rbx, %r10
+        movl      (%rcx), %eax
+        movl      %esi, %r11d
+        shrq      $32, %rsi
+        addq      %r11, %rdi
+        movl      %edi, %r11d
+        shrq      $32, %rdi
+        addq      %rsi, %r9
+        addq      %rdi, %r9
+        imulq     %rax, %rdx
+        pextrw    $3, %xmm0, %ebx
+        lea       PI_INV_TABLE(%rip), %rdi
+        subq      %rdi, %rcx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      %ecx, %ecx
+        addl      $19, %ecx
+        movl      $32768, %esi
+        andl      %ebx, %esi
+        shrl      $4, %ebx
+        andl      $2047, %ebx
+        subl      $1023, %ebx
+        subl      %ebx, %ecx
+        addq      %rdx, %r9
+        movl      %ecx, %edx
+        addl      $32, %edx
+        cmpl      $0, %ecx
+        jl        .L_2TAG_PACKET_5.0.1
+        negl      %ecx
+        addl      $29, %ecx
+        shll      %cl, %r9d
+        movl      %r9d, %edi
+        andl      $1073741823, %r9d
+        testl     $536870912, %r9d
+        jne       .L_2TAG_PACKET_6.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+.L_2TAG_PACKET_7.0.1:
+.L_2TAG_PACKET_8.0.1:
+        cmpq      $0, %r9
+        je        .L_2TAG_PACKET_9.0.1
+.L_2TAG_PACKET_10.0.1:
+        bsr       %r9, %r11
+        movl      $29, %ecx
+        subl      %r11d, %ecx
+        jle       .L_2TAG_PACKET_11.0.1
+        shlq      %cl, %r9
+        movq      %r10, %rax
+        shlq      %cl, %r10
+        addl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shrq      %cl, %rax
+        shrq      %cl, %r8
+        orq       %rax, %r9
+        orq       %r8, %r10
+.L_2TAG_PACKET_12.0.1:
+        cvtsi2sdq %r9, %xmm0
+        shrq      $1, %r10
+        cvtsi2sdq %r10, %xmm3
+        xorpd     %xmm4, %xmm4
+        shll      $4, %edx
+        negl      %edx
+        addl      $16368, %edx
+        orl       %esi, %edx
+        xorl      %ebx, %edx
+        pinsrw    $3, %edx, %xmm4
+        movq      PI_4(%rip), %xmm2
+        movq      8+PI_4(%rip), %xmm7
+        xorpd     %xmm5, %xmm5
+        subl      $1008, %edx
+        pinsrw    $3, %edx, %xmm5
+        mulsd     %xmm4, %xmm0
+        shll      $16, %esi
+        sarl      $31, %esi
+        mulsd     %xmm5, %xmm3
+        movq      %xmm0, %xmm1
+        mulsd     %xmm2, %xmm0
+        shrl      $30, %edi
+        addsd     %xmm3, %xmm1
+        mulsd     %xmm2, %xmm3
+        addl      %esi, %edi
+        xorl      %esi, %edi
+        mulsd     %xmm1, %xmm7
+        movl      %edi, %eax
+        addsd     %xmm3, %xmm7
+        movq      %xmm0, %xmm2
+        addsd     %xmm7, %xmm0
+        subsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm7
+        movapd    PI32INV(%rip), %xmm1
+        movddup   %xmm0, %xmm0
+        movapd    sign_mask(%rip), %xmm4
+        andpd     %xmm0, %xmm4
+        mulpd     %xmm0, %xmm1
+        movddup   %xmm7, %xmm7
+        movapd    ONEHALF(%rip), %xmm5
+        movapd    MUL16(%rip), %xmm6
+        orps      %xmm4, %xmm5
+        addpd     %xmm5, %xmm1
+        movapd    %xmm1, %xmm5
+        unpckhpd  %xmm5, %xmm5
+        cvttsd2si %xmm5, %edx
+        cvttpd2dq %xmm1, %xmm1
+        cvtdq2pd  %xmm1, %xmm1
+        mulpd     %xmm6, %xmm1
+        movapd    P_1(%rip), %xmm3
+        movq      QQ_2(%rip), %xmm5
+        shll      $4, %eax
+        addl      $469248, %edx
+        movapd    P_2(%rip), %xmm4
+        mulpd     %xmm1, %xmm3
+        addl      %eax, %edx
+        andl      $31, %edx
+        mulsd     %xmm1, %xmm5
+        movl      %edx, %ecx
+        mulpd     %xmm1, %xmm4
+        shll      $1, %ecx
+        subpd     %xmm3, %xmm0
+        mulpd     P_3(%rip), %xmm1
+        addl      %ecx, %edx
+        shll      $2, %ecx
+        addl      %ecx, %edx
+        addsd     %xmm0, %xmm5
+        movapd    %xmm0, %xmm2
+        subpd     %xmm4, %xmm0
+        movq      ONE(%rip), %xmm6
+        shll      $4, %edx
+        lea       Ctable(%rip), %rax
+        andpd     MASK_35(%rip), %xmm5
+        movapd    %xmm0, %xmm3
+        addq      %rdx, %rax
+        subpd     %xmm0, %xmm2
+        unpckhpd  %xmm0, %xmm0
+        divsd     %xmm5, %xmm6
+        subpd     %xmm4, %xmm2
+        subsd     %xmm5, %xmm3
+        subpd     %xmm1, %xmm2
+        movapd    48(%rax), %xmm1
+        addpd     %xmm7, %xmm2
+        movapd    16(%rax), %xmm7
+        mulpd     %xmm0, %xmm7
+        movapd    96(%rax), %xmm4
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm4
+        addsd     %xmm3, %xmm2
+        movapd    %xmm0, %xmm3
+        mulpd     %xmm0, %xmm0
+        addpd     (%rax), %xmm7
+        addpd     32(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     80(%rax), %xmm4
+        addpd     %xmm1, %xmm7
+        movapd    112(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        mulpd     %xmm0, %xmm0
+        addpd     %xmm1, %xmm4
+        movapd    64(%rax), %xmm1
+        mulpd     %xmm0, %xmm1
+        addpd     %xmm1, %xmm7
+        movapd    %xmm3, %xmm1
+        mulpd     %xmm0, %xmm3
+        mulsd     %xmm0, %xmm0
+        mulpd     144(%rax), %xmm1
+        mulpd     %xmm3, %xmm4
+        movq      %xmm1, %xmm3
+        addpd     %xmm4, %xmm7
+        movq      %xmm1, %xmm4
+        mulsd     %xmm7, %xmm0
+        unpckhpd  %xmm7, %xmm7
+        addsd     %xmm7, %xmm0
+        unpckhpd  %xmm1, %xmm1
+        addsd     %xmm1, %xmm3
+        subsd     %xmm3, %xmm4
+        addsd     %xmm4, %xmm1
+        movq      %xmm2, %xmm4
+        movq      144(%rax), %xmm7
+        unpckhpd  %xmm2, %xmm2
+        addsd     152(%rax), %xmm7
+        mulsd     %xmm2, %xmm7
+        addsd     136(%rax), %xmm7
+        addsd     %xmm1, %xmm7
+        addsd     %xmm7, %xmm0
+        movq      ONE(%rip), %xmm7
+        mulsd     %xmm6, %xmm4
+        movq      168(%rax), %xmm2
+        andpd     %xmm6, %xmm2
+        mulsd     %xmm2, %xmm5
+        mulsd     160(%rax), %xmm6
+        subsd     %xmm5, %xmm7
+        subsd     128(%rax), %xmm2
+        subsd     %xmm4, %xmm7
+        mulsd     %xmm6, %xmm7
+        movq      %xmm3, %xmm4
+        subsd     %xmm2, %xmm3
+        addsd     %xmm3, %xmm2
+        subsd     %xmm2, %xmm4
+        addsd     %xmm4, %xmm0
+        subsd     %xmm7, %xmm0
+        addsd     %xmm3, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_9.0.1:
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        movq      $0, %r8
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_10.0.1
+        addl      $64, %edx
+        movq      %r10, %r9
+        movq      %r8, %r10
+        cmpq      $0, %r9
+        jne       .L_2TAG_PACKET_10.0.1
+        jmp       .L_2TAG_PACKET_12.0.1
+.L_2TAG_PACKET_11.0.1:
+        je        .L_2TAG_PACKET_12.0.1
+        negl      %ecx
+        shrq      %cl, %r10
+        movq      %r9, %rax
+        shrq      %cl, %r9
+        subl      %ecx, %edx
+        negl      %ecx
+        addl      $64, %ecx
+        shlq      %cl, %rax
+        orq       %rax, %r10
+        jmp       .L_2TAG_PACKET_12.0.1
+.L_2TAG_PACKET_5.0.1:
+        notl      %ecx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      %cl, %r9
+        movq      %r9, %rdi
+        testl     $-2147483648, %r9d
+        jne       .L_2TAG_PACKET_13.0.1
+        shrl      %cl, %r9d
+        movl      $0, %ebx
+        shrq      $2, %rdi
+        jmp       .L_2TAG_PACKET_8.0.1
+.L_2TAG_PACKET_6.0.1:
+        shrl      %cl, %r9d
+        movl      $1073741824, %ebx
+        shrl      %cl, %ebx
+        shlq      $32, %r9
+        orq       %r11, %r9
+        shlq      $32, %rbx
+        addl      $1073741824, %edi
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        jmp       .L_2TAG_PACKET_7.0.1
+.L_2TAG_PACKET_13.0.1:
+        shrl      %cl, %r9d
+        movq      $0x100000000, %rbx
+        shrq      %cl, %rbx
+        movq      $0, %rcx
+        movq      $0, %r11
+        subq      %r8, %rcx
+        sbbq      %r10, %r11
+        sbbq      %r9, %rbx
+        movq      %rcx, %r8
+        movq      %r11, %r10
+        movq      %rbx, %r9
+        movl      $32768, %ebx
+        shrq      $2, %rdi
+        addl      $1073741824, %edi
+        jmp       .L_2TAG_PACKET_8.0.1
+.L_2TAG_PACKET_4.0.1:
+        movq      8(%rsp), %xmm0
+        mulsd     NEG_ZERO(%rip), %xmm0
+        movq      %xmm0, (%rsp)
+.L_2TAG_PACKET_14.0.1:
+..B1.4:
+        addq      $16, %rsp
+..___tag_value_tan.6:
+        popq      %rbx
+..___tag_value_tan.8:
+        ret       
+..___tag_value_tan.9:
+END(tan)
+# -- End  tan
+	.section .rodata, "a"
+	.align 16
+	.align 16
+ONEHALF:
+	.long	0
+	.long	1071644672
+	.long	0
+	.long	1071644672
+	.type	ONEHALF,@object
+	.size	ONEHALF,16
+	.align 16
+MUL16:
+	.long	0
+	.long	1076887552
+	.long	0
+	.long	1072693248
+	.type	MUL16,@object
+	.size	MUL16,16
+	.align 16
+sign_mask:
+	.long	0
+	.long	2147483648
+	.long	0
+	.long	2147483648
+	.type	sign_mask,@object
+	.size	sign_mask,16
+	.align 16
+PI32INV:
+	.long	1841940611
+	.long	1071931184
+	.long	1841940611
+	.long	1076125488
+	.type	PI32INV,@object
+	.size	PI32INV,16
+	.align 16
+P_1:
+	.long	1413758976
+	.long	1069097467
+	.long	1413742592
+	.long	1069097467
+	.type	P_1,@object
+	.size	P_1,16
+	.align 16
+P_2:
+	.long	1734819840
+	.long	3174229945
+	.long	1280049152
+	.long	1028033571
+	.type	P_2,@object
+	.size	P_2,16
+	.align 16
+P_3:
+	.long	923219018
+	.long	984130272
+	.long	57701189
+	.long	988383790
+	.type	P_3,@object
+	.size	P_3,16
+	.align 16
+Ctable:
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1066820852
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1441186365
+	.long	1065494243
+	.long	1431655765
+	.long	1070945621
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	236289504
+	.long	1064135997
+	.long	286331153
+	.long	1069617425
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1160476131
+	.long	1062722102
+	.long	463583772
+	.long	1068212666
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1313038235
+	.long	1066745731
+	.long	0
+	.long	0
+	.long	1013878342
+	.long	1067152618
+	.long	0
+	.long	0
+	.long	3663426833
+	.long	1065725283
+	.long	3693284251
+	.long	1069118808
+	.long	650852232
+	.long	1065882376
+	.long	1996245381
+	.long	1071000265
+	.long	2008746170
+	.long	1064664197
+	.long	3055842593
+	.long	1068578846
+	.long	1495406348
+	.long	1064652437
+	.long	2269530157
+	.long	1069711235
+	.long	285563696
+	.long	1063576465
+	.long	1046897440
+	.long	1067705865
+	.long	233429731
+	.long	1063453151
+	.long	522045958
+	.long	1068476590
+	.long	2354785698
+	.long	1069102779
+	.long	1317599141
+	.long	1012432133
+	.long	0
+	.long	1072693248
+	.long	2828230105
+	.long	1065606626
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1512545955
+	.long	1068119047
+	.long	0
+	.long	0
+	.long	1127048698
+	.long	1067909459
+	.long	0
+	.long	0
+	.long	2300200450
+	.long	1067254767
+	.long	3593250296
+	.long	1070233561
+	.long	3009365544
+	.long	1066902117
+	.long	1127373050
+	.long	1071173457
+	.long	3046103305
+	.long	1066371299
+	.long	24583402
+	.long	1069723988
+	.long	4082511758
+	.long	1065914199
+	.long	3223889699
+	.long	1070020367
+	.long	548927984
+	.long	1065415756
+	.long	558065897
+	.long	1068949418
+	.long	680073315
+	.long	1064940726
+	.long	388873200
+	.long	1068944270
+	.long	3763679576
+	.long	1070167541
+	.long	1497360404
+	.long	1009710547
+	.long	0
+	.long	1072693248
+	.long	64931152
+	.long	1067729411
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2467582782
+	.long	1069256389
+	.long	0
+	.long	0
+	.long	162150096
+	.long	1068946420
+	.long	0
+	.long	0
+	.long	3702794237
+	.long	1068579152
+	.long	3631919291
+	.long	1070936926
+	.long	3456821413
+	.long	1068217218
+	.long	2031366438
+	.long	1071495745
+	.long	1596664020
+	.long	1067799281
+	.long	1509038701
+	.long	1070601643
+	.long	583171477
+	.long	1067510148
+	.long	3785344682
+	.long	1070618476
+	.long	2402036048
+	.long	1067075736
+	.long	3233018412
+	.long	1069913186
+	.long	411280568
+	.long	1066710556
+	.long	1065584192
+	.long	1069747896
+	.long	895247324
+	.long	1070819848
+	.long	500078909
+	.long	3161288781
+	.long	0
+	.long	1072693248
+	.long	729983843
+	.long	1068994194
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1458794562
+	.long	1070398550
+	.long	0
+	.long	0
+	.long	2857777489
+	.long	1070137637
+	.long	0
+	.long	0
+	.long	1024359517
+	.long	1069876531
+	.long	2616040238
+	.long	1071582937
+	.long	1609024636
+	.long	1069675088
+	.long	2529240549
+	.long	1071836633
+	.long	1510128600
+	.long	1069440113
+	.long	2251697184
+	.long	1071253687
+	.long	1262761453
+	.long	1069142850
+	.long	1263091857
+	.long	1071190461
+	.long	3043383486
+	.long	1068885191
+	.long	2476932470
+	.long	1070842002
+	.long	3659995028
+	.long	1068669200
+	.long	855891755
+	.long	1070696894
+	.long	2583490354
+	.long	1071284857
+	.long	3062633575
+	.long	1014008623
+	.long	0
+	.long	1072693248
+	.long	2550940471
+	.long	1069938201
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3422807297
+	.long	1071640847
+	.long	0
+	.long	0
+	.long	1151658053
+	.long	1071494715
+	.long	0
+	.long	0
+	.long	929607071
+	.long	1071346340
+	.long	1037049034
+	.long	1072037305
+	.long	2786928657
+	.long	1071215282
+	.long	1447406859
+	.long	1072265209
+	.long	3490952107
+	.long	1071090851
+	.long	3205232916
+	.long	1071968658
+	.long	1297344304
+	.long	1070977120
+	.long	1066110976
+	.long	1071946035
+	.long	3803721480
+	.long	1070871082
+	.long	1496754229
+	.long	1071807201
+	.long	2982550683
+	.long	1070773243
+	.long	4014441989
+	.long	1071736222
+	.long	419968236
+	.long	1071717047
+	.long	3451266538
+	.long	3163444811
+	.long	0
+	.long	1072693248
+	.long	2960267235
+	.long	1070745841
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	724322768
+	.long	1072881308
+	.long	0
+	.long	0
+	.long	643153048
+	.long	1072905816
+	.long	0
+	.long	0
+	.long	4285079458
+	.long	1072928558
+	.long	3912524733
+	.long	1072622983
+	.long	118362272
+	.long	1072952754
+	.long	4107767972
+	.long	1072827408
+	.long	2689502883
+	.long	1072976922
+	.long	946523347
+	.long	1072772766
+	.long	573204189
+	.long	1073001761
+	.long	581531518
+	.long	1072826391
+	.long	1386236526
+	.long	1073026959
+	.long	3718905905
+	.long	1072832823
+	.long	1145558140
+	.long	1073052673
+	.long	513572637
+	.long	1072861969
+	.long	716700048
+	.long	1071997368
+	.long	547126769
+	.long	1015523525
+	.long	0
+	.long	1072693248
+	.long	1097907398
+	.long	1071420120
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3349892442
+	.long	1074290212
+	.long	0
+	.long	0
+	.long	3913197405
+	.long	1074501181
+	.long	0
+	.long	0
+	.long	2494034522
+	.long	1074739170
+	.long	1264738763
+	.long	1073084804
+	.long	1520293906
+	.long	1074899632
+	.long	1958936600
+	.long	1073411493
+	.long	2133649635
+	.long	1075052171
+	.long	4270740730
+	.long	1073574708
+	.long	1728930189
+	.long	1075224844
+	.long	1303998552
+	.long	1073799186
+	.long	618611933
+	.long	1075420255
+	.long	1769828046
+	.long	1073938542
+	.long	2200537986
+	.long	1075641421
+	.long	433361110
+	.long	1074105369
+	.long	719595600
+	.long	1072317184
+	.long	294527206
+	.long	3162140088
+	.long	0
+	.long	1073741824
+	.long	3811788216
+	.long	3218400550
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1704352102
+	.long	1075943001
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1076258036
+	.long	0
+	.long	0
+	.long	2211264291
+	.long	1076659010
+	.long	0
+	.long	1073741824
+	.long	1441186365
+	.long	1077028579
+	.long	1431655765
+	.long	1074091349
+	.long	876943673
+	.long	1077353622
+	.long	2863311531
+	.long	1074440874
+	.long	236289504
+	.long	1077767485
+	.long	286331153
+	.long	1074860305
+	.long	2805473311
+	.long	1078115278
+	.long	95443718
+	.long	1075163227
+	.long	1160476131
+	.long	1078450742
+	.long	463583772
+	.long	1075552698
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	0
+	.long	1073741824
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1330165971
+	.long	3207850745
+	.long	0
+	.long	0
+	.long	217536623
+	.long	1059109098
+	.long	0
+	.long	0
+	.long	3492120849
+	.long	3205151475
+	.long	602185705
+	.long	3215678092
+	.long	760422958
+	.long	1056312597
+	.long	555127889
+	.long	1067545266
+	.long	3139784124
+	.long	3202470837
+	.long	3690544014
+	.long	3213150171
+	.long	95707915
+	.long	1053635428
+	.long	4003114407
+	.long	1064581412
+	.long	2034926231
+	.long	3199711161
+	.long	3759536023
+	.long	3210559989
+	.long	3826928214
+	.long	1050893819
+	.long	3837960785
+	.long	1061790379
+	.long	1526325248
+	.long	3217967566
+	.long	2356426521
+	.long	1025423456
+	.long	0
+	.long	0
+	.long	457728975
+	.long	1071088276
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1398462608
+	.long	3207303968
+	.long	0
+	.long	0
+	.long	26205983
+	.long	1058461213
+	.long	0
+	.long	0
+	.long	56226238
+	.long	3204528612
+	.long	2754706541
+	.long	3215359511
+	.long	2187799823
+	.long	1055634437
+	.long	790323742
+	.long	1067402587
+	.long	1372385848
+	.long	3201651479
+	.long	4097292716
+	.long	3212856302
+	.long	3348210357
+	.long	1052830099
+	.long	2442796466
+	.long	1064337602
+	.long	862608142
+	.long	3198830754
+	.long	170296152
+	.long	3210060867
+	.long	3755571428
+	.long	1049933343
+	.long	3614866008
+	.long	1061361670
+	.long	719978496
+	.long	3217669096
+	.long	1998842465
+	.long	3174703977
+	.long	0
+	.long	0
+	.long	3749156607
+	.long	1071048258
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3120498638
+	.long	3206749304
+	.long	0
+	.long	0
+	.long	2773578114
+	.long	1058009312
+	.long	0
+	.long	0
+	.long	2030783676
+	.long	3203817873
+	.long	2223654598
+	.long	3215071936
+	.long	2976134650
+	.long	1054987244
+	.long	706390066
+	.long	1067217386
+	.long	4258437615
+	.long	3200900378
+	.long	1066252975
+	.long	3212391267
+	.long	815777514
+	.long	1051989462
+	.long	3202745457
+	.long	1064010682
+	.long	2493556375
+	.long	3198004753
+	.long	1046243251
+	.long	3209678971
+	.long	2593078846
+	.long	1049017717
+	.long	2763962276
+	.long	1060970161
+	.long	701480960
+	.long	3217377742
+	.long	3205862232
+	.long	3174660915
+	.long	0
+	.long	0
+	.long	2267016812
+	.long	1071015664
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	2107155798
+	.long	3206166872
+	.long	0
+	.long	0
+	.long	2642992129
+	.long	1057424578
+	.long	0
+	.long	0
+	.long	1936992811
+	.long	3203204426
+	.long	1485063559
+	.long	3214682643
+	.long	1432914553
+	.long	1054319398
+	.long	3996381654
+	.long	1067075828
+	.long	2833029256
+	.long	3200223545
+	.long	2866066872
+	.long	3211982662
+	.long	2432888737
+	.long	1051234178
+	.long	3669764559
+	.long	1063748136
+	.long	2458496952
+	.long	3197170774
+	.long	1948234989
+	.long	3209098147
+	.long	2843698787
+	.long	1048163519
+	.long	3398041407
+	.long	1060559728
+	.long	2829230080
+	.long	3217092115
+	.long	1034046433
+	.long	3174271903
+	.long	0
+	.long	0
+	.long	298675305
+	.long	1070989821
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	437603223
+	.long	3205589761
+	.long	0
+	.long	0
+	.long	759330352
+	.long	1057048511
+	.long	0
+	.long	0
+	.long	3107463368
+	.long	3202507988
+	.long	3144465176
+	.long	3214191500
+	.long	2290961810
+	.long	1053841035
+	.long	1618153340
+	.long	1066971547
+	.long	3836869393
+	.long	3199400272
+	.long	584032116
+	.long	3211469261
+	.long	1245704358
+	.long	1050626462
+	.long	4247487438
+	.long	1063561943
+	.long	1669034927
+	.long	3196274812
+	.long	3844233498
+	.long	3208626322
+	.long	2706958524
+	.long	1047411374
+	.long	3857199098
+	.long	1060281647
+	.long	3593904128
+	.long	3216590719
+	.long	3267547836
+	.long	3172163321
+	.long	0
+	.long	0
+	.long	4076712227
+	.long	1070970214
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3290090340
+	.long	3204793485
+	.long	0
+	.long	0
+	.long	3685760367
+	.long	1056668370
+	.long	0
+	.long	0
+	.long	2655163949
+	.long	3201674917
+	.long	628750575
+	.long	3213566872
+	.long	680140505
+	.long	1053299777
+	.long	2954464709
+	.long	1066900026
+	.long	803201619
+	.long	3198516435
+	.long	1466315631
+	.long	3210837162
+	.long	1611220163
+	.long	1049972438
+	.long	2766187256
+	.long	1063437894
+	.long	1804579484
+	.long	3195331491
+	.long	3695969289
+	.long	3207854418
+	.long	2617238373
+	.long	1046675948
+	.long	3095830084
+	.long	1060095334
+	.long	3789570048
+	.long	3216034914
+	.long	23826559
+	.long	3172048060
+	.long	0
+	.long	0
+	.long	3870939386
+	.long	1070956467
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1571758758
+	.long	3203672535
+	.long	0
+	.long	0
+	.long	113026373
+	.long	1056416381
+	.long	0
+	.long	0
+	.long	1913766298
+	.long	3200523326
+	.long	2507068734
+	.long	3212502004
+	.long	4000648818
+	.long	1053003803
+	.long	2446607349
+	.long	1066858259
+	.long	912662124
+	.long	3197333001
+	.long	1349489537
+	.long	3209765608
+	.long	3412972607
+	.long	1049641401
+	.long	1721283327
+	.long	1063366855
+	.long	1466691883
+	.long	3194116746
+	.long	3852528092
+	.long	3206760861
+	.long	285443293
+	.long	1046158380
+	.long	1758739894
+	.long	1059895449
+	.long	1858781184
+	.long	3214984212
+	.long	3447575948
+	.long	1024675855
+	.long	0
+	.long	0
+	.long	2242038011
+	.long	1070948320
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	737611454
+	.long	1056336527
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3594790527
+	.long	1052911621
+	.long	381774871
+	.long	1066844524
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3303051618
+	.long	1049456050
+	.long	3154187623
+	.long	1063343722
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	528061788
+	.long	1045944910
+	.long	2469719819
+	.long	1059831159
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1431655765
+	.long	1070945621
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1571758758
+	.long	1056188887
+	.long	0
+	.long	0
+	.long	113026373
+	.long	1056416381
+	.long	0
+	.long	0
+	.long	1913766298
+	.long	1053039678
+	.long	2507068734
+	.long	1065018356
+	.long	4000648818
+	.long	1053003803
+	.long	2446607349
+	.long	1066858259
+	.long	912662124
+	.long	1049849353
+	.long	1349489537
+	.long	1062281960
+	.long	3412972607
+	.long	1049641401
+	.long	1721283327
+	.long	1063366855
+	.long	1466691883
+	.long	1046633098
+	.long	3852528092
+	.long	1059277213
+	.long	285443293
+	.long	1046158380
+	.long	1758739894
+	.long	1059895449
+	.long	1858781184
+	.long	1067500564
+	.long	3447575948
+	.long	3172159503
+	.long	0
+	.long	0
+	.long	2242038011
+	.long	1070948320
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3290090340
+	.long	1057309837
+	.long	0
+	.long	0
+	.long	3685760367
+	.long	1056668370
+	.long	0
+	.long	0
+	.long	2655163949
+	.long	1054191269
+	.long	628750575
+	.long	1066083224
+	.long	680140505
+	.long	1053299777
+	.long	2954464709
+	.long	1066900026
+	.long	803201619
+	.long	1051032787
+	.long	1466315631
+	.long	1063353514
+	.long	1611220163
+	.long	1049972438
+	.long	2766187256
+	.long	1063437894
+	.long	1804579484
+	.long	1047847843
+	.long	3695969289
+	.long	1060370770
+	.long	2617238373
+	.long	1046675948
+	.long	3095830084
+	.long	1060095334
+	.long	3789570048
+	.long	1068551266
+	.long	23826559
+	.long	1024564412
+	.long	0
+	.long	0
+	.long	3870939386
+	.long	1070956467
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	437603223
+	.long	1058106113
+	.long	0
+	.long	0
+	.long	759330352
+	.long	1057048511
+	.long	0
+	.long	0
+	.long	3107463368
+	.long	1055024340
+	.long	3144465176
+	.long	1066707852
+	.long	2290961810
+	.long	1053841035
+	.long	1618153340
+	.long	1066971547
+	.long	3836869393
+	.long	1051916624
+	.long	584032116
+	.long	1063985613
+	.long	1245704358
+	.long	1050626462
+	.long	4247487438
+	.long	1063561943
+	.long	1669034927
+	.long	1048791164
+	.long	3844233498
+	.long	1061142674
+	.long	2706958524
+	.long	1047411374
+	.long	3857199098
+	.long	1060281647
+	.long	3593904128
+	.long	1069107071
+	.long	3267547836
+	.long	1024679673
+	.long	0
+	.long	0
+	.long	4076712227
+	.long	1070970214
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	2107155798
+	.long	1058683224
+	.long	0
+	.long	0
+	.long	2642992129
+	.long	1057424578
+	.long	0
+	.long	0
+	.long	1936992811
+	.long	1055720778
+	.long	1485063559
+	.long	1067198995
+	.long	1432914553
+	.long	1054319398
+	.long	3996381654
+	.long	1067075828
+	.long	2833029256
+	.long	1052739897
+	.long	2866066872
+	.long	1064499014
+	.long	2432888737
+	.long	1051234178
+	.long	3669764559
+	.long	1063748136
+	.long	2458496952
+	.long	1049687126
+	.long	1948234989
+	.long	1061614499
+	.long	2843698787
+	.long	1048163519
+	.long	3398041407
+	.long	1060559728
+	.long	2829230080
+	.long	1069608467
+	.long	1034046433
+	.long	1026788255
+	.long	0
+	.long	0
+	.long	298675305
+	.long	1070989821
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	3120498638
+	.long	1059265656
+	.long	0
+	.long	0
+	.long	2773578114
+	.long	1058009312
+	.long	0
+	.long	0
+	.long	2030783676
+	.long	1056334225
+	.long	2223654598
+	.long	1067588288
+	.long	2976134650
+	.long	1054987244
+	.long	706390066
+	.long	1067217386
+	.long	4258437615
+	.long	1053416730
+	.long	1066252975
+	.long	1064907619
+	.long	815777514
+	.long	1051989462
+	.long	3202745457
+	.long	1064010682
+	.long	2493556375
+	.long	1050521105
+	.long	1046243251
+	.long	1062195323
+	.long	2593078846
+	.long	1049017717
+	.long	2763962276
+	.long	1060970161
+	.long	701480960
+	.long	1069894094
+	.long	3205862232
+	.long	1027177267
+	.long	0
+	.long	0
+	.long	2267016812
+	.long	1071015664
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1398462608
+	.long	1059820320
+	.long	0
+	.long	0
+	.long	26205983
+	.long	1058461213
+	.long	0
+	.long	0
+	.long	56226238
+	.long	1057044964
+	.long	2754706541
+	.long	1067875863
+	.long	2187799823
+	.long	1055634437
+	.long	790323742
+	.long	1067402587
+	.long	1372385848
+	.long	1054167831
+	.long	4097292716
+	.long	1065372654
+	.long	3348210357
+	.long	1052830099
+	.long	2442796466
+	.long	1064337602
+	.long	862608142
+	.long	1051347106
+	.long	170296152
+	.long	1062577219
+	.long	3755571428
+	.long	1049933343
+	.long	3614866008
+	.long	1061361670
+	.long	719978496
+	.long	1070185448
+	.long	1998842465
+	.long	1027220329
+	.long	0
+	.long	0
+	.long	3749156607
+	.long	1071048258
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1330165971
+	.long	1060367097
+	.long	0
+	.long	0
+	.long	217536623
+	.long	1059109098
+	.long	0
+	.long	0
+	.long	3492120849
+	.long	1057667827
+	.long	602185705
+	.long	1068194444
+	.long	760422958
+	.long	1056312597
+	.long	555127889
+	.long	1067545266
+	.long	3139784124
+	.long	1054987189
+	.long	3690544014
+	.long	1065666523
+	.long	95707915
+	.long	1053635428
+	.long	4003114407
+	.long	1064581412
+	.long	2034926231
+	.long	1052227513
+	.long	3759536023
+	.long	1063076341
+	.long	3826928214
+	.long	1050893819
+	.long	3837960785
+	.long	1061790379
+	.long	1526325248
+	.long	1070483918
+	.long	2356426521
+	.long	3172907104
+	.long	0
+	.long	0
+	.long	457728975
+	.long	1071088276
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	4294967288
+	.long	1704352102
+	.long	3223426649
+	.long	0
+	.long	0
+	.long	2284589306
+	.long	1076258036
+	.long	0
+	.long	0
+	.long	2211264291
+	.long	3224142658
+	.long	0
+	.long	3221225472
+	.long	1441186365
+	.long	1077028579
+	.long	1431655765
+	.long	1074091349
+	.long	876943673
+	.long	3224837270
+	.long	2863311531
+	.long	3221924522
+	.long	236289504
+	.long	1077767485
+	.long	286331153
+	.long	1074860305
+	.long	2805473311
+	.long	3225598926
+	.long	95443718
+	.long	3222646875
+	.long	1160476131
+	.long	1078450742
+	.long	463583772
+	.long	1075552698
+	.long	0
+	.long	3220176896
+	.long	0
+	.long	0
+	.long	0
+	.long	1073741824
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3349892442
+	.long	3221773860
+	.long	0
+	.long	0
+	.long	3913197405
+	.long	1074501181
+	.long	0
+	.long	0
+	.long	2494034522
+	.long	3222222818
+	.long	1264738763
+	.long	3220568452
+	.long	1520293906
+	.long	1074899632
+	.long	1958936600
+	.long	1073411493
+	.long	2133649635
+	.long	3222535819
+	.long	4270740730
+	.long	3221058356
+	.long	1728930189
+	.long	1075224844
+	.long	1303998552
+	.long	1073799186
+	.long	618611933
+	.long	3222903903
+	.long	1769828046
+	.long	3221422190
+	.long	2200537986
+	.long	1075641421
+	.long	433361110
+	.long	1074105369
+	.long	719595600
+	.long	3219800832
+	.long	294527206
+	.long	1014656440
+	.long	0
+	.long	1073741824
+	.long	3811788216
+	.long	3218400550
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	724322768
+	.long	3220364956
+	.long	0
+	.long	0
+	.long	643153048
+	.long	1072905816
+	.long	0
+	.long	0
+	.long	4285079458
+	.long	3220412206
+	.long	3912524733
+	.long	3220106631
+	.long	118362272
+	.long	1072952754
+	.long	4107767972
+	.long	1072827408
+	.long	2689502883
+	.long	3220460570
+	.long	946523347
+	.long	3220256414
+	.long	573204189
+	.long	1073001761
+	.long	581531518
+	.long	1072826391
+	.long	1386236526
+	.long	3220510607
+	.long	3718905905
+	.long	3220316471
+	.long	1145558140
+	.long	1073052673
+	.long	513572637
+	.long	1072861969
+	.long	716700048
+	.long	3219481016
+	.long	547126769
+	.long	3163007173
+	.long	0
+	.long	1072693248
+	.long	1097907398
+	.long	1071420120
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	3422807297
+	.long	3219124495
+	.long	0
+	.long	0
+	.long	1151658053
+	.long	1071494715
+	.long	0
+	.long	0
+	.long	929607071
+	.long	3218829988
+	.long	1037049034
+	.long	3219520953
+	.long	2786928657
+	.long	1071215282
+	.long	1447406859
+	.long	1072265209
+	.long	3490952107
+	.long	3218574499
+	.long	3205232916
+	.long	3219452306
+	.long	1297344304
+	.long	1070977120
+	.long	1066110976
+	.long	1071946035
+	.long	3803721480
+	.long	3218354730
+	.long	1496754229
+	.long	3219290849
+	.long	2982550683
+	.long	1070773243
+	.long	4014441989
+	.long	1071736222
+	.long	419968236
+	.long	3219200695
+	.long	3451266538
+	.long	1015961163
+	.long	0
+	.long	1072693248
+	.long	2960267235
+	.long	1070745841
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1458794562
+	.long	3217882198
+	.long	0
+	.long	0
+	.long	2857777489
+	.long	1070137637
+	.long	0
+	.long	0
+	.long	1024359517
+	.long	3217360179
+	.long	2616040238
+	.long	3219066585
+	.long	1609024636
+	.long	1069675088
+	.long	2529240549
+	.long	1071836633
+	.long	1510128600
+	.long	3216923761
+	.long	2251697184
+	.long	3218737335
+	.long	1262761453
+	.long	1069142850
+	.long	1263091857
+	.long	1071190461
+	.long	3043383486
+	.long	3216368839
+	.long	2476932470
+	.long	3218325650
+	.long	3659995028
+	.long	1068669200
+	.long	855891755
+	.long	1070696894
+	.long	2583490354
+	.long	3218768505
+	.long	3062633575
+	.long	3161492271
+	.long	0
+	.long	1072693248
+	.long	2550940471
+	.long	1069938201
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	2467582782
+	.long	3216740037
+	.long	0
+	.long	0
+	.long	162150096
+	.long	1068946420
+	.long	0
+	.long	0
+	.long	3702794237
+	.long	3216062800
+	.long	3631919291
+	.long	3218420574
+	.long	3456821413
+	.long	1068217218
+	.long	2031366438
+	.long	1071495745
+	.long	1596664020
+	.long	3215282929
+	.long	1509038701
+	.long	3218085291
+	.long	583171477
+	.long	1067510148
+	.long	3785344682
+	.long	1070618476
+	.long	2402036048
+	.long	3214559384
+	.long	3233018412
+	.long	3217396834
+	.long	411280568
+	.long	1066710556
+	.long	1065584192
+	.long	1069747896
+	.long	895247324
+	.long	3218303496
+	.long	500078909
+	.long	1013805133
+	.long	0
+	.long	1072693248
+	.long	729983843
+	.long	1068994194
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1512545955
+	.long	3215602695
+	.long	0
+	.long	0
+	.long	1127048698
+	.long	1067909459
+	.long	0
+	.long	0
+	.long	2300200450
+	.long	3214738415
+	.long	3593250296
+	.long	3217717209
+	.long	3009365544
+	.long	1066902117
+	.long	1127373050
+	.long	1071173457
+	.long	3046103305
+	.long	3213854947
+	.long	24583402
+	.long	3217207636
+	.long	4082511758
+	.long	1065914199
+	.long	3223889699
+	.long	1070020367
+	.long	548927984
+	.long	3212899404
+	.long	558065897
+	.long	3216433066
+	.long	680073315
+	.long	1064940726
+	.long	388873200
+	.long	1068944270
+	.long	3763679576
+	.long	3217651189
+	.long	1497360404
+	.long	3157194195
+	.long	0
+	.long	1072693248
+	.long	64931152
+	.long	1067729411
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.long	1313038235
+	.long	3214229379
+	.long	0
+	.long	0
+	.long	1013878342
+	.long	1067152618
+	.long	0
+	.long	0
+	.long	3663426833
+	.long	3213208931
+	.long	3693284251
+	.long	3216602456
+	.long	650852232
+	.long	1065882376
+	.long	1996245381
+	.long	1071000265
+	.long	2008746170
+	.long	3212147845
+	.long	3055842593
+	.long	3216062494
+	.long	1495406348
+	.long	1064652437
+	.long	2269530157
+	.long	1069711235
+	.long	285563696
+	.long	3211060113
+	.long	1046897440
+	.long	3215189513
+	.long	233429731
+	.long	1063453151
+	.long	522045958
+	.long	1068476590
+	.long	2354785698
+	.long	3216586427
+	.long	1317599141
+	.long	3159915781
+	.long	0
+	.long	1072693248
+	.long	2828230105
+	.long	1065606626
+	.long	0
+	.long	0
+	.long	0
+	.long	0
+	.type	Ctable,@object
+	.size	Ctable,5632
+	.align 16
+MASK_35:
+	.long	4294705152
+	.long	4294967295
+	.long	0
+	.long	0
+	.type	MASK_35,@object
+	.size	MASK_35,16
+	.align 16
+Q_11:
+	.long	3103673719
+	.long	1065509018
+	.type	Q_11,@object
+	.size	Q_11,8
+	.space 8, 0x00 	# pad
+	.align 16
+Q_9:
+	.long	3213130307
+	.long	1066820768
+	.type	Q_9,@object
+	.size	Q_9,8
+	.space 8, 0x00 	# pad
+	.align 16
+Q_7:
+	.long	1388628139
+	.long	1068212666
+	.type	Q_7,@object
+	.size	Q_7,8
+	.space 8, 0x00 	# pad
+	.align 16
+Q_5:
+	.long	285812550
+	.long	1069617425
+	.type	Q_5,@object
+	.size	Q_5,8
+	.space 8, 0x00 	# pad
+	.align 16
+Q_3:
+	.long	1431655954
+	.long	1070945621
+	.type	Q_3,@object
+	.size	Q_3,8
+	.space 8, 0x00 	# pad
+	.align 16
+PI_INV_TABLE:
+	.long	0
+	.long	0
+	.long	2734261102
+	.long	1313084713
+	.long	4230436817
+	.long	4113882560
+	.long	3680671129
+	.long	1011060801
+	.long	4266746795
+	.long	3736847713
+	.long	3072618042
+	.long	1112396512
+	.long	105459434
+	.long	164729372
+	.long	4263373596
+	.long	2972297022
+	.long	3900847605
+	.long	784024708
+	.long	3919343654
+	.long	3026157121
+	.long	965858873
+	.long	2203269620
+	.long	2625920907
+	.long	3187222587
+	.long	536385535
+	.long	3724908559
+	.long	4012839307
+	.long	1510632735
+	.long	1832287951
+	.long	667617719
+	.long	1330003814
+	.long	2657085997
+	.long	1965537991
+	.long	3957715323
+	.long	1023883767
+	.long	2320667370
+	.long	1811636145
+	.long	529358088
+	.long	1443049542
+	.long	4235946923
+	.long	4040145953
+	.type	PI_INV_TABLE,@object
+	.size	PI_INV_TABLE,164
+	.space 12, 0x00 	# pad
+	.align 16
+PI_4:
+	.long	0
+	.long	1072243195
+	.long	1175561766
+	.long	1048908043
+	.type	PI_4,@object
+	.size	PI_4,16
+	.align 8
+QQ_2:
+	.long	1734816687
+	.long	1026746297
+	.type	QQ_2,@object
+	.size	QQ_2,8
+	.align 8
+ONE:
+	.long	0
+	.long	1072693248
+	.type	ONE,@object
+	.size	ONE,8
+	.align 8
+TWO_POW_55:
+	.long	0
+	.long	1130364928
+	.type	TWO_POW_55,@object
+	.size	TWO_POW_55,8
+	.align 8
+TWO_POW_M55:
+	.long	0
+	.long	1015021568
+	.type	TWO_POW_M55,@object
+	.size	TWO_POW_M55,8
+	.align 4
+NEG_ZERO:
+	.long	0
+	.long	2147483648
+	.type	NEG_ZERO,@object
+	.size	NEG_ZERO,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000002c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_tan.1-.
+	.4byte ..___tag_value_tan.9-..___tag_value_tan.1
+	.2byte 0x0400
+	.4byte ..___tag_value_tan.3-..___tag_value_tan.1
+	.4byte 0x0283100e
+	.byte 0x04
+	.4byte ..___tag_value_tan.5-..___tag_value_tan.3
+	.2byte 0x200e
+	.byte 0x04
+	.4byte ..___tag_value_tan.6-..___tag_value_tan.5
+	.4byte 0x04c3100e
+	.4byte ..___tag_value_tan.8-..___tag_value_tan.6
+	.2byte 0x080e
+# End
diff --git a/libm/x86_64/s_tanh.S b/libm/x86_64/s_tanh.S
new file mode 100644
index 0000000..2c8f9bf
--- /dev/null
+++ b/libm/x86_64/s_tanh.S
@@ -0,0 +1,1392 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************************************************/
+//                     ALGORITHM DESCRIPTION
+//                     ---------------------
+//
+// tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))=(1-exp(-2*x))/(1+exp(-2*x))
+//
+// Let |x|=xH+xL (upper 26 bits, lower 27 bits)
+// log2(e) rounded to 26 bits (high part) plus a double precision low part is
+//         L2EH+L2EL (upper 26, lower 53 bits)
+//
+// Let xH*L2EH=k+f+r`, where (k+f)*2^8*2=int(xH*L2EH*2^9),
+//                             f=0.b1 b2 ... b8, k integer
+// 2^{-f} is approximated as Tn[f]+Dn[f]
+// Tn stores the high 53 bits, Dn stores (2^{-f}-Tn[f]) rounded to double precision
+//
+//  r=r`+xL*L2EH+|x|*L2EL, |r|<2^{-9}+2^{-14},
+//                      for |x| in [23/64,3*2^7)
+// e^{-2*|x|}=2^{-k-f}*2^{-r} ~ 2^{-k}*(Tn+Dn)*(1+p)=(T0+D0)*(1+p)
+//
+// For |x| in [2^{-4},2^5):
+//         2^{-r}-1 ~ p=c1*r+c2*r^2+..+c5*r^5
+//      Let R=1/(1+T0+p*T0), truncated to 35 significant bits
+//  R=1/(1+T0+D0+p*(T0+D0))*(1+eps), |eps|<2^{-33}
+//  1+T0+D0+p*(T0+D0)=KH+KL, where
+//       KH=(1+T0+c1*r*T0)_high (leading 17 bits)
+//       KL=T0_low+D0+(c1*r*T0)_low+c1*r*D0+(c2*r^2+..c5*r^5)*T0
+//  eps ~ (R*KH-1)+R*KL
+//  1/(1+T0+D0+p*(T0+D0)) ~ R-R*eps
+//  The result is approximated as (1-T0-D0-(T0+D0)*p)*(R-R*eps)
+//  1-T0-D0-(T0+D0)*p=-((KH-2)+KL)
+//    The result is formed as
+//    (KH-2)*R+(-(KH-2)*R*eps+(KL*R-KL*R*eps)), with the correct sign
+//                                                  set at the end
+//
+// For |x| in [2^{-64},2^{-4}):
+//  A Taylor series expansion is used  (x+p3*x^3+..+p13*x^{13})
+//
+// For |x|<2^{-64}:  x is returned
+//
+// For |x|>=2^32: return +/-1
+//
+// Special cases:
+//  tanh(NaN) = quiet NaN, and raise invalid exception
+//  tanh(INF) = that INF
+//  tanh(+/-0) = +/-0
+//
+/******************************************************************************/
+
+#include <private/bionic_asm.h>
+# -- Begin  tanh
+ENTRY(tanh)
+# parameter 1: %xmm0
+..B1.1:
+..___tag_value_tanh.1:
+        pushq     %rsi
+..___tag_value_tanh.3:
+..B1.2:
+        movsd     HALFMASK(%rip), %xmm3
+        xorpd     %xmm4, %xmm4
+        movsd     L2E(%rip), %xmm1
+        movsd     8+L2E(%rip), %xmm2
+        movl      $32768, %eax
+        pinsrw    $3, %eax, %xmm4
+        movsd     Shifter(%rip), %xmm6
+        pextrw    $3, %xmm0, %ecx
+        andpd     %xmm0, %xmm3
+        andnpd    %xmm0, %xmm4
+        pshufd    $68, %xmm4, %xmm5
+        movl      $32768, %edx
+        andl      %ecx, %edx
+        andl      $32767, %ecx
+        subl      $16304, %ecx
+        cmpl      $144, %ecx
+        jae       .L_2TAG_PACKET_0.0.1
+        subsd     %xmm3, %xmm4
+        mulsd     %xmm1, %xmm3
+        mulsd     %xmm5, %xmm2
+        cvtsd2si  %xmm3, %eax
+        movq      %xmm3, %xmm7
+        addsd     %xmm6, %xmm3
+        mulsd     %xmm4, %xmm1
+        movsd     ONEMASK(%rip), %xmm4
+        subsd     %xmm6, %xmm3
+        xorpd     %xmm0, %xmm0
+        addsd     %xmm1, %xmm2
+        subsd     %xmm3, %xmm7
+        movapd    cv(%rip), %xmm6
+        addsd     %xmm7, %xmm2
+        movl      $255, %ecx
+        andl      %eax, %ecx
+        addl      %ecx, %ecx
+        lea       T2_neg_f(%rip), %r8
+        movapd    (%r8,%rcx,8), %xmm5
+        shrl      $4, %eax
+        andl      $65520, %eax
+        subl      $16368, %eax
+        negl      %eax
+        pinsrw    $3, %eax, %xmm0
+        movapd    16+cv(%rip), %xmm1
+        pshufd    $68, %xmm0, %xmm0
+        mulpd     %xmm5, %xmm0
+        movsd     32+cv(%rip), %xmm7
+        pshufd    $68, %xmm2, %xmm2
+        movq      %xmm4, %xmm5
+        addsd     %xmm0, %xmm4
+        mulpd     %xmm2, %xmm6
+        mulsd     %xmm2, %xmm7
+        mulpd     %xmm2, %xmm2
+        addpd     %xmm6, %xmm1
+        mulsd     %xmm2, %xmm2
+        movsd     ONEMASK(%rip), %xmm3
+        mulpd     %xmm2, %xmm1
+        pshufd    $78, %xmm1, %xmm6
+        addsd     %xmm6, %xmm1
+        movq      %xmm1, %xmm6
+        addsd     %xmm7, %xmm1
+        mulsd     %xmm0, %xmm1
+        addsd     %xmm4, %xmm1
+        andpd     MASK3(%rip), %xmm4
+        divsd     %xmm1, %xmm5
+        subsd     %xmm4, %xmm3
+        pshufd    $238, %xmm0, %xmm1
+        addsd     %xmm0, %xmm3
+        movq      %xmm4, %xmm2
+        addsd     %xmm1, %xmm3
+        mulsd     %xmm7, %xmm1
+        mulsd     %xmm0, %xmm7
+        addsd     %xmm1, %xmm3
+        addsd     %xmm7, %xmm4
+        movsd     RMASK(%rip), %xmm1
+        mulsd     %xmm0, %xmm6
+        andpd     MASK3(%rip), %xmm4
+        addsd     %xmm6, %xmm3
+        movq      %xmm4, %xmm6
+        subsd     %xmm4, %xmm2
+        addsd     %xmm7, %xmm2
+        movsd     ONEMASK(%rip), %xmm7
+        andpd     %xmm1, %xmm5
+        addsd     %xmm2, %xmm3
+        mulsd     %xmm5, %xmm4
+        xorpd     %xmm2, %xmm2
+        mulsd     %xmm5, %xmm3
+        subsd     TWOMASK(%rip), %xmm6
+        subsd     %xmm7, %xmm4
+        xorl      $32768, %edx
+        pinsrw    $3, %edx, %xmm2
+        addsd     %xmm3, %xmm4
+        mulsd     %xmm5, %xmm6
+        movq      %xmm3, %xmm1
+        mulsd     %xmm4, %xmm3
+        movq      %xmm6, %xmm0
+        mulsd     %xmm4, %xmm6
+        subsd     %xmm3, %xmm1
+        subsd     %xmm6, %xmm1
+        addsd     %xmm1, %xmm0
+        xorpd     %xmm2, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_0.0.1:
+        addl      $960, %ecx
+        cmpl      $1104, %ecx
+        jae       .L_2TAG_PACKET_1.0.1
+        movapd    pv(%rip), %xmm2
+        pshufd    $68, %xmm0, %xmm1
+        movapd    16+pv(%rip), %xmm3
+        mulpd     %xmm1, %xmm1
+        movapd    32+pv(%rip), %xmm4
+        mulpd     %xmm1, %xmm2
+        pshufd    $68, %xmm1, %xmm5
+        addpd     %xmm3, %xmm2
+        mulsd     %xmm5, %xmm5
+        mulpd     %xmm1, %xmm2
+        mulsd     %xmm5, %xmm5
+        addpd     %xmm4, %xmm2
+        mulpd     %xmm5, %xmm2
+        pshufd    $238, %xmm2, %xmm5
+        addsd     %xmm5, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm2, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_1.0.1:
+        addl      $15344, %ecx
+        cmpl      $16448, %ecx
+        jae       .L_2TAG_PACKET_2.0.1
+        cmpl      $16, %ecx
+        jb        .L_2TAG_PACKET_3.0.1
+        xorpd     %xmm2, %xmm2
+        movl      $17392, %eax
+        pinsrw    $3, %eax, %xmm2
+        mulsd     %xmm0, %xmm2
+        addsd     %xmm0, %xmm2
+        jmp       ..B1.4
+.L_2TAG_PACKET_3.0.1:
+        movq      %xmm0, %xmm2
+        mulsd     %xmm2, %xmm2
+        jmp       ..B1.4
+.L_2TAG_PACKET_2.0.1:
+        cmpl      $32752, %ecx
+        jae       .L_2TAG_PACKET_4.0.1
+        xorpd     %xmm2, %xmm2
+        movl      $15344, %ecx
+        pinsrw    $3, %ecx, %xmm2
+        movq      %xmm2, %xmm3
+        mulsd     %xmm2, %xmm2
+        addsd     %xmm3, %xmm2
+.L_2TAG_PACKET_5.0.1:
+        xorpd     %xmm0, %xmm0
+        orl       $16368, %edx
+        pinsrw    $3, %edx, %xmm0
+        jmp       ..B1.4
+.L_2TAG_PACKET_4.0.1:
+        movq      %xmm0, %xmm2
+        movd      %xmm0, %eax
+        psrlq     $20, %xmm2
+        movd      %xmm2, %ecx
+        orl       %eax, %ecx
+        cmpl      $0, %ecx
+        je        .L_2TAG_PACKET_5.0.1
+        addsd     %xmm0, %xmm0
+        movq      %xmm0, (%rsp)
+.L_2TAG_PACKET_6.0.1:
+..B1.4:
+        popq      %rcx
+..___tag_value_tanh.4:
+        ret       
+..___tag_value_tanh.5:
+END(tanh)
+# -- End  tanh
+	.section .rodata, "a"
+	.align 16
+	.align 16
+L2E:
+	.long	1610612736
+	.long	1082594631
+	.long	4166901572
+	.long	1055174155
+	.type	L2E,@object
+	.size	L2E,16
+	.align 16
+Shifter:
+	.long	0
+	.long	1127743488
+	.long	0
+	.long	3275227136
+	.type	Shifter,@object
+	.size	Shifter,16
+	.align 16
+cv:
+	.long	3884607281
+	.long	3168131199
+	.long	3607404735
+	.long	3190582024
+	.long	1874480759
+	.long	1032041131
+	.long	4286760334
+	.long	1053736893
+	.long	4277811695
+	.long	3211144770
+	.long	0
+	.long	0
+	.type	cv,@object
+	.size	cv,48
+	.align 16
+T2_neg_f:
+	.long	0
+	.long	1072693248
+	.long	0
+	.long	0
+	.long	1797923801
+	.long	1072687577
+	.long	1950547427
+	.long	1013229059
+	.long	730821105
+	.long	1072681922
+	.long	2523232743
+	.long	1012067188
+	.long	915592468
+	.long	1072676282
+	.long	352947894
+	.long	3161024371
+	.long	2174652632
+	.long	1072670657
+	.long	4087714590
+	.long	1014450259
+	.long	35929225
+	.long	1072665048
+	.long	2809788041
+	.long	3159436968
+	.long	2912730644
+	.long	1072659453
+	.long	3490067722
+	.long	3163405074
+	.long	2038973688
+	.long	1072653874
+	.long	892941374
+	.long	1016046459
+	.long	1533953344
+	.long	1072648310
+	.long	769171851
+	.long	1015665633
+	.long	1222472308
+	.long	1072642761
+	.long	1054357470
+	.long	3161021018
+	.long	929806999
+	.long	1072637227
+	.long	3205336643
+	.long	1015259557
+	.long	481706282
+	.long	1072631708
+	.long	1696079173
+	.long	3162710528
+	.long	3999357479
+	.long	1072626203
+	.long	2258941616
+	.long	1015924724
+	.long	2719515920
+	.long	1072620714
+	.long	2760332941
+	.long	1015137933
+	.long	764307441
+	.long	1072615240
+	.long	3021057420
+	.long	3163329523
+	.long	2256325230
+	.long	1072609780
+	.long	580117746
+	.long	1015317295
+	.long	2728693978
+	.long	1072604335
+	.long	396109971
+	.long	3163462691
+	.long	2009970496
+	.long	1072598905
+	.long	2159039665
+	.long	3162572948
+	.long	4224142467
+	.long	1072593489
+	.long	3389820386
+	.long	1015207202
+	.long	610758006
+	.long	1072588089
+	.long	1965209397
+	.long	3161866232
+	.long	3884662774
+	.long	1072582702
+	.long	2158611599
+	.long	1014210185
+	.long	991358482
+	.long	1072577331
+	.long	838715019
+	.long	3163157668
+	.long	351641897
+	.long	1072571974
+	.long	2172261526
+	.long	3163010599
+	.long	1796832535
+	.long	1072566631
+	.long	3176955716
+	.long	3160585513
+	.long	863738719
+	.long	1072561303
+	.long	1326992220
+	.long	3162613197
+	.long	1679558232
+	.long	1072555989
+	.long	2390342287
+	.long	3163333970
+	.long	4076975200
+	.long	1072550689
+	.long	2029000899
+	.long	1015208535
+	.long	3594158869
+	.long	1072545404
+	.long	2456521700
+	.long	3163256561
+	.long	64696965
+	.long	1072540134
+	.long	1768797490
+	.long	1015816960
+	.long	1912561781
+	.long	1072534877
+	.long	3147495102
+	.long	1015678253
+	.long	382305176
+	.long	1072529635
+	.long	2347622376
+	.long	3162578625
+	.long	3898795731
+	.long	1072524406
+	.long	1249994144
+	.long	1011869818
+	.long	3707479175
+	.long	1072519192
+	.long	3613079303
+	.long	1014164738
+	.long	3939148246
+	.long	1072513992
+	.long	3210352148
+	.long	1015274323
+	.long	135105010
+	.long	1072508807
+	.long	1906148728
+	.long	3163375739
+	.long	721996136
+	.long	1072503635
+	.long	563754734
+	.long	1015371318
+	.long	1242007932
+	.long	1072498477
+	.long	1132034716
+	.long	3163339831
+	.long	1532734324
+	.long	1072493333
+	.long	3094216535
+	.long	3163162857
+	.long	1432208378
+	.long	1072488203
+	.long	1401068914
+	.long	3162363963
+	.long	778901109
+	.long	1072483087
+	.long	2248183955
+	.long	3161268751
+	.long	3706687593
+	.long	1072477984
+	.long	3521726940
+	.long	1013253067
+	.long	1464976603
+	.long	1072472896
+	.long	3507292405
+	.long	3161977534
+	.long	2483480501
+	.long	1072467821
+	.long	1216371780
+	.long	1013034172
+	.long	2307442995
+	.long	1072462760
+	.long	3190117721
+	.long	3162404539
+	.long	777507147
+	.long	1072457713
+	.long	4282924205
+	.long	1015187533
+	.long	2029714210
+	.long	1072452679
+	.long	613660079
+	.long	1015099143
+	.long	1610600570
+	.long	1072447659
+	.long	3766732298
+	.long	1015760183
+	.long	3657065772
+	.long	1072442652
+	.long	399025623
+	.long	3162957078
+	.long	3716502172
+	.long	1072437659
+	.long	2303740125
+	.long	1014042725
+	.long	1631695677
+	.long	1072432680
+	.long	2717633076
+	.long	3162344026
+	.long	1540824585
+	.long	1072427714
+	.long	1064017011
+	.long	3163487690
+	.long	3287523847
+	.long	1072422761
+	.long	1625971539
+	.long	3157009955
+	.long	2420883922
+	.long	1072417822
+	.long	2049810052
+	.long	1014119888
+	.long	3080351519
+	.long	1072412896
+	.long	3379126788
+	.long	3157218001
+	.long	815859274
+	.long	1072407984
+	.long	240396590
+	.long	3163487443
+	.long	4062661092
+	.long	1072403084
+	.long	1422616006
+	.long	3163255318
+	.long	4076559943
+	.long	1072398198
+	.long	2119478331
+	.long	3160758351
+	.long	703710506
+	.long	1072393326
+	.long	1384660846
+	.long	1015195891
+	.long	2380618042
+	.long	1072388466
+	.long	3149557219
+	.long	3163320799
+	.long	364333489
+	.long	1072383620
+	.long	3923737744
+	.long	3161421373
+	.long	3092190715
+	.long	1072378786
+	.long	814012168
+	.long	3159523422
+	.long	1822067026
+	.long	1072373966
+	.long	1241994956
+	.long	1015340290
+	.long	697153126
+	.long	1072369159
+	.long	1283515429
+	.long	3163283189
+	.long	3861050111
+	.long	1072364364
+	.long	254893773
+	.long	3162813180
+	.long	2572866477
+	.long	1072359583
+	.long	878562433
+	.long	1015521741
+	.long	977020788
+	.long	1072354815
+	.long	3065100517
+	.long	1015541563
+	.long	3218338682
+	.long	1072350059
+	.long	3404164304
+	.long	3162477108
+	.long	557149882
+	.long	1072345317
+	.long	3672720709
+	.long	1014537265
+	.long	1434058175
+	.long	1072340587
+	.long	251133233
+	.long	1015085769
+	.long	1405169241
+	.long	1072335870
+	.long	2998539689
+	.long	3162830951
+	.long	321958744
+	.long	1072331166
+	.long	3401933767
+	.long	1015794558
+	.long	2331271250
+	.long	1072326474
+	.long	812057446
+	.long	1012207446
+	.long	2990417245
+	.long	1072321795
+	.long	3683467745
+	.long	3163369326
+	.long	2152073944
+	.long	1072317129
+	.long	1486860576
+	.long	3163203456
+	.long	3964284211
+	.long	1072312475
+	.long	2111583915
+	.long	1015427164
+	.long	3985553595
+	.long	1072307834
+	.long	4002146062
+	.long	1015834136
+	.long	2069751141
+	.long	1072303206
+	.long	1562170675
+	.long	3162724681
+	.long	2366108318
+	.long	1072298590
+	.long	2867985102
+	.long	3161762254
+	.long	434316067
+	.long	1072293987
+	.long	2028358766
+	.long	1013458122
+	.long	424392917
+	.long	1072289396
+	.long	2749202995
+	.long	3162838718
+	.long	2191782032
+	.long	1072284817
+	.long	2960257726
+	.long	1013742662
+	.long	1297350157
+	.long	1072280251
+	.long	1308022040
+	.long	3163412558
+	.long	1892288442
+	.long	1072275697
+	.long	2446255666
+	.long	3162600381
+	.long	3833209506
+	.long	1072271155
+	.long	2722920684
+	.long	1013754842
+	.long	2682146384
+	.long	1072266626
+	.long	2082178513
+	.long	3163363419
+	.long	2591453363
+	.long	1072262109
+	.long	2132396182
+	.long	3159074198
+	.long	3418903055
+	.long	1072257604
+	.long	2527457337
+	.long	3160820604
+	.long	727685349
+	.long	1072253112
+	.long	2038246809
+	.long	3162358742
+	.long	2966275557
+	.long	1072248631
+	.long	2176155324
+	.long	3159842759
+	.long	1403662306
+	.long	1072244163
+	.long	2788809599
+	.long	3161671007
+	.long	194117574
+	.long	1072239707
+	.long	777528612
+	.long	3163412089
+	.long	3492293770
+	.long	1072235262
+	.long	2248032210
+	.long	1015386826
+	.long	2568320822
+	.long	1072230830
+	.long	2732824428
+	.long	1014352915
+	.long	1577608921
+	.long	1072226410
+	.long	1875489510
+	.long	3162968394
+	.long	380978316
+	.long	1072222002
+	.long	854188970
+	.long	3160462686
+	.long	3134592888
+	.long	1072217605
+	.long	4232266862
+	.long	1015991134
+	.long	1110089947
+	.long	1072213221
+	.long	1451641639
+	.long	1015474673
+	.long	2759350287
+	.long	1072208848
+	.long	1148526634
+	.long	1015894933
+	.long	3649726105
+	.long	1072204487
+	.long	4085036346
+	.long	1015649474
+	.long	3643909174
+	.long	1072200138
+	.long	3537586109
+	.long	1014354647
+	.long	2604962541
+	.long	1072195801
+	.long	2614425274
+	.long	3163539192
+	.long	396319521
+	.long	1072191476
+	.long	4172420816
+	.long	3159074632
+	.long	1176749997
+	.long	1072187162
+	.long	2738998779
+	.long	3162035844
+	.long	515457527
+	.long	1072182860
+	.long	836709333
+	.long	1015651226
+	.long	2571947539
+	.long	1072178569
+	.long	3558159064
+	.long	3163376669
+	.long	2916157145
+	.long	1072174290
+	.long	219487565
+	.long	1015309367
+	.long	1413356050
+	.long	1072170023
+	.long	1651349291
+	.long	3162668166
+	.long	2224145553
+	.long	1072165767
+	.long	3482522030
+	.long	3161489169
+	.long	919555682
+	.long	1072161523
+	.long	3121969534
+	.long	1012948226
+	.long	1660913392
+	.long	1072157290
+	.long	4218599604
+	.long	1015135707
+	.long	19972402
+	.long	1072153069
+	.long	3507899862
+	.long	1016009292
+	.long	158781403
+	.long	1072148859
+	.long	2221464712
+	.long	3163286453
+	.long	1944781191
+	.long	1072144660
+	.long	3993278767
+	.long	3161724279
+	.long	950803702
+	.long	1072140473
+	.long	1655364926
+	.long	1015237032
+	.long	1339972927
+	.long	1072136297
+	.long	167908909
+	.long	1015572152
+	.long	2980802057
+	.long	1072132132
+	.long	378619896
+	.long	1015773303
+	.long	1447192521
+	.long	1072127979
+	.long	1462857171
+	.long	3162514521
+	.long	903334909
+	.long	1072123837
+	.long	1636462108
+	.long	1015039997
+	.long	1218806132
+	.long	1072119706
+	.long	1818613052
+	.long	3162548441
+	.long	2263535754
+	.long	1072115586
+	.long	752233586
+	.long	3162639008
+	.long	3907805044
+	.long	1072111477
+	.long	2257091225
+	.long	3161550407
+	.long	1727278727
+	.long	1072107380
+	.long	3562710623
+	.long	1011471940
+	.long	4182873220
+	.long	1072103293
+	.long	629542646
+	.long	3161996303
+	.long	2555984613
+	.long	1072099218
+	.long	2652555442
+	.long	3162552692
+	.long	1013258799
+	.long	1072095154
+	.long	1748797611
+	.long	3160129082
+	.long	3721688645
+	.long	1072091100
+	.long	3069276937
+	.long	1015839401
+	.long	1963711167
+	.long	1072087058
+	.long	1744767757
+	.long	3160574294
+	.long	4201977662
+	.long	1072083026
+	.long	748330254
+	.long	1013594357
+	.long	1719614413
+	.long	1072079006
+	.long	330458198
+	.long	3163282740
+	.long	2979960120
+	.long	1072074996
+	.long	2599109725
+	.long	1014498493
+	.long	3561793907
+	.long	1072070997
+	.long	1157054053
+	.long	1011890350
+	.long	3339203574
+	.long	1072067009
+	.long	1483497780
+	.long	3162408754
+	.long	2186617381
+	.long	1072063032
+	.long	2270764084
+	.long	3163272713
+	.long	4273770423
+	.long	1072059065
+	.long	3383180809
+	.long	3163218901
+	.long	885834528
+	.long	1072055110
+	.long	1973258547
+	.long	3162261564
+	.long	488188413
+	.long	1072051165
+	.long	3199821029
+	.long	1015564048
+	.long	2956612997
+	.long	1072047230
+	.long	2118169751
+	.long	3162735553
+	.long	3872257780
+	.long	1072043306
+	.long	1253592103
+	.long	1015958334
+	.long	3111574537
+	.long	1072039393
+	.long	2606161479
+	.long	3162759746
+	.long	551349105
+	.long	1072035491
+	.long	3821916050
+	.long	3162106589
+	.long	363667784
+	.long	1072031599
+	.long	813753950
+	.long	1015785209
+	.long	2425981843
+	.long	1072027717
+	.long	2830390851
+	.long	3163346599
+	.long	2321106615
+	.long	1072023846
+	.long	2171176610
+	.long	1009535771
+	.long	4222122499
+	.long	1072019985
+	.long	1277378074
+	.long	3163256737
+	.long	3712504873
+	.long	1072016135
+	.long	88491949
+	.long	1015427660
+	.long	671025100
+	.long	1072012296
+	.long	3832014351
+	.long	3163022030
+	.long	3566716925
+	.long	1072008466
+	.long	1536826856
+	.long	1014142433
+	.long	3689071823
+	.long	1072004647
+	.long	2321004996
+	.long	3162552716
+	.long	917841882
+	.long	1072000839
+	.long	18715565
+	.long	1015659308
+	.long	3723038930
+	.long	1071997040
+	.long	378465264
+	.long	3162569582
+	.long	3395129871
+	.long	1071993252
+	.long	4025345435
+	.long	3162335388
+	.long	4109806887
+	.long	1071989474
+	.long	422403966
+	.long	1014469229
+	.long	1453150082
+	.long	1071985707
+	.long	498154669
+	.long	3161488062
+	.long	3896463087
+	.long	1071981949
+	.long	1139797873
+	.long	3161233805
+	.long	2731501122
+	.long	1071978202
+	.long	1774031855
+	.long	3162470021
+	.long	2135241198
+	.long	1071974465
+	.long	1236747871
+	.long	1013589147
+	.long	1990012071
+	.long	1071970738
+	.long	3529070563
+	.long	3162813193
+	.long	2178460671
+	.long	1071967021
+	.long	777878098
+	.long	3162842493
+	.long	2583551245
+	.long	1071963314
+	.long	3161094195
+	.long	1015606491
+	.long	3088564500
+	.long	1071959617
+	.long	1762311517
+	.long	1015045673
+	.long	3577096743
+	.long	1071955930
+	.long	2951496418
+	.long	1013793687
+	.long	3933059031
+	.long	1071952253
+	.long	2133366768
+	.long	3161531832
+	.long	4040676318
+	.long	1071948586
+	.long	4090609238
+	.long	1015663458
+	.long	3784486610
+	.long	1071944929
+	.long	1581883040
+	.long	3161698953
+	.long	3049340112
+	.long	1071941282
+	.long	3062915824
+	.long	1013170595
+	.long	1720398391
+	.long	1071937645
+	.long	3980678963
+	.long	3163300080
+	.long	3978100823
+	.long	1071934017
+	.long	3513027190
+	.long	1015845963
+	.long	1118294578
+	.long	1071930400
+	.long	2197495694
+	.long	3159909401
+	.long	1617004845
+	.long	1071926792
+	.long	82804944
+	.long	1010342778
+	.long	1065662932
+	.long	1071923194
+	.long	2533670915
+	.long	1014530238
+	.long	3645941911
+	.long	1071919605
+	.long	3814685081
+	.long	3161573341
+	.long	654919306
+	.long	1071916027
+	.long	3232961757
+	.long	3163047469
+	.long	569847338
+	.long	1071912458
+	.long	472945272
+	.long	3159290729
+	.long	3278348324
+	.long	1071908898
+	.long	3069497416
+	.long	1014750712
+	.long	78413852
+	.long	1071905349
+	.long	4183226867
+	.long	3163017251
+	.long	3743175029
+	.long	1071901808
+	.long	2072812490
+	.long	3162175075
+	.long	1276261410
+	.long	1071898278
+	.long	300981948
+	.long	1014684169
+	.long	1156440435
+	.long	1071894757
+	.long	2351451249
+	.long	1013967056
+	.long	3272845541
+	.long	1071891245
+	.long	928852419
+	.long	3163488248
+	.long	3219942644
+	.long	1071887743
+	.long	3798990616
+	.long	1015368806
+	.long	887463927
+	.long	1071884251
+	.long	3596744163
+	.long	3160794166
+	.long	460407023
+	.long	1071880768
+	.long	4237175092
+	.long	3163138469
+	.long	1829099622
+	.long	1071877294
+	.long	1016661181
+	.long	3163461005
+	.long	589198666
+	.long	1071873830
+	.long	2664346172
+	.long	3163157962
+	.long	926591435
+	.long	1071870375
+	.long	3208833762
+	.long	3162913514
+	.long	2732492859
+	.long	1071866929
+	.long	2691479646
+	.long	3162255684
+	.long	1603444721
+	.long	1071863493
+	.long	1548633640
+	.long	3162201326
+	.long	1726216749
+	.long	1071860066
+	.long	2466808228
+	.long	3161676405
+	.long	2992903935
+	.long	1071856648
+	.long	2218154406
+	.long	1015228193
+	.long	1000925746
+	.long	1071853240
+	.long	1018491672
+	.long	3163309544
+	.long	4232894513
+	.long	1071849840
+	.long	2383938684
+	.long	1014668519
+	.long	3991843581
+	.long	1071846450
+	.long	4092853457
+	.long	1014585763
+	.long	171030293
+	.long	1071843070
+	.long	3526460132
+	.long	1014428778
+	.long	1253935211
+	.long	1071839698
+	.long	1395382931
+	.long	3159702613
+	.long	2839424854
+	.long	1071836335
+	.long	1171596163
+	.long	1013041679
+	.long	526652809
+	.long	1071832982
+	.long	4223459736
+	.long	1015879375
+	.long	2799960843
+	.long	1071829637
+	.long	1423655381
+	.long	1015022151
+	.long	964107055
+	.long	1071826302
+	.long	2800439588
+	.long	3162833221
+	.long	3504003472
+	.long	1071822975
+	.long	3594001060
+	.long	3157330652
+	.long	1724976915
+	.long	1071819658
+	.long	420909223
+	.long	3163117379
+	.long	4112506593
+	.long	1071816349
+	.long	2947355221
+	.long	1014371048
+	.long	1972484976
+	.long	1071813050
+	.long	675290301
+	.long	3161640050
+	.long	3790955393
+	.long	1071809759
+	.long	2352942462
+	.long	3163180090
+	.long	874372905
+	.long	1071806478
+	.long	100263788
+	.long	1015940732
+	.long	1709341917
+	.long	1071803205
+	.long	2571168217
+	.long	1014152499
+	.long	1897844341
+	.long	1071799941
+	.long	1254300460
+	.long	1015275938
+	.long	1337108031
+	.long	1071796686
+	.long	3203724452
+	.long	1014677845
+	.long	4219606026
+	.long	1071793439
+	.long	2434574742
+	.long	1014681548
+	.long	1853186616
+	.long	1071790202
+	.long	3066496371
+	.long	1015656574
+	.long	2725843665
+	.long	1071786973
+	.long	1433917087
+	.long	1014838523
+	.long	2440944790
+	.long	1071783753
+	.long	2492769774
+	.long	1014147454
+	.long	897099801
+	.long	1071780542
+	.long	754756297
+	.long	1015241005
+	.long	2288159958
+	.long	1071777339
+	.long	2169144469
+	.long	1014876021
+	.long	2218315341
+	.long	1071774145
+	.long	2694295388
+	.long	3163288868
+	.long	586995997
+	.long	1071770960
+	.long	41662348
+	.long	3162627992
+	.long	1588871207
+	.long	1071767783
+	.long	143439582
+	.long	3162963416
+	.long	828946858
+	.long	1071764615
+	.long	10642492
+	.long	1015939438
+	.long	2502433899
+	.long	1071761455
+	.long	2148595913
+	.long	1015023991
+	.long	2214878420
+	.long	1071758304
+	.long	892270087
+	.long	3163116422
+	.long	4162030108
+	.long	1071755161
+	.long	2763428480
+	.long	1015529349
+	.long	3949972341
+	.long	1071752027
+	.long	2068408548
+	.long	1014913868
+	.long	1480023343
+	.long	1071748902
+	.long	2247196168
+	.long	1015327453
+	.long	948735466
+	.long	1071745785
+	.long	3516338028
+	.long	3162574883
+	.long	2257959872
+	.long	1071742676
+	.long	3802946148
+	.long	1012964927
+	.long	1014845819
+	.long	1071739576
+	.long	3117910646
+	.long	3161559105
+	.long	1416741826
+	.long	1071736484
+	.long	2196380210
+	.long	1011413563
+	.long	3366293073
+	.long	1071733400
+	.long	3119426314
+	.long	1014120554
+	.long	2471440686
+	.long	1071730325
+	.long	968836267
+	.long	3162214888
+	.long	2930322912
+	.long	1071727258
+	.long	2599499422
+	.long	3162714047
+	.long	351405227
+	.long	1071724200
+	.long	3125337328
+	.long	3159822479
+	.long	3228316108
+	.long	1071721149
+	.long	3010241991
+	.long	3158422804
+	.long	2875075254
+	.long	1071718107
+	.long	4144233330
+	.long	3163333716
+	.long	3490863953
+	.long	1071715073
+	.long	960797498
+	.long	3162948880
+	.long	685187902
+	.long	1071712048
+	.long	378731989
+	.long	1014843115
+	.long	2952712987
+	.long	1071709030
+	.long	3293494651
+	.long	3160120301
+	.long	1608493509
+	.long	1071706021
+	.long	3159622171
+	.long	3162807737
+	.long	852742562
+	.long	1071703020
+	.long	667253586
+	.long	1009793559
+	.long	590962156
+	.long	1071700027
+	.long	3829346666
+	.long	3163275597
+	.long	728909815
+	.long	1071697042
+	.long	383930225
+	.long	1015029468
+	.long	1172597893
+	.long	1071694065
+	.long	114433263
+	.long	1015347593
+	.long	1828292879
+	.long	1071691096
+	.long	1255956747
+	.long	1015588398
+	.long	2602514713
+	.long	1071688135
+	.long	2268929336
+	.long	1014354284
+	.long	3402036099
+	.long	1071685182
+	.long	405889334
+	.long	1015105656
+	.long	4133881824
+	.long	1071682237
+	.long	2148155345
+	.long	3162931299
+	.long	410360776
+	.long	1071679301
+	.long	1269990655
+	.long	1011975870
+	.long	728934454
+	.long	1071676372
+	.long	1413842688
+	.long	1014178612
+	.long	702412510
+	.long	1071673451
+	.long	3803266087
+	.long	3162280415
+	.long	238821257
+	.long	1071670538
+	.long	1469694871
+	.long	3162884987
+	.long	3541402996
+	.long	1071667632
+	.long	2759177317
+	.long	1014854626
+	.long	1928746161
+	.long	1071664735
+	.long	983617676
+	.long	1014285177
+	.long	3899555717
+	.long	1071661845
+	.long	427280750
+	.long	3162546972
+	.long	772914124
+	.long	1071658964
+	.long	4004372762
+	.long	1012230161
+	.long	1048019041
+	.long	1071656090
+	.long	1398474845
+	.long	3160510595
+	.long	339411585
+	.long	1071653224
+	.long	264588982
+	.long	3161636657
+	.long	2851812149
+	.long	1071650365
+	.long	2595802551
+	.long	1015767337
+	.long	4200250559
+	.long	1071647514
+	.long	2808127345
+	.long	3161781938
+	.type	T2_neg_f,@object
+	.size	T2_neg_f,4096
+	.space 512, 0x00 	# pad
+	.align 16
+MASK3:
+	.long	0
+	.long	4294967280
+	.long	0
+	.long	4294967280
+	.type	MASK3,@object
+	.size	MASK3,16
+	.align 16
+RMASK:
+	.long	4294705152
+	.long	4294967295
+	.long	4294705152
+	.long	4294967295
+	.type	RMASK,@object
+	.size	RMASK,16
+	.align 16
+pv:
+	.long	236289503
+	.long	1064135997
+	.long	463583772
+	.long	3215696314
+	.long	1441186365
+	.long	3212977891
+	.long	286331153
+	.long	1069617425
+	.long	2284589306
+	.long	1066820852
+	.long	1431655765
+	.long	3218429269
+	.type	pv,@object
+	.size	pv,48
+	.align 4
+HALFMASK:
+	.long	4160749568
+	.long	2147483647
+	.type	HALFMASK,@object
+	.size	HALFMASK,8
+	.align 4
+ONEMASK:
+	.long	0
+	.long	1072693248
+	.type	ONEMASK,@object
+	.size	ONEMASK,8
+	.align 4
+TWOMASK:
+	.long	0
+	.long	1073741824
+	.type	TWOMASK,@object
+	.size	TWOMASK,8
+	.data
+	.section .note.GNU-stack, ""
+// -- Begin DWARF2 SEGMENT .eh_frame
+	.section .eh_frame,"a",@progbits
+.eh_frame_seg:
+	.align 1
+	.4byte 0x00000014
+	.8byte 0x00527a0100000000
+	.8byte 0x08070c1b01107801
+	.4byte 0x00000190
+	.4byte 0x0000001c
+	.4byte 0x0000001c
+	.4byte ..___tag_value_tanh.1-.
+	.4byte ..___tag_value_tanh.5-..___tag_value_tanh.1
+	.2byte 0x0400
+	.4byte ..___tag_value_tanh.3-..___tag_value_tanh.1
+	.2byte 0x100e
+	.byte 0x04
+	.4byte ..___tag_value_tanh.4-..___tag_value_tanh.3
+	.2byte 0x080e
+	.byte 0x00
+# End
diff --git a/libm/x86_64/sqrt.S b/libm/x86_64/sqrt.S
new file mode 100644
index 0000000..ee97026
--- /dev/null
+++ b/libm/x86_64/sqrt.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(sqrt)
+sqrtsd %xmm0,%xmm0
+retq
+END(sqrt)
diff --git a/libm/x86_64/sqrtf.S b/libm/x86_64/sqrtf.S
new file mode 100644
index 0000000..910407f
--- /dev/null
+++ b/libm/x86_64/sqrtf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(sqrtf)
+sqrtss %xmm0,%xmm0
+retq
+END(sqrtf)
diff --git a/libm/x86_64/trunc.S b/libm/x86_64/trunc.S
new file mode 100644
index 0000000..fe18b40
--- /dev/null
+++ b/libm/x86_64/trunc.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(trunc)
+roundsd $0x3,%xmm0,%xmm0
+retq
+END(trunc)
diff --git a/libm/x86_64/truncf.S b/libm/x86_64/truncf.S
new file mode 100644
index 0000000..eeee1d7
--- /dev/null
+++ b/libm/x86_64/truncf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+    * this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+    * this list of conditions and the following disclaimer in the documentation
+    * and/or other materials provided with the distribution.
+
+    * Neither the name of Intel Corporation nor the names of its contributors
+    * may be used to endorse or promote products derived from this software
+    * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(truncf)
+roundss $0x3,%xmm0,%xmm0
+retq
+END(truncf)