src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
author zgu
Wed, 06 Nov 2019 09:50:53 -0500
changeset 58946 83810b7d12e7
parent 58916 7298f7c503b4
child 58985 5606867a5e6e
permissions -rw-r--r--
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code Reviewed-by: aph, shade, rkennke
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     1
/*
54763
2584e5772546 8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents: 54425
diff changeset
     2
 * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     3
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     6
 * published by the Free Software Foundation.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     7
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    12
 * accompanied this code).
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    13
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    17
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    20
 * questions.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    21
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    22
 */
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    23
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    24
#include "precompiled.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    25
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
    26
#include "gc/shenandoah/shenandoahConcurrentRoots.hpp"
54766
1321f8cf9de5 8223567: Rename ShenandoahBrooksPointer to ShenandoahForwarding
rkennke
parents: 54763
diff changeset
    27
#include "gc/shenandoah/shenandoahForwarding.hpp"
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
    28
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    29
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    30
#include "gc/shenandoah/shenandoahHeuristics.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    31
#include "gc/shenandoah/shenandoahRuntime.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    32
#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    33
#include "interpreter/interpreter.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    34
#include "interpreter/interp_masm.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    35
#include "runtime/sharedRuntime.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    36
#include "runtime/thread.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    37
#ifdef COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    38
#include "c1/c1_LIRAssembler.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    39
#include "c1/c1_MacroAssembler.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    40
#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    41
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    42
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    43
#define __ masm->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    44
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
    45
address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    46
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    47
void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
54979
f982c1a6582c 8224187: Refactor arraycopy_prologue to allow ZGC read barriers on arraycopy
smonteith
parents: 54766
diff changeset
    48
                                                       Register src, Register dst, Register count, RegSet saved_regs) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    49
  if (is_oop) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    50
    bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    51
    if ((ShenandoahSATBBarrier && !dest_uninitialized) || ShenandoahLoadRefBarrier) {
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    52
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    53
      Label done;
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    54
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    55
      // Avoid calling runtime if count == 0
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    56
      __ cbz(count, done);
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    57
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    58
      // Is marking active?
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    59
      Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    60
      __ ldrb(rscratch1, gc_state);
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    61
      if (dest_uninitialized) {
58737
a39cdab8fac1 8232778: Shenandoah: SBSA::arraycopy_prologue checks wrong register
shade
parents: 58725
diff changeset
    62
        __ tbz(rscratch1, ShenandoahHeap::HAS_FORWARDED_BITPOS, done);
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    63
      } else {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    64
        __ mov(rscratch2, ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::MARKING);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    65
        __ tst(rscratch1, rscratch2);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    66
        __ br(Assembler::EQ, done);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    67
      }
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    68
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    69
      __ push(saved_regs, sp);
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    70
      if (UseCompressedOops) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    71
        if (dest_uninitialized) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    72
          __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_duinit_narrow_oop_entry), src, dst, count);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    73
        } else {
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    74
          __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry), src, dst, count);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    75
        }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    76
      } else {
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    77
        if (dest_uninitialized) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    78
          __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_duinit_oop_entry), src, dst, count);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    79
        } else {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    80
          __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), src, dst, count);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    81
        }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    82
      }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    83
      __ pop(saved_regs, sp);
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    84
      __ bind(done);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    85
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    86
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    87
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    88
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    89
void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    90
                                                                 Register obj,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    91
                                                                 Register pre_val,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    92
                                                                 Register thread,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    93
                                                                 Register tmp,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    94
                                                                 bool tosca_live,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    95
                                                                 bool expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    96
  if (ShenandoahSATBBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    97
    satb_write_barrier_pre(masm, obj, pre_val, thread, tmp, tosca_live, expand_call);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    98
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    99
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   100
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   101
void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   102
                                                           Register obj,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   103
                                                           Register pre_val,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   104
                                                           Register thread,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   105
                                                           Register tmp,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   106
                                                           bool tosca_live,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   107
                                                           bool expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   108
  // If expand_call is true then we expand the call_VM_leaf macro
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   109
  // directly to skip generating the check by
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   110
  // InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   111
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   112
  assert(thread == rthread, "must be");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   113
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   114
  Label done;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   115
  Label runtime;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   116
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   117
  assert_different_registers(obj, pre_val, tmp, rscratch1);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   118
  assert(pre_val != noreg &&  tmp != noreg, "expecting a register");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   119
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   120
  Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   121
  Address index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   122
  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   123
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   124
  // Is marking active?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   125
  if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   126
    __ ldrw(tmp, in_progress);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   127
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   128
    assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   129
    __ ldrb(tmp, in_progress);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   130
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   131
  __ cbzw(tmp, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   132
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   133
  // Do we need to load the previous value?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   134
  if (obj != noreg) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   135
    __ load_heap_oop(pre_val, Address(obj, 0), noreg, noreg, AS_RAW);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   136
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   137
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   138
  // Is the previous value null?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   139
  __ cbz(pre_val, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   140
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   141
  // Can we store original value in the thread's buffer?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   142
  // Is index == 0?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   143
  // (The index field is typed as size_t.)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   144
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   145
  __ ldr(tmp, index);                      // tmp := *index_adr
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   146
  __ cbz(tmp, runtime);                    // tmp == 0?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   147
                                        // If yes, goto runtime
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   148
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   149
  __ sub(tmp, tmp, wordSize);              // tmp := tmp - wordSize
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   150
  __ str(tmp, index);                      // *index_adr := tmp
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   151
  __ ldr(rscratch1, buffer);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   152
  __ add(tmp, tmp, rscratch1);             // tmp := tmp + *buffer_adr
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   153
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   154
  // Record the previous value
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   155
  __ str(pre_val, Address(tmp, 0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   156
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   157
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   158
  __ bind(runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   159
  // save the live input values
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   160
  RegSet saved = RegSet::of(pre_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   161
  if (tosca_live) saved += RegSet::of(r0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   162
  if (obj != noreg) saved += RegSet::of(obj);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   163
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   164
  __ push(saved, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   165
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   166
  // Calling the runtime using the regular call_VM_leaf mechanism generates
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   167
  // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   168
  // that checks that the *(rfp+frame::interpreter_frame_last_sp) == NULL.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   169
  //
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   170
  // If we care generating the pre-barrier without a frame (e.g. in the
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   171
  // intrinsified Reference.get() routine) then ebp might be pointing to
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   172
  // the caller frame and so this check will most likely fail at runtime.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   173
  //
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   174
  // Expanding the call directly bypasses the generation of the check.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   175
  // So when we do not have have a full interpreter frame on the stack
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   176
  // expand_call should be passed true.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   177
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   178
  if (expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   179
    assert(pre_val != c_rarg1, "smashed arg");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   180
    __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   181
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   182
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   183
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   184
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   185
  __ pop(saved, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   186
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   187
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   188
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   189
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   190
void ShenandoahBarrierSetAssembler::resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   191
  assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   192
  Label is_null;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   193
  __ cbz(dst, is_null);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   194
  resolve_forward_pointer_not_null(masm, dst, tmp);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   195
  __ bind(is_null);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   196
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   197
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   198
// IMPORTANT: This must preserve all registers, even rscratch1 and rscratch2, except those explicitely
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   199
// passed in.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   200
void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   201
  assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   202
  // The below loads the mark word, checks if the lowest two bits are
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   203
  // set, and if so, clear the lowest two bits and copy the result
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   204
  // to dst. Otherwise it leaves dst alone.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   205
  // Implementing this is surprisingly awkward. I do it here by:
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   206
  // - Inverting the mark word
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   207
  // - Test lowest two bits == 0
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   208
  // - If so, set the lowest two bits
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   209
  // - Invert the result back, and copy to dst
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   210
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   211
  bool borrow_reg = (tmp == noreg);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   212
  if (borrow_reg) {
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   213
    // No free registers available. Make one useful.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   214
    tmp = rscratch1;
58407
b14643d898d3 8231583: Shenandoah: Fix register clash in SBSA::resolve_forwarding_pointer() borrowing
shade
parents: 58273
diff changeset
   215
    if (tmp == dst) {
b14643d898d3 8231583: Shenandoah: Fix register clash in SBSA::resolve_forwarding_pointer() borrowing
shade
parents: 58273
diff changeset
   216
      tmp = rscratch2;
b14643d898d3 8231583: Shenandoah: Fix register clash in SBSA::resolve_forwarding_pointer() borrowing
shade
parents: 58273
diff changeset
   217
    }
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   218
    __ push(RegSet::of(tmp), sp);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   219
  }
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   220
58407
b14643d898d3 8231583: Shenandoah: Fix register clash in SBSA::resolve_forwarding_pointer() borrowing
shade
parents: 58273
diff changeset
   221
  assert_different_registers(tmp, dst);
b14643d898d3 8231583: Shenandoah: Fix register clash in SBSA::resolve_forwarding_pointer() borrowing
shade
parents: 58273
diff changeset
   222
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   223
  Label done;
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   224
  __ ldr(tmp, Address(dst, oopDesc::mark_offset_in_bytes()));
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   225
  __ eon(tmp, tmp, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   226
  __ ands(zr, tmp, markWord::lock_mask_in_place);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   227
  __ br(Assembler::NE, done);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   228
  __ orr(tmp, tmp, markWord::marked_value);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   229
  __ eon(dst, tmp, zr);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   230
  __ bind(done);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   231
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   232
  if (borrow_reg) {
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   233
    __ pop(RegSet::of(tmp), sp);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   234
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   235
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   236
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   237
void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Address load_addr) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   238
  assert(ShenandoahLoadRefBarrier, "Should be enabled");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   239
  assert(dst != rscratch2, "need rscratch2");
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   240
  assert_different_registers(load_addr.base(), load_addr.index(), rscratch1, rscratch2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   241
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   242
  Label done;
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   243
  __ enter();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   244
  Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   245
  __ ldrb(rscratch2, gc_state);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   246
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   247
  // Check for heap stability
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   248
  __ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, done);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   249
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   250
  // use r1 for load address
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   251
  Register result_dst = dst;
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   252
  if (dst == r1) {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   253
    __ mov(rscratch1, dst);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   254
    dst = rscratch1;
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   255
  }
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   256
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   257
  RegSet to_save_r1 = RegSet::of(r1);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   258
  // If outgoing register is r1, we can clobber it
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   259
  if (result_dst != r1) {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   260
    __ push(to_save_r1, sp);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   261
  }
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   262
  __ lea(r1, load_addr);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   263
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   264
  RegSet to_save_r0 = RegSet::of(r0);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   265
  if (dst != r0) {
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   266
    __ push(to_save_r0, sp);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   267
    __ mov(r0, dst);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   268
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   269
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   270
  __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb())));
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   271
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   272
  if (result_dst != r0) {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   273
    __ mov(result_dst, r0);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   274
  }
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   275
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   276
  if (dst != r0) {
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   277
    __ pop(to_save_r0, sp);
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   278
  }
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   279
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   280
  if (result_dst != r1) {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   281
    __ pop(to_save_r1, sp);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   282
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   283
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   284
  __ bind(done);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   285
  __ leave();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   286
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   287
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   288
void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler* masm, Register dst, Address load_addr) {
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   289
  if (!ShenandoahLoadRefBarrier) {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   290
    return;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   291
  }
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   292
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   293
  assert(dst != rscratch2, "need rscratch2");
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   294
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   295
  Label is_null;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   296
  Label done;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   297
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   298
  __ block_comment("load_reference_barrier_native { ");
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   299
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   300
  __ cbz(dst, is_null);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   301
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   302
  __ enter();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   303
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   304
  Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   305
  __ ldrb(rscratch2, gc_state);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   306
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   307
  // Check for heap in evacuation phase
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   308
  __ tbz(rscratch2, ShenandoahHeap::EVACUATION_BITPOS, done);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   309
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   310
  __ mov(rscratch2, dst);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   311
  __ push_call_clobbered_registers();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   312
  __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native));
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   313
  __ lea(r1, load_addr);
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   314
  __ mov(r0, rscratch2);
57565
01bca26734bb 8228400: Remove built-in AArch64 simulator
shade
parents: 57542
diff changeset
   315
  __ blr(lr);
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   316
  __ mov(rscratch2, r0);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   317
  __ pop_call_clobbered_registers();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   318
  __ mov(dst, rscratch2);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   319
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   320
  __ bind(done);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   321
  __ leave();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   322
  __ bind(is_null);
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   323
  __ block_comment("} load_reference_barrier_native");
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   324
}
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   325
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   326
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   327
  if (ShenandoahStoreValEnqueueBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   328
    // Save possibly live regs.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   329
    RegSet live_regs = RegSet::range(r0, r4) - dst;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   330
    __ push(live_regs, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   331
    __ strd(v0, __ pre(sp, 2 * -wordSize));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   332
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   333
    satb_write_barrier_pre(masm, noreg, dst, rthread, tmp, true, false);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   334
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   335
    // Restore possibly live regs.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   336
    __ ldrd(v0, __ post(sp, 2 * wordSize));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   337
    __ pop(live_regs, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   338
  }
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   339
}
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   340
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   341
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   342
  if (ShenandoahLoadRefBarrier) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   343
    Label is_null;
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   344
    __ cbz(dst, is_null);
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   345
    load_reference_barrier_not_null(masm, dst, load_addr);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   346
    __ bind(is_null);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   347
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   348
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   349
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   350
//
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   351
// Arguments:
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   352
//
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   353
// Inputs:
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   354
//   src:        oop location to load from, might be clobbered
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   355
//
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   356
// Output:
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   357
//   dst:        oop loaded from src location
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   358
//
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   359
// Kill:
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   360
//   rscratch1 (scratch reg)
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   361
//
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   362
// Alias:
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   363
//   dst: rscratch1 (might use rscratch1 as temporary output register to avoid clobbering src)
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   364
//
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   365
void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   366
                                            Register dst, Address src, Register tmp1, Register tmp_thread) {
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   367
  // 1: non-reference load, no additional barrier is needed
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   368
  if (!is_reference_type(type)) {
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   369
    BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   370
    return;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   371
  }
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   372
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   373
  // 2: load a reference from src location and apply LRB if ShenandoahLoadRefBarrier is set
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   374
  if (ShenandoahLoadRefBarrier) {
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   375
    Register result_dst = dst;
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   376
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   377
    // Preserve src location for LRB
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   378
    if (dst == src.base() || dst == src.index()) {
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   379
      dst = rscratch1;
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   380
    }
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   381
    assert_different_registers(dst, src.base(), src.index());
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   382
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   383
    BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   384
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   385
    // Native barrier is for concurrent root processing
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   386
    bool in_native = (decorators & IN_NATIVE) != 0;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   387
    if (in_native && ShenandoahConcurrentRoots::can_do_concurrent_roots()) {
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   388
      load_reference_barrier_native(masm, dst, src);
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   389
    } else {
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   390
      load_reference_barrier(masm, dst, src);
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   391
    }
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   392
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   393
    if (dst != result_dst) {
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   394
      __ mov(result_dst, dst);
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   395
      dst = result_dst;
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   396
    }
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   397
  } else {
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   398
    BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   399
  }
58725
190ec5fae2af 8232712: Shenandoah: SIGBUS in load_reference_barrier_native
zgu
parents: 58407
diff changeset
   400
58946
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   401
  // 3: apply keep-alive barrier if ShenandoahKeepAliveBarrier is set
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   402
  if (ShenandoahKeepAliveBarrier) {
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   403
    bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   404
    bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   405
    bool on_reference = on_weak || on_phantom;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   406
    bool is_traversal_mode = ShenandoahHeap::heap()->is_traversal_mode();
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   407
    bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0 || is_traversal_mode;
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   408
83810b7d12e7 8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents: 58916
diff changeset
   409
    if (on_reference && keep_alive) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   410
      __ enter();
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   411
      satb_write_barrier_pre(masm /* masm */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   412
                             noreg /* obj */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   413
                             dst /* pre_val */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   414
                             rthread /* thread */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   415
                             tmp1 /* tmp */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   416
                             true /* tosca_live */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   417
                             true /* expand_call */);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   418
      __ leave();
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   419
    }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   420
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   421
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   422
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   423
void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   424
                                             Address dst, Register val, Register tmp1, Register tmp2) {
58273
08a5148e7c4e 8230505: Replace JVM type comparisons to T_OBJECT and T_ARRAY with call to is_reference_type
lfoltan
parents: 58219
diff changeset
   425
  bool on_oop = is_reference_type(type);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   426
  if (!on_oop) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   427
    BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   428
    return;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   429
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   430
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   431
  // flatten object address if needed
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   432
  if (dst.index() == noreg && dst.offset() == 0) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   433
    if (dst.base() != r3) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   434
      __ mov(r3, dst.base());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   435
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   436
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   437
    __ lea(r3, dst);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   438
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   439
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   440
  shenandoah_write_barrier_pre(masm,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   441
                               r3 /* obj */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   442
                               tmp2 /* pre_val */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   443
                               rthread /* thread */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   444
                               tmp1  /* tmp */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   445
                               val != noreg /* tosca_live */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   446
                               false /* expand_call */);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   447
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   448
  if (val == noreg) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   449
    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), noreg, noreg, noreg);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   450
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   451
    storeval_barrier(masm, val, tmp1);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   452
    // G1 barrier needs uncompressed oop for region cross check.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   453
    Register new_val = val;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   454
    if (UseCompressedOops) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   455
      new_val = rscratch2;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   456
      __ mov(new_val, val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   457
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   458
    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), val, noreg, noreg);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   459
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   460
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   461
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   462
57542
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   463
void ShenandoahBarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   464
                                                                  Register obj, Register tmp, Label& slowpath) {
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   465
  Label done;
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   466
  // Resolve jobject
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   467
  BarrierSetAssembler::try_resolve_jobject_in_native(masm, jni_env, obj, tmp, slowpath);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   468
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   469
  // Check for null.
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   470
  __ cbz(obj, done);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   471
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   472
  assert(obj != rscratch2, "need rscratch2");
58916
7298f7c503b4 8233232: AArch64: Shenandoah: jni_fast_GetLongField is broken
aph
parents: 58858
diff changeset
   473
  Address gc_state(jni_env, ShenandoahThreadLocalData::gc_state_offset() - JavaThread::jni_environment_offset());
7298f7c503b4 8233232: AArch64: Shenandoah: jni_fast_GetLongField is broken
aph
parents: 58858
diff changeset
   474
  __ lea(rscratch2, gc_state);
7298f7c503b4 8233232: AArch64: Shenandoah: jni_fast_GetLongField is broken
aph
parents: 58858
diff changeset
   475
  __ ldrb(rscratch2, Address(rscratch2));
57542
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   476
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   477
  // Check for heap in evacuation phase
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   478
  __ tbnz(rscratch2, ShenandoahHeap::EVACUATION_BITPOS, slowpath);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   479
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   480
  __ bind(done);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   481
}
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   482
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   483
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   484
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val,
53519
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   485
                                                bool acquire, bool release, bool weak, bool is_cae,
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   486
                                                Register result) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   487
  Register tmp1 = rscratch1;
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   488
  Register tmp2 = rscratch2;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   489
  bool is_narrow = UseCompressedOops;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   490
  Assembler::operand_size size = is_narrow ? Assembler::word : Assembler::xword;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   491
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   492
  assert_different_registers(addr, expected, new_val, tmp1, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   493
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   494
  Label retry, done, fail;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   495
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   496
  // CAS, using LL/SC pair.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   497
  __ bind(retry);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   498
  __ load_exclusive(tmp1, addr, size, acquire);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   499
  if (is_narrow) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   500
    __ cmpw(tmp1, expected);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   501
  } else {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   502
    __ cmp(tmp1, expected);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   503
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   504
  __ br(Assembler::NE, fail);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   505
  __ store_exclusive(tmp2, new_val, addr, size, release);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   506
  if (weak) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   507
    __ cmpw(tmp2, 0u); // If the store fails, return NE to our caller
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   508
  } else {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   509
    __ cbnzw(tmp2, retry);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   510
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   511
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   512
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   513
 __  bind(fail);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   514
  // Check if rb(expected)==rb(tmp1)
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   515
  // Shuffle registers so that we have memory value ready for next expected.
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   516
  __ mov(tmp2, expected);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   517
  __ mov(expected, tmp1);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   518
  if (is_narrow) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   519
    __ decode_heap_oop(tmp1, tmp1);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   520
    __ decode_heap_oop(tmp2, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   521
  }
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   522
  resolve_forward_pointer(masm, tmp1);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   523
  resolve_forward_pointer(masm, tmp2);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   524
  __ cmp(tmp1, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   525
  // Retry with expected now being the value we just loaded from addr.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   526
  __ br(Assembler::EQ, retry);
53519
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   527
  if (is_cae && is_narrow) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   528
    // For cmp-and-exchange and narrow oops, we need to restore
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   529
    // the compressed old-value. We moved it to 'expected' a few lines up.
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   530
    __ mov(tmp1, expected);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   531
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   532
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   533
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   534
  if (is_cae) {
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   535
    __ mov(result, tmp1);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   536
  } else {
53519
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   537
    __ cset(result, Assembler::EQ);
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   538
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   539
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   540
54763
2584e5772546 8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents: 54425
diff changeset
   541
#undef __
2584e5772546 8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents: 54425
diff changeset
   542
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   543
#ifdef COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   544
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   545
#define __ ce->masm()->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   546
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   547
void ShenandoahBarrierSetAssembler::gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   548
  ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   549
  // At this point we know that marking is in progress.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   550
  // If do_load() is true then we have to emit the
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   551
  // load of the previous value; otherwise it has already
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   552
  // been loaded into _pre_val.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   553
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   554
  __ bind(*stub->entry());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   555
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   556
  assert(stub->pre_val()->is_register(), "Precondition.");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   557
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   558
  Register pre_val_reg = stub->pre_val()->as_register();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   559
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   560
  if (stub->do_load()) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   561
    ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   562
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   563
  __ cbz(pre_val_reg, *stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   564
  ce->store_parameter(stub->pre_val()->as_register(), 0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   565
  __ far_call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   566
  __ b(*stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   567
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   568
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   569
void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assembler* ce, ShenandoahLoadReferenceBarrierStub* stub) {
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   570
  ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   571
  __ bind(*stub->entry());
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   572
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   573
  Register obj = stub->obj()->as_register();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   574
  Register res = stub->result()->as_register();
58858
75099fcf7962 8233165: Shenandoah:SBSA::gen_load_reference_barrier_stub() should use pointer register for address on aarch64
zgu
parents: 58819
diff changeset
   575
  Register addr = stub->addr()->as_pointer_register();
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   576
  Register tmp1 = stub->tmp1()->as_register();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   577
  Register tmp2 = stub->tmp2()->as_register();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   578
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   579
  assert(res == r0, "result must arrive in r0");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   580
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   581
  if (res != obj) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   582
    __ mov(res, obj);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   583
  }
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   584
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   585
  // Check for null.
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   586
  __ cbz(res, *stub->continuation());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   587
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   588
  // Check for object in cset.
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   589
  __ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   590
  __ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   591
  __ ldrb(tmp2, Address(tmp2, tmp1));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   592
  __ cbz(tmp2, *stub->continuation());
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   593
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   594
  // Check if object is already forwarded.
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   595
  Label slow_path;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   596
  __ ldr(tmp1, Address(res, oopDesc::mark_offset_in_bytes()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   597
  __ eon(tmp1, tmp1, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   598
  __ ands(zr, tmp1, markWord::lock_mask_in_place);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   599
  __ br(Assembler::NE, slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   600
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   601
  // Decode forwarded object.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   602
  __ orr(tmp1, tmp1, markWord::marked_value);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   603
  __ eon(res, tmp1, zr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   604
  __ b(*stub->continuation());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   605
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   606
  __ bind(slow_path);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   607
  ce->store_parameter(res, 0);
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   608
  ce->store_parameter(addr, 1);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   609
  __ far_call(RuntimeAddress(bs->load_reference_barrier_rt_code_blob()->code_begin()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   610
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   611
  __ b(*stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   612
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   613
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   614
#undef __
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   615
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   616
#define __ sasm->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   617
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   618
void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   619
  __ prologue("shenandoah_pre_barrier", false);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   620
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   621
  // arg0 : previous value of memory
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   622
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   623
  BarrierSet* bs = BarrierSet::barrier_set();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   624
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   625
  const Register pre_val = r0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   626
  const Register thread = rthread;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   627
  const Register tmp = rscratch1;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   628
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   629
  Address queue_index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   630
  Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   631
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   632
  Label done;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   633
  Label runtime;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   634
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   635
  // Is marking still active?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   636
  Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   637
  __ ldrb(tmp, gc_state);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   638
  __ mov(rscratch2, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   639
  __ tst(tmp, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   640
  __ br(Assembler::EQ, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   641
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   642
  // Can we store original value in the thread's buffer?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   643
  __ ldr(tmp, queue_index);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   644
  __ cbz(tmp, runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   645
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   646
  __ sub(tmp, tmp, wordSize);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   647
  __ str(tmp, queue_index);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   648
  __ ldr(rscratch2, buffer);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   649
  __ add(tmp, tmp, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   650
  __ load_parameter(0, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   651
  __ str(rscratch2, Address(tmp, 0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   652
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   653
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   654
  __ bind(runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   655
  __ push_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   656
  __ load_parameter(0, pre_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   657
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), pre_val, thread);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   658
  __ pop_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   659
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   660
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   661
  __ epilogue();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   662
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   663
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   664
void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm) {
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   665
  __ prologue("shenandoah_load_reference_barrier", false);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   666
  // arg0 : object to be resolved
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   667
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   668
  __ push_call_clobbered_registers();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   669
  __ load_parameter(0, r0);
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   670
  __ load_parameter(1, r1);
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   671
  if (UseCompressedOops) {
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   672
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   673
  } else {
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   674
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   675
  }
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   676
  __ blr(lr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   677
  __ mov(rscratch1, r0);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   678
  __ pop_call_clobbered_registers();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   679
  __ mov(r0, rscratch1);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   680
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   681
  __ epilogue();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   682
}
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   683
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   684
#undef __
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   685
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   686
#endif // COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   687
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   688
address ShenandoahBarrierSetAssembler::shenandoah_lrb() {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   689
  assert(_shenandoah_lrb != NULL, "need load reference barrier stub");
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   690
  return _shenandoah_lrb;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   691
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   692
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   693
#define __ cgen->assembler()->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   694
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   695
// Shenandoah load reference barrier.
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   696
//
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   697
// Input:
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   698
//   r0: OOP to evacuate.  Not null.
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   699
//   r1: load address
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   700
//
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   701
// Output:
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   702
//   r0: Pointer to evacuated OOP.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   703
//
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   704
// Trash rscratch1, rscratch2.  Preserve everything else.
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   705
address ShenandoahBarrierSetAssembler::generate_shenandoah_lrb(StubCodeGenerator* cgen) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   706
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   707
  __ align(6);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   708
  StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   709
  address start = __ pc();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   710
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   711
  Label work, done;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   712
  __ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   713
  __ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   714
  __ ldrb(rscratch2, Address(rscratch2, rscratch1));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   715
  __ tbnz(rscratch2, 0, work);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   716
  __ ret(lr);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   717
  __ bind(work);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   718
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   719
  Label slow_path;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   720
  __ ldr(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   721
  __ eon(rscratch1, rscratch1, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   722
  __ ands(zr, rscratch1, markWord::lock_mask_in_place);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   723
  __ br(Assembler::NE, slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   724
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   725
  // Decode forwarded object.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   726
  __ orr(rscratch1, rscratch1, markWord::marked_value);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   727
  __ eon(r0, rscratch1, zr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   728
  __ ret(lr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   729
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   730
  __ bind(slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   731
  __ enter(); // required for proper stackwalking of RuntimeStub frame
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   732
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   733
  __ push_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   734
58819
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   735
  if (UseCompressedOops) {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   736
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   737
  } else {
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   738
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
ef8be51fff48 8232992: Shenandoah: Implement self-fixing interpreter LRB
zgu
parents: 58737
diff changeset
   739
  }
57565
01bca26734bb 8228400: Remove built-in AArch64 simulator
shade
parents: 57542
diff changeset
   740
  __ blr(lr);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   741
  __ mov(rscratch1, r0);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   742
  __ pop_call_clobbered_registers();
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   743
  __ mov(r0, rscratch1);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   744
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   745
  __ leave(); // required for proper stackwalking of RuntimeStub frame
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   746
  __ bind(done);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   747
  __ ret(lr);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   748
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   749
  return start;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   750
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   751
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   752
#undef __
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   753
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   754
void ShenandoahBarrierSetAssembler::barrier_stubs_init() {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   755
  if (ShenandoahLoadRefBarrier) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   756
    int stub_code_size = 2048;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   757
    ResourceMark rm;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   758
    BufferBlob* bb = BufferBlob::create("shenandoah_barrier_stubs", stub_code_size);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   759
    CodeBuffer buf(bb);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   760
    StubCodeGenerator cgen(&buf);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   761
    _shenandoah_lrb = generate_shenandoah_lrb(&cgen);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   762
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   763
}