src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
author rkennke
Wed, 18 Sep 2019 20:56:20 +0200
changeset 58219 bc0648405d67
parent 58218 0d7877278adf
child 58273 08a5148e7c4e
permissions -rw-r--r--
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2 Reviewed-by: shade
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"
54766
1321f8cf9de5 8223567: Rename ShenandoahBrooksPointer to ShenandoahForwarding
rkennke
parents: 54763
diff changeset
    26
#include "gc/shenandoah/shenandoahForwarding.hpp"
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
    27
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    28
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    29
#include "gc/shenandoah/shenandoahHeuristics.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    30
#include "gc/shenandoah/shenandoahRuntime.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    31
#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    32
#include "interpreter/interpreter.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    33
#include "interpreter/interp_masm.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    34
#include "runtime/sharedRuntime.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    35
#include "runtime/thread.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    36
#ifdef COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    37
#include "c1/c1_LIRAssembler.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    38
#include "c1/c1_MacroAssembler.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    39
#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    40
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    41
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    42
#define __ masm->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    43
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
    44
address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    45
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    46
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
    47
                                                       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
    48
  if (is_oop) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    49
    bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    50
    if ((ShenandoahSATBBarrier && !dest_uninitialized) || ShenandoahLoadRefBarrier) {
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    51
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    52
      Label done;
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    53
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    54
      // Avoid calling runtime if count == 0
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    55
      __ cbz(count, done);
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    56
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    57
      // Is marking active?
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    58
      Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    59
      __ ldrb(rscratch1, gc_state);
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    60
      if (dest_uninitialized) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    61
        __ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, done);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    62
      } else {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    63
        __ mov(rscratch2, ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::MARKING);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    64
        __ tst(rscratch1, rscratch2);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    65
        __ br(Assembler::EQ, done);
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    66
      }
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    67
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    68
      __ push(saved_regs, sp);
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    69
      if (UseCompressedOops) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    70
        if (dest_uninitialized) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    71
          __ 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
    72
        } else {
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    73
          __ 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
    74
        }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    75
      } else {
58218
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    76
        if (dest_uninitialized) {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    77
          __ 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
    78
        } else {
0d7877278adf 8231086: Shenandoah: Stronger invariant for object-arraycopy
rkennke
parents: 57777
diff changeset
    79
          __ 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
    80
        }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    81
      }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    82
      __ pop(saved_regs, sp);
54383
cdc3bb0983a6 8221751: Shenandoah: Improve SATB enqueueing
rkennke
parents: 54266
diff changeset
    83
      __ bind(done);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    84
    }
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
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
    89
                                                                 Register obj,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    90
                                                                 Register pre_val,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    91
                                                                 Register thread,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    92
                                                                 Register tmp,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    93
                                                                 bool tosca_live,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    94
                                                                 bool expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    95
  if (ShenandoahSATBBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    96
    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
    97
  }
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
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
   101
                                                           Register obj,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   102
                                                           Register pre_val,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   103
                                                           Register thread,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   104
                                                           Register tmp,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   105
                                                           bool tosca_live,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   106
                                                           bool expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   107
  // 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
   108
  // directly to skip generating the check by
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   109
  // 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
   110
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   111
  assert(thread == rthread, "must be");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   112
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   113
  Label done;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   114
  Label runtime;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   115
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   116
  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
   117
  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
   118
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   119
  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
   120
  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
   121
  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
   122
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   123
  // Is marking active?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   124
  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
   125
    __ ldrw(tmp, in_progress);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   126
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   127
    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
   128
    __ ldrb(tmp, in_progress);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   129
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   130
  __ cbzw(tmp, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   131
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   132
  // 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
   133
  if (obj != noreg) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   134
    __ 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
   135
  }
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
  // Is the previous value null?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   138
  __ cbz(pre_val, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   139
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   140
  // 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
   141
  // Is index == 0?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   142
  // (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
   143
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   144
  __ ldr(tmp, index);                      // tmp := *index_adr
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   145
  __ cbz(tmp, runtime);                    // tmp == 0?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   146
                                        // If yes, goto runtime
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   147
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   148
  __ sub(tmp, tmp, wordSize);              // tmp := tmp - wordSize
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   149
  __ str(tmp, index);                      // *index_adr := tmp
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   150
  __ ldr(rscratch1, buffer);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   151
  __ 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
   152
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   153
  // Record the previous value
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   154
  __ str(pre_val, Address(tmp, 0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   155
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   156
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   157
  __ bind(runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   158
  // save the live input values
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   159
  RegSet saved = RegSet::of(pre_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   160
  if (tosca_live) saved += RegSet::of(r0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   161
  if (obj != noreg) saved += RegSet::of(obj);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   162
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   163
  __ push(saved, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   164
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   165
  // 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
   166
  // 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
   167
  // 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
   168
  //
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   169
  // 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
   170
  // 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
   171
  // 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
   172
  //
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   173
  // 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
   174
  // 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
   175
  // expand_call should be passed true.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   176
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   177
  if (expand_call) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   178
    assert(pre_val != c_rarg1, "smashed arg");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   179
    __ 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
   180
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   181
    __ 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
   182
  }
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
  __ pop(saved, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   185
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   186
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   187
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   188
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   189
void ShenandoahBarrierSetAssembler::resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   190
  assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   191
  Label is_null;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   192
  __ cbz(dst, is_null);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   193
  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
   194
  __ bind(is_null);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   195
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   196
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   197
// 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
   198
// passed in.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   199
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
   200
  assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   201
  // 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
   202
  // 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
   203
  // to dst. Otherwise it leaves dst alone.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   204
  // Implementing this is surprisingly awkward. I do it here by:
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   205
  // - Inverting the mark word
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   206
  // - Test lowest two bits == 0
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   207
  // - If so, set the lowest two bits
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   208
  // - Invert the result back, and copy to dst
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   209
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   210
  bool borrow_reg = (tmp == noreg);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   211
  if (borrow_reg) {
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   212
    // No free registers available. Make one useful.
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   213
    tmp = rscratch1;
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   214
    __ push(RegSet::of(tmp), sp);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   215
  }
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   216
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   217
  Label done;
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   218
  __ ldr(tmp, Address(dst, oopDesc::mark_offset_in_bytes()));
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   219
  __ eon(tmp, tmp, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   220
  __ ands(zr, tmp, markWord::lock_mask_in_place);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   221
  __ br(Assembler::NE, done);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   222
  __ orr(tmp, tmp, markWord::marked_value);
55076
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   223
  __ eon(dst, tmp, zr);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   224
  __ bind(done);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   225
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   226
  if (borrow_reg) {
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   227
    __ pop(RegSet::of(tmp), sp);
785a12e0f89b 8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents: 54979
diff changeset
   228
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   229
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   230
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   231
void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Register tmp) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   232
  assert(ShenandoahLoadRefBarrier, "Should be enabled");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   233
  assert(dst != rscratch2, "need rscratch2");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   234
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   235
  Label done;
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   236
  __ enter();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   237
  Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   238
  __ ldrb(rscratch2, gc_state);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   239
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   240
  // Check for heap stability
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   241
  __ 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
   242
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   243
  RegSet to_save = RegSet::of(r0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   244
  if (dst != r0) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   245
    __ push(to_save, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   246
    __ mov(r0, dst);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   247
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   248
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   249
  __ 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
   250
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   251
  if (dst != r0) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   252
    __ mov(dst, r0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   253
    __ pop(to_save, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   254
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   255
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   256
  __ bind(done);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   257
  __ leave();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   258
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   259
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   260
void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler* masm, Register dst, Register tmp) {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   261
  if (!ShenandoahLoadRefBarrier) {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   262
    return;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   263
  }
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   264
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   265
  assert(dst != rscratch2, "need rscratch2");
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   266
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   267
  Label is_null;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   268
  Label done;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   269
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   270
  __ cbz(dst, is_null);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   271
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   272
  __ enter();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   273
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   274
  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
   275
  __ ldrb(rscratch2, gc_state);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   276
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   277
  // Check for heap in evacuation phase
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   278
  __ tbz(rscratch2, ShenandoahHeap::EVACUATION_BITPOS, done);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   279
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   280
  __ mov(rscratch2, dst);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   281
  __ push_call_clobbered_registers();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   282
  __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native));
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   283
  __ mov(r0, rscratch2);
57565
01bca26734bb 8228400: Remove built-in AArch64 simulator
shade
parents: 57542
diff changeset
   284
  __ blr(lr);
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   285
  __ mov(rscratch2, r0);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   286
  __ pop_call_clobbered_registers();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   287
  __ mov(dst, rscratch2);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   288
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   289
  __ bind(done);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   290
  __ leave();
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   291
  __ bind(is_null);
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
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   294
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
   295
  if (ShenandoahStoreValEnqueueBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   296
    // Save possibly live regs.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   297
    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
   298
    __ push(live_regs, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   299
    __ strd(v0, __ pre(sp, 2 * -wordSize));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   300
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   301
    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
   302
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   303
    // Restore possibly live regs.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   304
    __ ldrd(v0, __ post(sp, 2 * wordSize));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   305
    __ pop(live_regs, sp);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   306
  }
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   307
}
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   308
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   309
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Register tmp) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   310
  if (ShenandoahLoadRefBarrier) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   311
    Label is_null;
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   312
    __ cbz(dst, is_null);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   313
    load_reference_barrier_not_null(masm, dst, tmp);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   314
    __ bind(is_null);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   315
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   316
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   317
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   318
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
   319
                                            Register dst, Address src, Register tmp1, Register tmp_thread) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   320
  bool on_oop = type == T_OBJECT || type == T_ARRAY;
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   321
  bool not_in_heap = (decorators & IN_NATIVE) != 0;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   322
  bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   323
  bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   324
  bool on_reference = on_weak || on_phantom;
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   325
  bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   326
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   327
  BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   328
  if (on_oop) {
55718
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   329
     if (not_in_heap) {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   330
       if (ShenandoahHeap::heap()->is_traversal_mode()) {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   331
         load_reference_barrier(masm, dst, tmp1);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   332
         keep_alive = true;
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   333
       } else {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   334
         load_reference_barrier_native(masm, dst, tmp1);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   335
       }
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   336
     } else {
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   337
       load_reference_barrier(masm, dst, tmp1);
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   338
     }
9fbc32392798 8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents: 55679
diff changeset
   339
    if (ShenandoahKeepAliveBarrier && on_reference && keep_alive) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   340
      __ enter();
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   341
      satb_write_barrier_pre(masm /* masm */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   342
                             noreg /* obj */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   343
                             dst /* pre_val */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   344
                             rthread /* thread */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   345
                             tmp1 /* tmp */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   346
                             true /* tosca_live */,
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   347
                             true /* expand_call */);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   348
      __ leave();
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   349
    }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   350
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   351
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   352
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   353
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
   354
                                             Address dst, Register val, Register tmp1, Register tmp2) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   355
  bool on_oop = type == T_OBJECT || type == T_ARRAY;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   356
  if (!on_oop) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   357
    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
   358
    return;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   359
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   360
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   361
  // flatten object address if needed
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   362
  if (dst.index() == noreg && dst.offset() == 0) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   363
    if (dst.base() != r3) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   364
      __ mov(r3, dst.base());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   365
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   366
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   367
    __ lea(r3, dst);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   368
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   369
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   370
  shenandoah_write_barrier_pre(masm,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   371
                               r3 /* obj */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   372
                               tmp2 /* pre_val */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   373
                               rthread /* thread */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   374
                               tmp1  /* tmp */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   375
                               val != noreg /* tosca_live */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   376
                               false /* expand_call */);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   377
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   378
  if (val == noreg) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   379
    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
   380
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   381
    storeval_barrier(masm, val, tmp1);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   382
    // 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
   383
    Register new_val = val;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   384
    if (UseCompressedOops) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   385
      new_val = rscratch2;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   386
      __ mov(new_val, val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   387
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   388
    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
   389
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   390
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   391
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   392
57542
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   393
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
   394
                                                                  Register obj, Register tmp, Label& slowpath) {
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   395
  Label done;
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   396
  // Resolve jobject
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   397
  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
   398
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   399
  // Check for null.
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   400
  __ cbz(obj, done);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   401
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   402
  assert(obj != rscratch2, "need rscratch2");
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   403
  Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   404
  __ ldrb(rscratch2, gc_state);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   405
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   406
  // Check for heap in evacuation phase
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   407
  __ tbnz(rscratch2, ShenandoahHeap::EVACUATION_BITPOS, slowpath);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   408
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   409
  __ bind(done);
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   410
}
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   411
db740ced41c4 8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents: 55735
diff changeset
   412
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   413
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
   414
                                                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
   415
                                                Register result) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   416
  Register tmp1 = rscratch1;
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   417
  Register tmp2 = rscratch2;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   418
  bool is_narrow = UseCompressedOops;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   419
  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
   420
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   421
  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
   422
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   423
  Label retry, done, fail;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   424
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   425
  // CAS, using LL/SC pair.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   426
  __ bind(retry);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   427
  __ load_exclusive(tmp1, addr, size, acquire);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   428
  if (is_narrow) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   429
    __ cmpw(tmp1, expected);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   430
  } else {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   431
    __ cmp(tmp1, expected);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   432
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   433
  __ br(Assembler::NE, fail);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   434
  __ 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
   435
  if (weak) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   436
    __ 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
   437
  } else {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   438
    __ cbnzw(tmp2, retry);
52925
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
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   441
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   442
 __  bind(fail);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   443
  // Check if rb(expected)==rb(tmp1)
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   444
  // 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
   445
  __ mov(tmp2, expected);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   446
  __ mov(expected, tmp1);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   447
  if (is_narrow) {
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   448
    __ decode_heap_oop(tmp1, tmp1);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   449
    __ decode_heap_oop(tmp2, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   450
  }
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   451
  resolve_forward_pointer(masm, tmp1);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   452
  resolve_forward_pointer(masm, tmp2);
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   453
  __ cmp(tmp1, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   454
  // 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
   455
  __ br(Assembler::EQ, retry);
53519
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   456
  if (is_cae && is_narrow) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   457
    // 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
   458
    // 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
   459
    __ mov(tmp1, expected);
52925
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
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   462
53719
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   463
  if (is_cae) {
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   464
    __ mov(result, tmp1);
3a56e823d843 8217874: Shenandoah: Clobbered register in ShenandoahBarrierSetAssembler::cmpxchg_oop()
rkennke
parents: 53519
diff changeset
   465
  } else {
53519
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   466
    __ cset(result, Assembler::EQ);
74a5ef4c81cc 8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents: 52925
diff changeset
   467
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   468
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   469
54763
2584e5772546 8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents: 54425
diff changeset
   470
#undef __
2584e5772546 8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents: 54425
diff changeset
   471
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   472
#ifdef COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   473
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   474
#define __ ce->masm()->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   475
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   476
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
   477
  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
   478
  // 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
   479
  // 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
   480
  // 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
   481
  // been loaded into _pre_val.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   482
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   483
  __ bind(*stub->entry());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   484
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   485
  assert(stub->pre_val()->is_register(), "Precondition.");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   486
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   487
  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
   488
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   489
  if (stub->do_load()) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   490
    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
   491
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   492
  __ cbz(pre_val_reg, *stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   493
  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
   494
  __ 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
   495
  __ b(*stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   496
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   497
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   498
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
   499
  ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   500
  __ bind(*stub->entry());
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   501
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   502
  Register obj = stub->obj()->as_register();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   503
  Register res = stub->result()->as_register();
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   504
  Register addr = stub->addr()->as_register_lo();
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   505
  Register tmp1 = stub->tmp1()->as_register();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   506
  Register tmp2 = stub->tmp2()->as_register();
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   507
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   508
  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
   509
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   510
  if (res != obj) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   511
    __ mov(res, obj);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   512
  }
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   513
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   514
  // Check for null.
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   515
  __ cbz(res, *stub->continuation());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   516
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   517
  // Check for object in cset.
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   518
  __ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   519
  __ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   520
  __ ldrb(tmp2, Address(tmp2, tmp1));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   521
  __ cbz(tmp2, *stub->continuation());
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   522
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   523
  // Check if object is already forwarded.
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   524
  Label slow_path;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   525
  __ ldr(tmp1, Address(res, oopDesc::mark_offset_in_bytes()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   526
  __ eon(tmp1, tmp1, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   527
  __ ands(zr, tmp1, markWord::lock_mask_in_place);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   528
  __ br(Assembler::NE, slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   529
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   530
  // Decode forwarded object.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   531
  __ orr(tmp1, tmp1, markWord::marked_value);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   532
  __ eon(res, tmp1, zr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   533
  __ b(*stub->continuation());
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   534
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   535
  __ bind(slow_path);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   536
  ce->store_parameter(res, 0);
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   537
  ce->store_parameter(addr, 1);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   538
  __ far_call(RuntimeAddress(bs->load_reference_barrier_rt_code_blob()->code_begin()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   539
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   540
  __ b(*stub->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   541
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   542
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   543
#undef __
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 __ sasm->
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::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
   548
  __ prologue("shenandoah_pre_barrier", false);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   549
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   550
  // arg0 : previous value of memory
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   551
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   552
  BarrierSet* bs = BarrierSet::barrier_set();
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
  const Register pre_val = r0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   555
  const Register thread = rthread;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   556
  const Register tmp = rscratch1;
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
  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
   559
  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
   560
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   561
  Label done;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   562
  Label runtime;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   563
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   564
  // Is marking still active?
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   565
  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
   566
  __ ldrb(tmp, gc_state);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   567
  __ mov(rscratch2, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   568
  __ tst(tmp, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   569
  __ br(Assembler::EQ, done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   570
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   571
  // 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
   572
  __ ldr(tmp, queue_index);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   573
  __ cbz(tmp, runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   574
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   575
  __ sub(tmp, tmp, wordSize);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   576
  __ str(tmp, queue_index);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   577
  __ ldr(rscratch2, buffer);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   578
  __ add(tmp, tmp, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   579
  __ load_parameter(0, rscratch2);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   580
  __ str(rscratch2, Address(tmp, 0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   581
  __ b(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   582
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   583
  __ bind(runtime);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   584
  __ push_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   585
  __ load_parameter(0, pre_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   586
  __ 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
   587
  __ pop_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   588
  __ bind(done);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   589
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   590
  __ epilogue();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   591
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   592
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   593
void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm) {
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   594
  __ prologue("shenandoah_load_reference_barrier", false);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   595
  // arg0 : object to be resolved
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   596
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   597
  __ push_call_clobbered_registers();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   598
  __ load_parameter(0, r0);
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   599
  __ load_parameter(1, r1);
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   600
  if (UseCompressedOops) {
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   601
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_fixup_narrow));
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   602
  } else {
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   603
    __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_fixup));
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 58218
diff changeset
   604
  }
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   605
  __ blr(lr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   606
  __ mov(rscratch1, r0);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   607
  __ pop_call_clobbered_registers();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   608
  __ mov(r0, rscratch1);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   609
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   610
  __ epilogue();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   611
}
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   612
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   613
#undef __
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   614
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   615
#endif // COMPILER1
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   616
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   617
address ShenandoahBarrierSetAssembler::shenandoah_lrb() {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   618
  assert(_shenandoah_lrb != NULL, "need load reference barrier stub");
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   619
  return _shenandoah_lrb;
52925
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
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   622
#define __ cgen->assembler()->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   623
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   624
// Shenandoah load reference barrier.
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   625
//
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   626
// Input:
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   627
//   r0: OOP to evacuate.  Not null.
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
// Output:
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   630
//   r0: Pointer to evacuated OOP.
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
// Trash rscratch1, rscratch2.  Preserve everything else.
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   633
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
   634
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   635
  __ align(6);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   636
  StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   637
  address start = __ pc();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   638
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   639
  Label work, done;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   640
  __ 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
   641
  __ 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
   642
  __ ldrb(rscratch2, Address(rscratch2, rscratch1));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   643
  __ tbnz(rscratch2, 0, work);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   644
  __ ret(lr);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   645
  __ bind(work);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   646
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   647
  Label slow_path;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   648
  __ ldr(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   649
  __ eon(rscratch1, rscratch1, zr);
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   650
  __ ands(zr, rscratch1, markWord::lock_mask_in_place);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   651
  __ br(Assembler::NE, slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   652
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   653
  // Decode forwarded object.
57777
90ead0febf56 8229258: Rework markOop and markOopDesc into a simpler mark word value carrier
stefank
parents: 57716
diff changeset
   654
  __ orr(rscratch1, rscratch1, markWord::marked_value);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   655
  __ eon(r0, rscratch1, zr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   656
  __ ret(lr);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   657
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 57565
diff changeset
   658
  __ bind(slow_path);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   659
  __ 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
   660
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   661
  __ push_call_clobbered_registers();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   662
55679
aa96c53c592b 8227676: Shenandoah: More consistent naming of LRB entry points
rkennke
parents: 55574
diff changeset
   663
  __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
57565
01bca26734bb 8228400: Remove built-in AArch64 simulator
shade
parents: 57542
diff changeset
   664
  __ blr(lr);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   665
  __ mov(rscratch1, r0);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   666
  __ pop_call_clobbered_registers();
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   667
  __ mov(r0, rscratch1);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   668
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   669
  __ leave(); // required for proper stackwalking of RuntimeStub frame
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   670
  __ bind(done);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   671
  __ ret(lr);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   672
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   673
  return start;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   674
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   675
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   676
#undef __
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   677
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   678
void ShenandoahBarrierSetAssembler::barrier_stubs_init() {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   679
  if (ShenandoahLoadRefBarrier) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   680
    int stub_code_size = 2048;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   681
    ResourceMark rm;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   682
    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
   683
    CodeBuffer buf(bb);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   684
    StubCodeGenerator cgen(&buf);
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 54383
diff changeset
   685
    _shenandoah_lrb = generate_shenandoah_lrb(&cgen);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   686
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   687
}