src/hotspot/cpu/x86/gc/z/z_x86_64.ad
author neliasso
Thu, 14 Feb 2019 14:54:05 +0100
changeset 55307 ed12027517c0
parent 53844 8323fdac6da5
child 55563 d56b192c73e9
permissions -rw-r--r--
8224675: Late GC barrier insertion for ZGC Reviewed-by: roland, eosterlund, pliden
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     1
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     2
// Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     3
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     4
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     5
// This code is free software; you can redistribute it and/or modify it
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     6
// under the terms of the GNU General Public License version 2 only, as
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     7
// published by the Free Software Foundation.
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     8
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
     9
// This code is distributed in the hope that it will be useful, but WITHOUT
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    10
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    11
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    12
// version 2 for more details (a copy is included in the LICENSE file that
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    13
// accompanied this code).
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    14
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    15
// You should have received a copy of the GNU General Public License version
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    16
// 2 along with this work; if not, write to the Free Software Foundation,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    17
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    18
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    19
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    20
// or visit www.oracle.com if you need additional information or have any
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    21
// questions.
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    22
//
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    23
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    24
source_hpp %{
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    25
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    26
#include "gc/z/c2/zBarrierSetC2.hpp"
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    27
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    28
%}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    29
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    30
source %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    31
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    32
#include "gc/z/zBarrierSetAssembler.hpp"
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    33
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    34
static void z_load_barrier_slow_reg(MacroAssembler& _masm, Register dst, Address src, bool weak) {
53844
8323fdac6da5 8218767: ZGC: Do not assume that r12 is a special register in C2
pliden
parents: 53542
diff changeset
    35
  assert(dst != rsp, "Invalid register");
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    36
  assert(dst != r15, "Invalid register");
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    37
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    38
  const address stub = weak ? ZBarrierSet::assembler()->load_barrier_weak_slow_stub(dst)
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    39
                            : ZBarrierSet::assembler()->load_barrier_slow_stub(dst);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    40
  __ lea(dst, src);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    41
  __ call(RuntimeAddress(stub));
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    42
}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    43
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    44
%}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    45
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    46
// For XMM and YMM enabled processors
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    47
instruct zLoadBarrierSlowRegXmmAndYmm(rRegP dst, memory src, rFlagsReg cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    48
                                      rxmm0 x0, rxmm1 x1, rxmm2 x2,rxmm3 x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    49
                                      rxmm4 x4, rxmm5 x5, rxmm6 x6, rxmm7 x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    50
                                      rxmm8 x8, rxmm9 x9, rxmm10 x10, rxmm11 x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    51
                                      rxmm12 x12, rxmm13 x13, rxmm14 x14, rxmm15 x15) %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    52
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    53
  match(Set dst (LoadBarrierSlowReg src));
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    54
  predicate((UseAVX <= 2) && !n->as_LoadBarrierSlowReg()->is_weak());
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    55
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    56
  effect(DEF dst, KILL cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    57
         KILL x0, KILL x1, KILL x2, KILL x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    58
         KILL x4, KILL x5, KILL x6, KILL x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    59
         KILL x8, KILL x9, KILL x10, KILL x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    60
         KILL x12, KILL x13, KILL x14, KILL x15);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    61
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    62
  format %{ "zLoadBarrierSlowRegXmmAndYmm $dst, $src" %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    63
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    64
  ins_encode %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    65
    z_load_barrier_slow_reg(_masm, $dst$$Register, $src$$Address, false /* weak */);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    66
  %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    67
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    68
  ins_pipe(pipe_slow);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    69
%}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    70
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    71
// For ZMM enabled processors
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    72
instruct zLoadBarrierSlowRegZmm(rRegP dst, memory src, rFlagsReg cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    73
                                rxmm0 x0, rxmm1 x1, rxmm2 x2,rxmm3 x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    74
                                rxmm4 x4, rxmm5 x5, rxmm6 x6, rxmm7 x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    75
                                rxmm8 x8, rxmm9 x9, rxmm10 x10, rxmm11 x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    76
                                rxmm12 x12, rxmm13 x13, rxmm14 x14, rxmm15 x15,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    77
                                rxmm16 x16, rxmm17 x17, rxmm18 x18, rxmm19 x19,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    78
                                rxmm20 x20, rxmm21 x21, rxmm22 x22, rxmm23 x23,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    79
                                rxmm24 x24, rxmm25 x25, rxmm26 x26, rxmm27 x27,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    80
                                rxmm28 x28, rxmm29 x29, rxmm30 x30, rxmm31 x31) %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    81
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    82
  match(Set dst (LoadBarrierSlowReg src));
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
    83
  predicate((UseAVX == 3) && !n->as_LoadBarrierSlowReg()->is_weak());
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    84
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    85
  effect(DEF dst, KILL cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    86
         KILL x0, KILL x1, KILL x2, KILL x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    87
         KILL x4, KILL x5, KILL x6, KILL x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    88
         KILL x8, KILL x9, KILL x10, KILL x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    89
         KILL x12, KILL x13, KILL x14, KILL x15,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    90
         KILL x16, KILL x17, KILL x18, KILL x19,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    91
         KILL x20, KILL x21, KILL x22, KILL x23,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    92
         KILL x24, KILL x25, KILL x26, KILL x27,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    93
         KILL x28, KILL x29, KILL x30, KILL x31);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    94
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    95
  format %{ "zLoadBarrierSlowRegZmm $dst, $src" %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    96
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    97
  ins_encode %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    98
    z_load_barrier_slow_reg(_masm, $dst$$Register, $src$$Address, false /* weak */);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
    99
  %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   100
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   101
  ins_pipe(pipe_slow);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   102
%}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   103
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   104
// For XMM and YMM enabled processors
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   105
instruct zLoadBarrierWeakSlowRegXmmAndYmm(rRegP dst, memory src, rFlagsReg cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   106
                                          rxmm0 x0, rxmm1 x1, rxmm2 x2,rxmm3 x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   107
                                          rxmm4 x4, rxmm5 x5, rxmm6 x6, rxmm7 x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   108
                                          rxmm8 x8, rxmm9 x9, rxmm10 x10, rxmm11 x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   109
                                          rxmm12 x12, rxmm13 x13, rxmm14 x14, rxmm15 x15) %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   110
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   111
  match(Set dst (LoadBarrierSlowReg src));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   112
  predicate((UseAVX <= 2) && n->as_LoadBarrierSlowReg()->is_weak());
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   113
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   114
  effect(DEF dst, KILL cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   115
         KILL x0, KILL x1, KILL x2, KILL x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   116
         KILL x4, KILL x5, KILL x6, KILL x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   117
         KILL x8, KILL x9, KILL x10, KILL x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   118
         KILL x12, KILL x13, KILL x14, KILL x15);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   119
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   120
  format %{ "zLoadBarrierWeakSlowRegXmmAndYmm $dst, $src" %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   121
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   122
  ins_encode %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   123
    z_load_barrier_slow_reg(_masm, $dst$$Register, $src$$Address, true /* weak */);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   124
  %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   125
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   126
  ins_pipe(pipe_slow);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   127
%}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   128
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   129
// For ZMM enabled processors
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   130
instruct zLoadBarrierWeakSlowRegZmm(rRegP dst, memory src, rFlagsReg cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   131
                                    rxmm0 x0, rxmm1 x1, rxmm2 x2,rxmm3 x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   132
                                    rxmm4 x4, rxmm5 x5, rxmm6 x6, rxmm7 x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   133
                                    rxmm8 x8, rxmm9 x9, rxmm10 x10, rxmm11 x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   134
                                    rxmm12 x12, rxmm13 x13, rxmm14 x14, rxmm15 x15,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   135
                                    rxmm16 x16, rxmm17 x17, rxmm18 x18, rxmm19 x19,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   136
                                    rxmm20 x20, rxmm21 x21, rxmm22 x22, rxmm23 x23,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   137
                                    rxmm24 x24, rxmm25 x25, rxmm26 x26, rxmm27 x27,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   138
                                    rxmm28 x28, rxmm29 x29, rxmm30 x30, rxmm31 x31) %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   139
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   140
  match(Set dst (LoadBarrierSlowReg src));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   141
  predicate((UseAVX == 3) && n->as_LoadBarrierSlowReg()->is_weak());
53542
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   142
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   143
  effect(DEF dst, KILL cr,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   144
         KILL x0, KILL x1, KILL x2, KILL x3,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   145
         KILL x4, KILL x5, KILL x6, KILL x7,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   146
         KILL x8, KILL x9, KILL x10, KILL x11,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   147
         KILL x12, KILL x13, KILL x14, KILL x15,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   148
         KILL x16, KILL x17, KILL x18, KILL x19,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   149
         KILL x20, KILL x21, KILL x22, KILL x23,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   150
         KILL x24, KILL x25, KILL x26, KILL x27,
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   151
         KILL x28, KILL x29, KILL x30, KILL x31);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   152
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   153
  format %{ "zLoadBarrierWeakSlowRegZmm $dst, $src" %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   154
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   155
  ins_encode %{
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   156
    z_load_barrier_slow_reg(_masm, $dst$$Register, $src$$Address, true /* weak */);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   157
  %}
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   158
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   159
  ins_pipe(pipe_slow);
5c80e6994d8a 8217856: ZGC: Break out C2 matching rules into separate AD file
pliden
parents:
diff changeset
   160
%}
55307
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   161
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   162
// Specialized versions of compareAndExchangeP that adds a keepalive that is consumed
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   163
// but doesn't affect output.
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   164
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   165
instruct z_compareAndExchangeP(
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   166
        memory mem_ptr,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   167
        rax_RegP oldval, rRegP newval, rRegP keepalive,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   168
        rFlagsReg cr) %{
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   169
    predicate(VM_Version::supports_cx8());
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   170
    match(Set oldval (ZCompareAndExchangeP (Binary mem_ptr keepalive) (Binary oldval newval)));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   171
    effect(KILL cr);
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   172
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   173
    format %{ "cmpxchgq $mem_ptr,$newval\t# "
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   174
              "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   175
    opcode(0x0F, 0xB1);
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   176
    ins_encode(lock_prefix,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   177
            REX_reg_mem_wide(newval, mem_ptr),
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   178
            OpcP, OpcS,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   179
            reg_mem(newval, mem_ptr)  // lock cmpxchg
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   180
    );
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   181
    ins_pipe( pipe_cmpxchg );
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   182
%}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   183
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   184
instruct z_compareAndSwapP(rRegI res,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   185
                         memory mem_ptr,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   186
                         rax_RegP oldval, rRegP newval, rRegP keepalive,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   187
                         rFlagsReg cr) %{
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   188
  predicate(VM_Version::supports_cx8());
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   189
  match(Set res (ZCompareAndSwapP (Binary mem_ptr keepalive) (Binary oldval newval)));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   190
  match(Set res (ZWeakCompareAndSwapP (Binary mem_ptr keepalive) (Binary oldval newval)));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   191
  effect(KILL cr, KILL oldval);
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   192
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   193
  format %{ "cmpxchgq $mem_ptr,$newval\t# "
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   194
            "If rax == $mem_ptr then store $newval into $mem_ptr\n\t"
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   195
            "sete    $res\n\t"
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   196
            "movzbl  $res, $res" %}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   197
  opcode(0x0F, 0xB1);
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   198
  ins_encode(lock_prefix,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   199
          REX_reg_mem_wide(newval, mem_ptr),
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   200
          OpcP, OpcS,
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   201
          reg_mem(newval, mem_ptr),
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   202
          REX_breg(res), Opcode(0x0F), Opcode(0x94), reg(res), // sete
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   203
          REX_reg_breg(res, res), // movzbl
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   204
          Opcode(0xF), Opcode(0xB6), reg_reg(res, res));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   205
  ins_pipe( pipe_cmpxchg );
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   206
%}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   207
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   208
instruct z_xchgP( memory mem, rRegP newval, rRegP keepalive) %{
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   209
  match(Set newval (ZGetAndSetP mem (Binary newval keepalive)));
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   210
  format %{ "XCHGQ  $newval,[$mem]" %}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   211
  ins_encode %{
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   212
    __ xchgq($newval$$Register, $mem$$Address);
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   213
  %}
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   214
  ins_pipe( pipe_cmpxchg );
ed12027517c0 8224675: Late GC barrier insertion for ZGC
neliasso
parents: 53844
diff changeset
   215
%}