From f6b18f9bb148bf09c3819b02d9b247fac3d4f399 Mon Sep 17 00:00:00 2001 From: hsy <1097201863@qq.com> Date: Fri, 16 May 2025 15:09:09 +0800 Subject: [PATCH] Add SSE4.2 compiler check --- src/crc32c.cc | 6 ++++-- src/crc32c_benchmark.cc | 12 ++++++------ src/crc32c_sse42.cc | 6 ++++-- src/crc32c_sse42.h | 6 ++++-- src/crc32c_sse42_check.h | 6 ++++-- src/crc32c_sse42_unittest.cc | 10 ++++++---- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/crc32c.cc b/src/crc32c.cc index 804133b..a5c8645 100644 --- a/src/crc32c.cc +++ b/src/crc32c.cc @@ -16,13 +16,15 @@ namespace crc32c { uint32_t Extend(uint32_t crc, const uint8_t* data, size_t count) { -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) static bool can_use_sse42 = CanUseSse42(); if (can_use_sse42) return ExtendSse42(crc, data, count); #elif HAVE_ARM64_CRC32C static bool can_use_arm64_crc32 = CanUseArm64Crc32(); if (can_use_arm64_crc32) return ExtendArm64(crc, data, count); -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) return ExtendPortable(crc, data, count); } diff --git a/src/crc32c_benchmark.cc b/src/crc32c_benchmark.cc index 68510a2..70e4bd1 100644 --- a/src/crc32c_benchmark.cc +++ b/src/crc32c_benchmark.cc @@ -5,9 +5,8 @@ #include #include -#include "crc32c/crc32c_config.h" - #include "benchmark/benchmark.h" +#include "crc32c/crc32c_config.h" #if CRC32C_TESTS_BUILT_WITH_GLOG #include "glog/logging.h" @@ -36,8 +35,7 @@ class CRC32CBenchmark : public benchmark::Fixture { BENCHMARK_DEFINE_F(CRC32CBenchmark, Public)(benchmark::State& state) { uint32_t crc = 0; - for (auto _ : state) - crc = crc32c::Extend(crc, block_buffer_, block_size_); + for (auto _ : state) crc = crc32c::Extend(crc, block_buffer_, block_size_); state.SetBytesProcessed(state.iterations() * block_size_); } BENCHMARK_REGISTER_F(CRC32CBenchmark, Public) @@ -73,7 +71,8 @@ BENCHMARK_REGISTER_F(CRC32CBenchmark, ArmCRC32C) #endif // HAVE_ARM64_CRC32C -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) BENCHMARK_DEFINE_F(CRC32CBenchmark, Sse42)(benchmark::State& state) { if (!crc32c::CanUseSse42()) { @@ -90,7 +89,8 @@ BENCHMARK_REGISTER_F(CRC32CBenchmark, Sse42) ->RangeMultiplier(16) ->Range(256, 16777216); // Block size. -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) int main(int argc, char** argv) { #if CRC32C_TESTS_BUILT_WITH_GLOG diff --git a/src/crc32c_sse42.cc b/src/crc32c_sse42.cc index 524b237..4786fc0 100644 --- a/src/crc32c_sse42.cc +++ b/src/crc32c_sse42.cc @@ -19,7 +19,8 @@ #include "./crc32c_round_up.h" #include "crc32c/crc32c_config.h" -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) #if defined(_MSC_VER) #include @@ -253,4 +254,5 @@ uint32_t ExtendSse42(uint32_t crc, const uint8_t* data, size_t size) { } // namespace crc32c -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) diff --git a/src/crc32c_sse42.h b/src/crc32c_sse42.h index b9ed179..32d09e7 100644 --- a/src/crc32c_sse42.h +++ b/src/crc32c_sse42.h @@ -17,7 +17,8 @@ // portable version. Most X86 machines are 64-bit nowadays, so it doesn't make // much sense to spend time building an optimized hardware-accelerated // implementation. -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) namespace crc32c { @@ -26,6 +27,7 @@ uint32_t ExtendSse42(uint32_t crc, const uint8_t* data, size_t count); } // namespace crc32c -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) #endif // CRC32C_CRC32C_SSE42_H_ diff --git a/src/crc32c_sse42_check.h b/src/crc32c_sse42_check.h index ad380dd..db74e56 100644 --- a/src/crc32c_sse42_check.h +++ b/src/crc32c_sse42_check.h @@ -12,7 +12,8 @@ #include "crc32c/crc32c_config.h" -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) // If the compiler supports SSE4.2, it definitely supports X86. @@ -43,6 +44,7 @@ inline bool CanUseSse42() { #endif // defined(_MSC_VER) -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) #endif // CRC32C_CRC32C_SSE42_CHECK_H_ diff --git a/src/crc32c_sse42_unittest.cc b/src/crc32c_sse42_unittest.cc index c73ad8d..d417d7d 100644 --- a/src/crc32c_sse42_unittest.cc +++ b/src/crc32c_sse42_unittest.cc @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. -#include "gtest/gtest.h" +#include "./crc32c_sse42.h" #include "./crc32c_extend_unittests.h" -#include "./crc32c_sse42.h" +#include "gtest/gtest.h" namespace crc32c { -#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#if HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && \ + (defined(__SSE4_2__) || defined(__AVX__)) struct Sse42TestTraits { static uint32_t Extend(uint32_t crc, const uint8_t* data, size_t count) { @@ -19,6 +20,7 @@ struct Sse42TestTraits { INSTANTIATE_TYPED_TEST_SUITE_P(Sse42, ExtendTest, Sse42TestTraits); -#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) +#endif // HAVE_SSE42 && (defined(_M_X64) || defined(__x86_64__)) && + // (defined(__SSE4_2__) || defined(__AVX__)) } // namespace crc32c