@@ -48,7 +48,7 @@ int VM_Version::_stepping;
4848bool VM_Version::_has_intel_jcc_erratum;
4949VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0 , };
5050
51- #define DECLARE_CPU_FEATURE_NAME (id, name, bit ) name,
51+ #define DECLARE_CPU_FEATURE_NAME (id, name, bit ) XSTR( name) ,
5252const char * VM_Version::_features_names[] = { CPU_FEATURE_FLAGS (DECLARE_CPU_FEATURE_NAME)};
5353#undef DECLARE_CPU_FEATURE_NAME
5454
@@ -3297,12 +3297,50 @@ bool VM_Version::is_intrinsic_supported(vmIntrinsicID id) {
32973297void VM_Version::insert_features_names (VM_Version::VM_Features features, stringStream& ss) {
32983298 int i = 0 ;
32993299 ss.join ([&]() {
3300- while (i < MAX_CPU_FEATURES) {
3301- if (_features.supports_feature ((VM_Version::Feature_Flag)i)) {
3302- return _features_names[i++];
3300+ const char * str = nullptr ;
3301+ while ((i < MAX_CPU_FEATURES) && (str == nullptr )) {
3302+ if (features.supports_feature ((VM_Version::Feature_Flag)i)) {
3303+ str = _features_names[i];
33033304 }
33043305 i += 1 ;
33053306 }
3306- return ( const char *) nullptr ;
3307+ return str ;
33073308 }, " , " );
33083309}
3310+
3311+ void VM_Version::get_cpu_features_name (void * features_buffer, stringStream& ss) {
3312+ VM_Features* features = (VM_Features*)features_buffer;
3313+ insert_features_names (*features, ss);
3314+ }
3315+
3316+ void VM_Version::get_missing_features_name (void * features_set1, void * features_set2, stringStream& ss) {
3317+ VM_Features* vm_features_set1 = (VM_Features*)features_set1;
3318+ VM_Features* vm_features_set2 = (VM_Features*)features_set2;
3319+ int i = 0 ;
3320+ ss.join ([&]() {
3321+ const char * str = nullptr ;
3322+ while ((i < MAX_CPU_FEATURES) && (str == nullptr )) {
3323+ Feature_Flag flag = (Feature_Flag)i;
3324+ if (vm_features_set1->supports_feature (flag) && !vm_features_set2->supports_feature (flag)) {
3325+ str = _features_names[i];
3326+ }
3327+ i += 1 ;
3328+ }
3329+ return str;
3330+ }, " , " );
3331+ }
3332+
3333+ int VM_Version::cpu_features_size () {
3334+ return sizeof (VM_Features);
3335+ }
3336+
3337+ void VM_Version::store_cpu_features (void * buf) {
3338+ VM_Features copy = _features;
3339+ copy.clear_feature (CPU_HT); // HT does not result in incompatibility of aot code cache
3340+ memcpy (buf, ©, sizeof (VM_Features));
3341+ }
3342+
3343+ bool VM_Version::supports_features (void * features_buffer) {
3344+ VM_Features* features_to_test = (VM_Features*)features_buffer;
3345+ return _features.supports_features (features_to_test);
3346+ }
0 commit comments