mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-09-29 19:24:25 +03:00
Add cpu feature / target info "AVX512VBMI".
This commit is contained in:
committed by
Konstantinos Margaritis
parent
d96f1ab505
commit
b19a41528a
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
* Copyright (c) 2015-2020, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -50,6 +50,11 @@ u64a cpuid_flags(void) {
|
||||
cap |= HS_CPU_FEATURES_AVX512;
|
||||
}
|
||||
|
||||
if (check_avx512vbmi()) {
|
||||
DEBUG_PRINTF("AVX512VBMI enabled\n");
|
||||
cap |= HS_CPU_FEATURES_AVX512VBMI;
|
||||
}
|
||||
|
||||
#if !defined(FAT_RUNTIME) && !defined(HAVE_AVX2)
|
||||
cap &= ~HS_CPU_FEATURES_AVX2;
|
||||
#endif
|
||||
@@ -59,6 +64,11 @@ u64a cpuid_flags(void) {
|
||||
cap &= ~HS_CPU_FEATURES_AVX512;
|
||||
#endif
|
||||
|
||||
#if (!defined(FAT_RUNTIME) && !defined(HAVE_AVX512VBMI)) || \
|
||||
(defined(FAT_RUNTIME) && !defined(BUILD_AVX512VBMI))
|
||||
cap &= ~HS_CPU_FEATURES_AVX512VBMI;
|
||||
#endif
|
||||
|
||||
return cap;
|
||||
}
|
||||
|
||||
@@ -105,6 +115,11 @@ static const struct family_id known_microarch[] = {
|
||||
{ 0x6, 0x8E, HS_TUNE_FAMILY_SKL }, /* Kabylake Mobile */
|
||||
{ 0x6, 0x9E, HS_TUNE_FAMILY_SKL }, /* Kabylake desktop */
|
||||
|
||||
{ 0x6, 0x7D, HS_TUNE_FAMILY_ICL }, /* Icelake */
|
||||
{ 0x6, 0x7E, HS_TUNE_FAMILY_ICL }, /* Icelake */
|
||||
{ 0x6, 0x6A, HS_TUNE_FAMILY_ICX }, /* Icelake Xeon-D */
|
||||
{ 0x6, 0x6C, HS_TUNE_FAMILY_ICX }, /* Icelake Xeon */
|
||||
|
||||
};
|
||||
|
||||
#ifdef DUMP_SUPPORT
|
||||
@@ -120,6 +135,8 @@ const char *dumpTune(u32 tune) {
|
||||
T_CASE(HS_TUNE_FAMILY_BDW);
|
||||
T_CASE(HS_TUNE_FAMILY_SKL);
|
||||
T_CASE(HS_TUNE_FAMILY_SKX);
|
||||
T_CASE(HS_TUNE_FAMILY_ICL);
|
||||
T_CASE(HS_TUNE_FAMILY_ICX);
|
||||
}
|
||||
#undef T_CASE
|
||||
return "unknown";
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017-2020, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -74,11 +74,12 @@ void cpuid(unsigned int op, unsigned int leaf, unsigned int *eax,
|
||||
#define CPUID_HTT (1 << 28)
|
||||
|
||||
// Structured Extended Feature Flags Enumeration Leaf ECX values
|
||||
#define CPUID_AVX512VBMI (1 << 1)
|
||||
|
||||
// Structured Extended Feature Flags Enumeration Leaf EBX values
|
||||
#define CPUID_BMI (1 << 3)
|
||||
#define CPUID_AVX2 (1 << 5)
|
||||
#define CPUID_BMI2 (1 << 8)
|
||||
|
||||
// Structured Extended Feature Flags Enumeration Leaf EBX values
|
||||
#define CPUID_AVX512F (1 << 16)
|
||||
#define CPUID_AVX512BW (1 << 30)
|
||||
|
||||
@@ -186,6 +187,51 @@ int check_avx512(void) {
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
int check_avx512vbmi(void) {
|
||||
#if defined(__INTEL_COMPILER)
|
||||
return _may_i_use_cpu_feature(_FEATURE_AVX512VBMI);
|
||||
#else
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
||||
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
/* check XSAVE is enabled by OS */
|
||||
if (!(ecx & CPUID_XSAVE)) {
|
||||
DEBUG_PRINTF("AVX and XSAVE not supported\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check that AVX 512 registers are enabled by OS */
|
||||
u64a xcr0 = xgetbv(0);
|
||||
if ((xcr0 & CPUID_XCR0_AVX512) != CPUID_XCR0_AVX512) {
|
||||
DEBUG_PRINTF("AVX512 registers not enabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ECX and EDX contain capability flags */
|
||||
ecx = 0;
|
||||
cpuid(7, 0, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
if (!(ebx & CPUID_AVX512F)) {
|
||||
DEBUG_PRINTF("AVX512F (AVX512 Foundation) instructions not enabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(ebx & CPUID_AVX512BW)) {
|
||||
DEBUG_PRINTF("AVX512BW instructions not enabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ecx & CPUID_AVX512VBMI) {
|
||||
DEBUG_PRINTF("AVX512VBMI instructions enabled\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
int check_ssse3(void) {
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
Reference in New Issue
Block a user