--- a/src/hotspot/cpu/aarch64/aarch64.ad Tue Aug 20 10:46:23 2019 +0200
+++ b/src/hotspot/cpu/aarch64/aarch64.ad Tue Aug 20 10:11:53 2019 +0100
@@ -2185,17 +2185,21 @@
//=============================================================================
const bool Matcher::match_rule_supported(int opcode) {
-
+ if (!has_match_rule(opcode))
+ return false;
+
+ bool ret_value = true;
switch (opcode) {
- default:
- break;
+ case Op_CacheWB:
+ case Op_CacheWBPreSync:
+ case Op_CacheWBPostSync:
+ if (!VM_Version::supports_data_cache_line_flush()) {
+ ret_value = false;
+ }
+ break;
}
- if (!has_match_rule(opcode)) {
- return false;
- }
-
- return true; // Per default match rules are supported.
+ return ret_value; // Per default match rules are supported.
}
const bool Matcher::match_rule_supported_vector(int opcode, int vlen) {
@@ -7769,6 +7773,47 @@
// ---------------- end of volatile loads and stores ----------------
+instruct cacheWB(indirect addr)
+%{
+ predicate(VM_Version::supports_data_cache_line_flush());
+ match(CacheWB addr);
+
+ ins_cost(100);
+ format %{"cache wb $addr" %}
+ ins_encode %{
+ assert($addr->index_position() < 0, "should be");
+ assert($addr$$disp == 0, "should be");
+ __ cache_wb(Address($addr$$base$$Register, 0));
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
+instruct cacheWBPreSync()
+%{
+ predicate(VM_Version::supports_data_cache_line_flush());
+ match(CacheWBPreSync);
+
+ ins_cost(100);
+ format %{"cache wb presync" %}
+ ins_encode %{
+ __ cache_wbsync(true);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
+instruct cacheWBPostSync()
+%{
+ predicate(VM_Version::supports_data_cache_line_flush());
+ match(CacheWBPostSync);
+
+ ins_cost(100);
+ format %{"cache wb postsync" %}
+ ins_encode %{
+ __ cache_wbsync(false);
+ %}
+ ins_pipe(pipe_slow); // XXX
+%}
+
// ============================================================================
// BSWAP Instructions