Skip to content

Commit

Permalink
Fix darwin crc64 compiler (pingcap#2721)
Browse files Browse the repository at this point in the history
SchrodingerZhu authored Aug 19, 2021
1 parent 484d9ef commit 00f985c
Showing 8 changed files with 95 additions and 67 deletions.
12 changes: 8 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -361,10 +361,14 @@ if (ENABLE_TESTS)
enable_testing()
endif ()

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-mvpclmulqdq -Werror -Wall -Wextra" TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT)
if(TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT)
add_definitions(-DTIFLASH_COMPILER_VPCLMULQDQ_SUPPORT=1)
if (ARCH_AMD64)
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-mvpclmulqdq -Werror -Wall -Wextra" TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT)
if(TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT)
add_definitions(-DTIFLASH_COMPILER_VPCLMULQDQ_SUPPORT=1)
else()
add_definitions(-DTIFLASH_COMPILER_VPCLMULQDQ_SUPPORT=0)
endif()
else()
add_definitions(-DTIFLASH_COMPILER_VPCLMULQDQ_SUPPORT=0)
endif()
1 change: 1 addition & 0 deletions libs/libcommon/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@ add_library (common ${SPLIT_SHARED}
src/crc64_sse2_asimd.cpp
src/crc64_avx2.cpp
src/crc64_avx512.cpp
src/crc64.cpp
src/simd.cpp

include/common/types.h
53 changes: 3 additions & 50 deletions libs/libcommon/include/common/crc64.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#pragma once
#include <common/crc64_fast.h>
#include <common/crc64_table.h>
#include <common/simd.h>
#include <cstdint>
#include <cstddef>
namespace crc64
{
enum class Mode
@@ -15,53 +14,7 @@ enum class Mode
class Digest
{
public:
explicit Digest(Mode mode = Mode::Auto)
{
// clang-format off
using namespace simd_option;
#if TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
if ((mode == Mode::Auto || mode >= Mode::SIMD_512) && ENABLE_AVX512
&& __builtin_cpu_supports("vpclmulqdq") && __builtin_cpu_supports("avx512dq"))
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast<512>(crc64::_detail::update_vpclmulqdq_avx512, _state, _src, _length);
};
}
else if ((mode == Mode::Auto || mode >= Mode::SIMD_256) && ENABLE_AVX
&& __builtin_cpu_supports("vpclmulqdq") && __builtin_cpu_supports("avx2"))
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast<256>(crc64::_detail::update_vpclmulqdq_avx2, _state, _src, _length);
};
}
else
#endif
#if __SSE2__ || defined(TIFLASH_ENABLE_ASIMD_SUPPORT)
if (mode == Mode::Auto || mode >= Mode::SIMD_128)
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast(crc64::_detail::update_simd, _state, _src, _length);
};
#ifdef TIFLASH_ENABLE_ASIMD_SUPPORT
if (!ENABLE_ASIMD || !SIMDRuntimeSupport(SIMDFeature::pmull))
{
update_fn = _detail::update_table;
}
#endif
#if __SSE2__
if (!__builtin_cpu_supports("pclmul"))
{
update_fn = _detail::update_table;
}
#endif
}
else // NOLINT(readability-misleading-indentation)
#endif
{
update_fn = _detail::update_table;
}
// clang-format on
};
explicit Digest(Mode mode = Mode::Auto);

void update(const void * src, size_t length) { state = update_fn(state, src, length); }

17 changes: 8 additions & 9 deletions libs/libcommon/include/common/crc64_fast.h
Original file line number Diff line number Diff line change
@@ -3,21 +3,19 @@
namespace crc64::_detail
{

#if __SSE2__ || defined(TIFLASH_ENABLE_ASIMD_SUPPORT)
uint64_t update_simd(uint64_t state, const void * src, size_t length);
#endif

#if defined(TIFLASH_ENABLE_ASIMD_SUPPORT) || __SSE2__
#define TIFLASH_CRC64_HAS_SIMD_SUPPORT
// avx2 and avx512 variants
#if TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT

#ifdef TIFLASH_ENABLE_AVX512_SUPPORT
extern uint64_t update_vpclmulqdq_avx512(uint64_t state, const void * src, size_t length);
#endif

#endif // TIFLASH_ENABLE_AVX512_SUPPORT
#ifdef TIFLASH_ENABLE_AVX_SUPPORT
extern uint64_t update_vpclmulqdq_avx2(uint64_t state, const void * src, size_t length);
#endif
#endif // TIFLASH_ENABLE_AVX_SUPPORT
#endif // TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT

#endif
uint64_t update_simd(uint64_t state, const void * src, size_t length);

template <uintptr_t ALIGN = 128, class Fn>
static inline uint64_t update_fast(Fn func, uint64_t state, const void * src, size_t length)
@@ -51,5 +49,6 @@ static inline uint64_t update_fast(Fn func, uint64_t state, const void * src, si
}
return state;
}
#endif

} // namespace crc64::_detail
59 changes: 59 additions & 0 deletions libs/libcommon/src/crc64.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include <common/crc64.h>
#include <common/crc64_fast.h>
#include <common/crc64_table.h>
#include <common/simd.h>
namespace crc64
{

Digest::Digest(Mode mode)
{
// clang-format off
#ifdef TIFLASH_CRC64_HAS_SIMD_SUPPORT
using namespace simd_option;
#if TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
#ifdef TIFLASH_ENABLE_AVX512_SUPPORT
if ((mode == Mode::Auto || mode >= Mode::SIMD_512) && ENABLE_AVX512
&& __builtin_cpu_supports("vpclmulqdq") && __builtin_cpu_supports("avx512dq"))
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast<512>(crc64::_detail::update_vpclmulqdq_avx512, _state, _src, _length);
};
}
else
#endif // TIFLASH_ENABLE_AVX512_SUPPORT
#ifdef TIFLASH_ENABLE_AVX_SUPPORT
if ((mode == Mode::Auto || mode >= Mode::SIMD_256) && ENABLE_AVX
&& __builtin_cpu_supports("vpclmulqdq") && __builtin_cpu_supports("avx2"))
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast<256>(crc64::_detail::update_vpclmulqdq_avx2, _state, _src, _length);
};
}
else
#endif // TIFLASH_ENABLE_AVX_SUPPORT
#endif // TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
if (mode == Mode::Auto || mode >= Mode::SIMD_128)
{
update_fn = [](uint64_t _state, const void * _src, size_t _length) {
return crc64::_detail::update_fast(crc64::_detail::update_simd, _state, _src, _length);
};
#ifdef TIFLASH_ENABLE_ASIMD_SUPPORT
if (!ENABLE_ASIMD || !SIMDRuntimeSupport(SIMDFeature::pmull))
{
update_fn = _detail::update_table;
}
#else // must be SSE case then
if (!__builtin_cpu_supports("pclmul"))
{
update_fn = _detail::update_table;
}
#endif // TIFLASH_ENABLE_ASIMD_SUPPORT
}
else
#endif // TIFLASH_CRC64_HAS_SIMD_SUPPORT
{
update_fn = _detail::update_table;
}
// clang-format on
}
} // namespace crc64
6 changes: 5 additions & 1 deletion libs/libcommon/src/crc64_avx2.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#if defined(TIFLASH_ENABLE_AVX_SUPPORT) && TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
#include <common/crc64_fast.h>
#if defined(TIFLASH_CRC64_HAS_SIMD_SUPPORT) && defined(TIFLASH_ENABLE_AVX_SUPPORT) && TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
#include <common/crc64.h>
#include <common/crc64_arch/crc64_x86.h>
#include <common/crc64_table.h>

#include <array>
namespace crc64::_detail
{
using avx256_t = __m256i;
6 changes: 5 additions & 1 deletion libs/libcommon/src/crc64_avx512.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#if defined(TIFLASH_ENABLE_AVX512_SUPPORT) && TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
#include <common/crc64_fast.h>
#if defined(TIFLASH_CRC64_HAS_SIMD_SUPPORT) && defined(TIFLASH_ENABLE_AVX512_SUPPORT) && TIFLASH_COMPILER_VPCLMULQDQ_SUPPORT
#include <common/crc64.h>
#include <common/crc64_arch/crc64_x86.h>
#include <common/crc64_table.h>

#include <array>
namespace crc64::_detail
{
using avx512_t = __m512i;
8 changes: 6 additions & 2 deletions libs/libcommon/src/crc64_sse2_asimd.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
#if __SSE2__ || defined(TIFLASH_ENABLE_ASIMD_SUPPORT)
#include <common/crc64_fast.h>
#include <common/crc64_table.h>

#ifdef TIFLASH_CRC64_HAS_SIMD_SUPPORT

#include <common/crc64.h>
#if __SSE2__
#include <common/crc64_arch/crc64_x86.h>
@@ -65,4 +69,4 @@ uint64_t update_simd(uint64_t state, const void * src, size_t length)
return acc.fold8(K_127).barrett(POLY, MU);
}
} // namespace crc64::_detail
#endif
#endif // TIFLASH_CRC64_HAS_SIMD_SUPPORT

0 comments on commit 00f985c

Please sign in to comment.