string(REGEX REPLACE "-O[^ ]*" "" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}")
endforeach ()
- if (CMAKE_COMPILER_IS_GNUCC)
+ if (ARCH_IA32 OR ARCH_X86_64 AND CMAKE_COMPILER_IS_GNUCC)
message(STATUS "gcc version ${CMAKE_C_COMPILER_VERSION}")
# If gcc doesn't recognise the host cpu, then mtune=native becomes
# generic, which isn't very good in some cases. march=native looks at
endif()
CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
-CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H)
-CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H)
-CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H)
-CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H)
+if (ARCH_IA32 OR ARCH_X86_64)
+ CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H)
+ CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H)
+ CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H)
+ CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H)
+elseif (ARCH_ARM32 OR ARCH_AARCH64)
+ CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H)
+endif()
CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN)
CHECK_FUNCTION_EXISTS(_aligned_malloc HAVE__ALIGNED_MALLOC)
set (INTRIN_INC_H "x86intrin.h")
elseif (HAVE_C_INTRIN_H)
set (INTRIN_INC_H "intrin.h")
-else ()
+elseif (HAVE_C_ARM_NEON_H)
+ set (INTRIN_INC_H "arm_neon.h")
+ set (FAT_RUNTIME OFF)
+else()
message (FATAL_ERROR "No intrinsics header found")
endif ()
set (CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${ARCH_C_FLAGS}")
endif ()
-# ensure we have the minimum of SSSE3 - call a SSSE3 intrinsic
-CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+if (ARCH_IA32 OR ARCH_X86_64)
+ # ensure we have the minimum of SSSE3 - call a SSSE3 intrinsic
+ CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
int main() {
__m128i a = _mm_set1_epi8(1);
(void)_mm_shuffle_epi8(a, a);
}" HAVE_SSSE3)
-# now look for AVX2
-CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+ # now look for AVX2
+ CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX2__)
#error no avx2
#endif
(void)_mm256_xor_si256(z, z);
}" HAVE_AVX2)
-# and now for AVX512
-CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+ # and now for AVX512
+ CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX512BW__)
#error no avx512bw
#endif
(void)_mm512_abs_epi8(z);
}" HAVE_AVX512)
-# and now for AVX512VBMI
-CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+ # and now for AVX512VBMI
+ CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
#if !defined(__AVX512VBMI__)
#error no avx512vbmi
#endif
(void)_mm512_permutexvar_epi8(idx, a);
}" HAVE_AVX512VBMI)
+elseif (ARCH_ARM32 OR ARCH_AARCH64)
+ CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+int main() {
+ int32x4_t a = vdupq_n_s32(1);
+}" HAVE_NEON)
+else ()
+ message (FATAL_ERROR "Unsupported architecture")
+endif ()
+
if (FAT_RUNTIME)
- if (NOT HAVE_SSSE3)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSSE3)
message(FATAL_ERROR "SSSE3 support required to build fat runtime")
endif ()
- if (NOT HAVE_AVX2)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX2)
message(FATAL_ERROR "AVX2 support required to build fat runtime")
endif ()
- if (BUILD_AVX512 AND NOT HAVE_AVX512)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512)
message(FATAL_ERROR "AVX512 support requested but not supported")
endif ()
else (NOT FAT_RUNTIME)
- if (NOT HAVE_AVX2)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX2)
message(STATUS "Building without AVX2 support")
endif ()
- if (NOT HAVE_AVX512)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_AVX512)
message(STATUS "Building without AVX512 support")
endif ()
- if (NOT HAVE_SSSE3)
+ if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSSE3)
message(FATAL_ERROR "A minimum of SSSE3 compiler support is required")
endif ()
+ if ((ARCH_ARM32 OR ARCH_AARCH64) AND NOT HAVE_NEON)
+ message(FATAL_ERROR "NEON support required for ARM support")
+ endif ()
endif ()
unset (CMAKE_REQUIRED_FLAGS)
/* "Define if building for EM64T" */
#cmakedefine ARCH_X86_64
+/* "Define if building for ARM32" */
+#cmakedefine ARCH_ARM32
+
+/* "Define if building for AARCH64" */
+#cmakedefine ARCH_AARCH64
+
/* internal build, switch on dump support. */
#cmakedefine DUMP_SUPPORT
/* C compiler has intrin.h */
#cmakedefine HAVE_C_INTRIN_H
+/* C compiler has arm_neon.h */
+#cmakedefine HAVE_C_ARM_NEON_H
+
/* Define to 1 if you have the declaration of `pthread_setaffinity_np', and to
0 if you don't. */
#cmakedefine HAVE_DECL_PTHREAD_SETAFFINITY_NP