// Copyright Naoki Shibata and contributors 2010 - 2023. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #if defined(_MSC_VER) #define STDIN_FILENO 0 #else #include #include #endif #include "quaddef.h" #include "misc.h" #if !defined(USE_INLINE_HEADER) #include "sleef.h" #else // #if !defined(USE_INLINE_HEADER) #include #include #include #include #if defined(__AVX2__) || defined(__aarch64__) || defined(__arm__) || defined(__powerpc64__) #ifndef FP_FAST_FMA #define FP_FAST_FMA #endif #endif #if defined(_MSC_VER) && !defined(__STDC__) #define __STDC__ 1 #endif #if (defined(__GNUC__) || defined(__CLANG__)) && (defined(__i386__) || defined(__x86_64__)) #include #endif #if (defined(_MSC_VER)) #include #endif #if defined(__ARM_NEON__) || defined(__ARM_NEON) #include #endif #if defined(__ARM_FEATURE_SVE) #include #endif #if defined(__riscv) && defined(__riscv_v) #include #endif #if defined(__VSX__) #include #endif #if defined(__VX__) #include #endif #define SLEEF_ALWAYS_INLINE inline #define SLEEF_INLINE #define SLEEF_CONST #include USE_INLINE_HEADER #include MACRO_ONLY_HEADER #ifndef ENABLE_PUREC_SCALAR #include "sleefinline_purec_scalar.h" #endif #endif // #if !defined(USE_INLINE_HEADER) #include "testerutil.h" #define DORENAME #ifdef ENABLE_SSE2 #include "renamesse2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helpersse2.h" typedef Sleef___m128d_2 vdouble2; typedef Sleef___m128_2 vfloat2; #endif #endif #ifdef ENABLE_SSE4 #include "renamesse4.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 4 #include "helpersse2.h" typedef Sleef___m128d_2 vdouble2; typedef Sleef___m128_2 vfloat2; #endif #endif #ifdef ENABLE_AVX #include "renameavx.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx.h" typedef Sleef___m256d_2 vdouble2; typedef Sleef___m256_2 vfloat2; #endif #endif #ifdef ENABLE_FMA4 #include "renamefma4.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 4 #include "helperavx.h" typedef Sleef___m256d_2 vdouble2; typedef Sleef___m256_2 vfloat2; #endif #endif #ifdef ENABLE_AVX2 #include "renameavx2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx2.h" typedef Sleef___m256d_2 vdouble2; typedef Sleef___m256_2 vfloat2; #endif #endif #ifdef ENABLE_AVX2128 #include "renameavx2128.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx2_128.h" typedef Sleef___m128d_2 vdouble2; typedef Sleef___m128_2 vfloat2; #endif #endif #ifdef ENABLE_AVX512F #include "renameavx512f.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx512f.h" typedef Sleef___m512d_2 vdouble2; typedef Sleef___m512_2 vfloat2; #endif #endif #ifdef ENABLE_AVX512FNOFMA #include "renameavx512fnofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperavx512f.h" typedef Sleef___m512d_2 vdouble2; typedef Sleef___m512_2 vfloat2; #endif #endif #ifdef ENABLE_VECEXT #define CONFIG 1 #include "helpervecext.h" #include "norename.h" #endif #ifdef ENABLE_PUREC #define CONFIG 1 #include "helperpurec.h" #include "norename.h" #endif #ifdef ENABLE_NEON32 #include "renameneon32.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperneon32.h" typedef Sleef_float32x4_t_2 vfloat2; #endif #endif #ifdef ENABLE_NEON32VFPV4 #include "renameneon32vfpv4.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 4 #include "helperneon32.h" typedef Sleef_float32x4_t_2 vfloat2; #endif #endif #ifdef ENABLE_ADVSIMD #include "renameadvsimd.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperadvsimd.h" typedef Sleef_float64x2_t_2 vdouble2; typedef Sleef_float32x4_t_2 vfloat2; #endif #endif #ifdef ENABLE_ADVSIMDNOFMA #include "renameadvsimdnofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperadvsimd.h" typedef Sleef_float64x2_t_2 vdouble2; typedef Sleef_float32x4_t_2 vfloat2; #endif #endif #ifdef ENABLE_DSP128 #define CONFIG 2 #include "helpersse2.h" #include "renamedsp128.h" typedef Sleef___m128d_2 vdouble2; typedef Sleef___m128_2 vfloat2; #endif #ifdef ENABLE_SVE #include "renamesve.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helpersve.h" #endif #endif #ifdef ENABLE_SVENOFMA #include "renamesvenofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helpersve.h" #endif #endif #ifdef ENABLE_DSP256 #define CONFIG 1 #include "helperavx.h" #include "renamedsp256.h" typedef Sleef___m256d_2 vdouble2; typedef Sleef___m256_2 vfloat2; #endif #ifdef ENABLE_VSX #include "renamevsx.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperpower_128.h" #include "renamevsx.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VSXNOFMA #include "renamevsxnofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperpower_128.h" #include "renamevsxnofma.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VSX3 #include "renamevsx3.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 3 #include "helperpower_128.h" #include "renamevsx3.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VSX3NOFMA #include "renamevsx3nofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 4 #include "helperpower_128.h" #include "renamevsx3nofma.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VXE #include "renamevxe.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 140 #include "helpers390x_128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VXENOFMA #include "renamevxenofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 141 #include "helpers390x_128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VXE2 #include "renamevxe2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 150 #include "helpers390x_128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_VXE2NOFMA #include "renamevxe2nofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 151 #include "helpers390x_128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #endif #ifdef ENABLE_DSPPOWER_128 #define CONFIG 1 #include "helperpower_128.h" #include "renamedsp128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #ifdef ENABLE_DSPS390X_128 #define CONFIG 140 #include "helpers390x_128.h" #include "renamedsp128.h" typedef Sleef_SLEEF_VECTOR_DOUBLE_2 vdouble2; typedef Sleef_SLEEF_VECTOR_FLOAT_2 vfloat2; #endif #ifdef ENABLE_RVVM1 #include "renamervvm1.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperrvv.h" #endif #endif #ifdef ENABLE_RVVM1NOFMA #include "renamervvm1nofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperrvv.h" #endif #endif #ifdef ENABLE_RVVM2 #include "renamervvm2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperrvv.h" #endif #endif #ifdef ENABLE_RVVM2NOFMA #include "renamervvm2nofma.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperrvv.h" #endif #endif #ifdef ENABLE_PUREC_SCALAR #include "renamepurec_scalar.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperpurec_scalar.h" typedef Sleef_double_2 vdouble2; typedef Sleef_float_2 vfloat2; #endif #endif #ifdef ENABLE_PURECFMA_SCALAR #include "renamepurecfma_scalar.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperpurec_scalar.h" typedef Sleef_double_2 vdouble2; typedef Sleef_float_2 vfloat2; #endif #endif #ifdef ENABLE_DSP_SCALAR #include "renamedspscalar.h" #define CONFIG 1 #include "helperpurec_scalar.h" typedef Sleef_double_2 vdouble2; typedef Sleef_float_2 vfloat2; #endif #ifdef USE_INLINE_HEADER #define CONCAT_SIMD_SUFFIX_(keyword, suffix) keyword ## suffix #define CONCAT_SIMD_SUFFIX(keyword, suffix) CONCAT_SIMD_SUFFIX_(keyword, suffix) #define vmask CONCAT_SIMD_SUFFIX(vmask, SIMD_SUFFIX) #define vopmask CONCAT_SIMD_SUFFIX(vopmask, SIMD_SUFFIX) #define vdouble CONCAT_SIMD_SUFFIX(vdouble, SIMD_SUFFIX) #define vint CONCAT_SIMD_SUFFIX(vint, SIMD_SUFFIX) #define vfloat CONCAT_SIMD_SUFFIX(vfloat, SIMD_SUFFIX) #define vint2 CONCAT_SIMD_SUFFIX(vint2, SIMD_SUFFIX) #define vdouble2 CONCAT_SIMD_SUFFIX(vdouble2, SIMD_SUFFIX) #define vfloat2 CONCAT_SIMD_SUFFIX(vfloat2, SIMD_SUFFIX) #define vd2getx_vd_vd2 CONCAT_SIMD_SUFFIX(vd2getx_vd_vd2, SIMD_SUFFIX) #define vd2gety_vd_vd2 CONCAT_SIMD_SUFFIX(vd2gety_vd_vd2, SIMD_SUFFIX) #define vf2getx_vf_vf2 CONCAT_SIMD_SUFFIX(vf2getx_vf_vf2, SIMD_SUFFIX) #define vf2gety_vf_vf2 CONCAT_SIMD_SUFFIX(vf2gety_vf_vf2, SIMD_SUFFIX) #define vloadu_vd_p CONCAT_SIMD_SUFFIX(vloadu_vd_p, SIMD_SUFFIX) #define vstoreu_v_p_vd CONCAT_SIMD_SUFFIX(vstoreu_v_p_vd, SIMD_SUFFIX) #define vloadu_vf_p CONCAT_SIMD_SUFFIX(vloadu_vf_p, SIMD_SUFFIX) #define vstoreu_v_p_vf CONCAT_SIMD_SUFFIX(vstoreu_v_p_vf, SIMD_SUFFIX) #define vloadu_vi_p CONCAT_SIMD_SUFFIX(vloadu_vi_p, SIMD_SUFFIX) #define vstoreu_v_p_vi CONCAT_SIMD_SUFFIX(vstoreu_v_p_vi, SIMD_SUFFIX) #endif // int check_feature(double d, float f) { #ifdef ENABLE_DP { double s[VECTLENDP]; int i; for(i=0;i