27#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
29#if defined(__linux__) && !defined(__aarch64__) && !defined(HWCAP2_CRC32)
34#if defined(__NetBSD__)
35#include <sys/sysctl.h>
36#if defined(__aarch64__)
37#include <aarch64/armreg.h>
46#if defined(HAVE_ELF_AUX_INFO)
50 return elf_aux_info(AT_HWCAP, &
value,
sizeof(
value)) == 0 &&
51 (
value & HWCAP_CRC32) != 0;
53 return elf_aux_info(AT_HWCAP2, &
value,
sizeof(
value)) == 0 &&
54 (
value & HWCAP2_CRC32) != 0;
56#elif defined(HAVE_GETAUXVAL)
58 return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0;
60 return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0;
62#elif defined(__NetBSD__)
69#define ISAR0_CRC32_BITPOS 16
70#define ISAR0_CRC32_BITWIDTH 4
71#define WIDTHMASK(w) ((1 << (w)) - 1)
72#define SYSCTL_CPU_ID_MAXSIZE 64
75 uint64 sysctlbuf[SYSCTL_CPU_ID_MAXSIZE];
76#if defined(__aarch64__)
78 const char *path =
"machdep.cpu0.cpu_id";
79 size_t expected_len =
sizeof(
struct aarch64_sysctl_cpu_id);
80#define ISAR0 ((struct aarch64_sysctl_cpu_id *) sysctlbuf)->ac_aa64isar0
82 const char *path =
"machdep.id_isar";
83 size_t expected_len = 6 *
sizeof(int);
84#define ISAR0 ((int *) sysctlbuf)[5]
89 len =
sizeof(sysctlbuf);
90 memset(sysctlbuf, 0,
len);
91 if (sysctlbyname(path, sysctlbuf, &
len, NULL, 0) != 0)
93 if (
len != expected_len)
97 fld = (ISAR0 >> ISAR0_CRC32_BITPOS) & WIDTHMASK(ISAR0_CRC32_BITWIDTH);
pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len)
pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len)
pg_crc32c(* pg_comp_crc32c)(pg_crc32c crc, const void *data, size_t len)
static bool pg_crc32c_armv8_available(void)
static pg_crc32c pg_comp_crc32c_choose(pg_crc32c crc, const void *data, size_t len)