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