1include(CheckCCompilerFlag) 2include(CheckCSourceCompiles) 3include(CheckTypeSize) 4 5if (BUILD_STATIC_TEST_BINS) 6 set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 7 set(BUILD_SHARED_LIBS OFF) 8 set(CMAKE_EXE_LINKER_FLAGS "-static") 9endif() 10 11if (NOT CMAKE_CROSSCOMPILING AND NOT SLEEF_FORCE_FIND_PACKAGE_SSL) 12 find_package(OpenSSL) 13 if (OPENSSL_FOUND) 14 set(SLEEF_OPENSSL_FOUND TRUE) 15 set(SLEEF_OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES}) 16 set(SLEEF_OPENSSL_VERSION ${OPENSSL_VERSION}) 17 set(SLEEF_OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}) 18 endif() 19else() 20 # find_package cannot find OpenSSL when cross-compiling 21 find_library(LIBSSL ssl) 22 find_library(LIBCRYPTO crypto) 23 if (LIBSSL AND LIBCRYPTO) 24 set(SLEEF_OPENSSL_FOUND TRUE) 25 set(SLEEF_OPENSSL_LIBRARIES ${LIBSSL} ${LIBCRYPTO}) 26 set(SLEEF_OPENSSL_VERSION ${LIBSSL}) 27 endif() 28endif() 29 30if (ENFORCE_TESTER3 AND NOT SLEEF_OPENSSL_FOUND) 31 message(FATAL_ERROR "ENFORCE_TESTER3 is specified and OpenSSL not found") 32endif() 33 34if (NOT (RUNNING_ON_APPVEYOR AND SLEEF_CLANG_ON_WINDOWS)) 35 # We rely on Cygwin tools in order to test the builds on 36 # appveyor. However, if we try to link these libraries, cmake finds 37 # the Cygwin version of libraries, which causes errors. 38 39 # Some toolchains require explicit linking of the libraries following. 40 find_library(LIB_MPFR mpfr) 41 find_library(LIBM m) 42 find_library(LIBGMP gmp) 43 find_library(LIBRT rt) 44 find_library(LIBFFTW3 fftw3) 45 46 if (LIB_MPFR) 47 find_path(MPFR_INCLUDE_DIR 48 NAMES mpfr.h 49 ONLY_CMAKE_FIND_ROOT_PATH) 50 endif(LIB_MPFR) 51 52 if (LIBFFTW3) 53 find_path(FFTW3_INCLUDE_DIR 54 NAMES fftw3.h 55 ONLY_CMAKE_FIND_ROOT_PATH) 56 endif(LIBFFTW3) 57 58 if (NOT LIBM) 59 set(LIBM "") 60 endif() 61 62 if (NOT LIBRT) 63 set(LIBRT "") 64 endif() 65endif(NOT (RUNNING_ON_APPVEYOR AND SLEEF_CLANG_ON_WINDOWS)) 66 67# The library currently supports the following SIMD architectures 68set(SLEEF_SUPPORTED_EXTENSIONS 69 AVX512F AVX512FNOFMA AVX2 AVX2128 FMA4 AVX SSE4 SSE2 # x86 70 ADVSIMD ADVSIMDNOFMA SVE SVENOFMA # Aarch64 71 NEON32 NEON32VFPV4 # Aarch32 72 VSX VSXNOFMA # PPC64 73 ZVECTOR2 ZVECTOR2NOFMA # IBM Z 74 PUREC_SCALAR PURECFMA_SCALAR # Generic type 75 CACHE STRING "List of SIMD architectures supported by libsleef." 76 ) 77set(SLEEF_SUPPORTED_GNUABI_EXTENSIONS 78 SSE2 AVX AVX2 AVX512F ADVSIMD SVE 79 CACHE STRING "List of SIMD architectures supported by libsleef for GNU ABI." 80) 81set(SLEEFQUAD_SUPPORTED_EXT 82 PUREC_SCALAR PURECFMA_SCALAR SSE2 AVX FMA4 AVX2 AVX512F ADVSIMD SVE) 83# Force set default build type if none was specified 84# Note: some sleef code requires the optimisation flags turned on 85if(NOT CMAKE_BUILD_TYPE) 86 message(STATUS "Setting build type to 'Release' (required for full support).") 87 set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) 88 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 89 "Debug" "Release" "RelWithDebInfo" "MinSizeRel") 90endif() 91 92# Function used to generate safe command arguments for add_custom_command 93function(command_arguments PROPNAME) 94 set(quoted_args "") 95 foreach(arg ${ARGN}) 96 list(APPEND quoted_args "\"${arg}\"" ) 97 endforeach() 98 set(${PROPNAME} ${quoted_args} PARENT_SCOPE) 99endfunction() 100 101# PLATFORM DETECTION 102if((CMAKE_SYSTEM_PROCESSOR MATCHES "x86") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "amd64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")) 103 set(SLEEF_ARCH_X86 ON CACHE INTERNAL "True for x86 architecture.") 104 105 set(SLEEF_HEADER_LIST 106 SSE_ 107 SSE2 108 SSE4 109 AVX_ 110 AVX 111 FMA4 112 AVX2 113 AVX2128 114 AVX512F_ 115 AVX512F 116 AVX512FNOFMA 117 PUREC_SCALAR 118 PURECFMA_SCALAR 119 ) 120 command_arguments(HEADER_PARAMS_SSE_ cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__) 121 command_arguments(HEADER_PARAMS_SSE2 cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ sse2) 122 command_arguments(HEADER_PARAMS_SSE4 cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ sse4) 123 command_arguments(HEADER_PARAMS_AVX_ cinz_ 4 8 __m256d __m256 __m128i "struct { __m128i x, y$<SEMICOLON> }" __AVX__) 124 command_arguments(HEADER_PARAMS_AVX cinz_ 4 8 __m256d __m256 __m128i "struct { __m128i x, y$<SEMICOLON> }" __AVX__ avx) 125 command_arguments(HEADER_PARAMS_FMA4 finz_ 4 8 __m256d __m256 __m128i "struct { __m128i x, y$<SEMICOLON> }" __AVX__ fma4) 126 command_arguments(HEADER_PARAMS_AVX2 finz_ 4 8 __m256d __m256 __m128i __m256i __AVX__ avx2) 127 command_arguments(HEADER_PARAMS_AVX2128 finz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ avx2128) 128 command_arguments(HEADER_PARAMS_AVX512F_ finz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__) 129 command_arguments(HEADER_PARAMS_AVX512F finz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__ avx512f) 130 command_arguments(HEADER_PARAMS_AVX512FNOFMA cinz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__ avx512fnofma) 131 132 command_arguments(ALIAS_PARAMS_AVX512F_DP 8 __m512d __m256i e avx512f) 133 command_arguments(ALIAS_PARAMS_AVX512F_SP -16 __m512 __m512i e avx512f) 134 135 set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-mavx2;-mfma") 136 137 set(TESTER3_DEFINITIONS_SSE2 ATR=cinz_ DPTYPE=__m128d SPTYPE=__m128 DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=sse2) 138 set(TESTER3_DEFINITIONS_SSE4 ATR=cinz_ DPTYPE=__m128d SPTYPE=__m128 DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=sse4) 139 set(TESTER3_DEFINITIONS_AVX2128 ATR=finz_ DPTYPE=__m128d SPTYPE=__m128 DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=avx2128) 140 set(TESTER3_DEFINITIONS_AVX ATR=cinz_ DPTYPE=__m256d SPTYPE=__m256 DPTYPESPEC=d4 SPTYPESPEC=f8 EXTSPEC=avx) 141 set(TESTER3_DEFINITIONS_FMA4 ATR=finz_ DPTYPE=__m256d SPTYPE=__m256 DPTYPESPEC=d4 SPTYPESPEC=f8 EXTSPEC=fma4) 142 set(TESTER3_DEFINITIONS_AVX2 ATR=finz_ DPTYPE=__m256d SPTYPE=__m256 DPTYPESPEC=d4 SPTYPESPEC=f8 EXTSPEC=avx2) 143 set(TESTER3_DEFINITIONS_AVX512F ATR=finz_ DPTYPE=__m512d SPTYPE=__m512 DPTYPESPEC=d8 SPTYPESPEC=f16 EXTSPEC=avx512f) 144 set(TESTER3_DEFINITIONS_AVX512FNOFMA ATR=cinz_ DPTYPE=__m512d SPTYPE=__m512 DPTYPESPEC=d8 SPTYPESPEC=f16 EXTSPEC=avx512fnofma) 145 146elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") 147 set(SLEEF_ARCH_AARCH64 ON CACHE INTERNAL "True for Aarch64 architecture.") 148 # Aarch64 requires support for advsimdfma4 149 set(COMPILER_SUPPORTS_ADVSIMD 1) 150 set(COMPILER_SUPPORTS_ADVSIMDNOFMA 1) 151 152 set(SLEEF_HEADER_LIST 153 ADVSIMD_ 154 ADVSIMD 155 ADVSIMDNOFMA 156 SVE 157 SVENOFMA 158 PUREC_SCALAR 159 PURECFMA_SCALAR 160 ) 161 command_arguments(HEADER_PARAMS_ADVSIMD_ finz_ 2 4 float64x2_t float32x4_t int32x2_t int32x4_t __ARM_NEON) 162 command_arguments(HEADER_PARAMS_ADVSIMD finz_ 2 4 float64x2_t float32x4_t int32x2_t int32x4_t __ARM_NEON advsimd) 163 command_arguments(HEADER_PARAMS_ADVSIMDNOFMA cinz_ 2 4 float64x2_t float32x4_t int32x2_t int32x4_t __ARM_NEON advsimdnofma) 164 command_arguments(HEADER_PARAMS_SVE finz_ x x svfloat64_t svfloat32_t svint32_t svint32_t __ARM_FEATURE_SVE sve) 165 command_arguments(HEADER_PARAMS_SVENOFMA cinz_ x x svfloat64_t svfloat32_t svint32_t svint32_t __ARM_FEATURE_SVE svenofma) 166 167 command_arguments(ALIAS_PARAMS_ADVSIMD_DP 2 float64x2_t int32x2_t n advsimd) 168 command_arguments(ALIAS_PARAMS_ADVSIMD_SP -4 float32x4_t int32x4_t n advsimd) 169 170 set(TESTER3_DEFINITIONS_ADVSIMD ATR=finz_ DPTYPE=float64x2_t SPTYPE=float32x4_t DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=advsimd) 171 set(TESTER3_DEFINITIONS_ADVSIMDNOFMA ATR=cinz_ DPTYPE=float64x2_t SPTYPE=float32x4_t DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=advsimdnofma) 172 set(TESTER3_DEFINITIONS_SVE ATR=finz_ DPTYPE=svfloat64_t SPTYPE=svfloat32_t DPTYPESPEC=dx SPTYPESPEC=fx EXTSPEC=sve) 173 set(TESTER3_DEFINITIONS_SVENOFMA ATR=cinz_ DPTYPE=svfloat64_t SPTYPE=svfloat32_t DPTYPESPEC=dx SPTYPESPEC=fx EXTSPEC=svenofma) 174 175elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm") 176 set(SLEEF_ARCH_AARCH32 ON CACHE INTERNAL "True for Aarch32 architecture.") 177 set(COMPILER_SUPPORTS_NEON32 1) 178 set(COMPILER_SUPPORTS_NEON32VFPV4 1) 179 180 set(SLEEF_HEADER_LIST 181 NEON32_ 182 NEON32 183 NEON32VFPV4 184 PUREC_SCALAR 185 PURECFMA_SCALAR 186 ) 187 command_arguments(HEADER_PARAMS_NEON32_ cinz_ 2 4 - float32x4_t int32x2_t int32x4_t __ARM_NEON__) 188 command_arguments(HEADER_PARAMS_NEON32 cinz_ 2 4 - float32x4_t int32x2_t int32x4_t __ARM_NEON__ neon) 189 command_arguments(HEADER_PARAMS_NEON32VFPV4 finz_ 2 4 - float32x4_t int32x2_t int32x4_t __ARM_NEON__ neonvfpv4) 190 191 command_arguments(ALIAS_PARAMS_NEON32_SP -4 float32x4_t int32x4_t - neon) 192 command_arguments(ALIAS_PARAMS_NEON32_DP 0) 193 194 set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-mfpu=vfpv4") 195elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") 196 set(SLEEF_ARCH_PPC64 ON CACHE INTERNAL "True for PPC64 architecture.") 197 198 set(SLEEF_HEADER_LIST 199 VSX_ 200 VSX 201 VSXNOFMA 202 PUREC_SCALAR 203 PURECFMA_SCALAR 204 ) 205 206 set(HEADER_PARAMS_VSX finz_ 2 4 "__vector double" "__vector float" "__vector int" "__vector int" __VSX__ vsx) 207 set(HEADER_PARAMS_VSX_ finz_ 2 4 "__vector double" "__vector float" "__vector int" "__vector int" __VSX__ vsx) 208 set(HEADER_PARAMS_VSXNOFMA cinz_ 2 4 "__vector double" "__vector float" "__vector int" "__vector int" __VSX__ vsxnofma) 209 set(ALIAS_PARAMS_VSX_DP 2 "__vector double" "__vector int" - vsx) 210 set(ALIAS_PARAMS_VSX_SP -4 "__vector float" "__vector int" - vsx) 211 212 set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-mvsx") 213 214 set(TESTER3_DEFINITIONS_VSX ATR=finz_ DPTYPE=__vector_double SPTYPE=__vector_float DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=vsx) 215 set(TESTER3_DEFINITIONS_VSXNOFMA ATR=cinz_ DPTYPE=__vector_double SPTYPE=__vector_float DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=vsxnofma) 216 217elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x") 218 set(SLEEF_ARCH_S390X ON CACHE INTERNAL "True for IBM Z architecture.") 219 220 set(SLEEF_HEADER_LIST 221 ZVECTOR_ 222 ZVECTOR2 223 ZVECTOR2NOFMA 224 PUREC_SCALAR 225 PURECFMA_SCALAR 226 ) 227 228 set(HEADER_PARAMS_ZVECTOR_ finz_ 2 4 "SLEEF_VECTOR_DOUBLE" "SLEEF_VECTOR_FLOAT" "SLEEF_VECTOR_INT" "SLEEF_VECTOR_INT" __VEC__) 229 set(HEADER_PARAMS_ZVECTOR2 finz_ 2 4 "SLEEF_VECTOR_DOUBLE" "SLEEF_VECTOR_FLOAT" "SLEEF_VECTOR_INT" "SLEEF_VECTOR_INT" __VEC__ zvector2) 230 set(HEADER_PARAMS_ZVECTOR2NOFMA cinz_ 2 4 "SLEEF_VECTOR_DOUBLE" "SLEEF_VECTOR_FLOAT" "SLEEF_VECTOR_INT" "SLEEF_VECTOR_INT" __VEC__ zvector2nofma) 231 set(ALIAS_PARAMS_ZVECTOR2_DP 2 "__vector double" "__vector int" - zvector2) 232 set(ALIAS_PARAMS_ZVECTOR2_SP -4 "__vector float" "__vector int" - zvector2) 233 234 set(CLANG_FLAGS_ENABLE_PURECFMA_SCALAR "-march=z14;-mzvector") 235 236 set(TESTER3_DEFINITIONS_ZVECTOR2 ATR=finz_ DPTYPE=SLEEF_VECTOR_DOUBLE SPTYPE=SLEEF_VECTOR_FLOAT DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=zvector2) 237 set(TESTER3_DEFINITIONS_ZVECTOR2NOFMA ATR=cinz_ DPTYPE=SLEEF_VECTOR_DOUBLE SPTYPE=SLEEF_VECTOR_FLOAT DPTYPESPEC=d2 SPTYPESPEC=f4 EXTSPEC=zvector2nofma) 238endif() 239 240command_arguments(HEADER_PARAMS_PUREC_SCALAR cinz_ 1 1 double float int32_t int32_t __STDC__ purec) 241command_arguments(HEADER_PARAMS_PURECFMA_SCALAR finz_ 1 1 double float int32_t int32_t FP_FAST_FMA purecfma) 242command_arguments(ALIAS_PARAMS_PUREC_SCALAR_DP 1 double int32_t purec cinz_) 243command_arguments(ALIAS_PARAMS_PUREC_SCALAR_SP -1 float int32_t purec cinz_) 244command_arguments(ALIAS_PARAMS_PURECFMA_SCALAR_DP 1 double int32_t purecfma finz_) 245command_arguments(ALIAS_PARAMS_PURECFMA_SCALAR_SP -1 float int32_t purecfma finz_) 246 247set(TESTER3_DEFINITIONS_PUREC_SCALAR ATR=cinz_ DPTYPE=double SPTYPE=float DPTYPESPEC=d1 SPTYPESPEC=f1 EXTSPEC=purec) 248set(TESTER3_DEFINITIONS_PURECFMA_SCALAR ATR=finz_ DPTYPE=double SPTYPE=float DPTYPESPEC=d1 SPTYPESPEC=f1 EXTSPEC=purecfma) 249set(COMPILER_SUPPORTS_PUREC_SCALAR 1) 250set(COMPILER_SUPPORTS_PURECFMA_SCALAR 1) 251 252# MKRename arguments per type 253command_arguments(RENAME_PARAMS_SSE2 cinz_ 2 4 sse2) 254command_arguments(RENAME_PARAMS_SSE4 cinz_ 2 4 sse4) 255command_arguments(RENAME_PARAMS_AVX cinz_ 4 8 avx) 256command_arguments(RENAME_PARAMS_FMA4 finz_ 4 8 fma4) 257command_arguments(RENAME_PARAMS_AVX2 finz_ 4 8 avx2) 258command_arguments(RENAME_PARAMS_AVX2128 finz_ 2 4 avx2128) 259command_arguments(RENAME_PARAMS_AVX512F finz_ 8 16 avx512f) 260command_arguments(RENAME_PARAMS_AVX512FNOFMA cinz_ 8 16 avx512fnofma) 261command_arguments(RENAME_PARAMS_ADVSIMD finz_ 2 4 advsimd) 262command_arguments(RENAME_PARAMS_ADVSIMDNOFMA cinz_ 2 4 advsimdnofma) 263command_arguments(RENAME_PARAMS_NEON32 cinz_ 2 4 neon) 264command_arguments(RENAME_PARAMS_NEON32VFPV4 finz_ 2 4 neonvfpv4) 265command_arguments(RENAME_PARAMS_VSX finz_ 2 4 vsx) 266command_arguments(RENAME_PARAMS_VSXNOFMA cinz_ 2 4 vsxnofma) 267command_arguments(RENAME_PARAMS_ZVECTOR2 finz_ 2 4 zvector2) 268command_arguments(RENAME_PARAMS_ZVECTOR2NOFMA cinz_ 2 4 zvector2nofma) 269command_arguments(RENAME_PARAMS_PUREC_SCALAR cinz_ 1 1 purec) 270command_arguments(RENAME_PARAMS_PURECFMA_SCALAR finz_ 1 1 purecfma) 271# The vector length parameters in SVE, for SP and DP, are chosen for 272# the smallest SVE vector size (128-bit). The name is generated using 273# the "x" token of VLA SVE vector functions. 274command_arguments(RENAME_PARAMS_SVE finz_ x x sve) 275command_arguments(RENAME_PARAMS_SVENOFMA cinz_ x x svenofma) 276 277command_arguments(RENAME_PARAMS_GNUABI_SSE2 sse2 b 2 4 _mm128d _mm128 _mm128i _mm128i __SSE2__) 278command_arguments(RENAME_PARAMS_GNUABI_AVX avx c 4 8 __m256d __m256 __m128i "struct { __m128i x, y$<SEMICOLON> }" __AVX__) 279command_arguments(RENAME_PARAMS_GNUABI_AVX2 avx2 d 4 8 __m256d __m256 __m128i __m256i __AVX2__) 280command_arguments(RENAME_PARAMS_GNUABI_AVX512F avx512f e 8 16 __m512d __m512 __m256i __m512i __AVX512F__) 281command_arguments(RENAME_PARAMS_GNUABI_ADVSIMD advsimd n 2 4 float64x2_t float32x4_t int32x2_t int32x4_t __ARM_NEON) 282# The vector length parameters in SVE, for SP and DP, are chosen for 283# the smallest SVE vector size (128-bit). The name is generated using 284# the "x" token of VLA SVE vector functions. 285command_arguments(RENAME_PARAMS_GNUABI_SVE sve s x x svfloat64_t svfloat32_t svint32_t svint32_t __ARM_SVE) 286 287command_arguments(MKMASKED_PARAMS_GNUABI_AVX512F_dp avx512f e 8) 288command_arguments(MKMASKED_PARAMS_GNUABI_AVX512F_sp avx512f e -16) 289 290command_arguments(MKMASKED_PARAMS_GNUABI_SVE_dp sve s 2) 291command_arguments(MKMASKED_PARAMS_GNUABI_SVE_sp sve s -4) 292 293# COMPILER DETECTION 294 295# Detect CLANG executable path (on both Windows and Linux/OSX) 296if(NOT CLANG_EXE_PATH) 297 # If the current compiler used by CMAKE is already clang, use this one directly 298 if(CMAKE_C_COMPILER MATCHES "clang") 299 set(CLANG_EXE_PATH ${CMAKE_C_COMPILER}) 300 else() 301 # Else we may find clang on the path? 302 find_program(CLANG_EXE_PATH NAMES clang "clang-5.0" "clang-4.0" "clang-3.9") 303 endif() 304endif() 305 306# Allow to define the Gcc/Clang here 307# As we might compile the lib with MSVC, but generates bitcode with CLANG 308# Intel vector extensions. 309set(CLANG_FLAGS_ENABLE_SSE2 "-msse2") 310set(CLANG_FLAGS_ENABLE_SSE4 "-msse4.1") 311set(CLANG_FLAGS_ENABLE_AVX "-mavx") 312set(CLANG_FLAGS_ENABLE_FMA4 "-mfma4") 313set(CLANG_FLAGS_ENABLE_AVX2 "-mavx2;-mfma") 314set(CLANG_FLAGS_ENABLE_AVX2128 "-mavx2;-mfma") 315set(CLANG_FLAGS_ENABLE_AVX512F "-mavx512f") 316set(CLANG_FLAGS_ENABLE_AVX512FNOFMA "-mavx512f") 317set(CLANG_FLAGS_ENABLE_NEON32 "--target=arm-linux-gnueabihf;-mcpu=cortex-a8") 318set(CLANG_FLAGS_ENABLE_NEON32VFPV4 "-march=armv7-a;-mfpu=neon-vfpv4") 319# Arm AArch64 vector extensions. 320set(CLANG_FLAGS_ENABLE_SVE "-march=armv8-a+sve") 321set(CLANG_FLAGS_ENABLE_SVENOFMA "-march=armv8-a+sve") 322# PPC64 323set(CLANG_FLAGS_ENABLE_VSX "-mcpu=power8") 324set(CLANG_FLAGS_ENABLE_VSXNOFMA "-mcpu=power8") 325# IBM z 326set(CLANG_FLAGS_ENABLE_ZVECTOR2 "-march=z14;-mzvector") 327set(CLANG_FLAGS_ENABLE_ZVECTOR2NOFMA "-march=z14;-mzvector") 328 329set(FLAGS_OTHERS "") 330 331# All variables storing compiler flags should be prefixed with FLAGS_ 332if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") 333 # Always compile sleef with -ffp-contract. 334 set(FLAGS_STRICTMATH "-ffp-contract=off") 335 set(FLAGS_FASTMATH "-ffast-math") 336 337 # Without the options below, gcc generates calls to libm 338 string(CONCAT FLAGS_OTHERS "-fno-math-errno -fno-trapping-math") 339 340 # Intel vector extensions. 341 foreach(SIMD ${SLEEF_SUPPORTED_EXTENSIONS}) 342 set(FLAGS_ENABLE_${SIMD} ${CLANG_FLAGS_ENABLE_${SIMD}}) 343 endforeach() 344 345 # Warning flags. 346 set(FLAGS_WALL "-Wall -Wno-unused -Wno-attributes -Wno-unused-result") 347 if(CMAKE_C_COMPILER_ID MATCHES "GNU") 348 # The following compiler option is needed to suppress the warning 349 # "AVX vector return without AVX enabled changes the ABI" at 350 # src/arch/helpervecext.h:88 351 string(CONCAT FLAGS_WALL ${FLAGS_WALL} " -Wno-psabi") 352 set(FLAGS_ENABLE_NEON32 "-mfpu=neon") 353 endif(CMAKE_C_COMPILER_ID MATCHES "GNU") 354 355 if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND ENABLE_LTO) 356 if (NOT LLVM_AR_COMMAND) 357 find_program(LLVM_AR_COMMAND "llvm-ar") 358 endif() 359 if (LLVM_AR_COMMAND) 360 SET(CMAKE_AR ${LLVM_AR_COMMAND}) 361 SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> rcs <TARGET> <LINK_FLAGS> <OBJECTS>") 362 SET(CMAKE_C_ARCHIVE_FINISH "true") 363 endif(LLVM_AR_COMMAND) 364 string(CONCAT FLAGS_OTHERS "-flto=thin") 365 endif(CMAKE_C_COMPILER_ID MATCHES "Clang" AND ENABLE_LTO) 366 367 # Flags for generating inline headers 368 set(FLAG_PREPROCESS "-E") 369 set(FLAG_PRESERVE_COMMENTS "-C") 370 set(FLAG_INCLUDE "-I") 371 set(FLAG_DEFINE "-D") 372 373 if (SLEEF_CLANG_ON_WINDOWS) 374 # The following line is required to prevent clang from displaying 375 # many warnings. Clang on Windows references MSVC header files, 376 # which have deprecation and security attributes for many 377 # functions. 378 379 string(CONCAT FLAGS_WALL ${FLAGS_WALL} " -D_CRT_SECURE_NO_WARNINGS -Wno-deprecated-declarations") 380 endif() 381elseif(MSVC) 382 # Intel vector extensions. 383 if (CMAKE_CL_64) 384 set(FLAGS_ENABLE_SSE2 /D__SSE2__) 385 set(FLAGS_ENABLE_SSE4 /D__SSE2__ /D__SSE3__ /D__SSE4_1__) 386 else() 387 set(FLAGS_ENABLE_SSE2 /D__SSE2__ /arch:SSE2) 388 set(FLAGS_ENABLE_SSE4 /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /arch:SSE2) 389 endif() 390 set(FLAGS_ENABLE_AVX /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /arch:AVX) 391 set(FLAGS_ENABLE_FMA4 /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /D__FMA4__ /arch:AVX2) 392 set(FLAGS_ENABLE_AVX2 /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /arch:AVX2) 393 set(FLAGS_ENABLE_AVX2128 /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /arch:AVX2) 394 set(FLAGS_ENABLE_AVX512F /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /D__AVX512F__ /arch:AVX2) 395 set(FLAGS_ENABLE_AVX512FNOFMA /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /D__AVX512F__ /arch:AVX2) 396 set(FLAGS_ENABLE_PURECFMA_SCALAR /D__SSE2__ /D__SSE3__ /D__SSE4_1__ /D__AVX__ /D__AVX2__ /arch:AVX2) 397 set(FLAGS_WALL "/D_CRT_SECURE_NO_WARNINGS") 398 399 set(FLAGS_NO_ERRNO "") 400 401 set(FLAG_PREPROCESS "/E") 402 set(FLAG_PRESERVE_COMMENTS "/C") 403 set(FLAG_INCLUDE "/I") 404 set(FLAG_DEFINE "/D") 405elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") 406 set(FLAGS_ENABLE_SSE2 "-msse2") 407 set(FLAGS_ENABLE_SSE4 "-msse4.1") 408 set(FLAGS_ENABLE_AVX "-mavx") 409 set(FLAGS_ENABLE_AVX2 "-march=core-avx2") 410 set(FLAGS_ENABLE_AVX2128 "-march=core-avx2") 411 set(FLAGS_ENABLE_AVX512F "-xCOMMON-AVX512") 412 set(FLAGS_ENABLE_AVX512FNOFMA "-xCOMMON-AVX512") 413 set(FLAGS_ENABLE_PURECFMA_SCALAR "-march=core-avx2") 414 set(FLAGS_ENABLE_FMA4 "-msse2") # This is a dummy flag 415 set(FLAGS_STRICTMATH "-fp-model strict -Qoption,cpp,--extended_float_type") 416 set(FLAGS_FASTMATH "-fp-model fast=2 -Qoption,cpp,--extended_float_type") 417 set(FLAGS_WALL "-fmax-errors=3 -Wall -Wno-unused -Wno-attributes") 418 419 set(FLAGS_NO_ERRNO "") 420 421 set(FLAG_PREPROCESS "-E") 422 set(FLAG_PRESERVE_COMMENTS "-C") 423 set(FLAG_INCLUDE "-I") 424 set(FLAG_DEFINE "-D") 425endif() 426 427set(SLEEF_C_FLAGS "${FLAGS_WALL} ${FLAGS_STRICTMATH} ${FLAGS_OTHERS}") 428if(CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER 6.99) 429 set(DFT_C_FLAGS "${FLAGS_WALL} ${FLAGS_OTHERS}") 430else() 431 set(DFT_C_FLAGS "${FLAGS_WALL} ${FLAGS_FASTMATH} ${FLAGS_OTHERS}") 432endif() 433 434if (CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$" AND CMAKE_C_COMPILER_ID MATCHES "GNU") 435 set(SLEEF_C_FLAGS "${SLEEF_C_FLAGS} -msse2 -mfpmath=sse") 436 set(DFT_C_FLAGS "${DFT_C_FLAGS} -msse2 -mfpmath=sse -m128bit-long-double") 437elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$" AND CMAKE_C_COMPILER_ID MATCHES "Clang") 438 set(SLEEF_C_FLAGS "${SLEEF_C_FLAGS} -msse2 -mfpmath=sse") 439 set(DFT_C_FLAGS "${DFT_C_FLAGS} -msse2 -mfpmath=sse") 440endif() 441 442if(CYGWIN OR MINGW) 443 set(SLEEF_C_FLAGS "${SLEEF_C_FLAGS} -fno-asynchronous-unwind-tables") 444 set(DFT_C_FLAGS "${DFT_C_FLAGS} -fno-asynchronous-unwind-tables") 445endif() 446 447if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER 9.3 AND CMAKE_C_COMPILER_VERSION VERSION_LESS 10.2) 448 set(SLEEF_C_FLAGS "${SLEEF_C_FLAGS} -fno-shrink-wrap -fno-tree-vrp") 449 set(DFT_C_FLAGS "${DFT_C_FLAGS} -fno-shrink-wrap -fno-tree-vrp") 450endif() 451 452# FEATURE DETECTION 453 454# Long double 455 456option(DISABLE_LONG_DOUBLE "Disable long double" OFF) 457option(ENFORCE_LONG_DOUBLE "Build fails if long double is not supported by the compiler" OFF) 458 459if(NOT DISABLE_LONG_DOUBLE) 460 CHECK_TYPE_SIZE("long double" LD_SIZE) 461 if(LD_SIZE GREATER "9") 462 # This is needed to check since internal compiler error occurs with gcc 4.x 463 CHECK_C_SOURCE_COMPILES(" 464 typedef long double vlongdouble __attribute__((vector_size(sizeof(long double)*2))); 465 vlongdouble vcast_vl_l(long double d) { return (vlongdouble) { d, d }; } 466 int main() { vlongdouble vld = vcast_vl_l(0); 467 }" COMPILER_SUPPORTS_LONG_DOUBLE) 468 endif() 469else() 470 message(STATUS "Support for long double disabled by CMake option") 471endif() 472 473if (ENFORCE_LONG_DOUBLE AND NOT COMPILER_SUPPORTS_LONG_DOUBLE) 474 message(FATAL_ERROR "ENFORCE_LONG_DOUBLE is specified and that feature is disabled or not supported by the compiler") 475endif() 476 477# float128 478 479option(DISABLE_FLOAT128 "Disable float128" OFF) 480option(ENFORCE_FLOAT128 "Build fails if float128 is not supported by the compiler" OFF) 481 482if(NOT DISABLE_FLOAT128) 483 CHECK_C_SOURCE_COMPILES(" 484 int main() { __float128 r = 1; 485 }" COMPILER_SUPPORTS_FLOAT128) 486else() 487 message(STATUS "Support for float128 disabled by CMake option") 488endif() 489 490if (ENFORCE_FLOAT128 AND NOT COMPILER_SUPPORTS_FLOAT128) 491 message(FATAL_ERROR "ENFORCE_FLOAT128 is specified and that feature is disabled or not supported by the compiler") 492endif() 493 494# SSE2 495 496option(DISABLE_SSE2 "Disable SSE2" OFF) 497option(ENFORCE_SSE2 "Build fails if SSE2 is not supported by the compiler" OFF) 498 499if(SLEEF_ARCH_X86 AND NOT DISABLE_SSE2) 500 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_SSE2}) 501 CHECK_C_SOURCE_COMPILES(" 502 #if defined(_MSC_VER) 503 #include <intrin.h> 504 #else 505 #include <x86intrin.h> 506 #endif 507 int main() { 508 __m128d r = _mm_mul_pd(_mm_set1_pd(1), _mm_set1_pd(2)); }" 509 COMPILER_SUPPORTS_SSE2) 510endif() 511 512if (ENFORCE_SSE2 AND NOT COMPILER_SUPPORTS_SSE2) 513 message(FATAL_ERROR "ENFORCE_SSE2 is specified and that feature is disabled or not supported by the compiler") 514endif() 515 516# SSE 4.1 517 518option(DISABLE_SSE4 "Disable SSE4" OFF) 519option(ENFORCE_SSE4 "Build fails if SSE4 is not supported by the compiler" OFF) 520 521if(SLEEF_ARCH_X86 AND NOT DISABLE_SSE4) 522 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_SSE4}) 523 CHECK_C_SOURCE_COMPILES(" 524 #if defined(_MSC_VER) 525 #include <intrin.h> 526 #else 527 #include <x86intrin.h> 528 #endif 529 int main() { 530 __m128d r = _mm_floor_sd(_mm_set1_pd(1), _mm_set1_pd(2)); }" 531 COMPILER_SUPPORTS_SSE4) 532endif() 533 534if (ENFORCE_SSE4 AND NOT COMPILER_SUPPORTS_SSE4) 535 message(FATAL_ERROR "ENFORCE_SSE4 is specified and that feature is disabled or not supported by the compiler") 536endif() 537 538# AVX 539 540option(ENFORCE_AVX "Disable AVX" OFF) 541option(ENFORCE_AVX "Build fails if AVX is not supported by the compiler" OFF) 542 543if(SLEEF_ARCH_X86 AND NOT DISABLE_AVX) 544 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_AVX}) 545 CHECK_C_SOURCE_COMPILES(" 546 #if defined(_MSC_VER) 547 #include <intrin.h> 548 #else 549 #include <x86intrin.h> 550 #endif 551 int main() { 552 __m256d r = _mm256_add_pd(_mm256_set1_pd(1), _mm256_set1_pd(2)); 553 }" COMPILER_SUPPORTS_AVX) 554endif() 555 556if (ENFORCE_AVX AND NOT COMPILER_SUPPORTS_AVX) 557 message(FATAL_ERROR "ENFORCE_AVX is specified and that feature is disabled or not supported by the compiler") 558endif() 559 560# FMA4 561 562option(DISABLE_FMA4 "Disable FMA4" OFF) 563option(ENFORCE_FMA4 "Build fails if FMA4 is not supported by the compiler" OFF) 564 565if(SLEEF_ARCH_X86 AND NOT DISABLE_FMA4) 566 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_FMA4}) 567 CHECK_C_SOURCE_COMPILES(" 568 #if defined(_MSC_VER) 569 #include <intrin.h> 570 #else 571 #include <x86intrin.h> 572 #endif 573 int main() { 574 __m256d r = _mm256_macc_pd(_mm256_set1_pd(1), _mm256_set1_pd(2), _mm256_set1_pd(3)); }" 575 COMPILER_SUPPORTS_FMA4) 576endif() 577 578if (ENFORCE_FMA4 AND NOT COMPILER_SUPPORTS_FMA4) 579 message(FATAL_ERROR "ENFORCE_FMA4 is specified and that feature is disabled or not supported by the compiler") 580endif() 581 582# AVX2 583 584option(DISABLE_AVX2 "Disable AVX2" OFF) 585option(ENFORCE_AVX2 "Build fails if AVX2 is not supported by the compiler" OFF) 586 587if(SLEEF_ARCH_X86 AND NOT DISABLE_AVX2) 588 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_AVX2}) 589 CHECK_C_SOURCE_COMPILES(" 590 #if defined(_MSC_VER) 591 #include <intrin.h> 592 #else 593 #include <x86intrin.h> 594 #endif 595 int main() { 596 __m256i r = _mm256_abs_epi32(_mm256_set1_epi32(1)); }" 597 COMPILER_SUPPORTS_AVX2) 598 599 # AVX2 implies AVX2128 600 if(COMPILER_SUPPORTS_AVX2) 601 set(COMPILER_SUPPORTS_AVX2128 1) 602 endif() 603endif() 604 605if (ENFORCE_AVX2 AND NOT COMPILER_SUPPORTS_AVX2) 606 message(FATAL_ERROR "ENFORCE_AVX2 is specified and that feature is disabled or not supported by the compiler") 607endif() 608 609# AVX512F 610 611option(DISABLE_AVX512F "Disable AVX512F" OFF) 612option(ENFORCE_AVX512F "Build fails if AVX512F is not supported by the compiler" OFF) 613 614if(SLEEF_ARCH_X86 AND NOT DISABLE_AVX512F) 615 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_AVX512F}) 616 CHECK_C_SOURCE_COMPILES(" 617 #if defined(_MSC_VER) 618 #include <intrin.h> 619 #else 620 #include <x86intrin.h> 621 #endif 622 __m512 addConstant(__m512 arg) { 623 return _mm512_add_ps(arg, _mm512_set1_ps(1.f)); 624 } 625 int main() { 626 __m512i a = _mm512_set1_epi32(1); 627 __m256i ymm = _mm512_extracti64x4_epi64(a, 0); 628 __mmask16 m = _mm512_cmp_epi32_mask(a, a, _MM_CMPINT_EQ); 629 __m512i r = _mm512_andnot_si512(a, a); }" 630 COMPILER_SUPPORTS_AVX512F) 631 632 if (COMPILER_SUPPORTS_AVX512F) 633 set(COMPILER_SUPPORTS_AVX512FNOFMA 1) 634 endif() 635endif() 636 637if (ENFORCE_AVX512F AND NOT COMPILER_SUPPORTS_AVX512F) 638 message(FATAL_ERROR "ENFORCE_AVX512F is specified and that feature is disabled or not supported by the compiler") 639endif() 640 641# SVE 642 643option(DISABLE_SVE "Disable SVE" OFF) 644option(ENFORCE_SVE "Build fails if SVE is not supported by the compiler" OFF) 645 646if(SLEEF_ARCH_AARCH64 AND NOT DISABLE_SVE) 647 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_SVE}) 648 CHECK_C_SOURCE_COMPILES(" 649 #include <arm_sve.h> 650 int main() { 651 svint32_t r = svdup_n_s32(1); }" 652 COMPILER_SUPPORTS_SVE) 653 654 if(COMPILER_SUPPORTS_SVE) 655 set(COMPILER_SUPPORTS_SVENOFMA 1) 656 endif() 657endif() 658 659if (ENFORCE_SVE AND NOT COMPILER_SUPPORTS_SVE) 660 message(FATAL_ERROR "ENFORCE_SVE is specified and that feature is disabled or not supported by the compiler") 661endif() 662 663# VSX 664 665option(DISABLE_VSX "Disable VSX" OFF) 666option(ENFORCE_VSX "Build fails if VSX is not supported by the compiler" OFF) 667 668if(SLEEF_ARCH_PPC64 AND NOT DISABLE_VSX) 669 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS ${FLAGS_ENABLE_VSX}) 670 CHECK_C_SOURCE_COMPILES(" 671 #include <altivec.h> 672 #ifndef __LITTLE_ENDIAN__ 673 #error \"Only VSX(ISA2.07) little-endian mode is supported \" 674 #endif 675 int main() { 676 vector double d; 677 vector unsigned char p = { 678 4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11 679 }; 680 d = vec_perm(d, d, p); 681 }" 682 COMPILER_SUPPORTS_VSX) 683 684 if (COMPILER_SUPPORTS_VSX) 685 set(COMPILER_SUPPORTS_VSXNOFMA 1) 686 endif() 687endif() 688 689if (ENFORCE_VSX AND NOT COMPILER_SUPPORTS_VSX) 690 message(FATAL_ERROR "ENFORCE_VSX is specified and that feature is disabled or not supported by the compiler") 691endif() 692 693# IBM Z 694 695option(DISABLE_ZVECTOR2 "Disable ZVECTOR2" OFF) 696option(ENFORCE_ZVECTOR2 "Build fails if ZVECTOR2 is not supported by the compiler" OFF) 697 698if(SLEEF_ARCH_S390X AND NOT DISABLE_ZVECTOR2) 699 string (REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${FLAGS_ENABLE_ZVECTOR2}") 700 CHECK_C_SOURCE_COMPILES(" 701 #include <vecintrin.h> 702 int main() { 703 __vector float d; 704 d = vec_sqrt(d); 705 }" 706 COMPILER_SUPPORTS_ZVECTOR2) 707 708 if(COMPILER_SUPPORTS_ZVECTOR2) 709 set(COMPILER_SUPPORTS_ZVECTOR2NOFMA 1) 710 endif() 711endif() 712 713if (ENFORCE_ZVECTOR2 AND NOT COMPILER_SUPPORTS_ZVECTOR2) 714 message(FATAL_ERROR "ENFORCE_ZVECTOR2 is specified and that feature is disabled or not supported by the compiler") 715endif() 716 717# OpenMP 718 719option(DISABLE_OPENMP "Disable OPENMP" OFF) 720option(ENFORCE_OPENMP "Build fails if OPENMP is not supported by the compiler" OFF) 721 722if(NOT DISABLE_OPENMP) 723 find_package(OpenMP) 724 # Check if compilation with OpenMP really succeeds 725 # It does not succeed on Travis even though find_package(OpenMP) succeeds. 726 if(OPENMP_FOUND) 727 set (CMAKE_REQUIRED_FLAGS "${OpenMP_C_FLAGS}") 728 CHECK_C_SOURCE_COMPILES(" 729 #include <stdio.h> 730 int main() { 731 int i; 732 #pragma omp parallel for 733 for(i=0;i < 10;i++) { putchar(0); } 734 }" 735 COMPILER_SUPPORTS_OPENMP) 736 endif(OPENMP_FOUND) 737else() 738 message(STATUS "Support for OpenMP disabled by CMake option") 739endif() 740 741if (ENFORCE_OPENMP AND NOT COMPILER_SUPPORTS_OPENMP) 742 message(FATAL_ERROR "ENFORCE_OPENMP is specified and that feature is disabled or not supported by the compiler") 743endif() 744 745# Weak aliases 746 747CHECK_C_SOURCE_COMPILES(" 748#if defined(__CYGWIN__) 749#define EXPORT __stdcall __declspec(dllexport) 750#else 751#define EXPORT 752#endif 753 EXPORT int f(int a) { 754 return a + 2; 755 } 756 EXPORT int g(int a) __attribute__((weak, alias(\"f\"))); 757 int main(void) { 758 return g(2); 759 }" 760 COMPILER_SUPPORTS_WEAK_ALIASES) 761if (COMPILER_SUPPORTS_WEAK_ALIASES AND 762 NOT CMAKE_SYSTEM_PROCESSOR MATCHES "arm" AND 763 NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND 764 NOT SLEEF_CLANG_ON_WINDOWS AND 765 NOT MINGW AND BUILD_GNUABI_LIBS) 766 set(ENABLE_GNUABI ${COMPILER_SUPPORTS_WEAK_ALIASES}) 767endif() 768 769# Built-in math functions 770 771CHECK_C_SOURCE_COMPILES(" 772 int main(void) { 773 double a = __builtin_sqrt (2); 774 float b = __builtin_sqrtf(2); 775 }" 776 COMPILER_SUPPORTS_BUILTIN_MATH) 777 778# SYS_getrandom 779 780CHECK_C_SOURCE_COMPILES(" 781#define _GNU_SOURCE 782#include <unistd.h> 783#include <sys/syscall.h> 784#include <linux/random.h> 785 int main(void) { 786 int i; 787 syscall(SYS_getrandom, &i, sizeof(i), 0); 788 }" 789 COMPILER_SUPPORTS_SYS_GETRANDOM) 790 791# 792 793# Reset used flags 794set(CMAKE_REQUIRED_FLAGS) 795set(CMAKE_REQUIRED_LIBRARIES) 796 797# Save the default C flags 798set(ORG_CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) 799 800## 801 802# Check if sde64 command is available 803 804find_program(SDE_COMMAND sde64) 805if (NOT SDE_COMMAND) 806 find_program(SDE_COMMAND sde) 807endif() 808 809# Check if armie command is available 810 811find_program(ARMIE_COMMAND armie) 812if (NOT SVE_VECTOR_BITS) 813 set(SVE_VECTOR_BITS 128) 814endif() 815 816# 817 818find_program(SED_COMMAND sed) 819 820## 821 822if(SLEEF_SHOW_ERROR_LOG) 823 if (EXISTS ${PROJECT_BINARY_DIR}/CMakeFiles/CMakeError.log) 824 file(READ ${PROJECT_BINARY_DIR}/CMakeFiles/CMakeError.log FILE_CONTENT) 825 message("") 826 message("===== Content of CMakeError.log =====") 827 message("") 828 message("${FILE_CONTENT}") 829 message("") 830 message("=======================================") 831 message("") 832 endif() 833endif(SLEEF_SHOW_ERROR_LOG) 834 835if (RUNNING_ON_TRAVIS AND CMAKE_C_COMPILER_ID MATCHES "Clang") 836 message(STATUS "Travis bug workaround turned on") 837 set(COMPILER_SUPPORTS_OPENMP FALSE) # Workaround for https://github.com/travis-ci/travis-ci/issues/8613 838 set(COMPILER_SUPPORTS_FLOAT128 FALSE) # Compilation on unroll_0_vecextqp.c does not finish on Travis 839endif() 840 841if (MSVC OR SLEEF_CLANG_ON_WINDOWS) 842 set(COMPILER_SUPPORTS_OPENMP FALSE) # At this time, OpenMP is not supported on MSVC 843endif() 844 845## 846 847# Set common definitions 848 849if (NOT BUILD_SHARED_LIBS) 850 set(COMMON_TARGET_DEFINITIONS SLEEF_STATIC_LIBS=1) 851 set(SLEEF_STATIC_LIBS 1) 852endif() 853 854if (COMPILER_SUPPORTS_WEAK_ALIASES) 855 set(COMMON_TARGET_DEFINITIONS ${COMMON_TARGET_DEFINITIONS} ENABLE_ALIAS=1) 856endif() 857 858if (COMPILER_SUPPORTS_SYS_GETRANDOM) 859 set(COMMON_TARGET_DEFINITIONS ${COMMON_TARGET_DEFINITIONS} ENABLE_SYS_getrandom=1) 860endif() 861