src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58219 bc0648405d67
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
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
/*
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     2
 * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
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 "c1/c1_IR.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    26
#include "gc/shared/satbMarkQueue.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    27
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    28
#include "gc/shenandoah/shenandoahHeap.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    29
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
55654
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
    30
#include "gc/shenandoah/shenandoahRuntime.hpp"
52925
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 "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    33
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    34
#ifdef ASSERT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    35
#define __ gen->lir(__FILE__, __LINE__)->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    36
#else
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    37
#define __ gen->lir()->
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    38
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    39
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    40
void ShenandoahPreBarrierStub::emit_code(LIR_Assembler* ce) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    41
  ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    42
  bs->gen_pre_barrier_stub(ce, this);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    43
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    44
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
    45
void ShenandoahLoadReferenceBarrierStub::emit_code(LIR_Assembler* ce) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    46
  ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
    47
  bs->gen_load_reference_barrier_stub(ce, this);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    48
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    49
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
    50
ShenandoahBarrierSetC1::ShenandoahBarrierSetC1() :
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
    51
  _pre_barrier_c1_runtime_code_blob(NULL),
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
    52
  _load_reference_barrier_rt_code_blob(NULL) {}
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
    53
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    54
void ShenandoahBarrierSetC1::pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    55
  // First we test whether marking is in progress.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    56
  BasicType flag_type;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    57
  bool patch = (decorators & C1_NEEDS_PATCHING) != 0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    58
  bool do_load = pre_val == LIR_OprFact::illegalOpr;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    59
  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
    60
    flag_type = T_INT;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    61
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    62
    guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    63
              "Assumption");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    64
    // Use unsigned type T_BOOLEAN here rather than signed T_BYTE since some platforms, eg. ARM,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    65
    // need to use unsigned instructions to use the large offset to load the satb_mark_queue.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    66
    flag_type = T_BOOLEAN;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    67
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    68
  LIR_Opr thrd = gen->getThreadPointer();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    69
  LIR_Address* mark_active_flag_addr =
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    70
    new LIR_Address(thrd,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    71
                    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
    72
                    flag_type);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    73
  // Read the marking-in-progress flag.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    74
  LIR_Opr flag_val = gen->new_register(T_INT);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    75
  __ load(mark_active_flag_addr, flag_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    76
  __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    77
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    78
  LIR_PatchCode pre_val_patch_code = lir_patch_none;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    79
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    80
  CodeStub* slow;
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
  if (do_load) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    83
    assert(pre_val == LIR_OprFact::illegalOpr, "sanity");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    84
    assert(addr_opr != LIR_OprFact::illegalOpr, "sanity");
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
    if (patch)
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    87
      pre_val_patch_code = lir_patch_normal;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    88
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    89
    pre_val = gen->new_register(T_OBJECT);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    90
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    91
    if (!addr_opr->is_address()) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    92
      assert(addr_opr->is_register(), "must be");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    93
      addr_opr = LIR_OprFact::address(new LIR_Address(addr_opr, T_OBJECT));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    94
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    95
    slow = new ShenandoahPreBarrierStub(addr_opr, pre_val, pre_val_patch_code, info ? new CodeEmitInfo(info) : NULL);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    96
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    97
    assert(addr_opr == LIR_OprFact::illegalOpr, "sanity");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    98
    assert(pre_val->is_register(), "must be");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    99
    assert(pre_val->type() == T_OBJECT, "must be an object");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   100
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   101
    slow = new ShenandoahPreBarrierStub(pre_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   102
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   103
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   104
  __ branch(lir_cond_notEqual, T_INT, slow);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   105
  __ branch_destination(slow->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   106
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   107
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   108
LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   109
  if (ShenandoahLoadRefBarrier) {
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   110
    return load_reference_barrier_impl(gen, obj, addr);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   111
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   112
    return obj;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   113
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   114
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   115
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   116
LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   117
  assert(ShenandoahLoadRefBarrier, "Should be enabled");
52925
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
  obj = ensure_in_register(gen, obj);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   120
  assert(obj->is_register(), "must be a register at this point");
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   121
  addr = ensure_in_register(gen, addr);
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   122
  assert(addr->is_register(), "must be a register at this point");
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   123
  LIR_Opr result = gen->result_register_for(obj->value_type());
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   124
  __ move(obj, result);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   125
  LIR_Opr tmp1 = gen->new_register(T_OBJECT);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   126
  LIR_Opr tmp2 = gen->new_register(T_OBJECT);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   127
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   128
  LIR_Opr thrd = gen->getThreadPointer();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   129
  LIR_Address* active_flag_addr =
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   130
    new LIR_Address(thrd,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   131
                    in_bytes(ShenandoahThreadLocalData::gc_state_offset()),
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   132
                    T_BYTE);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   133
  // Read and check the gc-state-flag.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   134
  LIR_Opr flag_val = gen->new_register(T_INT);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   135
  __ load(active_flag_addr, flag_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   136
  LIR_Opr mask = LIR_OprFact::intConst(ShenandoahHeap::HAS_FORWARDED |
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   137
                                       ShenandoahHeap::EVACUATION |
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   138
                                       ShenandoahHeap::TRAVERSAL);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   139
  LIR_Opr mask_reg = gen->new_register(T_INT);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   140
  __ move(mask, mask_reg);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   141
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   142
  if (TwoOperandLIRForm) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   143
    __ logical_and(flag_val, mask_reg, flag_val);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   144
  } else {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   145
    LIR_Opr masked_flag = gen->new_register(T_INT);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   146
    __ logical_and(flag_val, mask_reg, masked_flag);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   147
    flag_val = masked_flag;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   148
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   149
  __ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   150
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   151
  CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, addr, result, tmp1, tmp2);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   152
  __ branch(lir_cond_notEqual, T_INT, slow);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   153
  __ branch_destination(slow->continuation());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   154
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   155
  return result;
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
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   158
LIR_Opr ShenandoahBarrierSetC1::ensure_in_register(LIRGenerator* gen, LIR_Opr obj) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   159
  if (!obj->is_register()) {
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   160
    LIR_Opr obj_reg;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   161
    if (obj->is_constant()) {
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   162
      obj_reg = gen->new_register(T_OBJECT);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   163
      __ move(obj, obj_reg);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   164
    } else {
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   165
#ifdef AARCH64
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   166
      // AArch64 expects double-size register.
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   167
      obj_reg = gen->new_pointer_register();
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   168
#else
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   169
      // x86 expects single-size register.
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   170
      obj_reg = gen->new_register(T_OBJECT);
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   171
#endif
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   172
      __ leal(obj, obj_reg);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   173
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   174
    obj = obj_reg;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   175
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   176
  return obj;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   177
}
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   178
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   179
LIR_Opr ShenandoahBarrierSetC1::storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   180
  if (ShenandoahStoreValEnqueueBarrier) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   181
    obj = ensure_in_register(gen, obj);
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   182
    pre_barrier(gen, info, decorators, LIR_OprFact::illegalOpr, obj);
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
  return obj;
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
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   187
void ShenandoahBarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   188
  if (access.is_oop()) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   189
    if (ShenandoahSATBBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   190
      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), access.resolved_addr(), LIR_OprFact::illegalOpr /* pre_val */);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   191
    }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   192
    value = storeval_barrier(access.gen(), value, access.access_emit_info(), access.decorators());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   193
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   194
  BarrierSetC1::store_at_resolved(access, value);
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
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   197
LIR_Opr ShenandoahBarrierSetC1::resolve_address(LIRAccess& access, bool resolve_in_register) {
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   198
  // We must resolve in register when patching. This is to avoid
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   199
  // having a patch area in the load barrier stub, since the call
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   200
  // into the runtime to patch will not have the proper oop map.
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   201
  const bool patch_before_barrier = access.is_oop() && (access.decorators() & C1_NEEDS_PATCHING) != 0;
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   202
  return BarrierSetC1::resolve_address(access, resolve_in_register || patch_before_barrier);
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   203
}
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   204
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   205
void ShenandoahBarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) {
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   206
  if (!access.is_oop()) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   207
    BarrierSetC1::load_at_resolved(access, result);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   208
    return;
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   209
  }
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   210
55654
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   211
  LIRGenerator* gen = access.gen();
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   212
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   213
  DecoratorSet decorators = access.decorators();
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   214
  if ((decorators & IN_NATIVE) != 0) {
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   215
    assert(access.is_oop(), "IN_NATIVE access only for oop values");
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   216
    BarrierSetC1::load_at_resolved(access, result);
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   217
    LIR_OprList* args = new LIR_OprList();
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   218
    args->append(result);
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   219
    BasicTypeList signature;
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   220
    signature.append(T_OBJECT);
55679
aa96c53c592b 8227676: Shenandoah: More consistent naming of LRB entry points
rkennke
parents: 55654
diff changeset
   221
    LIR_Opr call_result = gen->call_runtime(&signature, args,
aa96c53c592b 8227676: Shenandoah: More consistent naming of LRB entry points
rkennke
parents: 55654
diff changeset
   222
                                            CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native),
55654
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   223
                                            objectType, NULL);
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   224
    __ move(call_result, result);
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   225
    return;
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   226
  }
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   227
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   228
  if (ShenandoahLoadRefBarrier) {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   229
    LIR_Opr tmp = gen->new_register(T_OBJECT);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   230
    BarrierSetC1::load_at_resolved(access, tmp);
58219
bc0648405d67 8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents: 57716
diff changeset
   231
    tmp = load_reference_barrier(access.gen(), tmp, access.resolved_addr());
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   232
    __ move(tmp, result);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   233
  } else {
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   234
    BarrierSetC1::load_at_resolved(access, result);
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   235
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   236
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   237
  if (ShenandoahKeepAliveBarrier) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   238
    bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   239
    bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   240
    bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
54423
6c0ab8bd8da5 8221766: Load-reference barriers for Shenandoah
rkennke
parents: 52925
diff changeset
   241
    if (is_weak || is_phantom || is_anonymous) {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   242
      // Register the value in the referent field with the pre-barrier
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   243
      LabelObj *Lcont_anonymous;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   244
      if (is_anonymous) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   245
        Lcont_anonymous = new LabelObj();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   246
        generate_referent_check(access, Lcont_anonymous);
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
      pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr /* addr_opr */,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   249
                  result /* pre_val */);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   250
      if (is_anonymous) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   251
        __ branch_destination(Lcont_anonymous->label());
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   252
      }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   253
    }
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
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   257
class C1ShenandoahPreBarrierCodeGenClosure : public StubAssemblerCodeGenClosure {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   258
  virtual OopMapSet* generate_code(StubAssembler* sasm) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   259
    ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   260
    bs->generate_c1_pre_barrier_runtime_stub(sasm);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   261
    return NULL;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   262
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   263
};
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   264
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   265
class C1ShenandoahLoadReferenceBarrierCodeGenClosure : public StubAssemblerCodeGenClosure {
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   266
  virtual OopMapSet* generate_code(StubAssembler* sasm) {
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   267
    ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   268
    bs->generate_c1_load_reference_barrier_runtime_stub(sasm);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   269
    return NULL;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   270
  }
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   271
};
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   272
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   273
void ShenandoahBarrierSetC1::generate_c1_runtime_stubs(BufferBlob* buffer_blob) {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   274
  C1ShenandoahPreBarrierCodeGenClosure pre_code_gen_cl;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   275
  _pre_barrier_c1_runtime_code_blob = Runtime1::generate_blob(buffer_blob, -1,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   276
                                                              "shenandoah_pre_barrier_slow",
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   277
                                                              false, &pre_code_gen_cl);
57716
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   278
  if (ShenandoahLoadRefBarrier) {
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   279
    C1ShenandoahLoadReferenceBarrierCodeGenClosure lrb_code_gen_cl;
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   280
    _load_reference_barrier_rt_code_blob = Runtime1::generate_blob(buffer_blob, -1,
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   281
                                                                  "shenandoah_load_reference_barrier_slow",
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   282
                                                                  false, &lrb_code_gen_cl);
bfcdcd00e4fb 8228369: Shenandoah: Refactor LRB C1 stubs
rkennke
parents: 55735
diff changeset
   283
  }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
   284
}
55654
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   285
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   286
const char* ShenandoahBarrierSetC1::rtcall_name_for_address(address entry) {
55679
aa96c53c592b 8227676: Shenandoah: More consistent naming of LRB entry points
rkennke
parents: 55654
diff changeset
   287
  if (entry == CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native)) {
aa96c53c592b 8227676: Shenandoah: More consistent naming of LRB entry points
rkennke
parents: 55654
diff changeset
   288
    return "ShenandoahRuntime::load_reference_barrier_native";
55654
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   289
  }
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   290
  return NULL;
92ab031d6540 8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents: 55158
diff changeset
   291
}