From patchwork Wed Nov 24 19:37:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Pandey X-Patchwork-Id: 48103 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 1BED3385801D for ; Wed, 24 Nov 2021 20:26:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1BED3385801D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1637785564; bh=M9XJ33Ex1sbKBtzNwRqVDFQmBx26rj8+U0zXeXjRvQ4=; 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=ADIvnwtz2IcELBq7eE+SITIJ9bLGNn7FGbgNSmhM8cbhclaN2BGri+0lc6GEKJ11q 2O0xZBrGoYamEUPNJdOc7eDOURAZ2v1F37a3E5YwueEoIQgQgoDPW9Vtbct4j4zAv+ O63CcHC0RpfU9pqjRiHxbkuVMc3q9oSW9s3xbsDI= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by sourceware.org (Postfix) with ESMTPS id 6DF40385801A for ; Wed, 24 Nov 2021 19:38:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6DF40385801A X-IronPort-AV: E=McAfee;i="6200,9189,10178"; a="298763430" X-IronPort-AV: E=Sophos;i="5.87,261,1631602800"; d="scan'208";a="298763430" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.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="650501600" Received: from scymds02.sc.intel.com ([10.82.73.244]) by fmsmga001.fm.intel.com with ESMTP; 24 Nov 2021 11:38:09 -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 1AOJc7Ws021555; Wed, 24 Nov 2021 11:38:08 -0800 To: libc-alpha@sourceware.org Subject: [PATCH 07/42] x86-64: Add vector asinh/asinhf implementation to libmvec Date: Wed, 24 Nov 2021 11:37:32 -0800 Message-Id: <20211124193807.2093208-8-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, 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 asinh/asinhf containing SSE, AVX, AVX2 and AVX512 versions for libmvec as per vector ABI. It also contains accuracy and ABI tests for vector asinh/asinhf 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 | 17 + .../fpu/multiarch/svml_d_asinh2_core-sse2.S | 20 + .../x86_64/fpu/multiarch/svml_d_asinh2_core.c | 27 + .../fpu/multiarch/svml_d_asinh2_core_sse4.S | 5521 +++++++++++++++++ .../fpu/multiarch/svml_d_asinh4_core-sse.S | 20 + .../x86_64/fpu/multiarch/svml_d_asinh4_core.c | 27 + .../fpu/multiarch/svml_d_asinh4_core_avx2.S | 5092 +++++++++++++++ .../fpu/multiarch/svml_d_asinh8_core-avx2.S | 20 + .../x86_64/fpu/multiarch/svml_d_asinh8_core.c | 27 + .../fpu/multiarch/svml_d_asinh8_core_avx512.S | 853 +++ .../fpu/multiarch/svml_s_asinhf16_core-avx2.S | 20 + .../fpu/multiarch/svml_s_asinhf16_core.c | 28 + .../multiarch/svml_s_asinhf16_core_avx512.S | 653 ++ .../fpu/multiarch/svml_s_asinhf4_core-sse2.S | 20 + .../fpu/multiarch/svml_s_asinhf4_core.c | 28 + .../fpu/multiarch/svml_s_asinhf4_core_sse4.S | 2569 ++++++++ .../fpu/multiarch/svml_s_asinhf8_core-sse.S | 20 + .../fpu/multiarch/svml_s_asinhf8_core.c | 28 + .../fpu/multiarch/svml_s_asinhf8_core_avx2.S | 2156 +++++++ sysdeps/x86_64/fpu/svml_d_asinh2_core.S | 29 + sysdeps/x86_64/fpu/svml_d_asinh4_core.S | 29 + sysdeps/x86_64/fpu/svml_d_asinh4_core_avx.S | 25 + sysdeps/x86_64/fpu/svml_d_asinh8_core.S | 25 + sysdeps/x86_64/fpu/svml_s_asinhf16_core.S | 25 + sysdeps/x86_64/fpu/svml_s_asinhf4_core.S | 29 + sysdeps/x86_64/fpu/svml_s_asinhf8_core.S | 29 + sysdeps/x86_64/fpu/svml_s_asinhf8_core_avx.S | 25 + .../fpu/test-double-libmvec-asinh-avx.c | 1 + .../fpu/test-double-libmvec-asinh-avx2.c | 1 + .../fpu/test-double-libmvec-asinh-avx512f.c | 1 + .../x86_64/fpu/test-double-libmvec-asinh.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-asinhf-avx.c | 1 + .../fpu/test-float-libmvec-asinhf-avx2.c | 1 + .../fpu/test-float-libmvec-asinhf-avx512f.c | 1 + .../x86_64/fpu/test-float-libmvec-asinhf.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, 17409 insertions(+), 1 deletion(-) create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/svml_d_asinh2_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_asinh4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_asinh4_core_avx.S create mode 100644 sysdeps/x86_64/fpu/svml_d_asinh8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_asinhf16_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_asinhf4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_asinhf8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_asinhf8_core_avx.S create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-asinh.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-asinhf.c diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h index 5628ada8e1..02acfb1ef8 100644 --- a/bits/libm-simd-decl-stubs.h +++ b/bits/libm-simd-decl-stubs.h @@ -131,4 +131,15 @@ #define __DECL_SIMD_asinf32x #define __DECL_SIMD_asinf64x #define __DECL_SIMD_asinf128x + +#define __DECL_SIMD_asinh +#define __DECL_SIMD_asinhf +#define __DECL_SIMD_asinhl +#define __DECL_SIMD_asinhf16 +#define __DECL_SIMD_asinhf32 +#define __DECL_SIMD_asinhf64 +#define __DECL_SIMD_asinhf128 +#define __DECL_SIMD_asinhf32x +#define __DECL_SIMD_asinhf64x +#define __DECL_SIMD_asinhf128x #endif diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index dc04ab5538..9a7cfb57c7 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -84,7 +84,7 @@ __MATHDECL_VEC (void,sincos,, /* Hyperbolic arc cosine of X. */ __MATHCALL_VEC (acosh,, (_Mdouble_ __x)); /* Hyperbolic arc sine of X. */ -__MATHCALL (asinh,, (_Mdouble_ __x)); +__MATHCALL_VEC (asinh,, (_Mdouble_ __x)); /* Hyperbolic arc tangent of X. */ __MATHCALL (atanh,, (_Mdouble_ __x)); #endif diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist index 99229e1b1f..e246e1ba32 100644 --- a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist @@ -49,24 +49,32 @@ GLIBC_2.22 _ZGVeN8vvv_sincos F GLIBC_2.35 _ZGVbN2v_acos F GLIBC_2.35 _ZGVbN2v_acosh F GLIBC_2.35 _ZGVbN2v_asin F +GLIBC_2.35 _ZGVbN2v_asinh 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 _ZGVcN4v_acos F GLIBC_2.35 _ZGVcN4v_acosh F GLIBC_2.35 _ZGVcN4v_asin F +GLIBC_2.35 _ZGVcN4v_asinh 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 _ZGVdN4v_acos F GLIBC_2.35 _ZGVdN4v_acosh F GLIBC_2.35 _ZGVdN4v_asin F +GLIBC_2.35 _ZGVdN4v_asinh 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 _ZGVeN16v_acosf F GLIBC_2.35 _ZGVeN16v_acoshf F GLIBC_2.35 _ZGVeN16v_asinf F +GLIBC_2.35 _ZGVeN16v_asinhf 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 diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h index d1b3b566cd..f8f3d611b8 100644 --- a/sysdeps/x86/fpu/bits/math-vector.h +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -70,6 +70,10 @@ # define __DECL_SIMD_asin __DECL_SIMD_x86_64 # undef __DECL_SIMD_asinf # define __DECL_SIMD_asinf __DECL_SIMD_x86_64 +# undef __DECL_SIMD_asinh +# define __DECL_SIMD_asinh __DECL_SIMD_x86_64 +# undef __DECL_SIMD_asinhf +# define __DECL_SIMD_asinhf __DECL_SIMD_x86_64 # endif #endif diff --git a/sysdeps/x86_64/fpu/Makeconfig b/sysdeps/x86_64/fpu/Makeconfig index ca8e67cd39..3d34f880c3 100644 --- a/sysdeps/x86_64/fpu/Makeconfig +++ b/sysdeps/x86_64/fpu/Makeconfig @@ -25,6 +25,7 @@ libmvec-funcs = \ acos \ acosh \ asin \ + asinh \ cos \ exp \ log \ diff --git a/sysdeps/x86_64/fpu/Versions b/sysdeps/x86_64/fpu/Versions index 21d0c7937f..0f24286493 100644 --- a/sysdeps/x86_64/fpu/Versions +++ b/sysdeps/x86_64/fpu/Versions @@ -17,8 +17,10 @@ libmvec { _ZGVbN2v_acos; _ZGVcN4v_acos; _ZGVdN4v_acos; _ZGVeN8v_acos; _ZGVbN2v_acosh; _ZGVcN4v_acosh; _ZGVdN4v_acosh; _ZGVeN8v_acosh; _ZGVbN2v_asin; _ZGVcN4v_asin; _ZGVdN4v_asin; _ZGVeN8v_asin; + _ZGVbN2v_asinh; _ZGVcN4v_asinh; _ZGVdN4v_asinh; _ZGVeN8v_asinh; _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; } } diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 30ac87d84e..fb7086d2b9 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -157,6 +157,23 @@ float: 3 float128: 4 ldouble: 5 +Function: "asinh_vlen2": +double: 1 + +Function: "asinh_vlen4": +double: 1 +float: 1 + +Function: "asinh_vlen4_avx2": +double: 1 + +Function: "asinh_vlen8": +double: 1 +float: 1 + +Function: "asinh_vlen8_avx2": +float: 1 + Function: "atan": double: 1 float: 1 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core-sse2.S new file mode 100644 index 0000000000..ddd1c3ca24 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized asinh, 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_asinh _ZGVbN2v_asinh_sse2 +#include "../svml_d_asinh2_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core.c new file mode 100644 index 0000000000..37452d0f92 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized asinh, 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_asinh +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN2v_asinh, __GI__ZGVbN2v_asinh, __redirect__ZGVbN2v_asinh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core_sse4.S new file mode 100644 index 0000000000..4e5c9cebfd --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh2_core_sse4.S @@ -0,0 +1,5521 @@ +/* Function asinh 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 asinh(x) as log(x + sqrt(x*x + 1)) + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVbN2v_asinh_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 + movaps %xmm0, %xmm3 + movups %xmm8, 160(%rsp) + movaps %xmm3, %xmm4 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + +/* + * Split X into high and low parts, XHi (<= 26 bits) and XLo (<= 27 bits) + * We could use either X or |X| here, but it doesn't seem to matter + */ + movups 14272+__svml_dasinh_data_internal(%rip), %xmm8 + lea -4218816+__svml_dasinh_data_internal(%rip), %r8 + andps %xmm3, %xmm8 + movups %xmm9, 144(%rsp) + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + +/* + * Compute X^2 = (XHi + XLo)^2 = XHi^2 + XLo * (X + XHi) + * The two parts are shifted off by around 26 bits. So even though + * the low bit will not in general be exact, it's near enough + */ + movaps %xmm8, %xmm9 + mulpd %xmm8, %xmm9 + subpd %xmm8, %xmm4 + addpd %xmm3, %xmm8 + +/* Load the constant 1 and a sign mask */ + movups 12800+__svml_dasinh_data_internal(%rip), %xmm2 + movups %xmm10, 96(%rsp) + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + +/* + * Finally, express Y + W = X^2 + 1 accurately where Y has <= 29 bits. + * If |X| <= 1 then |XHi| <= 1 and so |X2Hi| <= 1, so we can treat 1 + * as the dominant component in the compensated summation. Otherwise, + * if |X| >= 1, then since X2Hi only has 52 significant bits, the basic + * addition will be exact anyway until we get to |X| >= 2^53. But by + * that time the log function is well-conditioned enough that the + * rounding error doesn't matter. Hence we can treat 1 as dominant even + * if it literally isn't. + */ + movaps %xmm2, %xmm10 + addpd %xmm9, %xmm10 + mulpd %xmm8, %xmm4 + movups 12864+__svml_dasinh_data_internal(%rip), %xmm6 + movaps %xmm2, %xmm8 + movups 14336+__svml_dasinh_data_internal(%rip), %xmm5 + +/* + * Get the absolute value of the input, since we will exploit antisymmetry + * and mostly assume X >= 0 in the core computation + */ + movaps %xmm6, %xmm0 + andps %xmm10, %xmm5 + andps %xmm3, %xmm0 + movups %xmm12, 112(%rsp) + +/* + * Check whether the input is finite, by checking |X| <= MaxFloat + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN <= MaxFloat) + */ + movaps %xmm0, %xmm7 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + +/* + * Compute R = 1/sqrt(Y + W) * (1 + d) + * Force R to <= 12 significant bits in case it isn't already + * This means that R * Y and R^2 * Y are exactly representable. + */ + cvtpd2ps %xmm5, %xmm12 + cmpnlepd 13952+__svml_dasinh_data_internal(%rip), %xmm7 + subpd %xmm10, %xmm8 + subpd %xmm5, %xmm10 + movmskpd %xmm7, %edx + addpd %xmm9, %xmm8 + +/* + * Unfortunately, we can still be in trouble if |X| <= 2^-10, since + * the absolute error 2^-(12+53)-ish in sqrt(1 + X^2) gets scaled up + * by 1/X and comes close to our threshold. Hence if |X| <= 2^-9, + * perform an alternative computation + * sqrt(1 + X^2) - 1 = X^2/2 - X^4/8 + X^6/16 + * X2 = X^2 + */ + addpd %xmm4, %xmm9 + addpd %xmm4, %xmm8 + movlhps %xmm12, %xmm12 + +/* + * The following computation can go wrong for very large X, basically + * because X^2 overflows. But for large X we have + * asinh(X) / log(2 X) - 1 =~= 1/(4 * X^2), so for X >= 2^30 + * we can just later stick X back into the log and tweak up the exponent. + * Actually we scale X by 2^-30 and tweak the exponent up by 31, + * to stay in the safe range for the later log computation. + * Compute a flag now telling us when do do this. + */ + movaps %xmm0, %xmm1 + rsqrtps %xmm12, %xmm7 + addpd %xmm10, %xmm8 + cmpltpd 13568+__svml_dasinh_data_internal(%rip), %xmm1 + cvtps2pd %xmm7, %xmm7 + andps 14208+__svml_dasinh_data_internal(%rip), %xmm7 + +/* + * Compute e = -(2 * d + d^2) + * The first FMR is exact, and the rounding error in the other is acceptable + * since d and e are ~ 2^-12 + */ + movaps %xmm2, %xmm12 + +/* + * Compute S = (Y/sqrt(Y + W)) * (1 + d) + * and T = (W/sqrt(Y + W)) * (1 + d) + * so that S + T = sqrt(Y + W) * (1 + d) + * S is exact, and the rounding error in T is OK. + */ + mulpd %xmm7, %xmm5 + mulpd %xmm7, %xmm8 + movaps %xmm7, %xmm10 + mulpd %xmm5, %xmm10 + mulpd %xmm8, %xmm7 + subpd %xmm10, %xmm12 + subpd %xmm7, %xmm12 + +/* + * Now 1 / (1 + d) + * = 1 / (1 + (sqrt(1 - e) - 1)) + * = 1 / sqrt(1 - e) + * = 1 + 1/2 * e + 3/8 * e^2 + 5/16 * e^3 + 35/128 * e^4 + + * 63/256 * e^5 + 231/1024 * e^6 + .... + * So compute the first five nonconstant terms of that, so that + * we have a relative correction (1 + Corr) to apply to S etc. + * C1 = 1/2 + * C2 = 3/8 + * C3 = 5/16 + * C4 = 35/128 + * C5 = 63/256 + */ + movups 13824+__svml_dasinh_data_internal(%rip), %xmm7 + mulpd %xmm12, %xmm7 + addpd 13760+__svml_dasinh_data_internal(%rip), %xmm7 + mulpd %xmm12, %xmm7 + addpd 13696+__svml_dasinh_data_internal(%rip), %xmm7 + mulpd %xmm12, %xmm7 + addpd 13632+__svml_dasinh_data_internal(%rip), %xmm7 + mulpd %xmm12, %xmm7 + movups 13888+__svml_dasinh_data_internal(%rip), %xmm10 + addpd %xmm10, %xmm7 + +/* dX2over2 = X^2/2 */ + mulpd %xmm10, %xmm9 + mulpd %xmm7, %xmm12 + +/* + * Obtain sqrt(1 + X^2) - 1 in two pieces + * sqrt(1 + X^2) - 1 + * = sqrt(Y + W) - 1 + * = (S + T) * (1 + Corr) - 1 + * = [S - 1] + [T + (S + T) * Corr] + * We need a compensated summation for the last part. We treat S - 1 + * as the larger part; it certainly is until about X < 2^-4, and in that + * case, the error is affordable since X dominates over sqrt(1 + X^2) - 1 + * Final sum is dTmp5 (hi) + dTmp7 (lo) + */ + movaps %xmm5, %xmm7 + +/* dX46 = -X^4/4 + X^6/8 */ + movaps %xmm9, %xmm4 + addpd %xmm8, %xmm7 + subpd %xmm2, %xmm5 + mulpd %xmm7, %xmm12 + addpd %xmm12, %xmm8 + addpd %xmm5, %xmm8 + +/* dX4over4 = X^4/4 */ + movaps %xmm9, %xmm5 + mulpd %xmm9, %xmm5 + mulpd %xmm5, %xmm4 + subpd %xmm5, %xmm4 + +/* dX46over2 = -X^4/8 + x^6/16 */ + mulpd %xmm4, %xmm10 + +/* Now multiplex the two possible computations */ + movaps %xmm0, %xmm5 + cmplepd 14016+__svml_dasinh_data_internal(%rip), %xmm5 + addpd %xmm10, %xmm9 + movaps %xmm5, %xmm7 + andps %xmm5, %xmm9 + andnps %xmm8, %xmm7 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * also adding L into Xl. + * compute 1+x as high, low parts + */ + movaps %xmm2, %xmm8 + orps %xmm9, %xmm7 + movaps %xmm2, %xmm9 + +/* + * Now do another compensated sum to add |X| + [sqrt(1 + X^2) - 1]. + * It's always safe to assume |X| is larger. + * This is the final 2-part argument to the log1p function + */ + addpd %xmm0, %xmm7 + +/* Now multiplex to the case X = 2^-30 * |input|, Xl = dL = 0 in the "big" case. */ + mulpd 14464+__svml_dasinh_data_internal(%rip), %xmm0 + maxpd %xmm7, %xmm8 + minpd %xmm7, %xmm9 + andps %xmm6, %xmm7 + movaps %xmm8, %xmm6 + cmpltpd 12928+__svml_dasinh_data_internal(%rip), %xmm7 + addpd %xmm9, %xmm6 + orps 12992+__svml_dasinh_data_internal(%rip), %xmm7 + andps %xmm7, %xmm6 + subpd %xmm6, %xmm8 + addpd %xmm8, %xmm9 + movaps %xmm1, %xmm8 + andps %xmm1, %xmm6 + andnps %xmm0, %xmm8 + andps %xmm1, %xmm9 + +/* + * Now resume the main code. + * preserve mantissa, set input exponent to 2^(-10) + */ + movups 12480+__svml_dasinh_data_internal(%rip), %xmm0 + orps %xmm6, %xmm8 + andps %xmm8, %xmm0 + orps 12544+__svml_dasinh_data_internal(%rip), %xmm0 + +/* reciprocal approximation good to at least 11 bits */ + cvtpd2ps %xmm0, %xmm5 + movlhps %xmm5, %xmm5 + rcpps %xmm5, %xmm4 + cvtps2pd %xmm4, %xmm7 + +/* round reciprocal to nearest integer, will have 1+9 mantissa bits */ + movups .FLT_33(%rip), %xmm0 + +/* exponent bits */ + movaps %xmm8, %xmm5 + addpd %xmm0, %xmm7 + subpd %xmm0, %xmm7 + +/* exponent of X needed to scale Xl */ + movdqu 13376+__svml_dasinh_data_internal(%rip), %xmm12 + psrlq $20, %xmm5 + +/* 2^ (-10-exp(X) ) */ + movdqu 13440+__svml_dasinh_data_internal(%rip), %xmm6 + pand %xmm8, %xmm12 + psubq %xmm12, %xmm6 + +/* scale DblRcp */ + mulpd %xmm7, %xmm6 + +/* argument reduction */ + mulpd %xmm6, %xmm8 + mulpd %xmm6, %xmm9 + subpd %xmm2, %xmm8 + pshufd $221, %xmm5, %xmm10 + movaps %xmm1, %xmm5 + +/* biased exponent in DP format */ + cvtdq2pd %xmm10, %xmm0 + addpd %xmm9, %xmm8 + +/* Add 31 to the exponent in the "large" case to get log(2 * input) */ + movups 14144+__svml_dasinh_data_internal(%rip), %xmm4 + addpd %xmm0, %xmm4 + +/* polynomial */ + movups 12416+__svml_dasinh_data_internal(%rip), %xmm2 + andps %xmm1, %xmm0 + mulpd %xmm8, %xmm2 + +/* + * prepare table index + * table lookup + */ + movaps %xmm7, %xmm1 + andnps %xmm4, %xmm5 + psrlq $40, %xmm1 + orps %xmm0, %xmm5 + movd %xmm1, %eax + pshufd $2, %xmm1, %xmm0 + movaps %xmm8, %xmm1 + +/* exponent*log(2.0) */ + movups 13184+__svml_dasinh_data_internal(%rip), %xmm10 + mulpd %xmm8, %xmm1 + movd %xmm0, %ecx + movups 12448+__svml_dasinh_data_internal(%rip), %xmm0 + addpd 12432+__svml_dasinh_data_internal(%rip), %xmm2 + cmpltpd %xmm7, %xmm10 + mulpd %xmm8, %xmm0 + mulpd %xmm1, %xmm2 + addpd 12464+__svml_dasinh_data_internal(%rip), %xmm0 + addpd %xmm2, %xmm0 + +/* reconstruction */ + mulpd %xmm0, %xmm1 + andps 13248+__svml_dasinh_data_internal(%rip), %xmm10 + orps 13312+__svml_dasinh_data_internal(%rip), %xmm10 + subpd %xmm10, %xmm5 + addpd %xmm1, %xmm8 + mulpd 13504+__svml_dasinh_data_internal(%rip), %xmm5 + movslq %eax, %rax + movslq %ecx, %rcx + +/* Finally, reincorporate the original sign. */ + movups 14080+__svml_dasinh_data_internal(%rip), %xmm0 + andps %xmm3, %xmm0 + movsd (%r8,%rax), %xmm4 + movhpd (%r8,%rcx), %xmm4 + addpd %xmm8, %xmm4 + addpd %xmm4, %xmm5 + movups 160(%rsp), %xmm8 + cfi_restore(25) + pxor %xmm5, %xmm0 + testl %edx, %edx + jne .LBL_1_3 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_2: + movups 144(%rsp), %xmm9 + cfi_restore(26) + movups 96(%rsp), %xmm10 + cfi_restore(27) + movups 112(%rsp), %xmm12 + cfi_restore(29) + 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, 0x90, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + +.LBL_1_3: + movups %xmm3, 128(%rsp) + movups %xmm0, 192(%rsp) + xorl %eax, %eax + movups %xmm8, 160(%rsp) + movups %xmm11, 48(%rsp) + movups %xmm13, 32(%rsp) + movups %xmm14, 16(%rsp) + movups %xmm15, (%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, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1f, 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, 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 160(%rsp), %xmm8 + cfi_restore(25) + movups 48(%rsp), %xmm11 + cfi_restore(28) + movups 32(%rsp), %xmm13 + cfi_restore(30) + movups 16(%rsp), %xmm14 + cfi_restore(31) + movups (%rsp), %xmm15 + cfi_restore(32) + 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, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1f, 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,8), %rdi + lea 192(%rsp,%r12,8), %rsi + call __svml_dasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVbN2v_asinh_sse4) + + .align 16,0x90 + +__svml_dasinh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movq (%rdi), %rdx + cmpl $32752, %eax + jne .LBL_2_5 + testl $1048575, 4(%rdi) + jne .LBL_2_4 + cmpl $0, (%rdi) + je .LBL_2_5 + +.LBL_2_4: + movsd (%rdi), %xmm0 + xorl %eax, %eax + mulsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_5: + movq %rdx, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_dasinh_cout_rare_internal,@function + .size __svml_dasinh_cout_rare_internal,.-__svml_dasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dasinh_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 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_dasinh_data_internal,@object + .size __svml_dasinh_data_internal,14720 + .align 16 + +.FLT_33: + .long 0x00000000,0x43380000,0x00000000,0x43380000 + .type .FLT_33,@object + .size .FLT_33,16 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core-sse.S new file mode 100644 index 0000000000..903b5f0fb5 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized asinh, 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_asinh _ZGVdN4v_asinh_sse_wrapper +#include "../svml_d_asinh4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core.c new file mode 100644 index 0000000000..e7acd032b5 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized asinh, 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_asinh +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN4v_asinh, __GI__ZGVdN4v_asinh, __redirect__ZGVdN4v_asinh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core_avx2.S new file mode 100644 index 0000000000..e13ca6a7ea --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh4_core_avx2.S @@ -0,0 +1,5092 @@ +/* Function asinh 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 asinh(x) as log(x + sqrt(x*x + 1)) + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVdN4v_asinh_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_dasinh_data_internal(%rip), %rax + vmovups %ymm9, 96(%rsp) + vmovups %ymm13, 256(%rsp) + .cfi_escape 0x10, 0xdc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + vmovupd 12928+__svml_dasinh_data_internal(%rip), %ymm9 + vmovups %ymm12, 224(%rsp) + vmovups %ymm8, 32(%rsp) + .cfi_escape 0x10, 0xdb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xdf, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + +/* Load the constant 1 and a sign mask */ + vmovupd 12864+__svml_dasinh_data_internal(%rip), %ymm12 + vmovups %ymm10, 160(%rsp) + vmovups %ymm14, 288(%rsp) + vmovups %ymm15, 320(%rsp) + vmovups %ymm11, 192(%rsp) + .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, 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, %ymm13 + +/* No need to split X when FMA is available in hardware. */ + vmulpd %ymm13, %ymm13, %ymm8 + +/* + * Get the absolute value of the input, since we will exploit antisymmetry + * and mostly assume X >= 0 in the core computation + */ + vandpd %ymm9, %ymm13, %ymm10 + +/* + * Check whether the input is finite, by checking |X| <= MaxFloat + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN <= MaxFloat) + */ + vcmpnle_uqpd 14016+__svml_dasinh_data_internal(%rip), %ymm10, %ymm5 + +/* + * Finally, express Y + W = X^2 + 1 accurately where Y has <= 29 bits. + * If |X| <= 1 then |XHi| <= 1 and so |X2Hi| <= 1, so we can treat 1 + * as the dominant component in the compensated summation. Otherwise, + * if |X| >= 1, then since X2Hi only has 52 significant bits, the basic + * addition will be exact anyway until we get to |X| >= 2^53. But by + * that time the log function is well-conditioned enough that the + * rounding error doesn't matter. Hence we can treat 1 as dominant even + * if it literally isn't. + */ + vaddpd %ymm8, %ymm12, %ymm1 + +/* + * The following computation can go wrong for very large X, basically + * because X^2 overflows. But for large X we have + * asinh(X) / log(2 X) - 1 =~= 1/(4 * X^2), so for X >= 2^30 + * we can just later stick X back into the log and tweak up the exponent. + * Actually we scale X by 2^-30 and tweak the exponent up by 31, + * to stay in the safe range for the later log computation. + * Compute a flag now telling us when do do this. + */ + vcmplt_oqpd 13632+__svml_dasinh_data_internal(%rip), %ymm10, %ymm11 + vsubpd %ymm1, %ymm12, %ymm4 + vmovmskpd %ymm5, %edx + vandpd 14400+__svml_dasinh_data_internal(%rip), %ymm1, %ymm5 + +/* + * Compute R = 1/sqrt(Y + W) * (1 + d) + * Force R to <= 12 significant bits in case it isn't already + * This means that R * Y and R^2 * Y are exactly representable. + */ + vcvtpd2ps %ymm5, %xmm14 + vaddpd %ymm4, %ymm8, %ymm2 + vsubpd %ymm5, %ymm1, %ymm6 + vrsqrtps %xmm14, %xmm15 + vmovapd %ymm13, %ymm7 + vfmsub213pd %ymm8, %ymm13, %ymm7 + vcvtps2pd %xmm15, %ymm0 + vaddpd %ymm2, %ymm7, %ymm3 + +/* + * Unfortunately, we can still be in trouble if |X| <= 2^-10, since + * the absolute error 2^-(12+53)-ish in sqrt(1 + X^2) gets scaled up + * by 1/X and comes close to our threshold. Hence if |X| <= 2^-9, + * perform an alternative computation + * sqrt(1 + X^2) - 1 = X^2/2 - X^4/8 + X^6/16 + * X2 = X^2 + */ + vaddpd %ymm7, %ymm8, %ymm7 + vaddpd %ymm6, %ymm3, %ymm4 + +/* + * Now 1 / (1 + d) + * = 1 / (1 + (sqrt(1 - e) - 1)) + * = 1 / sqrt(1 - e) + * = 1 + 1/2 * e + 3/8 * e^2 + 5/16 * e^3 + 35/128 * e^4 + + * 63/256 * e^5 + 231/1024 * e^6 + .... + * So compute the first five nonconstant terms of that, so that + * we have a relative correction (1 + Corr) to apply to S etc. + * C1 = 1/2 + * C2 = 3/8 + * C3 = 5/16 + * C4 = 35/128 + * C5 = 63/256 + */ + vmovupd 13888+__svml_dasinh_data_internal(%rip), %ymm3 + vmovupd 13952+__svml_dasinh_data_internal(%rip), %ymm6 + vandpd 14272+__svml_dasinh_data_internal(%rip), %ymm0, %ymm2 + +/* + * Compute S = (Y/sqrt(Y + W)) * (1 + d) + * and T = (W/sqrt(Y + W)) * (1 + d) + * so that S + T = sqrt(Y + W) * (1 + d) + * S is exact, and the rounding error in T is OK. + */ + vmulpd %ymm2, %ymm5, %ymm0 + vmulpd %ymm4, %ymm2, %ymm15 + vsubpd %ymm12, %ymm0, %ymm4 + +/* + * Obtain sqrt(1 + X^2) - 1 in two pieces + * sqrt(1 + X^2) - 1 + * = sqrt(Y + W) - 1 + * = (S + T) * (1 + Corr) - 1 + * = [S - 1] + [T + (S + T) * Corr] + * We need a compensated summation for the last part. We treat S - 1 + * as the larger part; it certainly is until about X < 2^-4, and in that + * case, the error is affordable since X dominates over sqrt(1 + X^2) - 1 + * Final sum is dTmp5 (hi) + dTmp7 (lo) + */ + vaddpd %ymm15, %ymm0, %ymm14 + +/* + * Compute e = -(2 * d + d^2) + * The first FMR is exact, and the rounding error in the other is acceptable + * since d and e are ~ 2^-12 + */ + vmovapd %ymm12, %ymm1 + vfnmadd231pd %ymm0, %ymm2, %ymm1 + vfnmadd231pd %ymm15, %ymm2, %ymm1 + vfmadd213pd 13824+__svml_dasinh_data_internal(%rip), %ymm1, %ymm3 + vfmadd213pd 13760+__svml_dasinh_data_internal(%rip), %ymm1, %ymm3 + vfmadd213pd 13696+__svml_dasinh_data_internal(%rip), %ymm1, %ymm3 + vfmadd213pd %ymm6, %ymm1, %ymm3 + vmulpd %ymm3, %ymm1, %ymm5 + +/* Now multiplex the two possible computations */ + vcmple_oqpd 14080+__svml_dasinh_data_internal(%rip), %ymm10, %ymm3 + vfmadd213pd %ymm15, %ymm14, %ymm5 + vaddpd %ymm4, %ymm5, %ymm2 + +/* dX2over2 = X^2/2 */ + vmulpd %ymm7, %ymm6, %ymm5 + +/* dX4over4 = X^4/4 */ + vmulpd %ymm5, %ymm5, %ymm0 + +/* dX46 = -X^4/4 + X^6/8 */ + vfmsub231pd %ymm5, %ymm0, %ymm0 + +/* dX46over2 = -X^4/8 + x^6/16 */ + vmulpd %ymm0, %ymm6, %ymm4 + vaddpd %ymm4, %ymm5, %ymm1 + vblendvpd %ymm3, %ymm1, %ymm2, %ymm6 + +/* + * Now do another compensated sum to add |X| + [sqrt(1 + X^2) - 1]. + * It's always safe to assume |X| is larger. + * This is the final 2-part argument to the log1p function + */ + vaddpd %ymm6, %ymm10, %ymm7 + +/* Now multiplex to the case X = 2^-30 * |input|, Xl = dL = 0 in the "big" case. */ + vmulpd 14528+__svml_dasinh_data_internal(%rip), %ymm10, %ymm10 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * also adding L into Xl. + * compute 1+x as high, low parts + */ + vmaxpd %ymm7, %ymm12, %ymm0 + vminpd %ymm7, %ymm12, %ymm5 + vandpd %ymm9, %ymm7, %ymm9 + vcmplt_oqpd 12992+__svml_dasinh_data_internal(%rip), %ymm9, %ymm8 + vaddpd %ymm5, %ymm0, %ymm14 + vorpd 13056+__svml_dasinh_data_internal(%rip), %ymm8, %ymm15 + vandpd %ymm15, %ymm14, %ymm2 + vsubpd %ymm2, %ymm0, %ymm4 + +/* 2^ (-10-exp(X) ) */ + vmovupd 13504+__svml_dasinh_data_internal(%rip), %ymm8 + vaddpd %ymm4, %ymm5, %ymm1 + vblendvpd %ymm11, %ymm2, %ymm10, %ymm5 + +/* + * Now resume the main code. + * preserve mantissa, set input exponent to 2^(-10) + */ + vandpd 12544+__svml_dasinh_data_internal(%rip), %ymm5, %ymm0 + vorpd 12608+__svml_dasinh_data_internal(%rip), %ymm0, %ymm3 + +/* reciprocal approximation good to at least 11 bits */ + vcvtpd2ps %ymm3, %xmm6 + +/* exponent bits */ + vpsrlq $20, %ymm5, %ymm10 + vrcpps %xmm6, %xmm7 + vandpd %ymm11, %ymm1, %ymm4 + vcvtps2pd %xmm7, %ymm15 + +/* exponent of X needed to scale Xl */ + vandps 13440+__svml_dasinh_data_internal(%rip), %ymm5, %ymm9 + vpsubq %ymm9, %ymm8, %ymm0 + +/* round reciprocal to nearest integer, will have 1+9 mantissa bits */ + vroundpd $0, %ymm15, %ymm3 + +/* scale DblRcp */ + vmulpd %ymm0, %ymm3, %ymm2 + +/* argument reduction */ + vfmsub213pd %ymm12, %ymm2, %ymm5 + vmulpd %ymm2, %ymm4, %ymm12 + vmovupd 12480+__svml_dasinh_data_internal(%rip), %ymm2 + vaddpd %ymm12, %ymm5, %ymm5 + vfmadd213pd 12512+__svml_dasinh_data_internal(%rip), %ymm5, %ymm2 + vmulpd %ymm5, %ymm5, %ymm4 + vextractf128 $1, %ymm10, %xmm14 + vshufps $221, %xmm14, %xmm10, %xmm1 + +/* biased exponent in DP format */ + vcvtdq2pd %xmm1, %ymm7 + +/* exponent*log(2.0) */ + vmovupd 13248+__svml_dasinh_data_internal(%rip), %ymm10 + +/* Add 31 to the exponent in the "large" case to get log(2 * input) */ + vaddpd 14208+__svml_dasinh_data_internal(%rip), %ymm7, %ymm6 + vblendvpd %ymm11, %ymm7, %ymm6, %ymm1 + +/* + * prepare table index + * table lookup + */ + vpsrlq $40, %ymm3, %ymm11 + vcmplt_oqpd %ymm3, %ymm10, %ymm3 + vandpd 13312+__svml_dasinh_data_internal(%rip), %ymm3, %ymm14 + vorpd 13376+__svml_dasinh_data_internal(%rip), %ymm14, %ymm15 + vsubpd %ymm15, %ymm1, %ymm1 + vmulpd 13568+__svml_dasinh_data_internal(%rip), %ymm1, %ymm3 + +/* polynomial */ + vmovupd 12416+__svml_dasinh_data_internal(%rip), %ymm1 + vfmadd213pd 12448+__svml_dasinh_data_internal(%rip), %ymm5, %ymm1 + vfmadd213pd %ymm2, %ymm4, %ymm1 + +/* reconstruction */ + vfmadd213pd %ymm5, %ymm4, %ymm1 + vextractf128 $1, %ymm11, %xmm7 + vmovd %xmm11, %ecx + vmovd %xmm7, %r9d + movslq %ecx, %rcx + vpextrd $2, %xmm11, %r8d + movslq %r9d, %r9 + vpextrd $2, %xmm7, %r10d + movslq %r8d, %r8 + movslq %r10d, %r10 + vmovsd (%rax,%rcx), %xmm0 + vmovsd (%rax,%r9), %xmm8 + vmovhpd (%rax,%r8), %xmm0, %xmm6 + vmovhpd (%rax,%r10), %xmm8, %xmm9 + vinsertf128 $1, %xmm9, %ymm6, %ymm0 + vaddpd %ymm1, %ymm0, %ymm0 + vaddpd %ymm0, %ymm3, %ymm7 + +/* Finally, reincorporate the original sign. */ + vandpd 14144+__svml_dasinh_data_internal(%rip), %ymm13, %ymm6 + vxorpd %ymm7, %ymm6, %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: + vmovupd %ymm13, 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_dasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVdN4v_asinh_avx2) + + .align 16,0x90 + +__svml_dasinh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movq (%rdi), %rdx + cmpl $32752, %eax + jne .LBL_2_5 + testl $1048575, 4(%rdi) + jne .LBL_2_4 + cmpl $0, (%rdi) + je .LBL_2_5 + +.LBL_2_4: + movsd (%rdi), %xmm0 + xorl %eax, %eax + mulsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_5: + movq %rdx, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_dasinh_cout_rare_internal,@function + .size __svml_dasinh_cout_rare_internal,.-__svml_dasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dasinh_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 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_dasinh_data_internal,@object + .size __svml_dasinh_data_internal,14784 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core-avx2.S new file mode 100644 index 0000000000..647c73292c --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized asinh, 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_asinh _ZGVeN8v_asinh_avx2_wrapper +#include "../svml_d_asinh8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core.c new file mode 100644 index 0000000000..45e5ab72a6 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized asinh, 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_asinh +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN8v_asinh, __GI__ZGVeN8v_asinh, __redirect__ZGVeN8v_asinh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core_avx512.S new file mode 100644 index 0000000000..00da374656 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_asinh8_core_avx512.S @@ -0,0 +1,853 @@ +/* Function asinh 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 asinh(x) as log(x + sqrt(x*x + 1)) + * using RSQRT instructions for starting the + * square root approximation, and small table lookups for log + * that map to AVX-512 permute instructions + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVeN8v_asinh_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 + vmovaps %zmm0, %zmm3 + +/* x^2 */ + vmulpd {rn-sae}, %zmm3, %zmm3, %zmm14 + vmovups 256+__svml_dasinh_data_internal_avx512(%rip), %zmm9 + +/* polynomial computation for small inputs */ + vmovups 576+__svml_dasinh_data_internal_avx512(%rip), %zmm10 + vmovups 640+__svml_dasinh_data_internal_avx512(%rip), %zmm11 + +/* not a very small input ? */ + vmovups 384+__svml_dasinh_data_internal_avx512(%rip), %zmm0 + +/* A=max(x^2, 1); */ + vmaxpd {sae}, %zmm14, %zmm9, %zmm4 + +/* B=min(x^2, 1); */ + vminpd {sae}, %zmm14, %zmm9, %zmm5 + vfmadd231pd {rn-sae}, %zmm14, %zmm10, %zmm11 + +/* 1+x^2 */ + vaddpd {rn-sae}, %zmm9, %zmm14, %zmm8 + +/* |input| */ + vandpd 320+__svml_dasinh_data_internal_avx512(%rip), %zmm3, %zmm1 + vrsqrt14pd %zmm8, %zmm6 + vcmppd $21, {sae}, %zmm0, %zmm1, %k2 + +/* B_high */ + vsubpd {rn-sae}, %zmm4, %zmm8, %zmm7 + +/* sign bit */ + vxorpd %zmm3, %zmm1, %zmm2 + vmulpd {rn-sae}, %zmm14, %zmm11, %zmm4 + +/* B_low */ + vsubpd {rn-sae}, %zmm7, %zmm5, %zmm13 + vmovups 832+__svml_dasinh_data_internal_avx512(%rip), %zmm5 + vmovups 896+__svml_dasinh_data_internal_avx512(%rip), %zmm7 + +/* polynomial computation for small inputs */ + vfmadd213pd {rn-sae}, %zmm1, %zmm1, %zmm4 + +/* (x^2)_low */ + vmovaps %zmm3, %zmm15 + vfmsub213pd {rn-sae}, %zmm14, %zmm3, %zmm15 + +/* Sh ~sqrt(1+x^2) */ + vmulpd {rn-sae}, %zmm6, %zmm8, %zmm14 + +/* Yl = (x^2)_low + B_low */ + vaddpd {rn-sae}, %zmm15, %zmm13, %zmm13 + +/* very large inputs ? */ + vmovups 448+__svml_dasinh_data_internal_avx512(%rip), %zmm15 + +/* (Yh*R0)_low */ + vfmsub213pd {rn-sae}, %zmm14, %zmm6, %zmm8 + vcmppd $21, {sae}, %zmm15, %zmm1, %k1 + +/* Sl = (Yh*R0)_low+(R0*Yl) */ + vfmadd213pd {rn-sae}, %zmm8, %zmm6, %zmm13 + vmovups 512+__svml_dasinh_data_internal_avx512(%rip), %zmm8 + +/* rel. error term: Eh=1-Sh*R0 */ + vmovaps %zmm9, %zmm12 + vfnmadd231pd {rn-sae}, %zmm14, %zmm6, %zmm12 + vcmppd $22, {sae}, %zmm8, %zmm1, %k0 + +/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */ + vfnmadd231pd {rn-sae}, %zmm13, %zmm6, %zmm12 + +/* + * sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s + * poly_s = c1+c2*Eh+c3*Eh^2 + */ + vmovups 704+__svml_dasinh_data_internal_avx512(%rip), %zmm6 + vmovups 768+__svml_dasinh_data_internal_avx512(%rip), %zmm8 + +/* Sh*Eh */ + vmulpd {rn-sae}, %zmm12, %zmm14, %zmm11 + vfmadd231pd {rn-sae}, %zmm12, %zmm6, %zmm8 + +/* Sh+x */ + vaddpd {rn-sae}, %zmm1, %zmm14, %zmm6 + kmovw %k0, %edx + vfmadd213pd {rn-sae}, %zmm5, %zmm12, %zmm8 + vfmadd213pd {rn-sae}, %zmm7, %zmm12, %zmm8 + +/* Xh */ + vsubpd {rn-sae}, %zmm14, %zmm6, %zmm12 + +/* Sl + Sh*Eh*poly_s */ + vfmadd213pd {rn-sae}, %zmm13, %zmm8, %zmm11 + +/* fixup for very large inputs */ + vmovups 1216+__svml_dasinh_data_internal_avx512(%rip), %zmm8 + +/* Xl */ + vsubpd {rn-sae}, %zmm12, %zmm1, %zmm12 + +/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */ + vaddpd {rn-sae}, %zmm11, %zmm6, %zmm10 + +/* Sl_high */ + vsubpd {rn-sae}, %zmm6, %zmm10, %zmm5 + vmulpd {rn-sae}, %zmm8, %zmm1, %zmm10{%k1} + +/* Table lookups */ + vmovups __svml_dasinh_data_internal_avx512(%rip), %zmm6 + +/* Sl_l */ + vsubpd {rn-sae}, %zmm5, %zmm11, %zmm7 + vrcp14pd %zmm10, %zmm13 + +/* Xin_low */ + vaddpd {rn-sae}, %zmm12, %zmm7, %zmm14 + vmovups 128+__svml_dasinh_data_internal_avx512(%rip), %zmm7 + vmovups 1536+__svml_dasinh_data_internal_avx512(%rip), %zmm12 + +/* round reciprocal to 1+4b mantissas */ + vpaddq 1088+__svml_dasinh_data_internal_avx512(%rip), %zmm13, %zmm11 + +/* fixup for very large inputs */ + vxorpd %zmm14, %zmm14, %zmm14{%k1} + vmovups 1600+__svml_dasinh_data_internal_avx512(%rip), %zmm13 + vandpd 1152+__svml_dasinh_data_internal_avx512(%rip), %zmm11, %zmm15 + vmovups 1472+__svml_dasinh_data_internal_avx512(%rip), %zmm11 + +/* Prepare table index */ + vpsrlq $48, %zmm15, %zmm5 + +/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */ + vfmsub231pd {rn-sae}, %zmm15, %zmm10, %zmm9 + +/* exponents */ + vgetexppd {sae}, %zmm15, %zmm8 + vmovups 1280+__svml_dasinh_data_internal_avx512(%rip), %zmm10 + vpermt2pd 64+__svml_dasinh_data_internal_avx512(%rip), %zmm5, %zmm6 + vpermt2pd 192+__svml_dasinh_data_internal_avx512(%rip), %zmm5, %zmm7 + vsubpd {rn-sae}, %zmm10, %zmm8, %zmm8{%k1} + vfmadd231pd {rn-sae}, %zmm15, %zmm14, %zmm9 + +/* polynomials */ + vmovups 1344+__svml_dasinh_data_internal_avx512(%rip), %zmm10 + vmovups 1408+__svml_dasinh_data_internal_avx512(%rip), %zmm5 + vmovups 1664+__svml_dasinh_data_internal_avx512(%rip), %zmm14 + +/* -K*L2H + Th */ + vmovups 1920+__svml_dasinh_data_internal_avx512(%rip), %zmm15 + vfmadd231pd {rn-sae}, %zmm9, %zmm10, %zmm5 + +/* -K*L2L + Tl */ + vmovups 1984+__svml_dasinh_data_internal_avx512(%rip), %zmm10 + vfnmadd231pd {rn-sae}, %zmm8, %zmm15, %zmm6 + vfmadd213pd {rn-sae}, %zmm11, %zmm9, %zmm5 + vfnmadd213pd {rn-sae}, %zmm7, %zmm10, %zmm8 + vmovups 1728+__svml_dasinh_data_internal_avx512(%rip), %zmm7 + vmovups 1856+__svml_dasinh_data_internal_avx512(%rip), %zmm10 + +/* R^2 */ + vmulpd {rn-sae}, %zmm9, %zmm9, %zmm11 + vfmadd213pd {rn-sae}, %zmm12, %zmm9, %zmm5 + vfmadd213pd {rn-sae}, %zmm13, %zmm9, %zmm5 + vfmadd213pd {rn-sae}, %zmm14, %zmm9, %zmm5 + vfmadd213pd {rn-sae}, %zmm7, %zmm9, %zmm5 + vmovups 1792+__svml_dasinh_data_internal_avx512(%rip), %zmm7 + vfmadd213pd {rn-sae}, %zmm7, %zmm9, %zmm5 + vfmadd213pd {rn-sae}, %zmm10, %zmm9, %zmm5 + +/* Tl + R^2*Poly */ + vfmadd213pd {rn-sae}, %zmm8, %zmm11, %zmm5 + +/* R+Tl + R^2*Poly */ + vaddpd {rn-sae}, %zmm9, %zmm5, %zmm9 + vaddpd {rn-sae}, %zmm9, %zmm6, %zmm4{%k2} + vxorpd %zmm2, %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 %zmm3, 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_dasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVeN8v_asinh_skx) + + .align 16,0x90 + +__svml_dasinh_cout_rare_internal: + + cfi_startproc + + movzwl 6(%rdi), %eax + andl $32752, %eax + movq (%rdi), %rdx + cmpl $32752, %eax + jne .LBL_2_5 + testl $1048575, 4(%rdi) + jne .LBL_2_4 + cmpl $0, (%rdi) + je .LBL_2_5 + +.LBL_2_4: + movsd (%rdi), %xmm0 + xorl %eax, %eax + mulsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + ret + +.LBL_2_5: + movq %rdx, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_dasinh_cout_rare_internal,@function + .size __svml_dasinh_cout_rare_internal,.-__svml_dasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dasinh_data_internal_avx512: + .long 0 + .long 0 + .long 3222405120 + .long 3215919664 + .long 1848311808 + .long 3216910087 + .long 1890025472 + .long 3217424176 + .long 3348791296 + .long 3217854455 + .long 2880159744 + .long 3218171740 + .long 3256631296 + .long 3218366859 + .long 4139499520 + .long 3218553303 + .long 3971973120 + .long 3218731811 + .long 3348791296 + .long 3218903031 + .long 1605304320 + .long 3219067535 + .long 3827638272 + .long 3219177074 + .long 1584414720 + .long 3219253343 + .long 860823552 + .long 3219326935 + .long 3896934400 + .long 3219398031 + .long 643547136 + .long 3219466797 + .long 0 + .long 0 + .long 3496399314 + .long 1028893491 + .long 720371772 + .long 1026176044 + .long 1944193543 + .long 3175338952 + .long 634920691 + .long 3175752108 + .long 1664625295 + .long 1029304828 + .long 192624563 + .long 3177103997 + .long 3796653051 + .long 3176138396 + .long 3062724207 + .long 3176680434 + .long 634920691 + .long 3176800684 + .long 1913570380 + .long 3174806221 + .long 825194088 + .long 3176465773 + .long 2335489660 + .long 3172599741 + .long 2497625109 + .long 1029604288 + .long 914782743 + .long 1029350199 + .long 3743595607 + .long 3175525305 + .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 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1064304640 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 0 + .long 1608515584 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 4294967295 + .long 2146435071 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 246350567 + .long 1068708642 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 1431445118 + .long 3217380693 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 26490386 + .long 1070694400 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 20643840 + .long 1070858240 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .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 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .long 0 + .long 1071120384 + .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 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 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1069547520 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 0 + .long 1074790400 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1075921768 + .long 3216615856 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 1847891832 + .long 1069318246 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 2315602889 + .long 3217031163 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 4145174257 + .long 1069697314 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 1436264246 + .long 3217380693 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 2579396527 + .long 1070176665 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 4294966373 + .long 3218079743 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 1431655617 + .long 1070945621 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .long 0 + .long 3219128320 + .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_dasinh_data_internal_avx512,@object + .size __svml_dasinh_data_internal_avx512,2048 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core-avx2.S new file mode 100644 index 0000000000..7dfd95e400 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized asinhf. + 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_asinhf _ZGVeN16v_asinhf_avx2_wrapper +#include "../svml_s_asinhf16_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core.c new file mode 100644 index 0000000000..dc770a0e65 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized asinhf, 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_asinhf +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN16v_asinhf, __GI__ZGVeN16v_asinhf, + __redirect__ZGVeN16v_asinhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core_avx512.S new file mode 100644 index 0000000000..6a701488ad --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf16_core_avx512.S @@ -0,0 +1,653 @@ +/* Function asinhf 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 asinh(x) as log(x + sqrt(x*x + 1)) + * using RSQRT instructions for starting the + * square root approximation, and small table lookups for log + * that map to AVX-512 permute instructions + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVeN16v_asinhf_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 + vmovaps %zmm0, %zmm10 + +/* x^2 */ + vmulps {rn-sae}, %zmm10, %zmm10, %zmm0 + vmovups 256+__svml_sasinh_data_internal_avx512(%rip), %zmm2 + +/* polynomial computation for small inputs */ + vmovups 576+__svml_sasinh_data_internal_avx512(%rip), %zmm1 + +/* not a very small input ? */ + vmovups 384+__svml_sasinh_data_internal_avx512(%rip), %zmm11 + +/* 1+x^2 */ + vaddps {rn-sae}, %zmm2, %zmm0, %zmm7 + +/* |input| */ + vandps 320+__svml_sasinh_data_internal_avx512(%rip), %zmm10, %zmm12 + +/* A=max(x^2, 1); */ + vmaxps {sae}, %zmm0, %zmm2, %zmm14 + vrsqrt14ps %zmm7, %zmm8 + +/* B=min(x^2, 1); */ + vminps {sae}, %zmm0, %zmm2, %zmm15 + vcmpps $21, {sae}, %zmm11, %zmm12, %k2 + +/* B_high */ + vsubps {rn-sae}, %zmm14, %zmm7, %zmm9 + +/* sign bit */ + vxorps %zmm10, %zmm12, %zmm13 + +/* Sh ~sqrt(1+x^2) */ + vmulps {rn-sae}, %zmm8, %zmm7, %zmm6 + vmovups 512+__svml_sasinh_data_internal_avx512(%rip), %zmm14 + +/* B_low */ + vsubps {rn-sae}, %zmm9, %zmm15, %zmm3 + +/* Sh+x */ + vaddps {rn-sae}, %zmm12, %zmm6, %zmm15 + +/* (Yh*R0)_low */ + vfmsub213ps {rn-sae}, %zmm6, %zmm8, %zmm7 + vmulps {rn-sae}, %zmm1, %zmm0, %zmm9 + vcmpps $22, {sae}, %zmm14, %zmm12, %k0 + vmovups 704+__svml_sasinh_data_internal_avx512(%rip), %zmm1 + +/* polynomial computation for small inputs */ + vfmadd213ps {rn-sae}, %zmm12, %zmm12, %zmm9 + kmovw %k0, %edx + +/* (x^2)_low */ + vmovaps %zmm10, %zmm4 + vfmsub213ps {rn-sae}, %zmm0, %zmm10, %zmm4 + +/* Yl = (x^2)_low + B_low */ + vaddps {rn-sae}, %zmm4, %zmm3, %zmm5 + +/* rel. error term: Eh=1-Sh*R0 */ + vmovaps %zmm2, %zmm0 + vfnmadd231ps {rn-sae}, %zmm6, %zmm8, %zmm0 + +/* Sl = (Yh*R0)_low+(R0*Yl) */ + vfmadd213ps {rn-sae}, %zmm7, %zmm8, %zmm5 + +/* very large inputs ? */ + vmovups 448+__svml_sasinh_data_internal_avx512(%rip), %zmm7 + +/* rel. error term: Eh=(1-Sh*R0)-Sl*R0 */ + vfnmadd231ps {rn-sae}, %zmm5, %zmm8, %zmm0 + +/* sqrt(1+x^2) ~ Sh + Sl + Sh*Eh*poly_s */ + vmovups 640+__svml_sasinh_data_internal_avx512(%rip), %zmm8 + vcmpps $21, {sae}, %zmm7, %zmm12, %k1 + +/* Sh*Eh */ + vmulps {rn-sae}, %zmm0, %zmm6, %zmm4 + vfmadd231ps {rn-sae}, %zmm0, %zmm8, %zmm1 + +/* Sl + Sh*Eh*poly_s */ + vfmadd213ps {rn-sae}, %zmm5, %zmm1, %zmm4 + +/* Xh */ + vsubps {rn-sae}, %zmm6, %zmm15, %zmm5 + +/* fixup for very large inputs */ + vmovups 896+__svml_sasinh_data_internal_avx512(%rip), %zmm6 + +/* Xin0+Sl+Sh*Eh*poly_s ~ x+sqrt(1+x^2) */ + vaddps {rn-sae}, %zmm4, %zmm15, %zmm3 + +/* Xl */ + vsubps {rn-sae}, %zmm5, %zmm12, %zmm5 + +/* Sl_high */ + vsubps {rn-sae}, %zmm15, %zmm3, %zmm0 + vmulps {rn-sae}, %zmm6, %zmm12, %zmm3{%k1} + +/* -K*L2H + Th */ + vmovups 1216+__svml_sasinh_data_internal_avx512(%rip), %zmm15 + +/* Sl_l */ + vsubps {rn-sae}, %zmm0, %zmm4, %zmm1 + vrcp14ps %zmm3, %zmm6 + +/* Table lookups */ + vmovups __svml_sasinh_data_internal_avx512(%rip), %zmm0 + +/* Xin_low */ + vaddps {rn-sae}, %zmm5, %zmm1, %zmm7 + +/* round reciprocal to 1+4b mantissas */ + vpaddd 768+__svml_sasinh_data_internal_avx512(%rip), %zmm6, %zmm4 + vmovups 1152+__svml_sasinh_data_internal_avx512(%rip), %zmm5 + vandps 832+__svml_sasinh_data_internal_avx512(%rip), %zmm4, %zmm8 + +/* fixup for very large inputs */ + vxorps %zmm7, %zmm7, %zmm7{%k1} + +/* polynomial */ + vmovups 1024+__svml_sasinh_data_internal_avx512(%rip), %zmm4 + +/* reduced argument for log(): (Rcp*Xin-1)+Rcp*Xin_low */ + vfmsub231ps {rn-sae}, %zmm8, %zmm3, %zmm2 + vmovups 960+__svml_sasinh_data_internal_avx512(%rip), %zmm3 + +/* exponents */ + vgetexpps {sae}, %zmm8, %zmm1 + +/* Prepare table index */ + vpsrld $18, %zmm8, %zmm14 + vfmadd231ps {rn-sae}, %zmm8, %zmm7, %zmm2 + vmovups 1088+__svml_sasinh_data_internal_avx512(%rip), %zmm7 + vsubps {rn-sae}, %zmm3, %zmm1, %zmm1{%k1} + vpermt2ps 64+__svml_sasinh_data_internal_avx512(%rip), %zmm14, %zmm0 + vmovups 128+__svml_sasinh_data_internal_avx512(%rip), %zmm3 + vfmadd231ps {rn-sae}, %zmm2, %zmm4, %zmm7 + vfnmadd231ps {rn-sae}, %zmm1, %zmm15, %zmm0 + +/* R^2 */ + vmulps {rn-sae}, %zmm2, %zmm2, %zmm6 + vfmadd213ps {rn-sae}, %zmm5, %zmm2, %zmm7 + vpermt2ps 192+__svml_sasinh_data_internal_avx512(%rip), %zmm14, %zmm3 + +/* -K*L2L + Tl */ + vmovups 1280+__svml_sasinh_data_internal_avx512(%rip), %zmm14 + vfnmadd213ps {rn-sae}, %zmm3, %zmm14, %zmm1 + +/* Tl + R^2*Poly */ + vfmadd213ps {rn-sae}, %zmm1, %zmm6, %zmm7 + +/* R+Tl + R^2*Poly */ + vaddps {rn-sae}, %zmm2, %zmm7, %zmm2 + vaddps {rn-sae}, %zmm2, %zmm0, %zmm9{%k2} + vxorps %zmm13, %zmm9, %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 %zmm10, 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_sasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVeN16v_asinhf_skx) + + .align 16,0x90 + +__svml_sasinh_cout_rare_internal: + + cfi_startproc + + movl (%rdi), %eax + movl %eax, -8(%rsp) + andl $2139095040, %eax + cmpl $2139095040, %eax + jne .LBL_2_4 + testl $8388607, -8(%rsp) + je .LBL_2_4 + movss -8(%rsp), %xmm0 + xorl %eax, %eax + mulss -8(%rsp), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_4: + movl -8(%rsp), %eax + movl %eax, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_sasinh_cout_rare_internal,@function + .size __svml_sasinh_cout_rare_internal,.-__svml_sasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_sasinh_data_internal_avx512: + .long 0 + .long 3170631680 + .long 3178790912 + .long 3182919680 + .long 3186704384 + .long 3189022720 + .long 3190816768 + .long 3192561664 + .long 3194257408 + .long 3195912192 + .long 3196796928 + .long 3197583360 + .long 3198357504 + .long 3199111168 + .long 3199848448 + .long 3200569344 + .long 3201277952 + .long 3201966080 + .long 3202646016 + .long 3203309568 + .long 3203960832 + .long 3204524032 + .long 3204837376 + .long 3205146624 + .long 3205447680 + .long 3205744640 + .long 3206037504 + .long 3206324224 + .long 3206606848 + .long 3206883328 + .long 3207155712 + .long 3207424000 + .long 2147483648 + .long 3072770974 + .long 943319038 + .long 3075640037 + .long 930648533 + .long 3089726480 + .long 936349528 + .long 944943494 + .long 897812054 + .long 3087808175 + .long 941839444 + .long 3093478113 + .long 937982919 + .long 931430736 + .long 924853521 + .long 3075349253 + .long 945558336 + .long 3094838221 + .long 906200662 + .long 3084126596 + .long 3088015279 + .long 3089451852 + .long 3093678154 + .long 938521645 + .long 3091119329 + .long 3090949395 + .long 933442244 + .long 930702671 + .long 945827699 + .long 913590776 + .long 3082066287 + .long 3087046763 + .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 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1015021568 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 1593835520 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 2139095039 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 3190466014 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .long 1052770304 + .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 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 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1040187392 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .long 1082130432 + .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 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_sasinh_data_internal_avx512,@object + .size __svml_sasinh_data_internal_avx512,1344 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core-sse2.S new file mode 100644 index 0000000000..52e4d2f728 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized asinhf, 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_asinhf _ZGVbN4v_asinhf_sse2 +#include "../svml_s_asinhf4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core.c new file mode 100644 index 0000000000..296d5754ae --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized asinhf, 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_asinhf +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN4v_asinhf, __GI__ZGVbN4v_asinhf, + __redirect__ZGVbN4v_asinhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core_sse4.S new file mode 100644 index 0000000000..eb537560b8 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf4_core_sse4.S @@ -0,0 +1,2569 @@ +/* Function asinhf 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 asinh(x) as log(x + sqrt(x*x + 1)) + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVbN4v_asinhf_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 %xmm12, 160(%rsp) + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + movaps %xmm0, %xmm12 + +/* + * Split X into high and low parts, XHi (<= 11 bits) and XLo (<= 13 bits) + * We could use either X or |X| here, but it doesn't seem to matter + */ + movups 2880+__svml_sasinh_data_internal(%rip), %xmm4 + andps %xmm12, %xmm4 + +/* + * Compute X^2 = (XHi + XLo)^2 = XHi^2 + XLo * (X + XHi) + * The two parts are shifted off by around 11 bits. So even though + * the low bit will not in general be exact, it's near enough + */ + movaps %xmm4, %xmm2 + subps %xmm4, %xmm0 + mulps %xmm4, %xmm2 + addps %xmm12, %xmm4 + +/* Load the constant 1 and a sign mask */ + movups 1920+__svml_sasinh_data_internal(%rip), %xmm6 + +/* + * Finally, express Y + W = X^2 + 1 accurately where Y has <= 8 bits. + * If |X| <= 1 then |XHi| <= 1 and so |X2Hi| <= 1, so we can treat 1 + * as the dominant component in the compensated summation. Otherwise, + * if |X| >= 1, then since X2Hi only has 22 significant bits, the basic + * addition will be exact anyway until we get to |X| >= 2^24. But by + * that time the log function is well-conditioned enough that the + * rounding error doesn't matter. Hence we can treat 1 as dominant even + * if it literally isn't. + */ + movaps %xmm6, %xmm3 + mulps %xmm4, %xmm0 + addps %xmm2, %xmm3 + movaps %xmm6, %xmm4 + movups %xmm14, 112(%rsp) + subps %xmm3, %xmm4 + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movups 3008+__svml_sasinh_data_internal(%rip), %xmm14 + addps %xmm2, %xmm4 + +/* + * Unfortunately, we can still be in trouble if |X| <= 2^-5, since + * the absolute error 2^-(7+24)-ish in sqrt(1 + X^2) gets scaled up + * by 1/X and comes close to our threshold. Hence if |X| <= 2^-4, + * perform an alternative computation + * sqrt(1 + X^2) - 1 = X^2/2 - X^4/8 + X^6/16 + * X2 = X^2 + */ + addps %xmm0, %xmm2 + addps %xmm0, %xmm4 + movaps %xmm14, %xmm1 + andps %xmm3, %xmm1 + movups %xmm13, 144(%rsp) + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + +/* + * Compute e = -(2 * d + d^2) + * The first FMR is exact, and the rounding error in the other is acceptable + * since d and e are ~ 2^-8 + */ + movaps %xmm6, %xmm13 + +/* + * Get the absolute value of the input, since we will exploit antisymmetry + * and mostly assume X >= 0 in the core computation + */ + movups 1088+__svml_sasinh_data_internal(%rip), %xmm5 + subps %xmm1, %xmm3 + andps %xmm12, %xmm5 + addps %xmm3, %xmm4 + +/* + * Compute R = 1/sqrt(Y + W) * (1 + d) + * Force R to <= 8 significant bits. + * This means that R * Y and R^2 * Y are exactly representable. + */ + rsqrtps %xmm1, %xmm3 + andps %xmm14, %xmm3 + +/* + * Check whether the input is finite, by checking |X| <= MaxFloat + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN <= MaxFloat) + */ + movaps %xmm5, %xmm7 + +/* + * Compute S = (Y/sqrt(Y + W)) * (1 + d) + * and T = (W/sqrt(Y + W)) * (1 + d) + * so that S + T = sqrt(Y + W) * (1 + d) + * S is exact, and the rounding error in T is OK. + */ + mulps %xmm3, %xmm1 + movaps %xmm3, %xmm14 + cmpnleps 2624+__svml_sasinh_data_internal(%rip), %xmm7 + mulps %xmm3, %xmm4 + mulps %xmm1, %xmm14 + movmskps %xmm7, %edx + mulps %xmm4, %xmm3 + subps %xmm14, %xmm13 + movups 2560+__svml_sasinh_data_internal(%rip), %xmm14 + +/* + * The following computation can go wrong for very large X, basically + * because X^2 overflows. But for large X we have + * asinh(X) / log(2 X) - 1 =~= 1/(4 * X^2), so for X >= 2^30 + * we can just later stick X back into the log and tweak up the exponent. + * Actually we scale X by 2^-30 and tweak the exponent up by 31, + * to stay in the safe range for the later log computation. + * Compute a flag now telling us when do do this. + */ + movaps %xmm5, %xmm7 + +/* sX2over2 = X^2/2 */ + mulps %xmm14, %xmm2 + subps %xmm3, %xmm13 + cmpltps 2368+__svml_sasinh_data_internal(%rip), %xmm7 + +/* + * Now 1 / (1 + d) + * = 1 / (1 + (sqrt(1 - e) - 1)) + * = 1 / sqrt(1 - e) + * = 1 + 1/2 * e + 3/8 * e^2 + 5/16 * e^3 + 35/128 * e^4 + ... + * So compute the first three nonconstant terms of that, so that + * we have a relative correction (1 + Corr) to apply to S etc. + * C1 = 1/2 + * C2 = 3/8 + * C3 = 5/16 + */ + movups 2496+__svml_sasinh_data_internal(%rip), %xmm3 + +/* sX46over2 = -X^4/8 + x^6/16 */ + movaps %xmm14, %xmm0 + mulps %xmm13, %xmm3 + addps 2432+__svml_sasinh_data_internal(%rip), %xmm3 + mulps %xmm13, %xmm3 + addps %xmm14, %xmm3 + mulps %xmm3, %xmm13 + +/* + * Obtain sqrt(1 + X^2) - 1 in two pieces + * sqrt(1 + X^2) - 1 + * = sqrt(Y + W) - 1 + * = (S + T) * (1 + Corr) - 1 + * = [S - 1] + [T + (S + T) * Corr] + * We need a compensated summation for the last part. We treat S - 1 + * as the larger part; it certainly is until about X < 2^-4, and in that + * case, the error is affordable since X dominates over sqrt(1 + X^2) - 1 + * Final sum is dTmp5 (hi) + dTmp7 (lo) + */ + movaps %xmm1, %xmm3 + addps %xmm4, %xmm3 + subps %xmm6, %xmm1 + mulps %xmm3, %xmm13 + addps %xmm13, %xmm4 + +/* sX46 = -X^4/4 + X^6/8 */ + movaps %xmm2, %xmm13 + movaps %xmm4, %xmm3 + addps %xmm1, %xmm3 + subps %xmm3, %xmm1 + addps %xmm1, %xmm4 + +/* sX4over4 = X^4/4 */ + movaps %xmm2, %xmm1 + mulps %xmm2, %xmm1 + mulps %xmm1, %xmm13 + subps %xmm1, %xmm13 + movaps %xmm2, %xmm1 + mulps %xmm13, %xmm0 + addps %xmm0, %xmm1 + subps %xmm1, %xmm2 + addps %xmm2, %xmm0 + +/* Now multiplex the two possible computations */ + movaps %xmm5, %xmm2 + cmpleps 2688+__svml_sasinh_data_internal(%rip), %xmm2 + movaps %xmm2, %xmm13 + andps %xmm2, %xmm1 + andnps %xmm3, %xmm13 + movaps %xmm2, %xmm14 + orps %xmm1, %xmm13 + +/* + * Now do another compensated sum to add |X| + [sqrt(1 + X^2) - 1]. + * It's always safe to assume |X| is larger. + * This is the final 2-part argument to the log1p function + */ + movaps %xmm5, %xmm1 + andnps %xmm4, %xmm14 + andps %xmm2, %xmm0 + orps %xmm0, %xmm14 + movaps %xmm5, %xmm0 + movaps %xmm6, %xmm3 + addps %xmm13, %xmm1 + +/* Now multiplex to the case X = 2^-30 * input, Xl = sL = 0 in the "big" case. */ + mulps 3072+__svml_sasinh_data_internal(%rip), %xmm5 + minps %xmm1, %xmm3 + subps %xmm1, %xmm0 + movdqu 2304+__svml_sasinh_data_internal(%rip), %xmm2 + addps %xmm0, %xmm13 + movaps %xmm7, %xmm0 + addps %xmm13, %xmm14 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * also adding L into Xl. + * compute 1+x as high, low parts + */ + movaps %xmm6, %xmm13 + andnps %xmm5, %xmm0 + maxps %xmm1, %xmm13 + movaps %xmm13, %xmm4 + movaps %xmm6, %xmm1 + +/* + * Now resume the main code. + * reduction: compute r,n + */ + movdqu 2240+__svml_sasinh_data_internal(%rip), %xmm5 + addps %xmm3, %xmm4 + subps %xmm4, %xmm13 + andps %xmm7, %xmm4 + orps %xmm4, %xmm0 + addps %xmm13, %xmm3 + psubd %xmm5, %xmm0 + addps %xmm3, %xmm14 + pand %xmm0, %xmm2 + psrad $23, %xmm0 + cvtdq2ps %xmm0, %xmm13 + pslld $23, %xmm0 + andps %xmm7, %xmm14 + paddd %xmm5, %xmm2 + psubd %xmm0, %xmm1 + mulps %xmm1, %xmm14 + +/* polynomial evaluation */ + subps %xmm6, %xmm2 + movups 2096+__svml_sasinh_data_internal(%rip), %xmm6 + movaps %xmm7, %xmm1 + +/* Add 31 to the exponent in the "large" case to get log(2 * input) */ + movups 2816+__svml_sasinh_data_internal(%rip), %xmm0 + addps %xmm2, %xmm14 + addps %xmm13, %xmm0 + mulps %xmm14, %xmm6 + andnps %xmm0, %xmm1 + andps %xmm7, %xmm13 + orps %xmm13, %xmm1 + addps 2080+__svml_sasinh_data_internal(%rip), %xmm6 + +/* final reconstruction */ + mulps 3136+__svml_sasinh_data_internal(%rip), %xmm1 + mulps %xmm14, %xmm6 + +/* Finally, reincorporate the original sign. */ + movups 2752+__svml_sasinh_data_internal(%rip), %xmm0 + andps %xmm12, %xmm0 + addps 2064+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + addps 2048+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + addps 2032+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + addps 2016+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + addps 2000+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + addps 1984+__svml_sasinh_data_internal(%rip), %xmm6 + mulps %xmm14, %xmm6 + mulps %xmm14, %xmm6 + addps %xmm6, %xmm14 + addps %xmm1, %xmm14 + pxor %xmm14, %xmm0 + testl %edx, %edx + jne .LBL_1_3 + +.LBL_1_2: + movups 160(%rsp), %xmm12 + cfi_restore(29) + movups 144(%rsp), %xmm13 + cfi_restore(30) + 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, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1e, 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 %xmm12, 128(%rsp) + movups %xmm0, 192(%rsp) + xorl %eax, %eax + movups %xmm8, 64(%rsp) + movups %xmm9, 48(%rsp) + movups %xmm10, 32(%rsp) + movups %xmm11, 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, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 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), %xmm9 + cfi_restore(26) + movups 32(%rsp), %xmm10 + cfi_restore(27) + movups 16(%rsp), %xmm11 + cfi_restore(28) + 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, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 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_sasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVbN4v_asinhf_sse4) + + .align 16,0x90 + +__svml_sasinh_cout_rare_internal: + + cfi_startproc + + movl (%rdi), %eax + movl %eax, -8(%rsp) + andl $2139095040, %eax + cmpl $2139095040, %eax + jne .LBL_2_4 + testl $8388607, -8(%rsp) + je .LBL_2_4 + movss -8(%rsp), %xmm0 + xorl %eax, %eax + mulss -8(%rsp), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_4: + movl -8(%rsp), %eax + movl %eax, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_sasinh_cout_rare_internal,@function + .size __svml_sasinh_cout_rare_internal,.-__svml_sasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_sasinh_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 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_sasinh_data_internal,@object + .size __svml_sasinh_data_internal,3392 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core-sse.S new file mode 100644 index 0000000000..1a0e113e94 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized asinhf, 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_asinhf _ZGVdN8v_asinhf_sse_wrapper +#include "../svml_s_asinhf8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core.c new file mode 100644 index 0000000000..d97097a394 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized asinhf, 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_asinhf +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN8v_asinhf, __GI__ZGVdN8v_asinhf, + __redirect__ZGVdN8v_asinhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core_avx2.S new file mode 100644 index 0000000000..b0e13a9845 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_asinhf8_core_avx2.S @@ -0,0 +1,2156 @@ +/* Function asinhf 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 asinh(x) as log(x + sqrt(x*x + 1)) + * + * Special cases: + * + * asinh(NaN) = quiet NaN, and raise invalid exception + * asinh(INF) = that INF + * asinh(0) = that 0 + * + */ + +#include + + .text +ENTRY(_ZGVdN8v_asinhf_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 + vmovups %ymm9, 96(%rsp) + vmovups %ymm8, 32(%rsp) + .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 + +/* Load the constant 1 and a sign mask */ + vmovups 1920+__svml_sasinh_data_internal(%rip), %ymm8 + vmovups %ymm13, 256(%rsp) + .cfi_escape 0x10, 0xe0, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x80, 0xff, 0xff, 0xff, 0x22 + vmovups 3136+__svml_sasinh_data_internal(%rip), %ymm13 + vmovups %ymm14, 288(%rsp) + vmovups %ymm12, 224(%rsp) + vmovups %ymm11, 192(%rsp) + vmovups %ymm10, 160(%rsp) + vmovups %ymm15, 320(%rsp) + .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, 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 + vmovaps %ymm0, %ymm9 + +/* No need to split X when FMA is available in hardware. */ + vmulps %ymm9, %ymm9, %ymm5 + +/* + * Finally, express Y + W = X^2 + 1 accurately where Y has <= 8 bits. + * If |X| <= 1 then |XHi| <= 1 and so |X2Hi| <= 1, so we can treat 1 + * as the dominant component in the compensated summation. Otherwise, + * if |X| >= 1, then since X2Hi only has 22 significant bits, the basic + * addition will be exact anyway until we get to |X| >= 2^24. But by + * that time the log function is well-conditioned enough that the + * rounding error doesn't matter. Hence we can treat 1 as dominant even + * if it literally isn't. + */ + vaddps %ymm5, %ymm8, %ymm3 + vandps %ymm13, %ymm3, %ymm14 + vmovaps %ymm9, %ymm4 + vsubps %ymm3, %ymm8, %ymm1 + vsubps %ymm14, %ymm3, %ymm11 + +/* + * Compute R = 1/sqrt(Y + W) * (1 + d) + * Force R to <= 8 significant bits. + * This means that R * Y and R^2 * Y are exactly representable. + */ + vrsqrtps %ymm14, %ymm12 + vfmsub213ps %ymm5, %ymm9, %ymm4 + vmovups 2688+__svml_sasinh_data_internal(%rip), %ymm3 + vaddps %ymm1, %ymm5, %ymm2 + vaddps %ymm2, %ymm4, %ymm10 + +/* + * Unfortunately, we can still be in trouble if |X| <= 2^-5, since + * the absolute error 2^-(7+24)-ish in sqrt(1 + X^2) gets scaled up + * by 1/X and comes close to our threshold. Hence if |X| <= 2^-4, + * perform an alternative computation + * sqrt(1 + X^2) - 1 = X^2/2 - X^4/8 + X^6/16 + * X2 = X^2 + */ + vaddps %ymm4, %ymm5, %ymm4 + +/* + * Now 1 / (1 + d) + * = 1 / (1 + (sqrt(1 - e) - 1)) + * = 1 / sqrt(1 - e) + * = 1 + 1/2 * e + 3/8 * e^2 + 5/16 * e^3 + 35/128 * e^4 + ... + * So compute the first three nonconstant terms of that, so that + * we have a relative correction (1 + Corr) to apply to S etc. + * C1 = 1/2 + * C2 = 3/8 + * C3 = 5/16 + */ + vmovups 2624+__svml_sasinh_data_internal(%rip), %ymm2 + vaddps %ymm11, %ymm10, %ymm15 + vandps %ymm13, %ymm12, %ymm0 + +/* + * Compute S = (Y/sqrt(Y + W)) * (1 + d) + * and T = (W/sqrt(Y + W)) * (1 + d) + * so that S + T = sqrt(Y + W) * (1 + d) + * S is exact, and the rounding error in T is OK. + */ + vmulps %ymm0, %ymm14, %ymm11 + vmulps %ymm15, %ymm0, %ymm10 + vsubps %ymm8, %ymm11, %ymm12 + +/* + * Obtain sqrt(1 + X^2) - 1 in two pieces + * sqrt(1 + X^2) - 1 + * = sqrt(Y + W) - 1 + * = (S + T) * (1 + Corr) - 1 + * = [S - 1] + [T + (S + T) * Corr] + * We need a compensated summation for the last part. We treat S - 1 + * as the larger part; it certainly is until about X < 2^-4, and in that + * case, the error is affordable since X dominates over sqrt(1 + X^2) - 1 + * Final sum is dTmp5 (hi) + dTmp7 (lo) + */ + vaddps %ymm10, %ymm11, %ymm15 + +/* + * Compute e = -(2 * d + d^2) + * The first FMR is exact, and the rounding error in the other is acceptable + * since d and e are ~ 2^-8 + */ + vmovaps %ymm8, %ymm1 + vfnmadd231ps %ymm11, %ymm0, %ymm1 + vfnmadd231ps %ymm10, %ymm0, %ymm1 + +/* sX2over2 = X^2/2 */ + vmulps %ymm4, %ymm3, %ymm0 + vfmadd213ps 2560+__svml_sasinh_data_internal(%rip), %ymm1, %ymm2 + +/* sX4over4 = X^4/4 */ + vmulps %ymm0, %ymm0, %ymm5 + vfmadd213ps %ymm3, %ymm1, %ymm2 + +/* sX46 = -X^4/4 + X^6/8 */ + vfmsub231ps %ymm0, %ymm5, %ymm5 + vmulps %ymm2, %ymm1, %ymm13 + +/* sX46over2 = -X^4/8 + x^6/16 */ + vmulps %ymm5, %ymm3, %ymm3 + vfmadd213ps %ymm10, %ymm15, %ymm13 + vaddps %ymm3, %ymm0, %ymm5 + vaddps %ymm12, %ymm13, %ymm2 + vsubps %ymm5, %ymm0, %ymm4 + vsubps %ymm2, %ymm12, %ymm14 + vaddps %ymm4, %ymm3, %ymm10 + vaddps %ymm14, %ymm13, %ymm1 + +/* + * Get the absolute value of the input, since we will exploit antisymmetry + * and mostly assume X >= 0 in the core computation + */ + vandps 1088+__svml_sasinh_data_internal(%rip), %ymm9, %ymm6 + +/* Now multiplex the two possible computations */ + vcmple_oqps 2816+__svml_sasinh_data_internal(%rip), %ymm6, %ymm11 + +/* + * Check whether the input is finite, by checking |X| <= MaxFloat + * Otherwise set the rangemask so that the callout will get used. + * Note that this will also use the callout for NaNs since not(NaN <= MaxFloat) + */ + vcmpnle_uqps 2752+__svml_sasinh_data_internal(%rip), %ymm6, %ymm7 + vblendvps %ymm11, %ymm5, %ymm2, %ymm2 + vblendvps %ymm11, %ymm10, %ymm1, %ymm12 + +/* + * Now do another compensated sum to add |X| + [sqrt(1 + X^2) - 1]. + * It's always safe to assume |X| is larger. + * This is the final 2-part argument to the log1p function + */ + vaddps %ymm2, %ymm6, %ymm14 + +/* + * Now resume the main code. + * reduction: compute r,n + */ + vmovups 2368+__svml_sasinh_data_internal(%rip), %ymm5 + +/* + * Now we feed into the log1p code, using H in place of _VARG1 and + * also adding L into Xl. + * compute 1+x as high, low parts + */ + vmaxps %ymm14, %ymm8, %ymm15 + vminps %ymm14, %ymm8, %ymm0 + vsubps %ymm14, %ymm6, %ymm1 + vaddps %ymm0, %ymm15, %ymm3 + vaddps %ymm1, %ymm2, %ymm13 + vsubps %ymm3, %ymm15, %ymm15 + vaddps %ymm13, %ymm12, %ymm1 + vaddps %ymm15, %ymm0, %ymm2 + vmovups 2208+__svml_sasinh_data_internal(%rip), %ymm15 + vaddps %ymm2, %ymm1, %ymm4 + vmovmskps %ymm7, %edx + +/* + * The following computation can go wrong for very large X, basically + * because X^2 overflows. But for large X we have + * asinh(X) / log(2 X) - 1 =~= 1/(4 * X^2), so for X >= 2^30 + * we can just later stick X back into the log and tweak up the exponent. + * Actually we scale X by 2^-30 and tweak the exponent up by 31, + * to stay in the safe range for the later log computation. + * Compute a flag now telling us when do do this. + */ + vcmplt_oqps 2496+__svml_sasinh_data_internal(%rip), %ymm6, %ymm7 + +/* Now multiplex to the case X = 2^-30 * input, Xl = sL = 0 in the "big" case. */ + vmulps 3200+__svml_sasinh_data_internal(%rip), %ymm6, %ymm6 + vblendvps %ymm7, %ymm3, %ymm6, %ymm0 + vpsubd %ymm5, %ymm0, %ymm1 + vpsrad $23, %ymm1, %ymm6 + vpand 2432+__svml_sasinh_data_internal(%rip), %ymm1, %ymm2 + vpslld $23, %ymm6, %ymm10 + vpaddd %ymm5, %ymm2, %ymm13 + vcvtdq2ps %ymm6, %ymm0 + vpsubd %ymm10, %ymm8, %ymm12 + +/* polynomial evaluation */ + vsubps %ymm8, %ymm13, %ymm8 + +/* Add 31 to the exponent in the "large" case to get log(2 * input) */ + vaddps 2944+__svml_sasinh_data_internal(%rip), %ymm0, %ymm2 + vandps %ymm7, %ymm4, %ymm11 + vmulps %ymm12, %ymm11, %ymm14 + vblendvps %ymm7, %ymm0, %ymm2, %ymm0 + vaddps %ymm8, %ymm14, %ymm1 + vfmadd213ps 2176+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 2144+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 2112+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 2080+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 2048+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 2016+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vfmadd213ps 1984+__svml_sasinh_data_internal(%rip), %ymm1, %ymm15 + vmulps %ymm15, %ymm1, %ymm3 + vfmadd213ps %ymm1, %ymm1, %ymm3 + +/* final reconstruction */ + vfmadd132ps 3264+__svml_sasinh_data_internal(%rip), %ymm3, %ymm0 + +/* Finally, reincorporate the original sign. */ + vandps 2880+__svml_sasinh_data_internal(%rip), %ymm9, %ymm7 + vxorps %ymm0, %ymm7, %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 %ymm9, 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_sasinh_cout_rare_internal + jmp .LBL_1_8 + +END(_ZGVdN8v_asinhf_avx2) + + .align 16,0x90 + +__svml_sasinh_cout_rare_internal: + + cfi_startproc + + movl (%rdi), %eax + movl %eax, -8(%rsp) + andl $2139095040, %eax + cmpl $2139095040, %eax + jne .LBL_2_4 + testl $8388607, -8(%rsp) + je .LBL_2_4 + movss -8(%rsp), %xmm0 + xorl %eax, %eax + mulss -8(%rsp), %xmm0 + movss %xmm0, (%rsi) + ret + +.LBL_2_4: + movl -8(%rsp), %eax + movl %eax, (%rsi) + xorl %eax, %eax + ret + + cfi_endproc + + .type __svml_sasinh_cout_rare_internal,@function + .size __svml_sasinh_cout_rare_internal,.-__svml_sasinh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_sasinh_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 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_sasinh_data_internal,@object + .size __svml_sasinh_data_internal,3520 diff --git a/sysdeps/x86_64/fpu/svml_d_asinh2_core.S b/sysdeps/x86_64/fpu/svml_d_asinh2_core.S new file mode 100644 index 0000000000..60e372238a --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_asinh2_core.S @@ -0,0 +1,29 @@ +/* Function asinh 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_asinh) +WRAPPER_IMPL_SSE2 asinh +END (_ZGVbN2v_asinh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN2v_asinh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_asinh4_core.S b/sysdeps/x86_64/fpu/svml_d_asinh4_core.S new file mode 100644 index 0000000000..c7350011e1 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_asinh4_core.S @@ -0,0 +1,29 @@ +/* Function asinh 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_asinh) +WRAPPER_IMPL_AVX _ZGVbN2v_asinh +END (_ZGVdN4v_asinh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN4v_asinh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_asinh4_core_avx.S b/sysdeps/x86_64/fpu/svml_d_asinh4_core_avx.S new file mode 100644 index 0000000000..83aaa8c3f1 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_asinh4_core_avx.S @@ -0,0 +1,25 @@ +/* Function asinh 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_asinh) +WRAPPER_IMPL_AVX _ZGVbN2v_asinh +END (_ZGVcN4v_asinh) diff --git a/sysdeps/x86_64/fpu/svml_d_asinh8_core.S b/sysdeps/x86_64/fpu/svml_d_asinh8_core.S new file mode 100644 index 0000000000..9597975ff6 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_asinh8_core.S @@ -0,0 +1,25 @@ +/* Function asinh 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_asinh) +WRAPPER_IMPL_AVX512 _ZGVdN4v_asinh +END (_ZGVeN8v_asinh) diff --git a/sysdeps/x86_64/fpu/svml_s_asinhf16_core.S b/sysdeps/x86_64/fpu/svml_s_asinhf16_core.S new file mode 100644 index 0000000000..5b3d405f2e --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_asinhf16_core.S @@ -0,0 +1,25 @@ +/* Function asinhf 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_asinhf) +WRAPPER_IMPL_AVX512 _ZGVdN8v_asinhf +END (_ZGVeN16v_asinhf) diff --git a/sysdeps/x86_64/fpu/svml_s_asinhf4_core.S b/sysdeps/x86_64/fpu/svml_s_asinhf4_core.S new file mode 100644 index 0000000000..af44fa5108 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_asinhf4_core.S @@ -0,0 +1,29 @@ +/* Function asinhf 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_asinhf) +WRAPPER_IMPL_SSE2 asinhf +END (_ZGVbN4v_asinhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN4v_asinhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_asinhf8_core.S b/sysdeps/x86_64/fpu/svml_s_asinhf8_core.S new file mode 100644 index 0000000000..3bd06d8032 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_asinhf8_core.S @@ -0,0 +1,29 @@ +/* Function asinhf 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_asinhf) +WRAPPER_IMPL_AVX _ZGVbN4v_asinhf +END (_ZGVdN8v_asinhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN8v_asinhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_asinhf8_core_avx.S b/sysdeps/x86_64/fpu/svml_s_asinhf8_core_avx.S new file mode 100644 index 0000000000..f79616c0bd --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_asinhf8_core_avx.S @@ -0,0 +1,25 @@ +/* Function asinhf 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_asinhf) +WRAPPER_IMPL_AVX _ZGVbN4v_asinhf +END (_ZGVcN8v_asinhf) diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx.c b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx.c new file mode 100644 index 0000000000..da03528700 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx.c @@ -0,0 +1 @@ +#include "test-double-libmvec-asinh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx2.c b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx2.c new file mode 100644 index 0000000000..da03528700 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx2.c @@ -0,0 +1 @@ +#include "test-double-libmvec-asinh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx512f.c b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx512f.c new file mode 100644 index 0000000000..da03528700 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-asinh-avx512f.c @@ -0,0 +1 @@ +#include "test-double-libmvec-asinh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-asinh.c b/sysdeps/x86_64/fpu/test-double-libmvec-asinh.c new file mode 100644 index 0000000000..71e6b9f578 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-asinh.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE double +#define LIBMVEC_FUNC asinh +#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 c1b251c84e..50b4d7c02f 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (pow), _ZGVbN2vv_pow) VECTOR_WRAPPER (WRAPPER_NAME (acos), _ZGVbN2v_acos) VECTOR_WRAPPER (WRAPPER_NAME (acosh), _ZGVbN2v_acosh) VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVbN2v_asin) +VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVbN2v_asinh) #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 4083423061..255df14db5 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (pow), _ZGVdN4vv_pow) VECTOR_WRAPPER (WRAPPER_NAME (acos), _ZGVdN4v_acos) VECTOR_WRAPPER (WRAPPER_NAME (acosh), _ZGVdN4v_acosh) VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVdN4v_asin) +VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVdN4v_asinh) #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 e3c6fea5b8..355560d081 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (pow), _ZGVcN4vv_pow) VECTOR_WRAPPER (WRAPPER_NAME (acos), _ZGVcN4v_acos) VECTOR_WRAPPER (WRAPPER_NAME (acosh), _ZGVcN4v_acosh) VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVcN4v_asin) +VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVcN4v_asinh) #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 f6b6934b92..b7ecf9c8f3 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (pow), _ZGVeN8vv_pow) VECTOR_WRAPPER (WRAPPER_NAME (acos), _ZGVeN8v_acos) VECTOR_WRAPPER (WRAPPER_NAME (acosh), _ZGVeN8v_acosh) VECTOR_WRAPPER (WRAPPER_NAME (asin), _ZGVeN8v_asin) +VECTOR_WRAPPER (WRAPPER_NAME (asinh), _ZGVeN8v_asinh) #ifndef __ILP32__ # define VEC_INT_TYPE __m512i diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx.c b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx.c new file mode 100644 index 0000000000..77e1838bb4 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx.c @@ -0,0 +1 @@ +#include "test-float-libmvec-asinhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx2.c b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx2.c new file mode 100644 index 0000000000..77e1838bb4 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx2.c @@ -0,0 +1 @@ +#include "test-float-libmvec-asinhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx512f.c b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx512f.c new file mode 100644 index 0000000000..77e1838bb4 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf-avx512f.c @@ -0,0 +1 @@ +#include "test-float-libmvec-asinhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-asinhf.c b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf.c new file mode 100644 index 0000000000..3353754102 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-asinhf.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE float +#define LIBMVEC_FUNC asinhf +#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 63221da5ac..b1e47a4434 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (powf), _ZGVeN16vv_powf) VECTOR_WRAPPER (WRAPPER_NAME (acosf), _ZGVeN16v_acosf) VECTOR_WRAPPER (WRAPPER_NAME (acoshf), _ZGVeN16v_acoshf) VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVeN16v_asinf) +VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVeN16v_asinhf) #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 d82b2e1556..b2607f8467 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (powf), _ZGVbN4vv_powf) VECTOR_WRAPPER (WRAPPER_NAME (acosf), _ZGVbN4v_acosf) VECTOR_WRAPPER (WRAPPER_NAME (acoshf), _ZGVbN4v_acoshf) VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVbN4v_asinf) +VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVbN4v_asinhf) #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 fb35f7aa65..35e36c4510 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c @@ -33,6 +33,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (powf), _ZGVdN8vv_powf) VECTOR_WRAPPER (WRAPPER_NAME (acosf), _ZGVdN8v_acosf) VECTOR_WRAPPER (WRAPPER_NAME (acoshf), _ZGVdN8v_acoshf) VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVdN8v_asinf) +VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVdN8v_asinhf) /* 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 171d92d0b1..b01e99f690 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c @@ -30,6 +30,7 @@ VECTOR_WRAPPER_ff (WRAPPER_NAME (powf), _ZGVcN8vv_powf) VECTOR_WRAPPER (WRAPPER_NAME (acosf), _ZGVcN8v_acosf) VECTOR_WRAPPER (WRAPPER_NAME (acoshf), _ZGVcN8v_acoshf) VECTOR_WRAPPER (WRAPPER_NAME (asinf), _ZGVcN8v_asinf) +VECTOR_WRAPPER (WRAPPER_NAME (asinhf), _ZGVcN8v_asinhf) #define VEC_INT_TYPE __m128i