From af029d383a24ee454e1124f64f3427d5b79e5f7e Mon Sep 17 00:00:00 2001 From: Michael Jones Date: Fri, 11 Nov 2022 14:08:58 -0800 Subject: [PATCH] [libc][reland] Fix builtin definition for memory functions The memory functions are highly performance sensitive and use builtins where possible, but also need to define those functions names when they don't exist to avoid compilation errors. Previously all those redefinitions were behind the SSE2 flag for x86, which caused errors on CPUs that supported SSE2 but not AVX512. This patch splits the various CPU extensions out to avoid errors on such CPUs. Reviewed By: gchatelet Differential Revision: https://reviews.llvm.org/D138163 --- libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake | 2 +- libc/src/string/CMakeLists.txt | 4 ++-- libc/src/string/memory_utils/op_x86.h | 17 ++++++++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake index 358d074..fdd477c 100644 --- a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake +++ b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake @@ -6,7 +6,7 @@ set(ALL_CPU_FEATURES "") if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) - set(ALL_CPU_FEATURES SSE2 SSE4_2 AVX2 AVX512F FMA) + set(ALL_CPU_FEATURES SSE2 SSE4_2 AVX2 AVX512F AVX512BW FMA) set(LIBC_COMPILE_OPTIONS_NATIVE -march=native) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) set(LIBC_COMPILE_OPTIONS_NATIVE -mcpu=native) diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt index e300a03..9e8287f 100644 --- a/libc/src/string/CMakeLists.txt +++ b/libc/src/string/CMakeLists.txt @@ -355,7 +355,7 @@ if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_bcmp(bcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_bcmp(bcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_bcmp(bcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) - add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) + add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW) add_bcmp(bcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_bcmp(bcmp) else() @@ -409,7 +409,7 @@ if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_memcmp(memcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_memcmp(memcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_memcmp(memcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) - add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) + add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW) add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcmp(memcmp) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) diff --git a/libc/src/string/memory_utils/op_x86.h b/libc/src/string/memory_utils/op_x86.h index 8e64322..d2bf0e4 100644 --- a/libc/src/string/memory_utils/op_x86.h +++ b/libc/src/string/memory_utils/op_x86.h @@ -20,15 +20,22 @@ #include "src/string/memory_utils/op_builtin.h" #include "src/string/memory_utils/op_generic.h" -#ifdef __SSE2__ +#if defined(__AVX512BW__) || defined(__AVX512F__) || defined(__AVX2__) || \ + defined(__SSE2__) #include -#else +#endif + // Define fake functions to prevent the compiler from failing on undefined -// functions in case SSE2 is not present. +// functions in case the CPU extension is not present. +#if !defined(__AVX512BW__) && (defined(_MSC_VER) || defined(__SCE__)) #define _mm512_cmpneq_epi8_mask(A, B) 0 -#define _mm_movemask_epi8(A) 0 +#endif +#if !defined(__AVX2__) && (defined(_MSC_VER) || defined(__SCE__)) #define _mm256_movemask_epi8(A) 0 -#endif // __SSE2__ +#endif +#if !defined(__SSE2__) && (defined(_MSC_VER) || defined(__SCE__)) +#define _mm_movemask_epi8(A) 0 +#endif namespace __llvm_libc::x86 { -- 2.7.4