< prev index next >
src/hotspot/cpu/ppc/vm_version_ppc.cpp
Print this page
@@ -65,11 +65,13 @@
// Test which instructions are supported and measure cache line size.
determine_features();
// If PowerArchitecturePPC64 hasn't been specified explicitly determine from features.
if (FLAG_IS_DEFAULT(PowerArchitecturePPC64)) {
- if (VM_Version::has_darn()) {
+ if (VM_Version::has_brw()) {
+ FLAG_SET_ERGO(PowerArchitecturePPC64, 10);
+ } else if (VM_Version::has_darn()) {
FLAG_SET_ERGO(PowerArchitecturePPC64, 9);
} else if (VM_Version::has_lqarx()) {
FLAG_SET_ERGO(PowerArchitecturePPC64, 8);
} else if (VM_Version::has_popcntw()) {
FLAG_SET_ERGO(PowerArchitecturePPC64, 7);
@@ -82,10 +84,11 @@
}
}
bool PowerArchitecturePPC64_ok = false;
switch (PowerArchitecturePPC64) {
+ case 10: if (!VM_Version::has_brw() ) break;
case 9: if (!VM_Version::has_darn() ) break;
case 8: 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;
@@ -140,10 +143,13 @@
FLAG_SET_ERGO(UseCharacterCompareIntrinsics, true);
}
if (FLAG_IS_DEFAULT(UseVectorByteReverseInstructionsPPC64)) {
FLAG_SET_ERGO(UseVectorByteReverseInstructionsPPC64, true);
}
+ if (FLAG_IS_DEFAULT(UseBASE64Intrinsics)) {
+ FLAG_SET_ERGO(UseBASE64Intrinsics, true);
+ }
} else {
if (UseCountTrailingZerosInstructionsPPC64) {
warning("UseCountTrailingZerosInstructionsPPC64 specified, but needs at least Power9.");
FLAG_SET_DEFAULT(UseCountTrailingZerosInstructionsPPC64, false);
}
@@ -153,17 +159,21 @@
}
if (UseVectorByteReverseInstructionsPPC64) {
warning("UseVectorByteReverseInstructionsPPC64 specified, but needs at least Power9.");
FLAG_SET_DEFAULT(UseVectorByteReverseInstructionsPPC64, false);
}
+ if (UseBASE64Intrinsics) {
+ warning("UseBASE64Intrinsics specified, but needs at least Power9.");
+ FLAG_SET_DEFAULT(UseCharacterCompareIntrinsics, false);
+ }
}
#endif
// Create and print feature-string.
char buf[(num_features+1) * 16]; // Max 16 chars per feature.
jio_snprintf(buf, sizeof(buf),
- "ppc64%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ "ppc64%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
(has_fsqrt() ? " fsqrt" : ""),
(has_isel() ? " isel" : ""),
(has_lxarxeh() ? " lxarxeh" : ""),
(has_cmpb() ? " cmpb" : ""),
(has_popcntb() ? " popcntb" : ""),
@@ -177,11 +187,12 @@
(has_vsx() ? " vsx" : ""),
(has_ldbrx() ? " ldbrx" : ""),
(has_stdbrx() ? " stdbrx" : ""),
(has_vshasig() ? " sha" : ""),
(has_tm() ? " rtm" : ""),
- (has_darn() ? " darn" : "")
+ (has_darn() ? " darn" : ""),
+ (has_brw() ? " brw" : "")
// Make sure number of %s matches num_features!
);
_features_string = os::strdup(buf);
if (Verbose) {
print_features();
@@ -833,10 +844,11 @@
a->ldbrx(R7, R3_ARG1, R4_ARG2); // code[14] -> ldbrx
a->stdbrx(R7, R3_ARG1, R4_ARG2); // code[15] -> stdbrx
a->vshasigmaw(VR0, VR1, 1, 0xF); // code[16] -> vshasig
// rtm is determined by OS
a->darn(R7); // code[17] -> darn
+ a->brw(R5, R6); // code[18] -> brw
a->blr();
// Emit function to set one cache line to zero. Emit function descriptor and get pointer to it.
void (*zero_cacheline_func_ptr)(char*) = (void(*)(char*))(void *)a->function_entry();
a->dcbz(R3_ARG1); // R3_ARG1 = addr
@@ -886,10 +898,11 @@
if (code[feature_cntr++]) features |= ldbrx_m;
if (code[feature_cntr++]) features |= stdbrx_m;
if (code[feature_cntr++]) features |= vshasig_m;
// feature rtm_m is determined by OS
if (code[feature_cntr++]) features |= darn_m;
+ if (code[feature_cntr++]) features |= brw_m;
// Print the detection code.
if (PrintAssembly) {
ttyLocker ttyl;
tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " after execution:", p2i(code));
< prev index next >