< prev index next >

src/hotspot/cpu/x86/vm_version_x86.cpp

Print this page

  31 #include "logging/log.hpp"
  32 #include "logging/logStream.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "memory/universe.hpp"
  35 #include "runtime/globals_extension.hpp"
  36 #include "runtime/java.hpp"
  37 #include "runtime/os.inline.hpp"
  38 #include "runtime/stubCodeGenerator.hpp"
  39 #include "runtime/vm_version.hpp"
  40 #include "utilities/checkedCast.hpp"
  41 #include "utilities/ostream.hpp"
  42 #include "utilities/powerOfTwo.hpp"
  43 #include "utilities/virtualizationSupport.hpp"
  44 
  45 int VM_Version::_cpu;
  46 int VM_Version::_model;
  47 int VM_Version::_stepping;
  48 bool VM_Version::_has_intel_jcc_erratum;
  49 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
  50 
  51 #define DECLARE_CPU_FEATURE_NAME(id, name, bit) name,
  52 const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
  53 #undef DECLARE_CPU_FEATURE_NAME
  54 
  55 // Address of instruction which causes SEGV
  56 address VM_Version::_cpuinfo_segv_addr = nullptr;
  57 // Address of instruction after the one which causes SEGV
  58 address VM_Version::_cpuinfo_cont_addr = nullptr;
  59 // Address of instruction which causes APX specific SEGV
  60 address VM_Version::_cpuinfo_segv_addr_apx = nullptr;
  61 // Address of instruction after the one which causes APX specific SEGV
  62 address VM_Version::_cpuinfo_cont_addr_apx = nullptr;
  63 
  64 static BufferBlob* stub_blob;
  65 static const int stub_size = 2550;
  66 
  67 int VM_Version::VM_Features::_features_bitmap_size = sizeof(VM_Version::VM_Features::_features_bitmap) / BytesPerLong;
  68 
  69 VM_Version::VM_Features VM_Version::_features;
  70 VM_Version::VM_Features VM_Version::_cpu_features;
  71 

3277 }
3278 
3279 bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) {
3280   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
3281   switch (id) {
3282   case vmIntrinsics::_floatToFloat16:
3283   case vmIntrinsics::_float16ToFloat:
3284     if (!supports_float16()) {
3285       return false;
3286     }
3287     break;
3288   default:
3289     break;
3290   }
3291   return true;
3292 }
3293 
3294 void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
3295   int i = 0;
3296   ss.join([&]() {
3297     while (i < MAX_CPU_FEATURES) {
3298       if (_features.supports_feature((VM_Version::Feature_Flag)i)) {
3299         return _features_names[i++];

3300       }
3301       i += 1;
3302     }
3303     return (const char*)nullptr;
3304   }, ", ");
3305 }





































  31 #include "logging/log.hpp"
  32 #include "logging/logStream.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "memory/universe.hpp"
  35 #include "runtime/globals_extension.hpp"
  36 #include "runtime/java.hpp"
  37 #include "runtime/os.inline.hpp"
  38 #include "runtime/stubCodeGenerator.hpp"
  39 #include "runtime/vm_version.hpp"
  40 #include "utilities/checkedCast.hpp"
  41 #include "utilities/ostream.hpp"
  42 #include "utilities/powerOfTwo.hpp"
  43 #include "utilities/virtualizationSupport.hpp"
  44 
  45 int VM_Version::_cpu;
  46 int VM_Version::_model;
  47 int VM_Version::_stepping;
  48 bool VM_Version::_has_intel_jcc_erratum;
  49 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
  50 
  51 #define DECLARE_CPU_FEATURE_NAME(id, name, bit) XSTR(name),
  52 const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_NAME)};
  53 #undef DECLARE_CPU_FEATURE_NAME
  54 
  55 // Address of instruction which causes SEGV
  56 address VM_Version::_cpuinfo_segv_addr = nullptr;
  57 // Address of instruction after the one which causes SEGV
  58 address VM_Version::_cpuinfo_cont_addr = nullptr;
  59 // Address of instruction which causes APX specific SEGV
  60 address VM_Version::_cpuinfo_segv_addr_apx = nullptr;
  61 // Address of instruction after the one which causes APX specific SEGV
  62 address VM_Version::_cpuinfo_cont_addr_apx = nullptr;
  63 
  64 static BufferBlob* stub_blob;
  65 static const int stub_size = 2550;
  66 
  67 int VM_Version::VM_Features::_features_bitmap_size = sizeof(VM_Version::VM_Features::_features_bitmap) / BytesPerLong;
  68 
  69 VM_Version::VM_Features VM_Version::_features;
  70 VM_Version::VM_Features VM_Version::_cpu_features;
  71 

3277 }
3278 
3279 bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) {
3280   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
3281   switch (id) {
3282   case vmIntrinsics::_floatToFloat16:
3283   case vmIntrinsics::_float16ToFloat:
3284     if (!supports_float16()) {
3285       return false;
3286     }
3287     break;
3288   default:
3289     break;
3290   }
3291   return true;
3292 }
3293 
3294 void VM_Version::insert_features_names(VM_Version::VM_Features features, stringStream& ss) {
3295   int i = 0;
3296   ss.join([&]() {
3297     const char* str = nullptr;
3298     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
3299       if (features.supports_feature((VM_Version::Feature_Flag)i)) {
3300         str = _features_names[i];
3301       }
3302       i += 1;
3303     }
3304     return str;
3305   }, ", ");
3306 }
3307 
3308 void VM_Version::get_cpu_features_name(void* features_buffer, stringStream& ss) {
3309   VM_Features* features = (VM_Features*)features_buffer;
3310   insert_features_names(*features, ss);
3311 }
3312 
3313 void VM_Version::get_missing_features_name(void* features_buffer, stringStream& ss) {
3314   VM_Features* features_to_test = (VM_Features*)features_buffer;
3315   int i = 0;
3316   ss.join([&]() {
3317     const char* str = nullptr;
3318     while ((i < MAX_CPU_FEATURES) && (str == nullptr)) {
3319       Feature_Flag flag = (Feature_Flag)i;
3320       if (features_to_test->supports_feature(flag) && !_features.supports_feature(flag)) {
3321         str = _features_names[i];
3322       }
3323       i += 1;
3324     }
3325     return str;
3326   }, ", ");
3327 }
3328 
3329 int VM_Version::cpu_features_size() {
3330   return sizeof(VM_Features);
3331 }
3332 
3333 void VM_Version::store_cpu_features(void* buf) {
3334   VM_Features copy = _features;
3335   copy.clear_feature(CPU_HT); // HT does not result in incompatibility of aot code cache
3336   memcpy(buf, &copy, sizeof(VM_Features));
3337 }
3338 
3339 bool VM_Version::supports_features(void* features_buffer) {
3340   VM_Features* features_to_test = (VM_Features*)features_buffer;
3341   return _features.supports_features(features_to_test);
3342 }
< prev index next >