27#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
30#if defined(__linux__) && (defined(__aarch64__) ? !defined(HWCAP_CRC32) : !defined(HWCAP2_CRC32))
35#if defined(__NetBSD__)
36#include <sys/sysctl.h>
37#if defined(__aarch64__)
38#include <aarch64/armreg.h>
47#if defined(HAVE_ELF_AUX_INFO)
51 return elf_aux_info(AT_HWCAP, &
value,
sizeof(
value)) == 0 &&
52 (
value & HWCAP_CRC32) != 0;
54 return elf_aux_info(AT_HWCAP2, &
value,
sizeof(
value)) == 0 &&
55 (
value & HWCAP2_CRC32) != 0;
57#elif defined(HAVE_GETAUXVAL)
59 return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0;
61 return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0;
63#elif defined(__NetBSD__)
70#define ISAR0_CRC32_BITPOS 16
71#define ISAR0_CRC32_BITWIDTH 4
72#define WIDTHMASK(w) ((1 << (w)) - 1)
73#define SYSCTL_CPU_ID_MAXSIZE 64
76 uint64 sysctlbuf[SYSCTL_CPU_ID_MAXSIZE];
77#if defined(__aarch64__)
79 const char *path =
"machdep.cpu0.cpu_id";
80 size_t expected_len =
sizeof(
struct aarch64_sysctl_cpu_id);
81#define ISAR0 ((struct aarch64_sysctl_cpu_id *) sysctlbuf)->ac_aa64isar0
83 const char *path =
"machdep.id_isar";
84 size_t expected_len = 6 *
sizeof(int);
85#define ISAR0 ((int *) sysctlbuf)[5]
90 len =
sizeof(sysctlbuf);
91 memset(sysctlbuf, 0,
len);
92 if (sysctlbyname(path, sysctlbuf, &
len, NULL, 0) != 0)
94 if (
len != expected_len)
98 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)