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)