mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
Merge #20603: build: Update crc32c subtree
90c0f267bd
Squashed 'src/crc32c/' changes from 224988680f..b5ef9be675 (MarcoFalke) Pull request description: Except for the ARM64 darwin fix this is just code-shuffling in files/functions we don't use ACKs for top commit: jonasschnelli: Tested ACKfa7c8d136f
- Tested this on an ARM Mac. Linking issue went away (successful depends compilation). Also tested that the ARM64 hardware acceleration code part was used. laanwj: Code review ACKfa7c8d136f
Tree-SHA512: 1fa156d72c75d22ead2677b165e566978331f795d52a637e478d83d1cf2adddd84eed259d617df6d11270af2e4e57ae6991aec3bc4c0bdf5dec959f44daa14eb
This commit is contained in:
commit
0038ce9758
@ -41,7 +41,7 @@ crc32c_libcrc32c_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
|||||||
crc32c_libcrc32c_a_SOURCES =
|
crc32c_libcrc32c_a_SOURCES =
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/include/crc32c/crc32c.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/include/crc32c/crc32c.h
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64.h
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64_linux_check.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64_check.h
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_internal.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_internal.h
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_prefetch.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_prefetch.h
|
||||||
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_read_le.h
|
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_read_le.h
|
||||||
|
@ -8,9 +8,9 @@ environment:
|
|||||||
matrix:
|
matrix:
|
||||||
# AppVeyor currently has no custom job name feature.
|
# AppVeyor currently has no custom job name feature.
|
||||||
# http://help.appveyor.com/discussions/questions/1623-can-i-provide-a-friendly-name-for-jobs
|
# http://help.appveyor.com/discussions/questions/1623-can-i-provide-a-friendly-name-for-jobs
|
||||||
- JOB: Visual Studio 2017
|
- JOB: Visual Studio 2019
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
CMAKE_GENERATOR: Visual Studio 15 2017
|
CMAKE_GENERATOR: Visual Studio 16 2019
|
||||||
|
|
||||||
platform:
|
platform:
|
||||||
- x86
|
- x86
|
||||||
@ -24,10 +24,11 @@ build_script:
|
|||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- if "%platform%"=="x64" set CMAKE_GENERATOR=%CMAKE_GENERATOR% Win64
|
- if "%platform%"=="x86" (set CMAKE_GENERATOR_PLATFORM="Win32")
|
||||||
|
else (set CMAKE_GENERATOR_PLATFORM="%platform%")
|
||||||
- cmake --version
|
- cmake --version
|
||||||
- cmake .. -G "%CMAKE_GENERATOR%" -DCRC32C_USE_GLOG=0
|
- cmake .. -G "%CMAKE_GENERATOR%" -A "%CMAKE_GENERATOR_PLATFORM%"
|
||||||
-DCMAKE_CONFIGURATION_TYPES="%CONFIGURATION%"
|
-DCMAKE_CONFIGURATION_TYPES="%CONFIGURATION%" -DCRC32C_USE_GLOG=0
|
||||||
- cmake --build . --config "%CONFIGURATION%"
|
- cmake --build . --config "%CONFIGURATION%"
|
||||||
- cd ..
|
- cd ..
|
||||||
|
|
||||||
|
@ -7,3 +7,5 @@ Google Inc.
|
|||||||
|
|
||||||
Fangming Fang <Fangming.Fang@arm.com>
|
Fangming Fang <Fangming.Fang@arm.com>
|
||||||
Vadim Skipin <vadim.skipin@gmail.com>
|
Vadim Skipin <vadim.skipin@gmail.com>
|
||||||
|
Rodrigo Tobar <rtobar@icrar.org>
|
||||||
|
Harry Mallon <hjmallon@gmail.com>
|
||||||
|
@ -5,15 +5,21 @@
|
|||||||
cmake_minimum_required(VERSION 3.1)
|
cmake_minimum_required(VERSION 3.1)
|
||||||
project(Crc32c VERSION 1.1.0 LANGUAGES C CXX)
|
project(Crc32c VERSION 1.1.0 LANGUAGES C CXX)
|
||||||
|
|
||||||
# This project can use C11, but will gracefully decay down to C89.
|
# C standard can be overridden when this is used as a sub-project.
|
||||||
set(CMAKE_C_STANDARD 11)
|
if(NOT CMAKE_C_STANDARD)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED OFF)
|
# This project can use C11, but will gracefully decay down to C89.
|
||||||
set(CMAKE_C_EXTENSIONS OFF)
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED OFF)
|
||||||
|
set(CMAKE_C_EXTENSIONS OFF)
|
||||||
|
endif(NOT CMAKE_C_STANDARD)
|
||||||
|
|
||||||
# This project requires C++11.
|
# C++ standard can be overridden when this is used as a sub-project.
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
if(NOT CMAKE_CXX_STANDARD)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
# This project requires C++11.
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
endif(NOT CMAKE_CXX_STANDARD)
|
||||||
|
|
||||||
# https://github.com/izenecloud/cmake/blob/master/SetCompilerWarningAll.cmake
|
# https://github.com/izenecloud/cmake/blob/master/SetCompilerWarningAll.cmake
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
@ -269,7 +275,7 @@ target_sources(crc32c
|
|||||||
PRIVATE
|
PRIVATE
|
||||||
"${PROJECT_BINARY_DIR}/include/crc32c/crc32c_config.h"
|
"${PROJECT_BINARY_DIR}/include/crc32c/crc32c_config.h"
|
||||||
"src/crc32c_arm64.h"
|
"src/crc32c_arm64.h"
|
||||||
"src/crc32c_arm64_linux_check.h"
|
"src/crc32c_arm64_check.h"
|
||||||
"src/crc32c_internal.h"
|
"src/crc32c_internal.h"
|
||||||
"src/crc32c_portable.cc"
|
"src/crc32c_portable.cc"
|
||||||
"src/crc32c_prefetch.h"
|
"src/crc32c_prefetch.h"
|
||||||
@ -405,19 +411,24 @@ if(CRC32C_INSTALL)
|
|||||||
)
|
)
|
||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
configure_package_config_file(
|
||||||
|
"${PROJECT_NAME}Config.cmake.in"
|
||||||
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
|
||||||
|
)
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
"${PROJECT_BINARY_DIR}/Crc32cConfigVersion.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
COMPATIBILITY SameMajorVersion
|
COMPATIBILITY SameMajorVersion
|
||||||
)
|
)
|
||||||
install(
|
install(
|
||||||
EXPORT Crc32cTargets
|
EXPORT Crc32cTargets
|
||||||
NAMESPACE Crc32c::
|
NAMESPACE Crc32c::
|
||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Crc32c"
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
|
||||||
)
|
)
|
||||||
install(
|
install(
|
||||||
FILES
|
FILES
|
||||||
"Crc32cConfig.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
"${PROJECT_BINARY_DIR}/Crc32cConfigVersion.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Crc32c"
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
|
||||||
)
|
)
|
||||||
endif(CRC32C_INSTALL)
|
endif(CRC32C_INSTALL)
|
||||||
|
@ -2,4 +2,8 @@
|
|||||||
# Use of this source code is governed by a BSD-style license that can be
|
# 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.
|
# found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/Crc32cTargets.cmake")
|
include("${CMAKE_CURRENT_LIST_DIR}/Crc32cTargets.cmake")
|
||||||
|
|
||||||
|
check_required_components(Crc32c)
|
@ -8,7 +8,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "./crc32c_arm64.h"
|
#include "./crc32c_arm64.h"
|
||||||
#include "./crc32c_arm64_linux_check.h"
|
#include "./crc32c_arm64_check.h"
|
||||||
#include "./crc32c_internal.h"
|
#include "./crc32c_internal.h"
|
||||||
#include "./crc32c_sse42.h"
|
#include "./crc32c_sse42.h"
|
||||||
#include "./crc32c_sse42_check.h"
|
#include "./crc32c_sse42_check.h"
|
||||||
@ -20,8 +20,8 @@ uint32_t Extend(uint32_t crc, const uint8_t* data, size_t count) {
|
|||||||
static bool can_use_sse42 = CanUseSse42();
|
static bool can_use_sse42 = CanUseSse42();
|
||||||
if (can_use_sse42) return ExtendSse42(crc, data, count);
|
if (can_use_sse42) return ExtendSse42(crc, data, count);
|
||||||
#elif HAVE_ARM64_CRC32C
|
#elif HAVE_ARM64_CRC32C
|
||||||
static bool can_use_arm_linux = CanUseArm64Linux();
|
static bool can_use_arm64_crc32 = CanUseArm64Crc32();
|
||||||
if (can_use_arm_linux) return ExtendArm64(crc, data, count);
|
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__))
|
||||||
|
|
||||||
return ExtendPortable(crc, data, count);
|
return ExtendPortable(crc, data, count);
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
|
|
||||||
namespace crc32c {
|
namespace crc32c {
|
||||||
|
|
||||||
uint32_t ExtendArm64(uint32_t crc, const uint8_t *buf, size_t size) {
|
uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
|
||||||
int64_t length = size;
|
int64_t length = size;
|
||||||
uint32_t crc0, crc1, crc2, crc3;
|
uint32_t crc0, crc1, crc2, crc3;
|
||||||
uint64_t t0, t1, t2;
|
uint64_t t0, t1, t2;
|
||||||
@ -74,7 +74,6 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *buf, size_t size) {
|
|||||||
const poly64_t k0 = 0x8d96551c, k1 = 0xbd6f81f8, k2 = 0xdcb17aa4;
|
const poly64_t k0 = 0x8d96551c, k1 = 0xbd6f81f8, k2 = 0xdcb17aa4;
|
||||||
|
|
||||||
crc = crc ^ kCRC32Xor;
|
crc = crc ^ kCRC32Xor;
|
||||||
const uint8_t *p = reinterpret_cast<const uint8_t *>(buf);
|
|
||||||
|
|
||||||
while (length >= KBYTES) {
|
while (length >= KBYTES) {
|
||||||
crc0 = crc;
|
crc0 = crc;
|
||||||
@ -83,14 +82,14 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *buf, size_t size) {
|
|||||||
crc3 = 0;
|
crc3 = 0;
|
||||||
|
|
||||||
// Process 1024 bytes in parallel.
|
// Process 1024 bytes in parallel.
|
||||||
CRC32C1024BYTES(p);
|
CRC32C1024BYTES(data);
|
||||||
|
|
||||||
// Merge the 4 partial CRC32C values.
|
// Merge the 4 partial CRC32C values.
|
||||||
t2 = (uint64_t)vmull_p64(crc2, k2);
|
t2 = (uint64_t)vmull_p64(crc2, k2);
|
||||||
t1 = (uint64_t)vmull_p64(crc1, k1);
|
t1 = (uint64_t)vmull_p64(crc1, k1);
|
||||||
t0 = (uint64_t)vmull_p64(crc0, k0);
|
t0 = (uint64_t)vmull_p64(crc0, k0);
|
||||||
crc = __crc32cd(crc3, *(uint64_t *)p);
|
crc = __crc32cd(crc3, *(uint64_t *)data);
|
||||||
p += sizeof(uint64_t);
|
data += sizeof(uint64_t);
|
||||||
crc ^= __crc32cd(0, t2);
|
crc ^= __crc32cd(0, t2);
|
||||||
crc ^= __crc32cd(0, t1);
|
crc ^= __crc32cd(0, t1);
|
||||||
crc ^= __crc32cd(0, t0);
|
crc ^= __crc32cd(0, t0);
|
||||||
@ -99,23 +98,23 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *buf, size_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (length >= 8) {
|
while (length >= 8) {
|
||||||
crc = __crc32cd(crc, *(uint64_t *)p);
|
crc = __crc32cd(crc, *(uint64_t *)data);
|
||||||
p += 8;
|
data += 8;
|
||||||
length -= 8;
|
length -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length & 4) {
|
if (length & 4) {
|
||||||
crc = __crc32cw(crc, *(uint32_t *)p);
|
crc = __crc32cw(crc, *(uint32_t *)data);
|
||||||
p += 4;
|
data += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length & 2) {
|
if (length & 2) {
|
||||||
crc = __crc32ch(crc, *(uint16_t *)p);
|
crc = __crc32ch(crc, *(uint16_t *)data);
|
||||||
p += 2;
|
data += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length & 1) {
|
if (length & 1) {
|
||||||
crc = __crc32cb(crc, *p);
|
crc = __crc32cb(crc, *data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return crc ^ kCRC32Xor;
|
return crc ^ kCRC32Xor;
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// 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.
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
// Linux-specific code checking the availability for ARM CRC32C instructions.
|
// ARM-specific code
|
||||||
|
|
||||||
#ifndef CRC32C_CRC32C_ARM_LINUX_H_
|
#ifndef CRC32C_CRC32C_ARM_H_
|
||||||
#define CRC32C_CRC32C_ARM_LINUX_H_
|
#define CRC32C_CRC32C_ARM_H_
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -24,4 +24,4 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t* data, size_t count);
|
|||||||
|
|
||||||
#endif // HAVE_ARM64_CRC32C
|
#endif // HAVE_ARM64_CRC32C
|
||||||
|
|
||||||
#endif // CRC32C_CRC32C_ARM_LINUX_H_
|
#endif // CRC32C_CRC32C_ARM_H_
|
||||||
|
@ -2,12 +2,10 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// 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.
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
// ARM Linux-specific code checking for the availability of CRC32C instructions.
|
// ARM-specific code checking for the availability of CRC32C instructions.
|
||||||
|
|
||||||
#ifndef CRC32C_CRC32C_ARM_LINUX_CHECK_H_
|
#ifndef CRC32C_CRC32C_ARM_CHECK_H_
|
||||||
#define CRC32C_CRC32C_ARM_LINUX_CHECK_H_
|
#define CRC32C_CRC32C_ARM_CHECK_H_
|
||||||
|
|
||||||
// X86-specific code checking for the availability of SSE4.2 instructions.
|
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -18,6 +16,7 @@
|
|||||||
|
|
||||||
#if HAVE_ARM64_CRC32C
|
#if HAVE_ARM64_CRC32C
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
#if HAVE_STRONG_GETAUXVAL
|
#if HAVE_STRONG_GETAUXVAL
|
||||||
#include <sys/auxv.h>
|
#include <sys/auxv.h>
|
||||||
#elif HAVE_WEAK_GETAUXVAL
|
#elif HAVE_WEAK_GETAUXVAL
|
||||||
@ -27,17 +26,28 @@ extern "C" unsigned long getauxval(unsigned long type) __attribute__((weak));
|
|||||||
|
|
||||||
#define AT_HWCAP 16
|
#define AT_HWCAP 16
|
||||||
#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
|
#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
|
||||||
|
#endif // defined (__linux__)
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#endif // defined (__APPLE__)
|
||||||
|
|
||||||
namespace crc32c {
|
namespace crc32c {
|
||||||
|
|
||||||
inline bool CanUseArm64Linux() {
|
inline bool CanUseArm64Crc32() {
|
||||||
#if HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
|
#if defined (__linux__) && (HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL)
|
||||||
// From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code.
|
// From 'arch/arm64/include/uapi/asm/hwcap.h' in Linux kernel source code.
|
||||||
constexpr unsigned long kHWCAP_PMULL = 1 << 4;
|
constexpr unsigned long kHWCAP_PMULL = 1 << 4;
|
||||||
constexpr unsigned long kHWCAP_CRC32 = 1 << 7;
|
constexpr unsigned long kHWCAP_CRC32 = 1 << 7;
|
||||||
unsigned long hwcap = (&getauxval != nullptr) ? getauxval(AT_HWCAP) : 0;
|
unsigned long hwcap = (&getauxval != nullptr) ? getauxval(AT_HWCAP) : 0;
|
||||||
return (hwcap & (kHWCAP_PMULL | kHWCAP_CRC32)) ==
|
return (hwcap & (kHWCAP_PMULL | kHWCAP_CRC32)) ==
|
||||||
(kHWCAP_PMULL | kHWCAP_CRC32);
|
(kHWCAP_PMULL | kHWCAP_CRC32);
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
int val = 0;
|
||||||
|
size_t len = sizeof(val);
|
||||||
|
return sysctlbyname("hw.optional.armv8_crc32", &val, &len, nullptr, 0) == 0
|
||||||
|
&& val != 0;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
|
#endif // HAVE_STRONG_GETAUXVAL || HAVE_WEAK_GETAUXVAL
|
||||||
@ -47,4 +57,4 @@ inline bool CanUseArm64Linux() {
|
|||||||
|
|
||||||
#endif // HAVE_ARM64_CRC32C
|
#endif // HAVE_ARM64_CRC32C
|
||||||
|
|
||||||
#endif // CRC32C_CRC32C_ARM_LINUX_CHECK_H_
|
#endif // CRC32C_CRC32C_ARM_CHECK_H_
|
@ -16,7 +16,7 @@
|
|||||||
#endif // CRC32C_TESTS_BUILT_WITH_GLOG
|
#endif // CRC32C_TESTS_BUILT_WITH_GLOG
|
||||||
|
|
||||||
#include "./crc32c_arm64.h"
|
#include "./crc32c_arm64.h"
|
||||||
#include "./crc32c_arm64_linux_check.h"
|
#include "./crc32c_arm64_check.h"
|
||||||
#include "./crc32c_internal.h"
|
#include "./crc32c_internal.h"
|
||||||
#include "./crc32c_sse42.h"
|
#include "./crc32c_sse42.h"
|
||||||
#include "./crc32c_sse42_check.h"
|
#include "./crc32c_sse42_check.h"
|
||||||
@ -58,8 +58,8 @@ BENCHMARK_REGISTER_F(CRC32CBenchmark, Portable)
|
|||||||
|
|
||||||
#if HAVE_ARM64_CRC32C
|
#if HAVE_ARM64_CRC32C
|
||||||
|
|
||||||
BENCHMARK_DEFINE_F(CRC32CBenchmark, ArmLinux)(benchmark::State& state) {
|
BENCHMARK_DEFINE_F(CRC32CBenchmark, ArmCRC32C)(benchmark::State& state) {
|
||||||
if (!crc32c::CanUseArm64Linux()) {
|
if (!crc32c::CanUseArm64Crc32()) {
|
||||||
state.SkipWithError("ARM CRC32C instructions not available or not enabled");
|
state.SkipWithError("ARM CRC32C instructions not available or not enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ BENCHMARK_DEFINE_F(CRC32CBenchmark, ArmLinux)(benchmark::State& state) {
|
|||||||
crc = crc32c::ExtendArm64(crc, block_buffer_, block_size_);
|
crc = crc32c::ExtendArm64(crc, block_buffer_, block_size_);
|
||||||
state.SetBytesProcessed(state.iterations() * block_size_);
|
state.SetBytesProcessed(state.iterations() * block_size_);
|
||||||
}
|
}
|
||||||
BENCHMARK_REGISTER_F(CRC32CBenchmark, ArmLinux)
|
BENCHMARK_REGISTER_F(CRC32CBenchmark, ArmCRC32C)
|
||||||
->RangeMultiplier(16)
|
->RangeMultiplier(16)
|
||||||
->Range(256, 16777216); // Block size.
|
->Range(256, 16777216); // Block size.
|
||||||
|
|
||||||
|
@ -32,14 +32,14 @@ inline uint32_t ReadUint32LE(const uint8_t* buffer) {
|
|||||||
// Reads a little-endian 64-bit integer from a 64-bit-aligned buffer.
|
// Reads a little-endian 64-bit integer from a 64-bit-aligned buffer.
|
||||||
inline uint64_t ReadUint64LE(const uint8_t* buffer) {
|
inline uint64_t ReadUint64LE(const uint8_t* buffer) {
|
||||||
#if BYTE_ORDER_BIG_ENDIAN
|
#if BYTE_ORDER_BIG_ENDIAN
|
||||||
return ((static_cast<uint32_t>(static_cast<uint8_t>(buffer[0]))) |
|
return ((static_cast<uint64_t>(static_cast<uint8_t>(buffer[0]))) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[1])) << 8) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[1])) << 8) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[2])) << 16) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[2])) << 16) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[3])) << 24) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[3])) << 24) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[4])) << 32) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[4])) << 32) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[5])) << 40) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[5])) << 40) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[6])) << 48) |
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[6])) << 48) |
|
||||||
(static_cast<uint32_t>(static_cast<uint8_t>(buffer[7])) << 56));
|
(static_cast<uint64_t>(static_cast<uint8_t>(buffer[7])) << 56));
|
||||||
#else // !BYTE_ORDER_BIG_ENDIAN
|
#else // !BYTE_ORDER_BIG_ENDIAN
|
||||||
uint64_t result;
|
uint64_t result;
|
||||||
// This should be optimized to a single instruction.
|
// This should be optimized to a single instruction.
|
||||||
|
Loading…
Reference in New Issue
Block a user