< prev index next > src/hotspot/cpu/x86/vm_version_x86.cpp
Print this page
int VM_Version::_model;
int VM_Version::_stepping;
bool VM_Version::_has_intel_jcc_erratum;
VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
! #define DECLARE_CPU_FEATURE_NAME(id, name, bit) name,
const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
#undef DECLARE_CPU_FEATURE_NAME
// Address of instruction which causes SEGV
address VM_Version::_cpuinfo_segv_addr = nullptr;
int VM_Version::_model;
int VM_Version::_stepping;
bool VM_Version::_has_intel_jcc_erratum;
VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
! #define DECLARE_CPU_FEATURE_NAME(id, name, bit) XSTR(name),
const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
#undef DECLARE_CPU_FEATURE_NAME
// Address of instruction which causes SEGV
address VM_Version::_cpuinfo_segv_addr = nullptr;
}
void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
int i = 0;
ss.join([&]() {
! while (i < MAX_CPU_FEATURES) {
! if (_features.supports_feature((VM_Version::Feature_Flag)i)) {
! return _features_names[i++];
}
i += 1;
}
! return (const char*)nullptr;
}, ", ");
}
}
void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
int i = 0;
ss.join([&]() {
! const char* str = nullptr;
! while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
! if (features.supports_feature((VM_Version::Feature_Flag)i)) {
+ str = _features_names[i];
}
i += 1;
}
! return str;
}, ", ");
}
+
+ void VM_Version::get_cpu_features_name(void* features_buffer, stringStream& ss) {
+ VM_Features* features = (VM_Features*)features_buffer;
+ insert_features_names(*features, ss);
+ }
+
+ void VM_Version::get_missing_features_name(void* features_buffer, stringStream& ss) {
+ VM_Features* features_to_test = (VM_Features*)features_buffer;
+ int i = 0;
+ ss.join([&]() {
+ const char* str = nullptr;
+ while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
+ Feature_Flag flag = (Feature_Flag)i;
+ if (features_to_test->supports_feature(flag) && !_features.supports_feature(flag)) {
+ str = _features_names[i];
+ }
+ i += 1;
+ }
+ return str;
+ }, ", ");
+ }
+
+ int VM_Version::cpu_features_size() {
+ return sizeof(VM_Features);
+ }
+
+ void VM_Version::store_cpu_features(void* buf) {
+ VM_Features copy = _features;
+ copy.clear_feature(CPU_HT); // HT does not result in incompatibility of aot code cache
+ memcpy(buf, ©, sizeof(VM_Features));
+ }
+
+ bool VM_Version::supports_features(void* features_buffer) {
+ VM_Features* features_to_test = (VM_Features*)features_buffer;
+ return _features.supports_features(features_to_test);
+ }
< prev index next >