From patchwork Thu Dec 9 05:05:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Pandey X-Patchwork-Id: 1565618 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=OTacaH+Q; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4J8jGN6WRcz9sCD for ; Thu, 9 Dec 2021 16:27:24 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D14153858411 for ; Thu, 9 Dec 2021 05:27:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D14153858411 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1639027642; bh=1lAPXO+17f+nxrxtB7QRi+Hl94h+1Bqs2Gbko7Q8dww=; 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=OTacaH+QlVAMzOfpsyfVCrPBahDcxxe75MXqj1CXL5Ahbk2mnM7ZSev9W6aS5yikb kZJkTgH2yeH/6KNSYTlBTG8PaPuQTLmaU77gevdmKDDO+ZDnENHsbwVpojfspsXcle sFT7kdJAZ7zCEFBAxGDnUKmKtV8bRGICMMI0VY5w= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 738613858436 for ; Thu, 9 Dec 2021 05:05:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 738613858436 X-IronPort-AV: E=McAfee;i="6200,9189,10192"; a="324278071" X-IronPort-AV: E=Sophos;i="5.88,191,1635231600"; d="scan'208";a="324278071" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Dec 2021 21:05:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,191,1635231600"; d="scan'208";a="543466331" Received: from scymds01.sc.intel.com ([10.148.94.138]) by orsmga001.jf.intel.com with ESMTP; 08 Dec 2021 21:05:18 -0800 Received: from gskx-1.sc.intel.com (gskx-1.sc.intel.com [172.25.149.211]) by scymds01.sc.intel.com with ESMTP id 1B9558YD031636; Wed, 8 Dec 2021 21:05:17 -0800 To: libc-alpha@sourceware.org Subject: [PATCH v2 41/42] x86-64: Add vector tanh/tanhf implementation to libmvec Date: Wed, 8 Dec 2021 21:05:07 -0800 Message-Id: <20211209050508.2614536-42-skpgkp2@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211209050508.2614536-1-skpgkp2@gmail.com> References: <20211209050508.2614536-1-skpgkp2@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-6.0 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+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" Implement vectorized tanh/tanhf containing SSE, AVX, AVX2 and AVX512 versions for libmvec as per vector ABI. It also contains accuracy and ABI tests for vector tanh/tanhf with regenerated ulps. --- 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 + .../x86/fpu/finclude/math-vector-fortran.h | 4 + sysdeps/x86_64/fpu/Makeconfig | 1 + sysdeps/x86_64/fpu/Versions | 2 + sysdeps/x86_64/fpu/libm-test-ulps | 15 + .../fpu/multiarch/svml_d_tanh2_core-sse2.S | 20 + .../x86_64/fpu/multiarch/svml_d_tanh2_core.c | 27 + .../fpu/multiarch/svml_d_tanh2_core_sse4.S | 3449 +++++++++++++++++ .../fpu/multiarch/svml_d_tanh4_core-sse.S | 20 + .../x86_64/fpu/multiarch/svml_d_tanh4_core.c | 27 + .../fpu/multiarch/svml_d_tanh4_core_avx2.S | 3308 ++++++++++++++++ .../fpu/multiarch/svml_d_tanh8_core-avx2.S | 20 + .../x86_64/fpu/multiarch/svml_d_tanh8_core.c | 27 + .../fpu/multiarch/svml_d_tanh8_core_avx512.S | 3017 ++++++++++++++ .../fpu/multiarch/svml_s_tanhf16_core-avx2.S | 20 + .../fpu/multiarch/svml_s_tanhf16_core.c | 28 + .../multiarch/svml_s_tanhf16_core_avx512.S | 1765 +++++++++ .../fpu/multiarch/svml_s_tanhf4_core-sse2.S | 20 + .../x86_64/fpu/multiarch/svml_s_tanhf4_core.c | 28 + .../fpu/multiarch/svml_s_tanhf4_core_sse4.S | 2144 ++++++++++ .../fpu/multiarch/svml_s_tanhf8_core-sse.S | 20 + .../x86_64/fpu/multiarch/svml_s_tanhf8_core.c | 28 + .../fpu/multiarch/svml_s_tanhf8_core_avx2.S | 2036 ++++++++++ sysdeps/x86_64/fpu/svml_d_tanh2_core.S | 29 + sysdeps/x86_64/fpu/svml_d_tanh4_core.S | 29 + sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S | 25 + sysdeps/x86_64/fpu/svml_d_tanh8_core.S | 25 + sysdeps/x86_64/fpu/svml_s_tanhf16_core.S | 25 + sysdeps/x86_64/fpu/svml_s_tanhf4_core.S | 29 + sysdeps/x86_64/fpu/svml_s_tanhf8_core.S | 29 + sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S | 25 + .../x86_64/fpu/test-double-libmvec-tanh-avx.c | 1 + .../fpu/test-double-libmvec-tanh-avx2.c | 1 + .../fpu/test-double-libmvec-tanh-avx512f.c | 1 + sysdeps/x86_64/fpu/test-double-libmvec-tanh.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 + .../x86_64/fpu/test-float-libmvec-tanhf-avx.c | 1 + .../fpu/test-float-libmvec-tanhf-avx2.c | 1 + .../fpu/test-float-libmvec-tanhf-avx512f.c | 1 + sysdeps/x86_64/fpu/test-float-libmvec-tanhf.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 + 50 files changed, 16286 insertions(+), 1 deletion(-) create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core-avx2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core_avx512.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c create mode 100644 sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh2_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S create mode 100644 sysdeps/x86_64/fpu/svml_d_tanh8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf16_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf4_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf8_core.S create mode 100644 sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-double-libmvec-tanh.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx512f.c create mode 100644 sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c diff --git a/bits/libm-simd-decl-stubs.h b/bits/libm-simd-decl-stubs.h index 3968f2935b..c4f9746ec9 100644 --- a/bits/libm-simd-decl-stubs.h +++ b/bits/libm-simd-decl-stubs.h @@ -318,4 +318,15 @@ #define __DECL_SIMD_tanf32x #define __DECL_SIMD_tanf64x #define __DECL_SIMD_tanf128x + +#define __DECL_SIMD_tanh +#define __DECL_SIMD_tanhf +#define __DECL_SIMD_tanhl +#define __DECL_SIMD_tanhf16 +#define __DECL_SIMD_tanhf32 +#define __DECL_SIMD_tanhf64 +#define __DECL_SIMD_tanhf128 +#define __DECL_SIMD_tanhf32x +#define __DECL_SIMD_tanhf64x +#define __DECL_SIMD_tanhf128x #endif diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index 48a525234e..999ae4d703 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -72,7 +72,7 @@ __MATHCALL_VEC (cosh,, (_Mdouble_ __x)); /* Hyperbolic sine of X. */ __MATHCALL_VEC (sinh,, (_Mdouble_ __x)); /* Hyperbolic tangent of X. */ -__MATHCALL (tanh,, (_Mdouble_ __x)); +__MATHCALL_VEC (tanh,, (_Mdouble_ __x)); #ifdef __USE_GNU /* Cosine and sine of X. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist index f8280539f6..055530f3ab 100644 --- a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist @@ -64,6 +64,7 @@ GLIBC_2.35 _ZGVbN2v_log1p F GLIBC_2.35 _ZGVbN2v_log2 F GLIBC_2.35 _ZGVbN2v_sinh F GLIBC_2.35 _ZGVbN2v_tan F +GLIBC_2.35 _ZGVbN2v_tanh F GLIBC_2.35 _ZGVbN2vv_atan2 F GLIBC_2.35 _ZGVbN2vv_hypot F GLIBC_2.35 _ZGVbN4v_acosf F @@ -84,6 +85,7 @@ GLIBC_2.35 _ZGVbN4v_log1pf F GLIBC_2.35 _ZGVbN4v_log2f F GLIBC_2.35 _ZGVbN4v_sinhf F GLIBC_2.35 _ZGVbN4v_tanf F +GLIBC_2.35 _ZGVbN4v_tanhf F GLIBC_2.35 _ZGVbN4vv_atan2f F GLIBC_2.35 _ZGVbN4vv_hypotf F GLIBC_2.35 _ZGVcN4v_acos F @@ -104,6 +106,7 @@ GLIBC_2.35 _ZGVcN4v_log1p F GLIBC_2.35 _ZGVcN4v_log2 F GLIBC_2.35 _ZGVcN4v_sinh F GLIBC_2.35 _ZGVcN4v_tan F +GLIBC_2.35 _ZGVcN4v_tanh F GLIBC_2.35 _ZGVcN4vv_atan2 F GLIBC_2.35 _ZGVcN4vv_hypot F GLIBC_2.35 _ZGVcN8v_acosf F @@ -124,6 +127,7 @@ GLIBC_2.35 _ZGVcN8v_log1pf F GLIBC_2.35 _ZGVcN8v_log2f F GLIBC_2.35 _ZGVcN8v_sinhf F GLIBC_2.35 _ZGVcN8v_tanf F +GLIBC_2.35 _ZGVcN8v_tanhf F GLIBC_2.35 _ZGVcN8vv_atan2f F GLIBC_2.35 _ZGVcN8vv_hypotf F GLIBC_2.35 _ZGVdN4v_acos F @@ -144,6 +148,7 @@ GLIBC_2.35 _ZGVdN4v_log1p F GLIBC_2.35 _ZGVdN4v_log2 F GLIBC_2.35 _ZGVdN4v_sinh F GLIBC_2.35 _ZGVdN4v_tan F +GLIBC_2.35 _ZGVdN4v_tanh F GLIBC_2.35 _ZGVdN4vv_atan2 F GLIBC_2.35 _ZGVdN4vv_hypot F GLIBC_2.35 _ZGVdN8v_acosf F @@ -164,6 +169,7 @@ GLIBC_2.35 _ZGVdN8v_log1pf F GLIBC_2.35 _ZGVdN8v_log2f F GLIBC_2.35 _ZGVdN8v_sinhf F GLIBC_2.35 _ZGVdN8v_tanf F +GLIBC_2.35 _ZGVdN8v_tanhf F GLIBC_2.35 _ZGVdN8vv_atan2f F GLIBC_2.35 _ZGVdN8vv_hypotf F GLIBC_2.35 _ZGVeN16v_acosf F @@ -184,6 +190,7 @@ GLIBC_2.35 _ZGVeN16v_log1pf F GLIBC_2.35 _ZGVeN16v_log2f F GLIBC_2.35 _ZGVeN16v_sinhf F GLIBC_2.35 _ZGVeN16v_tanf F +GLIBC_2.35 _ZGVeN16v_tanhf F GLIBC_2.35 _ZGVeN16vv_atan2f F GLIBC_2.35 _ZGVeN16vv_hypotf F GLIBC_2.35 _ZGVeN8v_acos F @@ -204,5 +211,6 @@ GLIBC_2.35 _ZGVeN8v_log1p F GLIBC_2.35 _ZGVeN8v_log2 F GLIBC_2.35 _ZGVeN8v_sinh F GLIBC_2.35 _ZGVeN8v_tan F +GLIBC_2.35 _ZGVeN8v_tanh F GLIBC_2.35 _ZGVeN8vv_atan2 F GLIBC_2.35 _ZGVeN8vv_hypot F diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h index 618a30cdc1..be3efa9faa 100644 --- a/sysdeps/x86/fpu/bits/math-vector.h +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -138,6 +138,10 @@ # define __DECL_SIMD_tan __DECL_SIMD_x86_64 # undef __DECL_SIMD_tanf # define __DECL_SIMD_tanf __DECL_SIMD_x86_64 +# undef __DECL_SIMD_tanh +# define __DECL_SIMD_tanh __DECL_SIMD_x86_64 +# undef __DECL_SIMD_tanhf +# define __DECL_SIMD_tanhf __DECL_SIMD_x86_64 # endif #endif diff --git a/sysdeps/x86/fpu/finclude/math-vector-fortran.h b/sysdeps/x86/fpu/finclude/math-vector-fortran.h index 5bcdde5bc4..0c6dadf4f5 100644 --- a/sysdeps/x86/fpu/finclude/math-vector-fortran.h +++ b/sysdeps/x86/fpu/finclude/math-vector-fortran.h @@ -68,6 +68,8 @@ !GCC$ builtin (sinhf) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (tan) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (tanf) attributes simd (notinbranch) if('x86_64') +!GCC$ builtin (tanh) attributes simd (notinbranch) if('x86_64') +!GCC$ builtin (tanhf) attributes simd (notinbranch) if('x86_64') !GCC$ builtin (cos) attributes simd (notinbranch) if('x32') !GCC$ builtin (cosf) attributes simd (notinbranch) if('x32') @@ -121,3 +123,5 @@ !GCC$ builtin (sinhf) attributes simd (notinbranch) if('x32') !GCC$ builtin (tan) attributes simd (notinbranch) if('x32') !GCC$ builtin (tanf) attributes simd (notinbranch) if('x32') +!GCC$ builtin (tanh) attributes simd (notinbranch) if('x32') +!GCC$ builtin (tanhf) attributes simd (notinbranch) if('x32') diff --git a/sysdeps/x86_64/fpu/Makeconfig b/sysdeps/x86_64/fpu/Makeconfig index 74f0df2982..ce71d43812 100644 --- a/sysdeps/x86_64/fpu/Makeconfig +++ b/sysdeps/x86_64/fpu/Makeconfig @@ -48,6 +48,7 @@ libmvec-funcs = \ sincos \ sinh \ tan \ + tanh \ # Define libmvec function for benchtests directory. libmvec-bench-funcs = \ diff --git a/sysdeps/x86_64/fpu/Versions b/sysdeps/x86_64/fpu/Versions index 6cb335cf94..5b5d13a1b6 100644 --- a/sysdeps/x86_64/fpu/Versions +++ b/sysdeps/x86_64/fpu/Versions @@ -32,6 +32,7 @@ libmvec { _ZGVbN2v_log2; _ZGVcN4v_log2; _ZGVdN4v_log2; _ZGVeN8v_log2; _ZGVbN2v_sinh; _ZGVcN4v_sinh; _ZGVdN4v_sinh; _ZGVeN8v_sinh; _ZGVbN2v_tan; _ZGVcN4v_tan; _ZGVdN4v_tan; _ZGVeN8v_tan; + _ZGVbN2v_tanh; _ZGVcN4v_tanh; _ZGVdN4v_tanh; _ZGVeN8v_tanh; _ZGVbN2vv_atan2; _ZGVcN4vv_atan2; _ZGVdN4vv_atan2; _ZGVeN8vv_atan2; _ZGVbN2vv_hypot; _ZGVcN4vv_hypot; _ZGVdN4vv_hypot; _ZGVeN8vv_hypot; _ZGVbN4v_acosf; _ZGVcN8v_acosf; _ZGVdN8v_acosf; _ZGVeN16v_acosf; @@ -52,6 +53,7 @@ libmvec { _ZGVbN4v_log2f; _ZGVcN8v_log2f; _ZGVdN8v_log2f; _ZGVeN16v_log2f; _ZGVbN4v_sinhf; _ZGVcN8v_sinhf; _ZGVdN8v_sinhf; _ZGVeN16v_sinhf; _ZGVbN4v_tanf; _ZGVcN8v_tanf; _ZGVdN8v_tanf; _ZGVeN16v_tanf; + _ZGVbN4v_tanhf; _ZGVcN8v_tanhf; _ZGVdN8v_tanhf; _ZGVeN16v_tanhf; _ZGVbN4vv_atan2f; _ZGVcN8vv_atan2f; _ZGVdN8vv_atan2f; _ZGVeN16vv_atan2f; _ZGVbN4vv_hypotf; _ZGVcN8vv_hypotf; _ZGVdN8vv_hypotf; _ZGVeN16vv_hypotf; } diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index 4a6b224b5d..659017e4c7 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -2124,6 +2124,21 @@ float: 3 float128: 3 ldouble: 4 +Function: "tanh_vlen16": +float: 1 + +Function: "tanh_vlen2": +double: 1 + +Function: "tanh_vlen4": +double: 1 + +Function: "tanh_vlen4_avx2": +double: 1 + +Function: "tanh_vlen8": +double: 1 + Function: "tgamma": double: 9 float: 8 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S new file mode 100644 index 0000000000..35b065fe55 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized tanh, vector length is 2. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define _ZGVbN2v_tanh _ZGVbN2v_tanh_sse2 +#include "../svml_d_tanh2_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c new file mode 100644 index 0000000000..d2e63bdc56 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized tanh, vector length is 2. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define SYMBOL_NAME _ZGVbN2v_tanh +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN2v_tanh, __GI__ZGVbN2v_tanh, __redirect__ZGVbN2v_tanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S new file mode 100644 index 0000000000..5b621d75b2 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh2_core_sse4.S @@ -0,0 +1,3449 @@ +/* Function tanh vectorized with SSE4. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + https://www.gnu.org/licenses/. */ + +/* + * ALGORITHM DESCRIPTION: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.sse4,"ax",@progbits +ENTRY(_ZGVbN2v_tanh_sse4) + 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 + movaps %xmm0, %xmm7 + movups %xmm14, 48(%rsp) + lea 2720+__svml_dtanh_data_internal(%rip), %r8 + movq 10496+__svml_dtanh_data_internal(%rip), %xmm5 + +/* if VMIN, VMAX is defined for I type */ + pxor %xmm1, %xmm1 + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + pshufd $221, %xmm7, %xmm14 + movq 10624+__svml_dtanh_data_internal(%rip), %xmm4 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + pand %xmm5, %xmm14 + movdqa %xmm14, %xmm3 + psubd %xmm4, %xmm14 + movups %xmm13, 80(%rsp) + movdqa %xmm14, %xmm2 + movups %xmm15, 32(%rsp) + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + movdqa %xmm14, %xmm15 + movq 10688+__svml_dtanh_data_internal(%rip), %xmm13 + pcmpgtd %xmm1, %xmm2 + pcmpgtd %xmm13, %xmm15 + pand %xmm2, %xmm14 + movups %xmm9, 160(%rsp) + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xff, 0xff, 0xff, 0x22 + movdqa %xmm15, %xmm9 + andnps %xmm14, %xmm9 + andps %xmm15, %xmm13 + orps %xmm13, %xmm9 + +/* + * VSHRIMM( I, iIndex, = iIndex, (17 - 4) ); + * VGATHER_MATRIX( L2D, p, TAB._dbP, iIndex, 0, T_ITEM_SIZE, T_ITEM_GRAN, 13, 0, 0 ); + */ + psrld $10, %xmm9 + movups %xmm10, 144(%rsp) + movd %xmm9, %eax + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xff, 0xff, 0xff, 0x22 + pshufd $1, %xmm9, %xmm10 + movups %xmm12, 96(%rsp) + movd %xmm10, %ecx + movups %xmm11, 112(%rsp) + movups 10432+__svml_dtanh_data_internal(%rip), %xmm0 + movslq %eax, %rax + andps %xmm7, %xmm0 + movslq %ecx, %rcx + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xb0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + movups 10368+__svml_dtanh_data_internal(%rip), %xmm12 + movups %xmm8, 176(%rsp) + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xff, 0xff, 0xff, 0x22 + andps %xmm7, %xmm12 + movups -96(%rax,%r8), %xmm11 + movups %xmm7, (%rsp) + movups -96(%rcx,%r8), %xmm8 + movups -80(%rax,%r8), %xmm9 + movaps %xmm9, %xmm10 + +/* Constant loading */ + movq 10560+__svml_dtanh_data_internal(%rip), %xmm6 + movups -80(%rcx,%r8), %xmm5 + pcmpgtd %xmm6, %xmm3 + movups -64(%rax,%r8), %xmm7 + unpckhpd %xmm8, %xmm11 + movaps %xmm7, %xmm8 + unpcklpd %xmm5, %xmm10 + unpckhpd %xmm5, %xmm9 + movups -48(%rax,%r8), %xmm5 + movups -64(%rcx,%r8), %xmm6 + movmskps %xmm3, %edx + movups -48(%rcx,%r8), %xmm3 + unpcklpd %xmm6, %xmm8 + unpckhpd %xmm6, %xmm7 + movaps %xmm5, %xmm6 + unpcklpd %xmm3, %xmm6 + unpckhpd %xmm3, %xmm5 + movups -32(%rax,%r8), %xmm3 + movups -16(%rax,%r8), %xmm2 + movaps %xmm3, %xmm4 + movups -32(%rcx,%r8), %xmm1 + movups -16(%rcx,%r8), %xmm14 + unpcklpd %xmm1, %xmm4 + unpckhpd %xmm1, %xmm3 + movaps %xmm2, %xmm1 + movups (%rax,%r8), %xmm13 + unpcklpd %xmm14, %xmm1 + unpckhpd %xmm14, %xmm2 + movaps %xmm13, %xmm14 + movups (%rcx,%r8), %xmm15 + unpcklpd %xmm15, %xmm14 + addpd %xmm14, %xmm0 + mulpd %xmm0, %xmm2 + addpd %xmm1, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm3, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm4, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm5, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm6, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm7, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm8, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm9, %xmm2 + mulpd %xmm0, %xmm2 + addpd %xmm10, %xmm2 + mulpd %xmm2, %xmm0 + addpd %xmm11, %xmm0 + orps %xmm12, %xmm0 + andl $3, %edx + jne L(2) + +L(1): + movups 176(%rsp), %xmm8 + cfi_restore(25) + movups 160(%rsp), %xmm9 + cfi_restore(26) + movups 144(%rsp), %xmm10 + cfi_restore(27) + movups 112(%rsp), %xmm11 + cfi_restore(28) + movups 96(%rsp), %xmm12 + cfi_restore(29) + movups 80(%rsp), %xmm13 + cfi_restore(30) + movups 48(%rsp), %xmm14 + cfi_restore(31) + movups 32(%rsp), %xmm15 + cfi_restore(32) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xb0, 0xff, 0xff, 0xff, 0x22 + .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 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + +L(2): + movups (%rsp), %xmm1 + movups %xmm1, 64(%rsp) + movups %xmm0, 128(%rsp) + je L(1) + xorl %eax, %eax + 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, 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 + movl %eax, %r12d + movq %r13, 16(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + movl %edx, %r13d + +L(3): + btl %r12d, %r13d + jc L(5) + +L(4): + incl %r12d + cmpl $2, %r12d + jl L(3) + 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) + movups 128(%rsp), %xmm0 + jmp L(1) + .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 + +L(5): + lea 64(%rsp,%r12,8), %rdi + lea 128(%rsp,%r12,8), %rsi + call __svml_dtanh_cout_rare_internal + jmp L(4) + +END(_ZGVbN2v_tanh_sse4) + + .align 16,0x90 + +__svml_dtanh_cout_rare_internal: + + cfi_startproc + + lea __dtanh_la__imldTanhTab(%rip), %rdx + movb 7(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 6(%rdi), %eax + andl $32752, %eax + shrl $4, %eax + movq (%rdx,%rcx,8), %rdx + cmpl $2047, %eax + je L(9) + cmpl $2046, %eax + jne L(7) + +L(6): + movq %rdx, (%rsi) + jmp L(8) + +L(7): + movsd (%rdi), %xmm1 + movsd __dtanh_la__imldTanhTab(%rip), %xmm0 + addsd %xmm1, %xmm0 + mulsd %xmm0, %xmm1 + movsd %xmm1, (%rsi) + +L(8): + xorl %eax, %eax + ret + +L(9): + testl $1048575, 4(%rdi) + jne L(10) + cmpl $0, (%rdi) + je L(6) + +L(10): + movsd (%rdi), %xmm0 + addsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + jmp L(8) + + cfi_endproc + + .type __svml_dtanh_cout_rare_internal,@function + .size __svml_dtanh_cout_rare_internal,.-__svml_dtanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dtanh_data_internal: + .long 0 + .long 0 + .long 0 + .long 1070333952 + .long 0 + .long 1070858240 + .long 0 + .long 1071382528 + .long 0 + .long 1071906816 + .long 0 + .long 1072431104 + .long 0 + .long 1072955392 + .long 0 + .long 1073479680 + .long 0 + .long 1074003968 + .long 0 + .long 1074528256 + .long 0 + .long 1075052544 + .long 0 + .long 1075576832 + .long 0 + .long 1076101120 + .long 0 + .long 1076625408 + .long 0 + .long 1077149696 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1097497746 + .long 1070305232 + .long 2699715854 + .long 1070817176 + .long 3997728823 + .long 1071273769 + .long 3938160533 + .long 1071759175 + .long 193732629 + .long 1072072293 + .long 3144363502 + .long 1072375075 + .long 2548249895 + .long 1072570303 + .long 638218690 + .long 1072665176 + .long 3325726839 + .long 1072689426 + .long 2523455249 + .long 1072693057 + .long 2200391922 + .long 1072693244 + .long 4257836853 + .long 1072693247 + .long 4294954840 + .long 1072693247 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 3167993022 + .long 1013310014 + .long 2889539328 + .long 3159121931 + .long 394645568 + .long 1013728265 + .long 2799920971 + .long 1015161303 + .long 754366556 + .long 1013577885 + .long 3960180508 + .long 1014215657 + .long 69774042 + .long 3162475851 + .long 2161066944 + .long 3162264280 + .long 923362432 + .long 1014879086 + .long 2160345802 + .long 1014714211 + .long 3729195158 + .long 3161626453 + .long 675671997 + .long 1015336837 + .long 1141527416 + .long 1013957883 + .long 2209699952 + .long 3160643600 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 2750448946 + .long 1072596012 + .long 1257606939 + .long 1072501079 + .long 2619663609 + .long 1072338011 + .long 863303701 + .long 1072048204 + .long 2694810990 + .long 1071654144 + .long 837003456 + .long 1070723665 + .long 472162617 + .long 1069359818 + .long 532307062 + .long 1067137790 + .long 431106849 + .long 1064162173 + .long 329904022 + .long 1059572972 + .long 4080160942 + .long 1053550275 + .long 1402271583 + .long 1044493446 + .long 467296040 + .long 1032344560 + .long 26734424 + .long 1014207804 + .long 0 + .long 0 + .long 1071622681 + .long 3153114090 + .long 3948133409 + .long 3217705130 + .long 4096956694 + .long 3218184481 + .long 2616164369 + .long 3218465008 + .long 2620770434 + .long 3218641845 + .long 3075958072 + .long 3218520700 + .long 1950184789 + .long 3217978001 + .long 2686385024 + .long 3216731525 + .long 1489441818 + .long 3214597550 + .long 1992796697 + .long 3211642259 + .long 1952936976 + .long 3207056478 + .long 3904162951 + .long 3201033920 + .long 1382745445 + .long 3191977094 + .long 468673444 + .long 3179828208 + .long 3843669553 + .long 3161691483 + .long 0 + .long 0 + .long 1431655765 + .long 3218429269 + .long 3264395793 + .long 3218178991 + .long 60595194 + .long 3217824331 + .long 1837960166 + .long 3217124894 + .long 1964918946 + .long 3214033516 + .long 2998587684 + .long 1068822866 + .long 3421467326 + .long 1069267520 + .long 952003133 + .long 1068506016 + .long 1215426504 + .long 1066495476 + .long 2650572912 + .long 1063503494 + .long 4178958376 + .long 1059043758 + .long 3799805457 + .long 1052940753 + .long 3704238924 + .long 1043831645 + .long 2076585114 + .long 1031813109 + .long 1352847351 + .long 1013591371 + .long 0 + .long 0 + .long 3830371894 + .long 3169224254 + .long 74893150 + .long 1069567437 + .long 1235750664 + .long 1069825332 + .long 916043751 + .long 1069924975 + .long 4138411315 + .long 1069655686 + .long 829220656 + .long 1068441660 + .long 663246204 + .long 3213477792 + .long 652268865 + .long 3214415230 + .long 3251098232 + .long 3212868437 + .long 1480792335 + .long 3209929101 + .long 3365608027 + .long 3205478075 + .long 3330582883 + .long 3199375817 + .long 3573234945 + .long 3190266717 + .long 2061970086 + .long 3178248181 + .long 3148320390 + .long 3160026274 + .long 0 + .long 0 + .long 286337717 + .long 1069617425 + .long 4261152941 + .long 1068876190 + .long 3694459820 + .long 1067928728 + .long 2399079031 + .long 3212381546 + .long 394897286 + .long 3215735810 + .long 3073534041 + .long 3215860118 + .long 301960234 + .long 3214124960 + .long 3353887502 + .long 1064191753 + .long 4200665425 + .long 1063741482 + .long 2003926207 + .long 1061090030 + .long 2196865207 + .long 1056528964 + .long 2107880963 + .long 1050526402 + .long 3656860478 + .long 1041425071 + .long 881228218 + .long 1029305120 + .long 2612840768 + .long 1011136029 + .long 0 + .long 0 + .long 3722294196 + .long 3181505049 + .long 2573001951 + .long 3216029919 + .long 4095639908 + .long 3216151900 + .long 3272210374 + .long 3215957253 + .long 3439280785 + .long 3214441767 + .long 628273304 + .long 1066085542 + .long 3354767370 + .long 1066343670 + .long 300170709 + .long 1063270296 + .long 1870156670 + .long 3209139074 + .long 1580606479 + .long 3206808937 + .long 3818710870 + .long 3202408589 + .long 3126817102 + .long 3196311305 + .long 3320734688 + .long 3187224127 + .long 821170446 + .long 3175173312 + .long 3906480775 + .long 3156975650 + .long 0 + .long 0 + .long 428888587 + .long 3215696314 + .long 3125999356 + .long 3214336891 + .long 407196569 + .long 1053816799 + .long 886258254 + .long 1066874408 + .long 2149075781 + .long 1067351939 + .long 3888390356 + .long 1065784643 + .long 1226056234 + .long 3211994813 + .long 178100474 + .long 3210723675 + .long 4201249718 + .long 1058328572 + .long 3854015760 + .long 1057324616 + .long 3621220964 + .long 1052982118 + .long 1468766992 + .long 1046916174 + .long 2369608770 + .long 1037879115 + .long 327127732 + .long 1025754505 + .long 747046817 + .long 1007714190 + .long 0 + .long 0 + .long 4036362527 + .long 3191151783 + .long 839661649 + .long 1067363059 + .long 4269154241 + .long 1067251747 + .long 391446303 + .long 1066410535 + .long 2090623151 + .long 3211993063 + .long 1751510141 + .long 3213141508 + .long 4072216875 + .long 3209470961 + .long 3769618983 + .long 1061976030 + .long 3462945146 + .long 1057228123 + .long 3030849095 + .long 3202531084 + .long 4269010901 + .long 3198361258 + .long 742615277 + .long 3192302512 + .long 3397417437 + .long 3183265609 + .long 943110610 + .long 3171141000 + .long 371608300 + .long 3153099348 + .long 0 + .long 0 + .long 1315619150 + .long 1066820857 + .long 1001273821 + .long 3214201652 + .long 3859675203 + .long 3212560200 + .long 725858949 + .long 3213658423 + .long 2464052346 + .long 3212913056 + .long 1297319750 + .long 1063307355 + .long 563735576 + .long 1062988089 + .long 2756222736 + .long 3207203944 + .long 31207338 + .long 3204466214 + .long 434022900 + .long 1052227234 + .long 2370591882 + .long 1048628172 + .long 588930601 + .long 1042556347 + .long 3198977634 + .long 1033474724 + .long 1590950759 + .long 1021415866 + .long 195904708 + .long 1003000389 + .long 0 + .long 0 + .long 4252521214 + .long 3198731457 + .long 2969857811 + .long 3217870358 + .long 575387574 + .long 3212943727 + .long 67550217 + .long 3210922992 + .long 2955736731 + .long 1064678043 + .long 4193848343 + .long 1063288304 + .long 1845975253 + .long 3209397546 + .long 1025213509 + .long 3204479174 + .long 3713384058 + .long 1055658730 + .long 4120057883 + .long 3194988032 + .long 1573797757 + .long 3193584787 + .long 2514726550 + .long 3187678317 + .long 15343571 + .long 3178526042 + .long 104576940 + .long 3166444652 + .long 1147207168 + .long 3148070554 + .long 0 + .long 0 + .long 1467656669 + .long 3212977156 + .long 4154993315 + .long 1077775111 + .long 2465966858 + .long 3214886059 + .long 71777642 + .long 1068690118 + .long 2419763912 + .long 1061550205 + .long 1896047360 + .long 3210612806 + .long 3723555648 + .long 1058651288 + .long 3163703016 + .long 1057833732 + .long 1601936705 + .long 3201383489 + .long 2535509424 + .long 3195153293 + .long 3610885824 + .long 1043474022 + .long 1031698712 + .long 1037527637 + .long 1497459257 + .long 1028514042 + .long 3476455860 + .long 1016366870 + .long 758110873 + .long 998719391 + .long 0 + .long 0 + .long 572446067 + .long 3204307354 + .long 926268084 + .long 1081104698 + .long 1313112926 + .long 3217861477 + .long 3660716 + .long 1070677720 + .long 124568711 + .long 3210757561 + .long 2123022704 + .long 1059096046 + .long 576783408 + .long 1059279430 + .long 1651052980 + .long 3204387494 + .long 3164866735 + .long 1051430920 + .long 409335328 + .long 1046695415 + .long 3481520755 + .long 3188046619 + .long 1140549474 + .long 3182373569 + .long 708689751 + .long 3173247717 + .long 2627769694 + .long 3161153086 + .long 3804346926 + .long 3143551592 + .long 0 + .long 0 + .long 2302818369 + .long 1064188902 + .long 526101185 + .long 3235013457 + .long 2975776348 + .long 1075224435 + .long 1103981749 + .long 3223699933 + .long 4261798097 + .long 3210280329 + .long 30781306 + .long 1064564655 + .long 3939597931 + .long 3206430909 + .long 1816466405 + .long 1055007949 + .long 3868125859 + .long 3190076997 + .long 4218600579 + .long 3192569835 + .long 4167655123 + .long 1037376568 + .long 952533803 + .long 1032000428 + .long 895641221 + .long 1022851193 + .long 1237761065 + .long 1010835452 + .long 2902086315 + .long 3133082401 + .long 0 + .long 0 + .long 1899646778 + .long 3207205638 + .long 2434183270 + .long 3238288976 + .long 621380814 + .long 1078065849 + .long 247717525 + .long 3225783561 + .long 1611742563 + .long 3212088477 + .long 537725662 + .long 1065131990 + .long 3769436831 + .long 1057148224 + .long 3759797009 + .long 3196422840 + .long 842759416 + .long 3195613094 + .long 1736926210 + .long 1043198029 + .long 3915271468 + .long 3180709675 + .long 807416070 + .long 3176507548 + .long 3147759461 + .long 3167409843 + .long 3443382404 + .long 3155325020 + .long 1202615797 + .long 3129870924 + .long 0 + .long 0 + .long 1841653873 + .long 3210074087 + .long 2157744327 + .long 1095928888 + .long 3038317314 + .long 3229013375 + .long 2291108570 + .long 1082519711 + .long 707775397 + .long 1067599411 + .long 445214669 + .long 3216153989 + .long 3815354898 + .long 1054410330 + .long 1285070896 + .long 3199787450 + .long 1722630166 + .long 1047526663 + .long 2672844635 + .long 3188483010 + .long 1805520457 + .long 3179260705 + .long 542550567 + .long 1026041526 + .long 392361251 + .long 1017320419 + .long 562647833 + .long 1005205418 + .long 4253488278 + .long 988137457 + .long 0 + .long 0 + .long 3077187303 + .long 1060497018 + .long 1652392454 + .long 1099206368 + .long 414484972 + .long 3231848150 + .long 130592591 + .long 1084602513 + .long 1951534810 + .long 1068932483 + .long 2677544726 + .long 3216895313 + .long 2338009969 + .long 3203411240 + .long 302629286 + .long 1051889816 + .long 1274412910 + .long 3193339538 + .long 3731558070 + .long 1038350327 + .long 3135499196 + .long 1030352152 + .long 1329461873 + .long 3170325324 + .long 4058709792 + .long 3161656179 + .long 2167788642 + .long 3149540607 + .long 1602064437 + .long 3132466971 + .long 0 + .long 0 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 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 0 + .long 0 + .long 1072693248 + .long 3616958675 + .long 3172564458 + .long 1431547708 + .long 3218429269 + .long 3390261318 + .long 3188010876 + .long 1446529494 + .long 1069617425 + .long 913571762 + .long 3199219810 + .long 1583612462 + .long 3215695720 + .long 2995724807 + .long 3207222498 + .long 847913742 + .long 1066913721 + .long 1634876930 + .long 3212167789 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1694159514 + .long 1010239653 + .long 966318664 + .long 1069606551 + .long 2992375944 + .long 1072656686 + .long 1870405289 + .long 3217070889 + .long 1411308967 + .long 3218333047 + .long 4096824853 + .long 1068863484 + .long 2220740425 + .long 1069365950 + .long 1401698298 + .long 3215430111 + .long 4137473768 + .long 3215259762 + .long 2666938667 + .long 1066889956 + .long 121190665 + .long 1066187784 + .long 821637913 + .long 3213226090 + .long 0 + .long 3217096704 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1463410348 + .long 1012925678 + .long 2389577058 + .long 1069735062 + .long 1617794783 + .long 1072647710 + .long 1889094329 + .long 3217191869 + .long 1210518828 + .long 3218309813 + .long 1479174953 + .long 1069010221 + .long 3435917531 + .long 1069290104 + .long 291210913 + .long 3215575029 + .long 464478606 + .long 3215159746 + .long 1063797118 + .long 1067014292 + .long 3489481042 + .long 1065955541 + .long 2916293494 + .long 3213319415 + .long 0 + .long 3217227776 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1308961311 + .long 1014934498 + .long 2204208241 + .long 1069862983 + .long 2945950899 + .long 1072637797 + .long 1107689125 + .long 3217310565 + .long 545938327 + .long 3218284334 + .long 3174275192 + .long 1069150773 + .long 3754729793 + .long 1069207728 + .long 1611554958 + .long 3215708601 + .long 2936527704 + .long 3215052478 + .long 2983784402 + .long 1067121823 + .long 1327150338 + .long 1065710404 + .long 3371320326 + .long 3213391099 + .long 0 + .long 3217358848 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3546392464 + .long 1015001497 + .long 631120375 + .long 1069990256 + .long 1201634405 + .long 1072626967 + .long 266657677 + .long 3217426771 + .long 1567732958 + .long 3218256710 + .long 883708059 + .long 1069284653 + .long 1008115966 + .long 1069119372 + .long 2657338981 + .long 3215830093 + .long 3402640736 + .long 3214939036 + .long 1000796573 + .long 1067211764 + .long 53805889 + .long 1065455799 + .long 1736607114 + .long 3213440608 + .long 0 + .long 3217489920 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2741128528 + .long 1013617020 + .long 3111451323 + .long 1070116823 + .long 1649040643 + .long 1072615239 + .long 3411009101 + .long 3217540290 + .long 3408666525 + .long 3218227049 + .long 60831764 + .long 1069411415 + .long 64016149 + .long 1069025616 + .long 1202785467 + .long 3215938891 + .long 1072151579 + .long 3214707060 + .long 1534357116 + .long 1067283570 + .long 4218468492 + .long 1065037194 + .long 2285827787 + .long 3213467810 + .long 0 + .long 3217620992 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2659584459 + .long 1014368295 + .long 3537749475 + .long 1070242630 + .long 3072983457 + .long 1072602635 + .long 3507245872 + .long 3217650938 + .long 3434758212 + .long 3218195466 + .long 3801643091 + .long 1069530660 + .long 1128653951 + .long 1068927067 + .long 3580298628 + .long 3216008547 + .long 1645082338 + .long 3214462237 + .long 1048857889 + .long 1067336943 + .long 21547694 + .long 1064510970 + .long 1433152914 + .long 3213472968 + .long 0 + .long 3217752064 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2718912981 + .long 1013914074 + .long 1823051285 + .long 1070367623 + .long 1714227149 + .long 1072589179 + .long 2128046799 + .long 3217758540 + .long 2655098722 + .long 3218162081 + .long 1690074008 + .long 1069594780 + .long 353091525 + .long 1068824353 + .long 4206393496 + .long 3216049578 + .long 824478721 + .long 3214211899 + .long 3850924188 + .long 1067371825 + .long 2738209029 + .long 1063668369 + .long 853664366 + .long 3213456718 + .long 0 + .long 3217883136 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2312638749 + .long 1013630664 + .long 4267025360 + .long 1070491748 + .long 3776362539 + .long 1072574894 + .long 3063840907 + .long 3217862932 + .long 2436606365 + .long 3218127019 + .long 582931594 + .long 1069646387 + .long 3079837843 + .long 1068718114 + .long 3430470362 + .long 3216083715 + .long 1015897693 + .long 3213958348 + .long 765047087 + .long 1067388396 + .long 2337193368 + .long 1061824569 + .long 3002775972 + .long 3213420044 + .long 0 + .long 3218014208 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2001712669 + .long 1015665334 + .long 1330879460 + .long 1070636148 + .long 2956987714 + .long 1072551971 + .long 4281360332 + .long 3218013175 + .long 3304213057 + .long 3218063389 + .long 3261945160 + .long 1069715874 + .long 3866284424 + .long 1068553570 + .long 3423706630 + .long 3216121886 + .long 259493169 + .long 3213268437 + .long 4223676832 + .long 1067379852 + .long 2765317642 + .long 3210752240 + .long 2292494069 + .long 3213329490 + .long 0 + .long 3218145280 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1632443533 + .long 1015769771 + .long 3788472163 + .long 1070757367 + .long 2406795724 + .long 1072518757 + .long 1173083542 + .long 3218140352 + .long 3726086528 + .long 3217906251 + .long 1205028711 + .long 1069793280 + .long 2231197855 + .long 1068156878 + .long 2368637763 + .long 3216148628 + .long 2866127296 + .long 3211617797 + .long 2424606359 + .long 1067309831 + .long 2444940724 + .long 3212180962 + .long 3308128888 + .long 3213151909 + .long 0 + .long 3218276352 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 478834383 + .long 1014053288 + .long 1342399495 + .long 1070876422 + .long 2650660168 + .long 1072482726 + .long 976724127 + .long 3218226669 + .long 962417089 + .long 3217740546 + .long 1060150306 + .long 1069852926 + .long 411739190 + .long 1067700577 + .long 3846786712 + .long 3216148687 + .long 4007187252 + .long 1064073475 + .long 3455779574 + .long 1067180067 + .long 1865169557 + .long 3212900393 + .long 1200620699 + .long 3212923615 + .long 0 + .long 3218407424 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 267289397 + .long 1014452734 + .long 302318249 + .long 1070993143 + .long 1373990511 + .long 1072444121 + .long 1606419704 + .long 3218305061 + .long 3955669825 + .long 3217568496 + .long 2701083439 + .long 1069894809 + .long 3425188888 + .long 1067047616 + .long 2305426029 + .long 3216123827 + .long 1692531481 + .long 1065641523 + .long 232815703 + .long 1067000535 + .long 3949954748 + .long 3213214884 + .long 558890519 + .long 3212487521 + .long 0 + .long 3218538496 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1719941932 + .long 1006528498 + .long 368840470 + .long 1071107377 + .long 1825320027 + .long 1072403193 + .long 538136722 + .long 3218375283 + .long 1431312010 + .long 3217392305 + .long 2586725425 + .long 1069919291 + .long 2680871675 + .long 1065941593 + .long 4123661982 + .long 3216076488 + .long 4235496382 + .long 1066406926 + .long 2618960092 + .long 1066782660 + .long 2333865044 + .long 3213444845 + .long 1545458959 + .long 3211934181 + .long 0 + .long 3218669568 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 26286236 + .long 1013191219 + .long 990113957 + .long 1071218987 + .long 3284199501 + .long 1072360200 + .long 2981906127 + .long 3218437190 + .long 3154396333 + .long 3217214106 + .long 4182117656 + .long 1069927061 + .long 903677379 + .long 3207343530 + .long 384743261 + .long 3216009637 + .long 1679228359 + .long 1066734193 + .long 3407026595 + .long 1066538544 + .long 784962854 + .long 3213588186 + .long 1956733412 + .long 3210979700 + .long 0 + .long 3218800640 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1468217372 + .long 1015658399 + .long 2570814109 + .long 1071327852 + .long 532296332 + .long 1072315404 + .long 318213600 + .long 3218490738 + .long 3661105766 + .long 3217035931 + .long 4085840862 + .long 1069919095 + .long 2798312316 + .long 3213370099 + .long 1668326589 + .long 3215870599 + .long 3158013712 + .long 1066998409 + .long 673205579 + .long 1066158659 + .long 486665227 + .long 3213647762 + .long 3317145528 + .long 3208570948 + .long 0 + .long 3218931712 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2060955015 + .long 1014233667 + .long 2567098181 + .long 1071433868 + .long 1159081245 + .long 1072269064 + .long 1492598184 + .long 3218535971 + .long 1567055841 + .long 3216688180 + .long 2821222425 + .long 1069896605 + .long 3691290783 + .long 3214336992 + .long 343679101 + .long 3215679175 + .long 1878686296 + .long 1067197462 + .long 125933636 + .long 1065636281 + .long 421076939 + .long 3213630573 + .long 3748848474 + .long 1062499186 + .long 0 + .long 3219062784 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1860475216 + .long 1015320544 + .long 439764829 + .long 1071587361 + .long 3870821058 + .long 1072197223 + .long 1430736283 + .long 3218588540 + .long 1597812790 + .long 3216174065 + .long 2398544810 + .long 1069838732 + .long 961452807 + .long 3215095800 + .long 716310499 + .long 3215360049 + .long 2337792646 + .long 1067375770 + .long 3863538422 + .long 1064417477 + .long 2203480844 + .long 3213482785 + .long 2389621902 + .long 1063978354 + .long 0 + .long 3219193856 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 517838046 + .long 1015294339 + .long 2114713104 + .long 1071713012 + .long 2046328558 + .long 1072098392 + .long 29352448 + .long 3218631376 + .long 1533416325 + .long 3215079684 + .long 765247815 + .long 1069724759 + .long 24381189 + .long 3215564623 + .long 1213155449 + .long 3214886044 + .long 379420126 + .long 1067409218 + .long 3127061143 + .long 3210809777 + .long 3193663073 + .long 3213128287 + .long 2557278876 + .long 1064581282 + .long 0 + .long 3219324928 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 201012485 + .long 1013704982 + .long 4147262407 + .long 1071803766 + .long 3048814903 + .long 1071997795 + .long 1260857726 + .long 3218645540 + .long 270462819 + .long 3209873967 + .long 874660781 + .long 1069580732 + .long 1251156804 + .long 3215866075 + .long 3568210118 + .long 3214014484 + .long 3784557811 + .long 1067255146 + .long 47772576 + .long 3212562613 + .long 2075700783 + .long 3212539455 + .long 1121561449 + .long 1064698735 + .long 0 + .long 3219456000 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 72370286 + .long 1015768239 + .long 2345366573 + .long 1071888223 + .long 3155310239 + .long 1071897123 + .long 4105462806 + .long 3218634383 + .long 2329529114 + .long 1067280331 + .long 3078782452 + .long 1069291148 + .long 2210998062 + .long 3215997483 + .long 1498585052 + .long 3212353515 + .long 3032692199 + .long 1066974465 + .long 809329973 + .long 3213081308 + .long 2713838579 + .long 3211547879 + .long 1266611175 + .long 1064568889 + .long 0 + .long 3219587072 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2137918782 + .long 1013598293 + .long 2511343836 + .long 1071966424 + .long 4205808243 + .long 1071797842 + .long 2776384587 + .long 3218601667 + .long 3824787134 + .long 1068202086 + .long 4101819712 + .long 1068956189 + .long 3547601806 + .long 3216004360 + .long 4156237724 + .long 1064058621 + .long 3714924071 + .long 1066627770 + .long 2925917146 + .long 3213234133 + .long 4211598888 + .long 3209111151 + .long 2569808389 + .long 1064277859 + .long 0 + .long 3219718144 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2979324843 + .long 1013692066 + .long 2595126306 + .long 1072038496 + .long 4263058559 + .long 1071701178 + .long 2217257467 + .long 3218551298 + .long 2310932059 + .long 1068685603 + .long 3368327571 + .long 1068627625 + .long 3037419246 + .long 3215935424 + .long 3509936675 + .long 1065724141 + .long 1557247226 + .long 1066131548 + .long 3830787958 + .long 3213205743 + .long 1781883284 + .long 1062575914 + .long 3918078093 + .long 1063614197 + .long 0 + .long 3219849216 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3630992244 + .long 1015034507 + .long 461360001 + .long 1072104635 + .long 2866201612 + .long 1071571556 + .long 1021729265 + .long 3218487113 + .long 1039036234 + .long 1068940858 + .long 1685105679 + .long 1068140011 + .long 1856275853 + .long 3215769620 + .long 2211306181 + .long 1066373046 + .long 3739405201 + .long 1065456917 + .long 3870269089 + .long 3213053509 + .long 427599213 + .long 1063593231 + .long 40698732 + .long 1062709094 + .long 0 + .long 3219980288 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4017840557 + .long 1014067070 + .long 2764932206 + .long 1072165089 + .long 3362970633 + .long 1071394124 + .long 2677206355 + .long 3218412713 + .long 1827861303 + .long 1069122666 + .long 2476388705 + .long 1067583638 + .long 523365901 + .long 3215556224 + .long 1203249285 + .long 1066574111 + .long 4264074292 + .long 1064402288 + .long 3556167213 + .long 3212827889 + .long 3894081206 + .long 1063908871 + .long 2161178761 + .long 1061130844 + .long 0 + .long 3220111360 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3622330478 + .long 1016273425 + .long 923638641 + .long 1072245755 + .long 239419665 + .long 1071146518 + .long 4085259706 + .long 3218288969 + .long 1284806809 + .long 1069276013 + .long 2806747971 + .long 1066232498 + .long 75259250 + .long 3215197393 + .long 2597116185 + .long 1066648701 + .long 1680670491 + .long 3208755029 + .long 446818184 + .long 3212096816 + .long 1529495144 + .long 1063888972 + .long 808619025 + .long 3208443000 + .long 0 + .long 3220242432 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 462410646 + .long 1015565639 + .long 3157363066 + .long 1072336316 + .long 87541994 + .long 1070853747 + .long 2905067058 + .long 3218115077 + .long 1081050294 + .long 1069306453 + .long 4130581086 + .long 3212259234 + .long 1279737796 + .long 3214531982 + .long 901138781 + .long 1066501065 + .long 978916480 + .long 3211806490 + .long 1307294116 + .long 3210755549 + .long 1154728319 + .long 1063409950 + .long 983243444 + .long 3209435485 + .long 0 + .long 3220373504 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2617212772 + .long 1016126748 + .long 2762378177 + .long 1072409936 + .long 1926160805 + .long 1070604218 + .long 4131898582 + .long 3217810482 + .long 3068505203 + .long 1069203346 + .long 2854543895 + .long 3214027139 + .long 1276437050 + .long 3213652513 + .long 523800203 + .long 1066060621 + .long 3030576699 + .long 3212054264 + .long 210618624 + .long 3205409267 + .long 3515290542 + .long 1062456384 + .long 1613351841 + .long 3209185464 + .long 0 + .long 3220504576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2178033281 + .long 1016051223 + .long 859883711 + .long 1072469258 + .long 4248327203 + .long 1070195167 + .long 4170103331 + .long 3217497647 + .long 3497702842 + .long 1069026027 + .long 669705965 + .long 3214426190 + .long 548733038 + .long 3212258725 + .long 1756337187 + .long 1065503890 + .long 1830841059 + .long 3211930343 + .long 1445563742 + .long 1061912703 + .long 2113494314 + .long 1060991234 + .long 1734825467 + .long 3208559895 + .long 0 + .long 3220635648 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1674478116 + .long 1016412476 + .long 1178764976 + .long 1072516719 + .long 1119346206 + .long 1069851736 + .long 1526584272 + .long 3217221512 + .long 3575463915 + .long 1068817773 + .long 2913683612 + .long 3214542291 + .long 1135909212 + .long 3207879094 + .long 1952394810 + .long 1064725296 + .long 508910559 + .long 3211537545 + .long 225204077 + .long 1062311155 + .long 1009857186 + .long 1056234420 + .long 2872841632 + .long 3207480811 + .long 0 + .long 3220766720 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1768234410 + .long 1014305046 + .long 1496797583 + .long 1072554475 + .long 3351833521 + .long 1069572393 + .long 68183265 + .long 3216938851 + .long 4178655528 + .long 1068606905 + .long 60791550 + .long 3214483781 + .long 1856281737 + .long 1063701265 + .long 4260560897 + .long 1063778674 + .long 2539586291 + .long 3210979253 + .long 2272785608 + .long 1062198907 + .long 1986161572 + .long 3206910344 + .long 1016667904 + .long 3205797138 + .long 0 + .long 3220897792 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3074583847 + .long 1017063845 + .long 4092570620 + .long 1072584374 + .long 3645618684 + .long 1069147119 + .long 1980755111 + .long 3216542681 + .long 889928399 + .long 1068320928 + .long 1360064809 + .long 3214330986 + .long 2266432388 + .long 1064407878 + .long 4147854841 + .long 1062471610 + .long 1812350685 + .long 3210287970 + .long 3710399832 + .long 1061728481 + .long 2458127659 + .long 3207279138 + .long 287360833 + .long 3197756422 + .long 0 + .long 3221028864 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 68970445 + .long 1013643458 + .long 3990219923 + .long 1072607967 + .long 97498680 + .long 1068787106 + .long 4136450559 + .long 3216216395 + .long 147179316 + .long 1067971098 + .long 1625987424 + .long 3214138005 + .long 3965878798 + .long 1064539455 + .long 3777445436 + .long 1059539413 + .long 3029913178 + .long 3209512624 + .long 2162291908 + .long 1061245910 + .long 351053474 + .long 3207087984 + .long 3766283083 + .long 1056943188 + .long 0 + .long 3221159936 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3139580402 + .long 1014663922 + .long 3748810696 + .long 1072634260 + .long 3154943320 + .long 1068262833 + .long 3181856712 + .long 3215694135 + .long 3656356636 + .long 1067539266 + .long 3897588284 + .long 3213798616 + .long 1461831298 + .long 1064461217 + .long 2900114226 + .long 3208814642 + .long 2606420357 + .long 3207868903 + .long 1741152094 + .long 1060222230 + .long 1469206701 + .long 3206514441 + .long 3518993813 + .long 1057090958 + .long 0 + .long 3221291008 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3285908565 + .long 1015477239 + .long 1797956315 + .long 1072657271 + .long 3302471936 + .long 1067543167 + .long 2151339553 + .long 3215007235 + .long 362228095 + .long 1066797401 + .long 3986406156 + .long 3213131380 + .long 388353381 + .long 1064042359 + .long 4147910906 + .long 3209239839 + .long 1739922885 + .long 1056259812 + .long 3188561056 + .long 1058406709 + .long 489122368 + .long 3205182155 + .long 202560853 + .long 1056234231 + .long 0 + .long 3221422080 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3806705628 + .long 1008327668 + .long 884432573 + .long 1072671353 + .long 137405484 + .long 1066747168 + .long 3531994812 + .long 3214216262 + .long 3217445183 + .long 1066105333 + .long 2910288024 + .long 3212464301 + .long 3196212707 + .long 1063467545 + .long 3156563895 + .long 3208963593 + .long 3591285453 + .long 1058733242 + .long 2889132271 + .long 1055392886 + .long 1038377961 + .long 3203561698 + .long 4084672077 + .long 1055001082 + .long 0 + .long 3221553152 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1881957148 + .long 1016569186 + .long 3451706443 + .long 1072679940 + .long 143468186 + .long 1066002557 + .long 553724800 + .long 3213475431 + .long 1049442771 + .long 1065415105 + .long 3378521943 + .long 3211821787 + .long 3176008209 + .long 1062800361 + .long 4016898691 + .long 3208498219 + .long 1548390021 + .long 1058670598 + .long 2097418483 + .long 3202689041 + .long 2756703589 + .long 3201351283 + .long 506736184 + .long 1053405377 + .long 0 + .long 3221684224 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 450339788 + .long 1015040915 + .long 2959639058 + .long 1072685166 + .long 2289443405 + .long 1065320893 + .long 3331959139 + .long 3212796584 + .long 724199976 + .long 1064616734 + .long 938566183 + .long 3211030741 + .long 1640535667 + .long 1062186735 + .long 187996035 + .long 3207841256 + .long 822311531 + .long 1058246461 + .long 160890851 + .long 3203087480 + .long 3163291388 + .long 1050479733 + .long 578249940 + .long 1051474021 + .long 0 + .long 3221815296 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 539445753 + .long 1012635531 + .long 3085578536 + .long 1072688342 + .long 2019637246 + .long 1064510347 + .long 2901018414 + .long 3211991061 + .long 2171427566 + .long 1063868144 + .long 678185093 + .long 3210287638 + .long 2685165718 + .long 1061401571 + .long 710336199 + .long 3207152667 + .long 2733135798 + .long 1057659331 + .long 886948177 + .long 3202751664 + .long 3345834247 + .long 1052218043 + .long 908728048 + .long 1047925874 + .long 0 + .long 3221946368 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4240302093 + .long 1016867082 + .long 1832260410 + .long 1072690271 + .long 154153694 + .long 1063730412 + .long 2094548181 + .long 3211211898 + .long 1392727515 + .long 1063180837 + .long 3132890025 + .long 3209604411 + .long 483611698 + .long 1060651750 + .long 4246355421 + .long 3206519479 + .long 1424637421 + .long 1057044161 + .long 2138185318 + .long 3202290304 + .long 2276282642 + .long 1052095798 + .long 4227780935 + .long 3196067472 + .long 0 + .long 3222077440 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2485733495 + .long 1017000498 + .long 484092514 + .long 1072691442 + .long 1653085170 + .long 1063007344 + .long 2893019346 + .long 3210489400 + .long 878866243 + .long 1062388018 + .long 2113174452 + .long 3208818852 + .long 2654141437 + .long 1059959432 + .long 3578550869 + .long 3205727739 + .long 315005006 + .long 1056288680 + .long 3246956604 + .long 3201593495 + .long 2197286540 + .long 1051718329 + .long 3044885069 + .long 3196227269 + .long 0 + .long 3222208512 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2794994668 + .long 1016833037 + .long 3287420517 + .long 1072692394 + .long 4133778764 + .long 1061857404 + .long 689562148 + .long 3209340342 + .long 1404089106 + .long 1061273627 + .long 1292441425 + .long 3207706805 + .long 93671116 + .long 1058816787 + .long 2903327974 + .long 3204626398 + .long 4279279273 + .long 1055202414 + .long 134688023 + .long 3200552187 + .long 3315379764 + .long 1050761310 + .long 2945780649 + .long 3195568939 + .long 0 + .long 3222339584 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2135621136 + .long 1016053539 + .long 309961636 + .long 1072692934 + .long 672792810 + .long 1060347512 + .long 2960305506 + .long 3207830967 + .long 1703867620 + .long 1059726750 + .long 824905914 + .long 3206160796 + .long 3036017847 + .long 1057284422 + .long 923304464 + .long 3203122673 + .long 1848642304 + .long 1053791859 + .long 2215350763 + .long 3199158388 + .long 3049848127 + .long 1049324210 + .long 3861893815 + .long 3194293196 + .long 0 + .long 3222470656 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2236028675 + .long 1016891036 + .long 2177293363 + .long 1072693132 + .long 776830057 + .long 1058856794 + .long 4190004158 + .long 3206340337 + .long 209955488 + .long 1058225857 + .long 845130443 + .long 3204660651 + .long 4204313304 + .long 1055835544 + .long 364525198 + .long 3201597210 + .long 3889299905 + .long 1052205563 + .long 1514389355 + .long 3197586647 + .long 1706817756 + .long 1047834665 + .long 3817417318 + .long 3192934132 + .long 0 + .long 3222601728 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1074033072 + .long 1013200912 + .long 2197899301 + .long 1072693205 + .long 1097614282 + .long 1057308273 + .long 209489097 + .long 3204791893 + .long 3641526339 + .long 1056723664 + .long 1792794946 + .long 3203158586 + .long 584598707 + .long 1054254910 + .long 253996240 + .long 3200135633 + .long 642640562 + .long 1050754580 + .long 3147361740 + .long 3196139610 + .long 1167319222 + .long 1046395158 + .long 3488053038 + .long 3191370264 + .long 0 + .long 3222732800 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 871679747 + .long 1016222468 + .long 1586311569 + .long 1072693232 + .long 4199724405 + .long 1055867613 + .long 3041006250 + .long 3203351246 + .long 482130003 + .long 1055184672 + .long 1689676855 + .long 3201619703 + .long 116121201 + .long 1052814264 + .long 4166318198 + .long 3198564764 + .long 388552649 + .long 1049191609 + .long 1384400086 + .long 3194577312 + .long 135589376 + .long 1044819515 + .long 2497367318 + .long 3189906305 + .long 0 + .long 3222863872 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 752986014 + .long 1014740322 + .long 1072834312 + .long 1072693242 + .long 1389704451 + .long 1054277685 + .long 817998738 + .long 3201761329 + .long 996777029 + .long 1053731553 + .long 811547911 + .long 3200166603 + .long 1604093935 + .long 1051232383 + .long 2381858127 + .long 3197131472 + .long 806055999 + .long 1047703656 + .long 443662424 + .long 3193089938 + .long 2855612429 + .long 1043379518 + .long 3671581230 + .long 3188373004 + .long 0 + .long 3222994944 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4161630806 + .long 1015796140 + .long 3799386689 + .long 1072693245 + .long 516062805 + .long 1052830799 + .long 6188716 + .long 3200314446 + .long 79447568 + .long 1052151909 + .long 223529141 + .long 3198586975 + .long 1557009707 + .long 1049758991 + .long 1527834451 + .long 3195539792 + .long 3841571054 + .long 1046184222 + .long 3228035136 + .long 3191570603 + .long 2497745717 + .long 1041799395 + .long 3127975351 + .long 3186863029 + .long 0 + .long 3223126016 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3013228433 + .long 1015734301 + .long 952591976 + .long 1072693247 + .long 3849195912 + .long 1051256594 + .long 1248135057 + .long 3198740242 + .long 1658384276 + .long 1050712587 + .long 3312197895 + .long 3197147657 + .long 2426751598 + .long 1048219658 + .long 2075412918 + .long 3194074453 + .long 1194511818 + .long 1044659399 + .long 2861395540 + .long 3190045864 + .long 1105252788 + .long 1040325059 + .long 278204179 + .long 3185374362 + .long 0 + .long 3223257088 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4084683796 + .long 1014352664 + .long 3549182448 + .long 1072693247 + .long 4170486715 + .long 1048984034 + .long 3652359522 + .long 3196467682 + .long 1780445294 + .long 1048420995 + .long 3329441198 + .long 3194856066 + .long 663245309 + .long 1045935418 + .long 1918070306 + .long 3191839818 + .long 4225866973 + .long 1042419329 + .long 1974315224 + .long 3187805832 + .long 847480060 + .long 1038120500 + .long 2386310431 + .long 3183105031 + .long 0 + .long 3223388160 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 951119343 + .long 1016641415 + .long 4194036288 + .long 1072693247 + .long 4207053894 + .long 1045958742 + .long 4131013457 + .long 3193442390 + .long 2503178506 + .long 1045433060 + .long 2309798544 + .long 3191868132 + .long 1503762043 + .long 1042918157 + .long 762244907 + .long 3188792499 + .long 3745081608 + .long 1039371450 + .long 3106729171 + .long 3184757959 + .long 3799011378 + .long 1035063995 + .long 693003136 + .long 3180102041 + .long 0 + .long 3223519232 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1712896388 + .long 1016000193 + .long 4281307769 + .long 1072693247 + .long 3495080264 + .long 1042943408 + .long 3483806577 + .long 3190427056 + .long 3577360645 + .long 1042374261 + .long 3557467263 + .long 3188809333 + .long 3692227868 + .long 1039911516 + .long 1459944482 + .long 3185739496 + .long 624248087 + .long 1036331657 + .long 3930021706 + .long 3181718167 + .long 439009527 + .long 1032014849 + .long 3184212578 + .long 3177110789 + .long 0 + .long 3223650304 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1958475666 + .long 1013700788 + .long 4293118680 + .long 1072693247 + .long 3829159519 + .long 1039938855 + .long 3827364885 + .long 3187422503 + .long 2374004141 + .long 1039322650 + .long 2380228874 + .long 3185757722 + .long 853065064 + .long 1036916376 + .long 3897809499 + .long 3182694159 + .long 2467115425 + .long 1033300621 + .long 2966460473 + .long 3178687133 + .long 4249027489 + .long 1028973684 + .long 3391824522 + .long 3174085926 + .long 0 + .long 3223781376 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1028808661 + .long 1012328597 + .long 4294717113 + .long 1072693247 + .long 2759857858 + .long 1036945975 + .long 2759440340 + .long 3184429623 + .long 217750550 + .long 1036278821 + .long 228557927 + .long 3182713893 + .long 868996329 + .long 1033914811 + .long 130294465 + .long 3179657124 + .long 3979034581 + .long 1030279068 + .long 1690522291 + .long 3175665582 + .long 141102418 + .long 1025941166 + .long 3942643114 + .long 3171030731 + .long 0 + .long 3223912448 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2461075155 + .long 1015729939 + .long 4294933437 + .long 1072693247 + .long 2559161110 + .long 1033930834 + .long 2559046852 + .long 3181414482 + .long 3206412049 + .long 1033243416 + .long 3218709064 + .long 3179678488 + .long 2091270467 + .long 1030857342 + .long 245853585 + .long 3176629075 + .long 1555900931 + .long 1027267783 + .long 1186881303 + .long 3172654298 + .long 1695278520 + .long 1022918007 + .long 1853146834 + .long 3167983022 + .long 0 + .long 3224043520 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2502502488 + .long 1016572066 + .long 4294962713 + .long 1072693247 + .long 3137376149 + .long 1030874690 + .long 3137268820 + .long 3178358338 + .long 1097103169 + .long 1030217134 + .long 1110504267 + .long 3176652206 + .long 1068377398 + .long 1027807171 + .long 222176953 + .long 3173610756 + .long 3440315131 + .long 1024267613 + .long 1199778592 + .long 3169654130 + .long 257981480 + .long 1019904983 + .long 1388437918 + .long 3164943417 + .long 0 + .long 3224174592 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3418697838 + .long 1016821878 + .long 4294966675 + .long 1072693247 + .long 3798207862 + .long 1027825953 + .long 3798094058 + .long 3175309601 + .long 3391459718 + .long 1027200727 + .long 3405981646 + .long 3173635799 + .long 3694208074 + .long 1024764900 + .long 2192272311 + .long 3170602971 + .long 1464408928 + .long 1021279479 + .long 2201370875 + .long 3166665997 + .long 4139632468 + .long 1016902930 + .long 2981161402 + .long 3161912586 + .long 0 + .long 3224305664 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3589768515 + .long 1013972501 + .long 4294967265 + .long 1072693247 + .long 2293865510 + .long 1023336450 + .long 2097549026 + .long 3170820098 + .long 2721138850 + .long 1022661962 + .long 1571631120 + .long 3169097035 + .long 3716649917 + .long 1020295299 + .long 3146231247 + .long 3166041588 + .long 84506245 + .long 1016656297 + .long 2231398946 + .long 3162043093 + .long 3305646943 + .long 1012441980 + .long 402214167 + .long 3157503609 + .long 0 + .long 3224436736 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2152156943 + .long 1016184605 + .long 4294967294 + .long 1072693247 + .long 1074684533 + .long 1018634353 + .long 1074437943 + .long 3166118001 + .long 967276073 + .long 1018090988 + .long 995296768 + .long 3164526060 + .long 4275132894 + .long 1015589675 + .long 304133116 + .long 3161485853 + .long 1232215992 + .long 1012058464 + .long 559363548 + .long 3157444977 + .long 1487618473 + .long 1007759094 + .long 2355811294 + .long 3152771929 + .long 3381626085 + .long 3224537056 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4294967295 + .long 0 + .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 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 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 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .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_dtanh_data_internal,@object + .size __svml_dtanh_data_internal,10816 + .align 8 + +__dtanh_la__imldTanhTab: + .long 0 + .long 1072693248 + .long 0 + .long 3220176896 + .type __dtanh_la__imldTanhTab,@object + .size __dtanh_la__imldTanhTab,16 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S new file mode 100644 index 0000000000..80e85c47ec --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized tanh, 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_tanh _ZGVdN4v_tanh_sse_wrapper +#include "../svml_d_tanh4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c new file mode 100644 index 0000000000..a26e62052b --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized tanh, 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_tanh +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN4v_tanh, __GI__ZGVdN4v_tanh, __redirect__ZGVdN4v_tanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S new file mode 100644 index 0000000000..034628315e --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh4_core_avx2.S @@ -0,0 +1,3308 @@ +/* Function tanh 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: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.avx2,"ax",@progbits +ENTRY(_ZGVdN4v_tanh_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 2720+__svml_dtanh_data_internal(%rip), %rcx + vmovupd %ymm0, (%rsp) + +/* if VMIN, VMAX is defined for I type */ + vpxor %xmm5, %xmm5, %xmm5 + vmovups %ymm15, 320(%rsp) + vmovups %ymm14, 288(%rsp) + .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 + +/* Constant loading */ + vmovups 10688+__svml_dtanh_data_internal(%rip), %xmm14 + vmovups %ymm13, 256(%rsp) + vmovups %ymm12, 224(%rsp) + vmovups %ymm11, 192(%rsp) + vmovups %ymm10, 160(%rsp) + vmovups %ymm8, 32(%rsp) + vmovups %ymm9, 96(%rsp) + vandpd 10432+__svml_dtanh_data_internal(%rip), %ymm0, %ymm1 + vandpd 10368+__svml_dtanh_data_internal(%rip), %ymm0, %ymm2 + vextractf128 $1, %ymm0, %xmm7 + vshufps $221, %xmm7, %xmm0, %xmm6 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + vpand 10496+__svml_dtanh_data_internal(%rip), %xmm6, %xmm4 + .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 + vpsubd 10624+__svml_dtanh_data_internal(%rip), %xmm4, %xmm15 + vpcmpgtd %xmm5, %xmm15, %xmm0 + vpand %xmm0, %xmm15, %xmm13 + vpcmpgtd %xmm14, %xmm15, %xmm0 + blendvps %xmm0, %xmm14, %xmm13 + +/* + * VSHRIMM( I, iIndex, = iIndex, (17 - 4) ); + * VGATHER_MATRIX( L2D, p, TAB._dbP, iIndex, 0, T_ITEM_SIZE, T_ITEM_GRAN, 13, 0, 0 ); + */ + vpsrld $10, %xmm13, %xmm12 + vmovd %xmm12, %edx + vpcmpgtd 10560+__svml_dtanh_data_internal(%rip), %xmm4, %xmm3 + vmovmskps %xmm3, %r8d + vpextrd $1, %xmm12, %eax + movslq %edx, %rdx + movslq %eax, %rax + vpextrd $2, %xmm12, %r9d + vpextrd $3, %xmm12, %r10d + movslq %r9d, %r9 + movslq %r10d, %r10 + vmovupd -96(%rdx,%rcx), %xmm11 + vmovupd -96(%rax,%rcx), %xmm10 + vmovupd -80(%rax,%rcx), %xmm3 + vmovupd -80(%rdx,%rcx), %xmm6 + vmovupd -64(%rdx,%rcx), %xmm13 + vmovupd -64(%rax,%rcx), %xmm12 + vinsertf128 $1, -96(%r9,%rcx), %ymm11, %ymm8 + vinsertf128 $1, -96(%r10,%rcx), %ymm10, %ymm7 + vmovupd -48(%rdx,%rcx), %xmm9 + vunpckhpd %ymm7, %ymm8, %ymm0 + vmovupd -48(%rax,%rcx), %xmm8 + vinsertf128 $1, -80(%r9,%rcx), %ymm6, %ymm4 + vinsertf128 $1, -80(%r10,%rcx), %ymm3, %ymm5 + vunpcklpd %ymm5, %ymm4, %ymm15 + vunpckhpd %ymm5, %ymm4, %ymm14 + vmovupd -32(%rdx,%rcx), %xmm3 + vmovupd -32(%rax,%rcx), %xmm4 + vinsertf128 $1, -64(%r9,%rcx), %ymm13, %ymm11 + vinsertf128 $1, -48(%r9,%rcx), %ymm9, %ymm7 + vinsertf128 $1, -64(%r10,%rcx), %ymm12, %ymm10 + vinsertf128 $1, -48(%r10,%rcx), %ymm8, %ymm6 + vunpcklpd %ymm10, %ymm11, %ymm13 + vunpckhpd %ymm10, %ymm11, %ymm12 + vunpcklpd %ymm6, %ymm7, %ymm11 + vunpckhpd %ymm6, %ymm7, %ymm10 + vmovupd -16(%rdx,%rcx), %xmm7 + vmovupd -16(%rax,%rcx), %xmm6 + vinsertf128 $1, -32(%r9,%rcx), %ymm3, %ymm5 + vinsertf128 $1, -32(%r10,%rcx), %ymm4, %ymm8 + vunpcklpd %ymm8, %ymm5, %ymm9 + vunpckhpd %ymm8, %ymm5, %ymm8 + vmovupd (%rax,%rcx), %xmm5 + vinsertf128 $1, -16(%r9,%rcx), %ymm7, %ymm3 + vinsertf128 $1, -16(%r10,%rcx), %ymm6, %ymm4 + vunpcklpd %ymm4, %ymm3, %ymm7 + vunpckhpd %ymm4, %ymm3, %ymm6 + vmovupd (%rdx,%rcx), %xmm3 + vinsertf128 $1, (%r9,%rcx), %ymm3, %ymm4 + vinsertf128 $1, (%r10,%rcx), %ymm5, %ymm5 + vunpcklpd %ymm5, %ymm4, %ymm3 + vaddpd %ymm3, %ymm1, %ymm1 + vfmadd213pd %ymm7, %ymm1, %ymm6 + vfmadd213pd %ymm8, %ymm1, %ymm6 + vfmadd213pd %ymm9, %ymm1, %ymm6 + vfmadd213pd %ymm10, %ymm1, %ymm6 + vfmadd213pd %ymm11, %ymm1, %ymm6 + vfmadd213pd %ymm12, %ymm1, %ymm6 + vfmadd213pd %ymm13, %ymm1, %ymm6 + vfmadd213pd %ymm14, %ymm1, %ymm6 + vfmadd213pd %ymm15, %ymm1, %ymm6 + vfmadd213pd %ymm0, %ymm1, %ymm6 + vorpd %ymm2, %ymm6, %ymm0 + testl %r8d, %r8d + jne L(2) + +L(1): + 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 + +L(2): + vmovupd (%rsp), %ymm1 + vmovupd %ymm0, 128(%rsp) + vmovupd %ymm1, 64(%rsp) + je L(1) + 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 %r8d, %r13d + +L(3): + btl %r12d, %r13d + jc L(5) + +L(4): + incl %r12d + cmpl $4, %r12d + jl L(3) + 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 L(1) + .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 + +L(5): + lea 64(%rsp,%r12,8), %rdi + lea 128(%rsp,%r12,8), %rsi + call __svml_dtanh_cout_rare_internal + jmp L(4) + +END(_ZGVdN4v_tanh_avx2) + + .align 16,0x90 + +__svml_dtanh_cout_rare_internal: + + cfi_startproc + + lea __dtanh_la__imldTanhTab(%rip), %rdx + movb 7(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 6(%rdi), %eax + andl $32752, %eax + shrl $4, %eax + movq (%rdx,%rcx,8), %rdx + cmpl $2047, %eax + je L(9) + cmpl $2046, %eax + jne L(7) + +L(6): + movq %rdx, (%rsi) + jmp L(8) + +L(7): + movsd (%rdi), %xmm1 + movsd __dtanh_la__imldTanhTab(%rip), %xmm0 + addsd %xmm1, %xmm0 + mulsd %xmm0, %xmm1 + movsd %xmm1, (%rsi) + +L(8): + xorl %eax, %eax + ret + +L(9): + testl $1048575, 4(%rdi) + jne L(10) + cmpl $0, (%rdi) + je L(6) + +L(10): + movsd (%rdi), %xmm0 + addsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + jmp L(8) + + cfi_endproc + + .type __svml_dtanh_cout_rare_internal,@function + .size __svml_dtanh_cout_rare_internal,.-__svml_dtanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dtanh_data_internal: + .long 0 + .long 0 + .long 0 + .long 1070333952 + .long 0 + .long 1070858240 + .long 0 + .long 1071382528 + .long 0 + .long 1071906816 + .long 0 + .long 1072431104 + .long 0 + .long 1072955392 + .long 0 + .long 1073479680 + .long 0 + .long 1074003968 + .long 0 + .long 1074528256 + .long 0 + .long 1075052544 + .long 0 + .long 1075576832 + .long 0 + .long 1076101120 + .long 0 + .long 1076625408 + .long 0 + .long 1077149696 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1097497746 + .long 1070305232 + .long 2699715854 + .long 1070817176 + .long 3997728823 + .long 1071273769 + .long 3938160533 + .long 1071759175 + .long 193732629 + .long 1072072293 + .long 3144363502 + .long 1072375075 + .long 2548249895 + .long 1072570303 + .long 638218690 + .long 1072665176 + .long 3325726839 + .long 1072689426 + .long 2523455249 + .long 1072693057 + .long 2200391922 + .long 1072693244 + .long 4257836853 + .long 1072693247 + .long 4294954840 + .long 1072693247 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 3167993022 + .long 1013310014 + .long 2889539328 + .long 3159121931 + .long 394645568 + .long 1013728265 + .long 2799920971 + .long 1015161303 + .long 754366556 + .long 1013577885 + .long 3960180508 + .long 1014215657 + .long 69774042 + .long 3162475851 + .long 2161066944 + .long 3162264280 + .long 923362432 + .long 1014879086 + .long 2160345802 + .long 1014714211 + .long 3729195158 + .long 3161626453 + .long 675671997 + .long 1015336837 + .long 1141527416 + .long 1013957883 + .long 2209699952 + .long 3160643600 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 2750448946 + .long 1072596012 + .long 1257606939 + .long 1072501079 + .long 2619663609 + .long 1072338011 + .long 863303701 + .long 1072048204 + .long 2694810990 + .long 1071654144 + .long 837003456 + .long 1070723665 + .long 472162617 + .long 1069359818 + .long 532307062 + .long 1067137790 + .long 431106849 + .long 1064162173 + .long 329904022 + .long 1059572972 + .long 4080160942 + .long 1053550275 + .long 1402271583 + .long 1044493446 + .long 467296040 + .long 1032344560 + .long 26734424 + .long 1014207804 + .long 0 + .long 0 + .long 1071622681 + .long 3153114090 + .long 3948133409 + .long 3217705130 + .long 4096956694 + .long 3218184481 + .long 2616164369 + .long 3218465008 + .long 2620770434 + .long 3218641845 + .long 3075958072 + .long 3218520700 + .long 1950184789 + .long 3217978001 + .long 2686385024 + .long 3216731525 + .long 1489441818 + .long 3214597550 + .long 1992796697 + .long 3211642259 + .long 1952936976 + .long 3207056478 + .long 3904162951 + .long 3201033920 + .long 1382745445 + .long 3191977094 + .long 468673444 + .long 3179828208 + .long 3843669553 + .long 3161691483 + .long 0 + .long 0 + .long 1431655765 + .long 3218429269 + .long 3264395793 + .long 3218178991 + .long 60595194 + .long 3217824331 + .long 1837960166 + .long 3217124894 + .long 1964918946 + .long 3214033516 + .long 2998587684 + .long 1068822866 + .long 3421467326 + .long 1069267520 + .long 952003133 + .long 1068506016 + .long 1215426504 + .long 1066495476 + .long 2650572912 + .long 1063503494 + .long 4178958376 + .long 1059043758 + .long 3799805457 + .long 1052940753 + .long 3704238924 + .long 1043831645 + .long 2076585114 + .long 1031813109 + .long 1352847351 + .long 1013591371 + .long 0 + .long 0 + .long 3830371894 + .long 3169224254 + .long 74893150 + .long 1069567437 + .long 1235750664 + .long 1069825332 + .long 916043751 + .long 1069924975 + .long 4138411315 + .long 1069655686 + .long 829220656 + .long 1068441660 + .long 663246204 + .long 3213477792 + .long 652268865 + .long 3214415230 + .long 3251098232 + .long 3212868437 + .long 1480792335 + .long 3209929101 + .long 3365608027 + .long 3205478075 + .long 3330582883 + .long 3199375817 + .long 3573234945 + .long 3190266717 + .long 2061970086 + .long 3178248181 + .long 3148320390 + .long 3160026274 + .long 0 + .long 0 + .long 286337717 + .long 1069617425 + .long 4261152941 + .long 1068876190 + .long 3694459820 + .long 1067928728 + .long 2399079031 + .long 3212381546 + .long 394897286 + .long 3215735810 + .long 3073534041 + .long 3215860118 + .long 301960234 + .long 3214124960 + .long 3353887502 + .long 1064191753 + .long 4200665425 + .long 1063741482 + .long 2003926207 + .long 1061090030 + .long 2196865207 + .long 1056528964 + .long 2107880963 + .long 1050526402 + .long 3656860478 + .long 1041425071 + .long 881228218 + .long 1029305120 + .long 2612840768 + .long 1011136029 + .long 0 + .long 0 + .long 3722294196 + .long 3181505049 + .long 2573001951 + .long 3216029919 + .long 4095639908 + .long 3216151900 + .long 3272210374 + .long 3215957253 + .long 3439280785 + .long 3214441767 + .long 628273304 + .long 1066085542 + .long 3354767370 + .long 1066343670 + .long 300170709 + .long 1063270296 + .long 1870156670 + .long 3209139074 + .long 1580606479 + .long 3206808937 + .long 3818710870 + .long 3202408589 + .long 3126817102 + .long 3196311305 + .long 3320734688 + .long 3187224127 + .long 821170446 + .long 3175173312 + .long 3906480775 + .long 3156975650 + .long 0 + .long 0 + .long 428888587 + .long 3215696314 + .long 3125999356 + .long 3214336891 + .long 407196569 + .long 1053816799 + .long 886258254 + .long 1066874408 + .long 2149075781 + .long 1067351939 + .long 3888390356 + .long 1065784643 + .long 1226056234 + .long 3211994813 + .long 178100474 + .long 3210723675 + .long 4201249718 + .long 1058328572 + .long 3854015760 + .long 1057324616 + .long 3621220964 + .long 1052982118 + .long 1468766992 + .long 1046916174 + .long 2369608770 + .long 1037879115 + .long 327127732 + .long 1025754505 + .long 747046817 + .long 1007714190 + .long 0 + .long 0 + .long 4036362527 + .long 3191151783 + .long 839661649 + .long 1067363059 + .long 4269154241 + .long 1067251747 + .long 391446303 + .long 1066410535 + .long 2090623151 + .long 3211993063 + .long 1751510141 + .long 3213141508 + .long 4072216875 + .long 3209470961 + .long 3769618983 + .long 1061976030 + .long 3462945146 + .long 1057228123 + .long 3030849095 + .long 3202531084 + .long 4269010901 + .long 3198361258 + .long 742615277 + .long 3192302512 + .long 3397417437 + .long 3183265609 + .long 943110610 + .long 3171141000 + .long 371608300 + .long 3153099348 + .long 0 + .long 0 + .long 1315619150 + .long 1066820857 + .long 1001273821 + .long 3214201652 + .long 3859675203 + .long 3212560200 + .long 725858949 + .long 3213658423 + .long 2464052346 + .long 3212913056 + .long 1297319750 + .long 1063307355 + .long 563735576 + .long 1062988089 + .long 2756222736 + .long 3207203944 + .long 31207338 + .long 3204466214 + .long 434022900 + .long 1052227234 + .long 2370591882 + .long 1048628172 + .long 588930601 + .long 1042556347 + .long 3198977634 + .long 1033474724 + .long 1590950759 + .long 1021415866 + .long 195904708 + .long 1003000389 + .long 0 + .long 0 + .long 4252521214 + .long 3198731457 + .long 2969857811 + .long 3217870358 + .long 575387574 + .long 3212943727 + .long 67550217 + .long 3210922992 + .long 2955736731 + .long 1064678043 + .long 4193848343 + .long 1063288304 + .long 1845975253 + .long 3209397546 + .long 1025213509 + .long 3204479174 + .long 3713384058 + .long 1055658730 + .long 4120057883 + .long 3194988032 + .long 1573797757 + .long 3193584787 + .long 2514726550 + .long 3187678317 + .long 15343571 + .long 3178526042 + .long 104576940 + .long 3166444652 + .long 1147207168 + .long 3148070554 + .long 0 + .long 0 + .long 1467656669 + .long 3212977156 + .long 4154993315 + .long 1077775111 + .long 2465966858 + .long 3214886059 + .long 71777642 + .long 1068690118 + .long 2419763912 + .long 1061550205 + .long 1896047360 + .long 3210612806 + .long 3723555648 + .long 1058651288 + .long 3163703016 + .long 1057833732 + .long 1601936705 + .long 3201383489 + .long 2535509424 + .long 3195153293 + .long 3610885824 + .long 1043474022 + .long 1031698712 + .long 1037527637 + .long 1497459257 + .long 1028514042 + .long 3476455860 + .long 1016366870 + .long 758110873 + .long 998719391 + .long 0 + .long 0 + .long 572446067 + .long 3204307354 + .long 926268084 + .long 1081104698 + .long 1313112926 + .long 3217861477 + .long 3660716 + .long 1070677720 + .long 124568711 + .long 3210757561 + .long 2123022704 + .long 1059096046 + .long 576783408 + .long 1059279430 + .long 1651052980 + .long 3204387494 + .long 3164866735 + .long 1051430920 + .long 409335328 + .long 1046695415 + .long 3481520755 + .long 3188046619 + .long 1140549474 + .long 3182373569 + .long 708689751 + .long 3173247717 + .long 2627769694 + .long 3161153086 + .long 3804346926 + .long 3143551592 + .long 0 + .long 0 + .long 2302818369 + .long 1064188902 + .long 526101185 + .long 3235013457 + .long 2975776348 + .long 1075224435 + .long 1103981749 + .long 3223699933 + .long 4261798097 + .long 3210280329 + .long 30781306 + .long 1064564655 + .long 3939597931 + .long 3206430909 + .long 1816466405 + .long 1055007949 + .long 3868125859 + .long 3190076997 + .long 4218600579 + .long 3192569835 + .long 4167655123 + .long 1037376568 + .long 952533803 + .long 1032000428 + .long 895641221 + .long 1022851193 + .long 1237761065 + .long 1010835452 + .long 2902086315 + .long 3133082401 + .long 0 + .long 0 + .long 1899646778 + .long 3207205638 + .long 2434183270 + .long 3238288976 + .long 621380814 + .long 1078065849 + .long 247717525 + .long 3225783561 + .long 1611742563 + .long 3212088477 + .long 537725662 + .long 1065131990 + .long 3769436831 + .long 1057148224 + .long 3759797009 + .long 3196422840 + .long 842759416 + .long 3195613094 + .long 1736926210 + .long 1043198029 + .long 3915271468 + .long 3180709675 + .long 807416070 + .long 3176507548 + .long 3147759461 + .long 3167409843 + .long 3443382404 + .long 3155325020 + .long 1202615797 + .long 3129870924 + .long 0 + .long 0 + .long 1841653873 + .long 3210074087 + .long 2157744327 + .long 1095928888 + .long 3038317314 + .long 3229013375 + .long 2291108570 + .long 1082519711 + .long 707775397 + .long 1067599411 + .long 445214669 + .long 3216153989 + .long 3815354898 + .long 1054410330 + .long 1285070896 + .long 3199787450 + .long 1722630166 + .long 1047526663 + .long 2672844635 + .long 3188483010 + .long 1805520457 + .long 3179260705 + .long 542550567 + .long 1026041526 + .long 392361251 + .long 1017320419 + .long 562647833 + .long 1005205418 + .long 4253488278 + .long 988137457 + .long 0 + .long 0 + .long 3077187303 + .long 1060497018 + .long 1652392454 + .long 1099206368 + .long 414484972 + .long 3231848150 + .long 130592591 + .long 1084602513 + .long 1951534810 + .long 1068932483 + .long 2677544726 + .long 3216895313 + .long 2338009969 + .long 3203411240 + .long 302629286 + .long 1051889816 + .long 1274412910 + .long 3193339538 + .long 3731558070 + .long 1038350327 + .long 3135499196 + .long 1030352152 + .long 1329461873 + .long 3170325324 + .long 4058709792 + .long 3161656179 + .long 2167788642 + .long 3149540607 + .long 1602064437 + .long 3132466971 + .long 0 + .long 0 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 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 0 + .long 0 + .long 1072693248 + .long 3616958675 + .long 3172564458 + .long 1431547708 + .long 3218429269 + .long 3390261318 + .long 3188010876 + .long 1446529494 + .long 1069617425 + .long 913571762 + .long 3199219810 + .long 1583612462 + .long 3215695720 + .long 2995724807 + .long 3207222498 + .long 847913742 + .long 1066913721 + .long 1634876930 + .long 3212167789 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1694159514 + .long 1010239653 + .long 966318664 + .long 1069606551 + .long 2992375944 + .long 1072656686 + .long 1870405289 + .long 3217070889 + .long 1411308967 + .long 3218333047 + .long 4096824853 + .long 1068863484 + .long 2220740425 + .long 1069365950 + .long 1401698298 + .long 3215430111 + .long 4137473768 + .long 3215259762 + .long 2666938667 + .long 1066889956 + .long 121190665 + .long 1066187784 + .long 821637913 + .long 3213226090 + .long 0 + .long 3217096704 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1463410348 + .long 1012925678 + .long 2389577058 + .long 1069735062 + .long 1617794783 + .long 1072647710 + .long 1889094329 + .long 3217191869 + .long 1210518828 + .long 3218309813 + .long 1479174953 + .long 1069010221 + .long 3435917531 + .long 1069290104 + .long 291210913 + .long 3215575029 + .long 464478606 + .long 3215159746 + .long 1063797118 + .long 1067014292 + .long 3489481042 + .long 1065955541 + .long 2916293494 + .long 3213319415 + .long 0 + .long 3217227776 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1308961311 + .long 1014934498 + .long 2204208241 + .long 1069862983 + .long 2945950899 + .long 1072637797 + .long 1107689125 + .long 3217310565 + .long 545938327 + .long 3218284334 + .long 3174275192 + .long 1069150773 + .long 3754729793 + .long 1069207728 + .long 1611554958 + .long 3215708601 + .long 2936527704 + .long 3215052478 + .long 2983784402 + .long 1067121823 + .long 1327150338 + .long 1065710404 + .long 3371320326 + .long 3213391099 + .long 0 + .long 3217358848 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3546392464 + .long 1015001497 + .long 631120375 + .long 1069990256 + .long 1201634405 + .long 1072626967 + .long 266657677 + .long 3217426771 + .long 1567732958 + .long 3218256710 + .long 883708059 + .long 1069284653 + .long 1008115966 + .long 1069119372 + .long 2657338981 + .long 3215830093 + .long 3402640736 + .long 3214939036 + .long 1000796573 + .long 1067211764 + .long 53805889 + .long 1065455799 + .long 1736607114 + .long 3213440608 + .long 0 + .long 3217489920 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2741128528 + .long 1013617020 + .long 3111451323 + .long 1070116823 + .long 1649040643 + .long 1072615239 + .long 3411009101 + .long 3217540290 + .long 3408666525 + .long 3218227049 + .long 60831764 + .long 1069411415 + .long 64016149 + .long 1069025616 + .long 1202785467 + .long 3215938891 + .long 1072151579 + .long 3214707060 + .long 1534357116 + .long 1067283570 + .long 4218468492 + .long 1065037194 + .long 2285827787 + .long 3213467810 + .long 0 + .long 3217620992 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2659584459 + .long 1014368295 + .long 3537749475 + .long 1070242630 + .long 3072983457 + .long 1072602635 + .long 3507245872 + .long 3217650938 + .long 3434758212 + .long 3218195466 + .long 3801643091 + .long 1069530660 + .long 1128653951 + .long 1068927067 + .long 3580298628 + .long 3216008547 + .long 1645082338 + .long 3214462237 + .long 1048857889 + .long 1067336943 + .long 21547694 + .long 1064510970 + .long 1433152914 + .long 3213472968 + .long 0 + .long 3217752064 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2718912981 + .long 1013914074 + .long 1823051285 + .long 1070367623 + .long 1714227149 + .long 1072589179 + .long 2128046799 + .long 3217758540 + .long 2655098722 + .long 3218162081 + .long 1690074008 + .long 1069594780 + .long 353091525 + .long 1068824353 + .long 4206393496 + .long 3216049578 + .long 824478721 + .long 3214211899 + .long 3850924188 + .long 1067371825 + .long 2738209029 + .long 1063668369 + .long 853664366 + .long 3213456718 + .long 0 + .long 3217883136 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2312638749 + .long 1013630664 + .long 4267025360 + .long 1070491748 + .long 3776362539 + .long 1072574894 + .long 3063840907 + .long 3217862932 + .long 2436606365 + .long 3218127019 + .long 582931594 + .long 1069646387 + .long 3079837843 + .long 1068718114 + .long 3430470362 + .long 3216083715 + .long 1015897693 + .long 3213958348 + .long 765047087 + .long 1067388396 + .long 2337193368 + .long 1061824569 + .long 3002775972 + .long 3213420044 + .long 0 + .long 3218014208 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2001712669 + .long 1015665334 + .long 1330879460 + .long 1070636148 + .long 2956987714 + .long 1072551971 + .long 4281360332 + .long 3218013175 + .long 3304213057 + .long 3218063389 + .long 3261945160 + .long 1069715874 + .long 3866284424 + .long 1068553570 + .long 3423706630 + .long 3216121886 + .long 259493169 + .long 3213268437 + .long 4223676832 + .long 1067379852 + .long 2765317642 + .long 3210752240 + .long 2292494069 + .long 3213329490 + .long 0 + .long 3218145280 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1632443533 + .long 1015769771 + .long 3788472163 + .long 1070757367 + .long 2406795724 + .long 1072518757 + .long 1173083542 + .long 3218140352 + .long 3726086528 + .long 3217906251 + .long 1205028711 + .long 1069793280 + .long 2231197855 + .long 1068156878 + .long 2368637763 + .long 3216148628 + .long 2866127296 + .long 3211617797 + .long 2424606359 + .long 1067309831 + .long 2444940724 + .long 3212180962 + .long 3308128888 + .long 3213151909 + .long 0 + .long 3218276352 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 478834383 + .long 1014053288 + .long 1342399495 + .long 1070876422 + .long 2650660168 + .long 1072482726 + .long 976724127 + .long 3218226669 + .long 962417089 + .long 3217740546 + .long 1060150306 + .long 1069852926 + .long 411739190 + .long 1067700577 + .long 3846786712 + .long 3216148687 + .long 4007187252 + .long 1064073475 + .long 3455779574 + .long 1067180067 + .long 1865169557 + .long 3212900393 + .long 1200620699 + .long 3212923615 + .long 0 + .long 3218407424 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 267289397 + .long 1014452734 + .long 302318249 + .long 1070993143 + .long 1373990511 + .long 1072444121 + .long 1606419704 + .long 3218305061 + .long 3955669825 + .long 3217568496 + .long 2701083439 + .long 1069894809 + .long 3425188888 + .long 1067047616 + .long 2305426029 + .long 3216123827 + .long 1692531481 + .long 1065641523 + .long 232815703 + .long 1067000535 + .long 3949954748 + .long 3213214884 + .long 558890519 + .long 3212487521 + .long 0 + .long 3218538496 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1719941932 + .long 1006528498 + .long 368840470 + .long 1071107377 + .long 1825320027 + .long 1072403193 + .long 538136722 + .long 3218375283 + .long 1431312010 + .long 3217392305 + .long 2586725425 + .long 1069919291 + .long 2680871675 + .long 1065941593 + .long 4123661982 + .long 3216076488 + .long 4235496382 + .long 1066406926 + .long 2618960092 + .long 1066782660 + .long 2333865044 + .long 3213444845 + .long 1545458959 + .long 3211934181 + .long 0 + .long 3218669568 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 26286236 + .long 1013191219 + .long 990113957 + .long 1071218987 + .long 3284199501 + .long 1072360200 + .long 2981906127 + .long 3218437190 + .long 3154396333 + .long 3217214106 + .long 4182117656 + .long 1069927061 + .long 903677379 + .long 3207343530 + .long 384743261 + .long 3216009637 + .long 1679228359 + .long 1066734193 + .long 3407026595 + .long 1066538544 + .long 784962854 + .long 3213588186 + .long 1956733412 + .long 3210979700 + .long 0 + .long 3218800640 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1468217372 + .long 1015658399 + .long 2570814109 + .long 1071327852 + .long 532296332 + .long 1072315404 + .long 318213600 + .long 3218490738 + .long 3661105766 + .long 3217035931 + .long 4085840862 + .long 1069919095 + .long 2798312316 + .long 3213370099 + .long 1668326589 + .long 3215870599 + .long 3158013712 + .long 1066998409 + .long 673205579 + .long 1066158659 + .long 486665227 + .long 3213647762 + .long 3317145528 + .long 3208570948 + .long 0 + .long 3218931712 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2060955015 + .long 1014233667 + .long 2567098181 + .long 1071433868 + .long 1159081245 + .long 1072269064 + .long 1492598184 + .long 3218535971 + .long 1567055841 + .long 3216688180 + .long 2821222425 + .long 1069896605 + .long 3691290783 + .long 3214336992 + .long 343679101 + .long 3215679175 + .long 1878686296 + .long 1067197462 + .long 125933636 + .long 1065636281 + .long 421076939 + .long 3213630573 + .long 3748848474 + .long 1062499186 + .long 0 + .long 3219062784 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1860475216 + .long 1015320544 + .long 439764829 + .long 1071587361 + .long 3870821058 + .long 1072197223 + .long 1430736283 + .long 3218588540 + .long 1597812790 + .long 3216174065 + .long 2398544810 + .long 1069838732 + .long 961452807 + .long 3215095800 + .long 716310499 + .long 3215360049 + .long 2337792646 + .long 1067375770 + .long 3863538422 + .long 1064417477 + .long 2203480844 + .long 3213482785 + .long 2389621902 + .long 1063978354 + .long 0 + .long 3219193856 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 517838046 + .long 1015294339 + .long 2114713104 + .long 1071713012 + .long 2046328558 + .long 1072098392 + .long 29352448 + .long 3218631376 + .long 1533416325 + .long 3215079684 + .long 765247815 + .long 1069724759 + .long 24381189 + .long 3215564623 + .long 1213155449 + .long 3214886044 + .long 379420126 + .long 1067409218 + .long 3127061143 + .long 3210809777 + .long 3193663073 + .long 3213128287 + .long 2557278876 + .long 1064581282 + .long 0 + .long 3219324928 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 201012485 + .long 1013704982 + .long 4147262407 + .long 1071803766 + .long 3048814903 + .long 1071997795 + .long 1260857726 + .long 3218645540 + .long 270462819 + .long 3209873967 + .long 874660781 + .long 1069580732 + .long 1251156804 + .long 3215866075 + .long 3568210118 + .long 3214014484 + .long 3784557811 + .long 1067255146 + .long 47772576 + .long 3212562613 + .long 2075700783 + .long 3212539455 + .long 1121561449 + .long 1064698735 + .long 0 + .long 3219456000 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 72370286 + .long 1015768239 + .long 2345366573 + .long 1071888223 + .long 3155310239 + .long 1071897123 + .long 4105462806 + .long 3218634383 + .long 2329529114 + .long 1067280331 + .long 3078782452 + .long 1069291148 + .long 2210998062 + .long 3215997483 + .long 1498585052 + .long 3212353515 + .long 3032692199 + .long 1066974465 + .long 809329973 + .long 3213081308 + .long 2713838579 + .long 3211547879 + .long 1266611175 + .long 1064568889 + .long 0 + .long 3219587072 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2137918782 + .long 1013598293 + .long 2511343836 + .long 1071966424 + .long 4205808243 + .long 1071797842 + .long 2776384587 + .long 3218601667 + .long 3824787134 + .long 1068202086 + .long 4101819712 + .long 1068956189 + .long 3547601806 + .long 3216004360 + .long 4156237724 + .long 1064058621 + .long 3714924071 + .long 1066627770 + .long 2925917146 + .long 3213234133 + .long 4211598888 + .long 3209111151 + .long 2569808389 + .long 1064277859 + .long 0 + .long 3219718144 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2979324843 + .long 1013692066 + .long 2595126306 + .long 1072038496 + .long 4263058559 + .long 1071701178 + .long 2217257467 + .long 3218551298 + .long 2310932059 + .long 1068685603 + .long 3368327571 + .long 1068627625 + .long 3037419246 + .long 3215935424 + .long 3509936675 + .long 1065724141 + .long 1557247226 + .long 1066131548 + .long 3830787958 + .long 3213205743 + .long 1781883284 + .long 1062575914 + .long 3918078093 + .long 1063614197 + .long 0 + .long 3219849216 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3630992244 + .long 1015034507 + .long 461360001 + .long 1072104635 + .long 2866201612 + .long 1071571556 + .long 1021729265 + .long 3218487113 + .long 1039036234 + .long 1068940858 + .long 1685105679 + .long 1068140011 + .long 1856275853 + .long 3215769620 + .long 2211306181 + .long 1066373046 + .long 3739405201 + .long 1065456917 + .long 3870269089 + .long 3213053509 + .long 427599213 + .long 1063593231 + .long 40698732 + .long 1062709094 + .long 0 + .long 3219980288 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4017840557 + .long 1014067070 + .long 2764932206 + .long 1072165089 + .long 3362970633 + .long 1071394124 + .long 2677206355 + .long 3218412713 + .long 1827861303 + .long 1069122666 + .long 2476388705 + .long 1067583638 + .long 523365901 + .long 3215556224 + .long 1203249285 + .long 1066574111 + .long 4264074292 + .long 1064402288 + .long 3556167213 + .long 3212827889 + .long 3894081206 + .long 1063908871 + .long 2161178761 + .long 1061130844 + .long 0 + .long 3220111360 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3622330478 + .long 1016273425 + .long 923638641 + .long 1072245755 + .long 239419665 + .long 1071146518 + .long 4085259706 + .long 3218288969 + .long 1284806809 + .long 1069276013 + .long 2806747971 + .long 1066232498 + .long 75259250 + .long 3215197393 + .long 2597116185 + .long 1066648701 + .long 1680670491 + .long 3208755029 + .long 446818184 + .long 3212096816 + .long 1529495144 + .long 1063888972 + .long 808619025 + .long 3208443000 + .long 0 + .long 3220242432 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 462410646 + .long 1015565639 + .long 3157363066 + .long 1072336316 + .long 87541994 + .long 1070853747 + .long 2905067058 + .long 3218115077 + .long 1081050294 + .long 1069306453 + .long 4130581086 + .long 3212259234 + .long 1279737796 + .long 3214531982 + .long 901138781 + .long 1066501065 + .long 978916480 + .long 3211806490 + .long 1307294116 + .long 3210755549 + .long 1154728319 + .long 1063409950 + .long 983243444 + .long 3209435485 + .long 0 + .long 3220373504 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2617212772 + .long 1016126748 + .long 2762378177 + .long 1072409936 + .long 1926160805 + .long 1070604218 + .long 4131898582 + .long 3217810482 + .long 3068505203 + .long 1069203346 + .long 2854543895 + .long 3214027139 + .long 1276437050 + .long 3213652513 + .long 523800203 + .long 1066060621 + .long 3030576699 + .long 3212054264 + .long 210618624 + .long 3205409267 + .long 3515290542 + .long 1062456384 + .long 1613351841 + .long 3209185464 + .long 0 + .long 3220504576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2178033281 + .long 1016051223 + .long 859883711 + .long 1072469258 + .long 4248327203 + .long 1070195167 + .long 4170103331 + .long 3217497647 + .long 3497702842 + .long 1069026027 + .long 669705965 + .long 3214426190 + .long 548733038 + .long 3212258725 + .long 1756337187 + .long 1065503890 + .long 1830841059 + .long 3211930343 + .long 1445563742 + .long 1061912703 + .long 2113494314 + .long 1060991234 + .long 1734825467 + .long 3208559895 + .long 0 + .long 3220635648 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1674478116 + .long 1016412476 + .long 1178764976 + .long 1072516719 + .long 1119346206 + .long 1069851736 + .long 1526584272 + .long 3217221512 + .long 3575463915 + .long 1068817773 + .long 2913683612 + .long 3214542291 + .long 1135909212 + .long 3207879094 + .long 1952394810 + .long 1064725296 + .long 508910559 + .long 3211537545 + .long 225204077 + .long 1062311155 + .long 1009857186 + .long 1056234420 + .long 2872841632 + .long 3207480811 + .long 0 + .long 3220766720 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1768234410 + .long 1014305046 + .long 1496797583 + .long 1072554475 + .long 3351833521 + .long 1069572393 + .long 68183265 + .long 3216938851 + .long 4178655528 + .long 1068606905 + .long 60791550 + .long 3214483781 + .long 1856281737 + .long 1063701265 + .long 4260560897 + .long 1063778674 + .long 2539586291 + .long 3210979253 + .long 2272785608 + .long 1062198907 + .long 1986161572 + .long 3206910344 + .long 1016667904 + .long 3205797138 + .long 0 + .long 3220897792 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3074583847 + .long 1017063845 + .long 4092570620 + .long 1072584374 + .long 3645618684 + .long 1069147119 + .long 1980755111 + .long 3216542681 + .long 889928399 + .long 1068320928 + .long 1360064809 + .long 3214330986 + .long 2266432388 + .long 1064407878 + .long 4147854841 + .long 1062471610 + .long 1812350685 + .long 3210287970 + .long 3710399832 + .long 1061728481 + .long 2458127659 + .long 3207279138 + .long 287360833 + .long 3197756422 + .long 0 + .long 3221028864 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 68970445 + .long 1013643458 + .long 3990219923 + .long 1072607967 + .long 97498680 + .long 1068787106 + .long 4136450559 + .long 3216216395 + .long 147179316 + .long 1067971098 + .long 1625987424 + .long 3214138005 + .long 3965878798 + .long 1064539455 + .long 3777445436 + .long 1059539413 + .long 3029913178 + .long 3209512624 + .long 2162291908 + .long 1061245910 + .long 351053474 + .long 3207087984 + .long 3766283083 + .long 1056943188 + .long 0 + .long 3221159936 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3139580402 + .long 1014663922 + .long 3748810696 + .long 1072634260 + .long 3154943320 + .long 1068262833 + .long 3181856712 + .long 3215694135 + .long 3656356636 + .long 1067539266 + .long 3897588284 + .long 3213798616 + .long 1461831298 + .long 1064461217 + .long 2900114226 + .long 3208814642 + .long 2606420357 + .long 3207868903 + .long 1741152094 + .long 1060222230 + .long 1469206701 + .long 3206514441 + .long 3518993813 + .long 1057090958 + .long 0 + .long 3221291008 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3285908565 + .long 1015477239 + .long 1797956315 + .long 1072657271 + .long 3302471936 + .long 1067543167 + .long 2151339553 + .long 3215007235 + .long 362228095 + .long 1066797401 + .long 3986406156 + .long 3213131380 + .long 388353381 + .long 1064042359 + .long 4147910906 + .long 3209239839 + .long 1739922885 + .long 1056259812 + .long 3188561056 + .long 1058406709 + .long 489122368 + .long 3205182155 + .long 202560853 + .long 1056234231 + .long 0 + .long 3221422080 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3806705628 + .long 1008327668 + .long 884432573 + .long 1072671353 + .long 137405484 + .long 1066747168 + .long 3531994812 + .long 3214216262 + .long 3217445183 + .long 1066105333 + .long 2910288024 + .long 3212464301 + .long 3196212707 + .long 1063467545 + .long 3156563895 + .long 3208963593 + .long 3591285453 + .long 1058733242 + .long 2889132271 + .long 1055392886 + .long 1038377961 + .long 3203561698 + .long 4084672077 + .long 1055001082 + .long 0 + .long 3221553152 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1881957148 + .long 1016569186 + .long 3451706443 + .long 1072679940 + .long 143468186 + .long 1066002557 + .long 553724800 + .long 3213475431 + .long 1049442771 + .long 1065415105 + .long 3378521943 + .long 3211821787 + .long 3176008209 + .long 1062800361 + .long 4016898691 + .long 3208498219 + .long 1548390021 + .long 1058670598 + .long 2097418483 + .long 3202689041 + .long 2756703589 + .long 3201351283 + .long 506736184 + .long 1053405377 + .long 0 + .long 3221684224 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 450339788 + .long 1015040915 + .long 2959639058 + .long 1072685166 + .long 2289443405 + .long 1065320893 + .long 3331959139 + .long 3212796584 + .long 724199976 + .long 1064616734 + .long 938566183 + .long 3211030741 + .long 1640535667 + .long 1062186735 + .long 187996035 + .long 3207841256 + .long 822311531 + .long 1058246461 + .long 160890851 + .long 3203087480 + .long 3163291388 + .long 1050479733 + .long 578249940 + .long 1051474021 + .long 0 + .long 3221815296 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 539445753 + .long 1012635531 + .long 3085578536 + .long 1072688342 + .long 2019637246 + .long 1064510347 + .long 2901018414 + .long 3211991061 + .long 2171427566 + .long 1063868144 + .long 678185093 + .long 3210287638 + .long 2685165718 + .long 1061401571 + .long 710336199 + .long 3207152667 + .long 2733135798 + .long 1057659331 + .long 886948177 + .long 3202751664 + .long 3345834247 + .long 1052218043 + .long 908728048 + .long 1047925874 + .long 0 + .long 3221946368 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4240302093 + .long 1016867082 + .long 1832260410 + .long 1072690271 + .long 154153694 + .long 1063730412 + .long 2094548181 + .long 3211211898 + .long 1392727515 + .long 1063180837 + .long 3132890025 + .long 3209604411 + .long 483611698 + .long 1060651750 + .long 4246355421 + .long 3206519479 + .long 1424637421 + .long 1057044161 + .long 2138185318 + .long 3202290304 + .long 2276282642 + .long 1052095798 + .long 4227780935 + .long 3196067472 + .long 0 + .long 3222077440 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2485733495 + .long 1017000498 + .long 484092514 + .long 1072691442 + .long 1653085170 + .long 1063007344 + .long 2893019346 + .long 3210489400 + .long 878866243 + .long 1062388018 + .long 2113174452 + .long 3208818852 + .long 2654141437 + .long 1059959432 + .long 3578550869 + .long 3205727739 + .long 315005006 + .long 1056288680 + .long 3246956604 + .long 3201593495 + .long 2197286540 + .long 1051718329 + .long 3044885069 + .long 3196227269 + .long 0 + .long 3222208512 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2794994668 + .long 1016833037 + .long 3287420517 + .long 1072692394 + .long 4133778764 + .long 1061857404 + .long 689562148 + .long 3209340342 + .long 1404089106 + .long 1061273627 + .long 1292441425 + .long 3207706805 + .long 93671116 + .long 1058816787 + .long 2903327974 + .long 3204626398 + .long 4279279273 + .long 1055202414 + .long 134688023 + .long 3200552187 + .long 3315379764 + .long 1050761310 + .long 2945780649 + .long 3195568939 + .long 0 + .long 3222339584 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2135621136 + .long 1016053539 + .long 309961636 + .long 1072692934 + .long 672792810 + .long 1060347512 + .long 2960305506 + .long 3207830967 + .long 1703867620 + .long 1059726750 + .long 824905914 + .long 3206160796 + .long 3036017847 + .long 1057284422 + .long 923304464 + .long 3203122673 + .long 1848642304 + .long 1053791859 + .long 2215350763 + .long 3199158388 + .long 3049848127 + .long 1049324210 + .long 3861893815 + .long 3194293196 + .long 0 + .long 3222470656 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2236028675 + .long 1016891036 + .long 2177293363 + .long 1072693132 + .long 776830057 + .long 1058856794 + .long 4190004158 + .long 3206340337 + .long 209955488 + .long 1058225857 + .long 845130443 + .long 3204660651 + .long 4204313304 + .long 1055835544 + .long 364525198 + .long 3201597210 + .long 3889299905 + .long 1052205563 + .long 1514389355 + .long 3197586647 + .long 1706817756 + .long 1047834665 + .long 3817417318 + .long 3192934132 + .long 0 + .long 3222601728 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1074033072 + .long 1013200912 + .long 2197899301 + .long 1072693205 + .long 1097614282 + .long 1057308273 + .long 209489097 + .long 3204791893 + .long 3641526339 + .long 1056723664 + .long 1792794946 + .long 3203158586 + .long 584598707 + .long 1054254910 + .long 253996240 + .long 3200135633 + .long 642640562 + .long 1050754580 + .long 3147361740 + .long 3196139610 + .long 1167319222 + .long 1046395158 + .long 3488053038 + .long 3191370264 + .long 0 + .long 3222732800 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 871679747 + .long 1016222468 + .long 1586311569 + .long 1072693232 + .long 4199724405 + .long 1055867613 + .long 3041006250 + .long 3203351246 + .long 482130003 + .long 1055184672 + .long 1689676855 + .long 3201619703 + .long 116121201 + .long 1052814264 + .long 4166318198 + .long 3198564764 + .long 388552649 + .long 1049191609 + .long 1384400086 + .long 3194577312 + .long 135589376 + .long 1044819515 + .long 2497367318 + .long 3189906305 + .long 0 + .long 3222863872 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 752986014 + .long 1014740322 + .long 1072834312 + .long 1072693242 + .long 1389704451 + .long 1054277685 + .long 817998738 + .long 3201761329 + .long 996777029 + .long 1053731553 + .long 811547911 + .long 3200166603 + .long 1604093935 + .long 1051232383 + .long 2381858127 + .long 3197131472 + .long 806055999 + .long 1047703656 + .long 443662424 + .long 3193089938 + .long 2855612429 + .long 1043379518 + .long 3671581230 + .long 3188373004 + .long 0 + .long 3222994944 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4161630806 + .long 1015796140 + .long 3799386689 + .long 1072693245 + .long 516062805 + .long 1052830799 + .long 6188716 + .long 3200314446 + .long 79447568 + .long 1052151909 + .long 223529141 + .long 3198586975 + .long 1557009707 + .long 1049758991 + .long 1527834451 + .long 3195539792 + .long 3841571054 + .long 1046184222 + .long 3228035136 + .long 3191570603 + .long 2497745717 + .long 1041799395 + .long 3127975351 + .long 3186863029 + .long 0 + .long 3223126016 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3013228433 + .long 1015734301 + .long 952591976 + .long 1072693247 + .long 3849195912 + .long 1051256594 + .long 1248135057 + .long 3198740242 + .long 1658384276 + .long 1050712587 + .long 3312197895 + .long 3197147657 + .long 2426751598 + .long 1048219658 + .long 2075412918 + .long 3194074453 + .long 1194511818 + .long 1044659399 + .long 2861395540 + .long 3190045864 + .long 1105252788 + .long 1040325059 + .long 278204179 + .long 3185374362 + .long 0 + .long 3223257088 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4084683796 + .long 1014352664 + .long 3549182448 + .long 1072693247 + .long 4170486715 + .long 1048984034 + .long 3652359522 + .long 3196467682 + .long 1780445294 + .long 1048420995 + .long 3329441198 + .long 3194856066 + .long 663245309 + .long 1045935418 + .long 1918070306 + .long 3191839818 + .long 4225866973 + .long 1042419329 + .long 1974315224 + .long 3187805832 + .long 847480060 + .long 1038120500 + .long 2386310431 + .long 3183105031 + .long 0 + .long 3223388160 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 951119343 + .long 1016641415 + .long 4194036288 + .long 1072693247 + .long 4207053894 + .long 1045958742 + .long 4131013457 + .long 3193442390 + .long 2503178506 + .long 1045433060 + .long 2309798544 + .long 3191868132 + .long 1503762043 + .long 1042918157 + .long 762244907 + .long 3188792499 + .long 3745081608 + .long 1039371450 + .long 3106729171 + .long 3184757959 + .long 3799011378 + .long 1035063995 + .long 693003136 + .long 3180102041 + .long 0 + .long 3223519232 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1712896388 + .long 1016000193 + .long 4281307769 + .long 1072693247 + .long 3495080264 + .long 1042943408 + .long 3483806577 + .long 3190427056 + .long 3577360645 + .long 1042374261 + .long 3557467263 + .long 3188809333 + .long 3692227868 + .long 1039911516 + .long 1459944482 + .long 3185739496 + .long 624248087 + .long 1036331657 + .long 3930021706 + .long 3181718167 + .long 439009527 + .long 1032014849 + .long 3184212578 + .long 3177110789 + .long 0 + .long 3223650304 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1958475666 + .long 1013700788 + .long 4293118680 + .long 1072693247 + .long 3829159519 + .long 1039938855 + .long 3827364885 + .long 3187422503 + .long 2374004141 + .long 1039322650 + .long 2380228874 + .long 3185757722 + .long 853065064 + .long 1036916376 + .long 3897809499 + .long 3182694159 + .long 2467115425 + .long 1033300621 + .long 2966460473 + .long 3178687133 + .long 4249027489 + .long 1028973684 + .long 3391824522 + .long 3174085926 + .long 0 + .long 3223781376 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1028808661 + .long 1012328597 + .long 4294717113 + .long 1072693247 + .long 2759857858 + .long 1036945975 + .long 2759440340 + .long 3184429623 + .long 217750550 + .long 1036278821 + .long 228557927 + .long 3182713893 + .long 868996329 + .long 1033914811 + .long 130294465 + .long 3179657124 + .long 3979034581 + .long 1030279068 + .long 1690522291 + .long 3175665582 + .long 141102418 + .long 1025941166 + .long 3942643114 + .long 3171030731 + .long 0 + .long 3223912448 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2461075155 + .long 1015729939 + .long 4294933437 + .long 1072693247 + .long 2559161110 + .long 1033930834 + .long 2559046852 + .long 3181414482 + .long 3206412049 + .long 1033243416 + .long 3218709064 + .long 3179678488 + .long 2091270467 + .long 1030857342 + .long 245853585 + .long 3176629075 + .long 1555900931 + .long 1027267783 + .long 1186881303 + .long 3172654298 + .long 1695278520 + .long 1022918007 + .long 1853146834 + .long 3167983022 + .long 0 + .long 3224043520 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2502502488 + .long 1016572066 + .long 4294962713 + .long 1072693247 + .long 3137376149 + .long 1030874690 + .long 3137268820 + .long 3178358338 + .long 1097103169 + .long 1030217134 + .long 1110504267 + .long 3176652206 + .long 1068377398 + .long 1027807171 + .long 222176953 + .long 3173610756 + .long 3440315131 + .long 1024267613 + .long 1199778592 + .long 3169654130 + .long 257981480 + .long 1019904983 + .long 1388437918 + .long 3164943417 + .long 0 + .long 3224174592 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3418697838 + .long 1016821878 + .long 4294966675 + .long 1072693247 + .long 3798207862 + .long 1027825953 + .long 3798094058 + .long 3175309601 + .long 3391459718 + .long 1027200727 + .long 3405981646 + .long 3173635799 + .long 3694208074 + .long 1024764900 + .long 2192272311 + .long 3170602971 + .long 1464408928 + .long 1021279479 + .long 2201370875 + .long 3166665997 + .long 4139632468 + .long 1016902930 + .long 2981161402 + .long 3161912586 + .long 0 + .long 3224305664 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3589768515 + .long 1013972501 + .long 4294967265 + .long 1072693247 + .long 2293865510 + .long 1023336450 + .long 2097549026 + .long 3170820098 + .long 2721138850 + .long 1022661962 + .long 1571631120 + .long 3169097035 + .long 3716649917 + .long 1020295299 + .long 3146231247 + .long 3166041588 + .long 84506245 + .long 1016656297 + .long 2231398946 + .long 3162043093 + .long 3305646943 + .long 1012441980 + .long 402214167 + .long 3157503609 + .long 0 + .long 3224436736 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2152156943 + .long 1016184605 + .long 4294967294 + .long 1072693247 + .long 1074684533 + .long 1018634353 + .long 1074437943 + .long 3166118001 + .long 967276073 + .long 1018090988 + .long 995296768 + .long 3164526060 + .long 4275132894 + .long 1015589675 + .long 304133116 + .long 3161485853 + .long 1232215992 + .long 1012058464 + .long 559363548 + .long 3157444977 + .long 1487618473 + .long 1007759094 + .long 2355811294 + .long 3152771929 + .long 3381626085 + .long 3224537056 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .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 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 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 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .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_dtanh_data_internal,@object + .size __svml_dtanh_data_internal,10816 + .align 8 + +__dtanh_la__imldTanhTab: + .long 0 + .long 1072693248 + .long 0 + .long 3220176896 + .type __dtanh_la__imldTanhTab,@object + .size __dtanh_la__imldTanhTab,16 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S new file mode 100644 index 0000000000..92fb24a640 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized tanh, 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_tanh _ZGVeN8v_tanh_avx2_wrapper +#include "../svml_d_tanh8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c new file mode 100644 index 0000000000..495cb1f4fc --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core.c @@ -0,0 +1,27 @@ +/* Multiple versions of vectorized tanh, 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_tanh +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN8v_tanh, __GI__ZGVeN8v_tanh, __redirect__ZGVeN8v_tanh) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core_avx512.S new file mode 100644 index 0000000000..c03232995a --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_d_tanh8_core_avx512.S @@ -0,0 +1,3017 @@ +/* Function tanh 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: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.evex512,"ax",@progbits +ENTRY(_ZGVeN8v_tanh_skx) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $320, %rsp + vpsrlq $32, %zmm0, %zmm4 + vmovups %zmm0, (%rsp) + vmovups __svml_dtanh_data_internal(%rip), %zmm14 + vmovups 128+__svml_dtanh_data_internal(%rip), %zmm15 + vpmovqd %zmm4, %ymm5 + +/* Constant loading */ + vandpd 10432+__svml_dtanh_data_internal(%rip), %zmm0, %zmm13 + vandpd 10368+__svml_dtanh_data_internal(%rip), %zmm0, %zmm3 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + vpand 2432+__svml_dtanh_data_internal(%rip), %ymm5, %ymm7 + vmovups 384+__svml_dtanh_data_internal(%rip), %zmm0 + vmovups 2176+__svml_dtanh_data_internal(%rip), %zmm4 + vmovups 2048+__svml_dtanh_data_internal(%rip), %zmm5 + vmovups %zmm3, 64(%rsp) + vmovups 512+__svml_dtanh_data_internal(%rip), %zmm3 + vpsubd 2496+__svml_dtanh_data_internal(%rip), %ymm7, %ymm8 + +/* if VMIN, VMAX is defined for I type */ + vxorps %ymm9, %ymm9, %ymm9 + vpmaxsd %ymm9, %ymm8, %ymm10 + vpminsd 2560+__svml_dtanh_data_internal(%rip), %ymm10, %ymm11 + vpsrld $19, %ymm11, %ymm12 + vmovups 1664+__svml_dtanh_data_internal(%rip), %zmm8 + vmovups 1536+__svml_dtanh_data_internal(%rip), %zmm9 + vmovups 1408+__svml_dtanh_data_internal(%rip), %zmm10 + vmovups 1280+__svml_dtanh_data_internal(%rip), %zmm11 + vpmovzxdq %ymm12, %zmm2 + vmovups 1152+__svml_dtanh_data_internal(%rip), %zmm12 + vpermt2pd 448+__svml_dtanh_data_internal(%rip), %zmm2, %zmm0 + vpermt2pd 64+__svml_dtanh_data_internal(%rip), %zmm2, %zmm14 + vpermt2pd 2240+__svml_dtanh_data_internal(%rip), %zmm2, %zmm4 + vpermt2pd 2112+__svml_dtanh_data_internal(%rip), %zmm2, %zmm5 + vsubpd {rn-sae}, %zmm14, %zmm13, %zmm1 + vpermt2pd 1728+__svml_dtanh_data_internal(%rip), %zmm2, %zmm8 + vpermt2pd 1600+__svml_dtanh_data_internal(%rip), %zmm2, %zmm9 + vpermt2pd 1472+__svml_dtanh_data_internal(%rip), %zmm2, %zmm10 + vpermt2pd 1344+__svml_dtanh_data_internal(%rip), %zmm2, %zmm11 + vpermt2pd 1216+__svml_dtanh_data_internal(%rip), %zmm2, %zmm12 + vpermt2pd 576+__svml_dtanh_data_internal(%rip), %zmm2, %zmm3 + vpermt2pd 192+__svml_dtanh_data_internal(%rip), %zmm2, %zmm15 + vmovups %zmm0, 192(%rsp) + vmovups 2304+__svml_dtanh_data_internal(%rip), %zmm0 + vmovups 1024+__svml_dtanh_data_internal(%rip), %zmm13 + vmovups 896+__svml_dtanh_data_internal(%rip), %zmm14 + vmovups %zmm3, 256(%rsp) + vmovups 768+__svml_dtanh_data_internal(%rip), %zmm3 + vmovups %zmm15, 128(%rsp) + vmovups 640+__svml_dtanh_data_internal(%rip), %zmm15 + vpermt2pd 2368+__svml_dtanh_data_internal(%rip), %zmm2, %zmm0 + vpermt2pd 1088+__svml_dtanh_data_internal(%rip), %zmm2, %zmm13 + vpermt2pd 960+__svml_dtanh_data_internal(%rip), %zmm2, %zmm14 + vpermt2pd 832+__svml_dtanh_data_internal(%rip), %zmm2, %zmm3 + vpermt2pd 704+__svml_dtanh_data_internal(%rip), %zmm2, %zmm15 + vfmadd213pd {rn-sae}, %zmm4, %zmm1, %zmm0 + vpcmpgtd 10560+__svml_dtanh_data_internal(%rip), %ymm7, %ymm6 + vmovmskps %ymm6, %edx + vmovups 1920+__svml_dtanh_data_internal(%rip), %zmm6 + vfmadd213pd {rn-sae}, %zmm5, %zmm1, %zmm0 + vmovups 1792+__svml_dtanh_data_internal(%rip), %zmm7 + vpermt2pd 1984+__svml_dtanh_data_internal(%rip), %zmm2, %zmm6 + vpermt2pd 1856+__svml_dtanh_data_internal(%rip), %zmm2, %zmm7 + vfmadd213pd {rn-sae}, %zmm6, %zmm1, %zmm0 + vmovups 256(%rsp), %zmm2 + vfmadd213pd {rn-sae}, %zmm7, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm8, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm9, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm10, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm11, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm12, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm13, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm14, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm3, %zmm1, %zmm0 + vmovups 128(%rsp), %zmm3 + vfmadd213pd {rn-sae}, %zmm15, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm0 + vmovups 192(%rsp), %zmm2 + vfmadd213pd {rn-sae}, %zmm2, %zmm1, %zmm0 + vfmadd213pd {rn-sae}, %zmm3, %zmm1, %zmm0 + vorpd 64(%rsp), %zmm0, %zmm0 + testl %edx, %edx + jne L(2) + +L(1): + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + +L(2): + vmovups (%rsp), %zmm1 + vmovups %zmm0, 128(%rsp) + vmovups %zmm1, 64(%rsp) + je L(1) + 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, 0xe8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xfe, 0xff, 0xff, 0x22 + movl %eax, %r12d + movq %r13, 48(%rsp) + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xfe, 0xff, 0xff, 0x22 + movl %edx, %r13d + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xfe, 0xff, 0xff, 0x22 + +L(3): + btl %r12d, %r13d + jc L(5) + +L(4): + incl %r12d + cmpl $8, %r12d + jl L(3) + 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 L(1) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfa, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfb, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xd0, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfc, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc8, 0xfe, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0xfd, 0x00, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xc0, 0xfe, 0xff, 0xff, 0x22 + +L(5): + lea 64(%rsp,%r12,8), %rdi + lea 128(%rsp,%r12,8), %rsi + call __svml_dtanh_cout_rare_internal + jmp L(4) + +END(_ZGVeN8v_tanh_skx) + + .align 16,0x90 + +__svml_dtanh_cout_rare_internal: + + cfi_startproc + + lea __dtanh_la__imldTanhTab(%rip), %rdx + movb 7(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 6(%rdi), %eax + andl $32752, %eax + shrl $4, %eax + movq (%rdx,%rcx,8), %rdx + cmpl $2047, %eax + je L(9) + cmpl $2046, %eax + jne L(7) + +L(6): + movq %rdx, (%rsi) + jmp L(8) + +L(7): + movsd (%rdi), %xmm1 + movsd __dtanh_la__imldTanhTab(%rip), %xmm0 + addsd %xmm1, %xmm0 + mulsd %xmm0, %xmm1 + movsd %xmm1, (%rsi) + +L(8): + xorl %eax, %eax + ret + +L(9): + testl $1048575, 4(%rdi) + jne L(10) + cmpl $0, (%rdi) + je L(6) + +L(10): + movsd (%rdi), %xmm0 + addsd %xmm0, %xmm0 + movsd %xmm0, (%rsi) + jmp L(8) + + cfi_endproc + + .type __svml_dtanh_cout_rare_internal,@function + .size __svml_dtanh_cout_rare_internal,.-__svml_dtanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_dtanh_data_internal: + .long 0 + .long 0 + .long 0 + .long 1070333952 + .long 0 + .long 1070858240 + .long 0 + .long 1071382528 + .long 0 + .long 1071906816 + .long 0 + .long 1072431104 + .long 0 + .long 1072955392 + .long 0 + .long 1073479680 + .long 0 + .long 1074003968 + .long 0 + .long 1074528256 + .long 0 + .long 1075052544 + .long 0 + .long 1075576832 + .long 0 + .long 1076101120 + .long 0 + .long 1076625408 + .long 0 + .long 1077149696 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1097497746 + .long 1070305232 + .long 2699715854 + .long 1070817176 + .long 3997728823 + .long 1071273769 + .long 3938160533 + .long 1071759175 + .long 193732629 + .long 1072072293 + .long 3144363502 + .long 1072375075 + .long 2548249895 + .long 1072570303 + .long 638218690 + .long 1072665176 + .long 3325726839 + .long 1072689426 + .long 2523455249 + .long 1072693057 + .long 2200391922 + .long 1072693244 + .long 4257836853 + .long 1072693247 + .long 4294954840 + .long 1072693247 + .long 0 + .long 1072693248 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 3167993022 + .long 1013310014 + .long 2889539328 + .long 3159121931 + .long 394645568 + .long 1013728265 + .long 2799920971 + .long 1015161303 + .long 754366556 + .long 1013577885 + .long 3960180508 + .long 1014215657 + .long 69774042 + .long 3162475851 + .long 2161066944 + .long 3162264280 + .long 923362432 + .long 1014879086 + .long 2160345802 + .long 1014714211 + .long 3729195158 + .long 3161626453 + .long 675671997 + .long 1015336837 + .long 1141527416 + .long 1013957883 + .long 2209699952 + .long 3160643600 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 2750448946 + .long 1072596012 + .long 1257606939 + .long 1072501079 + .long 2619663609 + .long 1072338011 + .long 863303701 + .long 1072048204 + .long 2694810990 + .long 1071654144 + .long 837003456 + .long 1070723665 + .long 472162617 + .long 1069359818 + .long 532307062 + .long 1067137790 + .long 431106849 + .long 1064162173 + .long 329904022 + .long 1059572972 + .long 4080160942 + .long 1053550275 + .long 1402271583 + .long 1044493446 + .long 467296040 + .long 1032344560 + .long 26734424 + .long 1014207804 + .long 0 + .long 0 + .long 1071622681 + .long 3153114090 + .long 3948133409 + .long 3217705130 + .long 4096956694 + .long 3218184481 + .long 2616164369 + .long 3218465008 + .long 2620770434 + .long 3218641845 + .long 3075958072 + .long 3218520700 + .long 1950184789 + .long 3217978001 + .long 2686385024 + .long 3216731525 + .long 1489441818 + .long 3214597550 + .long 1992796697 + .long 3211642259 + .long 1952936976 + .long 3207056478 + .long 3904162951 + .long 3201033920 + .long 1382745445 + .long 3191977094 + .long 468673444 + .long 3179828208 + .long 3843669553 + .long 3161691483 + .long 0 + .long 0 + .long 1431655765 + .long 3218429269 + .long 3264395793 + .long 3218178991 + .long 60595194 + .long 3217824331 + .long 1837960166 + .long 3217124894 + .long 1964918946 + .long 3214033516 + .long 2998587684 + .long 1068822866 + .long 3421467326 + .long 1069267520 + .long 952003133 + .long 1068506016 + .long 1215426504 + .long 1066495476 + .long 2650572912 + .long 1063503494 + .long 4178958376 + .long 1059043758 + .long 3799805457 + .long 1052940753 + .long 3704238924 + .long 1043831645 + .long 2076585114 + .long 1031813109 + .long 1352847351 + .long 1013591371 + .long 0 + .long 0 + .long 3830371894 + .long 3169224254 + .long 74893150 + .long 1069567437 + .long 1235750664 + .long 1069825332 + .long 916043751 + .long 1069924975 + .long 4138411315 + .long 1069655686 + .long 829220656 + .long 1068441660 + .long 663246204 + .long 3213477792 + .long 652268865 + .long 3214415230 + .long 3251098232 + .long 3212868437 + .long 1480792335 + .long 3209929101 + .long 3365608027 + .long 3205478075 + .long 3330582883 + .long 3199375817 + .long 3573234945 + .long 3190266717 + .long 2061970086 + .long 3178248181 + .long 3148320390 + .long 3160026274 + .long 0 + .long 0 + .long 286337717 + .long 1069617425 + .long 4261152941 + .long 1068876190 + .long 3694459820 + .long 1067928728 + .long 2399079031 + .long 3212381546 + .long 394897286 + .long 3215735810 + .long 3073534041 + .long 3215860118 + .long 301960234 + .long 3214124960 + .long 3353887502 + .long 1064191753 + .long 4200665425 + .long 1063741482 + .long 2003926207 + .long 1061090030 + .long 2196865207 + .long 1056528964 + .long 2107880963 + .long 1050526402 + .long 3656860478 + .long 1041425071 + .long 881228218 + .long 1029305120 + .long 2612840768 + .long 1011136029 + .long 0 + .long 0 + .long 3722294196 + .long 3181505049 + .long 2573001951 + .long 3216029919 + .long 4095639908 + .long 3216151900 + .long 3272210374 + .long 3215957253 + .long 3439280785 + .long 3214441767 + .long 628273304 + .long 1066085542 + .long 3354767370 + .long 1066343670 + .long 300170709 + .long 1063270296 + .long 1870156670 + .long 3209139074 + .long 1580606479 + .long 3206808937 + .long 3818710870 + .long 3202408589 + .long 3126817102 + .long 3196311305 + .long 3320734688 + .long 3187224127 + .long 821170446 + .long 3175173312 + .long 3906480775 + .long 3156975650 + .long 0 + .long 0 + .long 428888587 + .long 3215696314 + .long 3125999356 + .long 3214336891 + .long 407196569 + .long 1053816799 + .long 886258254 + .long 1066874408 + .long 2149075781 + .long 1067351939 + .long 3888390356 + .long 1065784643 + .long 1226056234 + .long 3211994813 + .long 178100474 + .long 3210723675 + .long 4201249718 + .long 1058328572 + .long 3854015760 + .long 1057324616 + .long 3621220964 + .long 1052982118 + .long 1468766992 + .long 1046916174 + .long 2369608770 + .long 1037879115 + .long 327127732 + .long 1025754505 + .long 747046817 + .long 1007714190 + .long 0 + .long 0 + .long 4036362527 + .long 3191151783 + .long 839661649 + .long 1067363059 + .long 4269154241 + .long 1067251747 + .long 391446303 + .long 1066410535 + .long 2090623151 + .long 3211993063 + .long 1751510141 + .long 3213141508 + .long 4072216875 + .long 3209470961 + .long 3769618983 + .long 1061976030 + .long 3462945146 + .long 1057228123 + .long 3030849095 + .long 3202531084 + .long 4269010901 + .long 3198361258 + .long 742615277 + .long 3192302512 + .long 3397417437 + .long 3183265609 + .long 943110610 + .long 3171141000 + .long 371608300 + .long 3153099348 + .long 0 + .long 0 + .long 1315619150 + .long 1066820857 + .long 1001273821 + .long 3214201652 + .long 3859675203 + .long 3212560200 + .long 725858949 + .long 3213658423 + .long 2464052346 + .long 3212913056 + .long 1297319750 + .long 1063307355 + .long 563735576 + .long 1062988089 + .long 2756222736 + .long 3207203944 + .long 31207338 + .long 3204466214 + .long 434022900 + .long 1052227234 + .long 2370591882 + .long 1048628172 + .long 588930601 + .long 1042556347 + .long 3198977634 + .long 1033474724 + .long 1590950759 + .long 1021415866 + .long 195904708 + .long 1003000389 + .long 0 + .long 0 + .long 4252521214 + .long 3198731457 + .long 2969857811 + .long 3217870358 + .long 575387574 + .long 3212943727 + .long 67550217 + .long 3210922992 + .long 2955736731 + .long 1064678043 + .long 4193848343 + .long 1063288304 + .long 1845975253 + .long 3209397546 + .long 1025213509 + .long 3204479174 + .long 3713384058 + .long 1055658730 + .long 4120057883 + .long 3194988032 + .long 1573797757 + .long 3193584787 + .long 2514726550 + .long 3187678317 + .long 15343571 + .long 3178526042 + .long 104576940 + .long 3166444652 + .long 1147207168 + .long 3148070554 + .long 0 + .long 0 + .long 1467656669 + .long 3212977156 + .long 4154993315 + .long 1077775111 + .long 2465966858 + .long 3214886059 + .long 71777642 + .long 1068690118 + .long 2419763912 + .long 1061550205 + .long 1896047360 + .long 3210612806 + .long 3723555648 + .long 1058651288 + .long 3163703016 + .long 1057833732 + .long 1601936705 + .long 3201383489 + .long 2535509424 + .long 3195153293 + .long 3610885824 + .long 1043474022 + .long 1031698712 + .long 1037527637 + .long 1497459257 + .long 1028514042 + .long 3476455860 + .long 1016366870 + .long 758110873 + .long 998719391 + .long 0 + .long 0 + .long 572446067 + .long 3204307354 + .long 926268084 + .long 1081104698 + .long 1313112926 + .long 3217861477 + .long 3660716 + .long 1070677720 + .long 124568711 + .long 3210757561 + .long 2123022704 + .long 1059096046 + .long 576783408 + .long 1059279430 + .long 1651052980 + .long 3204387494 + .long 3164866735 + .long 1051430920 + .long 409335328 + .long 1046695415 + .long 3481520755 + .long 3188046619 + .long 1140549474 + .long 3182373569 + .long 708689751 + .long 3173247717 + .long 2627769694 + .long 3161153086 + .long 3804346926 + .long 3143551592 + .long 0 + .long 0 + .long 2302818369 + .long 1064188902 + .long 526101185 + .long 3235013457 + .long 2975776348 + .long 1075224435 + .long 1103981749 + .long 3223699933 + .long 4261798097 + .long 3210280329 + .long 30781306 + .long 1064564655 + .long 3939597931 + .long 3206430909 + .long 1816466405 + .long 1055007949 + .long 3868125859 + .long 3190076997 + .long 4218600579 + .long 3192569835 + .long 4167655123 + .long 1037376568 + .long 952533803 + .long 1032000428 + .long 895641221 + .long 1022851193 + .long 1237761065 + .long 1010835452 + .long 2902086315 + .long 3133082401 + .long 0 + .long 0 + .long 1899646778 + .long 3207205638 + .long 2434183270 + .long 3238288976 + .long 621380814 + .long 1078065849 + .long 247717525 + .long 3225783561 + .long 1611742563 + .long 3212088477 + .long 537725662 + .long 1065131990 + .long 3769436831 + .long 1057148224 + .long 3759797009 + .long 3196422840 + .long 842759416 + .long 3195613094 + .long 1736926210 + .long 1043198029 + .long 3915271468 + .long 3180709675 + .long 807416070 + .long 3176507548 + .long 3147759461 + .long 3167409843 + .long 3443382404 + .long 3155325020 + .long 1202615797 + .long 3129870924 + .long 0 + .long 0 + .long 1841653873 + .long 3210074087 + .long 2157744327 + .long 1095928888 + .long 3038317314 + .long 3229013375 + .long 2291108570 + .long 1082519711 + .long 707775397 + .long 1067599411 + .long 445214669 + .long 3216153989 + .long 3815354898 + .long 1054410330 + .long 1285070896 + .long 3199787450 + .long 1722630166 + .long 1047526663 + .long 2672844635 + .long 3188483010 + .long 1805520457 + .long 3179260705 + .long 542550567 + .long 1026041526 + .long 392361251 + .long 1017320419 + .long 562647833 + .long 1005205418 + .long 4253488278 + .long 988137457 + .long 0 + .long 0 + .long 3077187303 + .long 1060497018 + .long 1652392454 + .long 1099206368 + .long 414484972 + .long 3231848150 + .long 130592591 + .long 1084602513 + .long 1951534810 + .long 1068932483 + .long 2677544726 + .long 3216895313 + .long 2338009969 + .long 3203411240 + .long 302629286 + .long 1051889816 + .long 1274412910 + .long 3193339538 + .long 3731558070 + .long 1038350327 + .long 3135499196 + .long 1030352152 + .long 1329461873 + .long 3170325324 + .long 4058709792 + .long 3161656179 + .long 2167788642 + .long 3149540607 + .long 1602064437 + .long 3132466971 + .long 0 + .long 0 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 1069547520 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 7864320 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 3616958675 + .long 3172564458 + .long 1431547708 + .long 3218429269 + .long 3390261318 + .long 3188010876 + .long 1446529494 + .long 1069617425 + .long 913571762 + .long 3199219810 + .long 1583612462 + .long 3215695720 + .long 2995724807 + .long 3207222498 + .long 847913742 + .long 1066913721 + .long 1634876930 + .long 3212167789 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1694159514 + .long 1010239653 + .long 966318664 + .long 1069606551 + .long 2992375944 + .long 1072656686 + .long 1870405289 + .long 3217070889 + .long 1411308967 + .long 3218333047 + .long 4096824853 + .long 1068863484 + .long 2220740425 + .long 1069365950 + .long 1401698298 + .long 3215430111 + .long 4137473768 + .long 3215259762 + .long 2666938667 + .long 1066889956 + .long 121190665 + .long 1066187784 + .long 821637913 + .long 3213226090 + .long 0 + .long 3217096704 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1463410348 + .long 1012925678 + .long 2389577058 + .long 1069735062 + .long 1617794783 + .long 1072647710 + .long 1889094329 + .long 3217191869 + .long 1210518828 + .long 3218309813 + .long 1479174953 + .long 1069010221 + .long 3435917531 + .long 1069290104 + .long 291210913 + .long 3215575029 + .long 464478606 + .long 3215159746 + .long 1063797118 + .long 1067014292 + .long 3489481042 + .long 1065955541 + .long 2916293494 + .long 3213319415 + .long 0 + .long 3217227776 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1308961311 + .long 1014934498 + .long 2204208241 + .long 1069862983 + .long 2945950899 + .long 1072637797 + .long 1107689125 + .long 3217310565 + .long 545938327 + .long 3218284334 + .long 3174275192 + .long 1069150773 + .long 3754729793 + .long 1069207728 + .long 1611554958 + .long 3215708601 + .long 2936527704 + .long 3215052478 + .long 2983784402 + .long 1067121823 + .long 1327150338 + .long 1065710404 + .long 3371320326 + .long 3213391099 + .long 0 + .long 3217358848 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3546392464 + .long 1015001497 + .long 631120375 + .long 1069990256 + .long 1201634405 + .long 1072626967 + .long 266657677 + .long 3217426771 + .long 1567732958 + .long 3218256710 + .long 883708059 + .long 1069284653 + .long 1008115966 + .long 1069119372 + .long 2657338981 + .long 3215830093 + .long 3402640736 + .long 3214939036 + .long 1000796573 + .long 1067211764 + .long 53805889 + .long 1065455799 + .long 1736607114 + .long 3213440608 + .long 0 + .long 3217489920 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2741128528 + .long 1013617020 + .long 3111451323 + .long 1070116823 + .long 1649040643 + .long 1072615239 + .long 3411009101 + .long 3217540290 + .long 3408666525 + .long 3218227049 + .long 60831764 + .long 1069411415 + .long 64016149 + .long 1069025616 + .long 1202785467 + .long 3215938891 + .long 1072151579 + .long 3214707060 + .long 1534357116 + .long 1067283570 + .long 4218468492 + .long 1065037194 + .long 2285827787 + .long 3213467810 + .long 0 + .long 3217620992 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2659584459 + .long 1014368295 + .long 3537749475 + .long 1070242630 + .long 3072983457 + .long 1072602635 + .long 3507245872 + .long 3217650938 + .long 3434758212 + .long 3218195466 + .long 3801643091 + .long 1069530660 + .long 1128653951 + .long 1068927067 + .long 3580298628 + .long 3216008547 + .long 1645082338 + .long 3214462237 + .long 1048857889 + .long 1067336943 + .long 21547694 + .long 1064510970 + .long 1433152914 + .long 3213472968 + .long 0 + .long 3217752064 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2718912981 + .long 1013914074 + .long 1823051285 + .long 1070367623 + .long 1714227149 + .long 1072589179 + .long 2128046799 + .long 3217758540 + .long 2655098722 + .long 3218162081 + .long 1690074008 + .long 1069594780 + .long 353091525 + .long 1068824353 + .long 4206393496 + .long 3216049578 + .long 824478721 + .long 3214211899 + .long 3850924188 + .long 1067371825 + .long 2738209029 + .long 1063668369 + .long 853664366 + .long 3213456718 + .long 0 + .long 3217883136 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2312638749 + .long 1013630664 + .long 4267025360 + .long 1070491748 + .long 3776362539 + .long 1072574894 + .long 3063840907 + .long 3217862932 + .long 2436606365 + .long 3218127019 + .long 582931594 + .long 1069646387 + .long 3079837843 + .long 1068718114 + .long 3430470362 + .long 3216083715 + .long 1015897693 + .long 3213958348 + .long 765047087 + .long 1067388396 + .long 2337193368 + .long 1061824569 + .long 3002775972 + .long 3213420044 + .long 0 + .long 3218014208 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2001712669 + .long 1015665334 + .long 1330879460 + .long 1070636148 + .long 2956987714 + .long 1072551971 + .long 4281360332 + .long 3218013175 + .long 3304213057 + .long 3218063389 + .long 3261945160 + .long 1069715874 + .long 3866284424 + .long 1068553570 + .long 3423706630 + .long 3216121886 + .long 259493169 + .long 3213268437 + .long 4223676832 + .long 1067379852 + .long 2765317642 + .long 3210752240 + .long 2292494069 + .long 3213329490 + .long 0 + .long 3218145280 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1632443533 + .long 1015769771 + .long 3788472163 + .long 1070757367 + .long 2406795724 + .long 1072518757 + .long 1173083542 + .long 3218140352 + .long 3726086528 + .long 3217906251 + .long 1205028711 + .long 1069793280 + .long 2231197855 + .long 1068156878 + .long 2368637763 + .long 3216148628 + .long 2866127296 + .long 3211617797 + .long 2424606359 + .long 1067309831 + .long 2444940724 + .long 3212180962 + .long 3308128888 + .long 3213151909 + .long 0 + .long 3218276352 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 478834383 + .long 1014053288 + .long 1342399495 + .long 1070876422 + .long 2650660168 + .long 1072482726 + .long 976724127 + .long 3218226669 + .long 962417089 + .long 3217740546 + .long 1060150306 + .long 1069852926 + .long 411739190 + .long 1067700577 + .long 3846786712 + .long 3216148687 + .long 4007187252 + .long 1064073475 + .long 3455779574 + .long 1067180067 + .long 1865169557 + .long 3212900393 + .long 1200620699 + .long 3212923615 + .long 0 + .long 3218407424 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 267289397 + .long 1014452734 + .long 302318249 + .long 1070993143 + .long 1373990511 + .long 1072444121 + .long 1606419704 + .long 3218305061 + .long 3955669825 + .long 3217568496 + .long 2701083439 + .long 1069894809 + .long 3425188888 + .long 1067047616 + .long 2305426029 + .long 3216123827 + .long 1692531481 + .long 1065641523 + .long 232815703 + .long 1067000535 + .long 3949954748 + .long 3213214884 + .long 558890519 + .long 3212487521 + .long 0 + .long 3218538496 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1719941932 + .long 1006528498 + .long 368840470 + .long 1071107377 + .long 1825320027 + .long 1072403193 + .long 538136722 + .long 3218375283 + .long 1431312010 + .long 3217392305 + .long 2586725425 + .long 1069919291 + .long 2680871675 + .long 1065941593 + .long 4123661982 + .long 3216076488 + .long 4235496382 + .long 1066406926 + .long 2618960092 + .long 1066782660 + .long 2333865044 + .long 3213444845 + .long 1545458959 + .long 3211934181 + .long 0 + .long 3218669568 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 26286236 + .long 1013191219 + .long 990113957 + .long 1071218987 + .long 3284199501 + .long 1072360200 + .long 2981906127 + .long 3218437190 + .long 3154396333 + .long 3217214106 + .long 4182117656 + .long 1069927061 + .long 903677379 + .long 3207343530 + .long 384743261 + .long 3216009637 + .long 1679228359 + .long 1066734193 + .long 3407026595 + .long 1066538544 + .long 784962854 + .long 3213588186 + .long 1956733412 + .long 3210979700 + .long 0 + .long 3218800640 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1468217372 + .long 1015658399 + .long 2570814109 + .long 1071327852 + .long 532296332 + .long 1072315404 + .long 318213600 + .long 3218490738 + .long 3661105766 + .long 3217035931 + .long 4085840862 + .long 1069919095 + .long 2798312316 + .long 3213370099 + .long 1668326589 + .long 3215870599 + .long 3158013712 + .long 1066998409 + .long 673205579 + .long 1066158659 + .long 486665227 + .long 3213647762 + .long 3317145528 + .long 3208570948 + .long 0 + .long 3218931712 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2060955015 + .long 1014233667 + .long 2567098181 + .long 1071433868 + .long 1159081245 + .long 1072269064 + .long 1492598184 + .long 3218535971 + .long 1567055841 + .long 3216688180 + .long 2821222425 + .long 1069896605 + .long 3691290783 + .long 3214336992 + .long 343679101 + .long 3215679175 + .long 1878686296 + .long 1067197462 + .long 125933636 + .long 1065636281 + .long 421076939 + .long 3213630573 + .long 3748848474 + .long 1062499186 + .long 0 + .long 3219062784 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1860475216 + .long 1015320544 + .long 439764829 + .long 1071587361 + .long 3870821058 + .long 1072197223 + .long 1430736283 + .long 3218588540 + .long 1597812790 + .long 3216174065 + .long 2398544810 + .long 1069838732 + .long 961452807 + .long 3215095800 + .long 716310499 + .long 3215360049 + .long 2337792646 + .long 1067375770 + .long 3863538422 + .long 1064417477 + .long 2203480844 + .long 3213482785 + .long 2389621902 + .long 1063978354 + .long 0 + .long 3219193856 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 517838046 + .long 1015294339 + .long 2114713104 + .long 1071713012 + .long 2046328558 + .long 1072098392 + .long 29352448 + .long 3218631376 + .long 1533416325 + .long 3215079684 + .long 765247815 + .long 1069724759 + .long 24381189 + .long 3215564623 + .long 1213155449 + .long 3214886044 + .long 379420126 + .long 1067409218 + .long 3127061143 + .long 3210809777 + .long 3193663073 + .long 3213128287 + .long 2557278876 + .long 1064581282 + .long 0 + .long 3219324928 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 201012485 + .long 1013704982 + .long 4147262407 + .long 1071803766 + .long 3048814903 + .long 1071997795 + .long 1260857726 + .long 3218645540 + .long 270462819 + .long 3209873967 + .long 874660781 + .long 1069580732 + .long 1251156804 + .long 3215866075 + .long 3568210118 + .long 3214014484 + .long 3784557811 + .long 1067255146 + .long 47772576 + .long 3212562613 + .long 2075700783 + .long 3212539455 + .long 1121561449 + .long 1064698735 + .long 0 + .long 3219456000 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 72370286 + .long 1015768239 + .long 2345366573 + .long 1071888223 + .long 3155310239 + .long 1071897123 + .long 4105462806 + .long 3218634383 + .long 2329529114 + .long 1067280331 + .long 3078782452 + .long 1069291148 + .long 2210998062 + .long 3215997483 + .long 1498585052 + .long 3212353515 + .long 3032692199 + .long 1066974465 + .long 809329973 + .long 3213081308 + .long 2713838579 + .long 3211547879 + .long 1266611175 + .long 1064568889 + .long 0 + .long 3219587072 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2137918782 + .long 1013598293 + .long 2511343836 + .long 1071966424 + .long 4205808243 + .long 1071797842 + .long 2776384587 + .long 3218601667 + .long 3824787134 + .long 1068202086 + .long 4101819712 + .long 1068956189 + .long 3547601806 + .long 3216004360 + .long 4156237724 + .long 1064058621 + .long 3714924071 + .long 1066627770 + .long 2925917146 + .long 3213234133 + .long 4211598888 + .long 3209111151 + .long 2569808389 + .long 1064277859 + .long 0 + .long 3219718144 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2979324843 + .long 1013692066 + .long 2595126306 + .long 1072038496 + .long 4263058559 + .long 1071701178 + .long 2217257467 + .long 3218551298 + .long 2310932059 + .long 1068685603 + .long 3368327571 + .long 1068627625 + .long 3037419246 + .long 3215935424 + .long 3509936675 + .long 1065724141 + .long 1557247226 + .long 1066131548 + .long 3830787958 + .long 3213205743 + .long 1781883284 + .long 1062575914 + .long 3918078093 + .long 1063614197 + .long 0 + .long 3219849216 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3630992244 + .long 1015034507 + .long 461360001 + .long 1072104635 + .long 2866201612 + .long 1071571556 + .long 1021729265 + .long 3218487113 + .long 1039036234 + .long 1068940858 + .long 1685105679 + .long 1068140011 + .long 1856275853 + .long 3215769620 + .long 2211306181 + .long 1066373046 + .long 3739405201 + .long 1065456917 + .long 3870269089 + .long 3213053509 + .long 427599213 + .long 1063593231 + .long 40698732 + .long 1062709094 + .long 0 + .long 3219980288 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4017840557 + .long 1014067070 + .long 2764932206 + .long 1072165089 + .long 3362970633 + .long 1071394124 + .long 2677206355 + .long 3218412713 + .long 1827861303 + .long 1069122666 + .long 2476388705 + .long 1067583638 + .long 523365901 + .long 3215556224 + .long 1203249285 + .long 1066574111 + .long 4264074292 + .long 1064402288 + .long 3556167213 + .long 3212827889 + .long 3894081206 + .long 1063908871 + .long 2161178761 + .long 1061130844 + .long 0 + .long 3220111360 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3622330478 + .long 1016273425 + .long 923638641 + .long 1072245755 + .long 239419665 + .long 1071146518 + .long 4085259706 + .long 3218288969 + .long 1284806809 + .long 1069276013 + .long 2806747971 + .long 1066232498 + .long 75259250 + .long 3215197393 + .long 2597116185 + .long 1066648701 + .long 1680670491 + .long 3208755029 + .long 446818184 + .long 3212096816 + .long 1529495144 + .long 1063888972 + .long 808619025 + .long 3208443000 + .long 0 + .long 3220242432 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 462410646 + .long 1015565639 + .long 3157363066 + .long 1072336316 + .long 87541994 + .long 1070853747 + .long 2905067058 + .long 3218115077 + .long 1081050294 + .long 1069306453 + .long 4130581086 + .long 3212259234 + .long 1279737796 + .long 3214531982 + .long 901138781 + .long 1066501065 + .long 978916480 + .long 3211806490 + .long 1307294116 + .long 3210755549 + .long 1154728319 + .long 1063409950 + .long 983243444 + .long 3209435485 + .long 0 + .long 3220373504 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2617212772 + .long 1016126748 + .long 2762378177 + .long 1072409936 + .long 1926160805 + .long 1070604218 + .long 4131898582 + .long 3217810482 + .long 3068505203 + .long 1069203346 + .long 2854543895 + .long 3214027139 + .long 1276437050 + .long 3213652513 + .long 523800203 + .long 1066060621 + .long 3030576699 + .long 3212054264 + .long 210618624 + .long 3205409267 + .long 3515290542 + .long 1062456384 + .long 1613351841 + .long 3209185464 + .long 0 + .long 3220504576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2178033281 + .long 1016051223 + .long 859883711 + .long 1072469258 + .long 4248327203 + .long 1070195167 + .long 4170103331 + .long 3217497647 + .long 3497702842 + .long 1069026027 + .long 669705965 + .long 3214426190 + .long 548733038 + .long 3212258725 + .long 1756337187 + .long 1065503890 + .long 1830841059 + .long 3211930343 + .long 1445563742 + .long 1061912703 + .long 2113494314 + .long 1060991234 + .long 1734825467 + .long 3208559895 + .long 0 + .long 3220635648 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1674478116 + .long 1016412476 + .long 1178764976 + .long 1072516719 + .long 1119346206 + .long 1069851736 + .long 1526584272 + .long 3217221512 + .long 3575463915 + .long 1068817773 + .long 2913683612 + .long 3214542291 + .long 1135909212 + .long 3207879094 + .long 1952394810 + .long 1064725296 + .long 508910559 + .long 3211537545 + .long 225204077 + .long 1062311155 + .long 1009857186 + .long 1056234420 + .long 2872841632 + .long 3207480811 + .long 0 + .long 3220766720 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1768234410 + .long 1014305046 + .long 1496797583 + .long 1072554475 + .long 3351833521 + .long 1069572393 + .long 68183265 + .long 3216938851 + .long 4178655528 + .long 1068606905 + .long 60791550 + .long 3214483781 + .long 1856281737 + .long 1063701265 + .long 4260560897 + .long 1063778674 + .long 2539586291 + .long 3210979253 + .long 2272785608 + .long 1062198907 + .long 1986161572 + .long 3206910344 + .long 1016667904 + .long 3205797138 + .long 0 + .long 3220897792 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3074583847 + .long 1017063845 + .long 4092570620 + .long 1072584374 + .long 3645618684 + .long 1069147119 + .long 1980755111 + .long 3216542681 + .long 889928399 + .long 1068320928 + .long 1360064809 + .long 3214330986 + .long 2266432388 + .long 1064407878 + .long 4147854841 + .long 1062471610 + .long 1812350685 + .long 3210287970 + .long 3710399832 + .long 1061728481 + .long 2458127659 + .long 3207279138 + .long 287360833 + .long 3197756422 + .long 0 + .long 3221028864 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 68970445 + .long 1013643458 + .long 3990219923 + .long 1072607967 + .long 97498680 + .long 1068787106 + .long 4136450559 + .long 3216216395 + .long 147179316 + .long 1067971098 + .long 1625987424 + .long 3214138005 + .long 3965878798 + .long 1064539455 + .long 3777445436 + .long 1059539413 + .long 3029913178 + .long 3209512624 + .long 2162291908 + .long 1061245910 + .long 351053474 + .long 3207087984 + .long 3766283083 + .long 1056943188 + .long 0 + .long 3221159936 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3139580402 + .long 1014663922 + .long 3748810696 + .long 1072634260 + .long 3154943320 + .long 1068262833 + .long 3181856712 + .long 3215694135 + .long 3656356636 + .long 1067539266 + .long 3897588284 + .long 3213798616 + .long 1461831298 + .long 1064461217 + .long 2900114226 + .long 3208814642 + .long 2606420357 + .long 3207868903 + .long 1741152094 + .long 1060222230 + .long 1469206701 + .long 3206514441 + .long 3518993813 + .long 1057090958 + .long 0 + .long 3221291008 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3285908565 + .long 1015477239 + .long 1797956315 + .long 1072657271 + .long 3302471936 + .long 1067543167 + .long 2151339553 + .long 3215007235 + .long 362228095 + .long 1066797401 + .long 3986406156 + .long 3213131380 + .long 388353381 + .long 1064042359 + .long 4147910906 + .long 3209239839 + .long 1739922885 + .long 1056259812 + .long 3188561056 + .long 1058406709 + .long 489122368 + .long 3205182155 + .long 202560853 + .long 1056234231 + .long 0 + .long 3221422080 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3806705628 + .long 1008327668 + .long 884432573 + .long 1072671353 + .long 137405484 + .long 1066747168 + .long 3531994812 + .long 3214216262 + .long 3217445183 + .long 1066105333 + .long 2910288024 + .long 3212464301 + .long 3196212707 + .long 1063467545 + .long 3156563895 + .long 3208963593 + .long 3591285453 + .long 1058733242 + .long 2889132271 + .long 1055392886 + .long 1038377961 + .long 3203561698 + .long 4084672077 + .long 1055001082 + .long 0 + .long 3221553152 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1881957148 + .long 1016569186 + .long 3451706443 + .long 1072679940 + .long 143468186 + .long 1066002557 + .long 553724800 + .long 3213475431 + .long 1049442771 + .long 1065415105 + .long 3378521943 + .long 3211821787 + .long 3176008209 + .long 1062800361 + .long 4016898691 + .long 3208498219 + .long 1548390021 + .long 1058670598 + .long 2097418483 + .long 3202689041 + .long 2756703589 + .long 3201351283 + .long 506736184 + .long 1053405377 + .long 0 + .long 3221684224 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 450339788 + .long 1015040915 + .long 2959639058 + .long 1072685166 + .long 2289443405 + .long 1065320893 + .long 3331959139 + .long 3212796584 + .long 724199976 + .long 1064616734 + .long 938566183 + .long 3211030741 + .long 1640535667 + .long 1062186735 + .long 187996035 + .long 3207841256 + .long 822311531 + .long 1058246461 + .long 160890851 + .long 3203087480 + .long 3163291388 + .long 1050479733 + .long 578249940 + .long 1051474021 + .long 0 + .long 3221815296 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 539445753 + .long 1012635531 + .long 3085578536 + .long 1072688342 + .long 2019637246 + .long 1064510347 + .long 2901018414 + .long 3211991061 + .long 2171427566 + .long 1063868144 + .long 678185093 + .long 3210287638 + .long 2685165718 + .long 1061401571 + .long 710336199 + .long 3207152667 + .long 2733135798 + .long 1057659331 + .long 886948177 + .long 3202751664 + .long 3345834247 + .long 1052218043 + .long 908728048 + .long 1047925874 + .long 0 + .long 3221946368 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4240302093 + .long 1016867082 + .long 1832260410 + .long 1072690271 + .long 154153694 + .long 1063730412 + .long 2094548181 + .long 3211211898 + .long 1392727515 + .long 1063180837 + .long 3132890025 + .long 3209604411 + .long 483611698 + .long 1060651750 + .long 4246355421 + .long 3206519479 + .long 1424637421 + .long 1057044161 + .long 2138185318 + .long 3202290304 + .long 2276282642 + .long 1052095798 + .long 4227780935 + .long 3196067472 + .long 0 + .long 3222077440 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2485733495 + .long 1017000498 + .long 484092514 + .long 1072691442 + .long 1653085170 + .long 1063007344 + .long 2893019346 + .long 3210489400 + .long 878866243 + .long 1062388018 + .long 2113174452 + .long 3208818852 + .long 2654141437 + .long 1059959432 + .long 3578550869 + .long 3205727739 + .long 315005006 + .long 1056288680 + .long 3246956604 + .long 3201593495 + .long 2197286540 + .long 1051718329 + .long 3044885069 + .long 3196227269 + .long 0 + .long 3222208512 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2794994668 + .long 1016833037 + .long 3287420517 + .long 1072692394 + .long 4133778764 + .long 1061857404 + .long 689562148 + .long 3209340342 + .long 1404089106 + .long 1061273627 + .long 1292441425 + .long 3207706805 + .long 93671116 + .long 1058816787 + .long 2903327974 + .long 3204626398 + .long 4279279273 + .long 1055202414 + .long 134688023 + .long 3200552187 + .long 3315379764 + .long 1050761310 + .long 2945780649 + .long 3195568939 + .long 0 + .long 3222339584 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2135621136 + .long 1016053539 + .long 309961636 + .long 1072692934 + .long 672792810 + .long 1060347512 + .long 2960305506 + .long 3207830967 + .long 1703867620 + .long 1059726750 + .long 824905914 + .long 3206160796 + .long 3036017847 + .long 1057284422 + .long 923304464 + .long 3203122673 + .long 1848642304 + .long 1053791859 + .long 2215350763 + .long 3199158388 + .long 3049848127 + .long 1049324210 + .long 3861893815 + .long 3194293196 + .long 0 + .long 3222470656 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2236028675 + .long 1016891036 + .long 2177293363 + .long 1072693132 + .long 776830057 + .long 1058856794 + .long 4190004158 + .long 3206340337 + .long 209955488 + .long 1058225857 + .long 845130443 + .long 3204660651 + .long 4204313304 + .long 1055835544 + .long 364525198 + .long 3201597210 + .long 3889299905 + .long 1052205563 + .long 1514389355 + .long 3197586647 + .long 1706817756 + .long 1047834665 + .long 3817417318 + .long 3192934132 + .long 0 + .long 3222601728 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1074033072 + .long 1013200912 + .long 2197899301 + .long 1072693205 + .long 1097614282 + .long 1057308273 + .long 209489097 + .long 3204791893 + .long 3641526339 + .long 1056723664 + .long 1792794946 + .long 3203158586 + .long 584598707 + .long 1054254910 + .long 253996240 + .long 3200135633 + .long 642640562 + .long 1050754580 + .long 3147361740 + .long 3196139610 + .long 1167319222 + .long 1046395158 + .long 3488053038 + .long 3191370264 + .long 0 + .long 3222732800 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 871679747 + .long 1016222468 + .long 1586311569 + .long 1072693232 + .long 4199724405 + .long 1055867613 + .long 3041006250 + .long 3203351246 + .long 482130003 + .long 1055184672 + .long 1689676855 + .long 3201619703 + .long 116121201 + .long 1052814264 + .long 4166318198 + .long 3198564764 + .long 388552649 + .long 1049191609 + .long 1384400086 + .long 3194577312 + .long 135589376 + .long 1044819515 + .long 2497367318 + .long 3189906305 + .long 0 + .long 3222863872 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 752986014 + .long 1014740322 + .long 1072834312 + .long 1072693242 + .long 1389704451 + .long 1054277685 + .long 817998738 + .long 3201761329 + .long 996777029 + .long 1053731553 + .long 811547911 + .long 3200166603 + .long 1604093935 + .long 1051232383 + .long 2381858127 + .long 3197131472 + .long 806055999 + .long 1047703656 + .long 443662424 + .long 3193089938 + .long 2855612429 + .long 1043379518 + .long 3671581230 + .long 3188373004 + .long 0 + .long 3222994944 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4161630806 + .long 1015796140 + .long 3799386689 + .long 1072693245 + .long 516062805 + .long 1052830799 + .long 6188716 + .long 3200314446 + .long 79447568 + .long 1052151909 + .long 223529141 + .long 3198586975 + .long 1557009707 + .long 1049758991 + .long 1527834451 + .long 3195539792 + .long 3841571054 + .long 1046184222 + .long 3228035136 + .long 3191570603 + .long 2497745717 + .long 1041799395 + .long 3127975351 + .long 3186863029 + .long 0 + .long 3223126016 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3013228433 + .long 1015734301 + .long 952591976 + .long 1072693247 + .long 3849195912 + .long 1051256594 + .long 1248135057 + .long 3198740242 + .long 1658384276 + .long 1050712587 + .long 3312197895 + .long 3197147657 + .long 2426751598 + .long 1048219658 + .long 2075412918 + .long 3194074453 + .long 1194511818 + .long 1044659399 + .long 2861395540 + .long 3190045864 + .long 1105252788 + .long 1040325059 + .long 278204179 + .long 3185374362 + .long 0 + .long 3223257088 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4084683796 + .long 1014352664 + .long 3549182448 + .long 1072693247 + .long 4170486715 + .long 1048984034 + .long 3652359522 + .long 3196467682 + .long 1780445294 + .long 1048420995 + .long 3329441198 + .long 3194856066 + .long 663245309 + .long 1045935418 + .long 1918070306 + .long 3191839818 + .long 4225866973 + .long 1042419329 + .long 1974315224 + .long 3187805832 + .long 847480060 + .long 1038120500 + .long 2386310431 + .long 3183105031 + .long 0 + .long 3223388160 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 951119343 + .long 1016641415 + .long 4194036288 + .long 1072693247 + .long 4207053894 + .long 1045958742 + .long 4131013457 + .long 3193442390 + .long 2503178506 + .long 1045433060 + .long 2309798544 + .long 3191868132 + .long 1503762043 + .long 1042918157 + .long 762244907 + .long 3188792499 + .long 3745081608 + .long 1039371450 + .long 3106729171 + .long 3184757959 + .long 3799011378 + .long 1035063995 + .long 693003136 + .long 3180102041 + .long 0 + .long 3223519232 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1712896388 + .long 1016000193 + .long 4281307769 + .long 1072693247 + .long 3495080264 + .long 1042943408 + .long 3483806577 + .long 3190427056 + .long 3577360645 + .long 1042374261 + .long 3557467263 + .long 3188809333 + .long 3692227868 + .long 1039911516 + .long 1459944482 + .long 3185739496 + .long 624248087 + .long 1036331657 + .long 3930021706 + .long 3181718167 + .long 439009527 + .long 1032014849 + .long 3184212578 + .long 3177110789 + .long 0 + .long 3223650304 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1958475666 + .long 1013700788 + .long 4293118680 + .long 1072693247 + .long 3829159519 + .long 1039938855 + .long 3827364885 + .long 3187422503 + .long 2374004141 + .long 1039322650 + .long 2380228874 + .long 3185757722 + .long 853065064 + .long 1036916376 + .long 3897809499 + .long 3182694159 + .long 2467115425 + .long 1033300621 + .long 2966460473 + .long 3178687133 + .long 4249027489 + .long 1028973684 + .long 3391824522 + .long 3174085926 + .long 0 + .long 3223781376 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1028808661 + .long 1012328597 + .long 4294717113 + .long 1072693247 + .long 2759857858 + .long 1036945975 + .long 2759440340 + .long 3184429623 + .long 217750550 + .long 1036278821 + .long 228557927 + .long 3182713893 + .long 868996329 + .long 1033914811 + .long 130294465 + .long 3179657124 + .long 3979034581 + .long 1030279068 + .long 1690522291 + .long 3175665582 + .long 141102418 + .long 1025941166 + .long 3942643114 + .long 3171030731 + .long 0 + .long 3223912448 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2461075155 + .long 1015729939 + .long 4294933437 + .long 1072693247 + .long 2559161110 + .long 1033930834 + .long 2559046852 + .long 3181414482 + .long 3206412049 + .long 1033243416 + .long 3218709064 + .long 3179678488 + .long 2091270467 + .long 1030857342 + .long 245853585 + .long 3176629075 + .long 1555900931 + .long 1027267783 + .long 1186881303 + .long 3172654298 + .long 1695278520 + .long 1022918007 + .long 1853146834 + .long 3167983022 + .long 0 + .long 3224043520 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2502502488 + .long 1016572066 + .long 4294962713 + .long 1072693247 + .long 3137376149 + .long 1030874690 + .long 3137268820 + .long 3178358338 + .long 1097103169 + .long 1030217134 + .long 1110504267 + .long 3176652206 + .long 1068377398 + .long 1027807171 + .long 222176953 + .long 3173610756 + .long 3440315131 + .long 1024267613 + .long 1199778592 + .long 3169654130 + .long 257981480 + .long 1019904983 + .long 1388437918 + .long 3164943417 + .long 0 + .long 3224174592 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3418697838 + .long 1016821878 + .long 4294966675 + .long 1072693247 + .long 3798207862 + .long 1027825953 + .long 3798094058 + .long 3175309601 + .long 3391459718 + .long 1027200727 + .long 3405981646 + .long 3173635799 + .long 3694208074 + .long 1024764900 + .long 2192272311 + .long 3170602971 + .long 1464408928 + .long 1021279479 + .long 2201370875 + .long 3166665997 + .long 4139632468 + .long 1016902930 + .long 2981161402 + .long 3161912586 + .long 0 + .long 3224305664 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 3589768515 + .long 1013972501 + .long 4294967265 + .long 1072693247 + .long 2293865510 + .long 1023336450 + .long 2097549026 + .long 3170820098 + .long 2721138850 + .long 1022661962 + .long 1571631120 + .long 3169097035 + .long 3716649917 + .long 1020295299 + .long 3146231247 + .long 3166041588 + .long 84506245 + .long 1016656297 + .long 2231398946 + .long 3162043093 + .long 3305646943 + .long 1012441980 + .long 402214167 + .long 3157503609 + .long 0 + .long 3224436736 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2152156943 + .long 1016184605 + .long 4294967294 + .long 1072693247 + .long 1074684533 + .long 1018634353 + .long 1074437943 + .long 3166118001 + .long 967276073 + .long 1018090988 + .long 995296768 + .long 3164526060 + .long 4275132894 + .long 1015589675 + .long 304133116 + .long 3161485853 + .long 1232215992 + .long 1012058464 + .long 559363548 + .long 3157444977 + .long 1487618473 + .long 1007759094 + .long 2355811294 + .long 3152771929 + .long 3381626085 + .long 3224537056 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 4294967295 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .long 0 + .long 2147483648 + .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 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2147352576 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 1069416448 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 7733248 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .long 535822336 + .type __svml_dtanh_data_internal,@object + .size __svml_dtanh_data_internal,10816 + .align 8 + +__dtanh_la__imldTanhTab: + .long 0 + .long 1072693248 + .long 0 + .long 3220176896 + .type __dtanh_la__imldTanhTab,@object + .size __dtanh_la__imldTanhTab,16 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core-avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core-avx2.S new file mode 100644 index 0000000000..76bb22229e --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core-avx2.S @@ -0,0 +1,20 @@ +/* AVX2 version of vectorized tanhf. + 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_tanhf _ZGVeN16v_tanhf_avx2_wrapper +#include "../svml_s_tanhf16_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c new file mode 100644 index 0000000000..cec4c7ed74 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized tanhf, 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_tanhf +#include "ifunc-mathvec-avx512-skx.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVeN16v_tanhf, __GI__ZGVeN16v_tanhf, + __redirect__ZGVeN16v_tanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core_avx512.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core_avx512.S new file mode 100644 index 0000000000..61cba392e8 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf16_core_avx512.S @@ -0,0 +1,1765 @@ +/* Function tanhf 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: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.exex512,"ax",@progbits +ENTRY(_ZGVeN16v_tanhf_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, %zmm1 + vmovups __svml_stanh_data_internal(%rip), %zmm9 + vmovups 896+__svml_stanh_data_internal(%rip), %zmm11 + vmovups 768+__svml_stanh_data_internal(%rip), %zmm12 + vmovups 640+__svml_stanh_data_internal(%rip), %zmm13 + vmovups 512+__svml_stanh_data_internal(%rip), %zmm14 + vmovups 384+__svml_stanh_data_internal(%rip), %zmm15 + vpternlogd $255, %zmm2, %zmm2, %zmm2 + vandps 5696+__svml_stanh_data_internal(%rip), %zmm1, %zmm8 + vandps 5632+__svml_stanh_data_internal(%rip), %zmm1, %zmm0 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + vpandd 1152+__svml_stanh_data_internal(%rip), %zmm1, %zmm3 + vpsubd 1216+__svml_stanh_data_internal(%rip), %zmm3, %zmm4 + vpcmpd $2, 5824+__svml_stanh_data_internal(%rip), %zmm3, %k1 + +/* + * small table specific variables * + * Constant loading + */ + vpxord %zmm5, %zmm5, %zmm5 + +/* if VMIN, VMAX is defined for I type */ + vpmaxsd %zmm5, %zmm4, %zmm6 + vpminsd 1280+__svml_stanh_data_internal(%rip), %zmm6, %zmm7 + vpsrld $21, %zmm7, %zmm10 + vmovups 1024+__svml_stanh_data_internal(%rip), %zmm4 + vpermt2ps 64+__svml_stanh_data_internal(%rip), %zmm10, %zmm9 + vpermt2ps 960+__svml_stanh_data_internal(%rip), %zmm10, %zmm11 + vpermt2ps 1088+__svml_stanh_data_internal(%rip), %zmm10, %zmm4 + vpermt2ps 832+__svml_stanh_data_internal(%rip), %zmm10, %zmm12 + vpermt2ps 704+__svml_stanh_data_internal(%rip), %zmm10, %zmm13 + vpermt2ps 576+__svml_stanh_data_internal(%rip), %zmm10, %zmm14 + vpermt2ps 448+__svml_stanh_data_internal(%rip), %zmm10, %zmm15 + vpandnd %zmm3, %zmm3, %zmm2{%k1} + vptestmd %zmm2, %zmm2, %k0 + vmovups 128+__svml_stanh_data_internal(%rip), %zmm3 + vsubps {rn-sae}, %zmm9, %zmm8, %zmm2 + kmovw %k0, %edx + vfmadd213ps {rn-sae}, %zmm11, %zmm2, %zmm4 + vpermt2ps 192+__svml_stanh_data_internal(%rip), %zmm10, %zmm3 + vfmadd213ps {rn-sae}, %zmm12, %zmm2, %zmm4 + vfmadd213ps {rn-sae}, %zmm13, %zmm2, %zmm4 + vfmadd213ps {rn-sae}, %zmm14, %zmm2, %zmm4 + vfmadd213ps {rn-sae}, %zmm15, %zmm2, %zmm4 + vfmadd213ps {rn-sae}, %zmm3, %zmm2, %zmm4 + vorps %zmm0, %zmm4, %zmm0 + testl %edx, %edx + jne L(2) + +L(1): + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + +L(2): + vmovups %zmm1, 64(%rsp) + vmovups %zmm0, 128(%rsp) + je L(1) + 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 + +L(3): + btl %r12d, %r13d + jc L(5) + +L(4): + incl %r12d + cmpl $16, %r12d + jl L(3) + 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 L(1) + .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 + +L(5): + lea 64(%rsp,%r12,4), %rdi + lea 128(%rsp,%r12,4), %rsi + call __svml_stanh_cout_rare_internal + jmp L(4) + +END(_ZGVeN16v_tanhf_skx) + + .align 16,0x90 + +__svml_stanh_cout_rare_internal: + + cfi_startproc + + lea __stanh_la__imlsTanhTab(%rip), %rdx + movb 3(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 2(%rdi), %r8d + andl $32640, %r8d + movl (%rdx,%rcx,4), %eax + cmpl $32640, %r8d + je L(8) + +L(6): + movl %eax, (%rsi) + +L(7): + xorl %eax, %eax + ret + +L(8): + testl $8388607, (%rdi) + je L(6) + movss (%rdi), %xmm0 + addss %xmm0, %xmm0 + movss %xmm0, (%rsi) + jmp L(7) + + cfi_endproc + + .type __svml_stanh_cout_rare_internal,@function + .size __svml_stanh_cout_rare_internal,.-__svml_stanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_stanh_data_internal: + .long 0 + .long 1030750208 + .long 1032847360 + .long 1034944512 + .long 1037041664 + .long 1039138816 + .long 1041235968 + .long 1043333120 + .long 1045430272 + .long 1047527424 + .long 1049624576 + .long 1051721728 + .long 1053818880 + .long 1055916032 + .long 1058013184 + .long 1060110336 + .long 1062207488 + .long 1064304640 + .long 1066401792 + .long 1068498944 + .long 1070596096 + .long 1072693248 + .long 1074790400 + .long 1076887552 + .long 1078984704 + .long 1081081856 + .long 1083179008 + .long 1085276160 + .long 1087373312 + .long 1089470464 + .long 1091567616 + .long 0 + .long 0 + .long 1030732233 + .long 1032831839 + .long 1034916201 + .long 1036994987 + .long 1039067209 + .long 1041174248 + .long 1043220868 + .long 1045245838 + .long 1047245614 + .long 1049383373 + .long 1051287907 + .long 1053115377 + .long 1054857013 + .long 1057129528 + .long 1058581488 + .long 1059832960 + .long 1060891676 + .long 1062153819 + .long 1063337043 + .long 1064100733 + .long 1064582223 + .long 1064984555 + .long 1065216645 + .long 1065302845 + .long 1065334668 + .long 1065349076 + .long 1065352656 + .long 1065353140 + .long 1065353206 + .long 1065353215 + .long 1065353216 + .long 0 + .long 2963361822 + .long 2971470750 + .long 2945658640 + .long 821708412 + .long 824483568 + .long 824941280 + .long 2984085072 + .long 2957298688 + .long 838449816 + .long 2966046080 + .long 2988320324 + .long 2989804564 + .long 842626356 + .long 3000013710 + .long 2972725824 + .long 3002017674 + .long 853753500 + .long 2987104448 + .long 3000350914 + .long 855535800 + .long 852410906 + .long 851608946 + .long 2988641656 + .long 2997011000 + .long 2989576736 + .long 3000884068 + .long 2999984336 + .long 840950056 + .long 2995215280 + .long 855269702 + .long 0 + .long 1065353216 + .long 1065295748 + .long 1065270545 + .long 1065229919 + .long 1065181343 + .long 1065124909 + .long 1065025765 + .long 1064867200 + .long 1064679597 + .long 1064464345 + .long 1064093083 + .long 1063517074 + .long 1062862743 + .long 1062146519 + .long 1060992371 + .long 1059386208 + .long 1057800167 + .long 1055660649 + .long 1051764737 + .long 1046959010 + .long 1041444634 + .long 1035462611 + .long 1026689093 + .long 1015337940 + .long 1002731447 + .long 990958554 + .long 973168670 + .long 948705851 + .long 924299482 + .long 899955662 + .long 864224966 + .long 0 + .long 2956213371 + .long 3178161821 + .long 3180268967 + .long 3182315389 + .long 3184339487 + .long 3186337805 + .long 3188474939 + .long 3190373619 + .long 3192189570 + .long 3193910865 + .long 3196176320 + .long 3197556682 + .long 3198679950 + .long 3199536798 + .long 3200331518 + .long 3200564882 + .long 3200049264 + .long 3199029518 + .long 3197040598 + .long 3192620804 + .long 3188208183 + .long 3182392393 + .long 3173916356 + .long 3162750726 + .long 3150176437 + .long 3138431708 + .long 3120650203 + .long 3096189170 + .long 3071783062 + .long 3047439278 + .long 3011707180 + .long 0 + .long 3198855845 + .long 3198879250 + .long 3198677023 + .long 3198476576 + .long 3198388151 + .long 3198245218 + .long 3197982711 + .long 3197594458 + .long 3197117197 + .long 3196587519 + .long 3195304371 + .long 3192667528 + .long 3189843074 + .long 3186330810 + .long 3177085101 + .long 1013669486 + .long 1032032579 + .long 1036132065 + .long 1038305199 + .long 1036774550 + .long 1033498413 + .long 1028927137 + .long 1021175553 + .long 1009568359 + .long 998361895 + .long 985691041 + .long 967585842 + .long 943363289 + .long 919210013 + .long 895139148 + .long 858471606 + .long 0 + .long 3077428921 + .long 3189516141 + .long 1008586543 + .long 1036101517 + .long 1033304453 + .long 1034073627 + .long 1036071831 + .long 1037235824 + .long 1039436298 + .long 1040631208 + .long 1041906362 + .long 1042793477 + .long 1043232976 + .long 1043086916 + .long 1042100375 + .long 1039444212 + .long 1034126600 + .long 1026638186 + .long 995501655 + .long 3165579977 + .long 3167654937 + .long 3165317828 + .long 3158960080 + .long 3148291549 + .long 3137354510 + .long 3124730373 + .long 3106670759 + .long 3082457650 + .long 3058305807 + .long 3034235241 + .long 2997581996 + .long 0 + .long 1040781545 + .long 1131811139 + .long 1097198812 + .long 3247503190 + .long 3230402941 + .long 3224086547 + .long 3212798938 + .long 1059790272 + .long 1053691997 + .long 1061317268 + .long 3134918084 + .long 1034173207 + .long 3176246152 + .long 3165561405 + .long 3174788493 + .long 3178015405 + .long 3178847213 + .long 3177176538 + .long 3171127099 + .long 3155996003 + .long 985352038 + .long 999682315 + .long 998398067 + .long 989522534 + .long 977926264 + .long 966355955 + .long 948911724 + .long 924561635 + .long 900244966 + .long 875993879 + .long 841254832 + .long 0 + .long 3155046246 + .long 1175181842 + .long 1138112751 + .long 3286309950 + .long 3267011817 + .long 3259619885 + .long 3246758786 + .long 1088248663 + .long 1078543936 + .long 1086795944 + .long 3205436942 + .long 1043392367 + .long 3198686087 + .long 3182586396 + .long 3174374999 + .long 3142320544 + .long 1008565243 + .long 1014115537 + .long 1016545052 + .long 1010017051 + .long 998649588 + .long 975680464 + .long 3124451591 + .long 3121544226 + .long 3112148751 + .long 3100159824 + .long 3082673659 + .long 3058641232 + .long 3034613169 + .long 3010665978 + .long 2975473412 + .long 0 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 0 + .long 0 + .long 36466923 + .long 1072693248 + .long 2365563284 + .long 3201306247 + .long 1829111721 + .long 3218428278 + .long 3823420055 + .long 3193165324 + .long 1098370908 + .long 1072693250 + .long 2493848101 + .long 3205978300 + .long 1742787824 + .long 3218423470 + .long 4013086462 + .long 3193609799 + .long 3667406935 + .long 1072693250 + .long 1352570026 + .long 3206273363 + .long 1445916117 + .long 3218422747 + .long 3835089556 + .long 3194065339 + .long 2420711447 + .long 1072693251 + .long 2169133006 + .long 3206574718 + .long 101347106 + .long 3218421982 + .long 713636389 + .long 3194411770 + .long 1709214929 + .long 1072693252 + .long 1710199222 + .long 3206758855 + .long 2216669086 + .long 3218421174 + .long 3814844772 + .long 3194836884 + .long 1591910603 + .long 1072693253 + .long 2011589771 + .long 3206962796 + .long 3721194918 + .long 3218420324 + .long 1295469166 + .long 3195182212 + .long 2130808979 + .long 1072693254 + .long 1222040805 + .long 3207187539 + .long 555871541 + .long 3218419433 + .long 401254514 + .long 3195493098 + .long 3390924472 + .long 1072693255 + .long 3112838711 + .long 3207434078 + .long 1558155560 + .long 3218418499 + .long 683885552 + .long 3195864282 + .long 1145294069 + .long 1072693257 + .long 1821670117 + .long 3207648695 + .long 2692181933 + .long 3218417523 + .long 2704036295 + .long 3196181879 + .long 4054831834 + .long 1072693258 + .long 1649153664 + .long 3207795248 + .long 4228604383 + .long 3218416505 + .long 4004758581 + .long 3196440654 + .long 3603542514 + .long 1072693260 + .long 1123737044 + .long 3207954183 + .long 2154630785 + .long 3218415446 + .long 2606327835 + .long 3196743208 + .long 4163276658 + .long 1072693262 + .long 2048619642 + .long 3208125991 + .long 1058893780 + .long 3218414345 + .long 250194901 + .long 3197094852 + .long 1518877548 + .long 1072693265 + .long 3379868633 + .long 3208311162 + .long 1246516380 + .long 3218413202 + .long 1621358934 + .long 3197304764 + .long 48033162 + .long 1072693268 + .long 957106177 + .long 3208510185 + .long 3034045498 + .long 3218412017 + .long 798414253 + .long 3197538466 + .long 4131323741 + .long 1072693270 + .long 2207647163 + .long 3208683052 + .long 2454449664 + .long 3218410791 + .long 1709648499 + .long 3197805932 + .long 972334142 + .long 1072693274 + .long 1279092327 + .long 3208797143 + .long 4141984674 + .long 3218409523 + .long 4279927728 + .long 3198110676 + .long 3547307714 + .long 1072693277 + .long 873763845 + .long 3208918886 + .long 4152286949 + .long 3218408214 + .long 947630201 + .long 3198400037 + .long 3779918761 + .long 1072693283 + .long 2452756690 + .long 3209115951 + .long 2900277560 + .long 3218406175 + .long 4114829322 + .long 3198840356 + .long 1550746642 + .long 1072693293 + .long 3179273584 + .long 3209408258 + .long 1697097694 + .long 3218403310 + .long 3189856208 + .long 3199299134 + .long 2567958063 + .long 1072693304 + .long 2177201355 + .long 3209713300 + .long 663593652 + .long 3218400281 + .long 1915839956 + .long 3199641526 + .long 3400799630 + .long 1072693317 + .long 2625933576 + .long 3209895292 + .long 3140727122 + .long 3218397088 + .long 2825210621 + .long 3200061154 + .long 661592278 + .long 1072693333 + .long 2751163500 + .long 3210096603 + .long 4055449010 + .long 3218393733 + .long 57286782 + .long 3200412116 + .long 3889851982 + .long 1072693350 + .long 2680384314 + .long 3210318153 + .long 2804057046 + .long 3218390217 + .long 1812582369 + .long 3200718155 + .long 1191734144 + .long 1072693371 + .long 867498228 + .long 3210560852 + .long 3250577733 + .long 3218386540 + .long 3326742410 + .long 3201083020 + .long 2188854007 + .long 1072693394 + .long 363145135 + .long 3210782655 + .long 840173644 + .long 3218382704 + .long 1735074843 + .long 3201408616 + .long 3657661222 + .long 1072693420 + .long 2204762872 + .long 3210926495 + .long 4072217384 + .long 3218378708 + .long 2965875284 + .long 3201662196 + .long 2413420961 + .long 1072693450 + .long 1162405510 + .long 3211082241 + .long 138720143 + .long 3218374556 + .long 454705634 + .long 3201958187 + .long 3899194868 + .long 1072693483 + .long 669033796 + .long 3211250324 + .long 2167069495 + .long 3218370246 + .long 1542529428 + .long 3202301612 + .long 710018948 + .long 1072693521 + .long 2883210692 + .long 3211431169 + .long 1973418570 + .long 3218365781 + .long 3156689511 + .long 3202524481 + .long 2656657906 + .long 1072693562 + .long 3498100032 + .long 3211625196 + .long 125419693 + .long 3218361162 + .long 1620715508 + .long 3202751895 + .long 2404819887 + .long 1072693608 + .long 4021715948 + .long 3211810552 + .long 1645154164 + .long 3218356389 + .long 703452016 + .long 3203011668 + .long 1243884135 + .long 1072693659 + .long 480742811 + .long 3211921363 + .long 3122063309 + .long 3218351464 + .long 223504399 + .long 3203307063 + .long 495862037 + .long 1072693715 + .long 300794004 + .long 3212039372 + .long 1300653287 + .long 3218346389 + .long 1176592120 + .long 3203610816 + .long 3274452673 + .long 1072693808 + .long 2613861807 + .long 3212229889 + .long 359514654 + .long 3218338503 + .long 2923503278 + .long 3204034910 + .long 3741678157 + .long 1072693954 + .long 3651935792 + .long 3212511436 + .long 2702507736 + .long 3218327463 + .long 2210624435 + .long 3204506468 + .long 1100251351 + .long 1072694127 + .long 3514265607 + .long 3212825173 + .long 957470414 + .long 3218315845 + .long 1305550937 + .long 3204833184 + .long 2996845965 + .long 1072694328 + .long 3142229264 + .long 3213004685 + .long 1883674585 + .long 3218303659 + .long 3326598907 + .long 3205231584 + .long 274977645 + .long 1072694562 + .long 3016319234 + .long 3213195820 + .long 1539002348 + .long 3218290918 + .long 3984366897 + .long 3205604614 + .long 1292806442 + .long 1072694830 + .long 3262520051 + .long 3213405058 + .long 2372653574 + .long 3218277634 + .long 2452462577 + .long 3205892032 + .long 1815353697 + .long 1072695136 + .long 3662183375 + .long 3213632998 + .long 250148789 + .long 3218263821 + .long 2158010733 + .long 3206232708 + .long 2150433494 + .long 1072695483 + .long 3919565056 + .long 3213880202 + .long 1540395291 + .long 3218249491 + .long 3182910565 + .long 3206589369 + .long 2808974545 + .long 1072695874 + .long 1965799910 + .long 3214016317 + .long 1545570484 + .long 3218234659 + .long 1413633121 + .long 3206823218 + .long 164723038 + .long 1072696313 + .long 81021250 + .long 3214159950 + .long 1583468454 + .long 3218219339 + .long 18571726 + .long 3207094384 + .long 3588317822 + .long 1072696801 + .long 4095098713 + .long 3214313941 + .long 298038316 + .long 3218203546 + .long 912947688 + .long 3207406859 + .long 1041448961 + .long 1072697344 + .long 4179586945 + .long 3214478495 + .long 2148027612 + .long 3218187294 + .long 3720520462 + .long 3207679413 + .long 1980273179 + .long 1072697943 + .long 1752543433 + .long 3214653794 + .long 124299728 + .long 3218170600 + .long 864061540 + .long 3207883361 + .long 2949417123 + .long 1072698602 + .long 4190073881 + .long 3214839998 + .long 1415544749 + .long 3218153478 + .long 3694676202 + .long 3208114560 + .long 420771937 + .long 1072699325 + .long 1282420231 + .long 3214985633 + .long 1533345938 + .long 3218135945 + .long 2892854837 + .long 3208375402 + .long 3632588569 + .long 1072700113 + .long 2712748874 + .long 3215089842 + .long 1386124246 + .long 3218118017 + .long 1634175019 + .long 3208733922 + .long 347483009 + .long 1072701423 + .long 1161341506 + .long 3215256321 + .long 1877668895 + .long 3218090451 + .long 4108664264 + .long 3209099007 + .long 3038559136 + .long 1072703435 + .long 2683048238 + .long 3215498732 + .long 1179454900 + .long 3218025113 + .long 1332126937 + .long 3209546908 + .long 3486307715 + .long 1072705767 + .long 2508275841 + .long 3215764027 + .long 359393231 + .long 3217946511 + .long 1961215910 + .long 3209890029 + .long 2252418763 + .long 1072708441 + .long 2827865151 + .long 3216017387 + .long 3509880367 + .long 3217865627 + .long 3222140085 + .long 3210213923 + .long 1486994624 + .long 1072711477 + .long 3160629487 + .long 3216172802 + .long 1178047112 + .long 3217782741 + .long 1901428593 + .long 3210596649 + .long 3746562216 + .long 1072714893 + .long 1033996001 + .long 3216339382 + .long 39866696 + .long 3217698130 + .long 2908573463 + .long 3210891953 + .long 2324761591 + .long 1072718707 + .long 2389401627 + .long 3216516876 + .long 3645939838 + .long 3217612071 + .long 2440236284 + .long 3211151116 + .long 1761407793 + .long 1072722932 + .long 2502005220 + .long 3216704962 + .long 1997398717 + .long 3217524842 + .long 2895026412 + .long 3211448596 + .long 4114502182 + .long 1072727579 + .long 2605061383 + .long 3216903247 + .long 58515002 + .long 3217436714 + .long 711731960 + .long 3211787230 + .long 3951984035 + .long 1072732658 + .long 3516063216 + .long 3217071220 + .long 3638757279 + .long 3217347953 + .long 3233370794 + .long 3211979005 + .long 658281779 + .long 1072738175 + .long 309554960 + .long 3217179845 + .long 1331214594 + .long 3217258823 + .long 2937534811 + .long 3212193451 + .long 2289001467 + .long 1072744131 + .long 2442043690 + .long 3217292793 + .long 2664085653 + .long 3217169576 + .long 3462081454 + .long 3212432263 + .long 3795084150 + .long 1072750527 + .long 1130374688 + .long 3217409754 + .long 3638257201 + .long 3217080459 + .long 3906637920 + .long 3212696488 + .long 4040275044 + .long 1072757360 + .long 3643517564 + .long 3217530392 + .long 4148962921 + .long 3216952251 + .long 1995056602 + .long 3212911950 + .long 1479928784 + .long 1072764624 + .long 2653868580 + .long 3217654355 + .long 1010106713 + .long 3216775940 + .long 3129357315 + .long 3213070764 + .long 2856812514 + .long 1072772308 + .long 1621093115 + .long 3217781272 + .long 1824031529 + .long 3216601249 + .long 2296680075 + .long 3213333328 + .long 2460843475 + .long 1072784536 + .long 3722925065 + .long 3217975665 + .long 3901534801 + .long 3216343697 + .long 741495589 + .long 3213734822 + .long 13033194 + .long 1072802249 + .long 1706090638 + .long 3218161084 + .long 4129724113 + .long 3216008854 + .long 2582831738 + .long 3214039094 + .long 3092949488 + .long 1072821329 + .long 4163404160 + .long 3218296789 + .long 673560195 + .long 3215391593 + .long 1852259695 + .long 3214295490 + .long 3663604487 + .long 1072841572 + .long 2783926416 + .long 3218433189 + .long 538028418 + .long 3214623601 + .long 955002681 + .long 3214577680 + .long 1457520314 + .long 1072862739 + .long 2977011911 + .long 3218568683 + .long 2456605794 + .long 3213048602 + .long 1782979473 + .long 3214883178 + .long 3136246603 + .long 1072884563 + .long 4172123069 + .long 3218701739 + .long 1041205303 + .long 1065062250 + .long 1494191018 + .long 3215071352 + .long 2030188257 + .long 1072906761 + .long 242335435 + .long 3218830924 + .long 3225388224 + .long 1066807264 + .long 2597486284 + .long 3215242091 + .long 1527970838 + .long 1072929036 + .long 2966426512 + .long 3218954923 + .long 1554080475 + .long 1067589039 + .long 1299968651 + .long 3215418462 + .long 3575385503 + .long 1072951087 + .long 2115725422 + .long 3219072567 + .long 1970202642 + .long 1068007486 + .long 633750547 + .long 3215597833 + .long 4170701031 + .long 1072972617 + .long 46586082 + .long 3219155579 + .long 1194653136 + .long 1068384025 + .long 4171340731 + .long 3215777352 + .long 3578160514 + .long 1072993337 + .long 3238411740 + .long 3219206599 + .long 3278559237 + .long 1068609006 + .long 2404931200 + .long 3215954013 + .long 533888921 + .long 1073012973 + .long 1507597629 + .long 3219253160 + .long 2386969249 + .long 1068756225 + .long 272720058 + .long 3216053653 + .long 54544651 + .long 1073031269 + .long 3020671348 + .long 3219294996 + .long 4122670807 + .long 1068883785 + .long 2536786852 + .long 3216134458 + .long 230026772 + .long 1073047994 + .long 2830531360 + .long 3219331923 + .long 2545616196 + .long 1068992498 + .long 3897096954 + .long 3216209170 + .long 867435464 + .long 1073062943 + .long 3935983781 + .long 3219363830 + .long 4280666630 + .long 1069083305 + .long 1614478429 + .long 3216276286 + .long 3991143559 + .long 1073075939 + .long 3165050417 + .long 3219390677 + .long 248866814 + .long 1069157251 + .long 2328429718 + .long 3216358398 + .long 1880129173 + .long 1073091258 + .long 4059723411 + .long 3219421162 + .long 3082848917 + .long 1069238148 + .long 1081358649 + .long 3216430553 + .long 1955557582 + .long 1073104040 + .long 2869422647 + .long 3219445318 + .long 1310544530 + .long 1069299023 + .long 434435025 + .long 3216450109 + .long 3947018234 + .long 1073107343 + .long 3414641036 + .long 3219451270 + .long 4069313179 + .long 1069313321 + .long 1392468754 + .long 3216410502 + .long 3271741504 + .long 1073101128 + .long 3884994071 + .long 3219440866 + .long 1456085694 + .long 1069290099 + .long 2332856790 + .long 3216307665 + .long 3950891192 + .long 1073085735 + .long 439037894 + .long 3219416288 + .long 1197951536 + .long 1069237765 + .long 4195788421 + .long 3216139842 + .long 3990997338 + .long 1073061787 + .long 550042602 + .long 3219379833 + .long 2832452545 + .long 1069163766 + .long 1200943255 + .long 3215832361 + .long 2073883731 + .long 1073030122 + .long 3042850267 + .long 3219333800 + .long 991641143 + .long 1069074535 + .long 1637244010 + .long 3215243222 + .long 3805163810 + .long 1072991715 + .long 3517445189 + .long 3219280382 + .long 2680864185 + .long 1068975465 + .long 1457843741 + .long 3214140932 + .long 1315080793 + .long 1072947617 + .long 3059804278 + .long 3219221594 + .long 2861308047 + .long 1068870963 + .long 3296491873 + .long 1064537111 + .long 3728462150 + .long 1072898893 + .long 3615137083 + .long 3219159232 + .long 3017963192 + .long 1068764532 + .long 3972434375 + .long 1067468619 + .long 1336398218 + .long 1072846587 + .long 1068664290 + .long 3219061390 + .long 122240345 + .long 1068658880 + .long 508009436 + .long 1068456917 + .long 3501538245 + .long 1072791681 + .long 968690691 + .long 3218931236 + .long 1514516445 + .long 1068556030 + .long 671541798 + .long 1069006173 + .long 3814409280 + .long 1072735081 + .long 1553551847 + .long 3218801852 + .long 2849431279 + .long 1068415930 + .long 285838780 + .long 1069554660 + .long 2881499585 + .long 1072661949 + .long 928028610 + .long 3218674977 + .long 8837506 + .long 1068229231 + .long 4283922105 + .long 1069842903 + .long 1813934616 + .long 1072546640 + .long 2296020303 + .long 3218551962 + .long 3757630126 + .long 1068054242 + .long 4184842874 + .long 1070138481 + .long 1612285858 + .long 1072432209 + .long 3568867548 + .long 3218433820 + .long 2489334631 + .long 1067891605 + .long 3119354956 + .long 1070586029 + .long 1945534618 + .long 1072265408 + .long 12375465 + .long 3218268030 + .long 869568690 + .long 1067671872 + .long 313517472 + .long 1070892138 + .long 1205077106 + .long 1072052753 + .long 2329101392 + .long 3218055718 + .long 31064032 + .long 1067390210 + .long 1106783211 + .long 1071186310 + .long 571472860 + .long 1071856508 + .long 2279775366 + .long 3217706561 + .long 3977902324 + .long 1066976012 + .long 1438560376 + .long 1071467394 + .long 433300635 + .long 1071678859 + .long 2662131044 + .long 3217407122 + .long 3461865003 + .long 1066639491 + .long 3761842524 + .long 1071687909 + .long 591758334 + .long 1071396321 + .long 1311878841 + .long 3217153539 + .long 3007781852 + .long 1066335723 + .long 1614590629 + .long 1071809819 + .long 1253814918 + .long 1071117476 + .long 1728609767 + .long 3216850667 + .long 2200561853 + .long 1065903347 + .long 3821226689 + .long 1071921115 + .long 2022982069 + .long 1070874479 + .long 2030156196 + .long 3216496942 + .long 874711265 + .long 1065560045 + .long 2003227996 + .long 1072021655 + .long 2808404217 + .long 1070664514 + .long 1372837647 + .long 3216204595 + .long 822053276 + .long 1065224094 + .long 3767175364 + .long 1072111660 + .long 3043371777 + .long 1070372670 + .long 1442419211 + .long 3215945892 + .long 298752438 + .long 1064796452 + .long 1111528881 + .long 1072191609 + .long 3513208196 + .long 1070065467 + .long 3837735739 + .long 3215552388 + .long 3701924119 + .long 1064460397 + .long 1230501085 + .long 1072262142 + .long 2161267832 + .long 1069804871 + .long 4188367704 + .long 3215231429 + .long 401190186 + .long 1064089052 + .long 3002339892 + .long 1072323996 + .long 1480019407 + .long 1069584807 + .long 1833655520 + .long 3214970435 + .long 2907956919 + .long 1063676311 + .long 875346000 + .long 1072377952 + .long 3150437403 + .long 1069251888 + .long 876861923 + .long 3214583482 + .long 1689748747 + .long 1063353511 + .long 2795554744 + .long 1072424793 + .long 3869705215 + .long 1068941581 + .long 1837883894 + .long 3214240854 + .long 2762317048 + .long 1062946513 + .long 2491972100 + .long 1072465284 + .long 4114823501 + .long 1068682289 + .long 2146865463 + .long 3213964103 + .long 800804261 + .long 1062552648 + .long 2634953449 + .long 1072500149 + .long 2952556276 + .long 1068433515 + .long 1872935290 + .long 3213596436 + .long 525130857 + .long 1062245296 + .long 3287041404 + .long 1072542855 + .long 164674845 + .long 1067923724 + .long 3273134342 + .long 3213089271 + .long 171708004 + .long 1061610314 + .long 3035032320 + .long 1072586748 + .long 3976243935 + .long 1067403539 + .long 3504708444 + .long 3212404491 + .long 3955947885 + .long 1060882840 + .long 513098494 + .long 1072618404 + .long 416924237 + .long 1066726877 + .long 1788945081 + .long 3211801737 + .long 1199639353 + .long 1060166859 + .long 2284134637 + .long 1072641010 + .long 754275327 + .long 1066136447 + .long 94803481 + .long 3211042671 + .long 3377507017 + .long 1059354147 + .long 1467291457 + .long 1072657015 + .long 2435597312 + .long 1065520743 + .long 2819017772 + .long 3210358609 + .long 1988617747 + .long 1058591581 + .long 633705514 + .long 1072668259 + .long 392269686 + .long 1064864433 + .long 2964449929 + .long 3209729770 + .long 3963893163 + .long 1057889872 + .long 2214892393 + .long 1072676103 + .long 2190738271 + .long 1064315837 + .long 3773826451 + .long 3208969045 + .long 3609404170 + .long 1057113308 + .long 3795216963 + .long 1072681541 + .long 3959981107 + .long 1063599490 + .long 1577139384 + .long 3208281591 + .long 1777963469 + .long 1056319886 + .long 2768813161 + .long 1072685290 + .long 452197850 + .long 1062981751 + .long 625862001 + .long 3207639777 + .long 1894515286 + .long 1055580811 + .long 809336726 + .long 1072687861 + .long 325412222 + .long 1062349073 + .long 3494772326 + .long 3206874482 + .long 3143092609 + .long 1054887561 + .long 1391578948 + .long 1072689615 + .long 370441451 + .long 1061660435 + .long 67458841 + .long 3206180214 + .long 1971759196 + .long 1054066692 + .long 57274217 + .long 1072690807 + .long 293665776 + .long 1061075750 + .long 1340185983 + .long 3205535605 + .long 2210177191 + .long 1053294335 + .long 1110907588 + .long 1072691613 + .long 3961986905 + .long 1060367146 + .long 3774614905 + .long 3204763416 + .long 3590429673 + .long 1052580827 + .long 2737507729 + .long 1072692156 + .long 370479370 + .long 1059701790 + .long 1033751386 + .long 3204059641 + .long 1162278823 + .long 1051830218 + .long 2341375458 + .long 1072692521 + .long 760364123 + .long 1059103172 + .long 910883556 + .long 3203420282 + .long 401067508 + .long 1051028170 + .long 3358303651 + .long 1072692765 + .long 3104773993 + .long 1058369139 + .long 2043715743 + .long 3202639413 + .long 4274377921 + .long 1050278646 + .long 3501940353 + .long 1072692984 + .long 2710387139 + .long 1057384557 + .long 2550611600 + .long 3201592258 + .long 2260324605 + .long 1049158690 + .long 3160989127 + .long 1072693133 + .long 1403521776 + .long 1056074537 + .long 760745859 + .long 3200238663 + .long 1163121055 + .long 1047679067 + .long 3509020169 + .long 1072693198 + .long 3352058101 + .long 1054743188 + .long 2289323607 + .long 3198722761 + .long 918272756 + .long 1046147840 + .long 4268817660 + .long 1072693226 + .long 1580550645 + .long 1053325591 + .long 1736251411 + .long 3197308470 + .long 1531106447 + .long 1044632576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .long 2147483648 + .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 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .type __svml_stanh_data_internal,@object + .size __svml_stanh_data_internal,6016 + .align 4 + +__stanh_la__imlsTanhTab: + .long 1065353216 + .long 3212836864 + .type __stanh_la__imlsTanhTab,@object + .size __stanh_la__imlsTanhTab,8 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S new file mode 100644 index 0000000000..cd290db337 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core-sse2.S @@ -0,0 +1,20 @@ +/* SSE2 version of vectorized tanhf, 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_tanhf _ZGVbN4v_tanhf_sse2 +#include "../svml_s_tanhf4_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c new file mode 100644 index 0000000000..2dcb1f3676 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized tanhf, 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_tanhf +#include "ifunc-mathvec-sse4_1.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVbN4v_tanhf, __GI__ZGVbN4v_tanhf, + __redirect__ZGVbN4v_tanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S new file mode 100644 index 0000000000..93be4cad75 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf4_core_sse4.S @@ -0,0 +1,2144 @@ +/* Function tanhf vectorized with SSE4. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + https://www.gnu.org/licenses/. */ + +/* + * ALGORITHM DESCRIPTION: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.sse4,"ax",@progbits +ENTRY(_ZGVbN4v_tanhf_sse4) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + subq $256, %rsp + lea 1360+__svml_stanh_data_internal(%rip), %rcx + movups %xmm15, 96(%rsp) + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + movaps %xmm0, %xmm15 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + movdqu 5760+__svml_stanh_data_internal(%rip), %xmm6 + +/* if VMIN, VMAX is defined for I type */ + pxor %xmm4, %xmm4 + pand %xmm15, %xmm6 + movdqa %xmm6, %xmm3 + psubd 5888+__svml_stanh_data_internal(%rip), %xmm6 + +/* + * small table specific variables * + * Constant loading + */ + movdqu 5952+__svml_stanh_data_internal(%rip), %xmm7 + movdqa %xmm6, %xmm2 + movdqa %xmm6, %xmm1 + pcmpgtd %xmm7, %xmm2 + pcmpgtd %xmm4, %xmm1 + movdqa %xmm2, %xmm5 + pand %xmm1, %xmm6 + andps %xmm2, %xmm7 + andnps %xmm6, %xmm5 + orps %xmm7, %xmm5 + psrld $14, %xmm5 + movups %xmm12, 160(%rsp) + .cfi_escape 0x10, 0x1d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xa0, 0xff, 0xff, 0xff, 0x22 + pshufd $2, %xmm5, %xmm12 + movd %xmm5, %edx + pshufd $1, %xmm5, %xmm4 + pshufd $3, %xmm5, %xmm5 + movd %xmm12, %r9d + movd %xmm5, %r10d + movd %xmm4, %eax + pcmpgtd 5824+__svml_stanh_data_internal(%rip), %xmm3 + movups 5696+__svml_stanh_data_internal(%rip), %xmm0 + movslq %r9d, %r9 + andps %xmm15, %xmm0 + movslq %edx, %rdx + movslq %r10d, %r10 + movslq %eax, %rax + movups -16(%r9,%rcx), %xmm4 + movmskps %xmm3, %r8d + movaps %xmm4, %xmm12 + movups -16(%rdx,%rcx), %xmm3 + movups -16(%r10,%rcx), %xmm6 + movaps %xmm3, %xmm5 + movups -16(%rax,%rcx), %xmm1 + unpcklpd %xmm6, %xmm12 + unpckhpd %xmm6, %xmm4 + movups (%rdx,%rcx), %xmm6 + unpcklpd %xmm1, %xmm5 + unpckhpd %xmm1, %xmm3 + movaps %xmm6, %xmm1 + movups (%rax,%rcx), %xmm2 + movups (%r9,%rcx), %xmm7 + movups %xmm13, 144(%rsp) + .cfi_escape 0x10, 0x1e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x90, 0xff, 0xff, 0xff, 0x22 + movups (%r10,%rcx), %xmm13 + unpcklpd %xmm2, %xmm1 + unpckhpd %xmm2, %xmm6 + movaps %xmm7, %xmm2 + unpcklpd %xmm13, %xmm2 + unpckhpd %xmm13, %xmm7 + cvtps2pd %xmm0, %xmm13 + movhlps %xmm0, %xmm0 + cvtps2pd %xmm0, %xmm0 + mulpd %xmm13, %xmm6 + mulpd %xmm0, %xmm7 + addpd %xmm1, %xmm6 + addpd %xmm2, %xmm7 + mulpd %xmm13, %xmm6 + mulpd %xmm0, %xmm7 + addpd %xmm3, %xmm6 + addpd %xmm4, %xmm7 + mulpd %xmm6, %xmm13 + mulpd %xmm7, %xmm0 + addpd %xmm5, %xmm13 + addpd %xmm12, %xmm0 + cvtpd2ps %xmm13, %xmm1 + cvtpd2ps %xmm0, %xmm3 + movups %xmm14, 112(%rsp) + .cfi_escape 0x10, 0x1f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x70, 0xff, 0xff, 0xff, 0x22 + movups 5632+__svml_stanh_data_internal(%rip), %xmm14 + movlhps %xmm3, %xmm1 + andps %xmm15, %xmm14 + orps %xmm14, %xmm1 + testl %r8d, %r8d + jne L(2) + +L(1): + movups 160(%rsp), %xmm12 + cfi_restore(29) + movaps %xmm1, %xmm0 + movups 144(%rsp), %xmm13 + cfi_restore(30) + movups 112(%rsp), %xmm14 + cfi_restore(31) + movups 96(%rsp), %xmm15 + cfi_restore(32) + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + .cfi_escape 0x10, 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 + .cfi_escape 0x10, 0x20, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x60, 0xff, 0xff, 0xff, 0x22 + +L(2): + movups %xmm15, 128(%rsp) + movups %xmm1, 192(%rsp) + xorl %eax, %eax + movups %xmm8, 48(%rsp) + movups %xmm9, 32(%rsp) + movups %xmm10, 16(%rsp) + movups %xmm11, (%rsp) + movq %rsi, 72(%rsp) + movq %rdi, 64(%rsp) + movq %r12, 88(%rsp) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 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 %r8d, %r13d + +L(3): + btl %r12d, %r13d + jc L(5) + +L(4): + incl %r12d + cmpl $4, %r12d + jl L(3) + movups 48(%rsp), %xmm8 + cfi_restore(25) + movups 32(%rsp), %xmm9 + cfi_restore(26) + movups 16(%rsp), %xmm10 + cfi_restore(27) + movups (%rsp), %xmm11 + cfi_restore(28) + 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), %xmm1 + jmp L(1) + .cfi_escape 0x10, 0x04, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x48, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x05, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x40, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x58, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0d, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x50, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x19, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x30, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1a, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x20, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1b, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x10, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x1c, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0x00, 0xff, 0xff, 0xff, 0x22 + +L(5): + lea 128(%rsp,%r12,4), %rdi + lea 192(%rsp,%r12,4), %rsi + call __svml_stanh_cout_rare_internal + jmp L(4) + +END(_ZGVbN4v_tanhf_sse4) + + .align 16,0x90 + +__svml_stanh_cout_rare_internal: + + cfi_startproc + + lea __stanh_la__imlsTanhTab(%rip), %rdx + movb 3(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 2(%rdi), %r8d + andl $32640, %r8d + movl (%rdx,%rcx,4), %eax + cmpl $32640, %r8d + je L(8) + +L(6): + movl %eax, (%rsi) + +L(7): + xorl %eax, %eax + ret + +L(8): + testl $8388607, (%rdi) + je L(6) + movss (%rdi), %xmm0 + addss %xmm0, %xmm0 + movss %xmm0, (%rsi) + jmp L(7) + + cfi_endproc + + .type __svml_stanh_cout_rare_internal,@function + .size __svml_stanh_cout_rare_internal,.-__svml_stanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_stanh_data_internal: + .long 0 + .long 1030750208 + .long 1032847360 + .long 1034944512 + .long 1037041664 + .long 1039138816 + .long 1041235968 + .long 1043333120 + .long 1045430272 + .long 1047527424 + .long 1049624576 + .long 1051721728 + .long 1053818880 + .long 1055916032 + .long 1058013184 + .long 1060110336 + .long 1062207488 + .long 1064304640 + .long 1066401792 + .long 1068498944 + .long 1070596096 + .long 1072693248 + .long 1074790400 + .long 1076887552 + .long 1078984704 + .long 1081081856 + .long 1083179008 + .long 1085276160 + .long 1087373312 + .long 1089470464 + .long 1091567616 + .long 0 + .long 0 + .long 1030732233 + .long 1032831839 + .long 1034916201 + .long 1036994987 + .long 1039067209 + .long 1041174248 + .long 1043220868 + .long 1045245838 + .long 1047245614 + .long 1049383373 + .long 1051287907 + .long 1053115377 + .long 1054857013 + .long 1057129528 + .long 1058581488 + .long 1059832960 + .long 1060891676 + .long 1062153819 + .long 1063337043 + .long 1064100733 + .long 1064582223 + .long 1064984555 + .long 1065216645 + .long 1065302845 + .long 1065334668 + .long 1065349076 + .long 1065352656 + .long 1065353140 + .long 1065353206 + .long 1065353215 + .long 1065353216 + .long 0 + .long 2963361822 + .long 2971470750 + .long 2945658640 + .long 821708412 + .long 824483568 + .long 824941280 + .long 2984085072 + .long 2957298688 + .long 838449816 + .long 2966046080 + .long 2988320324 + .long 2989804564 + .long 842626356 + .long 3000013710 + .long 2972725824 + .long 3002017674 + .long 853753500 + .long 2987104448 + .long 3000350914 + .long 855535800 + .long 852410906 + .long 851608946 + .long 2988641656 + .long 2997011000 + .long 2989576736 + .long 3000884068 + .long 2999984336 + .long 840950056 + .long 2995215280 + .long 855269702 + .long 0 + .long 1065353216 + .long 1065295748 + .long 1065270545 + .long 1065229919 + .long 1065181343 + .long 1065124909 + .long 1065025765 + .long 1064867200 + .long 1064679597 + .long 1064464345 + .long 1064093083 + .long 1063517074 + .long 1062862743 + .long 1062146519 + .long 1060992371 + .long 1059386208 + .long 1057800167 + .long 1055660649 + .long 1051764737 + .long 1046959010 + .long 1041444634 + .long 1035462611 + .long 1026689093 + .long 1015337940 + .long 1002731447 + .long 990958554 + .long 973168670 + .long 948705851 + .long 924299482 + .long 899955662 + .long 864224966 + .long 0 + .long 2956213371 + .long 3178161821 + .long 3180268967 + .long 3182315389 + .long 3184339487 + .long 3186337805 + .long 3188474939 + .long 3190373619 + .long 3192189570 + .long 3193910865 + .long 3196176320 + .long 3197556682 + .long 3198679950 + .long 3199536798 + .long 3200331518 + .long 3200564882 + .long 3200049264 + .long 3199029518 + .long 3197040598 + .long 3192620804 + .long 3188208183 + .long 3182392393 + .long 3173916356 + .long 3162750726 + .long 3150176437 + .long 3138431708 + .long 3120650203 + .long 3096189170 + .long 3071783062 + .long 3047439278 + .long 3011707180 + .long 0 + .long 3198855845 + .long 3198879250 + .long 3198677023 + .long 3198476576 + .long 3198388151 + .long 3198245218 + .long 3197982711 + .long 3197594458 + .long 3197117197 + .long 3196587519 + .long 3195304371 + .long 3192667528 + .long 3189843074 + .long 3186330810 + .long 3177085101 + .long 1013669486 + .long 1032032579 + .long 1036132065 + .long 1038305199 + .long 1036774550 + .long 1033498413 + .long 1028927137 + .long 1021175553 + .long 1009568359 + .long 998361895 + .long 985691041 + .long 967585842 + .long 943363289 + .long 919210013 + .long 895139148 + .long 858471606 + .long 0 + .long 3077428921 + .long 3189516141 + .long 1008586543 + .long 1036101517 + .long 1033304453 + .long 1034073627 + .long 1036071831 + .long 1037235824 + .long 1039436298 + .long 1040631208 + .long 1041906362 + .long 1042793477 + .long 1043232976 + .long 1043086916 + .long 1042100375 + .long 1039444212 + .long 1034126600 + .long 1026638186 + .long 995501655 + .long 3165579977 + .long 3167654937 + .long 3165317828 + .long 3158960080 + .long 3148291549 + .long 3137354510 + .long 3124730373 + .long 3106670759 + .long 3082457650 + .long 3058305807 + .long 3034235241 + .long 2997581996 + .long 0 + .long 1040781545 + .long 1131811139 + .long 1097198812 + .long 3247503190 + .long 3230402941 + .long 3224086547 + .long 3212798938 + .long 1059790272 + .long 1053691997 + .long 1061317268 + .long 3134918084 + .long 1034173207 + .long 3176246152 + .long 3165561405 + .long 3174788493 + .long 3178015405 + .long 3178847213 + .long 3177176538 + .long 3171127099 + .long 3155996003 + .long 985352038 + .long 999682315 + .long 998398067 + .long 989522534 + .long 977926264 + .long 966355955 + .long 948911724 + .long 924561635 + .long 900244966 + .long 875993879 + .long 841254832 + .long 0 + .long 3155046246 + .long 1175181842 + .long 1138112751 + .long 3286309950 + .long 3267011817 + .long 3259619885 + .long 3246758786 + .long 1088248663 + .long 1078543936 + .long 1086795944 + .long 3205436942 + .long 1043392367 + .long 3198686087 + .long 3182586396 + .long 3174374999 + .long 3142320544 + .long 1008565243 + .long 1014115537 + .long 1016545052 + .long 1010017051 + .long 998649588 + .long 975680464 + .long 3124451591 + .long 3121544226 + .long 3112148751 + .long 3100159824 + .long 3082673659 + .long 3058641232 + .long 3034613169 + .long 3010665978 + .long 2975473412 + .long 0 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 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 36466923 + .long 1072693248 + .long 2365563284 + .long 3201306247 + .long 1829111721 + .long 3218428278 + .long 3823420055 + .long 3193165324 + .long 1098370908 + .long 1072693250 + .long 2493848101 + .long 3205978300 + .long 1742787824 + .long 3218423470 + .long 4013086462 + .long 3193609799 + .long 3667406935 + .long 1072693250 + .long 1352570026 + .long 3206273363 + .long 1445916117 + .long 3218422747 + .long 3835089556 + .long 3194065339 + .long 2420711447 + .long 1072693251 + .long 2169133006 + .long 3206574718 + .long 101347106 + .long 3218421982 + .long 713636389 + .long 3194411770 + .long 1709214929 + .long 1072693252 + .long 1710199222 + .long 3206758855 + .long 2216669086 + .long 3218421174 + .long 3814844772 + .long 3194836884 + .long 1591910603 + .long 1072693253 + .long 2011589771 + .long 3206962796 + .long 3721194918 + .long 3218420324 + .long 1295469166 + .long 3195182212 + .long 2130808979 + .long 1072693254 + .long 1222040805 + .long 3207187539 + .long 555871541 + .long 3218419433 + .long 401254514 + .long 3195493098 + .long 3390924472 + .long 1072693255 + .long 3112838711 + .long 3207434078 + .long 1558155560 + .long 3218418499 + .long 683885552 + .long 3195864282 + .long 1145294069 + .long 1072693257 + .long 1821670117 + .long 3207648695 + .long 2692181933 + .long 3218417523 + .long 2704036295 + .long 3196181879 + .long 4054831834 + .long 1072693258 + .long 1649153664 + .long 3207795248 + .long 4228604383 + .long 3218416505 + .long 4004758581 + .long 3196440654 + .long 3603542514 + .long 1072693260 + .long 1123737044 + .long 3207954183 + .long 2154630785 + .long 3218415446 + .long 2606327835 + .long 3196743208 + .long 4163276658 + .long 1072693262 + .long 2048619642 + .long 3208125991 + .long 1058893780 + .long 3218414345 + .long 250194901 + .long 3197094852 + .long 1518877548 + .long 1072693265 + .long 3379868633 + .long 3208311162 + .long 1246516380 + .long 3218413202 + .long 1621358934 + .long 3197304764 + .long 48033162 + .long 1072693268 + .long 957106177 + .long 3208510185 + .long 3034045498 + .long 3218412017 + .long 798414253 + .long 3197538466 + .long 4131323741 + .long 1072693270 + .long 2207647163 + .long 3208683052 + .long 2454449664 + .long 3218410791 + .long 1709648499 + .long 3197805932 + .long 972334142 + .long 1072693274 + .long 1279092327 + .long 3208797143 + .long 4141984674 + .long 3218409523 + .long 4279927728 + .long 3198110676 + .long 3547307714 + .long 1072693277 + .long 873763845 + .long 3208918886 + .long 4152286949 + .long 3218408214 + .long 947630201 + .long 3198400037 + .long 3779918761 + .long 1072693283 + .long 2452756690 + .long 3209115951 + .long 2900277560 + .long 3218406175 + .long 4114829322 + .long 3198840356 + .long 1550746642 + .long 1072693293 + .long 3179273584 + .long 3209408258 + .long 1697097694 + .long 3218403310 + .long 3189856208 + .long 3199299134 + .long 2567958063 + .long 1072693304 + .long 2177201355 + .long 3209713300 + .long 663593652 + .long 3218400281 + .long 1915839956 + .long 3199641526 + .long 3400799630 + .long 1072693317 + .long 2625933576 + .long 3209895292 + .long 3140727122 + .long 3218397088 + .long 2825210621 + .long 3200061154 + .long 661592278 + .long 1072693333 + .long 2751163500 + .long 3210096603 + .long 4055449010 + .long 3218393733 + .long 57286782 + .long 3200412116 + .long 3889851982 + .long 1072693350 + .long 2680384314 + .long 3210318153 + .long 2804057046 + .long 3218390217 + .long 1812582369 + .long 3200718155 + .long 1191734144 + .long 1072693371 + .long 867498228 + .long 3210560852 + .long 3250577733 + .long 3218386540 + .long 3326742410 + .long 3201083020 + .long 2188854007 + .long 1072693394 + .long 363145135 + .long 3210782655 + .long 840173644 + .long 3218382704 + .long 1735074843 + .long 3201408616 + .long 3657661222 + .long 1072693420 + .long 2204762872 + .long 3210926495 + .long 4072217384 + .long 3218378708 + .long 2965875284 + .long 3201662196 + .long 2413420961 + .long 1072693450 + .long 1162405510 + .long 3211082241 + .long 138720143 + .long 3218374556 + .long 454705634 + .long 3201958187 + .long 3899194868 + .long 1072693483 + .long 669033796 + .long 3211250324 + .long 2167069495 + .long 3218370246 + .long 1542529428 + .long 3202301612 + .long 710018948 + .long 1072693521 + .long 2883210692 + .long 3211431169 + .long 1973418570 + .long 3218365781 + .long 3156689511 + .long 3202524481 + .long 2656657906 + .long 1072693562 + .long 3498100032 + .long 3211625196 + .long 125419693 + .long 3218361162 + .long 1620715508 + .long 3202751895 + .long 2404819887 + .long 1072693608 + .long 4021715948 + .long 3211810552 + .long 1645154164 + .long 3218356389 + .long 703452016 + .long 3203011668 + .long 1243884135 + .long 1072693659 + .long 480742811 + .long 3211921363 + .long 3122063309 + .long 3218351464 + .long 223504399 + .long 3203307063 + .long 495862037 + .long 1072693715 + .long 300794004 + .long 3212039372 + .long 1300653287 + .long 3218346389 + .long 1176592120 + .long 3203610816 + .long 3274452673 + .long 1072693808 + .long 2613861807 + .long 3212229889 + .long 359514654 + .long 3218338503 + .long 2923503278 + .long 3204034910 + .long 3741678157 + .long 1072693954 + .long 3651935792 + .long 3212511436 + .long 2702507736 + .long 3218327463 + .long 2210624435 + .long 3204506468 + .long 1100251351 + .long 1072694127 + .long 3514265607 + .long 3212825173 + .long 957470414 + .long 3218315845 + .long 1305550937 + .long 3204833184 + .long 2996845965 + .long 1072694328 + .long 3142229264 + .long 3213004685 + .long 1883674585 + .long 3218303659 + .long 3326598907 + .long 3205231584 + .long 274977645 + .long 1072694562 + .long 3016319234 + .long 3213195820 + .long 1539002348 + .long 3218290918 + .long 3984366897 + .long 3205604614 + .long 1292806442 + .long 1072694830 + .long 3262520051 + .long 3213405058 + .long 2372653574 + .long 3218277634 + .long 2452462577 + .long 3205892032 + .long 1815353697 + .long 1072695136 + .long 3662183375 + .long 3213632998 + .long 250148789 + .long 3218263821 + .long 2158010733 + .long 3206232708 + .long 2150433494 + .long 1072695483 + .long 3919565056 + .long 3213880202 + .long 1540395291 + .long 3218249491 + .long 3182910565 + .long 3206589369 + .long 2808974545 + .long 1072695874 + .long 1965799910 + .long 3214016317 + .long 1545570484 + .long 3218234659 + .long 1413633121 + .long 3206823218 + .long 164723038 + .long 1072696313 + .long 81021250 + .long 3214159950 + .long 1583468454 + .long 3218219339 + .long 18571726 + .long 3207094384 + .long 3588317822 + .long 1072696801 + .long 4095098713 + .long 3214313941 + .long 298038316 + .long 3218203546 + .long 912947688 + .long 3207406859 + .long 1041448961 + .long 1072697344 + .long 4179586945 + .long 3214478495 + .long 2148027612 + .long 3218187294 + .long 3720520462 + .long 3207679413 + .long 1980273179 + .long 1072697943 + .long 1752543433 + .long 3214653794 + .long 124299728 + .long 3218170600 + .long 864061540 + .long 3207883361 + .long 2949417123 + .long 1072698602 + .long 4190073881 + .long 3214839998 + .long 1415544749 + .long 3218153478 + .long 3694676202 + .long 3208114560 + .long 420771937 + .long 1072699325 + .long 1282420231 + .long 3214985633 + .long 1533345938 + .long 3218135945 + .long 2892854837 + .long 3208375402 + .long 3632588569 + .long 1072700113 + .long 2712748874 + .long 3215089842 + .long 1386124246 + .long 3218118017 + .long 1634175019 + .long 3208733922 + .long 347483009 + .long 1072701423 + .long 1161341506 + .long 3215256321 + .long 1877668895 + .long 3218090451 + .long 4108664264 + .long 3209099007 + .long 3038559136 + .long 1072703435 + .long 2683048238 + .long 3215498732 + .long 1179454900 + .long 3218025113 + .long 1332126937 + .long 3209546908 + .long 3486307715 + .long 1072705767 + .long 2508275841 + .long 3215764027 + .long 359393231 + .long 3217946511 + .long 1961215910 + .long 3209890029 + .long 2252418763 + .long 1072708441 + .long 2827865151 + .long 3216017387 + .long 3509880367 + .long 3217865627 + .long 3222140085 + .long 3210213923 + .long 1486994624 + .long 1072711477 + .long 3160629487 + .long 3216172802 + .long 1178047112 + .long 3217782741 + .long 1901428593 + .long 3210596649 + .long 3746562216 + .long 1072714893 + .long 1033996001 + .long 3216339382 + .long 39866696 + .long 3217698130 + .long 2908573463 + .long 3210891953 + .long 2324761591 + .long 1072718707 + .long 2389401627 + .long 3216516876 + .long 3645939838 + .long 3217612071 + .long 2440236284 + .long 3211151116 + .long 1761407793 + .long 1072722932 + .long 2502005220 + .long 3216704962 + .long 1997398717 + .long 3217524842 + .long 2895026412 + .long 3211448596 + .long 4114502182 + .long 1072727579 + .long 2605061383 + .long 3216903247 + .long 58515002 + .long 3217436714 + .long 711731960 + .long 3211787230 + .long 3951984035 + .long 1072732658 + .long 3516063216 + .long 3217071220 + .long 3638757279 + .long 3217347953 + .long 3233370794 + .long 3211979005 + .long 658281779 + .long 1072738175 + .long 309554960 + .long 3217179845 + .long 1331214594 + .long 3217258823 + .long 2937534811 + .long 3212193451 + .long 2289001467 + .long 1072744131 + .long 2442043690 + .long 3217292793 + .long 2664085653 + .long 3217169576 + .long 3462081454 + .long 3212432263 + .long 3795084150 + .long 1072750527 + .long 1130374688 + .long 3217409754 + .long 3638257201 + .long 3217080459 + .long 3906637920 + .long 3212696488 + .long 4040275044 + .long 1072757360 + .long 3643517564 + .long 3217530392 + .long 4148962921 + .long 3216952251 + .long 1995056602 + .long 3212911950 + .long 1479928784 + .long 1072764624 + .long 2653868580 + .long 3217654355 + .long 1010106713 + .long 3216775940 + .long 3129357315 + .long 3213070764 + .long 2856812514 + .long 1072772308 + .long 1621093115 + .long 3217781272 + .long 1824031529 + .long 3216601249 + .long 2296680075 + .long 3213333328 + .long 2460843475 + .long 1072784536 + .long 3722925065 + .long 3217975665 + .long 3901534801 + .long 3216343697 + .long 741495589 + .long 3213734822 + .long 13033194 + .long 1072802249 + .long 1706090638 + .long 3218161084 + .long 4129724113 + .long 3216008854 + .long 2582831738 + .long 3214039094 + .long 3092949488 + .long 1072821329 + .long 4163404160 + .long 3218296789 + .long 673560195 + .long 3215391593 + .long 1852259695 + .long 3214295490 + .long 3663604487 + .long 1072841572 + .long 2783926416 + .long 3218433189 + .long 538028418 + .long 3214623601 + .long 955002681 + .long 3214577680 + .long 1457520314 + .long 1072862739 + .long 2977011911 + .long 3218568683 + .long 2456605794 + .long 3213048602 + .long 1782979473 + .long 3214883178 + .long 3136246603 + .long 1072884563 + .long 4172123069 + .long 3218701739 + .long 1041205303 + .long 1065062250 + .long 1494191018 + .long 3215071352 + .long 2030188257 + .long 1072906761 + .long 242335435 + .long 3218830924 + .long 3225388224 + .long 1066807264 + .long 2597486284 + .long 3215242091 + .long 1527970838 + .long 1072929036 + .long 2966426512 + .long 3218954923 + .long 1554080475 + .long 1067589039 + .long 1299968651 + .long 3215418462 + .long 3575385503 + .long 1072951087 + .long 2115725422 + .long 3219072567 + .long 1970202642 + .long 1068007486 + .long 633750547 + .long 3215597833 + .long 4170701031 + .long 1072972617 + .long 46586082 + .long 3219155579 + .long 1194653136 + .long 1068384025 + .long 4171340731 + .long 3215777352 + .long 3578160514 + .long 1072993337 + .long 3238411740 + .long 3219206599 + .long 3278559237 + .long 1068609006 + .long 2404931200 + .long 3215954013 + .long 533888921 + .long 1073012973 + .long 1507597629 + .long 3219253160 + .long 2386969249 + .long 1068756225 + .long 272720058 + .long 3216053653 + .long 54544651 + .long 1073031269 + .long 3020671348 + .long 3219294996 + .long 4122670807 + .long 1068883785 + .long 2536786852 + .long 3216134458 + .long 230026772 + .long 1073047994 + .long 2830531360 + .long 3219331923 + .long 2545616196 + .long 1068992498 + .long 3897096954 + .long 3216209170 + .long 867435464 + .long 1073062943 + .long 3935983781 + .long 3219363830 + .long 4280666630 + .long 1069083305 + .long 1614478429 + .long 3216276286 + .long 3991143559 + .long 1073075939 + .long 3165050417 + .long 3219390677 + .long 248866814 + .long 1069157251 + .long 2328429718 + .long 3216358398 + .long 1880129173 + .long 1073091258 + .long 4059723411 + .long 3219421162 + .long 3082848917 + .long 1069238148 + .long 1081358649 + .long 3216430553 + .long 1955557582 + .long 1073104040 + .long 2869422647 + .long 3219445318 + .long 1310544530 + .long 1069299023 + .long 434435025 + .long 3216450109 + .long 3947018234 + .long 1073107343 + .long 3414641036 + .long 3219451270 + .long 4069313179 + .long 1069313321 + .long 1392468754 + .long 3216410502 + .long 3271741504 + .long 1073101128 + .long 3884994071 + .long 3219440866 + .long 1456085694 + .long 1069290099 + .long 2332856790 + .long 3216307665 + .long 3950891192 + .long 1073085735 + .long 439037894 + .long 3219416288 + .long 1197951536 + .long 1069237765 + .long 4195788421 + .long 3216139842 + .long 3990997338 + .long 1073061787 + .long 550042602 + .long 3219379833 + .long 2832452545 + .long 1069163766 + .long 1200943255 + .long 3215832361 + .long 2073883731 + .long 1073030122 + .long 3042850267 + .long 3219333800 + .long 991641143 + .long 1069074535 + .long 1637244010 + .long 3215243222 + .long 3805163810 + .long 1072991715 + .long 3517445189 + .long 3219280382 + .long 2680864185 + .long 1068975465 + .long 1457843741 + .long 3214140932 + .long 1315080793 + .long 1072947617 + .long 3059804278 + .long 3219221594 + .long 2861308047 + .long 1068870963 + .long 3296491873 + .long 1064537111 + .long 3728462150 + .long 1072898893 + .long 3615137083 + .long 3219159232 + .long 3017963192 + .long 1068764532 + .long 3972434375 + .long 1067468619 + .long 1336398218 + .long 1072846587 + .long 1068664290 + .long 3219061390 + .long 122240345 + .long 1068658880 + .long 508009436 + .long 1068456917 + .long 3501538245 + .long 1072791681 + .long 968690691 + .long 3218931236 + .long 1514516445 + .long 1068556030 + .long 671541798 + .long 1069006173 + .long 3814409280 + .long 1072735081 + .long 1553551847 + .long 3218801852 + .long 2849431279 + .long 1068415930 + .long 285838780 + .long 1069554660 + .long 2881499585 + .long 1072661949 + .long 928028610 + .long 3218674977 + .long 8837506 + .long 1068229231 + .long 4283922105 + .long 1069842903 + .long 1813934616 + .long 1072546640 + .long 2296020303 + .long 3218551962 + .long 3757630126 + .long 1068054242 + .long 4184842874 + .long 1070138481 + .long 1612285858 + .long 1072432209 + .long 3568867548 + .long 3218433820 + .long 2489334631 + .long 1067891605 + .long 3119354956 + .long 1070586029 + .long 1945534618 + .long 1072265408 + .long 12375465 + .long 3218268030 + .long 869568690 + .long 1067671872 + .long 313517472 + .long 1070892138 + .long 1205077106 + .long 1072052753 + .long 2329101392 + .long 3218055718 + .long 31064032 + .long 1067390210 + .long 1106783211 + .long 1071186310 + .long 571472860 + .long 1071856508 + .long 2279775366 + .long 3217706561 + .long 3977902324 + .long 1066976012 + .long 1438560376 + .long 1071467394 + .long 433300635 + .long 1071678859 + .long 2662131044 + .long 3217407122 + .long 3461865003 + .long 1066639491 + .long 3761842524 + .long 1071687909 + .long 591758334 + .long 1071396321 + .long 1311878841 + .long 3217153539 + .long 3007781852 + .long 1066335723 + .long 1614590629 + .long 1071809819 + .long 1253814918 + .long 1071117476 + .long 1728609767 + .long 3216850667 + .long 2200561853 + .long 1065903347 + .long 3821226689 + .long 1071921115 + .long 2022982069 + .long 1070874479 + .long 2030156196 + .long 3216496942 + .long 874711265 + .long 1065560045 + .long 2003227996 + .long 1072021655 + .long 2808404217 + .long 1070664514 + .long 1372837647 + .long 3216204595 + .long 822053276 + .long 1065224094 + .long 3767175364 + .long 1072111660 + .long 3043371777 + .long 1070372670 + .long 1442419211 + .long 3215945892 + .long 298752438 + .long 1064796452 + .long 1111528881 + .long 1072191609 + .long 3513208196 + .long 1070065467 + .long 3837735739 + .long 3215552388 + .long 3701924119 + .long 1064460397 + .long 1230501085 + .long 1072262142 + .long 2161267832 + .long 1069804871 + .long 4188367704 + .long 3215231429 + .long 401190186 + .long 1064089052 + .long 3002339892 + .long 1072323996 + .long 1480019407 + .long 1069584807 + .long 1833655520 + .long 3214970435 + .long 2907956919 + .long 1063676311 + .long 875346000 + .long 1072377952 + .long 3150437403 + .long 1069251888 + .long 876861923 + .long 3214583482 + .long 1689748747 + .long 1063353511 + .long 2795554744 + .long 1072424793 + .long 3869705215 + .long 1068941581 + .long 1837883894 + .long 3214240854 + .long 2762317048 + .long 1062946513 + .long 2491972100 + .long 1072465284 + .long 4114823501 + .long 1068682289 + .long 2146865463 + .long 3213964103 + .long 800804261 + .long 1062552648 + .long 2634953449 + .long 1072500149 + .long 2952556276 + .long 1068433515 + .long 1872935290 + .long 3213596436 + .long 525130857 + .long 1062245296 + .long 3287041404 + .long 1072542855 + .long 164674845 + .long 1067923724 + .long 3273134342 + .long 3213089271 + .long 171708004 + .long 1061610314 + .long 3035032320 + .long 1072586748 + .long 3976243935 + .long 1067403539 + .long 3504708444 + .long 3212404491 + .long 3955947885 + .long 1060882840 + .long 513098494 + .long 1072618404 + .long 416924237 + .long 1066726877 + .long 1788945081 + .long 3211801737 + .long 1199639353 + .long 1060166859 + .long 2284134637 + .long 1072641010 + .long 754275327 + .long 1066136447 + .long 94803481 + .long 3211042671 + .long 3377507017 + .long 1059354147 + .long 1467291457 + .long 1072657015 + .long 2435597312 + .long 1065520743 + .long 2819017772 + .long 3210358609 + .long 1988617747 + .long 1058591581 + .long 633705514 + .long 1072668259 + .long 392269686 + .long 1064864433 + .long 2964449929 + .long 3209729770 + .long 3963893163 + .long 1057889872 + .long 2214892393 + .long 1072676103 + .long 2190738271 + .long 1064315837 + .long 3773826451 + .long 3208969045 + .long 3609404170 + .long 1057113308 + .long 3795216963 + .long 1072681541 + .long 3959981107 + .long 1063599490 + .long 1577139384 + .long 3208281591 + .long 1777963469 + .long 1056319886 + .long 2768813161 + .long 1072685290 + .long 452197850 + .long 1062981751 + .long 625862001 + .long 3207639777 + .long 1894515286 + .long 1055580811 + .long 809336726 + .long 1072687861 + .long 325412222 + .long 1062349073 + .long 3494772326 + .long 3206874482 + .long 3143092609 + .long 1054887561 + .long 1391578948 + .long 1072689615 + .long 370441451 + .long 1061660435 + .long 67458841 + .long 3206180214 + .long 1971759196 + .long 1054066692 + .long 57274217 + .long 1072690807 + .long 293665776 + .long 1061075750 + .long 1340185983 + .long 3205535605 + .long 2210177191 + .long 1053294335 + .long 1110907588 + .long 1072691613 + .long 3961986905 + .long 1060367146 + .long 3774614905 + .long 3204763416 + .long 3590429673 + .long 1052580827 + .long 2737507729 + .long 1072692156 + .long 370479370 + .long 1059701790 + .long 1033751386 + .long 3204059641 + .long 1162278823 + .long 1051830218 + .long 2341375458 + .long 1072692521 + .long 760364123 + .long 1059103172 + .long 910883556 + .long 3203420282 + .long 401067508 + .long 1051028170 + .long 3358303651 + .long 1072692765 + .long 3104773993 + .long 1058369139 + .long 2043715743 + .long 3202639413 + .long 4274377921 + .long 1050278646 + .long 3501940353 + .long 1072692984 + .long 2710387139 + .long 1057384557 + .long 2550611600 + .long 3201592258 + .long 2260324605 + .long 1049158690 + .long 3160989127 + .long 1072693133 + .long 1403521776 + .long 1056074537 + .long 760745859 + .long 3200238663 + .long 1163121055 + .long 1047679067 + .long 3509020169 + .long 1072693198 + .long 3352058101 + .long 1054743188 + .long 2289323607 + .long 3198722761 + .long 918272756 + .long 1046147840 + .long 4268817660 + .long 1072693226 + .long 1580550645 + .long 1053325591 + .long 1736251411 + .long 3197308470 + .long 1531106447 + .long 1044632576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 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 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 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .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_stanh_data_internal,@object + .size __svml_stanh_data_internal,6016 + .align 4 + +__stanh_la__imlsTanhTab: + .long 1065353216 + .long 3212836864 + .type __stanh_la__imlsTanhTab,@object + .size __stanh_la__imlsTanhTab,8 diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S new file mode 100644 index 0000000000..a56795e3cd --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core-sse.S @@ -0,0 +1,20 @@ +/* SSE version of vectorized tanhf, 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_tanhf _ZGVdN8v_tanhf_sse_wrapper +#include "../svml_s_tanhf8_core.S" diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c new file mode 100644 index 0000000000..fadcea36ab --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core.c @@ -0,0 +1,28 @@ +/* Multiple versions of vectorized tanhf, 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_tanhf +#include "ifunc-mathvec-avx2.h" + +libc_ifunc_redirected (REDIRECT_NAME, SYMBOL_NAME, IFUNC_SELECTOR ()); + +#ifdef SHARED +__hidden_ver1 (_ZGVdN8v_tanhf, __GI__ZGVdN8v_tanhf, + __redirect__ZGVdN8v_tanhf) + __attribute__ ((visibility ("hidden"))); +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S new file mode 100644 index 0000000000..f36ad74775 --- /dev/null +++ b/sysdeps/x86_64/fpu/multiarch/svml_s_tanhf8_core_avx2.S @@ -0,0 +1,2036 @@ +/* Function tanhf 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: + * + * NOTE: Since the hyperbolic tangent function is odd + * (tanh(x) = -tanh(-x)), below algorithm deals with the absolute + * value of the argument |x|: tanh(x) = sign(x) * tanh(|x|) + * + * We use a table lookup method to compute tanh(|x|). + * The basic idea is to split the input range into a number of subintervals + * and to approximate tanh(.) with a polynomial on each of them. + * + * IEEE SPECIAL CONDITIONS: + * x = [+,-]0, r = [+,-]0 + * x = +Inf, r = +1 + * x = -Inf, r = -1 + * x = QNaN, r = QNaN + * x = SNaN, r = QNaN + * + * + * ALGORITHM DETAILS + * We handle special values in a callout function, aside from main path + * computations. "Special" for this algorithm are: + * INF, NAN, |x| > HUGE_THRESHOLD + * + * + * Main path computations are organized as follows: + * Actually we split the interval [0, SATURATION_THRESHOLD) + * into a number of subintervals. On each subinterval we approximate tanh(.) + * with a minimax polynomial of pre-defined degree. Polynomial coefficients + * are computed beforehand and stored in table. We also use + * + * y := |x| + B, + * + * here B depends on subinterval and is used to make argument + * closer to zero. + * We also add large fake interval [SATURATION_THRESHOLD, HUGE_THRESHOLD], + * where 1.0 + 0.0*y + 0.0*y^2 ... coefficients are stored - just to + * preserve main path computation logic but return 1.0 for all arguments. + * + * Hence reconstruction looks as follows: + * we extract proper polynomial and range reduction coefficients + * (Pj and B), corresponding to subinterval, to which |x| belongs, + * and return + * + * r := sign(x) * (P0 + P1 * y + ... + Pn * y^n) + * + * NOTE: we use multiprecision technique to multiply and sum the first + * K terms of the polynomial. So Pj, j = 0..K are stored in + * table each as a pair of target precision numbers (Pj and PLj) to + * achieve wider than target precision. + * + * + */ + +#include + + .text + .section .text.avx2,"ax",@progbits +ENTRY(_ZGVdN8v_tanhf_avx2) + pushq %rbp + cfi_def_cfa_offset(16) + movq %rsp, %rbp + cfi_def_cfa(6, 16) + cfi_offset(6, -16) + andq $-64, %rsp + pushq %r14 + pushq %r15 + pushq %rbx + subq $360, %rsp + .cfi_escape 0x10, 0x03, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe8, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xff, 0xff, 0xff, 0x22 + lea 1360+__svml_stanh_data_internal(%rip), %r14 + vmovups %ymm12, 224(%rsp) + +/* + * small table specific variables * + * Constant loading + */ + vmovups 5952+__svml_stanh_data_internal(%rip), %ymm4 + vmovups %ymm13, 256(%rsp) + vmovups %ymm14, 288(%rsp) + vmovups %ymm15, 320(%rsp) + vmovups %ymm8, 32(%rsp) + vmovups %ymm10, 160(%rsp) + vmovups %ymm9, 96(%rsp) + vmovups %ymm11, 192(%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 + .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 + vmovaps %ymm0, %ymm12 + +/* Here huge arguments, INF and NaNs are filtered out to callout. */ + vpand 5760+__svml_stanh_data_internal(%rip), %ymm12, %ymm6 + vpsubd 5888+__svml_stanh_data_internal(%rip), %ymm6, %ymm2 + +/* if VMIN, VMAX is defined for I type */ + vxorps %ymm3, %ymm3, %ymm3 + vpcmpgtd %ymm3, %ymm2, %ymm1 + vpand %ymm1, %ymm2, %ymm5 + vpcmpgtd %ymm4, %ymm2, %ymm13 + vblendvps %ymm13, %ymm4, %ymm5, %ymm14 + vpsrld $14, %ymm14, %ymm15 + vpcmpgtd 5824+__svml_stanh_data_internal(%rip), %ymm6, %ymm7 + vandps 5696+__svml_stanh_data_internal(%rip), %ymm12, %ymm10 + vmovmskps %ymm7, %ebx + vandps 5632+__svml_stanh_data_internal(%rip), %ymm12, %ymm11 + vextractf128 $1, %ymm15, %xmm0 + vmovd %xmm15, %r11d + vmovd %xmm0, %ecx + vpextrd $1, %xmm0, %edx + movslq %ecx, %rcx + movslq %edx, %rdx + vpextrd $2, %xmm0, %eax + vpextrd $3, %xmm0, %r15d + movslq %r11d, %r11 + vpextrd $1, %xmm15, %r10d + vpextrd $2, %xmm15, %r9d + movslq %eax, %rax + movslq %r15d, %r15 + movslq %r10d, %r10 + movslq %r9d, %r9 + vpextrd $3, %xmm15, %r8d + movslq %r8d, %r8 + vmovupd -16(%rcx,%r14), %xmm8 + vmovupd -16(%rdx,%r14), %xmm6 + vmovupd (%r11,%r14), %xmm13 + vmovupd (%rcx,%r14), %xmm0 + vmovupd (%rdx,%r14), %xmm4 + vmovupd -16(%r11,%r14), %xmm9 + vmovupd -16(%r10,%r14), %xmm7 + vmovupd (%r10,%r14), %xmm14 + vinsertf128 $1, -16(%rax,%r14), %ymm8, %ymm2 + vinsertf128 $1, -16(%r15,%r14), %ymm6, %ymm5 + vunpcklpd %ymm5, %ymm2, %ymm8 + vunpckhpd %ymm5, %ymm2, %ymm6 + vinsertf128 $1, (%r9,%r14), %ymm13, %ymm5 + vinsertf128 $1, (%rax,%r14), %ymm0, %ymm13 + vinsertf128 $1, (%r15,%r14), %ymm4, %ymm0 + vcvtps2pd %xmm10, %ymm4 + vextractf128 $1, %ymm10, %xmm10 + vinsertf128 $1, -16(%r9,%r14), %ymm9, %ymm3 + vinsertf128 $1, -16(%r8,%r14), %ymm7, %ymm1 + vunpcklpd %ymm1, %ymm3, %ymm9 + vunpckhpd %ymm1, %ymm3, %ymm7 + vinsertf128 $1, (%r8,%r14), %ymm14, %ymm1 + vunpcklpd %ymm1, %ymm5, %ymm3 + vunpckhpd %ymm1, %ymm5, %ymm2 + vcvtps2pd %xmm10, %ymm5 + vfmadd213pd %ymm3, %ymm4, %ymm2 + vfmadd213pd %ymm7, %ymm4, %ymm2 + vunpcklpd %ymm0, %ymm13, %ymm1 + vunpckhpd %ymm0, %ymm13, %ymm0 + vfmadd213pd %ymm1, %ymm5, %ymm0 + vfmadd213pd %ymm9, %ymm4, %ymm2 + vfmadd213pd %ymm6, %ymm5, %ymm0 + vcvtpd2ps %ymm2, %xmm1 + vfmadd213pd %ymm8, %ymm5, %ymm0 + vcvtpd2ps %ymm0, %xmm0 + vinsertf128 $1, %xmm0, %ymm1, %ymm2 + vorps %ymm11, %ymm2, %ymm0 + testl %ebx, %ebx + jne L(2) + +L(1): + 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) + addq $360, %rsp + cfi_restore(3) + popq %rbx + cfi_restore(15) + popq %r15 + cfi_restore(14) + popq %r14 + movq %rbp, %rsp + popq %rbp + cfi_def_cfa(7, 8) + cfi_restore(6) + ret + cfi_def_cfa(6, 16) + .cfi_escape 0x10, 0x03, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xe8, 0xff, 0xff, 0xff, 0x22 + cfi_offset(6, -16) + .cfi_escape 0x10, 0x0e, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf8, 0xff, 0xff, 0xff, 0x22 + .cfi_escape 0x10, 0x0f, 0x0e, 0x38, 0x1c, 0x0d, 0xc0, 0xff, 0xff, 0xff, 0x1a, 0x0d, 0xf0, 0xff, 0xff, 0xff, 0x22 + .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 + +L(2): + vmovups %ymm12, 64(%rsp) + vmovups %ymm0, 128(%rsp) + je L(1) + xorl %r14d, %r14d + vzeroupper + movq %rsi, 8(%rsp) + movq %rdi, (%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 + +L(3): + btl %r14d, %ebx + jc L(5) + +L(4): + incl %r14d + cmpl $8, %r14d + jl L(3) + movq 8(%rsp), %rsi + cfi_restore(4) + movq (%rsp), %rdi + cfi_restore(5) + vmovups 128(%rsp), %ymm0 + jmp L(1) + .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 + +L(5): + lea 64(%rsp,%r14,4), %rdi + lea 128(%rsp,%r14,4), %rsi + call __svml_stanh_cout_rare_internal + jmp L(4) + +END(_ZGVdN8v_tanhf_avx2) + + .align 16,0x90 + +__svml_stanh_cout_rare_internal: + + cfi_startproc + + lea __stanh_la__imlsTanhTab(%rip), %rdx + movb 3(%rdi), %al + andb $-128, %al + shrb $7, %al + movzbl %al, %ecx + movzwl 2(%rdi), %r8d + andl $32640, %r8d + movl (%rdx,%rcx,4), %eax + cmpl $32640, %r8d + je L(8) + +L(6): + movl %eax, (%rsi) + +L(7): + xorl %eax, %eax + ret + +L(8): + testl $8388607, (%rdi) + je L(6) + movss (%rdi), %xmm0 + addss %xmm0, %xmm0 + movss %xmm0, (%rsi) + jmp L(7) + + cfi_endproc + + .type __svml_stanh_cout_rare_internal,@function + .size __svml_stanh_cout_rare_internal,.-__svml_stanh_cout_rare_internal + + .section .rodata, "a" + .align 64 + +__svml_stanh_data_internal: + .long 0 + .long 1030750208 + .long 1032847360 + .long 1034944512 + .long 1037041664 + .long 1039138816 + .long 1041235968 + .long 1043333120 + .long 1045430272 + .long 1047527424 + .long 1049624576 + .long 1051721728 + .long 1053818880 + .long 1055916032 + .long 1058013184 + .long 1060110336 + .long 1062207488 + .long 1064304640 + .long 1066401792 + .long 1068498944 + .long 1070596096 + .long 1072693248 + .long 1074790400 + .long 1076887552 + .long 1078984704 + .long 1081081856 + .long 1083179008 + .long 1085276160 + .long 1087373312 + .long 1089470464 + .long 1091567616 + .long 0 + .long 0 + .long 1030732233 + .long 1032831839 + .long 1034916201 + .long 1036994987 + .long 1039067209 + .long 1041174248 + .long 1043220868 + .long 1045245838 + .long 1047245614 + .long 1049383373 + .long 1051287907 + .long 1053115377 + .long 1054857013 + .long 1057129528 + .long 1058581488 + .long 1059832960 + .long 1060891676 + .long 1062153819 + .long 1063337043 + .long 1064100733 + .long 1064582223 + .long 1064984555 + .long 1065216645 + .long 1065302845 + .long 1065334668 + .long 1065349076 + .long 1065352656 + .long 1065353140 + .long 1065353206 + .long 1065353215 + .long 1065353216 + .long 0 + .long 2963361822 + .long 2971470750 + .long 2945658640 + .long 821708412 + .long 824483568 + .long 824941280 + .long 2984085072 + .long 2957298688 + .long 838449816 + .long 2966046080 + .long 2988320324 + .long 2989804564 + .long 842626356 + .long 3000013710 + .long 2972725824 + .long 3002017674 + .long 853753500 + .long 2987104448 + .long 3000350914 + .long 855535800 + .long 852410906 + .long 851608946 + .long 2988641656 + .long 2997011000 + .long 2989576736 + .long 3000884068 + .long 2999984336 + .long 840950056 + .long 2995215280 + .long 855269702 + .long 0 + .long 1065353216 + .long 1065295748 + .long 1065270545 + .long 1065229919 + .long 1065181343 + .long 1065124909 + .long 1065025765 + .long 1064867200 + .long 1064679597 + .long 1064464345 + .long 1064093083 + .long 1063517074 + .long 1062862743 + .long 1062146519 + .long 1060992371 + .long 1059386208 + .long 1057800167 + .long 1055660649 + .long 1051764737 + .long 1046959010 + .long 1041444634 + .long 1035462611 + .long 1026689093 + .long 1015337940 + .long 1002731447 + .long 990958554 + .long 973168670 + .long 948705851 + .long 924299482 + .long 899955662 + .long 864224966 + .long 0 + .long 2956213371 + .long 3178161821 + .long 3180268967 + .long 3182315389 + .long 3184339487 + .long 3186337805 + .long 3188474939 + .long 3190373619 + .long 3192189570 + .long 3193910865 + .long 3196176320 + .long 3197556682 + .long 3198679950 + .long 3199536798 + .long 3200331518 + .long 3200564882 + .long 3200049264 + .long 3199029518 + .long 3197040598 + .long 3192620804 + .long 3188208183 + .long 3182392393 + .long 3173916356 + .long 3162750726 + .long 3150176437 + .long 3138431708 + .long 3120650203 + .long 3096189170 + .long 3071783062 + .long 3047439278 + .long 3011707180 + .long 0 + .long 3198855845 + .long 3198879250 + .long 3198677023 + .long 3198476576 + .long 3198388151 + .long 3198245218 + .long 3197982711 + .long 3197594458 + .long 3197117197 + .long 3196587519 + .long 3195304371 + .long 3192667528 + .long 3189843074 + .long 3186330810 + .long 3177085101 + .long 1013669486 + .long 1032032579 + .long 1036132065 + .long 1038305199 + .long 1036774550 + .long 1033498413 + .long 1028927137 + .long 1021175553 + .long 1009568359 + .long 998361895 + .long 985691041 + .long 967585842 + .long 943363289 + .long 919210013 + .long 895139148 + .long 858471606 + .long 0 + .long 3077428921 + .long 3189516141 + .long 1008586543 + .long 1036101517 + .long 1033304453 + .long 1034073627 + .long 1036071831 + .long 1037235824 + .long 1039436298 + .long 1040631208 + .long 1041906362 + .long 1042793477 + .long 1043232976 + .long 1043086916 + .long 1042100375 + .long 1039444212 + .long 1034126600 + .long 1026638186 + .long 995501655 + .long 3165579977 + .long 3167654937 + .long 3165317828 + .long 3158960080 + .long 3148291549 + .long 3137354510 + .long 3124730373 + .long 3106670759 + .long 3082457650 + .long 3058305807 + .long 3034235241 + .long 2997581996 + .long 0 + .long 1040781545 + .long 1131811139 + .long 1097198812 + .long 3247503190 + .long 3230402941 + .long 3224086547 + .long 3212798938 + .long 1059790272 + .long 1053691997 + .long 1061317268 + .long 3134918084 + .long 1034173207 + .long 3176246152 + .long 3165561405 + .long 3174788493 + .long 3178015405 + .long 3178847213 + .long 3177176538 + .long 3171127099 + .long 3155996003 + .long 985352038 + .long 999682315 + .long 998398067 + .long 989522534 + .long 977926264 + .long 966355955 + .long 948911724 + .long 924561635 + .long 900244966 + .long 875993879 + .long 841254832 + .long 0 + .long 3155046246 + .long 1175181842 + .long 1138112751 + .long 3286309950 + .long 3267011817 + .long 3259619885 + .long 3246758786 + .long 1088248663 + .long 1078543936 + .long 1086795944 + .long 3205436942 + .long 1043392367 + .long 3198686087 + .long 3182586396 + .long 3174374999 + .long 3142320544 + .long 1008565243 + .long 1014115537 + .long 1016545052 + .long 1010017051 + .long 998649588 + .long 975680464 + .long 3124451591 + .long 3121544226 + .long 3112148751 + .long 3100159824 + .long 3082673659 + .long 3058641232 + .long 3034613169 + .long 3010665978 + .long 2975473412 + .long 0 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .long 2145386496 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .long 1027604480 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .long 65011712 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 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 36466923 + .long 1072693248 + .long 2365563284 + .long 3201306247 + .long 1829111721 + .long 3218428278 + .long 3823420055 + .long 3193165324 + .long 1098370908 + .long 1072693250 + .long 2493848101 + .long 3205978300 + .long 1742787824 + .long 3218423470 + .long 4013086462 + .long 3193609799 + .long 3667406935 + .long 1072693250 + .long 1352570026 + .long 3206273363 + .long 1445916117 + .long 3218422747 + .long 3835089556 + .long 3194065339 + .long 2420711447 + .long 1072693251 + .long 2169133006 + .long 3206574718 + .long 101347106 + .long 3218421982 + .long 713636389 + .long 3194411770 + .long 1709214929 + .long 1072693252 + .long 1710199222 + .long 3206758855 + .long 2216669086 + .long 3218421174 + .long 3814844772 + .long 3194836884 + .long 1591910603 + .long 1072693253 + .long 2011589771 + .long 3206962796 + .long 3721194918 + .long 3218420324 + .long 1295469166 + .long 3195182212 + .long 2130808979 + .long 1072693254 + .long 1222040805 + .long 3207187539 + .long 555871541 + .long 3218419433 + .long 401254514 + .long 3195493098 + .long 3390924472 + .long 1072693255 + .long 3112838711 + .long 3207434078 + .long 1558155560 + .long 3218418499 + .long 683885552 + .long 3195864282 + .long 1145294069 + .long 1072693257 + .long 1821670117 + .long 3207648695 + .long 2692181933 + .long 3218417523 + .long 2704036295 + .long 3196181879 + .long 4054831834 + .long 1072693258 + .long 1649153664 + .long 3207795248 + .long 4228604383 + .long 3218416505 + .long 4004758581 + .long 3196440654 + .long 3603542514 + .long 1072693260 + .long 1123737044 + .long 3207954183 + .long 2154630785 + .long 3218415446 + .long 2606327835 + .long 3196743208 + .long 4163276658 + .long 1072693262 + .long 2048619642 + .long 3208125991 + .long 1058893780 + .long 3218414345 + .long 250194901 + .long 3197094852 + .long 1518877548 + .long 1072693265 + .long 3379868633 + .long 3208311162 + .long 1246516380 + .long 3218413202 + .long 1621358934 + .long 3197304764 + .long 48033162 + .long 1072693268 + .long 957106177 + .long 3208510185 + .long 3034045498 + .long 3218412017 + .long 798414253 + .long 3197538466 + .long 4131323741 + .long 1072693270 + .long 2207647163 + .long 3208683052 + .long 2454449664 + .long 3218410791 + .long 1709648499 + .long 3197805932 + .long 972334142 + .long 1072693274 + .long 1279092327 + .long 3208797143 + .long 4141984674 + .long 3218409523 + .long 4279927728 + .long 3198110676 + .long 3547307714 + .long 1072693277 + .long 873763845 + .long 3208918886 + .long 4152286949 + .long 3218408214 + .long 947630201 + .long 3198400037 + .long 3779918761 + .long 1072693283 + .long 2452756690 + .long 3209115951 + .long 2900277560 + .long 3218406175 + .long 4114829322 + .long 3198840356 + .long 1550746642 + .long 1072693293 + .long 3179273584 + .long 3209408258 + .long 1697097694 + .long 3218403310 + .long 3189856208 + .long 3199299134 + .long 2567958063 + .long 1072693304 + .long 2177201355 + .long 3209713300 + .long 663593652 + .long 3218400281 + .long 1915839956 + .long 3199641526 + .long 3400799630 + .long 1072693317 + .long 2625933576 + .long 3209895292 + .long 3140727122 + .long 3218397088 + .long 2825210621 + .long 3200061154 + .long 661592278 + .long 1072693333 + .long 2751163500 + .long 3210096603 + .long 4055449010 + .long 3218393733 + .long 57286782 + .long 3200412116 + .long 3889851982 + .long 1072693350 + .long 2680384314 + .long 3210318153 + .long 2804057046 + .long 3218390217 + .long 1812582369 + .long 3200718155 + .long 1191734144 + .long 1072693371 + .long 867498228 + .long 3210560852 + .long 3250577733 + .long 3218386540 + .long 3326742410 + .long 3201083020 + .long 2188854007 + .long 1072693394 + .long 363145135 + .long 3210782655 + .long 840173644 + .long 3218382704 + .long 1735074843 + .long 3201408616 + .long 3657661222 + .long 1072693420 + .long 2204762872 + .long 3210926495 + .long 4072217384 + .long 3218378708 + .long 2965875284 + .long 3201662196 + .long 2413420961 + .long 1072693450 + .long 1162405510 + .long 3211082241 + .long 138720143 + .long 3218374556 + .long 454705634 + .long 3201958187 + .long 3899194868 + .long 1072693483 + .long 669033796 + .long 3211250324 + .long 2167069495 + .long 3218370246 + .long 1542529428 + .long 3202301612 + .long 710018948 + .long 1072693521 + .long 2883210692 + .long 3211431169 + .long 1973418570 + .long 3218365781 + .long 3156689511 + .long 3202524481 + .long 2656657906 + .long 1072693562 + .long 3498100032 + .long 3211625196 + .long 125419693 + .long 3218361162 + .long 1620715508 + .long 3202751895 + .long 2404819887 + .long 1072693608 + .long 4021715948 + .long 3211810552 + .long 1645154164 + .long 3218356389 + .long 703452016 + .long 3203011668 + .long 1243884135 + .long 1072693659 + .long 480742811 + .long 3211921363 + .long 3122063309 + .long 3218351464 + .long 223504399 + .long 3203307063 + .long 495862037 + .long 1072693715 + .long 300794004 + .long 3212039372 + .long 1300653287 + .long 3218346389 + .long 1176592120 + .long 3203610816 + .long 3274452673 + .long 1072693808 + .long 2613861807 + .long 3212229889 + .long 359514654 + .long 3218338503 + .long 2923503278 + .long 3204034910 + .long 3741678157 + .long 1072693954 + .long 3651935792 + .long 3212511436 + .long 2702507736 + .long 3218327463 + .long 2210624435 + .long 3204506468 + .long 1100251351 + .long 1072694127 + .long 3514265607 + .long 3212825173 + .long 957470414 + .long 3218315845 + .long 1305550937 + .long 3204833184 + .long 2996845965 + .long 1072694328 + .long 3142229264 + .long 3213004685 + .long 1883674585 + .long 3218303659 + .long 3326598907 + .long 3205231584 + .long 274977645 + .long 1072694562 + .long 3016319234 + .long 3213195820 + .long 1539002348 + .long 3218290918 + .long 3984366897 + .long 3205604614 + .long 1292806442 + .long 1072694830 + .long 3262520051 + .long 3213405058 + .long 2372653574 + .long 3218277634 + .long 2452462577 + .long 3205892032 + .long 1815353697 + .long 1072695136 + .long 3662183375 + .long 3213632998 + .long 250148789 + .long 3218263821 + .long 2158010733 + .long 3206232708 + .long 2150433494 + .long 1072695483 + .long 3919565056 + .long 3213880202 + .long 1540395291 + .long 3218249491 + .long 3182910565 + .long 3206589369 + .long 2808974545 + .long 1072695874 + .long 1965799910 + .long 3214016317 + .long 1545570484 + .long 3218234659 + .long 1413633121 + .long 3206823218 + .long 164723038 + .long 1072696313 + .long 81021250 + .long 3214159950 + .long 1583468454 + .long 3218219339 + .long 18571726 + .long 3207094384 + .long 3588317822 + .long 1072696801 + .long 4095098713 + .long 3214313941 + .long 298038316 + .long 3218203546 + .long 912947688 + .long 3207406859 + .long 1041448961 + .long 1072697344 + .long 4179586945 + .long 3214478495 + .long 2148027612 + .long 3218187294 + .long 3720520462 + .long 3207679413 + .long 1980273179 + .long 1072697943 + .long 1752543433 + .long 3214653794 + .long 124299728 + .long 3218170600 + .long 864061540 + .long 3207883361 + .long 2949417123 + .long 1072698602 + .long 4190073881 + .long 3214839998 + .long 1415544749 + .long 3218153478 + .long 3694676202 + .long 3208114560 + .long 420771937 + .long 1072699325 + .long 1282420231 + .long 3214985633 + .long 1533345938 + .long 3218135945 + .long 2892854837 + .long 3208375402 + .long 3632588569 + .long 1072700113 + .long 2712748874 + .long 3215089842 + .long 1386124246 + .long 3218118017 + .long 1634175019 + .long 3208733922 + .long 347483009 + .long 1072701423 + .long 1161341506 + .long 3215256321 + .long 1877668895 + .long 3218090451 + .long 4108664264 + .long 3209099007 + .long 3038559136 + .long 1072703435 + .long 2683048238 + .long 3215498732 + .long 1179454900 + .long 3218025113 + .long 1332126937 + .long 3209546908 + .long 3486307715 + .long 1072705767 + .long 2508275841 + .long 3215764027 + .long 359393231 + .long 3217946511 + .long 1961215910 + .long 3209890029 + .long 2252418763 + .long 1072708441 + .long 2827865151 + .long 3216017387 + .long 3509880367 + .long 3217865627 + .long 3222140085 + .long 3210213923 + .long 1486994624 + .long 1072711477 + .long 3160629487 + .long 3216172802 + .long 1178047112 + .long 3217782741 + .long 1901428593 + .long 3210596649 + .long 3746562216 + .long 1072714893 + .long 1033996001 + .long 3216339382 + .long 39866696 + .long 3217698130 + .long 2908573463 + .long 3210891953 + .long 2324761591 + .long 1072718707 + .long 2389401627 + .long 3216516876 + .long 3645939838 + .long 3217612071 + .long 2440236284 + .long 3211151116 + .long 1761407793 + .long 1072722932 + .long 2502005220 + .long 3216704962 + .long 1997398717 + .long 3217524842 + .long 2895026412 + .long 3211448596 + .long 4114502182 + .long 1072727579 + .long 2605061383 + .long 3216903247 + .long 58515002 + .long 3217436714 + .long 711731960 + .long 3211787230 + .long 3951984035 + .long 1072732658 + .long 3516063216 + .long 3217071220 + .long 3638757279 + .long 3217347953 + .long 3233370794 + .long 3211979005 + .long 658281779 + .long 1072738175 + .long 309554960 + .long 3217179845 + .long 1331214594 + .long 3217258823 + .long 2937534811 + .long 3212193451 + .long 2289001467 + .long 1072744131 + .long 2442043690 + .long 3217292793 + .long 2664085653 + .long 3217169576 + .long 3462081454 + .long 3212432263 + .long 3795084150 + .long 1072750527 + .long 1130374688 + .long 3217409754 + .long 3638257201 + .long 3217080459 + .long 3906637920 + .long 3212696488 + .long 4040275044 + .long 1072757360 + .long 3643517564 + .long 3217530392 + .long 4148962921 + .long 3216952251 + .long 1995056602 + .long 3212911950 + .long 1479928784 + .long 1072764624 + .long 2653868580 + .long 3217654355 + .long 1010106713 + .long 3216775940 + .long 3129357315 + .long 3213070764 + .long 2856812514 + .long 1072772308 + .long 1621093115 + .long 3217781272 + .long 1824031529 + .long 3216601249 + .long 2296680075 + .long 3213333328 + .long 2460843475 + .long 1072784536 + .long 3722925065 + .long 3217975665 + .long 3901534801 + .long 3216343697 + .long 741495589 + .long 3213734822 + .long 13033194 + .long 1072802249 + .long 1706090638 + .long 3218161084 + .long 4129724113 + .long 3216008854 + .long 2582831738 + .long 3214039094 + .long 3092949488 + .long 1072821329 + .long 4163404160 + .long 3218296789 + .long 673560195 + .long 3215391593 + .long 1852259695 + .long 3214295490 + .long 3663604487 + .long 1072841572 + .long 2783926416 + .long 3218433189 + .long 538028418 + .long 3214623601 + .long 955002681 + .long 3214577680 + .long 1457520314 + .long 1072862739 + .long 2977011911 + .long 3218568683 + .long 2456605794 + .long 3213048602 + .long 1782979473 + .long 3214883178 + .long 3136246603 + .long 1072884563 + .long 4172123069 + .long 3218701739 + .long 1041205303 + .long 1065062250 + .long 1494191018 + .long 3215071352 + .long 2030188257 + .long 1072906761 + .long 242335435 + .long 3218830924 + .long 3225388224 + .long 1066807264 + .long 2597486284 + .long 3215242091 + .long 1527970838 + .long 1072929036 + .long 2966426512 + .long 3218954923 + .long 1554080475 + .long 1067589039 + .long 1299968651 + .long 3215418462 + .long 3575385503 + .long 1072951087 + .long 2115725422 + .long 3219072567 + .long 1970202642 + .long 1068007486 + .long 633750547 + .long 3215597833 + .long 4170701031 + .long 1072972617 + .long 46586082 + .long 3219155579 + .long 1194653136 + .long 1068384025 + .long 4171340731 + .long 3215777352 + .long 3578160514 + .long 1072993337 + .long 3238411740 + .long 3219206599 + .long 3278559237 + .long 1068609006 + .long 2404931200 + .long 3215954013 + .long 533888921 + .long 1073012973 + .long 1507597629 + .long 3219253160 + .long 2386969249 + .long 1068756225 + .long 272720058 + .long 3216053653 + .long 54544651 + .long 1073031269 + .long 3020671348 + .long 3219294996 + .long 4122670807 + .long 1068883785 + .long 2536786852 + .long 3216134458 + .long 230026772 + .long 1073047994 + .long 2830531360 + .long 3219331923 + .long 2545616196 + .long 1068992498 + .long 3897096954 + .long 3216209170 + .long 867435464 + .long 1073062943 + .long 3935983781 + .long 3219363830 + .long 4280666630 + .long 1069083305 + .long 1614478429 + .long 3216276286 + .long 3991143559 + .long 1073075939 + .long 3165050417 + .long 3219390677 + .long 248866814 + .long 1069157251 + .long 2328429718 + .long 3216358398 + .long 1880129173 + .long 1073091258 + .long 4059723411 + .long 3219421162 + .long 3082848917 + .long 1069238148 + .long 1081358649 + .long 3216430553 + .long 1955557582 + .long 1073104040 + .long 2869422647 + .long 3219445318 + .long 1310544530 + .long 1069299023 + .long 434435025 + .long 3216450109 + .long 3947018234 + .long 1073107343 + .long 3414641036 + .long 3219451270 + .long 4069313179 + .long 1069313321 + .long 1392468754 + .long 3216410502 + .long 3271741504 + .long 1073101128 + .long 3884994071 + .long 3219440866 + .long 1456085694 + .long 1069290099 + .long 2332856790 + .long 3216307665 + .long 3950891192 + .long 1073085735 + .long 439037894 + .long 3219416288 + .long 1197951536 + .long 1069237765 + .long 4195788421 + .long 3216139842 + .long 3990997338 + .long 1073061787 + .long 550042602 + .long 3219379833 + .long 2832452545 + .long 1069163766 + .long 1200943255 + .long 3215832361 + .long 2073883731 + .long 1073030122 + .long 3042850267 + .long 3219333800 + .long 991641143 + .long 1069074535 + .long 1637244010 + .long 3215243222 + .long 3805163810 + .long 1072991715 + .long 3517445189 + .long 3219280382 + .long 2680864185 + .long 1068975465 + .long 1457843741 + .long 3214140932 + .long 1315080793 + .long 1072947617 + .long 3059804278 + .long 3219221594 + .long 2861308047 + .long 1068870963 + .long 3296491873 + .long 1064537111 + .long 3728462150 + .long 1072898893 + .long 3615137083 + .long 3219159232 + .long 3017963192 + .long 1068764532 + .long 3972434375 + .long 1067468619 + .long 1336398218 + .long 1072846587 + .long 1068664290 + .long 3219061390 + .long 122240345 + .long 1068658880 + .long 508009436 + .long 1068456917 + .long 3501538245 + .long 1072791681 + .long 968690691 + .long 3218931236 + .long 1514516445 + .long 1068556030 + .long 671541798 + .long 1069006173 + .long 3814409280 + .long 1072735081 + .long 1553551847 + .long 3218801852 + .long 2849431279 + .long 1068415930 + .long 285838780 + .long 1069554660 + .long 2881499585 + .long 1072661949 + .long 928028610 + .long 3218674977 + .long 8837506 + .long 1068229231 + .long 4283922105 + .long 1069842903 + .long 1813934616 + .long 1072546640 + .long 2296020303 + .long 3218551962 + .long 3757630126 + .long 1068054242 + .long 4184842874 + .long 1070138481 + .long 1612285858 + .long 1072432209 + .long 3568867548 + .long 3218433820 + .long 2489334631 + .long 1067891605 + .long 3119354956 + .long 1070586029 + .long 1945534618 + .long 1072265408 + .long 12375465 + .long 3218268030 + .long 869568690 + .long 1067671872 + .long 313517472 + .long 1070892138 + .long 1205077106 + .long 1072052753 + .long 2329101392 + .long 3218055718 + .long 31064032 + .long 1067390210 + .long 1106783211 + .long 1071186310 + .long 571472860 + .long 1071856508 + .long 2279775366 + .long 3217706561 + .long 3977902324 + .long 1066976012 + .long 1438560376 + .long 1071467394 + .long 433300635 + .long 1071678859 + .long 2662131044 + .long 3217407122 + .long 3461865003 + .long 1066639491 + .long 3761842524 + .long 1071687909 + .long 591758334 + .long 1071396321 + .long 1311878841 + .long 3217153539 + .long 3007781852 + .long 1066335723 + .long 1614590629 + .long 1071809819 + .long 1253814918 + .long 1071117476 + .long 1728609767 + .long 3216850667 + .long 2200561853 + .long 1065903347 + .long 3821226689 + .long 1071921115 + .long 2022982069 + .long 1070874479 + .long 2030156196 + .long 3216496942 + .long 874711265 + .long 1065560045 + .long 2003227996 + .long 1072021655 + .long 2808404217 + .long 1070664514 + .long 1372837647 + .long 3216204595 + .long 822053276 + .long 1065224094 + .long 3767175364 + .long 1072111660 + .long 3043371777 + .long 1070372670 + .long 1442419211 + .long 3215945892 + .long 298752438 + .long 1064796452 + .long 1111528881 + .long 1072191609 + .long 3513208196 + .long 1070065467 + .long 3837735739 + .long 3215552388 + .long 3701924119 + .long 1064460397 + .long 1230501085 + .long 1072262142 + .long 2161267832 + .long 1069804871 + .long 4188367704 + .long 3215231429 + .long 401190186 + .long 1064089052 + .long 3002339892 + .long 1072323996 + .long 1480019407 + .long 1069584807 + .long 1833655520 + .long 3214970435 + .long 2907956919 + .long 1063676311 + .long 875346000 + .long 1072377952 + .long 3150437403 + .long 1069251888 + .long 876861923 + .long 3214583482 + .long 1689748747 + .long 1063353511 + .long 2795554744 + .long 1072424793 + .long 3869705215 + .long 1068941581 + .long 1837883894 + .long 3214240854 + .long 2762317048 + .long 1062946513 + .long 2491972100 + .long 1072465284 + .long 4114823501 + .long 1068682289 + .long 2146865463 + .long 3213964103 + .long 800804261 + .long 1062552648 + .long 2634953449 + .long 1072500149 + .long 2952556276 + .long 1068433515 + .long 1872935290 + .long 3213596436 + .long 525130857 + .long 1062245296 + .long 3287041404 + .long 1072542855 + .long 164674845 + .long 1067923724 + .long 3273134342 + .long 3213089271 + .long 171708004 + .long 1061610314 + .long 3035032320 + .long 1072586748 + .long 3976243935 + .long 1067403539 + .long 3504708444 + .long 3212404491 + .long 3955947885 + .long 1060882840 + .long 513098494 + .long 1072618404 + .long 416924237 + .long 1066726877 + .long 1788945081 + .long 3211801737 + .long 1199639353 + .long 1060166859 + .long 2284134637 + .long 1072641010 + .long 754275327 + .long 1066136447 + .long 94803481 + .long 3211042671 + .long 3377507017 + .long 1059354147 + .long 1467291457 + .long 1072657015 + .long 2435597312 + .long 1065520743 + .long 2819017772 + .long 3210358609 + .long 1988617747 + .long 1058591581 + .long 633705514 + .long 1072668259 + .long 392269686 + .long 1064864433 + .long 2964449929 + .long 3209729770 + .long 3963893163 + .long 1057889872 + .long 2214892393 + .long 1072676103 + .long 2190738271 + .long 1064315837 + .long 3773826451 + .long 3208969045 + .long 3609404170 + .long 1057113308 + .long 3795216963 + .long 1072681541 + .long 3959981107 + .long 1063599490 + .long 1577139384 + .long 3208281591 + .long 1777963469 + .long 1056319886 + .long 2768813161 + .long 1072685290 + .long 452197850 + .long 1062981751 + .long 625862001 + .long 3207639777 + .long 1894515286 + .long 1055580811 + .long 809336726 + .long 1072687861 + .long 325412222 + .long 1062349073 + .long 3494772326 + .long 3206874482 + .long 3143092609 + .long 1054887561 + .long 1391578948 + .long 1072689615 + .long 370441451 + .long 1061660435 + .long 67458841 + .long 3206180214 + .long 1971759196 + .long 1054066692 + .long 57274217 + .long 1072690807 + .long 293665776 + .long 1061075750 + .long 1340185983 + .long 3205535605 + .long 2210177191 + .long 1053294335 + .long 1110907588 + .long 1072691613 + .long 3961986905 + .long 1060367146 + .long 3774614905 + .long 3204763416 + .long 3590429673 + .long 1052580827 + .long 2737507729 + .long 1072692156 + .long 370479370 + .long 1059701790 + .long 1033751386 + .long 3204059641 + .long 1162278823 + .long 1051830218 + .long 2341375458 + .long 1072692521 + .long 760364123 + .long 1059103172 + .long 910883556 + .long 3203420282 + .long 401067508 + .long 1051028170 + .long 3358303651 + .long 1072692765 + .long 3104773993 + .long 1058369139 + .long 2043715743 + .long 3202639413 + .long 4274377921 + .long 1050278646 + .long 3501940353 + .long 1072692984 + .long 2710387139 + .long 1057384557 + .long 2550611600 + .long 3201592258 + .long 2260324605 + .long 1049158690 + .long 3160989127 + .long 1072693133 + .long 1403521776 + .long 1056074537 + .long 760745859 + .long 3200238663 + .long 1163121055 + .long 1047679067 + .long 3509020169 + .long 1072693198 + .long 3352058101 + .long 1054743188 + .long 2289323607 + .long 3198722761 + .long 918272756 + .long 1046147840 + .long 4268817660 + .long 1072693226 + .long 1580550645 + .long 1053325591 + .long 1736251411 + .long 3197308470 + .long 1531106447 + .long 1044632576 + .long 0 + .long 1072693248 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 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 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 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .long 2146959360 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .long 2130706432 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .long 1022885888 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .long 69730304 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .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_stanh_data_internal,@object + .size __svml_stanh_data_internal,6016 + .align 4 + +__stanh_la__imlsTanhTab: + .long 1065353216 + .long 3212836864 + .type __stanh_la__imlsTanhTab,@object + .size __stanh_la__imlsTanhTab,8 diff --git a/sysdeps/x86_64/fpu/svml_d_tanh2_core.S b/sysdeps/x86_64/fpu/svml_d_tanh2_core.S new file mode 100644 index 0000000000..c703131777 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_tanh2_core.S @@ -0,0 +1,29 @@ +/* Function tanh 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_tanh) +WRAPPER_IMPL_SSE2 tanh +END (_ZGVbN2v_tanh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN2v_tanh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_tanh4_core.S b/sysdeps/x86_64/fpu/svml_d_tanh4_core.S new file mode 100644 index 0000000000..fb293f4dba --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_tanh4_core.S @@ -0,0 +1,29 @@ +/* Function tanh 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_tanh) +WRAPPER_IMPL_AVX _ZGVbN2v_tanh +END (_ZGVdN4v_tanh) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN4v_tanh) +#endif diff --git a/sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S b/sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S new file mode 100644 index 0000000000..5385a2c27c --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_tanh4_core_avx.S @@ -0,0 +1,25 @@ +/* Function tanh 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_tanh) +WRAPPER_IMPL_AVX _ZGVbN2v_tanh +END (_ZGVcN4v_tanh) diff --git a/sysdeps/x86_64/fpu/svml_d_tanh8_core.S b/sysdeps/x86_64/fpu/svml_d_tanh8_core.S new file mode 100644 index 0000000000..9dafa7bb9a --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_d_tanh8_core.S @@ -0,0 +1,25 @@ +/* Function tanh 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_tanh) +WRAPPER_IMPL_AVX512 _ZGVdN4v_tanh +END (_ZGVeN8v_tanh) diff --git a/sysdeps/x86_64/fpu/svml_s_tanhf16_core.S b/sysdeps/x86_64/fpu/svml_s_tanhf16_core.S new file mode 100644 index 0000000000..19d51365e8 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_tanhf16_core.S @@ -0,0 +1,25 @@ +/* Function tanhf 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_tanhf) +WRAPPER_IMPL_AVX512 _ZGVdN8v_tanhf +END (_ZGVeN16v_tanhf) diff --git a/sysdeps/x86_64/fpu/svml_s_tanhf4_core.S b/sysdeps/x86_64/fpu/svml_s_tanhf4_core.S new file mode 100644 index 0000000000..6b98950f84 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_tanhf4_core.S @@ -0,0 +1,29 @@ +/* Function tanhf 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_tanhf) +WRAPPER_IMPL_SSE2 tanhf +END (_ZGVbN4v_tanhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVbN4v_tanhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_tanhf8_core.S b/sysdeps/x86_64/fpu/svml_s_tanhf8_core.S new file mode 100644 index 0000000000..3ada061ae0 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_tanhf8_core.S @@ -0,0 +1,29 @@ +/* Function tanhf 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_tanhf) +WRAPPER_IMPL_AVX _ZGVbN4v_tanhf +END (_ZGVdN8v_tanhf) + +#ifndef USE_MULTIARCH + libmvec_hidden_def (_ZGVdN8v_tanhf) +#endif diff --git a/sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S b/sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S new file mode 100644 index 0000000000..255d45952d --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_s_tanhf8_core_avx.S @@ -0,0 +1,25 @@ +/* Function tanhf 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_tanhf) +WRAPPER_IMPL_AVX _ZGVbN4v_tanhf +END (_ZGVcN8v_tanhf) diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c new file mode 100644 index 0000000000..a456c574e2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx.c @@ -0,0 +1 @@ +#include "test-double-libmvec-tanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c new file mode 100644 index 0000000000..a456c574e2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx2.c @@ -0,0 +1 @@ +#include "test-double-libmvec-tanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx512f.c b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx512f.c new file mode 100644 index 0000000000..a456c574e2 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-tanh-avx512f.c @@ -0,0 +1 @@ +#include "test-double-libmvec-tanh.c" diff --git a/sysdeps/x86_64/fpu/test-double-libmvec-tanh.c b/sysdeps/x86_64/fpu/test-double-libmvec-tanh.c new file mode 100644 index 0000000000..4cb6a169d8 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-libmvec-tanh.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE double +#define LIBMVEC_FUNC tanh +#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 d6b866263f..5c92c06aea 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1p), _ZGVbN2v_log1p) VECTOR_WRAPPER (WRAPPER_NAME (log2), _ZGVbN2v_log2) VECTOR_WRAPPER (WRAPPER_NAME (sinh), _ZGVbN2v_sinh) VECTOR_WRAPPER (WRAPPER_NAME (tan), _ZGVbN2v_tan) +VECTOR_WRAPPER (WRAPPER_NAME (tanh), _ZGVbN2v_tanh) #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 88e7f8e375..85f52cf5b1 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c @@ -50,6 +50,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1p), _ZGVdN4v_log1p) VECTOR_WRAPPER (WRAPPER_NAME (log2), _ZGVdN4v_log2) VECTOR_WRAPPER (WRAPPER_NAME (sinh), _ZGVdN4v_sinh) VECTOR_WRAPPER (WRAPPER_NAME (tan), _ZGVdN4v_tan) +VECTOR_WRAPPER (WRAPPER_NAME (tanh), _ZGVdN4v_tanh) #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 79f6275ceb..971742e77d 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1p), _ZGVcN4v_log1p) VECTOR_WRAPPER (WRAPPER_NAME (log2), _ZGVcN4v_log2) VECTOR_WRAPPER (WRAPPER_NAME (sinh), _ZGVcN4v_sinh) VECTOR_WRAPPER (WRAPPER_NAME (tan), _ZGVcN4v_tan) +VECTOR_WRAPPER (WRAPPER_NAME (tanh), _ZGVcN4v_tanh) #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 80025ee612..fdfc24bc85 100644 --- a/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1p), _ZGVeN8v_log1p) VECTOR_WRAPPER (WRAPPER_NAME (log2), _ZGVeN8v_log2) VECTOR_WRAPPER (WRAPPER_NAME (sinh), _ZGVeN8v_sinh) VECTOR_WRAPPER (WRAPPER_NAME (tan), _ZGVeN8v_tan) +VECTOR_WRAPPER (WRAPPER_NAME (tanh), _ZGVeN8v_tanh) #ifndef __ILP32__ # define VEC_INT_TYPE __m512i diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c new file mode 100644 index 0000000000..254f9201aa --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx.c @@ -0,0 +1 @@ +#include "test-float-libmvec-tanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c new file mode 100644 index 0000000000..254f9201aa --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx2.c @@ -0,0 +1 @@ +#include "test-float-libmvec-tanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx512f.c b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx512f.c new file mode 100644 index 0000000000..254f9201aa --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf-avx512f.c @@ -0,0 +1 @@ +#include "test-float-libmvec-tanhf.c" diff --git a/sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c new file mode 100644 index 0000000000..9a61ee8f9c --- /dev/null +++ b/sysdeps/x86_64/fpu/test-float-libmvec-tanhf.c @@ -0,0 +1,3 @@ +#define LIBMVEC_TYPE float +#define LIBMVEC_FUNC tanhf +#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 f8f0a3858a..b1a6360b1a 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen16-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1pf), _ZGVeN16v_log1pf) VECTOR_WRAPPER (WRAPPER_NAME (log2f), _ZGVeN16v_log2f) VECTOR_WRAPPER (WRAPPER_NAME (sinhf), _ZGVeN16v_sinhf) VECTOR_WRAPPER (WRAPPER_NAME (tanf), _ZGVeN16v_tanf) +VECTOR_WRAPPER (WRAPPER_NAME (tanhf), _ZGVeN16v_tanhf) #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 9778549534..8a29d4e630 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen4-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1pf), _ZGVbN4v_log1pf) VECTOR_WRAPPER (WRAPPER_NAME (log2f), _ZGVbN4v_log2f) VECTOR_WRAPPER (WRAPPER_NAME (sinhf), _ZGVbN4v_sinhf) VECTOR_WRAPPER (WRAPPER_NAME (tanf), _ZGVbN4v_tanf) +VECTOR_WRAPPER (WRAPPER_NAME (tanhf), _ZGVbN4v_tanhf) #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 f00ba85eaa..f3337c4656 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-avx2-wrappers.c @@ -50,6 +50,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1pf), _ZGVdN8v_log1pf) VECTOR_WRAPPER (WRAPPER_NAME (log2f), _ZGVdN8v_log2f) VECTOR_WRAPPER (WRAPPER_NAME (sinhf), _ZGVdN8v_sinhf) VECTOR_WRAPPER (WRAPPER_NAME (tanf), _ZGVdN8v_tanf) +VECTOR_WRAPPER (WRAPPER_NAME (tanhf), _ZGVdN8v_tanhf) /* 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 45bcf55340..3e8b6aa331 100644 --- a/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c +++ b/sysdeps/x86_64/fpu/test-float-vlen8-wrappers.c @@ -47,6 +47,7 @@ VECTOR_WRAPPER (WRAPPER_NAME (log1pf), _ZGVcN8v_log1pf) VECTOR_WRAPPER (WRAPPER_NAME (log2f), _ZGVcN8v_log2f) VECTOR_WRAPPER (WRAPPER_NAME (sinhf), _ZGVcN8v_sinhf) VECTOR_WRAPPER (WRAPPER_NAME (tanf), _ZGVcN8v_tanf) +VECTOR_WRAPPER (WRAPPER_NAME (tanhf), _ZGVcN8v_tanhf) #define VEC_INT_TYPE __m128i