author | zgu |
Wed, 06 Nov 2019 09:50:53 -0500 | |
changeset 58946 | 83810b7d12e7 |
parent 58694 | 199ee1bf9b3b |
child 58985 | 5606867a5e6e |
permissions | -rw-r--r-- |
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" |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
28 |
#include "gc/shenandoah/shenandoahConcurrentRoots.hpp" |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
29 |
#include "gc/shenandoah/shenandoahHeap.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
30 |
#include "gc/shenandoah/shenandoahHeapRegion.hpp" |
55654
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
31 |
#include "gc/shenandoah/shenandoahRuntime.hpp" |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
32 |
#include "gc/shenandoah/shenandoahThreadLocalData.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
33 |
#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
34 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
35 |
#ifdef ASSERT |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
36 |
#define __ gen->lir(__FILE__, __LINE__)-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
37 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
38 |
#define __ gen->lir()-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
39 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
40 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
41 |
void ShenandoahPreBarrierStub::emit_code(LIR_Assembler* ce) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
42 |
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
|
43 |
bs->gen_pre_barrier_stub(ce, this); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
44 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
45 |
|
54423 | 46 |
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
|
47 |
ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler(); |
54423 | 48 |
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
|
49 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
50 |
|
57716 | 51 |
ShenandoahBarrierSetC1::ShenandoahBarrierSetC1() : |
52 |
_pre_barrier_c1_runtime_code_blob(NULL), |
|
53 |
_load_reference_barrier_rt_code_blob(NULL) {} |
|
54 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
55 |
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
|
56 |
// 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
|
57 |
BasicType flag_type; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
58 |
bool patch = (decorators & C1_NEEDS_PATCHING) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
59 |
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
|
60 |
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
|
61 |
flag_type = T_INT; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
62 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
63 |
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
|
64 |
"Assumption"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
65 |
// 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
|
66 |
// 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
|
67 |
flag_type = T_BOOLEAN; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
68 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
69 |
LIR_Opr thrd = gen->getThreadPointer(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
70 |
LIR_Address* mark_active_flag_addr = |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
71 |
new LIR_Address(thrd, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
72 |
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
|
73 |
flag_type); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
74 |
// Read the marking-in-progress flag. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
75 |
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
|
76 |
__ load(mark_active_flag_addr, flag_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
77 |
__ 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
|
78 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
79 |
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
|
80 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
81 |
CodeStub* slow; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
82 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
83 |
if (do_load) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
84 |
assert(pre_val == LIR_OprFact::illegalOpr, "sanity"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
85 |
assert(addr_opr != LIR_OprFact::illegalOpr, "sanity"); |
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 |
if (patch) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
88 |
pre_val_patch_code = lir_patch_normal; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
89 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
90 |
pre_val = gen->new_register(T_OBJECT); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
91 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
92 |
if (!addr_opr->is_address()) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
93 |
assert(addr_opr->is_register(), "must be"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
94 |
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
|
95 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
96 |
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
|
97 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
98 |
assert(addr_opr == LIR_OprFact::illegalOpr, "sanity"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
99 |
assert(pre_val->is_register(), "must be"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
100 |
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
|
101 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
102 |
slow = new ShenandoahPreBarrierStub(pre_val); |
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 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
105 |
__ branch(lir_cond_notEqual, T_INT, slow); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
106 |
__ branch_destination(slow->continuation()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
107 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
108 |
|
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
109 |
LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) { |
54423 | 110 |
if (ShenandoahLoadRefBarrier) { |
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
111 |
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
|
112 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
113 |
return obj; |
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 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
116 |
|
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
117 |
LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, LIR_Opr addr) { |
54423 | 118 |
assert(ShenandoahLoadRefBarrier, "Should be enabled"); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
119 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
120 |
obj = ensure_in_register(gen, obj); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
121 |
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
|
122 |
addr = ensure_in_register(gen, addr); |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
123 |
assert(addr->is_register(), "must be a register at this point"); |
57716 | 124 |
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
|
125 |
__ move(obj, result); |
57716 | 126 |
LIR_Opr tmp1 = gen->new_register(T_OBJECT); |
127 |
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
|
128 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
129 |
LIR_Opr thrd = gen->getThreadPointer(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
130 |
LIR_Address* active_flag_addr = |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
131 |
new LIR_Address(thrd, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
132 |
in_bytes(ShenandoahThreadLocalData::gc_state_offset()), |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
133 |
T_BYTE); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
134 |
// Read and check the gc-state-flag. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
135 |
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
|
136 |
__ load(active_flag_addr, flag_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
137 |
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
|
138 |
ShenandoahHeap::EVACUATION | |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
139 |
ShenandoahHeap::TRAVERSAL); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
140 |
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
|
141 |
__ move(mask, mask_reg); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
142 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
143 |
if (TwoOperandLIRForm) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
144 |
__ 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
|
145 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
146 |
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
|
147 |
__ 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
|
148 |
flag_val = masked_flag; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
149 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
150 |
__ 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
|
151 |
|
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
152 |
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
|
153 |
__ branch(lir_cond_notEqual, T_INT, slow); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
154 |
__ branch_destination(slow->continuation()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
155 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
156 |
return result; |
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 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
159 |
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
|
160 |
if (!obj->is_register()) { |
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
161 |
LIR_Opr obj_reg; |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
162 |
if (obj->is_constant()) { |
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
163 |
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
|
164 |
__ move(obj, obj_reg); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
165 |
} else { |
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
166 |
#ifdef AARCH64 |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
167 |
// AArch64 expects double-size register. |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
168 |
obj_reg = gen->new_pointer_register(); |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
169 |
#else |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
170 |
// x86 expects single-size register. |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
171 |
obj_reg = gen->new_register(T_OBJECT); |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
172 |
#endif |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
173 |
__ leal(obj, obj_reg); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
174 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
175 |
obj = obj_reg; |
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 |
return obj; |
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 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
180 |
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
|
181 |
if (ShenandoahStoreValEnqueueBarrier) { |
54423 | 182 |
obj = ensure_in_register(gen, obj); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
183 |
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
|
184 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
185 |
return obj; |
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 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
188 |
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
|
189 |
if (access.is_oop()) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
190 |
if (ShenandoahSATBBarrier) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
191 |
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
|
192 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
193 |
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
|
194 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
195 |
BarrierSetC1::store_at_resolved(access, value); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
196 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
197 |
|
58219
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
198 |
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
|
199 |
// 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
|
200 |
// 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
|
201 |
// 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
|
202 |
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
|
203 |
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
|
204 |
} |
bc0648405d67
8231087: Shenandoah: Self-fixing load reference barriers for C1/C2
rkennke
parents:
57716
diff
changeset
|
205 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
206 |
void ShenandoahBarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) { |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
207 |
// 1: non-reference load, no additional barrier is needed |
54423 | 208 |
if (!access.is_oop()) { |
209 |
BarrierSetC1::load_at_resolved(access, result); |
|
210 |
return; |
|
211 |
} |
|
212 |
||
55654
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
213 |
LIRGenerator* gen = access.gen(); |
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
214 |
DecoratorSet decorators = access.decorators(); |
58694
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
215 |
|
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
216 |
// 2: load a reference from src location and apply LRB if ShenandoahLoadRefBarrier is set |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
217 |
if (ShenandoahLoadRefBarrier) { |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
218 |
// Native barrier is for concurrent root processing |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
219 |
bool in_native = (decorators & IN_NATIVE) != 0; |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
220 |
if (in_native && ShenandoahConcurrentRoots::can_do_concurrent_roots()) { |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
221 |
BarrierSetC1::load_at_resolved(access, result); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
222 |
LIR_OprList* args = new LIR_OprList(); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
223 |
LIR_Opr addr = access.resolved_addr(); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
224 |
addr = ensure_in_register(gen, addr); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
225 |
args->append(result); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
226 |
args->append(addr); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
227 |
BasicTypeList signature; |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
228 |
signature.append(T_OBJECT); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
229 |
signature.append(T_ADDRESS); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
230 |
LIR_Opr call_result = gen->call_runtime(&signature, args, |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
231 |
CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
232 |
objectType, NULL); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
233 |
__ move(call_result, result); |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
234 |
} else { |
58694
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
235 |
LIR_Opr tmp = gen->new_register(T_OBJECT); |
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
236 |
BarrierSetC1::load_at_resolved(access, tmp); |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
237 |
tmp = load_reference_barrier(gen, tmp, access.resolved_addr()); |
58694
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
238 |
__ move(tmp, result); |
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
239 |
} |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
240 |
} else { |
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
241 |
BarrierSetC1::load_at_resolved(access, result); |
54423 | 242 |
} |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
243 |
|
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
244 |
// 3: apply keep-alive barrier if ShenandoahKeepAliveBarrier is set |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
245 |
if (ShenandoahKeepAliveBarrier) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
246 |
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
|
247 |
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
|
248 |
bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0; |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
249 |
bool is_traversal_mode = ShenandoahHeap::heap()->is_traversal_mode(); |
58694
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
250 |
bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0 || is_traversal_mode; |
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
251 |
|
199ee1bf9b3b
8232008: Shenandoah: C1 load barrier does not match interpreter version
zgu
parents:
58693
diff
changeset
|
252 |
if ((is_weak || is_phantom || is_anonymous) && keep_alive) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
253 |
// 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
|
254 |
LabelObj *Lcont_anonymous; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
255 |
if (is_anonymous) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
256 |
Lcont_anonymous = new LabelObj(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
257 |
generate_referent_check(access, Lcont_anonymous); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
258 |
} |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
259 |
pre_barrier(gen, access.access_emit_info(), decorators, LIR_OprFact::illegalOpr /* addr_opr */, |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
260 |
result /* pre_val */); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
261 |
if (is_anonymous) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
262 |
__ branch_destination(Lcont_anonymous->label()); |
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 |
} |
58946
83810b7d12e7
8233401: Shenandoah: Refactor/cleanup Shenandoah load barrier code
zgu
parents:
58694
diff
changeset
|
265 |
} |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
266 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
267 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
268 |
class C1ShenandoahPreBarrierCodeGenClosure : public StubAssemblerCodeGenClosure { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
269 |
virtual OopMapSet* generate_code(StubAssembler* sasm) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
270 |
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
|
271 |
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
|
272 |
return NULL; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
273 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
274 |
}; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
275 |
|
57716 | 276 |
class C1ShenandoahLoadReferenceBarrierCodeGenClosure : public StubAssemblerCodeGenClosure { |
277 |
virtual OopMapSet* generate_code(StubAssembler* sasm) { |
|
278 |
ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler(); |
|
279 |
bs->generate_c1_load_reference_barrier_runtime_stub(sasm); |
|
280 |
return NULL; |
|
281 |
} |
|
282 |
}; |
|
283 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
284 |
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
|
285 |
C1ShenandoahPreBarrierCodeGenClosure pre_code_gen_cl; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
286 |
_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
|
287 |
"shenandoah_pre_barrier_slow", |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
288 |
false, &pre_code_gen_cl); |
57716 | 289 |
if (ShenandoahLoadRefBarrier) { |
290 |
C1ShenandoahLoadReferenceBarrierCodeGenClosure lrb_code_gen_cl; |
|
291 |
_load_reference_barrier_rt_code_blob = Runtime1::generate_blob(buffer_blob, -1, |
|
292 |
"shenandoah_load_reference_barrier_slow", |
|
293 |
false, &lrb_code_gen_cl); |
|
294 |
} |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
295 |
} |
55654
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
296 |
|
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
297 |
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
|
298 |
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
|
299 |
return "ShenandoahRuntime::load_reference_barrier_native"; |
55654
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
300 |
} |
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
301 |
return NULL; |
92ab031d6540
8226695: Shenandoah: Wire C1 and C2 IN_NATIVE barrier
rkennke
parents:
55158
diff
changeset
|
302 |
} |