--- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Fri Dec 04 14:06:38 2015 +0100
+++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Fri Dec 04 16:38:04 2015 +0100
@@ -38,7 +38,6 @@
# include <sys/sysinfo.h>
int VM_Version::_features = VM_Version::unknown_m;
-int VM_Version::_measured_cache_line_size = 32; // pessimistic init value
const char* VM_Version::_features_str = "";
bool VM_Version::_is_determine_features_test_running = false;
@@ -56,7 +55,7 @@
// If PowerArchitecturePPC64 hasn't been specified explicitly determine from features.
if (FLAG_IS_DEFAULT(PowerArchitecturePPC64)) {
- if (VM_Version::has_lqarx()) {
+ if (VM_Version::has_tcheck() && VM_Version::has_lqarx()) {
FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 8);
} else if (VM_Version::has_popcntw()) {
FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 7);
@@ -68,10 +67,19 @@
FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 0);
}
}
- guarantee(PowerArchitecturePPC64 == 0 || PowerArchitecturePPC64 == 5 ||
- PowerArchitecturePPC64 == 6 || PowerArchitecturePPC64 == 7 ||
- PowerArchitecturePPC64 == 8,
- "PowerArchitecturePPC64 should be 0, 5, 6, 7, or 8");
+
+ bool PowerArchitecturePPC64_ok = false;
+ switch (PowerArchitecturePPC64) {
+ case 8: if (!VM_Version::has_tcheck() ) break;
+ if (!VM_Version::has_lqarx() ) break;
+ case 7: if (!VM_Version::has_popcntw()) break;
+ case 6: if (!VM_Version::has_cmpb() ) break;
+ case 5: if (!VM_Version::has_popcntb()) break;
+ case 0: PowerArchitecturePPC64_ok = true; break;
+ default: break;
+ }
+ guarantee(PowerArchitecturePPC64_ok, "PowerArchitecturePPC64 cannot be set to "
+ UINTX_FORMAT " on this machine", PowerArchitecturePPC64);
// Power 8: Configure Data Stream Control Register.
if (PowerArchitecturePPC64 >= 8) {
@@ -132,9 +140,15 @@
// and 'atomic long memory ops' (see Unsafe_GetLongVolatile).
_supports_cx8 = true;
+ // Used by C1.
+ _supports_atomic_getset4 = true;
+ _supports_atomic_getadd4 = true;
+ _supports_atomic_getset8 = true;
+ _supports_atomic_getadd8 = true;
+
UseSSE = 0; // Only on x86 and x64
- intx cache_line_size = _measured_cache_line_size;
+ intx cache_line_size = L1_data_cache_line_size();
if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) AllocatePrefetchStyle = 1;
@@ -261,11 +275,9 @@
}
}
- // This machine does not allow unaligned memory accesses
- if (UseUnalignedAccesses) {
- if (!FLAG_IS_DEFAULT(UseUnalignedAccesses))
- warning("Unaligned memory access is not available on this CPU");
- FLAG_SET_DEFAULT(UseUnalignedAccesses, false);
+ // This machine allows unaligned memory accesses
+ if (FLAG_IS_DEFAULT(UseUnalignedAccesses)) {
+ FLAG_SET_DEFAULT(UseUnalignedAccesses, true);
}
}
@@ -291,7 +303,7 @@
}
void VM_Version::print_features() {
- tty->print_cr("Version: %s cache_line_size = %d", cpu_features(), (int) get_cache_line_size());
+ tty->print_cr("Version: %s L1_data_cache_line_size=%d", cpu_features(), L1_data_cache_line_size());
}
#ifdef COMPILER2
@@ -592,7 +604,7 @@
int count = 0; // count zeroed bytes
for (int i = 0; i < BUFFER_SIZE; i++) if (test_area[i] == 0) count++;
guarantee(is_power_of_2(count), "cache line size needs to be a power of 2");
- _measured_cache_line_size = count;
+ _L1_data_cache_line_size = count;
// Execute code. Illegal instructions will be replaced by 0 in the signal handler.
VM_Version::_is_determine_features_test_running = true;