From c0f36fc3032047cc2f50be5b705d6d445a9ad21b Mon Sep 17 00:00:00 2001 From: Sunil K Pandey Date: Wed, 29 Dec 2021 10:00:47 -0800 Subject: x86-64: Add vector tanh/tanhf implementation to libmvec Implement vectorized tanh/tanhf containing SSE, AVX, AVX2 and AVX512 versions for libmvec as per vector ABI. It also contains accuracy and ABI tests for vector tanh/tanhf with regenerated ulps. Reviewed-by: H.J. Lu --- bits/libm-simd-decl-stubs.h | 11 + math/bits/mathcalls.h | 2 +- sysdeps/unix/sysv/linux/x86_64/libmvec.abilist | 8 + sysdeps/x86/fpu/bits/math-vector.h | 4 + sysdeps/x86/fpu/finclude/math-vector-fortran.h | 4 + sysdeps/x86_64/fpu/Makeconfig | 1 + sysdeps/x86_64/fpu/Versions | 2 + sysdeps/x86_64/fpu/libm-test-ulps | 15 + .../x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c | 27 + .../x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S | 1272 +++++++++++++++++++ .../x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c | 27 + .../x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S | 1279 ++++++++++++++++++++ .../x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c | 27 + .../fpu/multiarch/svml_d_tanh8_core_avx512.S | 472 ++++++++ .../fpu/multiarch/svml_s_tanhf16_core-avx2.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c | 28 + .../fpu/multiarch/svml_s_tanhf16_core_avx512.S | 381 ++++++ .../x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c | 28 + .../x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S | 832 +++++++++++++ .../x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S | 20 + sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c | 28 + .../x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S | 844 +++++++++++++ sysdeps/x86_64/fpu/svml_d_tanh2_core.S | 29 + sysdeps/x86_64/fpu/svml_d_tanh4_core.S | 29 + sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S | 25 + sysdeps/x86_64/fpu/svml_d_tanh8_core.S | 25 + sysdeps/x86_64/fpu/svml_s_tanhf16_core.S | 25 + sysdeps/x86_64/fpu/svml_s_tanhf4_core.S | 29 + sysdeps/x86_64/fpu/svml_s_tanhf8_core.S | 29 + sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S | 25 + sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c | 1 + sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c | 1 + .../x86_64/fpu/test-double-libmvec-tanh-avx512f.c | 1 + sysdeps/x86_64/fpu/test-double-libmvec-tanh.c | 3 + sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c | 1 + .../x86_64/fpu/test-double-vlen4-avx2-wrappers.c | 1 + sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c | 1 + sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c | 1 + sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c | 1 + sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c | 1 + .../x86_64/fpu/test-float-libmvec-tanhf-avx512f.c | 1 + sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c | 3 + sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c | 1 + sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c | 1 + .../x86_64/fpu/test-float-vlen8-avx2-wrappers.c | 1 + sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c | 1 + 50 files changed, 5647 insertions(+), 1 deletion(-) create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh2_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf16_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h index 33d480031b..21f1a43232 100644 --- a/bits/libm-simd-decl-stubs.h +++ b/bits/libm-simd-decl-stubs.h @@ -285,4 +285,15 @@ #define __DECL_SIMD_erff32x #define __DECL_SIMD_erff64x #define __DECL_SIMD_erff128x + +#define __DECL_SIMD_tanh +#define __DECL_SIMD_tanhf +#define __DECL_SIMD_tanhl +#define __DECL_SIMD_tanhf16 +#define __DECL_SIMD_tanhf32 +#define __DECL_SIMD_tanhf64 +#define __DECL_SIMD_tanhf128 +#define __DECL_SIMD_tanhf32x +#define __DECL_SIMD_tanhf64x +#define __DECL_SIMD_tanhf128x #endif diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index a5b6c4457f..3d1c2056d5 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -72,7 +72,7 @@ __MATHCALL_VEC (cosh,, (_Mdouble_ __x)); /* Hyperbolic sine of X. */ __MATHCALL_VEC (sinh,, (_Mdouble_ __x)); /* Hyperbolic tangent of X. */ -__MATHCALL (tanh,, (_Mdouble_ __x)); +__MATHCALL_VEC (tanh,, (_Mdouble_ __x)); #ifdef __USE_GNU /* Cosine and sine of X. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist index 5525c8a0d6..e178cef683 100644 --- a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist @@ -61,6 +61,7 @@ GLIBC_2.35 _ZGVbN2v_log10 F GLIBC_2.35 _ZGVbN2v_log1p F GLIBC_2.35 _ZGVbN2v_log2 F GLIBC_2.35 _ZGVbN2v_sinh F +GLIBC_2.35 _ZGVbN2v_tanh F GLIBC_2.35 _ZGVbN2vv_atan2 F GLIBC_2.35 _ZGVbN2vv_hypot F GLIBC_2.35 _ZGVbN4v_acosf F @@ -78,6 +79,7 @@ GLIBC_2.35 _ZGVbN4v_log10f F GLIBC_2.35 _ZGVbN4v_log1pf F GLIBC_2.35 _ZGVbN4v_log2f F GLIBC_2.35 _ZGVbN4v_sinhf F +GLIBC_2.35 _ZGVbN4v_tanhf F GLIBC_2.35 _ZGVbN4vv_atan2f F GLIBC_2.35 _ZGVbN4vv_hypotf F GLIBC_2.35 _ZGVcN4v_acos F @@ -95,6 +97,7 @@ GLIBC_2.35 _ZGVcN4v_log10 F GLIBC_2.35 _ZGVcN4v_log1p F GLIBC_2.35 _ZGVcN4v_log2 F GLIBC_2.35 _ZGVcN4v_sinh F +GLIBC_2.35 _ZGVcN4v_tanh F GLIBC_2.35 _ZGVcN4vv_atan2 F GLIBC_2.35 _ZGVcN4vv_hypot F GLIBC_2.35 _ZGVcN8v_acosf F @@ -112,6 +115,7 @@ GLIBC_2.35 _ZGVcN8v_log10f F GLIBC_2.35 _ZGVcN8v_log1pf F GLIBC_2.35 _ZGVcN8v_log2f F GLIBC_2.35 _ZGVcN8v_sinhf F +GLIBC_2.35 _ZGVcN8v_tanhf F GLIBC_2.35 _ZGVcN8vv_atan2f F GLIBC_2.35 _ZGVcN8vv_hypotf F GLIBC_2.35 _ZGVdN4v_acos F @@ -129,6 +133,7 @@ GLIBC_2.35 _ZGVdN4v_log10 F GLIBC_2.35 _ZGVdN4v_log1p F GLIBC_2.35 _ZGVdN4v_log2 F GLIBC_2.35 _ZGVdN4v_sinh F +GLIBC_2.35 _ZGVdN4v_tanh F GLIBC_2.35 _ZGVdN4vv_atan2 F GLIBC_2.35 _ZGVdN4vv_hypot F GLIBC_2.35 _ZGVdN8v_acosf F @@ -146,6 +151,7 @@ GLIBC_2.35 _ZGVdN8v_log10f F GLIBC_2.35 _ZGVdN8v_log1pf F GLIBC_2.35 _ZGVdN8v_log2f F GLIBC_2.35 _ZGVdN8v_sinhf F +GLIBC_2.35 _ZGVdN8v_tanhf F GLIBC_2.35 _ZGVdN8vv_atan2f F GLIBC_2.35 _ZGVdN8vv_hypotf F GLIBC_2.35 _ZGVeN16v_acosf F @@ -163,6 +169,7 @@ GLIBC_2.35 _ZGVeN16v_log10f F GLIBC_2.35 _ZGVeN16v_log1pf F GLIBC_2.35 _ZGVeN16v_log2f F GLIBC_2.35 _ZGVeN16v_sinhf F +GLIBC_2.35 _ZGVeN16v_tanhf F GLIBC_2.35 _ZGVeN16vv_atan2f F GLIBC_2.35 _ZGVeN16vv_hypotf F GLIBC_2.35 _ZGVeN8v_acos F @@ -180,5 +187,6 @@ GLIBC_2.35 _ZGVeN8v_log10 F GLIBC_2.35 _ZGVeN8v_log1p F GLIBC_2.35 _ZGVeN8v_log2 F GLIBC_2.35 _ZGVeN8v_sinh F +GLIBC_2.35 _ZGVeN8v_tanh F GLIBC_2.35 _ZGVeN8vv_atan2 F GLIBC_2.35 _ZGVeN8vv_hypot F diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h index ea0deb31c1..3c657f6108 100644 --- a/sysdeps/x86/fpu/bits/math-vector.h +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -126,6 +126,10 @@ # define __DECL_SIMD_erf __DECL_SIMD_x86_64 # undef __DECL_SIMD_erff # define __DECL_SIMD_erff __DECL_SIMD_x86_64 +# undef __DECL_SIMD_tanh +# define __DECL_SIMD_tanh __DECL_SIMD_x86_64 +# undef __DECL_SIMD_tanhf +# define __DECL_SIMD_tanhf __DECL_SIMD_x86_64 # endif #endif diff --git a/sysdeps/x86/fpu/finclude/math-vector-fortran.h b/sysdeps/x86/fpu/finclude/math-vector-fortran.h index 42addd9a25..c7f81945fe 100644 --- a/sysdeps/x86/fpu/finclude/math-vector-fortran.h +++ b/sysdeps/x86/fpu/finclude/math-vector-fortran.h @@ -62,6 +62,8 @@ !GCC$ builtin (acoshf) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (erf) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (erff) attributes simd (notinbranch) if('x86_64') +!GCC$ builtin (tanh) attributes simd (notinbranch) if('x86_64') +!GCC$ builtin (tanhf) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (cos) attributes simd (notinbranch) if('x32') !GCC$ builtin (cosf) attributes simd (notinbranch) if('x32') @@ -109,3 +111,5 @@ !GCC$ builtin (acoshf) attributes simd (notinbranch) if('x32') !GCC$ builtin (erf) attributes simd (notinbranch) if('x32') !GCC$ builtin (erff) attributes simd (notinbranch) if('x32') +!GCC$ builtin (tanh) attributes simd (notinbranch) if('x32') +!GCC$ builtin (tanhf) attributes simd (notinbranch) if('x32') diff --git a/sysdeps/x86_64/fpu/Makeconfig b/sysdeps/x86_64/fpu/Makeconfig index 2b89a1bba3..26df8d47bf 100644 --- a/sysdeps/x86_64/fpu/Makeconfig +++ b/sysdeps/x86_64/fpu/Makeconfig @@ -45,6 +45,7 @@ libmvec-funcs = \ sin \ sincos \ sinh \ + tanh \ # Define libmvec function for benchtests directory. libmvec-bench-funcs = \ diff --git a/sysdeps/x86_64/fpu/Versions b/sysdeps/x86_64/fpu/Versions index 2fcdef6944..adcbe0fefb 100644 --- a/sysdeps/x86_64/fpu/Versions +++ b/sysdeps/x86_64/fpu/Versions @@ -29,6 +29,7 @@ libmvec { _ZGVbN2v_log1p; _ZGVcN4v_log1p; _ZGVdN4v_log1p; _ZGVeN8v_log1p; _ZGVbN2v_log2; _ZGVcN4v_log2; _ZGVdN4v_log2; _ZGVeN8v_log2; _ZGVbN2v_sinh; _ZGVcN4v_sinh; _ZGVdN4v_sinh; _ZGVeN8v_sinh; + _ZGVbN2v_tanh; _ZGVcN4v_tanh; _ZGVdN4v_tanh; _ZGVeN8v_tanh; _ZGVbN2vv_atan2; _ZGVcN4vv_atan2; _ZGVdN4vv_atan2; _ZGVeN8vv_atan2; _ZGVbN2vv_hypot; _ZGVcN4vv_hypot; _ZGVdN4vv_hypot; _ZGVeN8vv_hypot; _ZGVbN4v_acosf; _ZGVcN8v_acosf; _ZGVdN8v_acosf; _ZGVeN16v_acosf; @@ -46,6 +47,7 @@ libmvec { _ZGVbN4v_log1pf; _ZGVcN8v_log1pf; _ZGVdN8v_log1pf; _ZGVeN16v_log1pf; _ZGVbN4v_log2f; _ZGVcN8v_log2f; _ZGVdN8v_log2f; _ZGVeN16v_log2f; _ZGVbN4v_sinhf; _ZGVcN8v_sinhf; _ZGVdN8v_sinhf; _ZGVeN16v_sinhf; + _ZGVbN4v_tanhf; _ZGVcN8v_tanhf; _ZGVdN8v_tanhf; _ZGVeN16v_tanhf; _ZGVbN4vv_atan2f; _ZGVcN8vv_atan2f; _ZGVdN8vv_atan2f; _ZGVeN16vv_atan2f; _ZGVbN4vv_hypotf; _ZGVcN8vv_hypotf; _ZGVdN8vv_hypotf; _ZGVeN16vv_hypotf; } diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 929de0e786..bfaad7acef 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -2067,6 +2067,21 @@ float: 3 float128: 3 ldouble: 4 +Function: "tanh_vlen16": +float: 1 + +Function: "tanh_vlen2": +double: 1 + +Function: "tanh_vlen4": +double: 1 + +Function: "tanh_vlen4_avx2": +double: 1 + +Function: "tanh_vlen8": +double: 1 + Function: "tgamma": double: 9 float: 8 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S new file mode 100644 index 0000000000..35b065fe55 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized tanh, vector length is 2. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _ZGVbN2v_tanh _ZGVbN2v_tanh_sse2 +#include "../svml_d_tanh2_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c new file mode 100644 index 0000000000..d2e63bdc56 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized tanh, vector length is 2. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define SYMBOL_NAME _ZGVbN2v_tanh +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN2v_tanh, __GI__ZGVbN2v_tanh, __redirect__ZGVbN2v_tanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S new file mode 100644 index 0000000000..35bbb5b04c --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S @@ -0,0 +1,1272 @@ +/* Function tanh vectorized with SSE4. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + https://www.gnu.org/licenses/. */ + +/* + * ALGORITHM DESCRIPTION: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +/* Offsets for data table __svml_dtanh_data_internal + */ +#define _dbP 0 +#define _dbSignMask 7680 +#define _dbAbsMask 7696 +#define _iExpMantMask 7712 +#define _iExpMask 7728 +#define _iMinIdxOfsMask 7744 +#define _iMaxIdxMask 7760 + +#include + + .text + .section .text.sse4,"ax",@progbits +ENTRY(_ZGVbN2v_tanh_sse4) + subq $72, %rsp + cfi_def_cfa_offset(80) + movaps %xmm0, %xmm13 + movq _iExpMantMask+__svml_dtanh_data_internal(%rip), %xmm14 + lea _dbP+96+__svml_dtanh_data_internal(%rip), %rsi + pshufd $221, %xmm13, %xmm8 + +/* if VMIN, VMAX is defined for I type */ + pxor %xmm10, %xmm10 + movq _iMinIdxOfsMask+__svml_dtanh_data_internal(%rip), %xmm9 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + pand %xmm14, %xmm8 + movdqa %xmm8, %xmm11 + psubd %xmm9, %xmm8 + movq _iMaxIdxMask+__svml_dtanh_data_internal(%rip), %xmm5 + movdqa %xmm8, %xmm6 + movdqa %xmm8, %xmm7 + pcmpgtd %xmm5, %xmm6 + pcmpgtd %xmm10, %xmm7 + movdqa %xmm6, %xmm3 + pand %xmm7, %xmm8 + andps %xmm6, %xmm5 + andnps %xmm8, %xmm3 + orps %xmm5, %xmm3 + +/* + * VSHRIMM( I, iIndex, = iIndex, (17 - 4) ); + * VGATHER_MATRIX( L2D, p, TAB._dbP, iIndex, 0, T_ITEM_SIZE, T_ITEM_GRAN, 13, 0, 0 ); + */ + psrld $10, %xmm3 + movd %xmm3, %eax + pshufd $1, %xmm3, %xmm4 + +/* Constant loading */ + movq _iExpMask+__svml_dtanh_data_internal(%rip), %xmm15 + movd %xmm4, %ecx + pcmpgtd %xmm15, %xmm11 + movmskps %xmm11, %edx + movups _dbAbsMask+__svml_dtanh_data_internal(%rip), %xmm0 + movups _dbSignMask+__svml_dtanh_data_internal(%rip), %xmm12 + andps %xmm13, %xmm0 + movslq %eax, %rax + andps %xmm13, %xmm12 + movslq %ecx, %rcx + movups %xmm13, (%rsp) + movups -96(%rax,%rsi), %xmm11 + movups -96(%rcx,%rsi), %xmm2 + movups -80(%rax,%rsi), %xmm9 + movups -48(%rax,%rsi), %xmm5 + movaps %xmm9, %xmm10 + movups -32(%rax,%rsi), %xmm3 + movaps %xmm5, %xmm6 + movaps %xmm3, %xmm4 + unpckhpd %xmm2, %xmm11 + movups -80(%rcx,%rsi), %xmm13 + movups -48(%rcx,%rsi), %xmm15 + movups -32(%rcx,%rsi), %xmm1 + movups -64(%rax,%rsi), %xmm7 + movups -16(%rax,%rsi), %xmm2 + movaps %xmm7, %xmm8 + unpcklpd %xmm13, %xmm10 + unpckhpd %xmm13, %xmm9 + movups -64(%rcx,%rsi), %xmm14 + movups -16(%rcx,%rsi), %xmm13 + unpcklpd %xmm15, %xmm6 + unpckhpd %xmm15, %xmm5 + unpcklpd %xmm1, %xmm4 + unpckhpd %xmm1, %xmm3 + movaps %xmm2, %xmm1 + movups (%rax,%rsi), %xmm15 + unpcklpd %xmm14, %xmm8 + unpckhpd %xmm14, %xmm7 + unpcklpd %xmm13, %xmm1 + unpckhpd %xmm13, %xmm2 + movaps %xmm15, %xmm13 + movups (%rcx,%rsi), %xmm14 + unpcklpd %xmm14, %xmm13 + addpd %xmm13, %xmm0 + mulpd %xmm0, %xmm2 + addpd %xmm1, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm3, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm4, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm5, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm6, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm7, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm8, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm9, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm10, %xmm2 + mulpd %xmm2, %xmm0 + addpd %xmm11, %xmm0 + orps %xmm12, %xmm0 + andl $3, %edx + +/* Go to special inputs processing branch */ + jne L(SPECIAL_VALUES_BRANCH) + # LOE rbx rbp r12 r13 r14 r15 edx xmm0 + +/* Restore registers + * and exit the function + */ + +L(EXIT): + addq $72, %rsp + cfi_def_cfa_offset(8) + ret + cfi_def_cfa_offset(80) + +/* Branch to process + * special inputs + */ + +L(SPECIAL_VALUES_BRANCH): + movups (%rsp), %xmm1 + movups %xmm1, 32(%rsp) + movups %xmm0, 48(%rsp) + # LOE rbx rbp r12 r13 r14 r15 edx xmm0 + + xorl %eax, %eax + movq %r12, 16(%rsp) + cfi_offset(12, -64) + movl %eax, %r12d + movq %r13, 8(%rsp) + cfi_offset(13, -72) + movl %edx, %r13d + movq %r14, (%rsp) + cfi_offset(14, -80) + # LOE rbx rbp r15 r12d r13d + +/* Range mask + * bits check + */ + +L(RANGEMASK_CHECK): + btl %r12d, %r13d + +/* Call scalar math function */ + jc L(SCALAR_MATH_CALL) + # LOE rbx rbp r15 r12d r13d + +/* Special inputs + * processing loop + */ + +L(SPECIAL_VALUES_LOOP): + incl %r12d + cmpl $2, %r12d + +/* Check bits in range mask */ + jl L(RANGEMASK_CHECK) + # LOE rbx rbp r15 r12d r13d + + movq 16(%rsp), %r12 + cfi_restore(12) + movq 8(%rsp), %r13 + cfi_restore(13) + movq (%rsp), %r14 + cfi_restore(14) + movups 48(%rsp), %xmm0 + +/* Go to exit */ + jmp L(EXIT) + cfi_offset(12, -64) + cfi_offset(13, -72) + cfi_offset(14, -80) + # LOE rbx rbp r12 r13 r14 r15 xmm0 + +/* Scalar math fucntion call + * to process special input + */ + +L(SCALAR_MATH_CALL): + movl %r12d, %r14d + movsd 32(%rsp,%r14,8), %xmm0 + call tanh@PLT + # LOE rbx rbp r14 r15 r12d r13d xmm0 + + movsd %xmm0, 48(%rsp,%r14,8) + +/* Process special inputs in loop */ + jmp L(SPECIAL_VALUES_LOOP) + # LOE rbx rbp r15 r12d r13d +END(_ZGVbN2v_tanh_sse4) + + .section .rodata, "a" + .align 16 + +#ifdef __svml_dtanh_data_internal_typedef +typedef unsigned int VUINT32; +typedef struct +{ + __declspec(align(16)) VUINT32 _dbP[60*16][2]; + __declspec(align(16)) VUINT32 _dbSignMask[2][2]; + __declspec(align(16)) VUINT32 _dbAbsMask[2][2]; + __declspec(align(16)) VUINT32 _iExpMantMask[4][1]; + __declspec(align(16)) VUINT32 _iExpMask[4][1]; + __declspec(align(16)) VUINT32 _iMinIdxOfsMask[4][1]; + __declspec(align(16)) VUINT32 _iMaxIdxMask[4][1]; +} __svml_dtanh_data_internal; +#endif +__svml_dtanh_data_internal: + /* Polynomial coefficients */ + .quad 0x0000000000000000 /* PL0 = +0.000000000000000000000e-01 */ + .quad 0x0000000000000000 /* PH0 = +0.000000000000000000000e-01 */ + .quad 0x3FF0000000000000 /* P1 = +1.000000000000000014103e+00 */ + .quad 0xBD197DEAD79668D3 /* P2 = -2.264132406596103056796e-14 */ + .quad 0xBFD555555553AF3C /* P3 = -3.333333333273349741024e-01 */ + .quad 0xBE052F7CCA134846 /* P4 = -6.165791385711493738399e-10 */ + .quad 0x3FC11111563849D6 /* P5 = +1.333333655353061107201e-01 */ + .quad 0xBEB038623673FFB2 /* P6 = -9.668021563879858950855e-07 */ + .quad 0xBFAB9F685E64022E /* P7 = -5.395055916051593179252e-02 */ + .quad 0xBF2A54E2B28F2207 /* P8 = -2.008940439550829012647e-04 */ + .quad 0x3F97CFB9328A230E /* P9 = +2.325333949059698582189e-02 */ + .quad 0xBF75CA6D61723E02 /* P10 = -5.320002811586290441790e-03 */ + .quad 0x0000000000000000 /* B = +0 */ + .quad 0x3FF0000000000000 /* A = +1.0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C3708A564FAD29A /* PL0 = +1.248663375337163807466e-18 */ + .quad 0x3FC0E6973998DA48 /* PH0 = +1.320370703922029154143e-01 */ + .quad 0x3FEF712EB25C0888 /* P1 = +9.825662120422444519229e-01 */ + .quad 0xBFC09B296F7C1EA9 /* P2 = -1.297351641044220078331e-01 */ + .quad 0xBFD3DD77541EDDA7 /* P3 = -3.103922196855485849143e-01 */ + .quad 0x3FB58FFCF4309615 /* P4 = +8.422833406128689275566e-02 */ + .quad 0x3FBD3ABE845DCF49 /* P5 = +1.141776154670967208833e-01 */ + .quad 0xBFA791DF538C37FA /* P6 = -4.603479285115947936529e-02 */ + .quad 0xBFA4F872F69CD6E8 /* P7 = -4.095801601799370195284e-02 */ + .quad 0x3F9772E49EF6412B /* P8 = +2.289921970583567527179e-02 */ + .quad 0x3F8CBC0807393909 /* P9 = +1.403051635784581776625e-02 */ + .quad 0xBF85F06A30F93319 /* P10 = -1.071246110873285040939e-02 */ + .quad 0xBFC1000000000000 /* B = -.132813 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6004EE5739DEAC /* PL0 = +6.947247374112211856530e-18 */ + .quad 0x3FC2DC968E6E0D62 /* PH0 = +1.473568149050193398786e-01 */ + .quad 0x3FEF4E1E606D96DF /* P1 = +9.782859691010478680677e-01 */ + .quad 0xBFC273BD70994AB9 /* P2 = -1.441571044730005866646e-01 */ + .quad 0xBFD382B548270D2C /* P3 = -3.048527912726111386771e-01 */ + .quad 0x3FB7CD2D582A6B29 /* P4 = +9.297450449450351894400e-02 */ + .quad 0x3FBC1278CCCBF0DB /* P5 = +1.096568584434324642303e-01 */ + .quad 0xBFA9C7F5115B86A1 /* P6 = -5.035367810138536095866e-02 */ + .quad 0xBFA371C21BAF618E /* P7 = -3.797728145554222910481e-02 */ + .quad 0x3F9958943F68417E /* P8 = +2.475196492201935923783e-02 */ + .quad 0x3F8930D5CFFD4152 /* P9 = +1.230017701132682667572e-02 */ + .quad 0xBF875CF7ADD31B76 /* P10 = -1.140779017658897660092e-02 */ + .quad 0xBFC3000000000000 /* B = -.148438 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7EABE24E052A1F /* PL0 = +2.660321779421749543501e-17 */ + .quad 0x3FC4D04783618C71 /* PH0 = +1.626061812886266111366e-01 */ + .quad 0x3FEF2765AF97A4B3 /* P1 = +9.735592298067302883212e-01 */ + .quad 0xBFC443654205FEA5 /* P2 = -1.583067486171689074207e-01 */ + .quad 0xBFD31F2E208A5B97 /* P3 = -2.987780874040536844467e-01 */ + .quad 0x3FB9F235BD339878 /* P4 = +1.013520800512156573576e-01 */ + .quad 0x3FBAD0B0DFCCA141 /* P5 = +1.047468706498238100104e-01 */ + .quad 0xBFABD1B9600E608E /* P6 = -5.433444306908184548967e-02 */ + .quad 0xBFA1CEBEAF07DB58 /* P7 = -3.478046309094534453598e-02 */ + .quad 0x3F9AFC9FB1D8EFD2 /* P8 = +2.635430834764902126383e-02 */ + .quad 0x3F8573444F1AB502 /* P9 = +1.047376028449287564018e-02 */ + .quad 0xBF8874FBC8F24406 /* P10 = -1.194187838544459322219e-02 */ + .quad 0xBFC5000000000000 /* B = -.164063 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7FB199D361A790 /* PL0 = +2.748994907060158996213e-17 */ + .quad 0x3FC6C170259E21F7 /* PH0 = +1.777782615356639783766e-01 */ + .quad 0x3FEEFD17479F7C65 /* P1 = +9.683948897253570478266e-01 */ + .quad 0xBFC609530FE4DF8D /* P2 = -1.721595599753950294577e-01 */ + .quad 0xBFD2B3465D71B4DE /* P3 = -2.921920692959484052676e-01 */ + .quad 0x3FBBFD2D34AC509B /* P4 = +1.093319181057403192166e-01 */ + .quad 0x3FB9778C3C16A0FE /* P5 = +9.948040453912551395183e-02 */ + .quad 0xBFADAC4D9E63C665 /* P6 = -5.795519407719210697372e-02 */ + .quad 0xBFA0139CCAD02D60 /* P7 = -3.139963126894929339124e-02 */ + .quad 0x3F9C5BF43BA6F19D /* P8 = +2.769452680671379432854e-02 */ + .quad 0x3F8190B703350341 /* P9 = +8.576803002712575184772e-03 */ + .quad 0xBF8936606782858A /* P10 = -1.231074634444230850234e-02 */ + .quad 0xBFC7000000000000 /* B = -.179688 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6A917CA3624D50 /* PL0 = +1.152216693509785660691e-17 */ + .quad 0x3FC8AFD7B974FABB /* PH0 = +1.928662925292508878439e-01 */ + .quad 0x3FEECF47624A5D03 /* P1 = +9.628025932060214187231e-01 */ + .quad 0xBFC7C4C2CB4FDE4D /* P2 = -1.856921665891938814679e-01 */ + .quad 0xBFD23F69CB2C1F9D /* P3 = -2.851204380135586155453e-01 */ + .quad 0x3FBDEC5703A03814 /* P4 = +1.168875106670557712458e-01 */ + .quad 0x3FB8095003D0CF15 /* P5 = +9.389209836154706616487e-02 */ + .quad 0xBFAF554B47B10CBB /* P6 = -6.119761705533607365968e-02 */ + .quad 0xBF9C89743FE7BC1B /* P7 = -2.786809577986213853937e-02 */ + .quad 0x3F9D74725B746E7C /* P8 = +2.876452143855921824991e-02 */ + .quad 0x3F7B2D8AFB70B88C /* P9 = +6.635229968237631511880e-03 */ + .quad 0xBF89A0A2883EF6CB /* P10 = -1.251341799058582545252e-02 */ + .quad 0xBFC9000000000000 /* B = -.195313 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7608279E8609CB /* PL0 = +1.910958764623660748269e-17 */ + .quad 0x3FCA9B46D2DDC5E3 /* PH0 = +2.078636674519166172015e-01 */ + .quad 0x3FEE9E0BB72A01A1 /* P1 = +9.567926957534390123919e-01 */ + .quad 0xBFC974FAD10C5330 /* P2 = -1.988824387305156976885e-01 */ + .quad 0xBFD1C40ACCBA4044 /* P3 = -2.775904654781735703430e-01 */ + .quad 0x3FBFBE24E2987853 /* P4 = +1.239951184474830487522e-01 */ + .quad 0x3FB6885B4345E47F /* P5 = +8.801813499839460539687e-02 */ + .quad 0xBFB06563D5670584 /* P6 = -6.404708824176991770896e-02 */ + .quad 0xBF98CD1D620DF6E2 /* P7 = -2.421995078065365147772e-02 */ + .quad 0x3F9E44EF3E844D21 /* P8 = +2.955983943054463683119e-02 */ + .quad 0x3F7325FA0148CAAE /* P9 = +4.674889165971292322643e-03 */ + .quad 0xBF89B4C8556C2D92 /* P10 = -1.255184660614964011319e-02 */ + .quad 0xBFCB000000000000 /* B = -.210938 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6F19DAA20F51D5 /* PL0 = +1.348790537832000351176e-17 */ + .quad 0x3FCC83876CA98E15 /* PH0 = +2.227639465883021474557e-01 */ + .quad 0x3FEE697B662D07CD /* P1 = +9.503762241004040620296e-01 */ + .quad 0xBFCB194C7ED76ACF /* P2 = -2.117095584242946953999e-01 */ + .quad 0xBFD141A19E419762 /* P3 = -2.696308179350720680191e-01 */ + .quad 0x3FC0B89C64BC7B98 /* P4 = +1.306338779331468503007e-01 */ + .quad 0x3FB4F721150BBFC5 /* P5 = +8.189589275184434216748e-02 */ + .quad 0xBFB105AAFAB87898 /* P6 = -6.649273511036069461061e-02 */ + .quad 0xBF94FB3B31248C01 /* P7 = -2.048962104266749732921e-02 */ + .quad 0x3F9ECD31E588709C /* P8 = +3.007963145692880855964e-02 */ + .quad 0x3F664A91A335C105 /* P9 = +2.721104095762541127495e-03 */ + .quad 0xBF89754E32E1E26E /* P10 = -1.243077366619723806134e-02 */ + .quad 0xBFCD000000000000 /* B = -.226563 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6AC6C889D8111D /* PL0 = +1.161245469312620769170e-17 */ + .quad 0x3FCE6864FE55A3D0 /* PH0 = +2.375608674877001114112e-01 */ + .quad 0x3FEE31AEE116B82B /* P1 = +9.435648342384913826391e-01 */ + .quad 0xBFCCB114B69E808B /* P2 = -2.241540805525839833707e-01 */ + .quad 0xBFD0B8AB913BA99D /* P3 = -2.612713735858507980441e-01 */ + .quad 0x3FC1823322BED48A /* P4 = +1.367858810096190233514e-01 */ + .quad 0x3FB35822B7929893 /* P5 = +7.556359273675842651653e-02 */ + .quad 0xBFB18B03CC78D2DA /* P6 = -6.852744810096158580830e-02 */ + .quad 0xBF911CCC3C8D5E5D /* P7 = -1.671141738492420009734e-02 */ + .quad 0x3F9F0DEC2D99B12F /* P8 = +3.032654789278515819797e-02 */ + .quad 0x3F4A28398B4EBD98 /* P9 = +7.982521989244205404918e-04 */ + .quad 0xBF88E60CB2FAB9A4 /* P10 = -1.215753480150000985458e-02 */ + .quad 0xBFCF000000000000 /* B = -.242188 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C89D2B6774FB61D /* PL0 = +4.479593208720169247958e-17 */ + .quad 0x3FD09C744F539BE4 /* PH0 = +2.595492148088267558848e-01 */ + .quad 0x3FEDD823B0400D42 /* P1 = +9.326342050921214825882e-01 */ + .quad 0xBFCEFBF7FF305FCC /* P2 = -2.420644756355144687086e-01 */ + .quad 0xBFCFC01DC4F24A41 /* P3 = -2.480504237797323303990e-01 */ + .quad 0x3FC291A2C26D5548 /* P4 = +1.450694512701977626753e-01 */ + .quad 0x3FB0D562E672D188 /* P5 = +6.575601698097532991976e-02 */ + .quad 0xBFB2201ECC119E06 /* P6 = -7.080261690281738261872e-02 */ + .quad 0xBF8695D50F778D31 /* P7 = -1.102796987010509974642e-02 */ + .quad 0x3F9EEC8CFBC031A0 /* P8 = +3.019924437107734972427e-02 */ + .quad 0xBF6030F0A4D3660A /* P9 = -1.976461417694923328722e-03 */ + .quad 0xBF87845288A4AEF5 /* P10 = -1.148285369398347838494e-02 */ + .quad 0xBFD1000000000000 /* B = -.265625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C8B6AAB614D1C8D /* PL0 = +4.756035418366735312727e-17 */ + .quad 0x3FD275F7E1CF7F63 /* PH0 = +2.884502129727392616410e-01 */ + .quad 0x3FED56658F74C9CC /* P1 = +9.167964746359813351341e-01 */ + .quad 0xBFD0ECC045EBD596 /* P2 = -2.644501383614054083635e-01 */ + .quad 0xBFCD5A4BDE179180 /* P3 = -2.293181261476426808811e-01 */ + .quad 0x3FC3C00047D34767 /* P4 = +1.542969084462655120552e-01 */ + .quad 0x3FAAC7CE84FD609F /* P5 = +5.230565427217581251974e-02 */ + .quad 0xBFB288948D2E8B43 /* P6 = -7.239654967137902384931e-02 */ + .quad 0xBF6D6605AAD5A1C0 /* P7 = -3.588687008847041164896e-03 */ + .quad 0x3F9DDB0790848E97 /* P8 = +2.915584392134337382866e-02 */ + .quad 0xBF75FDE291BAD5B4 /* P9 = -5.369076763306269573660e-03 */ + .quad 0xBF84CEA5C52E0A78 /* P10 = -1.015977390284671071888e-02 */ + .quad 0xBFD3000000000000 /* B = -.296875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7139A81C8A6ECF /* PL0 = +1.494049799478574591322e-17 */ + .quad 0x3FD4470650036407 /* PH0 = +3.168350011233659890841e-01 */ + .quad 0x3FECC9A69DFDDD48 /* P1 = +8.996155820631566629678e-01 */ + .quad 0xBFD23DED3A37A09F /* P2 = -2.850297039535778028925e-01 */ + .quad 0xBFCAD302395D51C1 /* P3 = -2.095644741153943890185e-01 */ + .quad 0x3FC4A8FE3F309C22 /* P4 = +1.614072617096278705115e-01 */ + .quad 0x3FA3D161188AA436 /* P5 = +3.870681213931741151586e-02 */ + .quad 0xBFB288CFE5494E98 /* P6 = -7.240008685885823969403e-02 */ + .quad 0x3F6C7903EED8D334 /* P7 = +3.475673371918475361081e-03 */ + .quad 0x3F9BE023CDFB02F6 /* P8 = +2.722221321778569498033e-02 */ + .quad 0xBF80F8296F2C3A95 /* P9 = -8.285831170295390358336e-03 */ + .quad 0xBF8152DF4790049B /* P10 = -8.458847400108650973189e-03 */ + .quad 0xBFD5000000000000 /* B = -.328125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7751FE0FEE8335 /* PL0 = +2.022712113430213599928e-17 */ + .quad 0x3FD60EF7120502A9 /* PH0 = +3.446633983585721261456e-01 */ + .quad 0x3FEC32D951E56E6F /* P1 = +8.812071418319202070776e-01 */ + .quad 0xBFD370255FC004F8 /* P2 = -3.037198481616338996824e-01 */ + .quad 0xBFC832F0EBC6BB41 /* P3 = -1.890545989276351359107e-01 */ + .quad 0x3FC54C99A0FF432F /* P4 = +1.664001499289269127540e-01 */ + .quad 0x3F99DAC0CC283C18 /* P5 = +2.524853941036661688369e-02 */ + .quad 0xBFB227B3896A026D /* P6 = -7.091829399906553280461e-02 */ + .quad 0x3F84663364E1FB19 /* P7 = +9.960557476231411602383e-03 */ + .quad 0x3F9922D70DE07C57 /* P8 = +2.454696676442965935283e-02 */ + .quad 0xBF85C4A4EB6F86BC /* P9 = -1.062897532932837635222e-02 */ + .quad 0xBF7AAB61214FFE17 /* P10 = -6.511096396024671890972e-03 */ + .quad 0xBFD7000000000000 /* B = -.359375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3BFE67F266843B2C /* PL0 = +1.030196791298162288777e-19 */ + .quad 0x3FD7CD3115FC0F16 /* PH0 = +3.718989100163850869407e-01 */ + .quad 0x3FEB92F96CCC2C5B /* P1 = +8.616912007286247079761e-01 */ + .quad 0xBFD4827320135092 /* P2 = -3.204620183216856200247e-01 */ + .quad 0xBFC582B15550168A /* P3 = -1.680509249273891977521e-01 */ + .quad 0x3FC5AC3B9A2E4C31 /* P4 = +1.693186285816366254244e-01 */ + .quad 0x3F88FA599FCADAFB /* P5 = +1.219625491044728129762e-02 */ + .quad 0xBFB16EC8F5CA169E /* P6 = -6.809669495313605642174e-02 */ + .quad 0x3F90140EFC748BBE /* P7 = +1.570151725639922719844e-02 */ + .quad 0x3F95CFC49C1A28DC /* P8 = +2.130038454792147768770e-02 */ + .quad 0xBF8946ED8B1BF454 /* P9 = -1.234231549050882816697e-02 */ + .quad 0xBF7239E55C1DD50F /* P10 = -4.449745117985472755606e-03 */ + .quad 0xBFD9000000000000 /* B = -.390625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6412330191189C /* PL0 = +8.704448096175471149661e-18 */ + .quad 0x3FD9812B3B03F0A5 /* PH0 = +3.985088421175169703936e-01 */ + .quad 0x3FEAEB08C3C0E84D /* P1 = +8.411907027541559254748e-01 */ + .quad 0xBFD57446B1BC46CF /* P2 = -3.352219329545790787820e-01 */ + .quad 0xBFC2CA9ABC0444AD /* P3 = -1.468079965639267634401e-01 */ + .quad 0x3FC5CA95F9460D18 /* P4 = +1.702449290424759093710e-01 */ + .quad 0xBF2C2DAA35DD05C3 /* P5 = -2.149839664813813012186e-04 */ + .quad 0xBFB069A516EEB75D /* P6 = -6.411201295733578195472e-02 */ + .quad 0x3F9512716416FDC7 /* P7 = +2.057816670798986720058e-02 */ + .quad 0x3F921630CB1319A3 /* P8 = +1.766277541607908852593e-02 */ + .quad 0xBF8B76DA2EC99526 /* P9 = -1.341028647693549562145e-02 */ + .quad 0xBF63A97474A161E4 /* P10 = -2.400138332671485493040e-03 */ + .quad 0xBFDB000000000000 /* B = -.421875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C89B79F5783381C /* PL0 = +4.461236087774530799537e-17 */ + .quad 0x3FDB2A6C993B829D /* PH0 = +4.244643684778937609003e-01 */ + .quad 0x3FEA3C0C1FBA328C /* P1 = +8.198299998926627915155e-01 */ + .quad 0xBFD6457212F78DE0 /* P2 = -3.479886231636708581604e-01 */ + .quad 0xBFC0129BDA380A66 /* P3 = -1.255678954622282824818e-01 */ + .quad 0x3FC5AB77F388FBDE /* P4 = +1.692953051696965507089e-01 */ + .quad 0xBF8822F3A6CADB7C /* P5 = -1.178541519889874597783e-02 */ + .quad 0xBFAE4A876370A4BD /* P6 = -5.916236008517603590739e-02 */ + .quad 0x3F991A89BC3B7710 /* P7 = +2.451529704455085335710e-02 */ + .quad 0x3F8C4A4328204D4B /* P8 = +1.381351915555364098800e-02 */ + .quad 0xBF8C5F921D01EC0B /* P9 = -1.385416174911393178490e-02 */ + .quad 0xBF3EE844C5B79FB8 /* P10 = -4.716079617694784908234e-04 */ + .quad 0xBFDD000000000000 /* B = -.453125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C73FA437AD7AD87 /* PL0 = +1.732779905745858845932e-17 */ + .quad 0x3FDCC88C9902CF45 /* PH0 = +4.497405523536495697279e-01 */ + .quad 0x3FE9870845162D1D /* P1 = +7.977334355686341748810e-01 */ + .quad 0xBFD6F62358F73DA8 /* P2 = -3.587730759436120677668e-01 */ + .quad 0xBFBAC4345D675FE1 /* P3 = -1.045563438450467661101e-01 */ + .quad 0x3FC5539DA8287019 /* P4 = +1.666142531474868131862e-01 */ + .quad 0xBF96E3E0DC04A09F /* P5 = -2.235366194614185212822e-02 */ + .quad 0xBFAB5EC7147C207D /* P6 = -5.345747113284546871398e-02 */ + .quad 0x3F9C24166FFA7A58 /* P7 = +2.748141344511120915667e-02 */ + .quad 0x3F8451B907819844 /* P8 = +9.921498815128277696693e-03 */ + .quad 0xBF8C1C6D19191FCB /* P9 = -1.372609360545586670239e-02 */ + .quad 0x3F547372DF72E35A /* P10 = +1.248228245272117756098e-03 */ + .quad 0xBFDF000000000000 /* B = -.484375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C848FE06EE49950 /* PL0 = +3.566941590788961528958e-17 */ + .quad 0x3FDF20211A36475D /* PH0 = +4.863360172249622803697e-01 */ + .quad 0x3FE86E67E6B80AC2 /* P1 = +7.634772783497611574659e-01 */ + .quad 0xBFD7C37C55474D9B /* P2 = -3.713064987943767913461e-01 */ + .quad 0xBFB2EBF15F3CB036 /* P3 = -7.391270232318521952684e-02 */ + .quad 0x3FC4718C8EF6E3AA /* P4 = +1.597152422016539530950e-01 */ + .quad 0xBFA277F8394E9B07 /* P5 = -3.607154559658991932071e-02 */ + .quad 0xBFA680312AB207E3 /* P6 = -4.394677778419955009224e-02 */ + .quad 0x3F9EDC9A8B57E286 /* P7 = +3.013841128810892143223e-02 */ + .quad 0x3F71B8C5E648EAF6 /* P8 = +4.326603932492947851719e-03 */ + .quad 0xBF89DB218356730C /* P9 = -1.262499029217558458029e-02 */ + .quad 0x3F6B05728E6EBC8E /* P10 = +3.298496001171330815865e-03 */ + .quad 0xBFE1000000000000 /* B = -.53125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C8429831EDD94DE /* PL0 = +3.497576705878673192147e-17 */ + .quad 0x3FE10AF47E0BF610 /* PH0 = +5.325872861719194162333e-01 */ + .quad 0x3FE6EC5879F87EEE /* P1 = +7.163507826080299761242e-01 */ + .quad 0xBFD86AD001BFE200 /* P2 = -3.815193192563413204129e-01 */ + .quad 0xBFA239045B661385 /* P3 = -3.559125533778398983564e-02 */ + .quad 0x3FC2B4572D9CC147 /* P4 = +1.461285565105845078038e-01 */ + .quad 0xBFA99F4F01740705 /* P5 = -5.004355328311586406115e-02 */ + .quad 0xBF9F449C484F4879 /* P6 = -3.053516570418721511214e-02 */ + .quad 0x3F9F5F42169D7DDE /* P7 = +3.063681853325116830798e-02 */ + .quad 0xBF6111B1BA632A97 /* P8 = -2.083632588527460989469e-03 */ + .quad 0xBF84725FBE5B6E61 /* P9 = -9.983776089419639342530e-03 */ + .quad 0x3F7438A2986CFA9C /* P10 = +4.936823976832951342488e-03 */ + .quad 0xBFE3000000000000 /* B = -.59375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6BE9160BFB3505 /* PL0 = +1.210424670976053242391e-17 */ + .quad 0x3FE26D76F73233C7 /* PH0 = +5.758623912857893101247e-01 */ + .quad 0x3FE56363B5B93937 /* P1 = +6.683825063026124740752e-01 */ + .quad 0xBFD8A2244B27297E /* P2 = -3.848963483730115724200e-01 */ + .quad 0xBF52CA2F101EEF63 /* P3 = -1.146837196286797844817e-03 */ + .quad 0x3FC081BC342243AD /* P4 = +1.289592032012739958675e-01 */ + .quad 0xBFAE38DB4A932344 /* P5 = -5.902753148399722719732e-02 */ + .quad 0xBF91F814D4AE90C6 /* P6 = -1.754791782481459457885e-02 */ + .quad 0x3F9D056AE193C4F3 /* P7 = +2.834097863973723355792e-02 */ + .quad 0xBF7BD0B502D8F3A0 /* P8 = -6.790835451792626336974e-03 */ + .quad 0xBF7B763F7BB8AE2F /* P9 = -6.704566938008179114124e-03 */ + .quad 0x3F76036F42D9AB69 /* P10 = +5.374369252971835729099e-03 */ + .quad 0xBFE5000000000000 /* B = -.65625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C8B64AF0450486E /* PL0 = +4.751979286662385162741e-17 */ + .quad 0x3FE3B75F8BCB742D /* PH0 = +6.161344271055263499548e-01 */ + .quad 0x3FE3DA23BC12369F /* P1 = +6.203783677353447780947e-01 */ + .quad 0xBFD8768FF4B46416 /* P2 = -3.822364701932782367281e-01 */ + .quad 0x3F9D67CB8AD9CB1A /* P3 = +2.871625933625941117406e-02 */ + .quad 0x3FBC168CB7827DF4 /* P4 = +1.097190807363331305006e-01 */ + .quad 0xBFB03A2B83C9272E /* P5 = -6.338760344911228324430e-02 */ + .quad 0xBF789FEB595297DC /* P6 = -6.011885959344067548074e-03 */ + .quad 0x3F98BD01B4C335E7 /* P7 = +2.415850320612902513532e-02 */ + .quad 0xBF83BADC303D6535 /* P8 = -9.633751127398152979976e-03 */ + .quad 0xBF6C54E7A1C1E3F3 /* P9 = -3.458454519258407989501e-03 */ + .quad 0x3F7408394B7EF3E7 /* P10 = +4.890655334688332484537e-03 */ + .quad 0xBFE7000000000000 /* B = -.71875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6A48557F6E0D3E /* PL0 = +1.139824111505584215867e-17 */ + .quad 0x3FE4E8D895B010DC /* PH0 = +6.534235881413468227663e-01 */ + .quad 0x3FE25652FAAF8A73 /* P1 = +5.730376144604875448991e-01 */ + .quad 0xBFD7F6C3A57C444B /* P2 = -3.744362941807295084434e-01 */ + .quad 0x3FAB7866E3F99EBE /* P3 = +5.365296872042567001598e-02 */ + .quad 0x3FB6FA1DF47CCD40 /* P4 = +8.975398272450707099784e-02 */ + .quad 0xBFB05508D3741B8E /* P5 = -6.379752314033580026840e-02 */ + .quad 0x3F6C3EFDF7BB279C /* P6 = +3.448005705512137236209e-03 */ + .quad 0x3F9372BADD6D3E27 /* P7 = +1.899234749299530050806e-02 */ + .quad 0xBF860FD5AE65F3DA /* P8 = -1.077238977881649471165e-02 */ + .quad 0xBF47266FFB07E628 /* P9 = -7.064863949032872448118e-04 */ + .quad 0x3F6F9763992C2A05 /* P10 = +3.856367614735181120799e-03 */ + .quad 0xBFE9000000000000 /* B = -.78125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6BB6A2B194E3AB /* PL0 = +1.201878007209462528697e-17 */ + .quad 0x3FE602609AAE7C22 /* PH0 = +6.877902051090851731630e-01 */ + .quad 0x3FE0DCBAFE191C7F /* P1 = +5.269446337560025312137e-01 */ + .quad 0xBFD732028428A9FB /* P2 = -3.624273577321727538225e-01 */ + .quad 0x3FB2D92389BE065B /* P3 = +7.362577545975439796588e-02 */ + .quad 0x3FB1F6A9C8C49993 /* P4 = +7.017003203927733370937e-02 */ + .quad 0xBFAF47C0B50B56EE /* P5 = -6.109430513394707378526e-02 */ + .quad 0x3F85A8EDD1356223 /* P6 = +1.057611269668352068104e-02 */ + .quad 0x3F8BE05C5CD1B4FA /* P7 = +1.361152799855823798207e-02 */ + .quad 0xBF85A0EFE4552F76 /* P8 = -1.056086936537046752272e-02 */ + .quad 0x3F559F2A6A356194 /* P9 = +1.319686337259627831943e-03 */ + .quad 0x3F6576F5E989208D /* P10 = +2.620201394425042596201e-03 */ + .quad 0xBFEB000000000000 /* B = -.84375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C80328BD86C8B74 /* PL0 = +2.809809047161267929701e-17 */ + .quad 0x3FE704BB1B7FCB81 /* PH0 = +7.193275010198335595035e-01 */ + .quad 0x3FDEE264AAD6C40C /* P1 = +4.825679462765613089739e-01 */ + .quad 0xBFD637493CE659F1 /* P2 = -3.471243948673921548357e-01 */ + .quad 0x3FB6BE3A3DEE6F4A /* P3 = +8.884014141079635303208e-02 */ + .quad 0x3FAA85EB6470AC0F /* P4 = +5.180297471118688523488e-02 */ + .quad 0xBFACC0146EA4858D /* P5 = -5.615295267694895314457e-02 */ + .quad 0x3F8F8FB683CDDAC5 /* P6 = +1.541082944616557159055e-02 */ + .quad 0x3F819515DEE2CB91 /* P7 = +8.585139145315585602547e-03 */ + .quad 0xBF834E45E6AF9EA1 /* P8 = -9.426637747267209169415e-03 */ + .quad 0x3F65250F197CA56D /* P9 = +2.581147662472352252568e-03 */ + .quad 0x3F57A766026D036C /* P10 = +1.443719500187702367690e-03 */ + .quad 0xBFED000000000000 /* B = -.90625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C716F7EEF7B61AD /* PL0 = +1.512291215142578135651e-17 */ + .quad 0x3FE7F0E1A4CD846E /* PH0 = +7.481544703297353660076e-01 */ + .quad 0x3FDC2D4CC872DC09 /* P1 = +4.402648885256331012598e-01 */ + .quad 0xBFD514A99F92ED53 /* P2 = -3.293861444796750250530e-01 */ + .quad 0x3FB9846A6CF2F337 /* P3 = +9.967675361526749494844e-02 */ + .quad 0x3FA20896939AB161 /* P4 = +3.522177268800664413493e-02 */ + .quad 0xBFA97E801F31EE0D /* P5 = -4.979324703978358553405e-02 */ + .quad 0x3F92A11F47B82085 /* P6 = +1.819275737037219740638e-02 */ + .quad 0x3F717D70FE289C34 /* P7 = +4.270020845559097605514e-03 */ + .quad 0xBF7FDCF1D3F6CE2D /* P8 = -7.779068604054678540132e-03 */ + .quad 0x3F69F607E81AF6B6 /* P9 = +3.169074480722534625181e-03 */ + .quad 0x3F3F925C80D0F889 /* P10 = +4.817462766516585511824e-04 */ + .quad 0xBFEF000000000000 /* B = -.96875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C931A11D7E8606E /* PL0 = +6.627280241435322692188e-17 */ + .quad 0x3FE92BFB370D9B71 /* PH0 = +7.866188121086975515439e-01 */ + .quad 0x3FD866160E454111 /* P1 = +3.812308444367014680480e-01 */ + .quad 0xBFD33149F3801DBA /* P2 = -2.998833539899937679796e-01 */ + .quad 0x3FBBDB6D4C949899 /* P3 = +1.088169395412442909023e-01 */ + .quad 0x3F8D6AB2A74B9343 /* P4 = +1.436366627735597372494e-02 */ + .quad 0xBFA404D1047C5D72 /* P5 = -3.909924678571997970917e-02 */ + .quad 0x3F93C47D9ACCD919 /* P6 = +1.930423981976856424661e-02 */ + .quad 0xBF41B755642CFF1B /* P7 = -5.406538915408738478158e-04 */ + .quad 0xBF74B5301AA1E788 /* P8 = -5.055606752756853900641e-03 */ + .quad 0x3F69A84C5B2A3E68 /* P9 = +3.132008679422249529120e-03 */ + .quad 0xBF3CF47830328C11 /* P10 = -4.418176105877589308931e-04 */ + .quad 0xBFF1000000000000 /* B = -1.0625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C884D471B8FD396 /* PL0 = +4.215701792312937090514e-17 */ + .quad 0x3FEA8DBCBC31897A /* PH0 = +8.298019099859594849278e-01 */ + .quad 0x3FD3EE730537C8EA /* P1 = +3.114287901836535219818e-01 */ + .quad 0xBFD08A05AD27CE32 /* P2 = -2.584242049190123217982e-01 */ + .quad 0x3FBC5255406F84B6 /* P3 = +1.106313021005175045399e-01 */ + .quad 0xBF772FA2F633AA5E /* P4 = -5.660664147607434209241e-03 */ + .quad 0xBF99DD8E4C473FC4 /* P5 = -2.525923100057504533247e-02 */ + .quad 0x3F9183C935B6495D /* P6 = +1.710428610165003372069e-02 */ + .quad 0xBF70471A3A591480 /* P7 = -3.974058583087303228038e-03 */ + .quad 0xBF603DDD4DEBB9A4 /* P8 = -1.982624278176818987264e-03 */ + .quad 0x3F62591E44D3C17F /* P9 = +2.239760512218135956425e-03 */ + .quad 0xBF4C195D3A9B1AB4 /* P10 = -8.575158328419569430544e-04 */ + .quad 0xBFF3000000000000 /* B = -1.1875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C90DD1C9BFF7F64 /* PL0 = +5.850777430004479798187e-17 */ + .quad 0x3FEBAD50A4A68BC1 /* PH0 = +8.649066177207417327466e-01 */ + .quad 0x3FD01FBA72CEE1A5 /* P1 = +2.519365426228666233893e-01 */ + .quad 0xBFCBE432F647C4D6 /* P2 = -2.179015829602010702633e-01 */ + .quad 0x3FBABF92B6E5AC73 /* P3 = +1.044856735731387955105e-01 */ + .quad 0xBF922983AA24E217 /* P4 = -1.773648954369563555378e-02 */ + .quad 0xBF8C72214C14E23A /* P5 = -1.388956082756564056328e-02 */ + .quad 0x3F8ACB4D1F388E8B /* P6 = +1.308307887581540972153e-02 */ + .quad 0xBF740EF8B4A2EE3B /* P7 = -4.897090441029978580995e-03 */ + .quad 0xBF0EA9F30C8DC900 /* P8 = -5.848668076326342477133e-05 */ + .quad 0x3F53CC40D18713AE /* P9 = +1.208365725788622757410e-03 */ + .quad 0xBF4848B86029CBA1 /* P10 = -7.410908004444779592485e-04 */ + .quad 0xBFF5000000000000 /* B = -1.3125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C8FB61781D22681 /* PL0 = +5.501032995458057064843e-17 */ + .quad 0x3FEC950A3340C8BF /* PH0 = +8.931933404003514764824e-01 */ + .quad 0x3FC9E1DFFD385423 /* P1 = +2.022056566644617586005e-01 */ + .quad 0xBFC71E2FF88EBA23 /* P2 = -1.806087459239772032583e-01 */ + .quad 0x3FB80AEBD07AB5BA /* P3 = +9.391664352252506838449e-02 */ + .quad 0xBF98404E27EAE6ED /* P4 = -2.368280523908243895884e-02 */ + .quad 0xBF772DA520B5006E /* P5 = -5.658764868087568802107e-03 */ + .quad 0x3F824C9268AF9423 /* P6 = +8.935111827620250551925e-03 */ + .quad 0xBF722AE76D206AE3 /* P7 = -4.435447701349490160113e-03 */ + .quad 0x3F4B807F56298D5E /* P8 = +8.392926941493230644497e-04 */ + .quad 0x3F3D71027DF95D2A /* P9 = +4.492407879061627603159e-04 */ + .quad 0xBF3EBD17676755FB /* P10 = -4.690343988874298905483e-04 */ + .quad 0xBFF7000000000000 /* B = -1.4375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C95393C63CE8224 /* PL0 = +7.363407705201031038415e-17 */ + .quad 0x3FED4E6F464286B0 /* PH0 = +9.158245441687622445670e-01 */ + .quad 0x3FC4A45842B7DE1E /* P1 = +1.612654042980787191461e-01 */ + .quad 0xBFC2E7885AFDD3D0 /* P2 = -1.476908153814791087327e-01 */ + .quad 0x3FB4DD6DD51D3FEB /* P3 = +8.150373890862254580204e-02 */ + .quad 0xBF9A05D3ADAB489C /* P4 = -2.541285274021075503042e-02 */ + .quad 0xBF3459B643B4995C /* P5 = -3.105230313899165257622e-04 */ + .quad 0x3F766B30745F2E3A /* P6 = +5.473317409222350365811e-03 */ + .quad 0xBF6C2C891E555BDF /* P7 = -3.439204988051155730940e-03 */ + .quad 0x3F5194F30D6C576D /* P8 = +1.073109966176012791522e-03 */ + .quad 0x3EF4DBB43C3132A2 /* P9 = +1.989194766975849961365e-05 */ + .quad 0xBF2E45EBAB3C15A0 /* P10 = -2.309656316514087783666e-04 */ + .quad 0xBFF9000000000000 /* B = -1.5625 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C75111669651DAA /* PL0 = +1.827249135453834384396e-17 */ + .quad 0x3FEDE1EB5937518F /* PH0 = +9.338280432225917193634e-01 */ + .quad 0x3FC06129C7C8EBB1 /* P1 = +1.279651856910653382507e-01 */ + .quad 0xBFBE9763041064E1 /* P2 = -1.194974789545031421774e-01 */ + .quad 0x3FB1A5B9F9113928 /* P3 = +6.893503504509068635308e-02 */ + .quad 0xBF992145039F9AFE /* P4 = -2.454097590080105816526e-02 */ + .quad 0x3F66CB116EA49C89 /* P5 = +2.782377288116648315142e-03 */ + .quad 0x3F67F972FDF30001 /* P6 = +2.926563829163342740100e-03 */ + .quad 0xBF63A7B5975F02F3 /* P7 = -2.399305983061922438601e-03 */ + .quad 0x3F4FDE7B8777F4C8 /* P8 = +9.725669069095216373599e-04 */ + .quad 0xBF25918876626BA4 /* P9 = -1.645545082212515656240e-04 */ + .quad 0xBF1495123C991F00 /* P10 = -7.851527984669912693674e-05 */ + .quad 0xBFFB000000000000 /* B = -1.6875 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C9F29A5B7426D27 /* PL0 = +1.081172820484012446345e-16 */ + .quad 0x3FEE56B6F3EFABFC /* PH0 = +9.480852856044061915952e-01 */ + .quad 0x3FB9E3EFD94BB9FC /* P1 = +1.011342912204113371518e-01 */ + .quad 0xBFB88BD9760FECA7 /* P2 = -9.588393337610288420285e-02 */ + .quad 0x3FAD48A0350B3ACF /* P3 = +5.719471595295077387313e-02 */ + .quad 0xBF96CC6A5110F129 /* P4 = -2.226415748394675367257e-02 */ + .quad 0x3F71934687170384 /* P5 = +4.290843485649345772606e-03 */ + .quad 0x3F5407BAF73B3DF9 /* P6 = +1.222546180475235334287e-03 */ + .quad 0xBF591B626C0646DD /* P7 = -1.532407870488964407324e-03 */ + .quad 0x3F48B0E1DD283558 /* P8 = +7.535078860329375669277e-04 */ + .quad 0xBF2B322292840D2B /* P9 = -2.074877932117605962646e-04 */ + .quad 0xBE99E4061120C741 /* P10 = -3.858017559892704559672e-07 */ + .quad 0xBFFD000000000000 /* B = -1.8125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C6AF8C2041C67CD /* PL0 = +1.169711482626385762338e-17 */ + .quad 0x3FEEB2DFEDD5EC93 /* PH0 = +9.593352933146824801369e-01 */ + .quad 0x3FB465A205CFB638 /* P1 = +7.967579500083210999681e-02 */ + .quad 0xBFB3914BF68D39FF /* P2 = -7.643580216720378576778e-02 */ + .quad 0x3FA7F21A08C5C734 /* P3 = +4.676896435820623621673e-02 */ + .quad 0xBF93DA9560EA9960 /* P4 = -1.938851741820124550772e-02 */ + .quad 0x3F73953FEC62820E /* P5 = +4.781007481284861359820e-03 */ + .quad 0x3F2749D5E1273E3C /* P6 = +1.776765426044646108071e-04 */ + .quad 0xBF4D46B0B498CE5A /* P7 = -8.934367007839658352859e-04 */ + .quad 0x3F4153D680E1F4C4 /* P8 = +5.287930851093571206574e-04 */ + .quad 0xBF28477014ECA6A2 /* P9 = -1.852344816708944640949e-04 */ + .quad 0x3EFFAC54E07CEB4B /* P10 = +3.020588886147182143902e-05 */ + .quad 0xBFFF000000000000 /* B = -1.9375 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x0000000000000000 /* Align value = +0 */ + .quad 0x3C7A8AF2BB2231F2 /* PL0 = +2.302217989249372577466e-17 */ + .quad 0x3FEF1994DF724FC8 /* PH0 = +9.718727459135090285258e-01 */ + .quad 0x3FAC65B1BC0C9D58 /* P1 = +5.546336575053583942603e-02 */ + .quad 0xBFAB9937BDA747C8 /* P2 = -5.390333356957871365599e-02 */ + .quad 0x3FA15B42D9EF931C /* P3 = +3.389939222669210777241e-02 */ + .quad 0xBF8EACD8E8507A3C /* P4 = -1.497811755149058215502e-02 */ + .quad 0x3F7263A15721C682 /* P5 = +4.489546046998806349050e-03 */ + .quad 0xBF42A032ACDC3B32 /* P6 = -5.684134900735048121829e-04 */ + .quad 0xBF3431E79B5AD185 /* P7 = -3.081503340170088810438e-04 */ + .quad 0x3F31B51667C7DF5E /* P8 = +2.701930714290502424828e-04 */ + .quad 0xBF1F8709579250AD /* P9 = -1.202678157759563704341e-04 */ + .quad 0x3F01ED8ED1BF9595 /* P10 = +3.419487094883790833778e-05 */ + .quad 0xC001000000000000 /* B = -2.125 */ + .quad 0x3FF0000000000000 /* A = +1 */ + .quad 0x0