mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 01:54:47 +02:00
8241433: x86: Add VBMI CPU feature detection
Reviewed-by: kvn
This commit is contained in:
parent
d743518243
commit
7753422909
4 changed files with 42 additions and 19 deletions
|
@ -75,6 +75,15 @@
|
|||
declare_preprocessor_constant("VM_Version::CPU_AVX512VL", CPU_AVX512VL) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_SHA", CPU_SHA) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FMA", CPU_FMA) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_VZEROUPPER", CPU_VZEROUPPER)
|
||||
declare_preprocessor_constant("VM_Version::CPU_VZEROUPPER", CPU_VZEROUPPER) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VPOPCNTDQ", CPU_AVX512_VPOPCNTDQ) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VPCLMULQDQ", CPU_AVX512_VPCLMULQDQ) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VAES", CPU_AVX512_VAES) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VNNI", CPU_AVX512_VNNI) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FLUSH", CPU_FLUSH) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FLUSHOPT", CPU_FLUSHOPT) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_CLWB", CPU_CLWB) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VBMI2", CPU_AVX512_VBMI2) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VBMI", CPU_AVX512_VBMI)
|
||||
|
||||
#endif // CPU_X86_VMSTRUCTS_X86_HPP
|
||||
|
|
|
@ -702,6 +702,7 @@ void VM_Version::get_processor_features() {
|
|||
_features &= ~CPU_AVX512_VPCLMULQDQ;
|
||||
_features &= ~CPU_AVX512_VAES;
|
||||
_features &= ~CPU_AVX512_VNNI;
|
||||
_features &= ~CPU_AVX512_VBMI;
|
||||
_features &= ~CPU_AVX512_VBMI2;
|
||||
}
|
||||
|
||||
|
@ -733,7 +734,7 @@ void VM_Version::get_processor_features() {
|
|||
char buf[512];
|
||||
int res = jio_snprintf(buf, sizeof(buf),
|
||||
"(%u cores per cpu, %u threads per core) family %d model %d stepping %d"
|
||||
"%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s",
|
||||
"%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s",
|
||||
|
||||
cores_per_cpu(), threads_per_core(),
|
||||
cpu_family(), _model, _stepping,
|
||||
|
@ -779,9 +780,10 @@ void VM_Version::get_processor_features() {
|
|||
(supports_avx512vl() ? ", avx512vl" : ""),
|
||||
(supports_avx512_vpopcntdq() ? ", avx512_vpopcntdq" : ""),
|
||||
(supports_avx512_vpclmulqdq() ? ", avx512_vpclmulqdq" : ""),
|
||||
(supports_avx512_vbmi() ? ", avx512_vbmi" : ""),
|
||||
(supports_avx512_vbmi2() ? ", avx512_vbmi2" : ""),
|
||||
(supports_avx512_vaes() ? ", avx512_vaes" : ""),
|
||||
|
||||
(supports_avx512_vaes() ? ", avx512_vaes" : ""),
|
||||
(supports_avx512_vnni() ? ", avx512_vnni" : ""),
|
||||
(supports_sha() ? ", sha" : ""),
|
||||
(supports_fma() ? ", fma" : ""),
|
||||
|
|
|
@ -334,22 +334,22 @@ protected:
|
|||
// Keeping sign bit 31 unassigned.
|
||||
};
|
||||
|
||||
#define CPU_AVX512BW ((uint64_t)UCONST64(0x100000000)) // enums are limited to 31 bit
|
||||
#define CPU_AVX512VL ((uint64_t)UCONST64(0x200000000)) // EVEX instructions with smaller vector length
|
||||
#define CPU_SHA ((uint64_t)UCONST64(0x400000000)) // SHA instructions
|
||||
#define CPU_FMA ((uint64_t)UCONST64(0x800000000)) // FMA instructions
|
||||
#define CPU_VZEROUPPER ((uint64_t)UCONST64(0x1000000000)) // Vzeroupper instruction
|
||||
#define CPU_AVX512_VPOPCNTDQ ((uint64_t)UCONST64(0x2000000000)) // Vector popcount
|
||||
#define CPU_AVX512_VPCLMULQDQ ((uint64_t)UCONST64(0x4000000000)) // Vector carryless multiplication
|
||||
#define CPU_AVX512_VAES ((uint64_t)UCONST64(0x8000000000)) // Vector AES instructions
|
||||
#define CPU_AVX512_VNNI ((uint64_t)UCONST64(0x10000000000)) // Vector Neural Network Instructions
|
||||
#define CPU_AVX512BW ((uint64_t)UCONST64( 0x100000000)) // enums are limited to 31 bit
|
||||
#define CPU_AVX512VL ((uint64_t)UCONST64( 0x200000000)) // EVEX instructions with smaller vector length
|
||||
#define CPU_SHA ((uint64_t)UCONST64( 0x400000000)) // SHA instructions
|
||||
#define CPU_FMA ((uint64_t)UCONST64( 0x800000000)) // FMA instructions
|
||||
#define CPU_VZEROUPPER ((uint64_t)UCONST64( 0x1000000000)) // Vzeroupper instruction
|
||||
#define CPU_AVX512_VPOPCNTDQ ((uint64_t)UCONST64( 0x2000000000)) // Vector popcount
|
||||
#define CPU_AVX512_VPCLMULQDQ ((uint64_t)UCONST64( 0x4000000000)) // Vector carryless multiplication
|
||||
#define CPU_AVX512_VAES ((uint64_t)UCONST64( 0x8000000000)) // Vector AES instructions
|
||||
#define CPU_AVX512_VNNI ((uint64_t)UCONST64( 0x10000000000)) // Vector Neural Network Instructions
|
||||
#define CPU_FLUSH ((uint64_t)UCONST64( 0x20000000000)) // flush instruction
|
||||
#define CPU_FLUSHOPT ((uint64_t)UCONST64( 0x40000000000)) // flushopt instruction
|
||||
#define CPU_CLWB ((uint64_t)UCONST64( 0x80000000000)) // clwb instruction
|
||||
#define CPU_AVX512_VBMI2 ((uint64_t)UCONST64(0x100000000000)) // VBMI2 shift left double instructions
|
||||
#define CPU_AVX512_VBMI ((uint64_t)UCONST64(0x200000000000)) // Vector BMI instructions
|
||||
|
||||
#define CPU_FLUSH ((uint64_t)UCONST64(0x20000000000)) // flush instruction
|
||||
#define CPU_FLUSHOPT ((uint64_t)UCONST64(0x40000000000)) // flushopt instruction
|
||||
#define CPU_CLWB ((uint64_t)UCONST64(0x80000000000)) // clwb instruction
|
||||
|
||||
// NB! When adding new CPU feature detection consider updating feature string in VM_Version::get_processor_features().
|
||||
// NB! When adding new CPU feature detection consider updating vmStructs_x86.hpp, vmStructs_jvmci.hpp, and VM_Version::get_processor_features().
|
||||
|
||||
enum Extended_Family {
|
||||
// AMD
|
||||
|
@ -574,6 +574,8 @@ enum Extended_Family {
|
|||
result |= CPU_AVX512_VAES;
|
||||
if (_cpuid_info.sef_cpuid7_ecx.bits.avx512_vnni != 0)
|
||||
result |= CPU_AVX512_VNNI;
|
||||
if (_cpuid_info.sef_cpuid7_ecx.bits.avx512_vbmi != 0)
|
||||
result |= CPU_AVX512_VBMI;
|
||||
if (_cpuid_info.sef_cpuid7_ecx.bits.avx512_vbmi2 != 0)
|
||||
result |= CPU_AVX512_VBMI2;
|
||||
}
|
||||
|
@ -867,6 +869,7 @@ public:
|
|||
static bool supports_avx512_vpclmulqdq() { return (_features & CPU_AVX512_VPCLMULQDQ) != 0; }
|
||||
static bool supports_avx512_vaes() { return (_features & CPU_AVX512_VAES) != 0; }
|
||||
static bool supports_avx512_vnni() { return (_features & CPU_AVX512_VNNI) != 0; }
|
||||
static bool supports_avx512_vbmi() { return (_features & CPU_AVX512_VBMI) != 0; }
|
||||
static bool supports_avx512_vbmi2() { return (_features & CPU_AVX512_VBMI2) != 0; }
|
||||
|
||||
// Intel features
|
||||
|
|
|
@ -777,7 +777,16 @@
|
|||
declare_preprocessor_constant("VM_Version::CPU_AVX512VL", CPU_AVX512VL) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_SHA", CPU_SHA) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FMA", CPU_FMA) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_VZEROUPPER", CPU_VZEROUPPER)
|
||||
declare_preprocessor_constant("VM_Version::CPU_VZEROUPPER", CPU_VZEROUPPER) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VPOPCNTDQ", CPU_AVX512_VPOPCNTDQ) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VPCLMULQDQ", CPU_AVX512_VPCLMULQDQ) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VAES", CPU_AVX512_VAES) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VNNI", CPU_AVX512_VNNI) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FLUSH", CPU_FLUSH) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FLUSHOPT", CPU_FLUSHOPT) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_CLWB", CPU_CLWB) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VBMI2", CPU_AVX512_VBMI2) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512_VBMI", CPU_AVX512_VBMI)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue