summaryrefslogtreecommitdiff
path: root/functable.c
diff options
context:
space:
mode:
Diffstat (limited to 'functable.c')
-rw-r--r--functable.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/functable.c b/functable.c
index da9d10ec5b..c7d477c7f0 100644
--- a/functable.c
+++ b/functable.c
@@ -13,8 +13,9 @@
static void init_functable(void) {
struct functable_s ft;
+ struct cpu_features cf;
- cpu_check_features();
+ cpu_check_features(&cf);
// Generic code
ft.adler32 = &adler32_c;
@@ -58,7 +59,7 @@ static void init_functable(void) {
// X86 - SSE2
#ifdef X86_SSE2
# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2)
- if (x86_cpu_has_sse2)
+ if (cf.x86.has_sse2)
# endif
{
ft.chunkmemset_safe = &chunkmemset_safe_sse2;
@@ -74,18 +75,18 @@ static void init_functable(void) {
#endif
// X86 - SSSE3
#ifdef X86_SSSE3
- if (x86_cpu_has_ssse3)
+ if (cf.x86.has_ssse3)
ft.adler32 = &adler32_ssse3;
#endif
// X86 - SSE4
#if defined(X86_SSE41) && defined(X86_SSE2)
- if (x86_cpu_has_sse41) {
+ if (cf.x86.has_sse41) {
ft.chunkmemset_safe = &chunkmemset_safe_sse41;
ft.inflate_fast = &inflate_fast_sse41;
}
#endif
#ifdef X86_SSE42
- if (x86_cpu_has_sse42) {
+ if (cf.x86.has_sse42) {
ft.adler32_fold_copy = &adler32_fold_copy_sse42;
ft.insert_string = &insert_string_sse4;
ft.quick_insert_string = &quick_insert_string_sse4;
@@ -94,7 +95,7 @@ static void init_functable(void) {
#endif
// X86 - PCLMUL
#ifdef X86_PCLMULQDQ_CRC
- if (x86_cpu_has_pclmulqdq) {
+ if (cf.x86.has_pclmulqdq) {
ft.crc32 = &crc32_pclmulqdq;
ft.crc32_fold = &crc32_fold_pclmulqdq;
ft.crc32_fold_copy = &crc32_fold_pclmulqdq_copy;
@@ -104,7 +105,7 @@ static void init_functable(void) {
#endif
// X86 - AVX
#ifdef X86_AVX2
- if (x86_cpu_has_avx2) {
+ if (cf.x86.has_avx2) {
ft.adler32 = &adler32_avx2;
ft.adler32_fold_copy = &adler32_fold_copy_avx2;
ft.chunkmemset_safe = &chunkmemset_safe_avx;
@@ -119,20 +120,20 @@ static void init_functable(void) {
}
#endif
#ifdef X86_AVX512
- if (x86_cpu_has_avx512) {
+ if (cf.x86.has_avx512) {
ft.adler32 = &adler32_avx512;
ft.adler32_fold_copy = &adler32_fold_copy_avx512;
}
#endif
#ifdef X86_AVX512VNNI
- if (x86_cpu_has_avx512vnni) {
+ if (cf.x86.has_avx512vnni) {
ft.adler32 = &adler32_avx512_vnni;
ft.adler32_fold_copy = &adler32_fold_copy_avx512_vnni;
}
#endif
// X86 - VPCLMULQDQ
#if defined(X86_PCLMULQDQ_CRC) && defined(X86_VPCLMULQDQ_CRC)
- if (x86_cpu_has_pclmulqdq && x86_cpu_has_avx512 && x86_cpu_has_vpclmulqdq) {
+ if (cf.x86.has_pclmulqdq && cf.x86.has_avx512 && cf.x86.has_vpclmulqdq) {
ft.crc32 = &crc32_vpclmulqdq;
ft.crc32_fold = &crc32_fold_vpclmulqdq;
ft.crc32_fold_copy = &crc32_fold_vpclmulqdq_copy;
@@ -145,7 +146,7 @@ static void init_functable(void) {
// ARM - NEON
#ifdef ARM_NEON
# ifndef ARM_NOCHECK_NEON
- if (arm_cpu_has_neon)
+ if (cf.arm.has_neon)
# endif
{
ft.adler32 = &adler32_neon;
@@ -162,7 +163,7 @@ static void init_functable(void) {
#endif
// ARM - ACLE
#ifdef ARM_ACLE
- if (arm_cpu_has_crc32) {
+ if (cf.arm.has_crc32) {
ft.crc32 = &crc32_acle;
ft.insert_string = &insert_string_acle;
ft.quick_insert_string = &quick_insert_string_acle;
@@ -173,14 +174,14 @@ static void init_functable(void) {
// Power - VMX
#ifdef PPC_VMX
- if (power_cpu_has_altivec) {
+ if (cf.power.has_altivec) {
ft.adler32 = &adler32_vmx;
ft.slide_hash = &slide_hash_vmx;
}
#endif
// Power8 - VSX
#ifdef POWER8_VSX
- if (power_cpu_has_arch_2_07) {
+ if (cf.power.has_arch_2_07) {
ft.adler32 = &adler32_power8;
ft.chunkmemset_safe = &chunkmemset_safe_power8;
ft.chunksize = &chunksize_power8;
@@ -189,12 +190,12 @@ static void init_functable(void) {
}
#endif
#ifdef POWER8_VSX_CRC32
- if (power_cpu_has_arch_2_07)
+ if (cf.power.has_arch_2_07)
ft.crc32 = &crc32_power8;
#endif
// Power9
#ifdef POWER9
- if (power_cpu_has_arch_3_00) {
+ if (cf.power.has_arch_3_00) {
ft.compare256 = &compare256_power9;
ft.longest_match = &longest_match_power9;
ft.longest_match_slow = &longest_match_slow_power9;
@@ -204,8 +205,8 @@ static void init_functable(void) {
// S390
#ifdef S390_CRC32_VX
- if (PREFIX(s390_cpu_has_vx))
- ft.crc32 = &PREFIX(s390_crc32_vx);
+ if (cf.s390.has_vx)
+ ft.crc32 = crc32_s390_vx;
#endif
// Assign function pointers individually for atomic operation