From patchwork Wed Nov 24 19:37:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Pandey X-Patchwork-Id: 48083 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A86DA3858433 for ; Wed, 24 Nov 2021 19:55:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A86DA3858433 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1637783738; bh=KGi1KT3UsIYw29at7HGx3EHiRDuYvTBzacUx0aKI9tA=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=hI2pv+2DwZxtClErQgFa6mmIFNr5/RGlj1aRnqs/ViQkQyTTGZ18NDsPnxa94RzOr vnIksDDzKv99ZsX0VtZyUppDfUHRn5J30UO+uH8GC73jNhbRkViRlH4R7wz8dAIKJm AGCRCzzSEjIuUZdFZJIsLzBn2b8Gw4dJlfDtSRfg= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by sourceware.org (Postfix) with ESMTPS id A79D13857C66 for ; Wed, 24 Nov 2021 19:38:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A79D13857C66 X-IronPort-AV: E=McAfee;i="6200,9189,10178"; a="222581823" X-IronPort-AV: E=Sophos;i="5.87,261,1631602800"; d="scan'208";a="222581823" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Nov 2021 11:38:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,261,1631602800"; d="scan'208";a="510002836" Received: from scymds02.sc.intel.com ([10.82.73.244]) by orsmga008.jf.intel.com with ESMTP; 24 Nov 2021 11:38:10 -0800 Received: from gskx-1.sc.intel.com (gskx-1.sc.intel.com [172.25.149.211]) by scymds02.sc.intel.com with ESMTP id 1AOJc7X0021555; Wed, 24 Nov 2021 11:38:09 -0800 To: libc-alpha@sourceware.org Subject: [PATCH 13/42] x86-64: Add vector atanh/atanhf implementation to libmvec Date: Wed, 24 Nov 2021 11:37:38 -0800 Message-Id: <20211124193807.2093208-14-skpgkp2@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211124193807.2093208-1-skpgkp2@gmail.com> References: <20211124193807.2093208-1-skpgkp2@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-6.7 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, FORGED_GMAIL_RCVD, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_SHORT, KAM_STOCKGEN, LOTS_OF_MONEY, NML_ADSP_CUSTOM_MED, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sunil K Pandey via Libc-alpha From: Sunil Pandey Reply-To: Sunil K Pandey Cc: andrey.kolesov@intel.com Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Implement vectorized atanh/atanhf containing SSE, AVX, AVX2 and AVX512 versions for libmvec as per vector ABI. It also contains accuracy and ABI tests for vector atanh/atanhf with regenerated ulps. --- bits/libm-simd-decl-stubs.h | 11 + math/bits/mathcalls.h | 2 +- .../unix/sysv/linux/x86_64/libmvec.abilist | 8 + sysdeps/x86/fpu/bits/math-vector.h | 4 + sysdeps/x86_64/fpu/Makeconfig | 1 + sysdeps/x86_64/fpu/Versions | 2 + sysdeps/x86_64/fpu/libm-test-ulps | 20 + .../fpu/multiarch/svml_d_atanh2_core-sse2.S | 20 + .../x86_64/fpu/multiarch/svml_d_atanh2_core.c | 27 + .../fpu/multiarch/svml_d_atanh2_core_sse4.S | 5501 +++++++++++++++++ .../fpu/multiarch/svml_d_atanh4_core-sse.S | 20 + .../x86_64/fpu/multiarch/svml_d_atanh4_core.c | 27 + .../fpu/multiarch/svml_d_atanh4_core_avx2.S | 5080 +++++++++++++++ .../fpu/multiarch/svml_d_atanh8_core-avx2.S | 20 + .../x86_64/fpu/multiarch/svml_d_atanh8_core.c | 27 + .../fpu/multiarch/svml_d_atanh8_core_avx512.S | 632 ++ .../fpu/multiarch/svml_s_atanhf16_core-avx2.S | 20 + .../fpu/multiarch/svml_s_atanhf16_core.c | 28 + .../multiarch/svml_s_atanhf16_core_avx512.S | 531 ++ .../fpu/multiarch/svml_s_atanhf4_core-sse2.S | 20 + .../fpu/multiarch/svml_s_atanhf4_core.c | 28 + .../fpu/multiarch/svml_s_atanhf4_core_sse4.S | 2536 ++++++++ .../fpu/multiarch/svml_s_atanhf8_core-sse.S | 20 + .../fpu/multiarch/svml_s_atanhf8_core.c | 28 + .../fpu/multiarch/svml_s_atanhf8_core_avx2.S | 2131 +++++++ sysdeps/x86_64/fpu/svml_d_atanh2_core.S | 29 + sysdeps/x86_64/fpu/svml_d_atanh4_core.S | 29 + sysdeps/x86_64/fpu/svml_d_atanh4_core_avx.S | 25 + sysdeps/x86_64/fpu/svml_d_atanh8_core.S | 25 + sysdeps/x86_64/fpu/svml_s_atanhf16_core.S | 25 + sysdeps/x86_64/fpu/svml_s_atanhf4_core.S | 29 + sysdeps/x86_64/fpu/svml_s_atanhf8_core.S | 29 + sysdeps/x86_64/fpu/svml_s_atanhf8_core_avx.S | 25 + .../fpu/test-double-libmvec-atanh-avx.c | 1 + .../fpu/test-double-libmvec-atanh-avx2.c | 1 + .../fpu/test-double-libmvec-atanh-avx512f.c | 1 + .../x86_64/fpu/test-double-libmvec-atanh.c | 3 + .../x86_64/fpu/test-double-vlen2-wrappers.c | 1 + .../fpu/test-double-vlen4-avx2-wrappers.c | 1 + .../x86_64/fpu/test-double-vlen4-wrappers.c | 1 + .../x86_64/fpu/test-double-vlen8-wrappers.c | 1 + .../fpu/test-float-libmvec-atanhf-avx.c | 1 + .../fpu/test-float-libmvec-atanhf-avx2.c | 1 + .../fpu/test-float-libmvec-atanhf-avx512f.c | 1 + .../x86_64/fpu/test-float-libmvec-atanhf.c | 3 + .../x86_64/fpu/test-float-vlen16-wrappers.c | 1 + .../x86_64/fpu/test-float-vlen4-wrappers.c | 1 + .../fpu/test-float-vlen8-avx2-wrappers.c | 1 + .../x86_64/fpu/test-float-vlen8-wrappers.c | 1 + 49 files changed, 16979 insertions(+), 1 deletion(-) create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/svml_d_atanh2_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_atanh4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_atanh4_core_avx.S create mode 100644 sysdeps/x86_64/fpu/svml_d_atanh8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_atanhf16_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_atanhf4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_atanhf8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_atanhf8_core_avx.S create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-atanh.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-atanhf.c diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h index bd8019839c..591f0850ca 100644 --- a/bits/libm-simd-decl-stubs.h +++ b/bits/libm-simd-decl-stubs.h @@ -164,4 +164,15 @@ #define __DECL_SIMD_atan2f32x #define __DECL_SIMD_atan2f64x #define __DECL_SIMD_atan2f128x + +#define __DECL_SIMD_atanh +#define __DECL_SIMD_atanhf +#define __DECL_SIMD_atanhl +#define __DECL_SIMD_atanhf16 +#define __DECL_SIMD_atanhf32 +#define __DECL_SIMD_atanhf64 +#define __DECL_SIMD_atanhf128 +#define __DECL_SIMD_atanhf32x +#define __DECL_SIMD_atanhf64x +#define __DECL_SIMD_atanhf128x #endif diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index b1b11b74ee..be18431fd4 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -86,7 +86,7 @@ __MATHCALL_VEC (acosh,, (_Mdouble_ __x)); /* Hyperbolic arc sine of X. */ __MATHCALL_VEC (asinh,, (_Mdouble_ __x)); /* Hyperbolic arc tangent of X. */ -__MATHCALL (atanh,, (_Mdouble_ __x)); +__MATHCALL_VEC (atanh,, (_Mdouble_ __x)); #endif /* Exponential and logarithmic functions. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist index 9b47e83aec..54489301ac 100644 --- a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist @@ -51,46 +51,54 @@ GLIBC_2.35 _ZGVbN2v_acosh F GLIBC_2.35 _ZGVbN2v_asin F GLIBC_2.35 _ZGVbN2v_asinh F GLIBC_2.35 _ZGVbN2v_atan F +GLIBC_2.35 _ZGVbN2v_atanh F GLIBC_2.35 _ZGVbN2vv_atan2 F GLIBC_2.35 _ZGVbN4v_acosf F GLIBC_2.35 _ZGVbN4v_acoshf F GLIBC_2.35 _ZGVbN4v_asinf F GLIBC_2.35 _ZGVbN4v_asinhf F GLIBC_2.35 _ZGVbN4v_atanf F +GLIBC_2.35 _ZGVbN4v_atanhf F GLIBC_2.35 _ZGVbN4vv_atan2f F GLIBC_2.35 _ZGVcN4v_acos F GLIBC_2.35 _ZGVcN4v_acosh F GLIBC_2.35 _ZGVcN4v_asin F GLIBC_2.35 _ZGVcN4v_asinh F GLIBC_2.35 _ZGVcN4v_atan F +GLIBC_2.35 _ZGVcN4v_atanh F GLIBC_2.35 _ZGVcN4vv_atan2 F GLIBC_2.35 _ZGVcN8v_acosf F GLIBC_2.35 _ZGVcN8v_acoshf F GLIBC_2.35 _ZGVcN8v_asinf F GLIBC_2.35 _ZGVcN8v_asinhf F GLIBC_2.35 _ZGVcN8v_atanf F +GLIBC_2.35 _ZGVcN8v_atanhf F GLIBC_2.35 _ZGVcN8vv_atan2f F GLIBC_2.35 _ZGVdN4v_acos F GLIBC_2.35 _ZGVdN4v_acosh F GLIBC_2.35 _ZGVdN4v_asin F GLIBC_2.35 _ZGVdN4v_asinh F GLIBC_2.35 _ZGVdN4v_atan F +GLIBC_2.35 _ZGVdN4v_atanh F GLIBC_2.35 _ZGVdN4vv_atan2 F GLIBC_2.35 _ZGVdN8v_acosf F GLIBC_2.35 _ZGVdN8v_acoshf F GLIBC_2.35 _ZGVdN8v_asinf F GLIBC_2.35 _ZGVdN8v_asinhf F GLIBC_2.35 _ZGVdN8v_atanf F +GLIBC_2.35 _ZGVdN8v_atanhf F GLIBC_2.35 _ZGVdN8vv_atan2f F GLIBC_2.35 _ZGVeN16v_acosf F GLIBC_2.35 _ZGVeN16v_acoshf F GLIBC_2.35 _ZGVeN16v_asinf F GLIBC_2.35 _ZGVeN16v_asinhf F GLIBC_2.35 _ZGVeN16v_atanf F +GLIBC_2.35 _ZGVeN16v_atanhf F GLIBC_2.35 _ZGVeN16vv_atan2f F GLIBC_2.35 _ZGVeN8v_acos F GLIBC_2.35 _ZGVeN8v_acosh F GLIBC_2.35 _ZGVeN8v_asin F GLIBC_2.35 _ZGVeN8v_asinh F GLIBC_2.35 _ZGVeN8v_atan F +GLIBC_2.35 _ZGVeN8v_atanh F GLIBC_2.35 _ZGVeN8vv_atan2 F diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h index 67a326566c..753b6ff9d1 100644 --- a/sysdeps/x86/fpu/bits/math-vector.h +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -82,6 +82,10 @@ # define __DECL_SIMD_atan2 __DECL_SIMD_x86_64 # undef __DECL_SIMD_atan2f # define __DECL_SIMD_atan2f __DECL_SIMD_x86_64 +# undef __DECL_SIMD_atanh +# define __DECL_SIMD_atanh __DECL_SIMD_x86_64 +# undef __DECL_SIMD_atanhf +# define __DECL_SIMD_atanhf __DECL_SIMD_x86_64 # endif #endif diff --git a/sysdeps/x86_64/fpu/Makeconfig b/sysdeps/x86_64/fpu/Makeconfig index 4f33886dd2..dea6989d9a 100644 --- a/sysdeps/x86_64/fpu/Makeconfig +++ b/sysdeps/x86_64/fpu/Makeconfig @@ -28,6 +28,7 @@ libmvec-funcs = \ asinh \ atan \ atan2 \ + atanh \ cos \ exp \ log \ diff --git a/sysdeps/x86_64/fpu/Versions b/sysdeps/x86_64/fpu/Versions index 57de41e864..f80889e3b5 100644 --- a/sysdeps/x86_64/fpu/Versions +++ b/sysdeps/x86_64/fpu/Versions @@ -19,12 +19,14 @@ libmvec { _ZGVbN2v_asin; _ZGVcN4v_asin; _ZGVdN4v_asin; _ZGVeN8v_asin; _ZGVbN2v_asinh; _ZGVcN4v_asinh; _ZGVdN4v_asinh; _ZGVeN8v_asinh; _ZGVbN2v_atan; _ZGVcN4v_atan; _ZGVdN4v_atan; _ZGVeN8v_atan; + _ZGVbN2v_atanh; _ZGVcN4v_atanh; _ZGVdN4v_atanh; _ZGVeN8v_atanh; _ZGVbN2vv_atan2; _ZGVcN4vv_atan2; _ZGVdN4vv_atan2; _ZGVeN8vv_atan2; _ZGVbN4v_acosf; _ZGVcN8v_acosf; _ZGVdN8v_acosf; _ZGVeN16v_acosf; _ZGVbN4v_acoshf; _ZGVcN8v_acoshf; _ZGVdN8v_acoshf; _ZGVeN16v_acoshf; _ZGVbN4v_asinf; _ZGVcN8v_asinf; _ZGVdN8v_asinf; _ZGVeN16v_asinf; _ZGVbN4v_asinhf; _ZGVcN8v_asinhf; _ZGVdN8v_asinhf; _ZGVeN16v_asinhf; _ZGVbN4v_atanf; _ZGVcN8v_atanf; _ZGVdN8v_atanf; _ZGVeN16v_atanf; + _ZGVbN4v_atanhf; _ZGVcN8v_atanhf; _ZGVdN8v_atanhf; _ZGVeN16v_atanhf; _ZGVbN4vv_atan2f; _ZGVcN8vv_atan2f; _ZGVdN8vv_atan2f; _ZGVeN16vv_atan2f; } } diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 329e7f58a2..30ac652738 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -285,6 +285,26 @@ float: 3 float128: 4 ldouble: 5 +Function: "atanh_vlen16": +float: 1 + +Function: "atanh_vlen2": +double: 1 + +Function: "atanh_vlen4": +double: 1 +float: 1 + +Function: "atanh_vlen4_avx2": +double: 1 + +Function: "atanh_vlen8": +double: 1 +float: 1 + +Function: "atanh_vlen8_avx2": +float: 1 + Function: "cabs": double: 1 float128: 1 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core-sse2.S new file mode 100644 index 0000000000..b154ab8649 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized atanh, 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_atanh _ZGVbN2v_atanh_sse2 +#include "../svml_d_atanh2_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core.c new file mode 100644 index 0000000000..138190e568 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized atanh, 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_atanh +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN2v_atanh, __GI__ZGVbN2v_atanh, __redirect__ZGVbN2v_atanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core_sse4.S new file mode 100644 index 0000000000..3768a87849 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh2_core_sse4.S @@ -0,0 +1,5501 @@ +/* Function atanh 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVbN2v_atanh_sse4) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $256, %rsp + lea -4218816+__svml_datanh_data_internal(%rip), %r8 + movups 12864+__svml_datanh_data_internal(%rip), %xmm3 + +/* Load the constant 1 and a sign mask */ + movups 12800+__svml_datanh_data_internal(%rip), %xmm5 + +/* Strip off the sign, so treat X as positive until right at the end */ + movaps %xmm3, %xmm2 + movups %xmm11, 144(%rsp) + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + movaps %xmm0, %xmm11 + andps %xmm11, %xmm2 + movaps %xmm5, %xmm0 + subpd %xmm2, %xmm0 + movups %xmm15, 96(%rsp) + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + movaps %xmm5, %xmm15 + subpd %xmm0, %xmm15 + movups %xmm14, 112(%rsp) + +/* + * Compute V = 2 * X trivially, and UHi + U_lo = 1 - X in two pieces, + * the upper part UHi being <= 41 bits long. Then we have + * atanh(X) = 1/2 * log((1 + X) / (1 - X)) = 1/2 * log1p(V / (UHi + ULo)). + */ + movaps %xmm2, %xmm1 + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movups 14400+__svml_datanh_data_internal(%rip), %xmm14 + +/* + * Check whether |X| < 1, in which case we use the main function. + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN < 1). + */ + movaps %xmm2, %xmm6 + movaps %xmm14, %xmm4 + movaps %xmm2, %xmm7 + andps %xmm0, %xmm4 + addpd %xmm2, %xmm1 + subpd %xmm2, %xmm15 + subpd %xmm4, %xmm0 + cmpnltpd %xmm5, %xmm6 + cmpltpd 14528+__svml_datanh_data_internal(%rip), %xmm7 + +/* + * Now compute R = 1/(UHi+ULo) * (1 - E) and the error term E + * The first FMR is exact (we force R to 12 bits just in case it + * isn't already, to make absolutely sure), and since E is ~ 2^-12, + * the rounding error in the other one is acceptable. + */ + cvtpd2ps %xmm4, %xmm2 + addpd %xmm0, %xmm15 + movmskpd %xmm6, %edx + movlhps %xmm2, %xmm2 + movaps %xmm5, %xmm0 + rcpps %xmm2, %xmm2 + cvtps2pd %xmm2, %xmm2 + andps 14208+__svml_datanh_data_internal(%rip), %xmm2 + +/* + * Split V as well into upper 41 bits and lower part, so that we can get + * a preliminary quotient estimate without rounding error. + */ + andps %xmm1, %xmm14 + mulpd %xmm2, %xmm4 + mulpd %xmm2, %xmm15 + subpd %xmm4, %xmm0 + subpd %xmm14, %xmm1 + +/* Hence get initial quotient estimate QHi + QLo = R * VHi + R * VLo */ + mulpd %xmm2, %xmm14 + subpd %xmm15, %xmm0 + mulpd %xmm1, %xmm2 + +/* + * Compute D = E + E^2 + E^3 + E^4 + E^5 + * = E + (E + E^2) (E + E * E^2) + */ + movaps %xmm0, %xmm15 + movaps %xmm0, %xmm1 + mulpd %xmm0, %xmm15 + mulpd %xmm15, %xmm1 + addpd %xmm0, %xmm15 + addpd %xmm0, %xmm1 + mulpd %xmm1, %xmm15 + addpd %xmm15, %xmm0 + +/* + * Compute R * (VHi + VLo) * (1 + E + E^2 + E^3 + E^4 + E^5) + * = R * (VHi + VLo) * (1 + D) + * = QHi + (QHi * D + QLo + QLo * D) + */ + movaps %xmm0, %xmm4 + mulpd %xmm2, %xmm0 + mulpd %xmm14, %xmm4 + addpd %xmm0, %xmm2 + addpd %xmm2, %xmm4 + +/* + * Now finally accumulate the high and low parts of the + * argument to log1p, H + L, with a final compensated summation. + */ + addpd %xmm4, %xmm14 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * later incorporating L into the reduced argument. + * compute 1+x as high, low parts + */ + movaps %xmm5, %xmm0 + movaps %xmm5, %xmm4 + maxpd %xmm14, %xmm0 + minpd %xmm14, %xmm4 + andps %xmm3, %xmm14 + movaps %xmm0, %xmm2 + cmpltpd 12928+__svml_datanh_data_internal(%rip), %xmm14 + addpd %xmm4, %xmm2 + orps 12992+__svml_datanh_data_internal(%rip), %xmm14 + andps %xmm14, %xmm2 + +/* preserve mantissa, set input exponent to 2^(-10) */ + movups 12480+__svml_datanh_data_internal(%rip), %xmm14 + andps %xmm2, %xmm14 + orps 12544+__svml_datanh_data_internal(%rip), %xmm14 + +/* reciprocal approximation good to at least 11 bits */ + cvtpd2ps %xmm14, %xmm3 + subpd %xmm2, %xmm0 + movlhps %xmm3, %xmm3 + rcpps %xmm3, %xmm1 + addpd %xmm0, %xmm4 + cvtps2pd %xmm1, %xmm0 + +/* round reciprocal to nearest integer, will have 1+9 mantissa bits */ + movups .FLT_26(%rip), %xmm14 + +/* exponent bits */ + movaps %xmm2, %xmm1 + addpd %xmm14, %xmm0 + subpd %xmm14, %xmm0 + +/* exponent of X needed to scale Xl */ + movdqu 13376+__svml_datanh_data_internal(%rip), %xmm15 + psrlq $20, %xmm1 + +/* 2^ (-10-exp(X) ) */ + movdqu 13440+__svml_datanh_data_internal(%rip), %xmm3 + pand %xmm2, %xmm15 + psubq %xmm15, %xmm3 + +/* scale DblRcp */ + mulpd %xmm0, %xmm3 + +/* argument reduction */ + mulpd %xmm3, %xmm2 + mulpd %xmm3, %xmm4 + subpd %xmm5, %xmm2 + pshufd $221, %xmm1, %xmm15 + +/* + * prepare table index + * table lookup + */ + movaps %xmm0, %xmm1 + psrlq $40, %xmm1 + movd %xmm1, %eax + pshufd $2, %xmm1, %xmm1 + +/* polynomial */ + movups 12416+__svml_datanh_data_internal(%rip), %xmm5 + addpd %xmm4, %xmm2 + +/* biased exponent in DP format */ + cvtdq2pd %xmm15, %xmm15 + movd %xmm1, %ecx + mulpd %xmm2, %xmm5 + +/* exponent*log(2.0) */ + movups 13184+__svml_datanh_data_internal(%rip), %xmm1 + cmpltpd %xmm0, %xmm1 + addpd 12432+__svml_datanh_data_internal(%rip), %xmm5 + andps 13248+__svml_datanh_data_internal(%rip), %xmm1 + orps 13312+__svml_datanh_data_internal(%rip), %xmm1 + subpd %xmm1, %xmm15 + movaps %xmm2, %xmm1 + mulpd %xmm2, %xmm1 + mulpd 13504+__svml_datanh_data_internal(%rip), %xmm15 + mulpd %xmm1, %xmm5 + movups 12448+__svml_datanh_data_internal(%rip), %xmm0 + mulpd %xmm2, %xmm0 + addpd 12464+__svml_datanh_data_internal(%rip), %xmm0 + addpd %xmm5, %xmm0 + +/* reconstruction */ + mulpd %xmm0, %xmm1 + movslq %eax, %rax + movaps %xmm7, %xmm0 + addpd %xmm1, %xmm2 + movslq %ecx, %rcx + movsd (%r8,%rax), %xmm14 + movups %xmm10, 160(%rsp) + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + movaps %xmm11, %xmm10 + mulpd %xmm11, %xmm10 + movhpd (%r8,%rcx), %xmm14 + addpd %xmm2, %xmm14 + addpd %xmm11, %xmm10 + addpd %xmm14, %xmm15 + +/* Record the sign for eventual reincorporation. */ + movups 14080+__svml_datanh_data_internal(%rip), %xmm6 + +/* Finally, halve the result and reincorporate the sign */ + movups 13888+__svml_datanh_data_internal(%rip), %xmm2 + andps %xmm11, %xmm6 + pxor %xmm6, %xmm2 + +/* Or the sign bit in with the tiny result to handle atanh(-0) correctly */ + orps %xmm6, %xmm10 + mulpd %xmm15, %xmm2 + andnps %xmm2, %xmm0 + andps %xmm7, %xmm10 + orps %xmm10, %xmm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + movups 160(%rsp), %xmm10 + cfi_restore(27) + movups 144(%rsp), %xmm11 + cfi_restore(28) + movups 112(%rsp), %xmm14 + cfi_restore(31) + movups 96(%rsp), %xmm15 + cfi_restore(32) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_3: + movups %xmm11, 128(%rsp) + movups %xmm0, 192(%rsp) + xorl %eax, %eax + movups %xmm8, 48(%rsp) + movups %xmm9, 32(%rsp) + movups %xmm12, 16(%rsp) + movups %xmm13, (%rsp) + movq %rsi, 72(%rsp) + movq %rdi, 64(%rsp) + movq %r12, 88(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 80(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + movl %edx, %r13d + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $2, %r12d + jl .LBL_1_7 + movups 48(%rsp), %xmm8 + cfi_restore(25) + movups 32(%rsp), %xmm9 + cfi_restore(26) + movups 16(%rsp), %xmm12 + cfi_restore(29) + movups (%rsp), %xmm13 + cfi_restore(30) + movq 72(%rsp), %rsi + cfi_restore(4) + movq 64(%rsp), %rdi + cfi_restore(5) + movq 88(%rsp), %r12 + cfi_restore(12) + movq 80(%rsp), %r13 + cfi_restore(13) + movups 192(%rsp), %xmm0 + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 128(%rsp,%r12,8), %rdi + lea 192(%rsp,%r12,8), %rsi + call __svml_datanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVbN2v_atanh_sse4) + + .align 16,0x90 + +__svml_datanh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movsd (%rdi), %xmm0 + movb 7(%rdi), %dl + andb $127, %dl + movsd %xmm0, -8(%rsp) + cmpl $32752, %eax + je .LBL_2_6 + +.LBL_2_2: + cmpl $0, -8(%rsp) + jne .LBL_2_5 + movb %dl, -1(%rsp) + cmpl $1072693248, -4(%rsp) + jne .LBL_2_5 + divsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + movl $2, %eax + ret + +.LBL_2_5: + movsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movl $1, %eax + mulsd 16+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_6: + testl $1048575, 4(%rdi) + jne .LBL_2_8 + cmpl $0, (%rdi) + je .LBL_2_2 + +.LBL_2_8: + mulsd %xmm0, %xmm0 + xorl %eax, %eax + movsd %xmm0, (%rsi) + ret + + cfi_endproc + + .type __svml_datanh_cout_rare_internal,@function + .size __svml_datanh_cout_rare_internal,.-__svml_datanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_datanh_data_internal: + .long 3715793664 + .long 3230016299 + .long 4013928704 + .long 3189565726 + .long 3699038248 + .long 3230016303 + .long 4255595370 + .long 3189567439 + .long 3648859040 + .long 3230016307 + .long 1732833791 + .long 3189567296 + .long 3565385952 + .long 3230016311 + .long 2485752410 + .long 3189567274 + .long 3448748152 + .long 3230016315 + .long 3514744523 + .long 3189567800 + .long 3299074072 + .long 3230016319 + .long 3686511262 + .long 3189567474 + .long 3116491376 + .long 3230016323 + .long 716063611 + .long 3189567908 + .long 2901127016 + .long 3230016327 + .long 354437295 + .long 3189567291 + .long 2653107184 + .long 3230016331 + .long 3777462366 + .long 3189567264 + .long 2372557360 + .long 3230016335 + .long 3590663412 + .long 3189567498 + .long 2059602304 + .long 3230016339 + .long 1680795031 + .long 3189567428 + .long 1714366048 + .long 3230016343 + .long 2010344982 + .long 3189567986 + .long 1336971936 + .long 3230016347 + .long 166254822 + .long 3189567184 + .long 927542568 + .long 3230016351 + .long 59552610 + .long 3189567972 + .long 486199888 + .long 3230016355 + .long 2268824919 + .long 3189567664 + .long 13065112 + .long 3230016359 + .long 3005381643 + .long 3189567835 + .long 3803226080 + .long 3230016362 + .long 4018973165 + .long 3189567825 + .long 3266868056 + .long 3230016366 + .long 3693925101 + .long 3189567457 + .long 2699077504 + .long 3230016370 + .long 4005905743 + .long 3189567697 + .long 2099972936 + .long 3230016374 + .long 3580935118 + .long 3189567215 + .long 1469672176 + .long 3230016378 + .long 2928784295 + .long 3189567129 + .long 808292392 + .long 3230016382 + .long 674298833 + .long 3189567553 + .long 115950104 + .long 3230016386 + .long 2555938320 + .long 3189567208 + .long 3687728456 + .long 3230016389 + .long 532458218 + .long 3189567130 + .long 2933808064 + .long 3230016393 + .long 3888913110 + .long 3189567192 + .long 2149270784 + .long 3230016397 + .long 2365955494 + .long 3189567756 + .long 1334230552 + .long 3230016401 + .long 3325722981 + .long 3189567206 + .long 488800640 + .long 3230016405 + .long 1496133617 + .long 3189567683 + .long 3908061016 + .long 3230016408 + .long 1824836379 + .long 3189567490 + .long 3002189112 + .long 3230016412 + .long 1222174320 + .long 3189567837 + .long 2066263648 + .long 3230016416 + .long 2472769660 + .long 3189567285 + .long 1100395408 + .long 3230016420 + .long 447932460 + .long 3189567455 + .long 104694584 + .long 3230016424 + .long 1006807684 + .long 3189567460 + .long 3374238048 + .long 3230016427 + .long 4121834935 + .long 3189567556 + .long 2319200184 + .long 3230016431 + .long 3019906587 + .long 3189567664 + .long 1234656664 + .long 3230016435 + .long 3882744783 + .long 3189567930 + .long 120715280 + .long 3230016439 + .long 1927363170 + .long 3189567242 + .long 3272450504 + .long 3230016442 + .long 8203115 + .long 3189567876 + .long 2100034368 + .long 3230016446 + .long 1260625560 + .long 3189567855 + .long 898540192 + .long 3230016450 + .long 1791679111 + .long 3189567639 + .long 3963040720 + .long 3230016453 + .long 831133439 + .long 3189567590 + .long 2703706240 + .long 3230016457 + .long 2803140504 + .long 3189567482 + .long 1415608352 + .long 3230016461 + .long 2955844462 + .long 3189568058 + .long 98850816 + .long 3230016465 + .long 4017967070 + .long 3189567455 + .long 3048504096 + .long 3230016468 + .long 3974385451 + .long 3189567871 + .long 1674736240 + .long 3230016472 + .long 2424114556 + .long 3189567887 + .long 272616624 + .long 3230016476 + .long 4261883032 + .long 3189567073 + .long 3137214056 + .long 3230016479 + .long 3716750895 + .long 3189567522 + .long 1678694944 + .long 3230016483 + .long 498025304 + .long 3189567180 + .long 192127016 + .long 3230016487 + .long 1011852160 + .long 3189567511 + .long 2972577480 + .long 3230016490 + .long 558940916 + .long 3189567850 + .long 1430211120 + .long 3230016494 + .long 2550865739 + .long 3189567935 + .long 4155061376 + .long 3230016497 + .long 1930847170 + .long 3189567371 + .long 2557291968 + .long 3230016501 + .long 1716354804 + .long 3189567130 + .long 931967984 + .long 3230016505 + .long 2729403392 + .long 3189567981 + .long 3574154016 + .long 3230016508 + .long 1067280599 + .long 3189567890 + .long 1894012232 + .long 3230016512 + .long 2094260282 + .long 3189567604 + .long 186606176 + .long 3230016516 + .long 3897933165 + .long 3189568046 + .long 2746998904 + .long 3230016519 + .long 1935720459 + .long 3189567701 + .long 985351064 + .long 3230016523 + .long 2170344821 + .long 3189567164 + .long 3491691984 + .long 3230016526 + .long 4220979537 + .long 3189567547 + .long 1676181328 + .long 3230016530 + .long 1953924393 + .long 3189567854 + .long 4128847448 + .long 3230016533 + .long 1689829067 + .long 3189567468 + .long 2259849008 + .long 3230016537 + .long 2367753130 + .long 3189567619 + .long 364246088 + .long 3230016541 + .long 2263309073 + .long 3189567722 + .long 2737098280 + .long 3230016544 + .long 2366756869 + .long 3189567856 + .long 788562816 + .long 3230016548 + .long 2294653975 + .long 3189567145 + .long 3108665616 + .long 3230016551 + .long 1786494117 + .long 3189567254 + .long 1107562960 + .long 3230016555 + .long 3655887416 + .long 3189567689 + .long 3375279848 + .long 3230016558 + .long 1178948625 + .long 3189567241 + .long 1321971608 + .long 3230016562 + .long 1620080441 + .long 3189567466 + .long 3537662304 + .long 3230016565 + .long 154455618 + .long 3189567981 + .long 1432506360 + .long 3230016569 + .long 3128192125 + .long 3189567889 + .long 3596526920 + .long 3230016572 + .long 2026842750 + .long 3189567212 + .long 1439877480 + .long 3230016576 + .long 1384431897 + .long 3189567284 + .long 3552580280 + .long 3230016579 + .long 1999983129 + .long 3189568079 + .long 1344787944 + .long 3230016583 + .long 4035436820 + .long 3189567579 + .long 3406521808 + .long 3230016586 + .long 77799817 + .long 3189567285 + .long 1147933592 + .long 3230016590 + .long 1261060207 + .long 3189567477 + .long 3159043768 + .long 3230016593 + .long 2102717775 + .long 3189567605 + .long 850003184 + .long 3230016597 + .long 161472469 + .long 3189567688 + .long 2810831440 + .long 3230016600 + .long 1937336881 + .long 3189567665 + .long 451678520 + .long 3230016604 + .long 2268353549 + .long 3189567773 + .long 2362563168 + .long 3230016607 + .long 1785871595 + .long 3189567889 + .long 4248601816 + .long 3230016610 + .long 2434669991 + .long 3189567898 + .long 1814910472 + .long 3230016614 + .long 2666999375 + .long 3189568058 + .long 3651506624 + .long 3230016617 + .long 1033139811 + .long 3189567312 + .long 1168538136 + .long 3230016621 + .long 4004618418 + .long 3189567740 + .long 2956021672 + .long 3230016624 + .long 3799928764 + .long 3189567751 + .long 424104288 + .long 3230016628 + .long 3650233137 + .long 3189567549 + .long 2162801816 + .long 3230016631 + .long 437313833 + .long 3189567438 + .long 3877227800 + .long 3230016634 + .long 2138293494 + .long 3189567140 + .long 1272495376 + .long 3230016638 + .long 2891370752 + .long 3189567168 + .long 2938619176 + .long 3230016641 + .long 1704142730 + .long 3189567114 + .long 285744240 + .long 3230016645 + .long 500817607 + .long 3189568035 + .long 1903884424 + .long 3230016648 + .long 3102571944 + .long 3189567668 + .long 3498151272 + .long 3230016651 + .long 2374193154 + .long 3189567933 + .long 773655960 + .long 3230016655 + .long 2898331636 + .long 3189568089 + .long 2320411168 + .long 3230016658 + .long 1983295500 + .long 3189567113 + .long 3843527280 + .long 3230016661 + .long 2132853542 + .long 3189567093 + .long 1048114320 + .long 3230016665 + .long 3551155364 + .long 3189567407 + .long 2524183824 + .long 3230016668 + .long 2564000663 + .long 3189567090 + .long 3976845048 + .long 3230016671 + .long 361581803 + .long 3189567196 + .long 1111206880 + .long 3230016675 + .long 696765230 + .long 3189568040 + .long 2517279744 + .long 3230016678 + .long 941542475 + .long 3189567463 + .long 3900171776 + .long 3230016681 + .long 2377895552 + .long 3189567282 + .long 964990760 + .long 3230016685 + .long 1173605489 + .long 3189567454 + .long 2301746008 + .long 3230016688 + .long 3096720313 + .long 3189567400 + .long 3615544576 + .long 3230016691 + .long 1942008121 + .long 3189567335 + .long 611493160 + .long 3230016695 + .long 3375481119 + .long 3189567537 + .long 1879599992 + .long 3230016698 + .long 4103239143 + .long 3189567624 + .long 3124971056 + .long 3230016701 + .long 3773474925 + .long 3189567869 + .long 52711992 + .long 3230016705 + .long 2465315445 + .long 3189567444 + .long 1252829960 + .long 3230016708 + .long 1041581158 + .long 3189567781 + .long 2430429904 + .long 3230016711 + .long 166620501 + .long 3189567739 + .long 3585583704 + .long 3230016714 + .long 2379237630 + .long 3189567984 + .long 423395616 + .long 3230016718 + .long 134834559 + .long 3189567178 + .long 1533871416 + .long 3230016721 + .long 1449318760 + .long 3189567373 + .long 2622114680 + .long 3230016724 + .long 3042372984 + .long 3189567127 + .long 3688195920 + .long 3230016727 + .long 1265290101 + .long 3189567921 + .long 437218048 + .long 3230016731 + .long 2248549362 + .long 3189567262 + .long 1459185496 + .long 3230016734 + .long 1293250365 + .long 3189567151 + .long 2459200496 + .long 3230016737 + .long 313786605 + .long 3189567180 + .long 3437332240 + .long 3230016740 + .long 3289151823 + .long 3189567872 + .long 98682312 + .long 3230016744 + .long 2693758821 + .long 3189567877 + .long 1033253848 + .long 3230016747 + .long 4237443192 + .long 3189567301 + .long 1946147760 + .long 3230016750 + .long 4099404586 + .long 3189567972 + .long 2837431968 + .long 3230016753 + .long 343640666 + .long 3189567552 + .long 3707174040 + .long 3230016756 + .long 4238401458 + .long 3189567983 + .long 260473960 + .long 3230016760 + .long 21423548 + .long 3189567559 + .long 1087333264 + .long 3230016763 + .long 3515278593 + .long 3189567309 + .long 1892851296 + .long 3230016766 + .long 629106375 + .long 3189567166 + .long 2677094384 + .long 3230016769 + .long 2048670044 + .long 3189567227 + .long 3440128544 + .long 3230016772 + .long 3739217292 + .long 3189568009 + .long 4182019504 + .long 3230016775 + .long 3662039444 + .long 3189567618 + .long 607865368 + .long 3230016779 + .long 1766486991 + .long 3189567112 + .long 1307665824 + .long 3230016782 + .long 512689457 + .long 3189567670 + .long 1986518392 + .long 3230016785 + .long 1704577378 + .long 3189567760 + .long 2644487576 + .long 3230016788 + .long 4001935135 + .long 3189567473 + .long 3281637576 + .long 3230016791 + .long 1184452342 + .long 3189567735 + .long 3898032312 + .long 3230016794 + .long 2714793956 + .long 3189567464 + .long 198768096 + .long 3230016798 + .long 3657654418 + .long 3189567905 + .long 773842856 + .long 3230016801 + .long 2809688013 + .long 3189567736 + .long 1328352328 + .long 3230016804 + .long 390727591 + .long 3189567393 + .long 1862359256 + .long 3230016807 + .long 1135237925 + .long 3189567248 + .long 2375926096 + .long 3230016810 + .long 1377572509 + .long 3189567837 + .long 2869115032 + .long 3230016813 + .long 3148383775 + .long 3189568032 + .long 3341987960 + .long 3230016816 + .long 3809536738 + .long 3189567313 + .long 3794606472 + .long 3230016819 + .long 4243445934 + .long 3189568034 + .long 4227031920 + .long 3230016822 + .long 1302642088 + .long 3189567451 + .long 344358048 + .long 3230016826 + .long 3239125361 + .long 3189567151 + .long 736580224 + .long 3230016829 + .long 3753161736 + .long 3189567129 + .long 1108791648 + .long 3230016832 + .long 624357483 + .long 3189568045 + .long 1461052568 + .long 3230016835 + .long 3153257064 + .long 3189567338 + .long 1793422920 + .long 3230016838 + .long 2705820149 + .long 3189567635 + .long 2105962400 + .long 3230016841 + .long 911564860 + .long 3189567737 + .long 2398730424 + .long 3230016844 + .long 1086958332 + .long 3189567948 + .long 2671786152 + .long 3230016847 + .long 1598984535 + .long 3189567210 + .long 2925188456 + .long 3230016850 + .long 4113385879 + .long 3189567401 + .long 3158995968 + .long 3230016853 + .long 2426812671 + .long 3189567396 + .long 3373267048 + .long 3230016856 + .long 3480845679 + .long 3189567359 + .long 3568059792 + .long 3230016859 + .long 3306230729 + .long 3189567924 + .long 3743432056 + .long 3230016862 + .long 3853821277 + .long 3189567317 + .long 3899441408 + .long 3230016865 + .long 2049309148 + .long 3189567699 + .long 4036145192 + .long 3230016868 + .long 2667321817 + .long 3189567166 + .long 4153600472 + .long 3230016871 + .long 3540670389 + .long 3189567114 + .long 4251864072 + .long 3230016874 + .long 404207883 + .long 3189567310 + .long 36025272 + .long 3230016878 + .long 2837617046 + .long 3189567103 + .long 96074976 + .long 3230016881 + .long 1231280453 + .long 3189567669 + .long 137101976 + .long 3230016884 + .long 792492437 + .long 3189567071 + .long 159162080 + .long 3230016887 + .long 2385525292 + .long 3189567618 + .long 162310880 + .long 3230016890 + .long 3272051015 + .long 3189567858 + .long 146603712 + .long 3230016893 + .long 623573538 + .long 3189567881 + .long 112095672 + .long 3230016896 + .long 2151835939 + .long 3189567451 + .long 58841608 + .long 3230016899 + .long 958006130 + .long 3189567217 + .long 4281863424 + .long 3230016901 + .long 549948691 + .long 3189567863 + .long 4191280920 + .long 3230016904 + .long 4177689987 + .long 3189567217 + .long 4082115512 + .long 3230016907 + .long 2895765193 + .long 3189567599 + .long 3954421112 + .long 3230016910 + .long 1055606208 + .long 3189567799 + .long 3808251392 + .long 3230016913 + .long 1966521217 + .long 3189567351 + .long 3643659776 + .long 3230016916 + .long 1017382758 + .long 3189567732 + .long 3460699480 + .long 3230016919 + .long 3485890155 + .long 3189567410 + .long 3259423472 + .long 3230016922 + .long 2657419170 + .long 3189567140 + .long 3039884488 + .long 3230016925 + .long 4198858220 + .long 3189568080 + .long 2802135064 + .long 3230016928 + .long 2343740494 + .long 3189567869 + .long 2546227480 + .long 3230016931 + .long 2423084215 + .long 3189567957 + .long 2272213808 + .long 3230016934 + .long 3887273856 + .long 3189567631 + .long 1980145888 + .long 3230016937 + .long 3992755473 + .long 3189567251 + .long 1670075336 + .long 3230016940 + .long 722498073 + .long 3189567389 + .long 1342053552 + .long 3230016943 + .long 3573506400 + .long 3189567965 + .long 996131728 + .long 3230016946 + .long 714695829 + .long 3189567392 + .long 632360808 + .long 3230016949 + .long 2816704229 + .long 3189567846 + .long 250791552 + .long 3230016952 + .long 386951333 + .long 3189567243 + .long 4146441768 + .long 3230016954 + .long 2155319939 + .long 3189567580 + .long 3729427184 + .long 3230016957 + .long 4227840137 + .long 3189567931 + .long 3294765200 + .long 3230016960 + .long 1718354212 + .long 3189567672 + .long 2842505696 + .long 3230016963 + .long 4243880582 + .long 3189567656 + .long 2372698352 + .long 3230016966 + .long 3784093842 + .long 3189567302 + .long 1885392624 + .long 3230016969 + .long 2318733051 + .long 3189567813 + .long 1380637784 + .long 3230016972 + .long 497929746 + .long 3189567210 + .long 858482864 + .long 3230016975 + .long 3218883783 + .long 3189567649 + .long 318976720 + .long 3230016978 + .long 3492652862 + .long 3189567382 + .long 4057135272 + .long 3230016980 + .long 473724673 + .long 3189568069 + .long 3483072376 + .long 3230016983 + .long 150485010 + .long 3189567757 + .long 2891803552 + .long 3230016986 + .long 3028900958 + .long 3189567173 + .long 2283376816 + .long 3230016989 + .long 321242596 + .long 3189567822 + .long 1657840008 + .long 3230016992 + .long 151305746 + .long 3189568029 + .long 1015240760 + .long 3230016995 + .long 2208026401 + .long 3189567184 + .long 355626480 + .long 3230016998 + .long 2487781842 + .long 3189567931 + .long 3974011720 + .long 3230017000 + .long 2391142094 + .long 3189567091 + .long 3280508896 + .long 3230017003 + .long 734457618 + .long 3189568092 + .long 2570132168 + .long 3230017006 + .long 3070902701 + .long 3189567794 + .long 1842928168 + .long 3230017009 + .long 1110877923 + .long 3189567896 + .long 1098943352 + .long 3230017012 + .long 3880360185 + .long 3189567898 + .long 338223984 + .long 3230017015 + .long 391995809 + .long 3189567294 + .long 3855783416 + .long 3230017017 + .long 4186345433 + .long 3189567745 + .long 3061732952 + .long 3230017020 + .long 3682852050 + .long 3189567081 + .long 2251085560 + .long 3230017023 + .long 3057037137 + .long 3189567617 + .long 1423886760 + .long 3230017026 + .long 3352664894 + .long 3189567074 + .long 580181848 + .long 3230017029 + .long 1170568982 + .long 3189567927 + .long 4014983272 + .long 3230017031 + .long 671148579 + .long 3189567293 + .long 3138401368 + .long 3230017034 + .long 267496658 + .long 3189567304 + .long 2245448192 + .long 3230017037 + .long 1285167087 + .long 3189568066 + .long 1336168336 + .long 3230017040 + .long 4259909589 + .long 3189567788 + .long 410606184 + .long 3230017043 + .long 1494078902 + .long 3189568031 + .long 3763773256 + .long 3230017045 + .long 261935754 + .long 3189567685 + .long 2805778992 + .long 3230017048 + .long 3679585605 + .long 3189567195 + .long 1831634536 + .long 3230017051 + .long 809066513 + .long 3189567664 + .long 841383576 + .long 3230017054 + .long 385945238 + .long 3189567897 + .long 4130036912 + .long 3230017056 + .long 825579909 + .long 3189567603 + .long 3107703272 + .long 3230017059 + .long 3911295427 + .long 3189567514 + .long 2069393104 + .long 3230017062 + .long 3473784588 + .long 3189567461 + .long 1015149384 + .long 3230017065 + .long 629861200 + .long 3189567515 + .long 4239982216 + .long 3230017067 + .long 2659142760 + .long 3189567083 + .long 3153999632 + .long 3230017070 + .long 1251680713 + .long 3189567080 + .long 2052211384 + .long 3230017073 + .long 3168705163 + .long 3189567992 + .long 934659776 + .long 3230017076 + .long 1674797624 + .long 3189567952 + .long 4096354216 + .long 3230017078 + .long 437847902 + .long 3189567971 + .long 2947402064 + .long 3230017081 + .long 4024401533 + .long 3189567960 + .long 1782812400 + .long 3230017084 + .long 786902458 + .long 3189567873 + .long 602626840 + .long 3230017087 + .long 2593792633 + .long 3189567812 + .long 3701854136 + .long 3230017089 + .long 3989721221 + .long 3189567126 + .long 2490600968 + .long 3230017092 + .long 2545746866 + .long 3189567591 + .long 1263875768 + .long 3230017095 + .long 3115843521 + .long 3189567377 + .long 21719488 + .long 3230017098 + .long 1730226063 + .long 3189567307 + .long 3059140216 + .long 3230017100 + .long 690350922 + .long 3189567892 + .long 1786244008 + .long 3230017103 + .long 3350998585 + .long 3189567394 + .long 498038616 + .long 3230017106 + .long 1499123379 + .long 3189568082 + .long 3489531672 + .long 3230017108 + .long 2598665922 + .long 3189567118 + .long 2170828712 + .long 3230017111 + .long 2436376826 + .long 3189567935 + .long 836937048 + .long 3230017114 + .long 1977004902 + .long 3189568052 + .long 3782863816 + .long 3230017116 + .long 4027224619 + .long 3189567373 + .long 2418714096 + .long 3230017119 + .long 2616869856 + .long 3189567271 + .long 1039494712 + .long 3230017122 + .long 3775628133 + .long 3189567616 + .long 3940212336 + .long 3230017124 + .long 419018052 + .long 3189567909 + .long 2530971600 + .long 3230017127 + .long 150919657 + .long 3189567379 + .long 1106778856 + .long 3230017130 + .long 2926254537 + .long 3189567139 + .long 3962640312 + .long 3230017132 + .long 1610863810 + .long 3189567216 + .long 2508660136 + .long 3230017135 + .long 1166015244 + .long 3189567672 + .long 1039844240 + .long 3230017138 + .long 645159638 + .long 3189567685 + .long 3851198376 + .long 3230017140 + .long 2449439581 + .long 3189567695 + .long 2352826264 + .long 3230017143 + .long 1619104640 + .long 3189567458 + .long 839733360 + .long 3230017146 + .long 2427070371 + .long 3189567165 + .long 3606924968 + .long 3230017148 + .long 2166480890 + .long 3189567544 + .long 2064504368 + .long 3230017151 + .long 2283025905 + .long 3189567907 + .long 507476584 + .long 3230017154 + .long 3923356754 + .long 3189567272 + .long 3230846472 + .long 3230017156 + .long 805331677 + .long 3189567533 + .long 1644716880 + .long 3230017159 + .long 3790469685 + .long 3189567406 + .long 44092384 + .long 3230017162 + .long 2689788214 + .long 3189567653 + .long 2723977432 + .long 3230017164 + .long 2762250221 + .long 3189567072 + .long 1094474416 + .long 3230017167 + .long 2781925193 + .long 3189567716 + .long 3745554800 + .long 3230017169 + .long 593120878 + .long 3189567817 + .long 2087320704 + .long 3230017172 + .long 403414988 + .long 3189568021 + .long 414776008 + .long 3230017175 + .long 359307328 + .long 3189567387 + .long 3022924432 + .long 3230017177 + .long 3373547966 + .long 3189567572 + .long 1321867688 + .long 3230017180 + .long 3978711340 + .long 3189567805 + .long 3901576528 + .long 3230017182 + .long 2765663238 + .long 3189568046 + .long 2172152384 + .long 3230017185 + .long 1181150766 + .long 3189568053 + .long 428598440 + .long 3230017188 + .long 2473022131 + .long 3189567471 + .long 2965917728 + .long 3230017190 + .long 1621744488 + .long 3189567971 + .long 1194211288 + .long 3230017193 + .long 2931299013 + .long 3189567190 + .long 3703449168 + .long 3230017195 + .long 873154950 + .long 3189568039 + .long 1903732144 + .long 3230017198 + .long 1510784525 + .long 3189567521 + .long 90062704 + .long 3230017201 + .long 2918231590 + .long 3189568086 + .long 2557443240 + .long 3230017203 + .long 3329944838 + .long 3189567475 + .long 715974088 + .long 3230017206 + .long 2679715410 + .long 3189568021 + .long 3155624672 + .long 3230017208 + .long 1841110143 + .long 3189567518 + .long 1286495072 + .long 3230017211 + .long 3881638924 + .long 3189567497 + .long 3698554440 + .long 3230017213 + .long 167906931 + .long 3189567169 + .long 1801902600 + .long 3230017216 + .long 1468264167 + .long 3189567597 + .long 4186508448 + .long 3230017218 + .long 2400624638 + .long 3189567691 + .long 2262471560 + .long 3230017221 + .long 3796182064 + .long 3189567357 + .long 324793264 + .long 3230017224 + .long 2801238958 + .long 3189567581 + .long 2668474776 + .long 3230017226 + .long 2273142813 + .long 3189567436 + .long 703615288 + .long 3230017229 + .long 831867571 + .long 3189567237 + .long 3020183048 + .long 3230017231 + .long 2238048829 + .long 3189567595 + .long 1028277008 + .long 3230017234 + .long 1163763070 + .long 3189567452 + .long 3317865168 + .long 3230017236 + .long 1206450788 + .long 3189567228 + .long 1299046216 + .long 3230017239 + .long 737162226 + .long 3189567879 + .long 3561787920 + .long 3230017241 + .long 2433253277 + .long 3189567901 + .long 1516188728 + .long 3230017244 + .long 3561277099 + .long 3189567506 + .long 3752216144 + .long 3230017246 + .long 1385095507 + .long 3189567674 + .long 1679968384 + .long 3230017249 + .long 829462408 + .long 3189567156 + .long 3889412704 + .long 3230017251 + .long 2939266725 + .long 3189567673 + .long 1790647080 + .long 3230017254 + .long 4214100827 + .long 3189567848 + .long 3973638544 + .long 3230017256 + .long 2537954451 + .long 3189567376 + .long 1848484816 + .long 3230017259 + .long 1128740312 + .long 3189567098 + .long 4005152680 + .long 3230017261 + .long 1932232434 + .long 3189568053 + .long 1853739648 + .long 3230017264 + .long 1359710694 + .long 3189567457 + .long 3984212256 + .long 3230017266 + .long 1268482287 + .long 3189567990 + .long 1806667776 + .long 3230017269 + .long 839689017 + .long 3189567631 + .long 3911072520 + .long 3230017271 + .long 3727165601 + .long 3189567921 + .long 1707523520 + .long 3230017274 + .long 1836550952 + .long 3189567895 + .long 3785986872 + .long 3230017276 + .long 172951407 + .long 3189567220 + .long 1556559360 + .long 3230017279 + .long 1166449891 + .long 3189567294 + .long 3609206856 + .long 3230017281 + .long 28625366 + .long 3189567222 + .long 1354025920 + .long 3230017284 + .long 4038426582 + .long 3189567978 + .long 3380982208 + .long 3230017286 + .long 2756284659 + .long 3189567362 + .long 1100172048 + .long 3230017289 + .long 848830252 + .long 3189567230 + .long 3101560856 + .long 3230017291 + .long 1868170309 + .long 3189567423 + .long 795244752 + .long 3230017294 + .long 3128260908 + .long 3189567885 + .long 2771188936 + .long 3230017296 + .long 1691261279 + .long 3189567706 + .long 439489304 + .long 3230017299 + .long 2886711298 + .long 3189567236 + .long 2390110824 + .long 3230017301 + .long 1311431101 + .long 3189567133 + .long 33149176 + .long 3230017304 + .long 3042183093 + .long 3189567401 + .long 1958569120 + .long 3230017306 + .long 3174208880 + .long 3189567462 + .long 3871433416 + .long 3230017308 + .long 302374021 + .long 3189567243 + .long 1476804712 + .long 3230017311 + .long 712531519 + .long 3189567241 + .long 3364647440 + .long 3230017313 + .long 3705318448 + .long 3189567568 + .long 945056744 + .long 3230017316 + .long 2424171915 + .long 3189568016 + .long 2807996856 + .long 3230017318 + .long 199511961 + .long 3189567094 + .long 363562688 + .long 3230017321 + .long 3766234060 + .long 3189567214 + .long 2201718256 + .long 3230017323 + .long 1956195829 + .long 3189567592 + .long 4027525584 + .long 3230017325 + .long 2891794585 + .long 3189567375 + .long 1546046576 + .long 3230017328 + .long 843173017 + .long 3189567760 + .long 3347244936 + .long 3230017330 + .long 1609532414 + .long 3189567955 + .long 841215080 + .long 3230017333 + .long 3356704285 + .long 3189567294 + .long 2617920488 + .long 3230017335 + .long 1641729240 + .long 3189567346 + .long 87455368 + .long 3230017338 + .long 1455753222 + .long 3189567878 + .long 1839783016 + .long 3230017340 + .long 1936589978 + .long 3189567944 + .long 3579964728 + .long 3230017342 + .long 1006586129 + .long 3189567993 + .long 1013061704 + .long 3230017345 + .long 2766825484 + .long 3189567880 + .long 2729036928 + .long 3230017347 + .long 1888685184 + .long 3189567954 + .long 137984104 + .long 3230017350 + .long 848046306 + .long 3189568090 + .long 1829866024 + .long 3230017352 + .long 4178224056 + .long 3189567750 + .long 3509743488 + .long 3230017354 + .long 2637072474 + .long 3189567070 + .long 882677184 + .long 3230017357 + .long 3133305384 + .long 3189567936 + .long 2538629624 + .long 3230017359 + .long 1343200028 + .long 3189567905 + .long 4182661312 + .long 3230017361 + .long 107195460 + .long 3189567427 + .long 1519832648 + .long 3230017364 + .long 602154914 + .long 3189567857 + .long 3140105848 + .long 3230017366 + .long 659160740 + .long 3189567417 + .long 453573824 + .long 3230017369 + .long 236889930 + .long 3189567396 + .long 2050198592 + .long 3230017371 + .long 1175634921 + .long 3189567087 + .long 3635040168 + .long 3230017373 + .long 1241855527 + .long 3189567941 + .long 913158504 + .long 3230017376 + .long 3947904414 + .long 3189567477 + .long 2474515312 + .long 3230017378 + .long 1206979822 + .long 3189567534 + .long 4024170344 + .long 3230017380 + .long 1847397805 + .long 3189567152 + .long 1267183240 + .long 3230017383 + .long 2916539301 + .long 3189567754 + .long 2793515456 + .long 3230017385 + .long 2568213263 + .long 3189568078 + .long 13259168 + .long 3230017388 + .long 3003245330 + .long 3189567303 + .long 1516375624 + .long 3230017390 + .long 3472633477 + .long 3189567153 + .long 3007924104 + .long 3230017392 + .long 532406289 + .long 3189567855 + .long 192963816 + .long 3230017395 + .long 4149310663 + .long 3189567165 + .long 1661455728 + .long 3230017397 + .long 946970842 + .long 3189567598 + .long 3118458864 + .long 3230017399 + .long 2040517972 + .long 3189567254 + .long 269032128 + .long 3230017402 + .long 3669971831 + .long 3189568072 + .long 1703136256 + .long 3230017404 + .long 2375197389 + .long 3189567687 + .long 3125829976 + .long 3230017406 + .long 296757744 + .long 3189567673 + .long 242171944 + .long 3230017409 + .long 611424102 + .long 3189567452 + .long 1642122608 + .long 3230017411 + .long 1700968423 + .long 3189567419 + .long 3030740440 + .long 3230017413 + .long 2947762668 + .long 3189567968 + .long 113083840 + .long 3230017416 + .long 690901756 + .long 3189567496 + .long 1479112984 + .long 3230017418 + .long 121139903 + .long 3189567571 + .long 2833886088 + .long 3230017420 + .long 173386055 + .long 3189567866 + .long 4177428584 + .long 3230017422 + .long 2964718132 + .long 3189567231 + .long 1214798496 + .long 3230017425 + .long 541562024 + .long 3189567842 + .long 2535955680 + .long 3230017427 + .long 3368765612 + .long 3189568076 + .long 3845958008 + .long 3230017429 + .long 3194541507 + .long 3189567689 + .long 849863256 + .long 3230017432 + .long 3443356552 + .long 3189567858 + .long 2137631024 + .long 3230017434 + .long 1180679397 + .long 3189567138 + .long 3414318912 + .long 3230017436 + .long 2261929999 + .long 3189567651 + .long 384984464 + .long 3230017439 + .long 954057098 + .long 3189567971 + .long 1639587024 + .long 3230017441 + .long 1346995839 + .long 3189567263 + .long 2883183944 + .long 3230017443 + .long 3253373727 + .long 3189567382 + .long 4115799808 + .long 3230017445 + .long 4143791142 + .long 3189567800 + .long 1042491824 + .long 3230017448 + .long 4240432954 + .long 3189567700 + .long 2253218992 + .long 3230017450 + .long 1891708033 + .long 3189568072 + .long 3453038360 + .long 3230017452 + .long 710292621 + .long 3189567662 + .long 347006880 + .long 3230017455 + .long 2712254611 + .long 3189567116 + .long 1525083304 + .long 3230017457 + .long 349583280 + .long 3189568004 + .long 2692324448 + .long 3230017459 + .long 1803227864 + .long 3189567740 + .long 3848754312 + .long 3230017461 + .long 3644606976 + .long 3189567826 + .long 699429536 + .long 3230017464 + .long 1067153346 + .long 3189567751 + .long 1834308568 + .long 3230017466 + .long 1335350692 + .long 3189567081 + .long 2958447872 + .long 3230017468 + .long 1803696599 + .long 3189567557 + .long 4071871152 + .long 3230017470 + .long 1232152547 + .long 3189568017 + .long 879634736 + .long 3230017473 + .long 1455437901 + .long 3189567512 + .long 1971696744 + .long 3230017475 + .long 3708110750 + .long 3189567399 + .long 3053113344 + .long 3230017477 + .long 3907324819 + .long 3189567290 + .long 4123907920 + .long 3230017479 + .long 4080000314 + .long 3189567141 + .long 889136480 + .long 3230017482 + .long 1286519001 + .long 3189567298 + .long 1938756848 + .long 3230017484 + .long 1292347423 + .long 3189567513 + .long 2977824880 + .long 3230017486 + .long 1159725249 + .long 3189568015 + .long 4006363664 + .long 3230017488 + .long 895621348 + .long 3189567502 + .long 729428896 + .long 3230017491 + .long 1212894155 + .long 3189567280 + .long 1736978096 + .long 3230017493 + .long 296117275 + .long 3189567210 + .long 2734066816 + .long 3230017495 + .long 2463481211 + .long 3189567796 + .long 3720717848 + .long 3230017497 + .long 76524950 + .long 3189567159 + .long 401986584 + .long 3230017500 + .long 1718551671 + .long 3189567216 + .long 1367830248 + .long 3230017502 + .long 3568874946 + .long 3189567584 + .long 2323304104 + .long 3230017504 + .long 2763456396 + .long 3189567666 + .long 3268430632 + .long 3230017506 + .long 1208592501 + .long 3189567715 + .long 4203232240 + .long 3230017508 + .long 4148835618 + .long 3189567851 + .long 832763976 + .long 3230017511 + .long 610418007 + .long 3189567082 + .long 1746982680 + .long 3230017513 + .long 3035714190 + .long 3189567431 + .long 2650943256 + .long 3230017515 + .long 85931336 + .long 3189567843 + .long 3544667832 + .long 3230017517 + .long 3006685957 + .long 3189567286 + .long 133211144 + .long 3230017520 + .long 878859600 + .long 3189567873 + .long 1006529776 + .long 3230017522 + .long 854333969 + .long 3189567724 + .long 1869678336 + .long 3230017524 + .long 3058646748 + .long 3189567155 + .long 2722678648 + .long 3230017526 + .long 360733640 + .long 3189567693 + .long 3565552488 + .long 3230017528 + .long 3015564990 + .long 3189568013 + .long 103354256 + .long 3230017531 + .long 2286095909 + .long 3189568081 + .long 926040176 + .long 3230017533 + .long 1899270393 + .long 3189567137 + .long 1738664488 + .long 3230017535 + .long 1377641292 + .long 3189567833 + .long 2541248696 + .long 3230017537 + .long 4266686523 + .long 3189568077 + .long 3333814224 + .long 3230017539 + .long 4018775563 + .long 3189567218 + .long 4116382408 + .long 3230017541 + .long 3373913644 + .long 3189567103 + .long 594007232 + .long 3230017544 + .long 2818265402 + .long 3189568021 + .long 1356644520 + .long 3230017546 + .long 1075601108 + .long 3189567716 + .long 2109348112 + .long 3230017548 + .long 3342127702 + .long 3189567566 + .long 2852139088 + .long 3230017550 + .long 2910355434 + .long 3189567504 + .long 3585038464 + .long 3230017552 + .long 611858749 + .long 3189567074 + .long 13099880 + .long 3230017555 + .long 1954698831 + .long 3189567516 + .long 726278816 + .long 3230017557 + .long 550712630 + .long 3189567710 + .long 1429628792 + .long 3230017559 + .long 3672474493 + .long 3189567278 + .long 2123170544 + .long 3230017561 + .long 1160875209 + .long 3189567651 + .long 2806924760 + .long 3230017563 + .long 2242524344 + .long 3189568000 + .long 3480912064 + .long 3230017565 + .long 2823138691 + .long 3189567327 + .long 4145152992 + .long 3230017567 + .long 3521079748 + .long 3189567568 + .long 504700744 + .long 3230017570 + .long 1136670137 + .long 3189567486 + .long 1149510328 + .long 3230017572 + .long 806933442 + .long 3189567823 + .long 1784634816 + .long 3230017574 + .long 1606084669 + .long 3189567242 + .long 2410094488 + .long 3230017576 + .long 2841342625 + .long 3189567480 + .long 3025909584 + .long 3230017578 + .long 984188059 + .long 3189567239 + .long 3632100264 + .long 3230017580 + .long 3011730434 + .long 3189567337 + .long 4228686632 + .long 3230017582 + .long 328432041 + .long 3189567676 + .long 520721440 + .long 3230017585 + .long 2057225622 + .long 3189567268 + .long 1098159248 + .long 3230017587 + .long 3150727306 + .long 3189567348 + .long 1666052680 + .long 3230017589 + .long 3291380622 + .long 3189567307 + .long 2224421584 + .long 3230017591 + .long 3570771984 + .long 3189567798 + .long 2773285760 + .long 3230017593 + .long 2427604440 + .long 3189567698 + .long 3312664936 + .long 3230017595 + .long 3733848165 + .long 3189567211 + .long 3842578768 + .long 3230017597 + .long 2673912350 + .long 3189567904 + .long 68079584 + .long 3230017600 + .long 960995892 + .long 3189567616 + .long 579121512 + .long 3230017602 + .long 4150493479 + .long 3189567659 + .long 1080756744 + .long 3230017604 + .long 1054941272 + .long 3189567735 + .long 1573004704 + .long 3230017606 + .long 2574365292 + .long 3189568007 + .long 2055884768 + .long 3230017608 + .long 2507498673 + .long 3189567092 + .long 2529416224 + .long 3230017610 + .long 2082176323 + .long 3189567207 + .long 2993618320 + .long 3230017612 + .long 3719982601 + .long 3189568058 + .long 3448510256 + .long 3230017614 + .long 4104247904 + .long 3189567897 + .long 3894111152 + .long 3230017616 + .long 3735557011 + .long 3189567647 + .long 35472776 + .long 3230017619 + .long 2914260983 + .long 3189567862 + .long 462548736 + .long 3230017621 + .long 1334094042 + .long 3189567734 + .long 880390688 + .long 3230017623 + .long 1291097379 + .long 3189567171 + .long 1289017512 + .long 3230017625 + .long 1627119803 + .long 3189567853 + .long 1688448064 + .long 3230017627 + .long 3886873723 + .long 3189567117 + .long 2078701104 + .long 3230017629 + .long 627887757 + .long 3189567206 + .long 2459795360 + .long 3230017631 + .long 1722013861 + .long 3189567101 + .long 2831749488 + .long 3230017633 + .long 4163262354 + .long 3189567678 + .long 3194582104 + .long 3230017635 + .long 4170237688 + .long 3189567639 + .long 3548311752 + .long 3230017637 + .long 47563772 + .long 3189567637 + .long 3892956928 + .long 3230017639 + .long 2990136007 + .long 3189567231 + .long 4228536056 + .long 3230017641 + .long 4294532248 + .long 3189567995 + .long 260100240 + .long 3230017644 + .long 2060709623 + .long 3189567397 + .long 577602376 + .long 3230017646 + .long 1488525373 + .long 3189568044 + .long 886093456 + .long 3230017648 + .long 1657840200 + .long 3189567474 + .long 1185591680 + .long 3230017650 + .long 3155771782 + .long 3189567399 + .long 1476115208 + .long 3230017652 + .long 2195162329 + .long 3189567591 + .long 1757682144 + .long 3230017654 + .long 1292806663 + .long 3189567956 + .long 2030310544 + .long 3230017656 + .long 2151451208 + .long 3189567540 + .long 2294018392 + .long 3230017658 + .long 2224122735 + .long 3189567630 + .long 2548823632 + .long 3230017660 + .long 3554417607 + .long 3189567684 + .long 2794744152 + .long 3230017662 + .long 3831650627 + .long 3189567409 + .long 3031797776 + .long 3230017664 + .long 4024246224 + .long 3189567811 + .long 3260002296 + .long 3230017666 + .long 2530219738 + .long 3189567128 + .long 3479375416 + .long 3230017668 + .long 1618145996 + .long 3189568024 + .long 3689934832 + .long 3230017670 + .long 392379700 + .long 3189567378 + .long 3891698144 + .long 3230017672 + .long 55874694 + .long 3189567574 + .long 4084682928 + .long 3230017674 + .long 4294251475 + .long 3189567312 + .long 4268906688 + .long 3230017676 + .long 1899705040 + .long 3189567783 + .long 149419600 + .long 3230017679 + .long 357699389 + .long 3189567568 + .long 316173656 + .long 3230017681 + .long 3025711727 + .long 3189567790 + .long 474218920 + .long 3230017683 + .long 2921891821 + .long 3189568046 + .long 623572704 + .long 3230017685 + .long 1716968749 + .long 3189567453 + .long 764252248 + .long 3230017687 + .long 2393171526 + .long 3189567748 + .long 896274768 + .long 3230017689 + .long 1343317993 + .long 3189567172 + .long 1019657400 + .long 3230017691 + .long 1388235839 + .long 3189567661 + .long 1134417256 + .long 3230017693 + .long 2766147125 + .long 3189567706 + .long 1240571384 + .long 3230017695 + .long 2162068842 + .long 3189567499 + .long 1338136776 + .long 3230017697 + .long 4075455588 + .long 3189567932 + .long 1427130392 + .long 3230017699 + .long 1579647664 + .long 3189567555 + .long 1507569120 + .long 3230017701 + .long 3785749868 + .long 3189567715 + .long 1579469816 + .long 3230017703 + .long 2639950365 + .long 3189567469 + .long 1642849272 + .long 3230017705 + .long 3611501026 + .long 3189567698 + .long 1697724240 + .long 3230017707 + .long 15422953 + .long 3189568066 + .long 1744111424 + .long 3230017709 + .long 2642213241 + .long 3189568062 + .long 1782027472 + .long 3230017711 + .long 143606300 + .long 3189568058 + .long 1811488992 + .long 3230017713 + .long 501328690 + .long 3189567276 + .long 1832512520 + .long 3230017715 + .long 3258054578 + .long 3189567915 + .long 1845114576 + .long 3230017717 + .long 1297851139 + .long 3189568007 + .long 1849311616 + .long 3230017719 + .long 3589200000 + .long 3189567580 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .long 2846560486 + .long 3210737666 + .long 2729511872 + .long 3211784202 + .long 3956813460 + .long 3212307985 + .long 1796237193 + .long 3212828714 + .long 1562748889 + .long 3213092649 + .long 1602292343 + .long 3213352007 + .long 745814092 + .long 3213610865 + .long 2969306084 + .long 3213869224 + .long 3953060839 + .long 3214006263 + .long 1128703349 + .long 3214134948 + .long 1371067273 + .long 3214263386 + .long 131445019 + .long 3214391579 + .long 1427948820 + .long 3214519527 + .long 665817496 + .long 3214647232 + .long 1817459908 + .long 3214774694 + .long 242758400 + .long 3214901915 + .long 2082038134 + .long 3214981455 + .long 2300828032 + .long 3215044825 + .long 571795571 + .long 3215108076 + .long 3120479584 + .long 3215171207 + .long 3276640540 + .long 3215234220 + .long 2949178581 + .long 3215297115 + .long 4036279704 + .long 3215359892 + .long 4130528508 + .long 3215422552 + .long 813954767 + .long 3215485096 + .long 248046571 + .long 3215547523 + .long 4288926261 + .long 3215609833 + .long 1897492927 + .long 3215672029 + .long 3499237165 + .long 3215734109 + .long 2329611090 + .long 3215796075 + .long 203907094 + .long 3215857927 + .long 3222364838 + .long 3215919664 + .long 295408387 + .long 3215981289 + .long 899212401 + .long 3216012696 + .long 2606049022 + .long 3216043395 + .long 4003691233 + .long 3216074038 + .long 1675303236 + .long 3216104626 + .long 789189655 + .long 3216135158 + .long 2213928479 + .long 3216165634 + .long 2518405585 + .long 3216196055 + .long 2561783534 + .long 3216226421 + .long 3198568176 + .long 3216256732 + .long 983674944 + .long 3216286989 + .long 1057364031 + .long 3216317191 + .long 4260371496 + .long 3216347338 + .long 2838974660 + .long 3216377432 + .long 1919860988 + .long 3216407472 + .long 2330291020 + .long 3216437458 + .long 598130195 + .long 3216467391 + .long 1836782285 + .long 3216497270 + .long 2565351466 + .long 3216527096 + .long 3593575201 + .long 3216556869 + .long 1431920350 + .long 3216586590 + .long 1176515501 + .long 3216616258 + .long 3624279252 + .long 3216645873 + .long 977982819 + .long 3216675437 + .long 2616083454 + .long 3216704948 + .long 733015457 + .long 3216734408 + .long 403990373 + .long 3216763816 + .long 2405156675 + .long 3216793172 + .long 3213628385 + .long 3216822477 + .long 3597448029 + .long 3216851731 + .long 25680167 + .long 3216880935 + .long 1848308454 + .long 3216910087 + .long 1231492199 + .long 3216939189 + .long 3222364838 + .long 3216968240 + .long 4274224607 + .long 3216997241 + .long 836496059 + .long 3217026193 + .long 1119829323 + .long 3217043131 + .long 315251054 + .long 3217057557 + .long 518461891 + .long 3217071958 + .long 2094042713 + .long 3217086334 + .long 1109735857 + .long 3217100686 + .long 2221359788 + .long 3217115013 + .long 1492952593 + .long 3217129316 + .long 3576653728 + .long 3217143594 + .long 237880003 + .long 3217157849 + .long 420109003 + .long 3217172079 + .long 180120274 + .long 3217186285 + .long 4162843939 + .long 3217200466 + .long 4126536273 + .long 3217214624 + .long 417628115 + .long 3217228759 + .long 1970736719 + .long 3217242869 + .long 538873716 + .long 3217256956 + .long 758227830 + .long 3217271019 + .long 2968307242 + .long 3217285058 + .long 3211951040 + .long 3217299074 + .long 1825275166 + .long 3217313067 + .long 3437683677 + .long 3217327036 + .long 4086978021 + .long 3217340982 + .long 4104270002 + .long 3217354905 + .long 3819025464 + .long 3217368805 + .long 3559075183 + .long 3217382682 + .long 3650625670 + .long 3217396536 + .long 123302585 + .long 3217410368 + .long 1890030548 + .long 3217424176 + .long 682272600 + .long 3217437962 + .long 1114811729 + .long 3217451725 + .long 3505892050 + .long 3217465465 + .long 3877229085 + .long 3217479183 + .long 2543954549 + .long 3217492879 + .long 4114626469 + .long 3217506552 + .long 311370023 + .long 3217520204 + .long 34658569 + .long 3217533833 + .long 3593519732 + .long 3217547439 + .long 2705545195 + .long 3217561024 + .long 1971736889 + .long 3217574587 + .long 1696647441 + .long 3217588128 + .long 2183357019 + .long 3217601647 + .long 3733482817 + .long 3217615144 + .long 2352221150 + .long 3217628620 + .long 2633258676 + .long 3217642074 + .long 578912458 + .long 3217655507 + .long 780008323 + .long 3217668918 + .long 3530988084 + .long 3217682307 + .long 534951267 + .long 3217695676 + .long 673467853 + .long 3217709023 + .long 4236783385 + .long 3217722348 + .long 2923827788 + .long 3217735653 + .long 1317060595 + .long 3217748937 + .long 3997577740 + .long 3217762199 + .long 2660218276 + .long 3217775441 + .long 1883376699 + .long 3217788662 + .long 1949142230 + .long 3217801862 + .long 3138274530 + .long 3217815041 + .long 1435244737 + .long 3217828200 + .long 1413145637 + .long 3217841338 + .long 3348797986 + .long 3217854455 + .long 3222758658 + .long 3217867552 + .long 1309263324 + .long 3217880629 + .long 2176234471 + .long 3217893685 + .long 1800387473 + .long 3217906721 + .long 452140382 + .long 3217919737 + .long 2695621757 + .long 3217932732 + .long 208809263 + .long 3217945708 + .long 1848308454 + .long 3217958663 + .long 3584589359 + .long 3217971598 + .long 1386895968 + .long 3217984514 + .long 4108155659 + .long 3217997409 + .long 3420215606 + .long 3218010285 + .long 3878621277 + .long 3218023141 + .long 1447787319 + .long 3218035978 + .long 680874053 + .long 3218048795 + .long 1834892843 + .long 3218061592 + .long 870713292 + .long 3218074370 + .long 1168986141 + .long 3218083436 + .long 3245089583 + .long 3218089805 + .long 2494877761 + .long 3218096165 + .long 3338922950 + .long 3218102515 + .long 1607293197 + .long 3218108856 + .long 1719424943 + .long 3218115187 + .long 3799224547 + .long 3218121508 + .long 3675071677 + .long 3218127820 + .long 1469757259 + .long 3218134123 + .long 1600486820 + .long 3218140416 + .long 4188949205 + .long 3218146699 + .long 766352567 + .long 3218152974 + .long 43231408 + .long 3218159239 + .long 2139646042 + .long 3218165494 + .long 2880153102 + .long 3218171740 + .long 2383743325 + .long 3218177977 + .long 768877423 + .long 3218184205 + .long 2448456521 + .long 3218190423 + .long 3244923387 + .long 3218196632 + .long 3275167422 + .long 3218202832 + .long 2655560435 + .long 3218209023 + .long 1501959692 + .long 3218215205 + .long 4224678246 + .long 3218221377 + .long 2348618756 + .long 3218227541 + .long 283080250 + .long 3218233696 + .long 2436859197 + .long 3218239841 + .long 333350563 + .long 3218245978 + .long 2675321801 + .long 3218252105 + .long 985177381 + .long 3218258224 + .long 3964700035 + .long 3218264333 + .long 3135315249 + .long 3218270434 + .long 2902865164 + .long 3218276526 + .long 3377742213 + .long 3218282609 + .long 374891912 + .long 3218288684 + .long 2593684821 + .long 3218294749 + .long 1553148222 + .long 3218300806 + .long 1656739931 + .long 3218306854 + .long 3012481825 + .long 3218312893 + .long 1432962538 + .long 3218318924 + .long 1320242026 + .long 3218324946 + .long 2780952336 + .long 3218330959 + .long 1626300240 + .long 3218336964 + .long 2256971748 + .long 3218342960 + .long 483265518 + .long 3218348948 + .long 704964628 + .long 3218354927 + .long 3026437244 + .long 3218360897 + .long 3256639170 + .long 3218366859 + .long 1499050969 + .long 3218372813 + .long 2151680465 + .long 3218378758 + .long 1022163351 + .long 3218384695 + .long 2507634849 + .long 3218390623 + .long 2414862975 + .long 3218396543 + .long 845152874 + .long 3218402455 + .long 2194349235 + .long 3218408358 + .long 2267936813 + .long 3218414253 + .long 1165944702 + .long 3218420140 + .long 3282948707 + .long 3218426018 + .long 128204514 + .long 3218431889 + .long 390421100 + .long 3218437751 + .long 4167959282 + .long 3218443604 + .long 2968834018 + .long 3218449450 + .long 1185553177 + .long 3218455288 + .long 3210217930 + .long 3218461117 + .long 549623114 + .long 3218466939 + .long 1890030548 + .long 3218472752 + .long 3032400188 + .long 3218478557 + .long 4072261525 + .long 3218484354 + .long 3450874911 + .long 1070995813 + .long 2331021804 + .long 1070990032 + .long 1029453230 + .long 1070984259 + .long 3747176240 + .long 1070978493 + .long 1800682930 + .long 1070972736 + .long 3686719393 + .long 1070966986 + .long 722545241 + .long 1070961245 + .long 1405669883 + .long 1070955511 + .long 1349079372 + .long 1070949785 + .long 461103529 + .long 1070944067 + .long 2945413886 + .long 1070938356 + .long 121152472 + .long 1070932654 + .long 487700860 + .long 1070926959 + .long 3954874384 + .long 1070921271 + .long 1842920138 + .long 1070915592 + .long 2652318780 + .long 1070909920 + .long 1999011482 + .long 1070904256 + .long 4089234463 + .long 1070898599 + .long 244680560 + .long 1070892951 + .long 3262235675 + .long 1070887309 + .long 169336595 + .long 1070881676 + .long 3763576649 + .long 1070876049 + .long 1073096258 + .long 1070870431 + .long 601221319 + .long 1070864820 + .long 2261690268 + .long 1070859216 + .long 1673619518 + .long 1070853620 + .long 3046403514 + .long 1070848031 + .long 1999843716 + .long 1070842450 + .long 2744015967 + .long 1070836876 + .long 899399508 + .long 1070831310 + .long 676744370 + .long 1070825751 + .long 1992167703 + .long 1070820199 + .long 467152011 + .long 1070814655 + .long 313445281 + .long 1070809118 + .long 1448157352 + .long 1070803588 + .long 3788725476 + .long 1070798065 + .long 2957945300 + .long 1070792550 + .long 3168871046 + .long 1070787042 + .long 44944622 + .long 1070781542 + .long 2094830420 + .long 1070776048 + .long 647642559 + .long 1070770562 + .long 4212681596 + .long 1070765082 + .long 4119694493 + .long 1070759610 + .long 288676754 + .long 1070754146 + .long 1229870791 + .long 1070748688 + .long 2568927817 + .long 1070743237 + .long 4226775419 + .long 1070737793 + .long 1829681364 + .long 1070732357 + .long 3889121191 + .long 1070726927 + .long 1737005556 + .long 1070721505 + .long 3885417029 + .long 1070716089 + .long 1666870165 + .long 1070710681 + .long 3594048319 + .long 1070705279 + .long 1000063738 + .long 1070699885 + .long 2398194399 + .long 1070694497 + .long 3417111411 + .long 1070689116 + .long 3980746691 + .long 1070683742 + .long 4013324163 + .long 1070678375 + .long 3439358267 + .long 1070673015 + .long 2183652476 + .long 1070667662 + .long 171297820 + .long 1070662316 + .long 1622638721 + .long 1070656976 + .long 2168369647 + .long 1070651643 + .long 1734435555 + .long 1070646317 + .long 247063161 + .long 1070640998 + .long 1927726804 + .long 1070635685 + .long 2408245143 + .long 1070630379 + .long 1615681634 + .long 1070625080 + .long 3772343130 + .long 1070619787 + .long 215909304 + .long 1070614502 + .long 3759169634 + .long 1070609222 + .long 1445381777 + .long 1070603950 + .long 1792910451 + .long 1070598684 + .long 870975437 + .long 1070590754 + .long 3194096222 + .long 1070580248 + .long 1823716217 + .long 1070569756 + .long 913800688 + .long 1070559277 + .long 323875369 + .long 1070548811 + .long 4208958430 + .long 1070538357 + .long 3839688678 + .long 1070527917 + .long 3372126730 + .long 1070517490 + .long 2667883253 + .long 1070507076 + .long 1589083690 + .long 1070496675 + .long 4293333010 + .long 1070486286 + .long 2053843986 + .long 1070475911 + .long 3324205749 + .long 1070465548 + .long 3673610217 + .long 1070455198 + .long 2966718784 + .long 1070444861 + .long 1068692560 + .long 1070434537 + .long 2140157205 + .long 1070424225 + .long 1752298597 + .long 1070413926 + .long 4066729595 + .long 1070403639 + .long 360651144 + .long 1070393366 + .long 3386588242 + .long 1070383104 + .long 127747308 + .long 1070372856 + .long 3337621361 + .long 1070362619 + .long 380113 + .long 1070352396 + .long 2870475188 + .long 1070342184 + .long 3227997535 + .long 1070331985 + .long 943446189 + .long 1070321799 + .long 182758681 + .long 1070311625 + .long 817374162 + .long 1070301463 + .long 2719198427 + .long 1070291313 + .long 1465634365 + .long 1070281176 + .long 1224481606 + .long 1070271051 + .long 1869032404 + .long 1070260938 + .long 3273036717 + .long 1070250837 + .long 1015732707 + .long 1070240749 + .long 3561713742 + .long 1070230672 + .long 2196155141 + .long 1070220608 + .long 1089583089 + .long 1070210556 + .long 118003300 + .long 1070200516 + .long 3452833475 + .long 1070190487 + .long 2381031992 + .long 1070180471 + .long 1074899573 + .long 1070170467 + .long 3707175295 + .long 1070160474 + .long 1566132617 + .long 1070150494 + .long 3120348377 + .long 1070140525 + .long 3953929663 + .long 1070130568 + .long 3946380940 + .long 1070120623 + .long 2977634725 + .long 1070110690 + .long 928049556 + .long 1070100769 + .long 1973375279 + .long 1070090859 + .long 1699849154 + .long 1070080961 + .long 4284063055 + .long 1070071074 + .long 1018125008 + .long 1070061200 + .long 374428300 + .long 1070051337 + .long 2235845747 + .long 1070041485 + .long 2190695046 + .long 1070031645 + .long 122671437 + .long 1070021817 + .long 210845780 + .long 1070012000 + .long 2339728060 + .long 1070002194 + .long 2099265479 + .long 1069992400 + .long 3669742467 + .long 1069982617 + .long 2641909617 + .long 1069972846 + .long 3196851002 + .long 1069963086 + .long 926113142 + .long 1069953338 + .long 11572342 + .long 1069943601 + .long 340530969 + .long 1069933875 + .long 1800682930 + .long 1069924160 + .long 4280111857 + .long 1069914456 + .long 3372322013 + .long 1069904764 + .long 3261138386 + .long 1069895083 + .long 3835803021 + .long 1069885413 + .long 690973253 + .long 1069875755 + .long 2306589128 + .long 1069866107 + .long 4278067876 + .long 1069856470 + .long 2201204065 + .long 1069846845 + .long 262102455 + .long 1069837231 + .long 2647241692 + .long 1069827627 + .long 658570708 + .long 1069818035 + .long 2778278092 + .long 1069808453 + .long 309052031 + .long 1069798883 + .long 1733817001 + .long 1069789323 + .long 2650961017 + .long 1069779774 + .long 2954203158 + .long 1069770236 + .long 2537624622 + .long 1069760709 + .long 1295667077 + .long 1069751193 + .long 3418098326 + .long 1069741687 + .long 210141498 + .long 1069732193 + .long 157244505 + .long 1069722709 + .long 3155274661 + .long 1069713235 + .long 510517079 + .long 1069703773 + .long 709476866 + .long 1069694321 + .long 3649073763 + .long 1069684879 + .long 636640577 + .long 1069675449 + .long 159725394 + .long 1069666029 + .long 2116286250 + .long 1069656619 + .long 2109656884 + .long 1069647220 + .long 38479793 + .long 1069637832 + .long 96704707 + .long 1069628454 + .long 2183652476 + .long 1069619086 + .long 1904013563 + .long 1069609729 + .long 3452748429 + .long 1069600382 + .long 2435216853 + .long 1069591046 + .long 3047045639 + .long 1069581720 + .long 894257944 + .long 1069572405 + .long 173141005 + .long 1069563100 + .long 785342784 + .long 1069553805 + .long 970708326 + .long 1069541521 + .long 2645916898 + .long 1069522972 + .long 2106590683 + .long 1069504444 + .long 3453588195 + .long 1069485936 + .long 2198475040 + .long 1069467449 + .long 2443390270 + .long 1069448982 + .long 3996141691 + .long 1069430535 + .long 2370203065 + .long 1069412109 + .long 1669613218 + .long 1069393703 + .long 1704071394 + .long 1069375317 + .long 2283901796 + .long 1069356951 + .long 3220050856 + .long 1069338605 + .long 29117219 + .long 1069320280 + .long 1113218225 + .long 1069301974 + .long 1990183441 + .long 1069283688 + .long 2473421172 + .long 1069265422 + .long 2376948508 + .long 1069247176 + .long 1515388672 + .long 1069228950 + .long 3998935692 + .long 1069210743 + .long 1053482595 + .long 1069192557 + .long 1085389880 + .long 1069174390 + .long 3911679148 + .long 1069156242 + .long 760030536 + .long 1069138115 + .long 38583924 + .long 1069120007 + .long 1566132617 + .long 1069101918 + .long 867088104 + .long 1069083849 + .long 2056379433 + .long 1069065799 + .long 659581512 + .long 1069047769 + .long 792781808 + .long 1069029758 + .long 2277675977 + .long 1069011766 + .long 641565395 + .long 1068993794 + .long 2256601 + .long 1068975841 + .long 183156961 + .long 1068957907 + .long 1008239542 + .long 1068939992 + .long 2302040698 + .long 1068922096 + .long 3889657667 + .long 1068904219 + .long 1301778891 + .long 1068886362 + .long 2954550821 + .long 1068868523 + .long 84804484 + .long 1068850704 + .long 1109791498 + .long 1068832903 + .long 1562410668 + .long 1068815121 + .long 1271074840 + .long 1068797358 + .long 64741293 + .long 1068779614 + .long 2067876735 + .long 1068761888 + .long 2815553124 + .long 1068744181 + .long 2138347284 + .long 1068726493 + .long 4162338635 + .long 1068708823 + .long 129237761 + .long 1068691173 + .long 2756122533 + .long 1068673540 + .long 3285762921 + .long 1068655926 + .long 1551389854 + .long 1068638331 + .long 1681725707 + .long 1068620754 + .long 3511047527 + .long 1068603195 + .long 2579184841 + .long 1068585655 + .long 3016419377 + .long 1068568133 + .long 363613719 + .long 1068550630 + .long 3047045639 + .long 1068533144 + .long 2313634884 + .long 1068515677 + .long 296456961 + .long 1068497513 + .long 1367328035 + .long 1068462651 + .long 3221665916 + .long 1068427825 + .long 1242258971 + .long 1068393036 + .long 3697798734 + .long 1068358282 + .long 1678104687 + .long 1068323565 + .long 3453858508 + .long 1068288883 + .long 116861598 + .long 1068254238 + .long 4234736672 + .long 1068219627 + .long 2606283437 + .long 1068185053 + .long 3506114812 + .long 1068150514 + .long 2324914545 + .long 1068116011 + .long 3044269692 + .long 1068081543 + .long 1056797460 + .long 1068047111 + .long 346010435 + .long 1068012714 + .long 601410756 + .long 1067978352 + .long 1513453498 + .long 1067944025 + .long 2773542775 + .long 1067909733 + .long 4074027864 + .long 1067875476 + .long 813232056 + .long 1067841255 + .long 1275317999 + .long 1067807068 + .long 860480111 + .long 1067772916 + .long 3559777258 + .long 1067738798 + .long 480292498 + .long 1067704716 + .long 4204867691 + .long 1067670667 + .long 1547459502 + .long 1067636654 + .long 797775935 + .long 1067602675 + .long 1656501562 + .long 1067568730 + .long 3825228429 + .long 1067534819 + .long 2711485098 + .long 1067500943 + .long 2313634884 + .long 1067467101 + .long 376973398 + .long 1067416219 + .long 672386641 + .long 1067348671 + .long 630691842 + .long 1067281191 + .long 3960777458 + .long 1067213778 + .long 1488394470 + .long 1067146434 + .long 1220920383 + .long 1067079157 + .long 2577548405 + .long 1067011947 + .long 684247743 + .long 1066944805 + .long 3553625811 + .long 1066877729 + .long 2020150230 + .long 1066810721 + .long 4099880293 + .long 1066743779 + .long 630721729 + .long 1066676905 + .long 3927125538 + .long 1066610096 + .long 535440936 + .long 1066543355 + .long 2773516144 + .long 1066476679 + .long 1486051399 + .long 1066410070 + .long 808661260 + .long 1066285262 + .long 2227658502 + .long 1066152307 + .long 1813447778 + .long 1066019484 + .long 2743640746 + .long 1065886792 + .long 3904192454 + .long 1065754231 + .long 4184355568 + .long 1065621801 + .long 2476667369 + .long 1065489502 + .long 1971904113 + .long 1065357333 + .long 3138267131 + .long 1065097372 + .long 341338964 + .long 1064833554 + .long 1954052322 + .long 1064569994 + .long 1498975029 + .long 1064306693 + .long 2190050752 + .long 1063782660 + .long 1440057502 + .long 1063257089 + .long 1432705161 + .long 1062208000 + .long 0 + .long 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2900053258 + .long 1070176668 + .long 2900053258 + .long 1070176668 + .long 1208323809 + .long 3218079745 + .long 1208323809 + .long 3218079745 + .long 1431651269 + .long 1070945621 + .long 1431651269 + .long 1070945621 + .long 4294965279 + .long 3219128319 + .long 4294965279 + .long 3219128319 + .long 4294967295 + .long 1048575 + .long 4294967295 + .long 1048575 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1062207488 + .long 0 + .long 1062207488 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 3220176895 + .long 4294967295 + .long 3220176895 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 2134900735 + .long 4294963200 + .long 2134900735 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4227858432 + .long 4294967295 + .long 4227858432 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1040187392 + .long 0 + .long 1040187392 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294966272 + .long 4294967295 + .long 4294966272 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1082564608 + .long 0 + .long 1082564608 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1083176960 + .long 0 + .long 1083176960 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1083174912 + .long 0 + .long 1083174912 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2146435072 + .long 0 + .long 2146435072 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2134900736 + .long 0 + .long 2134900736 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4277811695 + .long 1072049730 + .long 4277811695 + .long 1072049730 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1104150528 + .long 0 + .long 1104150528 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070858240 + .long 0 + .long 1070858240 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070694400 + .long 0 + .long 1070694400 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070563328 + .long 0 + .long 1070563328 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1063256064 + .long 0 + .long 1063256064 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1077870592 + .long 0 + .long 1077870592 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 4294966784 + .long 0 + .long 4294966784 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4160749568 + .long 4294967295 + .long 4160749568 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4278190080 + .long 4294967295 + .long 4278190080 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 4294967295 + .long 4294963200 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1041235968 + .long 0 + .long 1041235968 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 55574528 + .long 0 + .long 55574528 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2146435072 + .long 0 + .long 4293918720 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1072693248 + .long 0 + .long 3220176896 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 0 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .type __svml_datanh_data_internal,@object + .size __svml_datanh_data_internal,14784 + .align 16 + +.FLT_26: + .long 0x00000000,0x43380000,0x00000000,0x43380000 + .type .FLT_26,@object + .size .FLT_26,16 + .align 8 + +__datanh_la_CoutTab: + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 2146435072 + .long 0 + .long 4293918720 + .type __datanh_la_CoutTab,@object + .size __datanh_la_CoutTab,32 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core-sse.S new file mode 100644 index 0000000000..a39cbb7595 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized atanh, vector length is 4. + 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 _ZGVdN4v_atanh _ZGVdN4v_atanh_sse_wrapper +#include "../svml_d_atanh4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core.c new file mode 100644 index 0000000000..e8ef343ae7 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized atanh, vector length is 4. + 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 _ZGVdN4v_atanh +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN4v_atanh, __GI__ZGVdN4v_atanh, __redirect__ZGVdN4v_atanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core_avx2.S new file mode 100644 index 0000000000..6dc72f269d --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh4_core_avx2.S @@ -0,0 +1,5080 @@ +/* Function atanh vectorized with AVX2. + 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVdN4v_atanh_avx2) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $384, %rsp + lea -4218816+__svml_datanh_data_internal(%rip), %rax + vmovupd 12928+__svml_datanh_data_internal(%rip), %ymm7 + vmovups %ymm11, 192(%rsp) + .cfi_escape 0x10, 0xde, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + +/* Load the constant 1 and a sign mask */ + vmovupd 12864+__svml_datanh_data_internal(%rip), %ymm11 + vmovups %ymm12, 224(%rsp) + vmovups %ymm13, 256(%rsp) + vmovups %ymm14, 288(%rsp) + vmovups %ymm9, 32(%rsp) + vmovups %ymm8, 96(%rsp) + vmovups %ymm15, 320(%rsp) + vmovups %ymm10, 160(%rsp) + .cfi_escape 0x10, 0xdb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdf, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe1, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe2, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x22 + vmovapd %ymm0, %ymm12 + +/* Strip off the sign, so treat X as positive until right at the end */ + vandpd %ymm7, %ymm12, %ymm1 + vsubpd %ymm1, %ymm11, %ymm6 + +/* + * Check whether |X| < 1, in which case we use the main function. + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN < 1). + */ + vcmpnlt_uqpd %ymm11, %ymm1, %ymm5 + vcmplt_oqpd 14592+__svml_datanh_data_internal(%rip), %ymm1, %ymm10 + vsubpd %ymm6, %ymm11, %ymm2 + +/* + * Compute V = 2 * X trivially, and UHi + U_lo = 1 - X in two pieces, + * the upper part UHi being <= 41 bits long. Then we have + * atanh(X) = 1/2 * log((1 + X) / (1 - X)) = 1/2 * log1p(V / (UHi + ULo)). + */ + vaddpd %ymm1, %ymm1, %ymm0 + vcvtpd2ps %ymm6, %xmm3 + vsubpd %ymm1, %ymm2, %ymm15 + vrcpps %xmm3, %xmm13 + vmovapd %ymm12, %ymm4 + vfmadd213pd %ymm12, %ymm12, %ymm4 + vcvtps2pd %xmm13, %ymm14 + +/* Record the sign for eventual reincorporation. */ + vandpd 14144+__svml_datanh_data_internal(%rip), %ymm12, %ymm9 + +/* Or the sign bit in with the tiny result to handle atanh(-0) correctly */ + vorpd %ymm9, %ymm4, %ymm8 + vandpd 14272+__svml_datanh_data_internal(%rip), %ymm14, %ymm4 + +/* No need to split dU when FMA is available */ + vfnmadd213pd %ymm11, %ymm4, %ymm6 + vfnmadd231pd %ymm4, %ymm15, %ymm6 + +/* 2^ (-10-exp(X) ) */ + vmovupd 13504+__svml_datanh_data_internal(%rip), %ymm15 + +/* + * Compute D = E + E^2 + E^3 + E^4 + E^5 + * = E + (E + E^2) (E + E * E^2) + * Only saves when FMA is available + */ + vmovapd %ymm11, %ymm1 + vmovapd %ymm6, %ymm3 + vfmadd231pd %ymm6, %ymm6, %ymm1 + vfmadd213pd %ymm6, %ymm6, %ymm3 + vfmadd213pd %ymm11, %ymm1, %ymm3 + vmovmskpd %ymm5, %edx + +/* + * Split V as well into upper 41 bits and lower part, so that we can get + * a preliminary quotient estimate without rounding error. + */ + vandpd 14464+__svml_datanh_data_internal(%rip), %ymm0, %ymm5 + vsubpd %ymm5, %ymm0, %ymm2 + +/* Hence get initial quotient estimate QHi + QLo = R * VHi + R * VLo */ + vmulpd %ymm5, %ymm4, %ymm14 + vmulpd %ymm3, %ymm6, %ymm0 + vmulpd %ymm2, %ymm4, %ymm13 + +/* + * Compute R * (VHi + VLo) * (1 + E + E^2 + E^3 + E^4 + E^5) + * = R * (VHi + VLo) * (1 + D) + * = QHi + (QHi * D + QLo + QLo * D) + */ + vmulpd %ymm0, %ymm14, %ymm6 + vfmadd213pd %ymm13, %ymm13, %ymm0 + vaddpd %ymm0, %ymm6, %ymm5 + +/* + * Now finally accumulate the high and low parts of the + * argument to log1p, H + L, with a final compensated summation. + */ + vaddpd %ymm5, %ymm14, %ymm4 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * later incorporating L into the reduced argument. + * compute 1+x as high, low parts + */ + vmaxpd %ymm4, %ymm11, %ymm2 + vminpd %ymm4, %ymm11, %ymm1 + vandpd %ymm7, %ymm4, %ymm7 + vcmplt_oqpd 12992+__svml_datanh_data_internal(%rip), %ymm7, %ymm0 + vaddpd %ymm1, %ymm2, %ymm5 + vorpd 13056+__svml_datanh_data_internal(%rip), %ymm0, %ymm4 + vandpd %ymm4, %ymm5, %ymm5 + +/* preserve mantissa, set input exponent to 2^(-10) */ + vandpd 12544+__svml_datanh_data_internal(%rip), %ymm5, %ymm6 + vorpd 12608+__svml_datanh_data_internal(%rip), %ymm6, %ymm7 + +/* reciprocal approximation good to at least 11 bits */ + vcvtpd2ps %ymm7, %xmm13 + vsubpd %ymm5, %ymm2, %ymm3 + +/* exponent bits */ + vpsrlq $20, %ymm5, %ymm2 + vrcpps %xmm13, %xmm14 + vaddpd %ymm3, %ymm1, %ymm4 + vcvtps2pd %xmm14, %ymm3 + +/* round reciprocal to nearest integer, will have 1+9 mantissa bits */ + vroundpd $0, %ymm3, %ymm3 + +/* + * prepare table index + * table lookup + */ + vpsrlq $40, %ymm3, %ymm13 + +/* exponent of X needed to scale Xl */ + vandps 13440+__svml_datanh_data_internal(%rip), %ymm5, %ymm0 + vpsubq %ymm0, %ymm15, %ymm6 + +/* Finally, halve the result and reincorporate the sign */ + vxorpd 13952+__svml_datanh_data_internal(%rip), %ymm9, %ymm9 + vmovd %xmm13, %ecx + vextractf128 $1, %ymm13, %xmm0 + movslq %ecx, %rcx + vpextrd $2, %xmm13, %r8d + movslq %r8d, %r8 + vmovd %xmm0, %r9d + vmovsd (%rax,%rcx), %xmm14 + vmovhpd (%rax,%r8), %xmm14, %xmm15 + +/* exponent*log(2.0) */ + vmovupd 13248+__svml_datanh_data_internal(%rip), %ymm14 + movslq %r9d, %r9 + vpextrd $2, %xmm0, %r10d + movslq %r10d, %r10 + vextractf128 $1, %ymm2, %xmm1 + vshufps $221, %xmm1, %xmm2, %xmm7 + +/* scale DblRcp */ + vmulpd %ymm6, %ymm3, %ymm2 + vmovsd (%rax,%r9), %xmm6 + +/* biased exponent in DP format */ + vcvtdq2pd %xmm7, %ymm1 + vmovhpd (%rax,%r10), %xmm6, %xmm7 + vcmplt_oqpd %ymm3, %ymm14, %ymm3 + +/* argument reduction */ + vfmsub213pd %ymm11, %ymm2, %ymm5 + vmulpd %ymm2, %ymm4, %ymm11 + vmovupd 12480+__svml_datanh_data_internal(%rip), %ymm2 + vaddpd %ymm11, %ymm5, %ymm5 + vandpd 13312+__svml_datanh_data_internal(%rip), %ymm3, %ymm3 + vorpd 13376+__svml_datanh_data_internal(%rip), %ymm3, %ymm6 + vsubpd %ymm6, %ymm1, %ymm1 + vfmadd213pd 12512+__svml_datanh_data_internal(%rip), %ymm5, %ymm2 + vmulpd %ymm5, %ymm5, %ymm4 + vmulpd 13568+__svml_datanh_data_internal(%rip), %ymm1, %ymm3 + +/* polynomial */ + vmovupd 12416+__svml_datanh_data_internal(%rip), %ymm1 + vfmadd213pd 12448+__svml_datanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213pd %ymm2, %ymm4, %ymm1 + +/* reconstruction */ + vfmadd213pd %ymm5, %ymm4, %ymm1 + vinsertf128 $1, %xmm7, %ymm15, %ymm0 + vaddpd %ymm1, %ymm0, %ymm0 + vaddpd %ymm0, %ymm3, %ymm6 + vmulpd %ymm6, %ymm9, %ymm0 + vblendvpd %ymm10, %ymm8, %ymm0, %ymm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + vmovups 96(%rsp), %ymm8 + cfi_restore(91) + vmovups 32(%rsp), %ymm9 + cfi_restore(92) + vmovups 160(%rsp), %ymm10 + cfi_restore(93) + vmovups 192(%rsp), %ymm11 + cfi_restore(94) + vmovups 224(%rsp), %ymm12 + cfi_restore(95) + vmovups 256(%rsp), %ymm13 + cfi_restore(96) + vmovups 288(%rsp), %ymm14 + cfi_restore(97) + vmovups 320(%rsp), %ymm15 + cfi_restore(98) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 0xdb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xde, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdf, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe1, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe2, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_3: + vmovupd %ymm12, 64(%rsp) + vmovupd %ymm0, 128(%rsp) + je .LBL_1_2 + xorl %eax, %eax + vzeroupper + movq %rsi, 8(%rsp) + movq %rdi, (%rsp) + movq %r12, 24(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x88, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x98, 0xfe, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 16(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xfe, 0xff, 0xff, 0x22 + movl %edx, %r13d + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $4, %r12d + jl .LBL_1_7 + movq 8(%rsp), %rsi + cfi_restore(4) + movq (%rsp), %rdi + cfi_restore(5) + movq 24(%rsp), %r12 + cfi_restore(12) + movq 16(%rsp), %r13 + cfi_restore(13) + vmovupd 128(%rsp), %ymm0 + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x88, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x98, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xfe, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 64(%rsp,%r12,8), %rdi + lea 128(%rsp,%r12,8), %rsi + call __svml_datanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVdN4v_atanh_avx2) + + .align 16,0x90 + +__svml_datanh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movsd (%rdi), %xmm0 + movb 7(%rdi), %dl + andb $127, %dl + movsd %xmm0, -8(%rsp) + cmpl $32752, %eax + je .LBL_2_6 + +.LBL_2_2: + cmpl $0, -8(%rsp) + jne .LBL_2_5 + movb %dl, -1(%rsp) + cmpl $1072693248, -4(%rsp) + jne .LBL_2_5 + divsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + movl $2, %eax + ret + +.LBL_2_5: + movsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movl $1, %eax + mulsd 16+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_6: + testl $1048575, 4(%rdi) + jne .LBL_2_8 + cmpl $0, (%rdi) + je .LBL_2_2 + +.LBL_2_8: + mulsd %xmm0, %xmm0 + xorl %eax, %eax + movsd %xmm0, (%rsi) + ret + + cfi_endproc + + .type __svml_datanh_cout_rare_internal,@function + .size __svml_datanh_cout_rare_internal,.-__svml_datanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_datanh_data_internal: + .long 3715793664 + .long 3230016299 + .long 4013928704 + .long 3189565726 + .long 3699038248 + .long 3230016303 + .long 4255595370 + .long 3189567439 + .long 3648859040 + .long 3230016307 + .long 1732833791 + .long 3189567296 + .long 3565385952 + .long 3230016311 + .long 2485752410 + .long 3189567274 + .long 3448748152 + .long 3230016315 + .long 3514744523 + .long 3189567800 + .long 3299074072 + .long 3230016319 + .long 3686511262 + .long 3189567474 + .long 3116491376 + .long 3230016323 + .long 716063611 + .long 3189567908 + .long 2901127016 + .long 3230016327 + .long 354437295 + .long 3189567291 + .long 2653107184 + .long 3230016331 + .long 3777462366 + .long 3189567264 + .long 2372557360 + .long 3230016335 + .long 3590663412 + .long 3189567498 + .long 2059602304 + .long 3230016339 + .long 1680795031 + .long 3189567428 + .long 1714366048 + .long 3230016343 + .long 2010344982 + .long 3189567986 + .long 1336971936 + .long 3230016347 + .long 166254822 + .long 3189567184 + .long 927542568 + .long 3230016351 + .long 59552610 + .long 3189567972 + .long 486199888 + .long 3230016355 + .long 2268824919 + .long 3189567664 + .long 13065112 + .long 3230016359 + .long 3005381643 + .long 3189567835 + .long 3803226080 + .long 3230016362 + .long 4018973165 + .long 3189567825 + .long 3266868056 + .long 3230016366 + .long 3693925101 + .long 3189567457 + .long 2699077504 + .long 3230016370 + .long 4005905743 + .long 3189567697 + .long 2099972936 + .long 3230016374 + .long 3580935118 + .long 3189567215 + .long 1469672176 + .long 3230016378 + .long 2928784295 + .long 3189567129 + .long 808292392 + .long 3230016382 + .long 674298833 + .long 3189567553 + .long 115950104 + .long 3230016386 + .long 2555938320 + .long 3189567208 + .long 3687728456 + .long 3230016389 + .long 532458218 + .long 3189567130 + .long 2933808064 + .long 3230016393 + .long 3888913110 + .long 3189567192 + .long 2149270784 + .long 3230016397 + .long 2365955494 + .long 3189567756 + .long 1334230552 + .long 3230016401 + .long 3325722981 + .long 3189567206 + .long 488800640 + .long 3230016405 + .long 1496133617 + .long 3189567683 + .long 3908061016 + .long 3230016408 + .long 1824836379 + .long 3189567490 + .long 3002189112 + .long 3230016412 + .long 1222174320 + .long 3189567837 + .long 2066263648 + .long 3230016416 + .long 2472769660 + .long 3189567285 + .long 1100395408 + .long 3230016420 + .long 447932460 + .long 3189567455 + .long 104694584 + .long 3230016424 + .long 1006807684 + .long 3189567460 + .long 3374238048 + .long 3230016427 + .long 4121834935 + .long 3189567556 + .long 2319200184 + .long 3230016431 + .long 3019906587 + .long 3189567664 + .long 1234656664 + .long 3230016435 + .long 3882744783 + .long 3189567930 + .long 120715280 + .long 3230016439 + .long 1927363170 + .long 3189567242 + .long 3272450504 + .long 3230016442 + .long 8203115 + .long 3189567876 + .long 2100034368 + .long 3230016446 + .long 1260625560 + .long 3189567855 + .long 898540192 + .long 3230016450 + .long 1791679111 + .long 3189567639 + .long 3963040720 + .long 3230016453 + .long 831133439 + .long 3189567590 + .long 2703706240 + .long 3230016457 + .long 2803140504 + .long 3189567482 + .long 1415608352 + .long 3230016461 + .long 2955844462 + .long 3189568058 + .long 98850816 + .long 3230016465 + .long 4017967070 + .long 3189567455 + .long 3048504096 + .long 3230016468 + .long 3974385451 + .long 3189567871 + .long 1674736240 + .long 3230016472 + .long 2424114556 + .long 3189567887 + .long 272616624 + .long 3230016476 + .long 4261883032 + .long 3189567073 + .long 3137214056 + .long 3230016479 + .long 3716750895 + .long 3189567522 + .long 1678694944 + .long 3230016483 + .long 498025304 + .long 3189567180 + .long 192127016 + .long 3230016487 + .long 1011852160 + .long 3189567511 + .long 2972577480 + .long 3230016490 + .long 558940916 + .long 3189567850 + .long 1430211120 + .long 3230016494 + .long 2550865739 + .long 3189567935 + .long 4155061376 + .long 3230016497 + .long 1930847170 + .long 3189567371 + .long 2557291968 + .long 3230016501 + .long 1716354804 + .long 3189567130 + .long 931967984 + .long 3230016505 + .long 2729403392 + .long 3189567981 + .long 3574154016 + .long 3230016508 + .long 1067280599 + .long 3189567890 + .long 1894012232 + .long 3230016512 + .long 2094260282 + .long 3189567604 + .long 186606176 + .long 3230016516 + .long 3897933165 + .long 3189568046 + .long 2746998904 + .long 3230016519 + .long 1935720459 + .long 3189567701 + .long 985351064 + .long 3230016523 + .long 2170344821 + .long 3189567164 + .long 3491691984 + .long 3230016526 + .long 4220979537 + .long 3189567547 + .long 1676181328 + .long 3230016530 + .long 1953924393 + .long 3189567854 + .long 4128847448 + .long 3230016533 + .long 1689829067 + .long 3189567468 + .long 2259849008 + .long 3230016537 + .long 2367753130 + .long 3189567619 + .long 364246088 + .long 3230016541 + .long 2263309073 + .long 3189567722 + .long 2737098280 + .long 3230016544 + .long 2366756869 + .long 3189567856 + .long 788562816 + .long 3230016548 + .long 2294653975 + .long 3189567145 + .long 3108665616 + .long 3230016551 + .long 1786494117 + .long 3189567254 + .long 1107562960 + .long 3230016555 + .long 3655887416 + .long 3189567689 + .long 3375279848 + .long 3230016558 + .long 1178948625 + .long 3189567241 + .long 1321971608 + .long 3230016562 + .long 1620080441 + .long 3189567466 + .long 3537662304 + .long 3230016565 + .long 154455618 + .long 3189567981 + .long 1432506360 + .long 3230016569 + .long 3128192125 + .long 3189567889 + .long 3596526920 + .long 3230016572 + .long 2026842750 + .long 3189567212 + .long 1439877480 + .long 3230016576 + .long 1384431897 + .long 3189567284 + .long 3552580280 + .long 3230016579 + .long 1999983129 + .long 3189568079 + .long 1344787944 + .long 3230016583 + .long 4035436820 + .long 3189567579 + .long 3406521808 + .long 3230016586 + .long 77799817 + .long 3189567285 + .long 1147933592 + .long 3230016590 + .long 1261060207 + .long 3189567477 + .long 3159043768 + .long 3230016593 + .long 2102717775 + .long 3189567605 + .long 850003184 + .long 3230016597 + .long 161472469 + .long 3189567688 + .long 2810831440 + .long 3230016600 + .long 1937336881 + .long 3189567665 + .long 451678520 + .long 3230016604 + .long 2268353549 + .long 3189567773 + .long 2362563168 + .long 3230016607 + .long 1785871595 + .long 3189567889 + .long 4248601816 + .long 3230016610 + .long 2434669991 + .long 3189567898 + .long 1814910472 + .long 3230016614 + .long 2666999375 + .long 3189568058 + .long 3651506624 + .long 3230016617 + .long 1033139811 + .long 3189567312 + .long 1168538136 + .long 3230016621 + .long 4004618418 + .long 3189567740 + .long 2956021672 + .long 3230016624 + .long 3799928764 + .long 3189567751 + .long 424104288 + .long 3230016628 + .long 3650233137 + .long 3189567549 + .long 2162801816 + .long 3230016631 + .long 437313833 + .long 3189567438 + .long 3877227800 + .long 3230016634 + .long 2138293494 + .long 3189567140 + .long 1272495376 + .long 3230016638 + .long 2891370752 + .long 3189567168 + .long 2938619176 + .long 3230016641 + .long 1704142730 + .long 3189567114 + .long 285744240 + .long 3230016645 + .long 500817607 + .long 3189568035 + .long 1903884424 + .long 3230016648 + .long 3102571944 + .long 3189567668 + .long 3498151272 + .long 3230016651 + .long 2374193154 + .long 3189567933 + .long 773655960 + .long 3230016655 + .long 2898331636 + .long 3189568089 + .long 2320411168 + .long 3230016658 + .long 1983295500 + .long 3189567113 + .long 3843527280 + .long 3230016661 + .long 2132853542 + .long 3189567093 + .long 1048114320 + .long 3230016665 + .long 3551155364 + .long 3189567407 + .long 2524183824 + .long 3230016668 + .long 2564000663 + .long 3189567090 + .long 3976845048 + .long 3230016671 + .long 361581803 + .long 3189567196 + .long 1111206880 + .long 3230016675 + .long 696765230 + .long 3189568040 + .long 2517279744 + .long 3230016678 + .long 941542475 + .long 3189567463 + .long 3900171776 + .long 3230016681 + .long 2377895552 + .long 3189567282 + .long 964990760 + .long 3230016685 + .long 1173605489 + .long 3189567454 + .long 2301746008 + .long 3230016688 + .long 3096720313 + .long 3189567400 + .long 3615544576 + .long 3230016691 + .long 1942008121 + .long 3189567335 + .long 611493160 + .long 3230016695 + .long 3375481119 + .long 3189567537 + .long 1879599992 + .long 3230016698 + .long 4103239143 + .long 3189567624 + .long 3124971056 + .long 3230016701 + .long 3773474925 + .long 3189567869 + .long 52711992 + .long 3230016705 + .long 2465315445 + .long 3189567444 + .long 1252829960 + .long 3230016708 + .long 1041581158 + .long 3189567781 + .long 2430429904 + .long 3230016711 + .long 166620501 + .long 3189567739 + .long 3585583704 + .long 3230016714 + .long 2379237630 + .long 3189567984 + .long 423395616 + .long 3230016718 + .long 134834559 + .long 3189567178 + .long 1533871416 + .long 3230016721 + .long 1449318760 + .long 3189567373 + .long 2622114680 + .long 3230016724 + .long 3042372984 + .long 3189567127 + .long 3688195920 + .long 3230016727 + .long 1265290101 + .long 3189567921 + .long 437218048 + .long 3230016731 + .long 2248549362 + .long 3189567262 + .long 1459185496 + .long 3230016734 + .long 1293250365 + .long 3189567151 + .long 2459200496 + .long 3230016737 + .long 313786605 + .long 3189567180 + .long 3437332240 + .long 3230016740 + .long 3289151823 + .long 3189567872 + .long 98682312 + .long 3230016744 + .long 2693758821 + .long 3189567877 + .long 1033253848 + .long 3230016747 + .long 4237443192 + .long 3189567301 + .long 1946147760 + .long 3230016750 + .long 4099404586 + .long 3189567972 + .long 2837431968 + .long 3230016753 + .long 343640666 + .long 3189567552 + .long 3707174040 + .long 3230016756 + .long 4238401458 + .long 3189567983 + .long 260473960 + .long 3230016760 + .long 21423548 + .long 3189567559 + .long 1087333264 + .long 3230016763 + .long 3515278593 + .long 3189567309 + .long 1892851296 + .long 3230016766 + .long 629106375 + .long 3189567166 + .long 2677094384 + .long 3230016769 + .long 2048670044 + .long 3189567227 + .long 3440128544 + .long 3230016772 + .long 3739217292 + .long 3189568009 + .long 4182019504 + .long 3230016775 + .long 3662039444 + .long 3189567618 + .long 607865368 + .long 3230016779 + .long 1766486991 + .long 3189567112 + .long 1307665824 + .long 3230016782 + .long 512689457 + .long 3189567670 + .long 1986518392 + .long 3230016785 + .long 1704577378 + .long 3189567760 + .long 2644487576 + .long 3230016788 + .long 4001935135 + .long 3189567473 + .long 3281637576 + .long 3230016791 + .long 1184452342 + .long 3189567735 + .long 3898032312 + .long 3230016794 + .long 2714793956 + .long 3189567464 + .long 198768096 + .long 3230016798 + .long 3657654418 + .long 3189567905 + .long 773842856 + .long 3230016801 + .long 2809688013 + .long 3189567736 + .long 1328352328 + .long 3230016804 + .long 390727591 + .long 3189567393 + .long 1862359256 + .long 3230016807 + .long 1135237925 + .long 3189567248 + .long 2375926096 + .long 3230016810 + .long 1377572509 + .long 3189567837 + .long 2869115032 + .long 3230016813 + .long 3148383775 + .long 3189568032 + .long 3341987960 + .long 3230016816 + .long 3809536738 + .long 3189567313 + .long 3794606472 + .long 3230016819 + .long 4243445934 + .long 3189568034 + .long 4227031920 + .long 3230016822 + .long 1302642088 + .long 3189567451 + .long 344358048 + .long 3230016826 + .long 3239125361 + .long 3189567151 + .long 736580224 + .long 3230016829 + .long 3753161736 + .long 3189567129 + .long 1108791648 + .long 3230016832 + .long 624357483 + .long 3189568045 + .long 1461052568 + .long 3230016835 + .long 3153257064 + .long 3189567338 + .long 1793422920 + .long 3230016838 + .long 2705820149 + .long 3189567635 + .long 2105962400 + .long 3230016841 + .long 911564860 + .long 3189567737 + .long 2398730424 + .long 3230016844 + .long 1086958332 + .long 3189567948 + .long 2671786152 + .long 3230016847 + .long 1598984535 + .long 3189567210 + .long 2925188456 + .long 3230016850 + .long 4113385879 + .long 3189567401 + .long 3158995968 + .long 3230016853 + .long 2426812671 + .long 3189567396 + .long 3373267048 + .long 3230016856 + .long 3480845679 + .long 3189567359 + .long 3568059792 + .long 3230016859 + .long 3306230729 + .long 3189567924 + .long 3743432056 + .long 3230016862 + .long 3853821277 + .long 3189567317 + .long 3899441408 + .long 3230016865 + .long 2049309148 + .long 3189567699 + .long 4036145192 + .long 3230016868 + .long 2667321817 + .long 3189567166 + .long 4153600472 + .long 3230016871 + .long 3540670389 + .long 3189567114 + .long 4251864072 + .long 3230016874 + .long 404207883 + .long 3189567310 + .long 36025272 + .long 3230016878 + .long 2837617046 + .long 3189567103 + .long 96074976 + .long 3230016881 + .long 1231280453 + .long 3189567669 + .long 137101976 + .long 3230016884 + .long 792492437 + .long 3189567071 + .long 159162080 + .long 3230016887 + .long 2385525292 + .long 3189567618 + .long 162310880 + .long 3230016890 + .long 3272051015 + .long 3189567858 + .long 146603712 + .long 3230016893 + .long 623573538 + .long 3189567881 + .long 112095672 + .long 3230016896 + .long 2151835939 + .long 3189567451 + .long 58841608 + .long 3230016899 + .long 958006130 + .long 3189567217 + .long 4281863424 + .long 3230016901 + .long 549948691 + .long 3189567863 + .long 4191280920 + .long 3230016904 + .long 4177689987 + .long 3189567217 + .long 4082115512 + .long 3230016907 + .long 2895765193 + .long 3189567599 + .long 3954421112 + .long 3230016910 + .long 1055606208 + .long 3189567799 + .long 3808251392 + .long 3230016913 + .long 1966521217 + .long 3189567351 + .long 3643659776 + .long 3230016916 + .long 1017382758 + .long 3189567732 + .long 3460699480 + .long 3230016919 + .long 3485890155 + .long 3189567410 + .long 3259423472 + .long 3230016922 + .long 2657419170 + .long 3189567140 + .long 3039884488 + .long 3230016925 + .long 4198858220 + .long 3189568080 + .long 2802135064 + .long 3230016928 + .long 2343740494 + .long 3189567869 + .long 2546227480 + .long 3230016931 + .long 2423084215 + .long 3189567957 + .long 2272213808 + .long 3230016934 + .long 3887273856 + .long 3189567631 + .long 1980145888 + .long 3230016937 + .long 3992755473 + .long 3189567251 + .long 1670075336 + .long 3230016940 + .long 722498073 + .long 3189567389 + .long 1342053552 + .long 3230016943 + .long 3573506400 + .long 3189567965 + .long 996131728 + .long 3230016946 + .long 714695829 + .long 3189567392 + .long 632360808 + .long 3230016949 + .long 2816704229 + .long 3189567846 + .long 250791552 + .long 3230016952 + .long 386951333 + .long 3189567243 + .long 4146441768 + .long 3230016954 + .long 2155319939 + .long 3189567580 + .long 3729427184 + .long 3230016957 + .long 4227840137 + .long 3189567931 + .long 3294765200 + .long 3230016960 + .long 1718354212 + .long 3189567672 + .long 2842505696 + .long 3230016963 + .long 4243880582 + .long 3189567656 + .long 2372698352 + .long 3230016966 + .long 3784093842 + .long 3189567302 + .long 1885392624 + .long 3230016969 + .long 2318733051 + .long 3189567813 + .long 1380637784 + .long 3230016972 + .long 497929746 + .long 3189567210 + .long 858482864 + .long 3230016975 + .long 3218883783 + .long 3189567649 + .long 318976720 + .long 3230016978 + .long 3492652862 + .long 3189567382 + .long 4057135272 + .long 3230016980 + .long 473724673 + .long 3189568069 + .long 3483072376 + .long 3230016983 + .long 150485010 + .long 3189567757 + .long 2891803552 + .long 3230016986 + .long 3028900958 + .long 3189567173 + .long 2283376816 + .long 3230016989 + .long 321242596 + .long 3189567822 + .long 1657840008 + .long 3230016992 + .long 151305746 + .long 3189568029 + .long 1015240760 + .long 3230016995 + .long 2208026401 + .long 3189567184 + .long 355626480 + .long 3230016998 + .long 2487781842 + .long 3189567931 + .long 3974011720 + .long 3230017000 + .long 2391142094 + .long 3189567091 + .long 3280508896 + .long 3230017003 + .long 734457618 + .long 3189568092 + .long 2570132168 + .long 3230017006 + .long 3070902701 + .long 3189567794 + .long 1842928168 + .long 3230017009 + .long 1110877923 + .long 3189567896 + .long 1098943352 + .long 3230017012 + .long 3880360185 + .long 3189567898 + .long 338223984 + .long 3230017015 + .long 391995809 + .long 3189567294 + .long 3855783416 + .long 3230017017 + .long 4186345433 + .long 3189567745 + .long 3061732952 + .long 3230017020 + .long 3682852050 + .long 3189567081 + .long 2251085560 + .long 3230017023 + .long 3057037137 + .long 3189567617 + .long 1423886760 + .long 3230017026 + .long 3352664894 + .long 3189567074 + .long 580181848 + .long 3230017029 + .long 1170568982 + .long 3189567927 + .long 4014983272 + .long 3230017031 + .long 671148579 + .long 3189567293 + .long 3138401368 + .long 3230017034 + .long 267496658 + .long 3189567304 + .long 2245448192 + .long 3230017037 + .long 1285167087 + .long 3189568066 + .long 1336168336 + .long 3230017040 + .long 4259909589 + .long 3189567788 + .long 410606184 + .long 3230017043 + .long 1494078902 + .long 3189568031 + .long 3763773256 + .long 3230017045 + .long 261935754 + .long 3189567685 + .long 2805778992 + .long 3230017048 + .long 3679585605 + .long 3189567195 + .long 1831634536 + .long 3230017051 + .long 809066513 + .long 3189567664 + .long 841383576 + .long 3230017054 + .long 385945238 + .long 3189567897 + .long 4130036912 + .long 3230017056 + .long 825579909 + .long 3189567603 + .long 3107703272 + .long 3230017059 + .long 3911295427 + .long 3189567514 + .long 2069393104 + .long 3230017062 + .long 3473784588 + .long 3189567461 + .long 1015149384 + .long 3230017065 + .long 629861200 + .long 3189567515 + .long 4239982216 + .long 3230017067 + .long 2659142760 + .long 3189567083 + .long 3153999632 + .long 3230017070 + .long 1251680713 + .long 3189567080 + .long 2052211384 + .long 3230017073 + .long 3168705163 + .long 3189567992 + .long 934659776 + .long 3230017076 + .long 1674797624 + .long 3189567952 + .long 4096354216 + .long 3230017078 + .long 437847902 + .long 3189567971 + .long 2947402064 + .long 3230017081 + .long 4024401533 + .long 3189567960 + .long 1782812400 + .long 3230017084 + .long 786902458 + .long 3189567873 + .long 602626840 + .long 3230017087 + .long 2593792633 + .long 3189567812 + .long 3701854136 + .long 3230017089 + .long 3989721221 + .long 3189567126 + .long 2490600968 + .long 3230017092 + .long 2545746866 + .long 3189567591 + .long 1263875768 + .long 3230017095 + .long 3115843521 + .long 3189567377 + .long 21719488 + .long 3230017098 + .long 1730226063 + .long 3189567307 + .long 3059140216 + .long 3230017100 + .long 690350922 + .long 3189567892 + .long 1786244008 + .long 3230017103 + .long 3350998585 + .long 3189567394 + .long 498038616 + .long 3230017106 + .long 1499123379 + .long 3189568082 + .long 3489531672 + .long 3230017108 + .long 2598665922 + .long 3189567118 + .long 2170828712 + .long 3230017111 + .long 2436376826 + .long 3189567935 + .long 836937048 + .long 3230017114 + .long 1977004902 + .long 3189568052 + .long 3782863816 + .long 3230017116 + .long 4027224619 + .long 3189567373 + .long 2418714096 + .long 3230017119 + .long 2616869856 + .long 3189567271 + .long 1039494712 + .long 3230017122 + .long 3775628133 + .long 3189567616 + .long 3940212336 + .long 3230017124 + .long 419018052 + .long 3189567909 + .long 2530971600 + .long 3230017127 + .long 150919657 + .long 3189567379 + .long 1106778856 + .long 3230017130 + .long 2926254537 + .long 3189567139 + .long 3962640312 + .long 3230017132 + .long 1610863810 + .long 3189567216 + .long 2508660136 + .long 3230017135 + .long 1166015244 + .long 3189567672 + .long 1039844240 + .long 3230017138 + .long 645159638 + .long 3189567685 + .long 3851198376 + .long 3230017140 + .long 2449439581 + .long 3189567695 + .long 2352826264 + .long 3230017143 + .long 1619104640 + .long 3189567458 + .long 839733360 + .long 3230017146 + .long 2427070371 + .long 3189567165 + .long 3606924968 + .long 3230017148 + .long 2166480890 + .long 3189567544 + .long 2064504368 + .long 3230017151 + .long 2283025905 + .long 3189567907 + .long 507476584 + .long 3230017154 + .long 3923356754 + .long 3189567272 + .long 3230846472 + .long 3230017156 + .long 805331677 + .long 3189567533 + .long 1644716880 + .long 3230017159 + .long 3790469685 + .long 3189567406 + .long 44092384 + .long 3230017162 + .long 2689788214 + .long 3189567653 + .long 2723977432 + .long 3230017164 + .long 2762250221 + .long 3189567072 + .long 1094474416 + .long 3230017167 + .long 2781925193 + .long 3189567716 + .long 3745554800 + .long 3230017169 + .long 593120878 + .long 3189567817 + .long 2087320704 + .long 3230017172 + .long 403414988 + .long 3189568021 + .long 414776008 + .long 3230017175 + .long 359307328 + .long 3189567387 + .long 3022924432 + .long 3230017177 + .long 3373547966 + .long 3189567572 + .long 1321867688 + .long 3230017180 + .long 3978711340 + .long 3189567805 + .long 3901576528 + .long 3230017182 + .long 2765663238 + .long 3189568046 + .long 2172152384 + .long 3230017185 + .long 1181150766 + .long 3189568053 + .long 428598440 + .long 3230017188 + .long 2473022131 + .long 3189567471 + .long 2965917728 + .long 3230017190 + .long 1621744488 + .long 3189567971 + .long 1194211288 + .long 3230017193 + .long 2931299013 + .long 3189567190 + .long 3703449168 + .long 3230017195 + .long 873154950 + .long 3189568039 + .long 1903732144 + .long 3230017198 + .long 1510784525 + .long 3189567521 + .long 90062704 + .long 3230017201 + .long 2918231590 + .long 3189568086 + .long 2557443240 + .long 3230017203 + .long 3329944838 + .long 3189567475 + .long 715974088 + .long 3230017206 + .long 2679715410 + .long 3189568021 + .long 3155624672 + .long 3230017208 + .long 1841110143 + .long 3189567518 + .long 1286495072 + .long 3230017211 + .long 3881638924 + .long 3189567497 + .long 3698554440 + .long 3230017213 + .long 167906931 + .long 3189567169 + .long 1801902600 + .long 3230017216 + .long 1468264167 + .long 3189567597 + .long 4186508448 + .long 3230017218 + .long 2400624638 + .long 3189567691 + .long 2262471560 + .long 3230017221 + .long 3796182064 + .long 3189567357 + .long 324793264 + .long 3230017224 + .long 2801238958 + .long 3189567581 + .long 2668474776 + .long 3230017226 + .long 2273142813 + .long 3189567436 + .long 703615288 + .long 3230017229 + .long 831867571 + .long 3189567237 + .long 3020183048 + .long 3230017231 + .long 2238048829 + .long 3189567595 + .long 1028277008 + .long 3230017234 + .long 1163763070 + .long 3189567452 + .long 3317865168 + .long 3230017236 + .long 1206450788 + .long 3189567228 + .long 1299046216 + .long 3230017239 + .long 737162226 + .long 3189567879 + .long 3561787920 + .long 3230017241 + .long 2433253277 + .long 3189567901 + .long 1516188728 + .long 3230017244 + .long 3561277099 + .long 3189567506 + .long 3752216144 + .long 3230017246 + .long 1385095507 + .long 3189567674 + .long 1679968384 + .long 3230017249 + .long 829462408 + .long 3189567156 + .long 3889412704 + .long 3230017251 + .long 2939266725 + .long 3189567673 + .long 1790647080 + .long 3230017254 + .long 4214100827 + .long 3189567848 + .long 3973638544 + .long 3230017256 + .long 2537954451 + .long 3189567376 + .long 1848484816 + .long 3230017259 + .long 1128740312 + .long 3189567098 + .long 4005152680 + .long 3230017261 + .long 1932232434 + .long 3189568053 + .long 1853739648 + .long 3230017264 + .long 1359710694 + .long 3189567457 + .long 3984212256 + .long 3230017266 + .long 1268482287 + .long 3189567990 + .long 1806667776 + .long 3230017269 + .long 839689017 + .long 3189567631 + .long 3911072520 + .long 3230017271 + .long 3727165601 + .long 3189567921 + .long 1707523520 + .long 3230017274 + .long 1836550952 + .long 3189567895 + .long 3785986872 + .long 3230017276 + .long 172951407 + .long 3189567220 + .long 1556559360 + .long 3230017279 + .long 1166449891 + .long 3189567294 + .long 3609206856 + .long 3230017281 + .long 28625366 + .long 3189567222 + .long 1354025920 + .long 3230017284 + .long 4038426582 + .long 3189567978 + .long 3380982208 + .long 3230017286 + .long 2756284659 + .long 3189567362 + .long 1100172048 + .long 3230017289 + .long 848830252 + .long 3189567230 + .long 3101560856 + .long 3230017291 + .long 1868170309 + .long 3189567423 + .long 795244752 + .long 3230017294 + .long 3128260908 + .long 3189567885 + .long 2771188936 + .long 3230017296 + .long 1691261279 + .long 3189567706 + .long 439489304 + .long 3230017299 + .long 2886711298 + .long 3189567236 + .long 2390110824 + .long 3230017301 + .long 1311431101 + .long 3189567133 + .long 33149176 + .long 3230017304 + .long 3042183093 + .long 3189567401 + .long 1958569120 + .long 3230017306 + .long 3174208880 + .long 3189567462 + .long 3871433416 + .long 3230017308 + .long 302374021 + .long 3189567243 + .long 1476804712 + .long 3230017311 + .long 712531519 + .long 3189567241 + .long 3364647440 + .long 3230017313 + .long 3705318448 + .long 3189567568 + .long 945056744 + .long 3230017316 + .long 2424171915 + .long 3189568016 + .long 2807996856 + .long 3230017318 + .long 199511961 + .long 3189567094 + .long 363562688 + .long 3230017321 + .long 3766234060 + .long 3189567214 + .long 2201718256 + .long 3230017323 + .long 1956195829 + .long 3189567592 + .long 4027525584 + .long 3230017325 + .long 2891794585 + .long 3189567375 + .long 1546046576 + .long 3230017328 + .long 843173017 + .long 3189567760 + .long 3347244936 + .long 3230017330 + .long 1609532414 + .long 3189567955 + .long 841215080 + .long 3230017333 + .long 3356704285 + .long 3189567294 + .long 2617920488 + .long 3230017335 + .long 1641729240 + .long 3189567346 + .long 87455368 + .long 3230017338 + .long 1455753222 + .long 3189567878 + .long 1839783016 + .long 3230017340 + .long 1936589978 + .long 3189567944 + .long 3579964728 + .long 3230017342 + .long 1006586129 + .long 3189567993 + .long 1013061704 + .long 3230017345 + .long 2766825484 + .long 3189567880 + .long 2729036928 + .long 3230017347 + .long 1888685184 + .long 3189567954 + .long 137984104 + .long 3230017350 + .long 848046306 + .long 3189568090 + .long 1829866024 + .long 3230017352 + .long 4178224056 + .long 3189567750 + .long 3509743488 + .long 3230017354 + .long 2637072474 + .long 3189567070 + .long 882677184 + .long 3230017357 + .long 3133305384 + .long 3189567936 + .long 2538629624 + .long 3230017359 + .long 1343200028 + .long 3189567905 + .long 4182661312 + .long 3230017361 + .long 107195460 + .long 3189567427 + .long 1519832648 + .long 3230017364 + .long 602154914 + .long 3189567857 + .long 3140105848 + .long 3230017366 + .long 659160740 + .long 3189567417 + .long 453573824 + .long 3230017369 + .long 236889930 + .long 3189567396 + .long 2050198592 + .long 3230017371 + .long 1175634921 + .long 3189567087 + .long 3635040168 + .long 3230017373 + .long 1241855527 + .long 3189567941 + .long 913158504 + .long 3230017376 + .long 3947904414 + .long 3189567477 + .long 2474515312 + .long 3230017378 + .long 1206979822 + .long 3189567534 + .long 4024170344 + .long 3230017380 + .long 1847397805 + .long 3189567152 + .long 1267183240 + .long 3230017383 + .long 2916539301 + .long 3189567754 + .long 2793515456 + .long 3230017385 + .long 2568213263 + .long 3189568078 + .long 13259168 + .long 3230017388 + .long 3003245330 + .long 3189567303 + .long 1516375624 + .long 3230017390 + .long 3472633477 + .long 3189567153 + .long 3007924104 + .long 3230017392 + .long 532406289 + .long 3189567855 + .long 192963816 + .long 3230017395 + .long 4149310663 + .long 3189567165 + .long 1661455728 + .long 3230017397 + .long 946970842 + .long 3189567598 + .long 3118458864 + .long 3230017399 + .long 2040517972 + .long 3189567254 + .long 269032128 + .long 3230017402 + .long 3669971831 + .long 3189568072 + .long 1703136256 + .long 3230017404 + .long 2375197389 + .long 3189567687 + .long 3125829976 + .long 3230017406 + .long 296757744 + .long 3189567673 + .long 242171944 + .long 3230017409 + .long 611424102 + .long 3189567452 + .long 1642122608 + .long 3230017411 + .long 1700968423 + .long 3189567419 + .long 3030740440 + .long 3230017413 + .long 2947762668 + .long 3189567968 + .long 113083840 + .long 3230017416 + .long 690901756 + .long 3189567496 + .long 1479112984 + .long 3230017418 + .long 121139903 + .long 3189567571 + .long 2833886088 + .long 3230017420 + .long 173386055 + .long 3189567866 + .long 4177428584 + .long 3230017422 + .long 2964718132 + .long 3189567231 + .long 1214798496 + .long 3230017425 + .long 541562024 + .long 3189567842 + .long 2535955680 + .long 3230017427 + .long 3368765612 + .long 3189568076 + .long 3845958008 + .long 3230017429 + .long 3194541507 + .long 3189567689 + .long 849863256 + .long 3230017432 + .long 3443356552 + .long 3189567858 + .long 2137631024 + .long 3230017434 + .long 1180679397 + .long 3189567138 + .long 3414318912 + .long 3230017436 + .long 2261929999 + .long 3189567651 + .long 384984464 + .long 3230017439 + .long 954057098 + .long 3189567971 + .long 1639587024 + .long 3230017441 + .long 1346995839 + .long 3189567263 + .long 2883183944 + .long 3230017443 + .long 3253373727 + .long 3189567382 + .long 4115799808 + .long 3230017445 + .long 4143791142 + .long 3189567800 + .long 1042491824 + .long 3230017448 + .long 4240432954 + .long 3189567700 + .long 2253218992 + .long 3230017450 + .long 1891708033 + .long 3189568072 + .long 3453038360 + .long 3230017452 + .long 710292621 + .long 3189567662 + .long 347006880 + .long 3230017455 + .long 2712254611 + .long 3189567116 + .long 1525083304 + .long 3230017457 + .long 349583280 + .long 3189568004 + .long 2692324448 + .long 3230017459 + .long 1803227864 + .long 3189567740 + .long 3848754312 + .long 3230017461 + .long 3644606976 + .long 3189567826 + .long 699429536 + .long 3230017464 + .long 1067153346 + .long 3189567751 + .long 1834308568 + .long 3230017466 + .long 1335350692 + .long 3189567081 + .long 2958447872 + .long 3230017468 + .long 1803696599 + .long 3189567557 + .long 4071871152 + .long 3230017470 + .long 1232152547 + .long 3189568017 + .long 879634736 + .long 3230017473 + .long 1455437901 + .long 3189567512 + .long 1971696744 + .long 3230017475 + .long 3708110750 + .long 3189567399 + .long 3053113344 + .long 3230017477 + .long 3907324819 + .long 3189567290 + .long 4123907920 + .long 3230017479 + .long 4080000314 + .long 3189567141 + .long 889136480 + .long 3230017482 + .long 1286519001 + .long 3189567298 + .long 1938756848 + .long 3230017484 + .long 1292347423 + .long 3189567513 + .long 2977824880 + .long 3230017486 + .long 1159725249 + .long 3189568015 + .long 4006363664 + .long 3230017488 + .long 895621348 + .long 3189567502 + .long 729428896 + .long 3230017491 + .long 1212894155 + .long 3189567280 + .long 1736978096 + .long 3230017493 + .long 296117275 + .long 3189567210 + .long 2734066816 + .long 3230017495 + .long 2463481211 + .long 3189567796 + .long 3720717848 + .long 3230017497 + .long 76524950 + .long 3189567159 + .long 401986584 + .long 3230017500 + .long 1718551671 + .long 3189567216 + .long 1367830248 + .long 3230017502 + .long 3568874946 + .long 3189567584 + .long 2323304104 + .long 3230017504 + .long 2763456396 + .long 3189567666 + .long 3268430632 + .long 3230017506 + .long 1208592501 + .long 3189567715 + .long 4203232240 + .long 3230017508 + .long 4148835618 + .long 3189567851 + .long 832763976 + .long 3230017511 + .long 610418007 + .long 3189567082 + .long 1746982680 + .long 3230017513 + .long 3035714190 + .long 3189567431 + .long 2650943256 + .long 3230017515 + .long 85931336 + .long 3189567843 + .long 3544667832 + .long 3230017517 + .long 3006685957 + .long 3189567286 + .long 133211144 + .long 3230017520 + .long 878859600 + .long 3189567873 + .long 1006529776 + .long 3230017522 + .long 854333969 + .long 3189567724 + .long 1869678336 + .long 3230017524 + .long 3058646748 + .long 3189567155 + .long 2722678648 + .long 3230017526 + .long 360733640 + .long 3189567693 + .long 3565552488 + .long 3230017528 + .long 3015564990 + .long 3189568013 + .long 103354256 + .long 3230017531 + .long 2286095909 + .long 3189568081 + .long 926040176 + .long 3230017533 + .long 1899270393 + .long 3189567137 + .long 1738664488 + .long 3230017535 + .long 1377641292 + .long 3189567833 + .long 2541248696 + .long 3230017537 + .long 4266686523 + .long 3189568077 + .long 3333814224 + .long 3230017539 + .long 4018775563 + .long 3189567218 + .long 4116382408 + .long 3230017541 + .long 3373913644 + .long 3189567103 + .long 594007232 + .long 3230017544 + .long 2818265402 + .long 3189568021 + .long 1356644520 + .long 3230017546 + .long 1075601108 + .long 3189567716 + .long 2109348112 + .long 3230017548 + .long 3342127702 + .long 3189567566 + .long 2852139088 + .long 3230017550 + .long 2910355434 + .long 3189567504 + .long 3585038464 + .long 3230017552 + .long 611858749 + .long 3189567074 + .long 13099880 + .long 3230017555 + .long 1954698831 + .long 3189567516 + .long 726278816 + .long 3230017557 + .long 550712630 + .long 3189567710 + .long 1429628792 + .long 3230017559 + .long 3672474493 + .long 3189567278 + .long 2123170544 + .long 3230017561 + .long 1160875209 + .long 3189567651 + .long 2806924760 + .long 3230017563 + .long 2242524344 + .long 3189568000 + .long 3480912064 + .long 3230017565 + .long 2823138691 + .long 3189567327 + .long 4145152992 + .long 3230017567 + .long 3521079748 + .long 3189567568 + .long 504700744 + .long 3230017570 + .long 1136670137 + .long 3189567486 + .long 1149510328 + .long 3230017572 + .long 806933442 + .long 3189567823 + .long 1784634816 + .long 3230017574 + .long 1606084669 + .long 3189567242 + .long 2410094488 + .long 3230017576 + .long 2841342625 + .long 3189567480 + .long 3025909584 + .long 3230017578 + .long 984188059 + .long 3189567239 + .long 3632100264 + .long 3230017580 + .long 3011730434 + .long 3189567337 + .long 4228686632 + .long 3230017582 + .long 328432041 + .long 3189567676 + .long 520721440 + .long 3230017585 + .long 2057225622 + .long 3189567268 + .long 1098159248 + .long 3230017587 + .long 3150727306 + .long 3189567348 + .long 1666052680 + .long 3230017589 + .long 3291380622 + .long 3189567307 + .long 2224421584 + .long 3230017591 + .long 3570771984 + .long 3189567798 + .long 2773285760 + .long 3230017593 + .long 2427604440 + .long 3189567698 + .long 3312664936 + .long 3230017595 + .long 3733848165 + .long 3189567211 + .long 3842578768 + .long 3230017597 + .long 2673912350 + .long 3189567904 + .long 68079584 + .long 3230017600 + .long 960995892 + .long 3189567616 + .long 579121512 + .long 3230017602 + .long 4150493479 + .long 3189567659 + .long 1080756744 + .long 3230017604 + .long 1054941272 + .long 3189567735 + .long 1573004704 + .long 3230017606 + .long 2574365292 + .long 3189568007 + .long 2055884768 + .long 3230017608 + .long 2507498673 + .long 3189567092 + .long 2529416224 + .long 3230017610 + .long 2082176323 + .long 3189567207 + .long 2993618320 + .long 3230017612 + .long 3719982601 + .long 3189568058 + .long 3448510256 + .long 3230017614 + .long 4104247904 + .long 3189567897 + .long 3894111152 + .long 3230017616 + .long 3735557011 + .long 3189567647 + .long 35472776 + .long 3230017619 + .long 2914260983 + .long 3189567862 + .long 462548736 + .long 3230017621 + .long 1334094042 + .long 3189567734 + .long 880390688 + .long 3230017623 + .long 1291097379 + .long 3189567171 + .long 1289017512 + .long 3230017625 + .long 1627119803 + .long 3189567853 + .long 1688448064 + .long 3230017627 + .long 3886873723 + .long 3189567117 + .long 2078701104 + .long 3230017629 + .long 627887757 + .long 3189567206 + .long 2459795360 + .long 3230017631 + .long 1722013861 + .long 3189567101 + .long 2831749488 + .long 3230017633 + .long 4163262354 + .long 3189567678 + .long 3194582104 + .long 3230017635 + .long 4170237688 + .long 3189567639 + .long 3548311752 + .long 3230017637 + .long 47563772 + .long 3189567637 + .long 3892956928 + .long 3230017639 + .long 2990136007 + .long 3189567231 + .long 4228536056 + .long 3230017641 + .long 4294532248 + .long 3189567995 + .long 260100240 + .long 3230017644 + .long 2060709623 + .long 3189567397 + .long 577602376 + .long 3230017646 + .long 1488525373 + .long 3189568044 + .long 886093456 + .long 3230017648 + .long 1657840200 + .long 3189567474 + .long 1185591680 + .long 3230017650 + .long 3155771782 + .long 3189567399 + .long 1476115208 + .long 3230017652 + .long 2195162329 + .long 3189567591 + .long 1757682144 + .long 3230017654 + .long 1292806663 + .long 3189567956 + .long 2030310544 + .long 3230017656 + .long 2151451208 + .long 3189567540 + .long 2294018392 + .long 3230017658 + .long 2224122735 + .long 3189567630 + .long 2548823632 + .long 3230017660 + .long 3554417607 + .long 3189567684 + .long 2794744152 + .long 3230017662 + .long 3831650627 + .long 3189567409 + .long 3031797776 + .long 3230017664 + .long 4024246224 + .long 3189567811 + .long 3260002296 + .long 3230017666 + .long 2530219738 + .long 3189567128 + .long 3479375416 + .long 3230017668 + .long 1618145996 + .long 3189568024 + .long 3689934832 + .long 3230017670 + .long 392379700 + .long 3189567378 + .long 3891698144 + .long 3230017672 + .long 55874694 + .long 3189567574 + .long 4084682928 + .long 3230017674 + .long 4294251475 + .long 3189567312 + .long 4268906688 + .long 3230017676 + .long 1899705040 + .long 3189567783 + .long 149419600 + .long 3230017679 + .long 357699389 + .long 3189567568 + .long 316173656 + .long 3230017681 + .long 3025711727 + .long 3189567790 + .long 474218920 + .long 3230017683 + .long 2921891821 + .long 3189568046 + .long 623572704 + .long 3230017685 + .long 1716968749 + .long 3189567453 + .long 764252248 + .long 3230017687 + .long 2393171526 + .long 3189567748 + .long 896274768 + .long 3230017689 + .long 1343317993 + .long 3189567172 + .long 1019657400 + .long 3230017691 + .long 1388235839 + .long 3189567661 + .long 1134417256 + .long 3230017693 + .long 2766147125 + .long 3189567706 + .long 1240571384 + .long 3230017695 + .long 2162068842 + .long 3189567499 + .long 1338136776 + .long 3230017697 + .long 4075455588 + .long 3189567932 + .long 1427130392 + .long 3230017699 + .long 1579647664 + .long 3189567555 + .long 1507569120 + .long 3230017701 + .long 3785749868 + .long 3189567715 + .long 1579469816 + .long 3230017703 + .long 2639950365 + .long 3189567469 + .long 1642849272 + .long 3230017705 + .long 3611501026 + .long 3189567698 + .long 1697724240 + .long 3230017707 + .long 15422953 + .long 3189568066 + .long 1744111424 + .long 3230017709 + .long 2642213241 + .long 3189568062 + .long 1782027472 + .long 3230017711 + .long 143606300 + .long 3189568058 + .long 1811488992 + .long 3230017713 + .long 501328690 + .long 3189567276 + .long 1832512520 + .long 3230017715 + .long 3258054578 + .long 3189567915 + .long 1845114576 + .long 3230017717 + .long 1297851139 + .long 3189568007 + .long 1849311616 + .long 3230017719 + .long 3589200000 + .long 3189567580 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .long 2846560486 + .long 3210737666 + .long 2729511872 + .long 3211784202 + .long 3956813460 + .long 3212307985 + .long 1796237193 + .long 3212828714 + .long 1562748889 + .long 3213092649 + .long 1602292343 + .long 3213352007 + .long 745814092 + .long 3213610865 + .long 2969306084 + .long 3213869224 + .long 3953060839 + .long 3214006263 + .long 1128703349 + .long 3214134948 + .long 1371067273 + .long 3214263386 + .long 131445019 + .long 3214391579 + .long 1427948820 + .long 3214519527 + .long 665817496 + .long 3214647232 + .long 1817459908 + .long 3214774694 + .long 242758400 + .long 3214901915 + .long 2082038134 + .long 3214981455 + .long 2300828032 + .long 3215044825 + .long 571795571 + .long 3215108076 + .long 3120479584 + .long 3215171207 + .long 3276640540 + .long 3215234220 + .long 2949178581 + .long 3215297115 + .long 4036279704 + .long 3215359892 + .long 4130528508 + .long 3215422552 + .long 813954767 + .long 3215485096 + .long 248046571 + .long 3215547523 + .long 4288926261 + .long 3215609833 + .long 1897492927 + .long 3215672029 + .long 3499237165 + .long 3215734109 + .long 2329611090 + .long 3215796075 + .long 203907094 + .long 3215857927 + .long 3222364838 + .long 3215919664 + .long 295408387 + .long 3215981289 + .long 899212401 + .long 3216012696 + .long 2606049022 + .long 3216043395 + .long 4003691233 + .long 3216074038 + .long 1675303236 + .long 3216104626 + .long 789189655 + .long 3216135158 + .long 2213928479 + .long 3216165634 + .long 2518405585 + .long 3216196055 + .long 2561783534 + .long 3216226421 + .long 3198568176 + .long 3216256732 + .long 983674944 + .long 3216286989 + .long 1057364031 + .long 3216317191 + .long 4260371496 + .long 3216347338 + .long 2838974660 + .long 3216377432 + .long 1919860988 + .long 3216407472 + .long 2330291020 + .long 3216437458 + .long 598130195 + .long 3216467391 + .long 1836782285 + .long 3216497270 + .long 2565351466 + .long 3216527096 + .long 3593575201 + .long 3216556869 + .long 1431920350 + .long 3216586590 + .long 1176515501 + .long 3216616258 + .long 3624279252 + .long 3216645873 + .long 977982819 + .long 3216675437 + .long 2616083454 + .long 3216704948 + .long 733015457 + .long 3216734408 + .long 403990373 + .long 3216763816 + .long 2405156675 + .long 3216793172 + .long 3213628385 + .long 3216822477 + .long 3597448029 + .long 3216851731 + .long 25680167 + .long 3216880935 + .long 1848308454 + .long 3216910087 + .long 1231492199 + .long 3216939189 + .long 3222364838 + .long 3216968240 + .long 4274224607 + .long 3216997241 + .long 836496059 + .long 3217026193 + .long 1119829323 + .long 3217043131 + .long 315251054 + .long 3217057557 + .long 518461891 + .long 3217071958 + .long 2094042713 + .long 3217086334 + .long 1109735857 + .long 3217100686 + .long 2221359788 + .long 3217115013 + .long 1492952593 + .long 3217129316 + .long 3576653728 + .long 3217143594 + .long 237880003 + .long 3217157849 + .long 420109003 + .long 3217172079 + .long 180120274 + .long 3217186285 + .long 4162843939 + .long 3217200466 + .long 4126536273 + .long 3217214624 + .long 417628115 + .long 3217228759 + .long 1970736719 + .long 3217242869 + .long 538873716 + .long 3217256956 + .long 758227830 + .long 3217271019 + .long 2968307242 + .long 3217285058 + .long 3211951040 + .long 3217299074 + .long 1825275166 + .long 3217313067 + .long 3437683677 + .long 3217327036 + .long 4086978021 + .long 3217340982 + .long 4104270002 + .long 3217354905 + .long 3819025464 + .long 3217368805 + .long 3559075183 + .long 3217382682 + .long 3650625670 + .long 3217396536 + .long 123302585 + .long 3217410368 + .long 1890030548 + .long 3217424176 + .long 682272600 + .long 3217437962 + .long 1114811729 + .long 3217451725 + .long 3505892050 + .long 3217465465 + .long 3877229085 + .long 3217479183 + .long 2543954549 + .long 3217492879 + .long 4114626469 + .long 3217506552 + .long 311370023 + .long 3217520204 + .long 34658569 + .long 3217533833 + .long 3593519732 + .long 3217547439 + .long 2705545195 + .long 3217561024 + .long 1971736889 + .long 3217574587 + .long 1696647441 + .long 3217588128 + .long 2183357019 + .long 3217601647 + .long 3733482817 + .long 3217615144 + .long 2352221150 + .long 3217628620 + .long 2633258676 + .long 3217642074 + .long 578912458 + .long 3217655507 + .long 780008323 + .long 3217668918 + .long 3530988084 + .long 3217682307 + .long 534951267 + .long 3217695676 + .long 673467853 + .long 3217709023 + .long 4236783385 + .long 3217722348 + .long 2923827788 + .long 3217735653 + .long 1317060595 + .long 3217748937 + .long 3997577740 + .long 3217762199 + .long 2660218276 + .long 3217775441 + .long 1883376699 + .long 3217788662 + .long 1949142230 + .long 3217801862 + .long 3138274530 + .long 3217815041 + .long 1435244737 + .long 3217828200 + .long 1413145637 + .long 3217841338 + .long 3348797986 + .long 3217854455 + .long 3222758658 + .long 3217867552 + .long 1309263324 + .long 3217880629 + .long 2176234471 + .long 3217893685 + .long 1800387473 + .long 3217906721 + .long 452140382 + .long 3217919737 + .long 2695621757 + .long 3217932732 + .long 208809263 + .long 3217945708 + .long 1848308454 + .long 3217958663 + .long 3584589359 + .long 3217971598 + .long 1386895968 + .long 3217984514 + .long 4108155659 + .long 3217997409 + .long 3420215606 + .long 3218010285 + .long 3878621277 + .long 3218023141 + .long 1447787319 + .long 3218035978 + .long 680874053 + .long 3218048795 + .long 1834892843 + .long 3218061592 + .long 870713292 + .long 3218074370 + .long 1168986141 + .long 3218083436 + .long 3245089583 + .long 3218089805 + .long 2494877761 + .long 3218096165 + .long 3338922950 + .long 3218102515 + .long 1607293197 + .long 3218108856 + .long 1719424943 + .long 3218115187 + .long 3799224547 + .long 3218121508 + .long 3675071677 + .long 3218127820 + .long 1469757259 + .long 3218134123 + .long 1600486820 + .long 3218140416 + .long 4188949205 + .long 3218146699 + .long 766352567 + .long 3218152974 + .long 43231408 + .long 3218159239 + .long 2139646042 + .long 3218165494 + .long 2880153102 + .long 3218171740 + .long 2383743325 + .long 3218177977 + .long 768877423 + .long 3218184205 + .long 2448456521 + .long 3218190423 + .long 3244923387 + .long 3218196632 + .long 3275167422 + .long 3218202832 + .long 2655560435 + .long 3218209023 + .long 1501959692 + .long 3218215205 + .long 4224678246 + .long 3218221377 + .long 2348618756 + .long 3218227541 + .long 283080250 + .long 3218233696 + .long 2436859197 + .long 3218239841 + .long 333350563 + .long 3218245978 + .long 2675321801 + .long 3218252105 + .long 985177381 + .long 3218258224 + .long 3964700035 + .long 3218264333 + .long 3135315249 + .long 3218270434 + .long 2902865164 + .long 3218276526 + .long 3377742213 + .long 3218282609 + .long 374891912 + .long 3218288684 + .long 2593684821 + .long 3218294749 + .long 1553148222 + .long 3218300806 + .long 1656739931 + .long 3218306854 + .long 3012481825 + .long 3218312893 + .long 1432962538 + .long 3218318924 + .long 1320242026 + .long 3218324946 + .long 2780952336 + .long 3218330959 + .long 1626300240 + .long 3218336964 + .long 2256971748 + .long 3218342960 + .long 483265518 + .long 3218348948 + .long 704964628 + .long 3218354927 + .long 3026437244 + .long 3218360897 + .long 3256639170 + .long 3218366859 + .long 1499050969 + .long 3218372813 + .long 2151680465 + .long 3218378758 + .long 1022163351 + .long 3218384695 + .long 2507634849 + .long 3218390623 + .long 2414862975 + .long 3218396543 + .long 845152874 + .long 3218402455 + .long 2194349235 + .long 3218408358 + .long 2267936813 + .long 3218414253 + .long 1165944702 + .long 3218420140 + .long 3282948707 + .long 3218426018 + .long 128204514 + .long 3218431889 + .long 390421100 + .long 3218437751 + .long 4167959282 + .long 3218443604 + .long 2968834018 + .long 3218449450 + .long 1185553177 + .long 3218455288 + .long 3210217930 + .long 3218461117 + .long 549623114 + .long 3218466939 + .long 1890030548 + .long 3218472752 + .long 3032400188 + .long 3218478557 + .long 4072261525 + .long 3218484354 + .long 3450874911 + .long 1070995813 + .long 2331021804 + .long 1070990032 + .long 1029453230 + .long 1070984259 + .long 3747176240 + .long 1070978493 + .long 1800682930 + .long 1070972736 + .long 3686719393 + .long 1070966986 + .long 722545241 + .long 1070961245 + .long 1405669883 + .long 1070955511 + .long 1349079372 + .long 1070949785 + .long 461103529 + .long 1070944067 + .long 2945413886 + .long 1070938356 + .long 121152472 + .long 1070932654 + .long 487700860 + .long 1070926959 + .long 3954874384 + .long 1070921271 + .long 1842920138 + .long 1070915592 + .long 2652318780 + .long 1070909920 + .long 1999011482 + .long 1070904256 + .long 4089234463 + .long 1070898599 + .long 244680560 + .long 1070892951 + .long 3262235675 + .long 1070887309 + .long 169336595 + .long 1070881676 + .long 3763576649 + .long 1070876049 + .long 1073096258 + .long 1070870431 + .long 601221319 + .long 1070864820 + .long 2261690268 + .long 1070859216 + .long 1673619518 + .long 1070853620 + .long 3046403514 + .long 1070848031 + .long 1999843716 + .long 1070842450 + .long 2744015967 + .long 1070836876 + .long 899399508 + .long 1070831310 + .long 676744370 + .long 1070825751 + .long 1992167703 + .long 1070820199 + .long 467152011 + .long 1070814655 + .long 313445281 + .long 1070809118 + .long 1448157352 + .long 1070803588 + .long 3788725476 + .long 1070798065 + .long 2957945300 + .long 1070792550 + .long 3168871046 + .long 1070787042 + .long 44944622 + .long 1070781542 + .long 2094830420 + .long 1070776048 + .long 647642559 + .long 1070770562 + .long 4212681596 + .long 1070765082 + .long 4119694493 + .long 1070759610 + .long 288676754 + .long 1070754146 + .long 1229870791 + .long 1070748688 + .long 2568927817 + .long 1070743237 + .long 4226775419 + .long 1070737793 + .long 1829681364 + .long 1070732357 + .long 3889121191 + .long 1070726927 + .long 1737005556 + .long 1070721505 + .long 3885417029 + .long 1070716089 + .long 1666870165 + .long 1070710681 + .long 3594048319 + .long 1070705279 + .long 1000063738 + .long 1070699885 + .long 2398194399 + .long 1070694497 + .long 3417111411 + .long 1070689116 + .long 3980746691 + .long 1070683742 + .long 4013324163 + .long 1070678375 + .long 3439358267 + .long 1070673015 + .long 2183652476 + .long 1070667662 + .long 171297820 + .long 1070662316 + .long 1622638721 + .long 1070656976 + .long 2168369647 + .long 1070651643 + .long 1734435555 + .long 1070646317 + .long 247063161 + .long 1070640998 + .long 1927726804 + .long 1070635685 + .long 2408245143 + .long 1070630379 + .long 1615681634 + .long 1070625080 + .long 3772343130 + .long 1070619787 + .long 215909304 + .long 1070614502 + .long 3759169634 + .long 1070609222 + .long 1445381777 + .long 1070603950 + .long 1792910451 + .long 1070598684 + .long 870975437 + .long 1070590754 + .long 3194096222 + .long 1070580248 + .long 1823716217 + .long 1070569756 + .long 913800688 + .long 1070559277 + .long 323875369 + .long 1070548811 + .long 4208958430 + .long 1070538357 + .long 3839688678 + .long 1070527917 + .long 3372126730 + .long 1070517490 + .long 2667883253 + .long 1070507076 + .long 1589083690 + .long 1070496675 + .long 4293333010 + .long 1070486286 + .long 2053843986 + .long 1070475911 + .long 3324205749 + .long 1070465548 + .long 3673610217 + .long 1070455198 + .long 2966718784 + .long 1070444861 + .long 1068692560 + .long 1070434537 + .long 2140157205 + .long 1070424225 + .long 1752298597 + .long 1070413926 + .long 4066729595 + .long 1070403639 + .long 360651144 + .long 1070393366 + .long 3386588242 + .long 1070383104 + .long 127747308 + .long 1070372856 + .long 3337621361 + .long 1070362619 + .long 380113 + .long 1070352396 + .long 2870475188 + .long 1070342184 + .long 3227997535 + .long 1070331985 + .long 943446189 + .long 1070321799 + .long 182758681 + .long 1070311625 + .long 817374162 + .long 1070301463 + .long 2719198427 + .long 1070291313 + .long 1465634365 + .long 1070281176 + .long 1224481606 + .long 1070271051 + .long 1869032404 + .long 1070260938 + .long 3273036717 + .long 1070250837 + .long 1015732707 + .long 1070240749 + .long 3561713742 + .long 1070230672 + .long 2196155141 + .long 1070220608 + .long 1089583089 + .long 1070210556 + .long 118003300 + .long 1070200516 + .long 3452833475 + .long 1070190487 + .long 2381031992 + .long 1070180471 + .long 1074899573 + .long 1070170467 + .long 3707175295 + .long 1070160474 + .long 1566132617 + .long 1070150494 + .long 3120348377 + .long 1070140525 + .long 3953929663 + .long 1070130568 + .long 3946380940 + .long 1070120623 + .long 2977634725 + .long 1070110690 + .long 928049556 + .long 1070100769 + .long 1973375279 + .long 1070090859 + .long 1699849154 + .long 1070080961 + .long 4284063055 + .long 1070071074 + .long 1018125008 + .long 1070061200 + .long 374428300 + .long 1070051337 + .long 2235845747 + .long 1070041485 + .long 2190695046 + .long 1070031645 + .long 122671437 + .long 1070021817 + .long 210845780 + .long 1070012000 + .long 2339728060 + .long 1070002194 + .long 2099265479 + .long 1069992400 + .long 3669742467 + .long 1069982617 + .long 2641909617 + .long 1069972846 + .long 3196851002 + .long 1069963086 + .long 926113142 + .long 1069953338 + .long 11572342 + .long 1069943601 + .long 340530969 + .long 1069933875 + .long 1800682930 + .long 1069924160 + .long 4280111857 + .long 1069914456 + .long 3372322013 + .long 1069904764 + .long 3261138386 + .long 1069895083 + .long 3835803021 + .long 1069885413 + .long 690973253 + .long 1069875755 + .long 2306589128 + .long 1069866107 + .long 4278067876 + .long 1069856470 + .long 2201204065 + .long 1069846845 + .long 262102455 + .long 1069837231 + .long 2647241692 + .long 1069827627 + .long 658570708 + .long 1069818035 + .long 2778278092 + .long 1069808453 + .long 309052031 + .long 1069798883 + .long 1733817001 + .long 1069789323 + .long 2650961017 + .long 1069779774 + .long 2954203158 + .long 1069770236 + .long 2537624622 + .long 1069760709 + .long 1295667077 + .long 1069751193 + .long 3418098326 + .long 1069741687 + .long 210141498 + .long 1069732193 + .long 157244505 + .long 1069722709 + .long 3155274661 + .long 1069713235 + .long 510517079 + .long 1069703773 + .long 709476866 + .long 1069694321 + .long 3649073763 + .long 1069684879 + .long 636640577 + .long 1069675449 + .long 159725394 + .long 1069666029 + .long 2116286250 + .long 1069656619 + .long 2109656884 + .long 1069647220 + .long 38479793 + .long 1069637832 + .long 96704707 + .long 1069628454 + .long 2183652476 + .long 1069619086 + .long 1904013563 + .long 1069609729 + .long 3452748429 + .long 1069600382 + .long 2435216853 + .long 1069591046 + .long 3047045639 + .long 1069581720 + .long 894257944 + .long 1069572405 + .long 173141005 + .long 1069563100 + .long 785342784 + .long 1069553805 + .long 970708326 + .long 1069541521 + .long 2645916898 + .long 1069522972 + .long 2106590683 + .long 1069504444 + .long 3453588195 + .long 1069485936 + .long 2198475040 + .long 1069467449 + .long 2443390270 + .long 1069448982 + .long 3996141691 + .long 1069430535 + .long 2370203065 + .long 1069412109 + .long 1669613218 + .long 1069393703 + .long 1704071394 + .long 1069375317 + .long 2283901796 + .long 1069356951 + .long 3220050856 + .long 1069338605 + .long 29117219 + .long 1069320280 + .long 1113218225 + .long 1069301974 + .long 1990183441 + .long 1069283688 + .long 2473421172 + .long 1069265422 + .long 2376948508 + .long 1069247176 + .long 1515388672 + .long 1069228950 + .long 3998935692 + .long 1069210743 + .long 1053482595 + .long 1069192557 + .long 1085389880 + .long 1069174390 + .long 3911679148 + .long 1069156242 + .long 760030536 + .long 1069138115 + .long 38583924 + .long 1069120007 + .long 1566132617 + .long 1069101918 + .long 867088104 + .long 1069083849 + .long 2056379433 + .long 1069065799 + .long 659581512 + .long 1069047769 + .long 792781808 + .long 1069029758 + .long 2277675977 + .long 1069011766 + .long 641565395 + .long 1068993794 + .long 2256601 + .long 1068975841 + .long 183156961 + .long 1068957907 + .long 1008239542 + .long 1068939992 + .long 2302040698 + .long 1068922096 + .long 3889657667 + .long 1068904219 + .long 1301778891 + .long 1068886362 + .long 2954550821 + .long 1068868523 + .long 84804484 + .long 1068850704 + .long 1109791498 + .long 1068832903 + .long 1562410668 + .long 1068815121 + .long 1271074840 + .long 1068797358 + .long 64741293 + .long 1068779614 + .long 2067876735 + .long 1068761888 + .long 2815553124 + .long 1068744181 + .long 2138347284 + .long 1068726493 + .long 4162338635 + .long 1068708823 + .long 129237761 + .long 1068691173 + .long 2756122533 + .long 1068673540 + .long 3285762921 + .long 1068655926 + .long 1551389854 + .long 1068638331 + .long 1681725707 + .long 1068620754 + .long 3511047527 + .long 1068603195 + .long 2579184841 + .long 1068585655 + .long 3016419377 + .long 1068568133 + .long 363613719 + .long 1068550630 + .long 3047045639 + .long 1068533144 + .long 2313634884 + .long 1068515677 + .long 296456961 + .long 1068497513 + .long 1367328035 + .long 1068462651 + .long 3221665916 + .long 1068427825 + .long 1242258971 + .long 1068393036 + .long 3697798734 + .long 1068358282 + .long 1678104687 + .long 1068323565 + .long 3453858508 + .long 1068288883 + .long 116861598 + .long 1068254238 + .long 4234736672 + .long 1068219627 + .long 2606283437 + .long 1068185053 + .long 3506114812 + .long 1068150514 + .long 2324914545 + .long 1068116011 + .long 3044269692 + .long 1068081543 + .long 1056797460 + .long 1068047111 + .long 346010435 + .long 1068012714 + .long 601410756 + .long 1067978352 + .long 1513453498 + .long 1067944025 + .long 2773542775 + .long 1067909733 + .long 4074027864 + .long 1067875476 + .long 813232056 + .long 1067841255 + .long 1275317999 + .long 1067807068 + .long 860480111 + .long 1067772916 + .long 3559777258 + .long 1067738798 + .long 480292498 + .long 1067704716 + .long 4204867691 + .long 1067670667 + .long 1547459502 + .long 1067636654 + .long 797775935 + .long 1067602675 + .long 1656501562 + .long 1067568730 + .long 3825228429 + .long 1067534819 + .long 2711485098 + .long 1067500943 + .long 2313634884 + .long 1067467101 + .long 376973398 + .long 1067416219 + .long 672386641 + .long 1067348671 + .long 630691842 + .long 1067281191 + .long 3960777458 + .long 1067213778 + .long 1488394470 + .long 1067146434 + .long 1220920383 + .long 1067079157 + .long 2577548405 + .long 1067011947 + .long 684247743 + .long 1066944805 + .long 3553625811 + .long 1066877729 + .long 2020150230 + .long 1066810721 + .long 4099880293 + .long 1066743779 + .long 630721729 + .long 1066676905 + .long 3927125538 + .long 1066610096 + .long 535440936 + .long 1066543355 + .long 2773516144 + .long 1066476679 + .long 1486051399 + .long 1066410070 + .long 808661260 + .long 1066285262 + .long 2227658502 + .long 1066152307 + .long 1813447778 + .long 1066019484 + .long 2743640746 + .long 1065886792 + .long 3904192454 + .long 1065754231 + .long 4184355568 + .long 1065621801 + .long 2476667369 + .long 1065489502 + .long 1971904113 + .long 1065357333 + .long 3138267131 + .long 1065097372 + .long 341338964 + .long 1064833554 + .long 1954052322 + .long 1064569994 + .long 1498975029 + .long 1064306693 + .long 2190050752 + .long 1063782660 + .long 1440057502 + .long 1063257089 + .long 1432705161 + .long 1062208000 + .long 0 + .long 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2900053258 + .long 1070176668 + .long 2900053258 + .long 1070176668 + .long 2900053258 + .long 1070176668 + .long 2900053258 + .long 1070176668 + .long 1208323809 + .long 3218079745 + .long 1208323809 + .long 3218079745 + .long 1208323809 + .long 3218079745 + .long 1208323809 + .long 3218079745 + .long 1431651269 + .long 1070945621 + .long 1431651269 + .long 1070945621 + .long 1431651269 + .long 1070945621 + .long 1431651269 + .long 1070945621 + .long 4294965279 + .long 3219128319 + .long 4294965279 + .long 3219128319 + .long 4294965279 + .long 3219128319 + .long 4294965279 + .long 3219128319 + .long 4294967295 + .long 1048575 + .long 4294967295 + .long 1048575 + .long 4294967295 + .long 1048575 + .long 4294967295 + .long 1048575 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1062207488 + .long 0 + .long 1062207488 + .long 0 + .long 1062207488 + .long 0 + .long 1062207488 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 3220176895 + .long 4294967295 + .long 3220176895 + .long 4294967295 + .long 3220176895 + .long 4294967295 + .long 3220176895 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 2134900735 + .long 4294963200 + .long 2134900735 + .long 4294963200 + .long 2134900735 + .long 4294963200 + .long 2134900735 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4227858432 + .long 4294967295 + .long 4227858432 + .long 4294967295 + .long 4227858432 + .long 4294967295 + .long 4227858432 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1040187392 + .long 0 + .long 1040187392 + .long 0 + .long 1040187392 + .long 0 + .long 1040187392 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294966272 + .long 4294967295 + .long 4294966272 + .long 4294967295 + .long 4294966272 + .long 4294967295 + .long 4294966272 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1082564608 + .long 0 + .long 1082564608 + .long 0 + .long 1082564608 + .long 0 + .long 1082564608 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1083176960 + .long 0 + .long 1083176960 + .long 0 + .long 1083176960 + .long 0 + .long 1083176960 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1083174912 + .long 0 + .long 1083174912 + .long 0 + .long 1083174912 + .long 0 + .long 1083174912 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2146435072 + .long 0 + .long 2146435072 + .long 0 + .long 2146435072 + .long 0 + .long 2146435072 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2134900736 + .long 0 + .long 2134900736 + .long 0 + .long 2134900736 + .long 0 + .long 2134900736 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4277811695 + .long 1072049730 + .long 4277811695 + .long 1072049730 + .long 4277811695 + .long 1072049730 + .long 4277811695 + .long 1072049730 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1104150528 + .long 0 + .long 1104150528 + .long 0 + .long 1104150528 + .long 0 + .long 1104150528 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070858240 + .long 0 + .long 1070858240 + .long 0 + .long 1070858240 + .long 0 + .long 1070858240 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070694400 + .long 0 + .long 1070694400 + .long 0 + .long 1070694400 + .long 0 + .long 1070694400 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1070563328 + .long 0 + .long 1070563328 + .long 0 + .long 1070563328 + .long 0 + .long 1070563328 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1063256064 + .long 0 + .long 1063256064 + .long 0 + .long 1063256064 + .long 0 + .long 1063256064 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1077870592 + .long 0 + .long 1077870592 + .long 0 + .long 1077870592 + .long 0 + .long 1077870592 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 4294966784 + .long 0 + .long 4294966784 + .long 0 + .long 4294966784 + .long 0 + .long 4294966784 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4160749568 + .long 4294967295 + .long 4160749568 + .long 4294967295 + .long 4160749568 + .long 4294967295 + .long 4160749568 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4278190080 + .long 4294967295 + .long 4278190080 + .long 4294967295 + .long 4278190080 + .long 4294967295 + .long 4278190080 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 4294967295 + .long 4294963200 + .long 4294967295 + .long 4294963200 + .long 4294967295 + .long 4294963200 + .long 4294967295 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1041235968 + .long 0 + .long 1041235968 + .long 0 + .long 1041235968 + .long 0 + .long 1041235968 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 55574528 + .long 0 + .long 55574528 + .long 0 + .long 55574528 + .long 0 + .long 55574528 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2146435072 + .long 0 + .long 4293918720 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 1072693248 + .long 0 + .long 3220176896 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 0 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .type __svml_datanh_data_internal,@object + .size __svml_datanh_data_internal,14848 + .align 8 + +__datanh_la_CoutTab: + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 2146435072 + .long 0 + .long 4293918720 + .type __datanh_la_CoutTab,@object + .size __datanh_la_CoutTab,32 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core-avx2.S new file mode 100644 index 0000000000..675ebd2fd6 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized atanh, vector length is 8. + 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 _ZGVeN8v_atanh _ZGVeN8v_atanh_avx2_wrapper +#include "../svml_d_atanh8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core.c new file mode 100644 index 0000000000..4da8e20fad --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized atanh, vector length is 8. + 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 _ZGVeN8v_atanh +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN8v_atanh, __GI__ZGVeN8v_atanh, __redirect__ZGVeN8v_atanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core_avx512.S new file mode 100644 index 0000000000..9881d70d6f --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_atanh8_core_avx512.S @@ -0,0 +1,632 @@ +/* Function atanh vectorized with AVX-512. + 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * using small lookup table that map to AVX-512 permute instructions + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVeN8v_atanh_skx) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $192, %rsp + vmovups 256+__svml_datanh_data_internal_avx512(%rip), %zmm15 + +/* round reciprocals to 1+4b mantissas */ + vmovups 384+__svml_datanh_data_internal_avx512(%rip), %zmm6 + vmovups 448+__svml_datanh_data_internal_avx512(%rip), %zmm9 + vmovaps %zmm0, %zmm2 + vandpd 320+__svml_datanh_data_internal_avx512(%rip), %zmm2, %zmm13 + +/* 1+y */ + vaddpd {rn-sae}, %zmm15, %zmm13, %zmm0 + +/* 1-y */ + vsubpd {rn-sae}, %zmm13, %zmm15, %zmm4 + vxorpd %zmm13, %zmm2, %zmm1 + +/* Yp_high */ + vsubpd {rn-sae}, %zmm15, %zmm0, %zmm7 + +/* -Ym_high */ + vsubpd {rn-sae}, %zmm15, %zmm4, %zmm12 + +/* RcpP ~ 1/Yp */ + vrcp14pd %zmm0, %zmm3 + +/* RcpM ~ 1/Ym */ + vrcp14pd %zmm4, %zmm5 + +/* input outside (-1, 1) ? */ + vcmppd $21, {sae}, %zmm15, %zmm13, %k0 + vpaddq %zmm6, %zmm3, %zmm11 + vpaddq %zmm6, %zmm5, %zmm10 + +/* Yp_low */ + vsubpd {rn-sae}, %zmm7, %zmm13, %zmm8 + vandpd %zmm9, %zmm11, %zmm14 + vandpd %zmm9, %zmm10, %zmm3 + +/* Ym_low */ + vaddpd {rn-sae}, %zmm12, %zmm13, %zmm12 + +/* Reduced argument: Rp = (RcpP*Yp - 1)+RcpP*Yp_low */ + vfmsub213pd {rn-sae}, %zmm15, %zmm14, %zmm0 + +/* Reduced argument: Rm = (RcpM*Ym - 1)+RcpM*Ym_low */ + vfmsub231pd {rn-sae}, %zmm3, %zmm4, %zmm15 + +/* exponents */ + vgetexppd {sae}, %zmm14, %zmm5 + vgetexppd {sae}, %zmm3, %zmm4 + +/* Table lookups */ + vmovups __svml_datanh_data_internal_avx512(%rip), %zmm9 + vmovups 64+__svml_datanh_data_internal_avx512(%rip), %zmm13 + vmovups 128+__svml_datanh_data_internal_avx512(%rip), %zmm7 + vfmadd231pd {rn-sae}, %zmm14, %zmm8, %zmm0 + vfnmadd231pd {rn-sae}, %zmm3, %zmm12, %zmm15 + +/* Prepare table index */ + vpsrlq $48, %zmm14, %zmm11 + vpsrlq $48, %zmm3, %zmm8 + vmovups 192+__svml_datanh_data_internal_avx512(%rip), %zmm14 + +/* polynomials */ + vmovups 512+__svml_datanh_data_internal_avx512(%rip), %zmm3 + +/* Km-Kp */ + vsubpd {rn-sae}, %zmm5, %zmm4, %zmm5 + vmovups 576+__svml_datanh_data_internal_avx512(%rip), %zmm4 + kmovw %k0, %edx + vmovaps %zmm11, %zmm10 + vmovaps %zmm4, %zmm6 + vpermi2pd %zmm13, %zmm9, %zmm10 + vpermi2pd %zmm14, %zmm7, %zmm11 + vpermt2pd %zmm13, %zmm8, %zmm9 + vpermt2pd %zmm14, %zmm8, %zmm7 + vmovups 640+__svml_datanh_data_internal_avx512(%rip), %zmm8 + vfmadd231pd {rn-sae}, %zmm0, %zmm3, %zmm6 + vfmadd231pd {rn-sae}, %zmm15, %zmm3, %zmm4 + vmovups 832+__svml_datanh_data_internal_avx512(%rip), %zmm13 + vmovups 896+__svml_datanh_data_internal_avx512(%rip), %zmm14 + vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm8, %zmm15, %zmm4 + vmovups 1024+__svml_datanh_data_internal_avx512(%rip), %zmm8 + vsubpd {rn-sae}, %zmm11, %zmm7, %zmm12 + +/* table values */ + vsubpd {rn-sae}, %zmm10, %zmm9, %zmm3 + vmovups 704+__svml_datanh_data_internal_avx512(%rip), %zmm7 + vmovups 768+__svml_datanh_data_internal_avx512(%rip), %zmm9 + +/* K*L2H + Th */ + vmovups 1152+__svml_datanh_data_internal_avx512(%rip), %zmm10 + +/* K*L2L + Tl */ + vmovups 1216+__svml_datanh_data_internal_avx512(%rip), %zmm11 + vfmadd213pd {rn-sae}, %zmm7, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm7, %zmm15, %zmm4 + vmovups 960+__svml_datanh_data_internal_avx512(%rip), %zmm7 + vfmadd231pd {rn-sae}, %zmm5, %zmm10, %zmm3 + vfmadd213pd {rn-sae}, %zmm12, %zmm11, %zmm5 + vfmadd213pd {rn-sae}, %zmm9, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm9, %zmm15, %zmm4 + vfmadd213pd {rn-sae}, %zmm13, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm13, %zmm15, %zmm4 + vfmadd213pd {rn-sae}, %zmm14, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm14, %zmm15, %zmm4 + vfmadd213pd {rn-sae}, %zmm7, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm7, %zmm15, %zmm4 + vfmadd213pd {rn-sae}, %zmm8, %zmm0, %zmm6 + vfmadd213pd {rn-sae}, %zmm8, %zmm15, %zmm4 + +/* (K*L2L + Tl) + Rp*PolyP */ + vfmadd213pd {rn-sae}, %zmm5, %zmm0, %zmm6 + vorpd 1088+__svml_datanh_data_internal_avx512(%rip), %zmm1, %zmm0 + +/* (K*L2L + Tl) + Rp*PolyP -Rm*PolyM */ + vfnmadd213pd {rn-sae}, %zmm6, %zmm15, %zmm4 + vaddpd {rn-sae}, %zmm4, %zmm3, %zmm1 + vmulpd {rn-sae}, %zmm0, %zmm1, %zmm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + +.LBL_1_3: + vmovups %zmm2, 64(%rsp) + vmovups %zmm0, 128(%rsp) + je .LBL_1_2 + xorl %eax, %eax + vzeroupper + kmovw %k4, 24(%rsp) + kmovw %k5, 16(%rsp) + kmovw %k6, 8(%rsp) + kmovw %k7, (%rsp) + movq %rsi, 40(%rsp) + movq %rdi, 32(%rsp) + movq %r12, 56(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 48(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movl %edx, %r13d + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $8, %r12d + jl .LBL_1_7 + kmovw 24(%rsp), %k4 + cfi_restore(122) + kmovw 16(%rsp), %k5 + cfi_restore(123) + kmovw 8(%rsp), %k6 + cfi_restore(124) + kmovw (%rsp), %k7 + cfi_restore(125) + vmovups 128(%rsp), %zmm0 + movq 40(%rsp), %rsi + cfi_restore(4) + movq 32(%rsp), %rdi + cfi_restore(5) + movq 56(%rsp), %r12 + cfi_restore(12) + movq 48(%rsp), %r13 + cfi_restore(13) + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 64(%rsp,%r12,8), %rdi + lea 128(%rsp,%r12,8), %rsi + call __svml_datanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVeN8v_atanh_skx) + + .align 16,0x90 + +__svml_datanh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movsd (%rdi), %xmm0 + movb 7(%rdi), %dl + andb $127, %dl + movsd %xmm0, -8(%rsp) + cmpl $32752, %eax + je .LBL_2_6 + +.LBL_2_2: + cmpl $0, -8(%rsp) + jne .LBL_2_5 + movb %dl, -1(%rsp) + cmpl $1072693248, -4(%rsp) + jne .LBL_2_5 + divsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + movl $2, %eax + ret + +.LBL_2_5: + movsd 8+__datanh_la_CoutTab(%rip), %xmm0 + movl $1, %eax + mulsd 16+__datanh_la_CoutTab(%rip), %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_6: + testl $1048575, 4(%rdi) + jne .LBL_2_8 + cmpl $0, (%rdi) + je .LBL_2_2 + +.LBL_2_8: + mulsd %xmm0, %xmm0 + xorl %eax, %eax + movsd %xmm0, (%rsi) + ret + + cfi_endproc + + .type __svml_datanh_cout_rare_internal,@function + .size __svml_datanh_cout_rare_internal,.-__svml_datanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_datanh_data_internal_avx512: + .long 0 + .long 0 + .long 3222274048 + .long 1068436016 + .long 1848246272 + .long 1069426439 + .long 1890058240 + .long 1069940528 + .long 3348824064 + .long 1070370807 + .long 2880143360 + .long 1070688092 + .long 3256647680 + .long 1070883211 + .long 4139515904 + .long 1071069655 + .long 3971973120 + .long 1071248163 + .long 3348791296 + .long 1071419383 + .long 1605304320 + .long 1071583887 + .long 3827646464 + .long 1071693426 + .long 1584414720 + .long 1071769695 + .long 860815360 + .long 1071843287 + .long 3896934400 + .long 1071914383 + .long 643547136 + .long 1071983149 + .long 0 + .long 0 + .long 399283991 + .long 1030105702 + .long 1028718588 + .long 1030642877 + .long 3808918910 + .long 3177909005 + .long 4136237123 + .long 3177805716 + .long 3462654649 + .long 1029900033 + .long 2051171366 + .long 3177225921 + .long 2396640771 + .long 3177708721 + .long 3062724207 + .long 1029196786 + .long 634920691 + .long 1029317036 + .long 1913570380 + .long 1027322573 + .long 1734886604 + .long 3177545033 + .long 2335489660 + .long 1025116093 + .long 3046154741 + .long 1029750303 + .long 914782743 + .long 3176833847 + .long 3743595607 + .long 1028041657 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 4294967295 + .long 2147483647 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 32768 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 0 + .long 4294901760 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 1087603010 + .long 1069318621 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 3090058096 + .long 3217033020 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 2566904552 + .long 1069697314 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 4168213957 + .long 3217380691 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 2580363594 + .long 1070176665 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 797185 + .long 3218079744 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 1431655522 + .long 1070945621 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 4294967237 + .long 3219128319 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 0 + .long 1071644672 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 4277796864 + .long 1072049730 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .long 3164471296 + .long 1031600026 + .type __svml_datanh_data_internal_avx512,@object + .size __svml_datanh_data_internal_avx512,1280 + .align 8 + +__datanh_la_CoutTab: + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 2146435072 + .long 0 + .long 4293918720 + .type __datanh_la_CoutTab,@object + .size __datanh_la_CoutTab,32 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core-avx2.S new file mode 100644 index 0000000000..1af3662f65 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized atanhf. + 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 _ZGVeN16v_atanhf _ZGVeN16v_atanhf_avx2_wrapper +#include "../svml_s_atanhf16_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core.c new file mode 100644 index 0000000000..4b1190f0eb --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized atanhf, vector length is 16. + 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 _ZGVeN16v_atanhf +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN16v_atanhf, __GI__ZGVeN16v_atanhf, + __redirect__ZGVeN16v_atanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core_avx512.S new file mode 100644 index 0000000000..ebea3c7821 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf16_core_avx512.S @@ -0,0 +1,531 @@ +/* Function atanhf vectorized with AVX-512. + 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * using small lookup table that map to AVX-512 permute instructions + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVeN16v_atanhf_skx) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $192, %rsp + vmovups 256+__svml_satanh_data_internal_avx512(%rip), %zmm4 + +/* round reciprocals to 1+5b mantissas */ + vmovups 384+__svml_satanh_data_internal_avx512(%rip), %zmm14 + vmovups 448+__svml_satanh_data_internal_avx512(%rip), %zmm1 + vmovaps %zmm0, %zmm11 + vandps 320+__svml_satanh_data_internal_avx512(%rip), %zmm11, %zmm6 + +/* 1+y */ + vaddps {rn-sae}, %zmm4, %zmm6, %zmm9 + +/* 1-y */ + vsubps {rn-sae}, %zmm6, %zmm4, %zmm8 + vxorps %zmm6, %zmm11, %zmm10 + +/* Yp_high */ + vsubps {rn-sae}, %zmm4, %zmm9, %zmm2 + +/* -Ym_high */ + vsubps {rn-sae}, %zmm4, %zmm8, %zmm5 + +/* RcpP ~ 1/Yp */ + vrcp14ps %zmm9, %zmm12 + +/* RcpM ~ 1/Ym */ + vrcp14ps %zmm8, %zmm13 + +/* input outside (-1, 1) ? */ + vcmpps $21, {sae}, %zmm4, %zmm6, %k0 + vpaddd %zmm14, %zmm12, %zmm15 + vpaddd %zmm14, %zmm13, %zmm0 + +/* Yp_low */ + vsubps {rn-sae}, %zmm2, %zmm6, %zmm3 + vandps %zmm1, %zmm15, %zmm7 + vandps %zmm1, %zmm0, %zmm12 + +/* Ym_low */ + vaddps {rn-sae}, %zmm5, %zmm6, %zmm5 + +/* Reduced argument: Rp = (RcpP*Yp - 1)+RcpP*Yp_low */ + vfmsub213ps {rn-sae}, %zmm4, %zmm7, %zmm9 + +/* Reduced argument: Rm = (RcpM*Ym - 1)+RcpM*Ym_low */ + vfmsub231ps {rn-sae}, %zmm12, %zmm8, %zmm4 + vmovups 128+__svml_satanh_data_internal_avx512(%rip), %zmm8 + vmovups 192+__svml_satanh_data_internal_avx512(%rip), %zmm13 + +/* exponents */ + vgetexpps {sae}, %zmm7, %zmm15 + vfmadd231ps {rn-sae}, %zmm7, %zmm3, %zmm9 + +/* Table lookups */ + vmovups __svml_satanh_data_internal_avx512(%rip), %zmm6 + vgetexpps {sae}, %zmm12, %zmm14 + vfnmadd231ps {rn-sae}, %zmm12, %zmm5, %zmm4 + +/* Prepare table index */ + vpsrld $18, %zmm7, %zmm3 + vpsrld $18, %zmm12, %zmm2 + vmovups 64+__svml_satanh_data_internal_avx512(%rip), %zmm7 + vmovups 640+__svml_satanh_data_internal_avx512(%rip), %zmm12 + +/* Km-Kp */ + vsubps {rn-sae}, %zmm15, %zmm14, %zmm1 + kmovw %k0, %edx + vmovaps %zmm3, %zmm0 + vpermi2ps %zmm13, %zmm8, %zmm3 + vpermt2ps %zmm13, %zmm2, %zmm8 + vpermi2ps %zmm7, %zmm6, %zmm0 + vpermt2ps %zmm7, %zmm2, %zmm6 + vsubps {rn-sae}, %zmm3, %zmm8, %zmm5 + +/* K*L2H + Th */ + vmovups 832+__svml_satanh_data_internal_avx512(%rip), %zmm2 + +/* K*L2L + Tl */ + vmovups 896+__svml_satanh_data_internal_avx512(%rip), %zmm3 + +/* polynomials */ + vmovups 512+__svml_satanh_data_internal_avx512(%rip), %zmm7 + vmovups 704+__svml_satanh_data_internal_avx512(%rip), %zmm13 + +/* table values */ + vsubps {rn-sae}, %zmm0, %zmm6, %zmm0 + vfmadd231ps {rn-sae}, %zmm1, %zmm2, %zmm0 + vfmadd213ps {rn-sae}, %zmm5, %zmm3, %zmm1 + vmovups 576+__svml_satanh_data_internal_avx512(%rip), %zmm3 + vmovaps %zmm3, %zmm2 + vfmadd231ps {rn-sae}, %zmm9, %zmm7, %zmm2 + vfmadd231ps {rn-sae}, %zmm4, %zmm7, %zmm3 + vfmadd213ps {rn-sae}, %zmm12, %zmm9, %zmm2 + vfmadd213ps {rn-sae}, %zmm12, %zmm4, %zmm3 + vfmadd213ps {rn-sae}, %zmm13, %zmm9, %zmm2 + vfmadd213ps {rn-sae}, %zmm13, %zmm4, %zmm3 + +/* (K*L2L + Tl) + Rp*PolyP */ + vfmadd213ps {rn-sae}, %zmm1, %zmm9, %zmm2 + vorps 768+__svml_satanh_data_internal_avx512(%rip), %zmm10, %zmm9 + +/* (K*L2L + Tl) + Rp*PolyP -Rm*PolyM */ + vfnmadd213ps {rn-sae}, %zmm2, %zmm4, %zmm3 + vaddps {rn-sae}, %zmm3, %zmm0, %zmm4 + vmulps {rn-sae}, %zmm9, %zmm4, %zmm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + +.LBL_1_3: + vmovups %zmm11, 64(%rsp) + vmovups %zmm0, 128(%rsp) + je .LBL_1_2 + xorl %eax, %eax + vzeroupper + kmovw %k4, 24(%rsp) + kmovw %k5, 16(%rsp) + kmovw %k6, 8(%rsp) + kmovw %k7, (%rsp) + movq %rsi, 40(%rsp) + movq %rdi, 32(%rsp) + movq %r12, 56(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 48(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movl %edx, %r13d + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $16, %r12d + jl .LBL_1_7 + kmovw 24(%rsp), %k4 + cfi_restore(122) + kmovw 16(%rsp), %k5 + cfi_restore(123) + kmovw 8(%rsp), %k6 + cfi_restore(124) + kmovw (%rsp), %k7 + cfi_restore(125) + vmovups 128(%rsp), %zmm0 + movq 40(%rsp), %rsi + cfi_restore(4) + movq 32(%rsp), %rdi + cfi_restore(5) + movq 56(%rsp), %r12 + cfi_restore(12) + movq 48(%rsp), %r13 + cfi_restore(13) + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x78, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 64(%rsp,%r12,4), %rdi + lea 128(%rsp,%r12,4), %rsi + call __svml_satanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVeN16v_atanhf_skx) + + .align 16,0x90 + +__svml_satanh_cout_rare_internal: + + cfi_startproc + + movzwl 2(%rdi), %edx + movss (%rdi), %xmm1 + andl $32640, %edx + movb 3(%rdi), %al + andb $127, %al + movss %xmm1, -8(%rsp) + movb %al, -5(%rsp) + cmpl $32640, %edx + je .LBL_2_6 + cmpl $1065353216, -8(%rsp) + jne .LBL_2_4 + divss 4+__satanh_la__imlsAtanhTab(%rip), %xmm1 + movss %xmm1, (%rsi) + movl $2, %eax + ret + +.LBL_2_4: + movss 8+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_6: + cmpl $2139095040, -8(%rsp) + jne .LBL_2_8 + movss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss %xmm0, %xmm1 + movss %xmm1, (%rsi) + ret + +.LBL_2_8: + mulss (%rdi), %xmm1 + xorl %eax, %eax + movss %xmm1, (%rsi) + ret + + cfi_endproc + + .type __svml_satanh_cout_rare_internal,@function + .size __svml_satanh_cout_rare_internal,.-__svml_satanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_satanh_data_internal_avx512: + .long 0 + .long 1023148032 + .long 1031274496 + .long 1035436032 + .long 1039204352 + .long 1041547264 + .long 1043333120 + .long 1045069824 + .long 1046773760 + .long 1048428544 + .long 1049313280 + .long 1050099712 + .long 1050869760 + .long 1051623424 + .long 1052360704 + .long 1053089792 + .long 1053794304 + .long 1054482432 + .long 1055162368 + .long 1055825920 + .long 1056481280 + .long 1057042432 + .long 1057353728 + .long 1057660928 + .long 1057964032 + .long 1058263040 + .long 1058553856 + .long 1058840576 + .long 1059123200 + .long 1059397632 + .long 1059672064 + .long 1059942400 + .long 0 + .long 925287326 + .long 950209537 + .long 928156389 + .long 954265029 + .long 3098231288 + .long 3083833176 + .long 949397309 + .long 3045295702 + .long 940324527 + .long 3089323092 + .long 945994465 + .long 952492302 + .long 954130348 + .long 954989406 + .long 3102096543 + .long 3093041984 + .long 947354573 + .long 3053684310 + .long 936642948 + .long 3099086888 + .long 3098368602 + .long 946194506 + .long 952357621 + .long 943635681 + .long 3097619830 + .long 3080925892 + .long 3078186319 + .long 3093311347 + .long 955801008 + .long 934582639 + .long 3099571146 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 131072 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 4294705152 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 3196061712 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 1051373854 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 1060204544 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .long 939916788 + .type __svml_satanh_data_internal_avx512,@object + .size __svml_satanh_data_internal_avx512,960 + .align 4 + +__satanh_la__imlsAtanhTab: + .long 1065353216 + .long 0 + .long 2139095040 + .type __satanh_la__imlsAtanhTab,@object + .size __satanh_la__imlsAtanhTab,12 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core-sse2.S new file mode 100644 index 0000000000..b750092887 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized atanhf, vector length is 4. + 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 _ZGVbN4v_atanhf _ZGVbN4v_atanhf_sse2 +#include "../svml_s_atanhf4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core.c new file mode 100644 index 0000000000..46624c48cd --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized atanhf, vector length is 4. + 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 _ZGVbN4v_atanhf +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN4v_atanhf, __GI__ZGVbN4v_atanhf, + __redirect__ZGVbN4v_atanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core_sse4.S new file mode 100644 index 0000000000..54b55f8881 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf4_core_sse4.S @@ -0,0 +1,2536 @@ +/* Function atanhf 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVbN4v_atanhf_sse4) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $256, %rsp + movups %xmm9, 160(%rsp) + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + movaps %xmm0, %xmm9 + +/* Load constants including One = 1 */ + movups 1920+__svml_satanh_data_internal(%rip), %xmm4 + movaps %xmm9, %xmm7 + +/* Strip off the sign, so treat X as positive until right at the end */ + movups 1088+__svml_satanh_data_internal(%rip), %xmm2 + movaps %xmm4, %xmm1 + andps %xmm9, %xmm2 + movups %xmm14, 112(%rsp) + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movaps %xmm4, %xmm14 + movups %xmm11, 144(%rsp) + +/* + * Compute V = 2 * X trivially, and UHi + U_lo = 1 - X in two pieces, + * the upper part UHi being <= 12 bits long. Then we have + * atanh(X) = 1/2 * log((1 + X) / (1 - X)) = 1/2 * log1p(V / (UHi + ULo)). + */ + movaps %xmm2, %xmm0 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + movups 2944+__svml_satanh_data_internal(%rip), %xmm11 + +/* + * Check whether |X| < 1, in which case we use the main function. + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN < 1). + */ + movaps %xmm2, %xmm5 + movaps %xmm11, %xmm3 + movaps %xmm2, %xmm6 + cmpnltps %xmm4, %xmm5 + cmpltps 3136+__svml_satanh_data_internal(%rip), %xmm6 + mulps %xmm9, %xmm7 + subps %xmm2, %xmm1 + addps %xmm2, %xmm0 + movmskps %xmm5, %edx + subps %xmm1, %xmm14 + addps %xmm9, %xmm7 + subps %xmm2, %xmm14 + andps %xmm1, %xmm3 + movaps %xmm4, %xmm2 + +/* Record the sign for eventual reincorporation. */ + movups 2752+__svml_satanh_data_internal(%rip), %xmm5 + subps %xmm3, %xmm1 + andps %xmm9, %xmm5 + addps %xmm1, %xmm14 + +/* + * Now compute R = 1/(UHi+ULo) * (1 - E) and the error term E + * The first FMR is exact (we force R to 12 bits just in case it + * isn't already, to make absolutely sure), and since E is ~ 2^-12, + * the rounding error in the other one is acceptable. + */ + rcpps %xmm3, %xmm1 + andps %xmm11, %xmm1 + +/* + * Split V as well into upper 12 bits and lower part, so that we can get + * a preliminary quotient estimate without rounding error. + */ + andps %xmm0, %xmm11 + mulps %xmm1, %xmm3 + subps %xmm11, %xmm0 + mulps %xmm1, %xmm14 + +/* Hence get initial quotient estimate QHi + QLo = R * VHi + R * VLo */ + mulps %xmm1, %xmm11 + subps %xmm3, %xmm2 + mulps %xmm0, %xmm1 + subps %xmm14, %xmm2 + +/* Compute D = E + E^2 */ + movaps %xmm2, %xmm14 + +/* Or the sign bit in with the tiny result to handle atanh(-0) correctly */ + orps %xmm5, %xmm7 + mulps %xmm2, %xmm14 + andps %xmm6, %xmm7 + addps %xmm14, %xmm2 + movaps %xmm4, %xmm14 + +/* + * Compute R * (VHi + VLo) * (1 + E + E^2) + * = R * (VHi + VLo) * (1 + D) + * = QHi + (QHi * D + QLo + QLo * D) + */ + movaps %xmm2, %xmm3 + mulps %xmm1, %xmm2 + mulps %xmm11, %xmm3 + addps %xmm2, %xmm1 + +/* reduction: compute r,n */ + movdqu 2240+__svml_satanh_data_internal(%rip), %xmm2 + addps %xmm1, %xmm3 + +/* + * Now finally accumulate the high and low parts of the + * argument to log1p, H + L, with a final compensated summation. + */ + movaps %xmm3, %xmm0 + addps %xmm11, %xmm0 + minps %xmm0, %xmm14 + subps %xmm0, %xmm11 + addps %xmm11, %xmm3 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * later incorporating L into the reduced argument. + * compute 1+x as high, low parts + */ + movaps %xmm4, %xmm11 + maxps %xmm0, %xmm11 + movaps %xmm11, %xmm1 + movdqu 2304+__svml_satanh_data_internal(%rip), %xmm0 + addps %xmm14, %xmm1 + subps %xmm1, %xmm11 + psubd %xmm2, %xmm1 + pand %xmm1, %xmm0 + psrad $23, %xmm1 + paddd %xmm2, %xmm0 + addps %xmm11, %xmm14 + +/* polynomial evaluation */ + subps %xmm4, %xmm0 + addps %xmm14, %xmm3 + cvtdq2ps %xmm1, %xmm14 + pslld $23, %xmm1 + movaps %xmm4, %xmm11 + psubd %xmm1, %xmm11 + mulps %xmm3, %xmm11 + +/* final reconstruction */ + mulps 3200+__svml_satanh_data_internal(%rip), %xmm14 + addps %xmm0, %xmm11 + movups 2096+__svml_satanh_data_internal(%rip), %xmm4 + movaps %xmm6, %xmm0 + mulps %xmm11, %xmm4 + +/* Finally, halve the result and reincorporate the sign */ + movups 2560+__svml_satanh_data_internal(%rip), %xmm1 + pxor %xmm5, %xmm1 + addps 2080+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 2064+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 2048+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 2032+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 2016+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 2000+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + addps 1984+__svml_satanh_data_internal(%rip), %xmm4 + mulps %xmm11, %xmm4 + mulps %xmm11, %xmm4 + addps %xmm4, %xmm11 + addps %xmm14, %xmm11 + mulps %xmm11, %xmm1 + andnps %xmm1, %xmm0 + orps %xmm7, %xmm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + movups 160(%rsp), %xmm9 + cfi_restore(26) + movups 144(%rsp), %xmm11 + cfi_restore(28) + movups 112(%rsp), %xmm14 + cfi_restore(31) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_3: + movups %xmm9, 128(%rsp) + movups %xmm0, 192(%rsp) + xorl %eax, %eax + movups %xmm8, 64(%rsp) + movups %xmm10, 48(%rsp) + movups %xmm12, 32(%rsp) + movups %xmm13, 16(%rsp) + movups %xmm15, (%rsp) + movq %rsi, 88(%rsp) + movq %rdi, 80(%rsp) + movq %r12, 104(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 96(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + movl %edx, %r13d + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $4, %r12d + jl .LBL_1_7 + movups 64(%rsp), %xmm8 + cfi_restore(25) + movups 48(%rsp), %xmm10 + cfi_restore(27) + movups 32(%rsp), %xmm12 + cfi_restore(29) + movups 16(%rsp), %xmm13 + cfi_restore(30) + movups (%rsp), %xmm15 + cfi_restore(32) + movq 88(%rsp), %rsi + cfi_restore(4) + movq 80(%rsp), %rdi + cfi_restore(5) + movq 104(%rsp), %r12 + cfi_restore(12) + movq 96(%rsp), %r13 + cfi_restore(13) + movups 192(%rsp), %xmm0 + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x68, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 128(%rsp,%r12,4), %rdi + lea 192(%rsp,%r12,4), %rsi + call __svml_satanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVbN4v_atanhf_sse4) + + .align 16,0x90 + +__svml_satanh_cout_rare_internal: + + cfi_startproc + + movzwl 2(%rdi), %edx + movss (%rdi), %xmm1 + andl $32640, %edx + movb 3(%rdi), %al + andb $127, %al + movss %xmm1, -8(%rsp) + movb %al, -5(%rsp) + cmpl $32640, %edx + je .LBL_2_6 + cmpl $1065353216, -8(%rsp) + jne .LBL_2_4 + divss 4+__satanh_la__imlsAtanhTab(%rip), %xmm1 + movss %xmm1, (%rsi) + movl $2, %eax + ret + +.LBL_2_4: + movss 8+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_6: + cmpl $2139095040, -8(%rsp) + jne .LBL_2_8 + movss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss %xmm0, %xmm1 + movss %xmm1, (%rsi) + ret + +.LBL_2_8: + mulss (%rdi), %xmm1 + xorl %eax, %eax + movss %xmm1, (%rsi) + ret + + cfi_endproc + + .type __svml_satanh_cout_rare_internal,@function + .size __svml_satanh_cout_rare_internal,.-__svml_satanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_satanh_data_internal: + .long 3266227256 + .long 3107766024 + .long 3266228276 + .long 3107776882 + .long 3266229284 + .long 3109949545 + .long 3266230292 + .long 3108055846 + .long 3266231292 + .long 3106351937 + .long 3266232276 + .long 3109092567 + .long 3266233260 + .long 3107948216 + .long 3266234236 + .long 3107170960 + .long 3266235204 + .long 3106817287 + .long 3266236164 + .long 3106942449 + .long 3266237116 + .long 3107600489 + .long 3266238060 + .long 3108844279 + .long 3266239004 + .long 3106531253 + .long 3266239932 + .long 3109100650 + .long 3266240860 + .long 3108213420 + .long 3266241780 + .long 3108112381 + .long 3266242692 + .long 3108845034 + .long 3266243604 + .long 3106263589 + .long 3266244500 + .long 3108802209 + .long 3266245396 + .long 3108116909 + .long 3266246284 + .long 3108445707 + .long 3266247164 + .long 3109831435 + .long 3266248044 + .long 3108121760 + .long 3266248916 + .long 3107552123 + .long 3266249780 + .long 3108162844 + .long 3266250644 + .long 3105799146 + .long 3266251492 + .long 3108888393 + .long 3266252340 + .long 3109079979 + .long 3266253188 + .long 3106411173 + .long 3266254020 + .long 3109307139 + .long 3266254852 + .long 3109415127 + .long 3266255684 + .long 3106770317 + .long 3266256500 + .long 3109795834 + .long 3266257324 + .long 3105942641 + .long 3266258132 + .long 3107826892 + .long 3266258940 + .long 3107092610 + .long 3266259740 + .long 3107966131 + .long 3266260540 + .long 3106284596 + .long 3266261332 + .long 3106273188 + .long 3266262116 + .long 3107962226 + .long 3266262900 + .long 3107187186 + .long 3266263676 + .long 3108171617 + .long 3266264452 + .long 3106749947 + .long 3266265220 + .long 3107144703 + .long 3266265980 + .long 3109383615 + .long 3266266740 + .long 3109299629 + .long 3266267500 + .long 3106919521 + .long 3266268252 + .long 3106463913 + .long 3266268996 + .long 3107958670 + .long 3266269740 + .long 3107234917 + .long 3266270476 + .long 3108511954 + .long 3266271212 + .long 3107620056 + .long 3266271940 + .long 3108777693 + .long 3266272668 + .long 3107814325 + .long 3266273388 + .long 3108947630 + .long 3266274108 + .long 3108006290 + .long 3266274820 + .long 3109207222 + .long 3266275532 + .long 3108378366 + .long 3266276236 + .long 3109735912 + .long 3266276940 + .long 3109107087 + .long 3266277644 + .long 3106513079 + .long 3266278340 + .long 3106169044 + .long 3266279028 + .long 3108095503 + .long 3266279716 + .long 3108118349 + .long 3266280404 + .long 3106257463 + .long 3266281084 + .long 3106726720 + .long 3266281756 + .long 3109545389 + .long 3266282436 + .long 3106343833 + .long 3266283100 + .long 3109723642 + .long 3266283772 + .long 3107120300 + .long 3266284436 + .long 3106940529 + .long 3266285092 + .long 3109202170 + .long 3266285748 + .long 3109728494 + .long 3266286404 + .long 3108536808 + .long 3266287052 + .long 3109838471 + .long 3266287700 + .long 3109455977 + .long 3266288348 + .long 3107405879 + .long 3266288988 + .long 3107898790 + .long 3266289628 + .long 3106756477 + .long 3266290260 + .long 3108189081 + .long 3266290892 + .long 3108017907 + .long 3266291524 + .long 3106258339 + .long 3266292148 + .long 3107119845 + .long 3266292772 + .long 3106423069 + .long 3266293388 + .long 3108377050 + .long 3266294004 + .long 3108802011 + .long 3266294620 + .long 3107712277 + .long 3266295228 + .long 3109316274 + .long 3266295836 + .long 3109433625 + .long 3266296444 + .long 3108078064 + .long 3266297044 + .long 3109457438 + .long 3266297644 + .long 3109390801 + .long 3266298244 + .long 3107891329 + .long 3266298836 + .long 3109166323 + .long 3266299428 + .long 3109034299 + .long 3266300020 + .long 3107507904 + .long 3266300604 + .long 3108793919 + .long 3266301188 + .long 3108710352 + .long 3266301772 + .long 3107269350 + .long 3266302348 + .long 3108677203 + .long 3266302924 + .long 3108751436 + .long 3266303500 + .long 3107503720 + .long 3266304068 + .long 3109139881 + .long 3266304636 + .long 3109476985 + .long 3266305204 + .long 3108526254 + .long 3266305772 + .long 3106298768 + .long 3266306332 + .long 3106999765 + .long 3266306892 + .long 3106445739 + .long 3266307444 + .long 3108841650 + .long 3266308004 + .long 3105809415 + .long 3266308548 + .long 3109942336 + .long 3266309100 + .long 3108667760 + .long 3266309652 + .long 3106190122 + .long 3266310196 + .long 3106713732 + .long 3266310740 + .long 3106054165 + .long 3266311276 + .long 3108415484 + .long 3266311812 + .long 3109613023 + .long 3266312348 + .long 3109656301 + .long 3266312884 + .long 3108554723 + .long 3266313420 + .long 3106317576 + .long 3266313948 + .long 3107148341 + .long 3266314476 + .long 3106861780 + .long 3266314996 + .long 3109661153 + .long 3266315524 + .long 3107166702 + .long 3266316044 + .long 3107775778 + .long 3266316564 + .long 3107302717 + .long 3266317076 + .long 3109950361 + .long 3266317596 + .long 3107338539 + .long 3266318108 + .long 3107864196 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095040 + .long 4286578688 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1065353216 + .long 3212836864 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .type __svml_satanh_data_internal,@object + .size __svml_satanh_data_internal,3456 + .align 4 + +__satanh_la__imlsAtanhTab: + .long 1065353216 + .long 0 + .long 2139095040 + .type __satanh_la__imlsAtanhTab,@object + .size __satanh_la__imlsAtanhTab,12 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core-sse.S new file mode 100644 index 0000000000..b293bd5b41 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized atanhf, vector length is 8. + 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 _ZGVdN8v_atanhf _ZGVdN8v_atanhf_sse_wrapper +#include "../svml_s_atanhf8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core.c new file mode 100644 index 0000000000..3df8d66c94 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized atanhf, vector length is 8. + 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 _ZGVdN8v_atanhf +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN8v_atanhf, __GI__ZGVdN8v_atanhf, + __redirect__ZGVdN8v_atanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core_avx2.S new file mode 100644 index 0000000000..be063c59a8 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_atanhf8_core_avx2.S @@ -0,0 +1,2131 @@ +/* Function atanhf vectorized with AVX2. + 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: + * + * Compute atanh(x) as 0.5 * log((1 + x)/(1 - x)) + * + * Special cases: + * + * atanh(0) = 0 + * atanh(+1) = +INF + * atanh(-1) = -INF + * atanh(x) = NaN if |x| > 1, or if x is a NaN or INF + * + */ + +#include + + .text +ENTRY(_ZGVdN8v_atanhf_avx2) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $384, %rsp + +/* Load constants including One = 1 */ + vmovups 1920+__svml_satanh_data_internal(%rip), %ymm5 + vmovups %ymm8, 32(%rsp) + vmovups %ymm10, 160(%rsp) + .cfi_escape 0x10, 0xdb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + vmovups 3072+__svml_satanh_data_internal(%rip), %ymm10 + vmovups %ymm13, 256(%rsp) + vmovups %ymm9, 96(%rsp) + vmovups %ymm11, 192(%rsp) + vmovups %ymm12, 224(%rsp) + vmovups %ymm14, 288(%rsp) + vmovups %ymm15, 320(%rsp) + vmovaps %ymm0, %ymm6 + .cfi_escape 0x10, 0xdc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xde, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdf, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe1, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe2, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x22 + +/* Strip off the sign, so treat X as positive until right at the end */ + vandps 1088+__svml_satanh_data_internal(%rip), %ymm6, %ymm8 + +/* + * Check whether |X| < 1, in which case we use the main function. + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN < 1). + */ + vcmpnlt_uqps %ymm5, %ymm8, %ymm7 + vsubps %ymm8, %ymm5, %ymm1 + +/* + * Compute V = 2 * X trivially, and UHi + U_lo = 1 - X in two pieces, + * the upper part UHi being <= 12 bits long. Then we have + * atanh(X) = 1/2 * log((1 + X) / (1 - X)) = 1/2 * log1p(V / (UHi + ULo)). + */ + vaddps %ymm8, %ymm8, %ymm11 + vcmplt_oqps 3264+__svml_satanh_data_internal(%rip), %ymm8, %ymm4 + vsubps %ymm1, %ymm5, %ymm0 + vmovmskps %ymm7, %edx + vrcpps %ymm1, %ymm7 + vsubps %ymm8, %ymm0, %ymm9 + vandps %ymm10, %ymm7, %ymm13 + +/* No need to split sU when FMA is available */ + vfnmadd213ps %ymm5, %ymm13, %ymm1 + vfnmadd231ps %ymm13, %ymm9, %ymm1 + +/* + * Split V as well into upper 12 bits and lower part, so that we can get + * a preliminary quotient estimate without rounding error. + */ + vandps %ymm10, %ymm11, %ymm12 + vsubps %ymm12, %ymm11, %ymm14 + +/* Hence get initial quotient estimate QHi + QLo = R * VHi + R * VLo */ + vmulps %ymm12, %ymm13, %ymm7 + +/* Compute D = E + E^2 */ + vfmadd213ps %ymm1, %ymm1, %ymm1 + vmulps %ymm14, %ymm13, %ymm15 + +/* + * Compute R * (VHi + VLo) * (1 + E + E^2) + * = R * (VHi + VLo) * (1 + D) + * = QHi + (QHi * D + QLo + QLo * D) + */ + vmulps %ymm1, %ymm7, %ymm0 + vfmadd213ps %ymm15, %ymm15, %ymm1 + +/* reduction: compute r,n */ + vmovups 2368+__svml_satanh_data_internal(%rip), %ymm15 + vaddps %ymm1, %ymm0, %ymm1 + +/* + * Now finally accumulate the high and low parts of the + * argument to log1p, H + L, with a final compensated summation. + */ + vaddps %ymm1, %ymm7, %ymm8 + vsubps %ymm8, %ymm7, %ymm0 + vminps %ymm8, %ymm5, %ymm7 + vaddps %ymm0, %ymm1, %ymm10 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * later incorporating L into the reduced argument. + * compute 1+x as high, low parts + */ + vmaxps %ymm8, %ymm5, %ymm1 + vaddps %ymm7, %ymm1, %ymm12 + vpsubd %ymm15, %ymm12, %ymm13 + vsubps %ymm12, %ymm1, %ymm9 + vpsrad $23, %ymm13, %ymm12 + vpand 2432+__svml_satanh_data_internal(%rip), %ymm13, %ymm14 + vaddps %ymm9, %ymm7, %ymm11 + vcvtdq2ps %ymm12, %ymm0 + vpslld $23, %ymm12, %ymm13 + vpaddd %ymm15, %ymm14, %ymm7 + vaddps %ymm11, %ymm10, %ymm1 + vpsubd %ymm13, %ymm5, %ymm14 + +/* polynomial evaluation */ + vsubps %ymm5, %ymm7, %ymm5 + vmulps %ymm1, %ymm14, %ymm8 + vmovups 2208+__svml_satanh_data_internal(%rip), %ymm1 + vaddps %ymm5, %ymm8, %ymm5 + vfmadd213ps 2176+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 2144+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 2112+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 2080+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 2048+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 2016+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213ps 1984+__svml_satanh_data_internal(%rip), %ymm5, %ymm1 + vmulps %ymm1, %ymm5, %ymm7 + vfmadd213ps %ymm5, %ymm5, %ymm7 + vmovaps %ymm6, %ymm2 + vfmadd213ps %ymm6, %ymm6, %ymm2 + +/* final reconstruction */ + vfmadd132ps 3328+__svml_satanh_data_internal(%rip), %ymm7, %ymm0 + +/* Record the sign for eventual reincorporation. */ + vandps 2880+__svml_satanh_data_internal(%rip), %ymm6, %ymm3 + +/* Or the sign bit in with the tiny result to handle atanh(-0) correctly */ + vorps %ymm3, %ymm2, %ymm2 + +/* Finally, halve the result and reincorporate the sign */ + vxorps 2688+__svml_satanh_data_internal(%rip), %ymm3, %ymm3 + vmulps %ymm0, %ymm3, %ymm0 + vblendvps %ymm4, %ymm2, %ymm0, %ymm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + vmovups 32(%rsp), %ymm8 + cfi_restore(91) + vmovups 96(%rsp), %ymm9 + cfi_restore(92) + vmovups 160(%rsp), %ymm10 + cfi_restore(93) + vmovups 192(%rsp), %ymm11 + cfi_restore(94) + vmovups 224(%rsp), %ymm12 + cfi_restore(95) + vmovups 256(%rsp), %ymm13 + cfi_restore(96) + vmovups 288(%rsp), %ymm14 + cfi_restore(97) + vmovups 320(%rsp), %ymm15 + cfi_restore(98) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 0xdb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xde, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdf, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe1, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe2, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_3: + vmovups %ymm6, 64(%rsp) + vmovups %ymm0, 128(%rsp) + je .LBL_1_2 + xorl %eax, %eax + vzeroupper + movq %rsi, 8(%rsp) + movq %rdi, (%rsp) + movq %r12, 24(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x88, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x98, 0xfe, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 16(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xfe, 0xff, 0xff, 0x22 + movl %edx, %r13d + +.LBL_1_7: + btl %r12d, %r13d + jc .LBL_1_10 + +.LBL_1_8: + incl %r12d + cmpl $8, %r12d + jl .LBL_1_7 + movq 8(%rsp), %rsi + cfi_restore(4) + movq (%rsp), %rdi + cfi_restore(5) + movq 24(%rsp), %r12 + cfi_restore(12) + movq 16(%rsp), %r13 + cfi_restore(13) + vmovups 128(%rsp), %ymm0 + jmp .LBL_1_2 + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x88, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x98, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xfe, 0xff, 0xff, 0x22 + +.LBL_1_10: + lea 64(%rsp,%r12,4), %rdi + lea 128(%rsp,%r12,4), %rsi + call __svml_satanh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVdN8v_atanhf_avx2) + + .align 16,0x90 + +__svml_satanh_cout_rare_internal: + + cfi_startproc + + movzwl 2(%rdi), %edx + movss (%rdi), %xmm1 + andl $32640, %edx + movb 3(%rdi), %al + andb $127, %al + movss %xmm1, -8(%rsp) + movb %al, -5(%rsp) + cmpl $32640, %edx + je .LBL_2_6 + cmpl $1065353216, -8(%rsp) + jne .LBL_2_4 + divss 4+__satanh_la__imlsAtanhTab(%rip), %xmm1 + movss %xmm1, (%rsi) + movl $2, %eax + ret + +.LBL_2_4: + movss 8+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_6: + cmpl $2139095040, -8(%rsp) + jne .LBL_2_8 + movss 4+__satanh_la__imlsAtanhTab(%rip), %xmm0 + movl $1, %eax + mulss %xmm0, %xmm1 + movss %xmm1, (%rsi) + ret + +.LBL_2_8: + mulss (%rdi), %xmm1 + xorl %eax, %eax + movss %xmm1, (%rsi) + ret + + cfi_endproc + + .type __svml_satanh_cout_rare_internal,@function + .size __svml_satanh_cout_rare_internal,.-__svml_satanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_satanh_data_internal: + .long 3266227256 + .long 3107766024 + .long 3266228276 + .long 3107776882 + .long 3266229284 + .long 3109949545 + .long 3266230292 + .long 3108055846 + .long 3266231292 + .long 3106351937 + .long 3266232276 + .long 3109092567 + .long 3266233260 + .long 3107948216 + .long 3266234236 + .long 3107170960 + .long 3266235204 + .long 3106817287 + .long 3266236164 + .long 3106942449 + .long 3266237116 + .long 3107600489 + .long 3266238060 + .long 3108844279 + .long 3266239004 + .long 3106531253 + .long 3266239932 + .long 3109100650 + .long 3266240860 + .long 3108213420 + .long 3266241780 + .long 3108112381 + .long 3266242692 + .long 3108845034 + .long 3266243604 + .long 3106263589 + .long 3266244500 + .long 3108802209 + .long 3266245396 + .long 3108116909 + .long 3266246284 + .long 3108445707 + .long 3266247164 + .long 3109831435 + .long 3266248044 + .long 3108121760 + .long 3266248916 + .long 3107552123 + .long 3266249780 + .long 3108162844 + .long 3266250644 + .long 3105799146 + .long 3266251492 + .long 3108888393 + .long 3266252340 + .long 3109079979 + .long 3266253188 + .long 3106411173 + .long 3266254020 + .long 3109307139 + .long 3266254852 + .long 3109415127 + .long 3266255684 + .long 3106770317 + .long 3266256500 + .long 3109795834 + .long 3266257324 + .long 3105942641 + .long 3266258132 + .long 3107826892 + .long 3266258940 + .long 3107092610 + .long 3266259740 + .long 3107966131 + .long 3266260540 + .long 3106284596 + .long 3266261332 + .long 3106273188 + .long 3266262116 + .long 3107962226 + .long 3266262900 + .long 3107187186 + .long 3266263676 + .long 3108171617 + .long 3266264452 + .long 3106749947 + .long 3266265220 + .long 3107144703 + .long 3266265980 + .long 3109383615 + .long 3266266740 + .long 3109299629 + .long 3266267500 + .long 3106919521 + .long 3266268252 + .long 3106463913 + .long 3266268996 + .long 3107958670 + .long 3266269740 + .long 3107234917 + .long 3266270476 + .long 3108511954 + .long 3266271212 + .long 3107620056 + .long 3266271940 + .long 3108777693 + .long 3266272668 + .long 3107814325 + .long 3266273388 + .long 3108947630 + .long 3266274108 + .long 3108006290 + .long 3266274820 + .long 3109207222 + .long 3266275532 + .long 3108378366 + .long 3266276236 + .long 3109735912 + .long 3266276940 + .long 3109107087 + .long 3266277644 + .long 3106513079 + .long 3266278340 + .long 3106169044 + .long 3266279028 + .long 3108095503 + .long 3266279716 + .long 3108118349 + .long 3266280404 + .long 3106257463 + .long 3266281084 + .long 3106726720 + .long 3266281756 + .long 3109545389 + .long 3266282436 + .long 3106343833 + .long 3266283100 + .long 3109723642 + .long 3266283772 + .long 3107120300 + .long 3266284436 + .long 3106940529 + .long 3266285092 + .long 3109202170 + .long 3266285748 + .long 3109728494 + .long 3266286404 + .long 3108536808 + .long 3266287052 + .long 3109838471 + .long 3266287700 + .long 3109455977 + .long 3266288348 + .long 3107405879 + .long 3266288988 + .long 3107898790 + .long 3266289628 + .long 3106756477 + .long 3266290260 + .long 3108189081 + .long 3266290892 + .long 3108017907 + .long 3266291524 + .long 3106258339 + .long 3266292148 + .long 3107119845 + .long 3266292772 + .long 3106423069 + .long 3266293388 + .long 3108377050 + .long 3266294004 + .long 3108802011 + .long 3266294620 + .long 3107712277 + .long 3266295228 + .long 3109316274 + .long 3266295836 + .long 3109433625 + .long 3266296444 + .long 3108078064 + .long 3266297044 + .long 3109457438 + .long 3266297644 + .long 3109390801 + .long 3266298244 + .long 3107891329 + .long 3266298836 + .long 3109166323 + .long 3266299428 + .long 3109034299 + .long 3266300020 + .long 3107507904 + .long 3266300604 + .long 3108793919 + .long 3266301188 + .long 3108710352 + .long 3266301772 + .long 3107269350 + .long 3266302348 + .long 3108677203 + .long 3266302924 + .long 3108751436 + .long 3266303500 + .long 3107503720 + .long 3266304068 + .long 3109139881 + .long 3266304636 + .long 3109476985 + .long 3266305204 + .long 3108526254 + .long 3266305772 + .long 3106298768 + .long 3266306332 + .long 3106999765 + .long 3266306892 + .long 3106445739 + .long 3266307444 + .long 3108841650 + .long 3266308004 + .long 3105809415 + .long 3266308548 + .long 3109942336 + .long 3266309100 + .long 3108667760 + .long 3266309652 + .long 3106190122 + .long 3266310196 + .long 3106713732 + .long 3266310740 + .long 3106054165 + .long 3266311276 + .long 3108415484 + .long 3266311812 + .long 3109613023 + .long 3266312348 + .long 3109656301 + .long 3266312884 + .long 3108554723 + .long 3266313420 + .long 3106317576 + .long 3266313948 + .long 3107148341 + .long 3266314476 + .long 3106861780 + .long 3266314996 + .long 3109661153 + .long 3266315524 + .long 3107166702 + .long 3266316044 + .long 3107775778 + .long 3266316564 + .long 3107302717 + .long 3266317076 + .long 3109950361 + .long 3266317596 + .long 3107338539 + .long 3266318108 + .long 3107864196 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .long 2147483647 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .long 964689920 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .long 2139095040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .long 2063597568 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 1051372345 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 3204448310 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .long 998244352 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .long 3212836863 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .long 2055208960 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .long 4294967040 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .long 1060205056 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .long 901758464 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .long 1065353216 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 3204448256 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 1051372180 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 3196061070 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 1045225872 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 3190336823 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 1041222418 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 3189430755 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 1041073389 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .long 16777216 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .long 25165824 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .long 1059760811 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .long 8388607 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .long 1317011456 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .long 1050673152 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .long 1056964608 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .long 1031798784 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .long 1106771968 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .long 4294959104 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .long 4294963200 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .long 4294901760 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .long 813694976 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .long 201326592 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .long 1060205080 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2139095040 + .long 4286578688 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1065353216 + .long 3212836864 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 0 + .long 2147483648 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .type __svml_satanh_data_internal,@object + .size __svml_satanh_data_internal,3584 + .align 4 + +__satanh_la__imlsAtanhTab: + .long 1065353216 + .long 0 + .long 2139095040 + .type __satanh_la__imlsAtanhTab,@object + .size __satanh_la__imlsAtanhTab,12 diff --git a/sysdeps/x86_64/fpu/svml_d_atanh2_core.S b/sysdeps/x86_64/fpu/svml_d_atanh2_core.S new file mode 100644 index 0000000000..36f549ddd9 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_atanh2_core.S @@ -0,0 +1,29 @@ +/* Function atanh vectorized with SSE2. + 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 + . */ + +#include +#include "svml_d_wrapper_impl.h" + + .text +ENTRY (_ZGVbN2v_atanh) +WRAPPER_IMPL_SSE2 atanh +END (_ZGVbN2v_atanh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN2v_atanh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_atanh4_core.S b/sysdeps/x86_64/fpu/svml_d_atanh4_core.S new file mode 100644 index 0000000000..6d6d11e85e --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_atanh4_core.S @@ -0,0 +1,29 @@ +/* Function atanh vectorized with AVX2, wrapper version. + 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 + . */ + +#include +#include "svml_d_wrapper_impl.h" + + .text +ENTRY (_ZGVdN4v_atanh) +WRAPPER_IMPL_AVX _ZGVbN2v_atanh +END (_ZGVdN4v_atanh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN4v_atanh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_atanh4_core_avx.S b/sysdeps/x86_64/fpu/svml_d_atanh4_core_avx.S new file mode 100644 index 0000000000..b4cfa275c8 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_atanh4_core_avx.S @@ -0,0 +1,25 @@ +/* Function atanh vectorized in AVX ISA as wrapper to SSE4 ISA version. + 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 + . */ + +#include +#include "svml_d_wrapper_impl.h" + + .text +ENTRY (_ZGVcN4v_atanh) +WRAPPER_IMPL_AVX _ZGVbN2v_atanh +END (_ZGVcN4v_atanh) diff --git a/sysdeps/x86_64/fpu/svml_d_atanh8_core.S b/sysdeps/x86_64/fpu/svml_d_atanh8_core.S new file mode 100644 index 0000000000..b31a6a72a1 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_atanh8_core.S @@ -0,0 +1,25 @@ +/* Function atanh vectorized with AVX-512, wrapper to AVX2. + 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 + . */ + +#include +#include "svml_d_wrapper_impl.h" + + .text +ENTRY (_ZGVeN8v_atanh) +WRAPPER_IMPL_AVX512 _ZGVdN4v_atanh +END (_ZGVeN8v_atanh) diff --git a/sysdeps/x86_64/fpu/svml_s_atanhf16_core.S b/sysdeps/x86_64/fpu/svml_s_atanhf16_core.S new file mode 100644 index 0000000000..2ea61888e7 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_atanhf16_core.S @@ -0,0 +1,25 @@ +/* Function atanhf vectorized with AVX-512. Wrapper to AVX2 version. + 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 + . */ + +#include +#include "svml_s_wrapper_impl.h" + + .text +ENTRY (_ZGVeN16v_atanhf) +WRAPPER_IMPL_AVX512 _ZGVdN8v_atanhf +END (_ZGVeN16v_atanhf) diff --git a/sysdeps/x86_64/fpu/svml_s_atanhf4_core.S b/sysdeps/x86_64/fpu/svml_s_atanhf4_core.S new file mode 100644 index 0000000000..6904cc388a --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_atanhf4_core.S @@ -0,0 +1,29 @@ +/* Function atanhf vectorized with SSE2, wrapper version. + 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 + . */ + +#include +#include "svml_s_wrapper_impl.h" + + .text +ENTRY (_ZGVbN4v_atanhf) +WRAPPER_IMPL_SSE2 atanhf +END (_ZGVbN4v_atanhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN4v_atanhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_atanhf8_core.S b/sysdeps/x86_64/fpu/svml_s_atanhf8_core.S new file mode 100644 index 0000000000..31d695fb5d --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_atanhf8_core.S @@ -0,0 +1,29 @@ +/* Function atanhf vectorized with AVX2, wrapper version. + 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 + . */ + +#include +#include "svml_s_wrapper_impl.h" + + .text +ENTRY (_ZGVdN8v_atanhf) +WRAPPER_IMPL_AVX _ZGVbN4v_atanhf +END (_ZGVdN8v_atanhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN8v_atanhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_atanhf8_core_avx.S b/sysdeps/x86_64/fpu/svml_s_atanhf8_core_avx.S new file mode 100644 index 0000000000..6c24eaf45c --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_atanhf8_core_avx.S @@ -0,0 +1,25 @@ +/* Function atanhf vectorized in AVX ISA as wrapper to SSE4 ISA version. + 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 + . */ + +#include +#include "svml_s_wrapper_impl.h" + + .text +ENTRY (_ZGVcN8v_atanhf) +WRAPPER_IMPL_AVX _ZGVbN4v_atanhf +END (_ZGVcN8v_atanhf) diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx.c b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx.c new file mode 100644 index 0000000000..0bdeec7851 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx.c @@ -0,0 +1 @@ +#include "test-double-libmvec-atanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx2.c b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx2.c new file mode 100644 index 0000000000..0bdeec7851 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx2.c @@ -0,0 +1 @@ +#include "test-double-libmvec-atanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx512f.c b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx512f.c new file mode 100644 index 0000000000..0bdeec7851 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-atanh-avx512f.c @@ -0,0 +1 @@ +#include "test-double-libmvec-atanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-atanh.c b/sysdeps/x86_64/fpu/test-double-libmvec-atanh.c new file mode 100644 index 0000000000..41dd8e7af3 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-atanh.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE double +#define LIBMVEC_FUNC atanh +#include "test-vector-abi-arg1.h" diff --git a/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c b/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c index cd802e0c6d..85b3129618 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVbN2v_asin) VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVbN2v_asinh) VECTOR_WRAPPER (WRAPPER_NAME (atan), _ZGVbN2v_atan) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2), _ZGVbN2vv_atan2) +VECTOR_WRAPPER (WRAPPER_NAME (atanh), _ZGVbN2v_atanh) #define VEC_INT_TYPE __m128i diff --git a/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c b/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c index a04980e87a..e3e88fe268 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c @@ -36,6 +36,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVdN4v_asin) VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVdN4v_asinh) VECTOR_WRAPPER (WRAPPER_NAME (atan), _ZGVdN4v_atan) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2), _ZGVdN4vv_atan2) +VECTOR_WRAPPER (WRAPPER_NAME (atanh), _ZGVdN4v_atanh) #ifndef __ILP32__ # define VEC_INT_TYPE __m256i diff --git a/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c b/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c index 9c602445e7..6f81f13d37 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVcN4v_asin) VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVcN4v_asinh) VECTOR_WRAPPER (WRAPPER_NAME (atan), _ZGVcN4v_atan) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2), _ZGVcN4vv_atan2) +VECTOR_WRAPPER (WRAPPER_NAME (atanh), _ZGVcN4v_atanh) #define VEC_INT_TYPE __m128i diff --git a/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c index d1e4b8dd01..197ff12338 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVeN8v_asin) VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVeN8v_asinh) VECTOR_WRAPPER (WRAPPER_NAME (atan), _ZGVeN8v_atan) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2), _ZGVeN8vv_atan2) +VECTOR_WRAPPER (WRAPPER_NAME (atanh), _ZGVeN8v_atanh) #ifndef __ILP32__ # define VEC_INT_TYPE __m512i diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx.c b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx.c new file mode 100644 index 0000000000..6f89ae70f2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx.c @@ -0,0 +1 @@ +#include "test-float-libmvec-atanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx2.c b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx2.c new file mode 100644 index 0000000000..6f89ae70f2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx2.c @@ -0,0 +1 @@ +#include "test-float-libmvec-atanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx512f.c b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx512f.c new file mode 100644 index 0000000000..6f89ae70f2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf-avx512f.c @@ -0,0 +1 @@ +#include "test-float-libmvec-atanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-atanhf.c b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf.c new file mode 100644 index 0000000000..33a022adb8 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-atanhf.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE float +#define LIBMVEC_FUNC atanhf +#include "test-vector-abi-arg1.h" diff --git a/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c b/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c index 65e0c2af7d..d21d943404 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVeN16v_asinf) VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVeN16v_asinhf) VECTOR_WRAPPER (WRAPPER_NAME (atanf), _ZGVeN16v_atanf) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2f), _ZGVeN16vv_atan2f) +VECTOR_WRAPPER (WRAPPER_NAME (atanhf), _ZGVeN16v_atanhf) #define VEC_INT_TYPE __m512i diff --git a/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c b/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c index b0cad1e107..3d24faf8dc 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVbN4v_asinf) VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVbN4v_asinhf) VECTOR_WRAPPER (WRAPPER_NAME (atanf), _ZGVbN4v_atanf) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2f), _ZGVbN4vv_atan2f) +VECTOR_WRAPPER (WRAPPER_NAME (atanhf), _ZGVbN4v_atanhf) #define VEC_INT_TYPE __m128i diff --git a/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c b/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c index 359aa445ba..f176c1f4b0 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c @@ -36,6 +36,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVdN8v_asinf) VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVdN8v_asinhf) VECTOR_WRAPPER (WRAPPER_NAME (atanf), _ZGVdN8v_atanf) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2f), _ZGVdN8vv_atan2f) +VECTOR_WRAPPER (WRAPPER_NAME (atanhf), _ZGVdN8v_atanhf) /* Redefinition of wrapper to be compatible with _ZGVdN8vvv_sincosf. */ #undef VECTOR_WRAPPER_fFF diff --git a/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c b/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c index 80730777fc..281eb58ad4 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVcN8v_asinf) VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVcN8v_asinhf) VECTOR_WRAPPER (WRAPPER_NAME (atanf), _ZGVcN8v_atanf) VECTOR_WRAPPER_ff (WRAPPER_NAME (atan2f), _ZGVcN8vv_atan2f) +VECTOR_WRAPPER (WRAPPER_NAME (atanhf), _ZGVcN8v_atanhf) #define VEC_INT_TYPE __m128i