// Copyright Naoki Shibata and contributors 2010 - 2021. // 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" #include "sleefquad.h" #else // #if !defined(USE_INLINE_HEADER) #include #include #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 "sleefquadinline_purec_scalar.h" #endif #endif // #if !defined(USE_INLINE_HEADER) #include "qtesterutil.h" // #ifdef ENABLE_PUREC_SCALAR #include "qrenamepurec_scalar.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperpurec_scalar.h" #define VARGQUAD Sleef_quad #endif #endif #ifdef ENABLE_PURECFMA_SCALAR #include "qrenamepurecfma_scalar.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helperpurec_scalar.h" #define VARGQUAD Sleef_quad #endif #endif #ifdef ENABLE_DSPSCALAR #include "qrenamedspscalar.h" #define CONFIG 1 #include "helperpurec_scalar.h" #define VARGQUAD Sleef_quad #endif #ifdef ENABLE_SSE2 #include "qrenamesse2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 2 #include "helpersse2.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_AVX2128 #include "qrenameavx2128.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx2_128.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_DSPX2_X86 #include "qrenamedspx2.h" #define CONFIG 2 #include "helpersse2.h" #define VARGQUAD Sleef_quadx2 #endif #ifdef ENABLE_AVX2 #include "qrenameavx2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx2.h" #define VARGQUAD Sleef_quadx4 #endif #endif #ifdef ENABLE_AVX512F #include "qrenameavx512f.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperavx512f.h" #define VARGQUAD Sleef_quadx8 #endif #endif #ifdef ENABLE_ADVSIMD #include "qrenameadvsimd.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperadvsimd.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_DSPX2_AARCH64 #include "qrenamedspx2.h" #define CONFIG 2 #include "helperadvsimd.h" #define VARGQUAD Sleef_quadx2 #endif #ifdef ENABLE_SVE #include "qrenamesve.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helpersve.h" #define VARGQUAD Sleef_svquad #endif #define SIZEOF_VARGQUAD (svcntd()*8) #endif #ifdef ENABLE_VSX #include "qrenamevsx.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #include "helperpower_128.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_VSX3 #include "qrenamevsx3.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 3 #include "helperpower_128.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_DSPX2_PPC64 #include "qrenamedspx2.h" #define CONFIG 1 #include "helperpower_128.h" #define VARGQUAD Sleef_quadx2 #endif #ifdef ENABLE_VXE #include "qrenamevxe.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 140 #include "helpers390x_128.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_VXE2 #include "qrenamevxe2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 150 #include "helpers390x_128.h" #define VARGQUAD Sleef_quadx2 #endif #endif #ifdef ENABLE_DSPX2_S390X #include "qrenamedspx2.h" #define CONFIG 140 #include "helpers390x_128.h" #define VARGQUAD Sleef_quadx2 #endif #ifdef ENABLE_RVVM1 #include "qrenamervvm1.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #define ENABLE_RVV_DP #include "helperrvv.h" #define VARGQUAD Sleef_rvvm1quad #endif #define SIZEOF_VARGQUAD (__riscv_vsetvlmax_e64m1()*8) #endif #ifdef ENABLE_RVVM2 #include "qrenamervvm2.h" #if !defined(USE_INLINE_HEADER) #define CONFIG 1 #define ENABLE_RVV_DP #include "helperrvv.h" #define VARGQUAD Sleef_rvvm2quad #endif #define SIZEOF_VARGQUAD (__riscv_vsetvlmax_e64m2()*8) #endif #ifndef VARGQUAD #define VARGQUAD vargquad #endif #ifndef SIZEOF_VARGQUAD #define SIZEOF_VARGQUAD sizeof(VARGQUAD) #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 vargquad CONCAT_SIMD_SUFFIX(vargquad, SIMD_SUFFIX) #define vint CONCAT_SIMD_SUFFIX(vint, SIMD_SUFFIX) #define vint2 CONCAT_SIMD_SUFFIX(vint2, SIMD_SUFFIX) #define vdouble2 CONCAT_SIMD_SUFFIX(vdouble2, 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 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_vi_p CONCAT_SIMD_SUFFIX(vloadu_vi_p, SIMD_SUFFIX) #define vstoreu_v_p_vi CONCAT_SIMD_SUFFIX(vstoreu_v_p_vi, SIMD_SUFFIX) #define vreinterpret_vm_vu64 CONCAT_SIMD_SUFFIX(vreinterpret_vm_vu64, SIMD_SUFFIX) #define vreinterpret_vu64_vm CONCAT_SIMD_SUFFIX(vreinterpret_vu64_vm, SIMD_SUFFIX) #define vreinterpret_vm_vi64 CONCAT_SIMD_SUFFIX(vreinterpret_vm_vi64, SIMD_SUFFIX) #define vreinterpret_vi64_vm CONCAT_SIMD_SUFFIX(vreinterpret_vi64_vm, SIMD_SUFFIX) #define vreinterpret_vm_vd CONCAT_SIMD_SUFFIX(vreinterpret_vm_vd, SIMD_SUFFIX) #define vreinterpret_vd_vm CONCAT_SIMD_SUFFIX(vreinterpret_vd_vm, SIMD_SUFFIX) #endif // int check_feature(double d, float f) { double s[VECTLENDP]; for(int i=0;i