author | rkennke |
Mon, 12 Aug 2019 23:37:48 +0200 | |
changeset 57716 | bfcdcd00e4fb |
parent 57542 | db740ced41c4 |
child 57748 | 9bddbd69351c |
permissions | -rw-r--r-- |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1 |
/* |
54763
2584e5772546
8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents:
54755
diff
changeset
|
2 |
* Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved. |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
3 |
* |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
4 |
* This code is free software; you can redistribute it and/or modify it |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
5 |
* under the terms of the GNU General Public License version 2 only, as |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
6 |
* published by the Free Software Foundation. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
7 |
* |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
8 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
9 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
10 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
11 |
* version 2 for more details (a copy is included in the LICENSE file that |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
12 |
* accompanied this code). |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
13 |
* |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
14 |
* You should have received a copy of the GNU General Public License version |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
15 |
* 2 along with this work; if not, write to the Free Software Foundation, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
16 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
17 |
* |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
18 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
19 |
* or visit www.oracle.com if you need additional information or have any |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
20 |
* questions. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
21 |
* |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
22 |
*/ |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
23 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
24 |
#include "precompiled.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
25 |
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp" |
54766
1321f8cf9de5
8223567: Rename ShenandoahBrooksPointer to ShenandoahForwarding
rkennke
parents:
54763
diff
changeset
|
26 |
#include "gc/shenandoah/shenandoahForwarding.hpp" |
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
27 |
#include "gc/shenandoah/shenandoahHeap.inline.hpp" |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
28 |
#include "gc/shenandoah/shenandoahHeapRegion.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
29 |
#include "gc/shenandoah/shenandoahHeuristics.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
30 |
#include "gc/shenandoah/shenandoahRuntime.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
31 |
#include "gc/shenandoah/shenandoahThreadLocalData.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
32 |
#include "interpreter/interpreter.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
33 |
#include "interpreter/interp_masm.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
34 |
#include "runtime/sharedRuntime.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
35 |
#include "runtime/thread.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
36 |
#include "utilities/macros.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
37 |
#ifdef COMPILER1 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
38 |
#include "c1/c1_LIRAssembler.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
39 |
#include "c1/c1_MacroAssembler.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
40 |
#include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp" |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
41 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
42 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
43 |
#define __ masm-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
44 |
|
54423 | 45 |
address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL; |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
46 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
47 |
void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
48 |
Register src, Register dst, Register count) { |
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 |
bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
51 |
bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
52 |
bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
53 |
bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
54 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
55 |
if (type == T_OBJECT || type == T_ARRAY) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
56 |
#ifdef _LP64 |
54755
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
57 |
if (!checkcast) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
58 |
if (!obj_int) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
59 |
// Save count for barrier |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
60 |
__ movptr(r11, count); |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
61 |
} else if (disjoint) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
62 |
// Save dst in r11 in the disjoint case |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
63 |
__ movq(r11, dst); |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
64 |
} |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
65 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
66 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
67 |
if (disjoint) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
68 |
__ mov(rdx, dst); // save 'to' |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
69 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
70 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
71 |
|
55574
0246f81c1dcd
8227199: Shenandoah: Remove superfluous calls to can_do_traversal_gc()
rkennke
parents:
55146
diff
changeset
|
72 |
if (ShenandoahSATBBarrier && !dest_uninitialized) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
73 |
Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); |
55146 | 74 |
assert_different_registers(dst, count, thread); // we don't care about src here? |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
75 |
#ifndef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
76 |
__ push(thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
77 |
__ get_thread(thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
78 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
79 |
|
54383 | 80 |
Label done; |
81 |
// Short-circuit if count == 0. |
|
82 |
__ testptr(count, count); |
|
83 |
__ jcc(Assembler::zero, done); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
84 |
|
54383 | 85 |
// Avoid runtime call when not marking. |
86 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
|
87 |
__ testb(gc_state, ShenandoahHeap::MARKING); |
|
88 |
__ jcc(Assembler::zero, done); |
|
52925
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 |
__ pusha(); // push registers |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
91 |
#ifdef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
92 |
if (count == c_rarg0) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
93 |
if (dst == c_rarg1) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
94 |
// exactly backwards!! |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
95 |
__ xchgptr(c_rarg1, c_rarg0); |
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 |
__ movptr(c_rarg1, count); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
98 |
__ movptr(c_rarg0, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
99 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
100 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
101 |
__ movptr(c_rarg0, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
102 |
__ movptr(c_rarg1, count); |
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 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
105 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry), 2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
106 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
107 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), 2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
108 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
109 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
110 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
111 |
dst, count); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
112 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
113 |
__ popa(); |
54383 | 114 |
__ bind(done); |
115 |
NOT_LP64(__ pop(thread);) |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
116 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
117 |
} |
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 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
120 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
121 |
void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
122 |
Register src, Register dst, Register count) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
123 |
bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
124 |
bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
125 |
bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
126 |
Register tmp = rax; |
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 |
if (type == T_OBJECT || type == T_ARRAY) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
129 |
#ifdef _LP64 |
54755
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
130 |
if (!checkcast) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
131 |
if (!obj_int) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
132 |
// Save count for barrier |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
133 |
count = r11; |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
134 |
} else if (disjoint && obj_int) { |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
135 |
// Use the saved dst in the disjoint case |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
136 |
dst = r11; |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
137 |
} |
de34f4b370b0
8223244: Fix usage of ARRAYCOPY_DISJOINT decorator
rkennke
parents:
54425
diff
changeset
|
138 |
} else { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
139 |
tmp = rscratch1; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
140 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
141 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
142 |
if (disjoint) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
143 |
__ mov(dst, rdx); // restore 'to' |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
144 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
145 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
146 |
|
54425
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
147 |
Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); |
55146 | 148 |
assert_different_registers(dst, thread); // do we care about src at all here? |
149 |
||
54425
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
150 |
#ifndef _LP64 |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
151 |
__ push(thread); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
152 |
__ get_thread(thread); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
153 |
#endif |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
154 |
|
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
155 |
// Short-circuit if count == 0. |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
156 |
Label done; |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
157 |
__ testptr(count, count); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
158 |
__ jcc(Assembler::zero, done); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
159 |
|
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
160 |
// Skip runtime call if no forwarded objects. |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
161 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
162 |
__ testb(gc_state, ShenandoahHeap::UPDATEREFS); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
163 |
__ jcc(Assembler::zero, done); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
164 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
165 |
__ pusha(); // push registers (overkill) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
166 |
#ifdef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
167 |
if (c_rarg0 == count) { // On win64 c_rarg0 == rcx |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
168 |
assert_different_registers(c_rarg1, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
169 |
__ mov(c_rarg1, count); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
170 |
__ mov(c_rarg0, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
171 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
172 |
assert_different_registers(c_rarg0, count); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
173 |
__ mov(c_rarg0, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
174 |
__ mov(c_rarg1, count); |
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 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), 2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
177 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
178 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
179 |
dst, count); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
180 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
181 |
__ popa(); |
54425
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
182 |
|
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
183 |
__ bind(done); |
13c02cc7a6e5
8221848: Shenandoah: ArrayCopy post-barrier improvements
rkennke
parents:
54423
diff
changeset
|
184 |
NOT_LP64(__ pop(thread);) |
52925
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 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
188 |
void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
189 |
Register obj, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
190 |
Register pre_val, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
191 |
Register thread, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
192 |
Register tmp, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
193 |
bool tosca_live, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
194 |
bool expand_call) { |
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 |
if (ShenandoahSATBBarrier) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
197 |
satb_write_barrier_pre(masm, obj, pre_val, thread, tmp, tosca_live, expand_call); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
198 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
199 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
200 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
201 |
void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
202 |
Register obj, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
203 |
Register pre_val, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
204 |
Register thread, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
205 |
Register tmp, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
206 |
bool tosca_live, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
207 |
bool expand_call) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
208 |
// If expand_call is true then we expand the call_VM_leaf macro |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
209 |
// directly to skip generating the check by |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
210 |
// InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
211 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
212 |
#ifdef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
213 |
assert(thread == r15_thread, "must be"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
214 |
#endif // _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
215 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
216 |
Label done; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
217 |
Label runtime; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
218 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
219 |
assert(pre_val != noreg, "check this code"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
220 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
221 |
if (obj != noreg) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
222 |
assert_different_registers(obj, pre_val, tmp); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
223 |
assert(pre_val != rax, "check this code"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
224 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
225 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
226 |
Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
227 |
Address index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
228 |
Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
229 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
230 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
231 |
__ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
232 |
__ jcc(Assembler::zero, done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
233 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
234 |
// Do we need to load the previous value? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
235 |
if (obj != noreg) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
236 |
__ load_heap_oop(pre_val, Address(obj, 0), noreg, noreg, AS_RAW); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
237 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
238 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
239 |
// Is the previous value null? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
240 |
__ cmpptr(pre_val, (int32_t) NULL_WORD); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
241 |
__ jcc(Assembler::equal, done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
242 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
243 |
// Can we store original value in the thread's buffer? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
244 |
// Is index == 0? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
245 |
// (The index field is typed as size_t.) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
246 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
247 |
__ movptr(tmp, index); // tmp := *index_adr |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
248 |
__ cmpptr(tmp, 0); // tmp == 0? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
249 |
__ jcc(Assembler::equal, runtime); // If yes, goto runtime |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
250 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
251 |
__ subptr(tmp, wordSize); // tmp := tmp - wordSize |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
252 |
__ movptr(index, tmp); // *index_adr := tmp |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
253 |
__ addptr(tmp, buffer); // tmp := tmp + *buffer_adr |
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 |
// Record the previous value |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
256 |
__ movptr(Address(tmp, 0), pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
257 |
__ jmp(done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
258 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
259 |
__ bind(runtime); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
260 |
// save the live input values |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
261 |
if(tosca_live) __ push(rax); |
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 |
if (obj != noreg && obj != rax) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
264 |
__ push(obj); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
265 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
266 |
if (pre_val != rax) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
267 |
__ push(pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
268 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
269 |
// Calling the runtime using the regular call_VM_leaf mechanism generates |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
270 |
// code (generated by InterpreterMacroAssember::call_VM_leaf_base) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
271 |
// that checks that the *(ebp+frame::interpreter_frame_last_sp) == NULL. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
272 |
// |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
273 |
// If we care generating the pre-barrier without a frame (e.g. in the |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
274 |
// intrinsified Reference.get() routine) then ebp might be pointing to |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
275 |
// the caller frame and so this check will most likely fail at runtime. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
276 |
// |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
277 |
// Expanding the call directly bypasses the generation of the check. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
278 |
// So when we do not have have a full interpreter frame on the stack |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
279 |
// expand_call should be passed true. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
280 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
281 |
NOT_LP64( __ push(thread); ) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
282 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
283 |
#ifdef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
284 |
// We move pre_val into c_rarg0 early, in order to avoid smashing it, should |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
285 |
// pre_val be c_rarg1 (where the call prologue would copy thread argument). |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
286 |
// Note: this should not accidentally smash thread, because thread is always r15. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
287 |
assert(thread != c_rarg0, "smashed arg"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
288 |
if (c_rarg0 != pre_val) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
289 |
__ mov(c_rarg0, pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
290 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
291 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
292 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
293 |
if (expand_call) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
294 |
LP64_ONLY( assert(pre_val != c_rarg1, "smashed arg"); ) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
295 |
#ifdef _LP64 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
296 |
if (c_rarg1 != thread) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
297 |
__ mov(c_rarg1, thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
298 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
299 |
// Already moved pre_val into c_rarg0 above |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
300 |
#else |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
301 |
__ push(thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
302 |
__ push(pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
303 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
304 |
__ MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), 2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
305 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
306 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), LP64_ONLY(c_rarg0) NOT_LP64(pre_val), thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
307 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
308 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
309 |
NOT_LP64( __ pop(thread); ) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
310 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
311 |
// save the live input values |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
312 |
if (pre_val != rax) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
313 |
__ pop(pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
314 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
315 |
if (obj != noreg && obj != rax) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
316 |
__ pop(obj); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
317 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
318 |
if(tosca_live) __ pop(rax); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
319 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
320 |
__ bind(done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
321 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
322 |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
323 |
void ShenandoahBarrierSetAssembler::resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp) { |
54423 | 324 |
assert(ShenandoahCASBarrier, "should be enabled"); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
325 |
Label is_null; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
326 |
__ testptr(dst, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
327 |
__ jcc(Assembler::zero, is_null); |
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
328 |
resolve_forward_pointer_not_null(masm, dst, tmp); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
329 |
__ bind(is_null); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
330 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
331 |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
332 |
void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp) { |
54423 | 333 |
assert(ShenandoahCASBarrier || ShenandoahLoadRefBarrier, "should be enabled"); |
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
334 |
// The below loads the mark word, checks if the lowest two bits are |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
335 |
// set, and if so, clear the lowest two bits and copy the result |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
336 |
// to dst. Otherwise it leaves dst alone. |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
337 |
// Implementing this is surprisingly awkward. I do it here by: |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
338 |
// - Inverting the mark word |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
339 |
// - Test lowest two bits == 0 |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
340 |
// - If so, set the lowest two bits |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
341 |
// - Invert the result back, and copy to dst |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
342 |
|
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
343 |
bool borrow_reg = (tmp == noreg); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
344 |
if (borrow_reg) { |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
345 |
// No free registers available. Make one useful. |
55146 | 346 |
tmp = LP64_ONLY(rscratch1) NOT_LP64(rdx); |
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
347 |
__ push(tmp); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
348 |
} |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
349 |
|
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
350 |
Label done; |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
351 |
__ movptr(tmp, Address(dst, oopDesc::mark_offset_in_bytes())); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
352 |
__ notptr(tmp); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
353 |
__ testb(tmp, markOopDesc::marked_value); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
354 |
__ jccb(Assembler::notZero, done); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
355 |
__ orptr(tmp, markOopDesc::marked_value); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
356 |
__ notptr(tmp); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
357 |
__ mov(dst, tmp); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
358 |
__ bind(done); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
359 |
|
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
360 |
if (borrow_reg) { |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
361 |
__ pop(tmp); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
362 |
} |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
363 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
364 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
365 |
|
54423 | 366 |
void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst) { |
367 |
assert(ShenandoahLoadRefBarrier, "Should be enabled"); |
|
55146 | 368 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
369 |
Label done; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
370 |
|
55146 | 371 |
#ifdef _LP64 |
372 |
Register thread = r15_thread; |
|
373 |
#else |
|
374 |
Register thread = rcx; |
|
375 |
if (thread == dst) { |
|
376 |
thread = rbx; |
|
377 |
} |
|
378 |
__ push(thread); |
|
379 |
__ get_thread(thread); |
|
380 |
#endif |
|
381 |
assert_different_registers(dst, thread); |
|
382 |
||
383 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
384 |
__ testb(gc_state, ShenandoahHeap::HAS_FORWARDED); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
385 |
__ jccb(Assembler::zero, done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
386 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
387 |
if (dst != rax) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
388 |
__ xchgptr(dst, rax); // Move obj into rax and save rax into obj. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
389 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
390 |
|
54423 | 391 |
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb()))); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
392 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
393 |
if (dst != rax) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
394 |
__ xchgptr(rax, dst); // Swap back obj with rax. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
395 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
396 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
397 |
__ bind(done); |
55146 | 398 |
|
399 |
#ifndef _LP64 |
|
400 |
__ pop(thread); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
401 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
402 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
403 |
|
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
404 |
void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler* masm, Register dst) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
405 |
if (!ShenandoahLoadRefBarrier) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
406 |
return; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
407 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
408 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
409 |
Label done; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
410 |
Label not_null; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
411 |
Label slow_path; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
412 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
413 |
// null check |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
414 |
__ testptr(dst, dst); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
415 |
__ jcc(Assembler::notZero, not_null); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
416 |
__ jmp(done); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
417 |
__ bind(not_null); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
418 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
419 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
420 |
#ifdef _LP64 |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
421 |
Register thread = r15_thread; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
422 |
#else |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
423 |
Register thread = rcx; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
424 |
if (thread == dst) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
425 |
thread = rbx; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
426 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
427 |
__ push(thread); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
428 |
__ get_thread(thread); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
429 |
#endif |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
430 |
assert_different_registers(dst, thread); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
431 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
432 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
433 |
__ testb(gc_state, ShenandoahHeap::EVACUATION); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
434 |
#ifndef _LP64 |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
435 |
__ pop(thread); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
436 |
#endif |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
437 |
__ jccb(Assembler::notZero, slow_path); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
438 |
__ jmp(done); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
439 |
__ bind(slow_path); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
440 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
441 |
if (dst != rax) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
442 |
__ xchgptr(dst, rax); // Move obj into rax and save rax into obj. |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
443 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
444 |
__ push(rcx); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
445 |
__ push(rdx); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
446 |
__ push(rdi); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
447 |
__ push(rsi); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
448 |
#ifdef _LP64 |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
449 |
__ push(r8); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
450 |
__ push(r9); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
451 |
__ push(r10); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
452 |
__ push(r11); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
453 |
__ push(r12); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
454 |
__ push(r13); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
455 |
__ push(r14); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
456 |
__ push(r15); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
457 |
#endif |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
458 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
459 |
__ movptr(rdi, rax); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
460 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), rdi); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
461 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
462 |
#ifdef _LP64 |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
463 |
__ pop(r15); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
464 |
__ pop(r14); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
465 |
__ pop(r13); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
466 |
__ pop(r12); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
467 |
__ pop(r11); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
468 |
__ pop(r10); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
469 |
__ pop(r9); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
470 |
__ pop(r8); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
471 |
#endif |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
472 |
__ pop(rsi); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
473 |
__ pop(rdi); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
474 |
__ pop(rdx); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
475 |
__ pop(rcx); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
476 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
477 |
if (dst != rax) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
478 |
__ xchgptr(rax, dst); // Swap back obj with rax. |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
479 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
480 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
481 |
__ bind(done); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
482 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
483 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
484 |
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) { |
54423 | 485 |
if (ShenandoahStoreValEnqueueBarrier) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
486 |
storeval_barrier_impl(masm, dst, tmp); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
487 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
488 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
489 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
490 |
void ShenandoahBarrierSetAssembler::storeval_barrier_impl(MacroAssembler* masm, Register dst, Register tmp) { |
54423 | 491 |
assert(ShenandoahStoreValEnqueueBarrier, "should be enabled"); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
492 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
493 |
if (dst == noreg) return; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
494 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
495 |
if (ShenandoahStoreValEnqueueBarrier) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
496 |
// The set of registers to be saved+restored is the same as in the write-barrier above. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
497 |
// Those are the commonly used registers in the interpreter. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
498 |
__ pusha(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
499 |
// __ push_callee_saved_registers(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
500 |
__ subptr(rsp, 2 * Interpreter::stackElementSize); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
501 |
__ movdbl(Address(rsp, 0), xmm0); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
502 |
|
55146 | 503 |
#ifdef _LP64 |
504 |
Register thread = r15_thread; |
|
505 |
#else |
|
506 |
Register thread = rcx; |
|
507 |
if (thread == dst || thread == tmp) { |
|
508 |
thread = rdi; |
|
509 |
} |
|
510 |
if (thread == dst || thread == tmp) { |
|
511 |
thread = rbx; |
|
512 |
} |
|
513 |
__ get_thread(thread); |
|
514 |
#endif |
|
515 |
assert_different_registers(dst, tmp, thread); |
|
516 |
||
517 |
satb_write_barrier_pre(masm, noreg, dst, thread, tmp, true, false); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
518 |
__ movdbl(xmm0, Address(rsp, 0)); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
519 |
__ addptr(rsp, 2 * Interpreter::stackElementSize); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
520 |
//__ pop_callee_saved_registers(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
521 |
__ popa(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
522 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
523 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
524 |
|
54423 | 525 |
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst) { |
526 |
if (ShenandoahLoadRefBarrier) { |
|
527 |
Label done; |
|
528 |
__ testptr(dst, dst); |
|
529 |
__ jcc(Assembler::zero, done); |
|
530 |
load_reference_barrier_not_null(masm, dst); |
|
531 |
__ bind(done); |
|
532 |
} |
|
533 |
} |
|
534 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
535 |
void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
536 |
Register dst, Address src, Register tmp1, Register tmp_thread) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
537 |
bool on_oop = type == T_OBJECT || type == T_ARRAY; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
538 |
bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
539 |
bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0; |
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
540 |
bool not_in_heap = (decorators & IN_NATIVE) != 0; |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
541 |
bool on_reference = on_weak || on_phantom; |
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
542 |
bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
543 |
|
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
544 |
BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread); |
54423 | 545 |
if (on_oop) { |
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
546 |
if (not_in_heap) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
547 |
if (ShenandoahHeap::heap()->is_traversal_mode()) { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
548 |
load_reference_barrier(masm, dst); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
549 |
keep_alive = true; |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
550 |
} else { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
551 |
load_reference_barrier_native(masm, dst); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
552 |
} |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
553 |
} else { |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
554 |
load_reference_barrier(masm, dst); |
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
555 |
} |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
556 |
|
55718
9fbc32392798
8227635: Shenandoah: SHBSA::load_at() needs to deal IN_NATIVE load
zgu
parents:
55679
diff
changeset
|
557 |
if (ShenandoahKeepAliveBarrier && on_reference && keep_alive) { |
54423 | 558 |
const Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread); |
55146 | 559 |
assert_different_registers(dst, tmp1, tmp_thread); |
54423 | 560 |
NOT_LP64(__ get_thread(thread)); |
561 |
// Generate the SATB pre-barrier code to log the value of |
|
562 |
// the referent field in an SATB buffer. |
|
563 |
shenandoah_write_barrier_pre(masm /* masm */, |
|
564 |
noreg /* obj */, |
|
565 |
dst /* pre_val */, |
|
566 |
thread /* thread */, |
|
567 |
tmp1 /* tmp */, |
|
568 |
true /* tosca_live */, |
|
569 |
true /* expand_call */); |
|
570 |
} |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
571 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
572 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
573 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
574 |
void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
575 |
Address dst, Register val, Register tmp1, Register tmp2) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
576 |
|
54423 | 577 |
bool on_oop = type == T_OBJECT || type == T_ARRAY; |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
578 |
bool in_heap = (decorators & IN_HEAP) != 0; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
579 |
bool as_normal = (decorators & AS_NORMAL) != 0; |
54423 | 580 |
if (on_oop && in_heap) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
581 |
bool needs_pre_barrier = as_normal; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
582 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
583 |
Register tmp3 = LP64_ONLY(r8) NOT_LP64(rsi); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
584 |
Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
585 |
// flatten object address if needed |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
586 |
// We do it regardless of precise because we need the registers |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
587 |
if (dst.index() == noreg && dst.disp() == 0) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
588 |
if (dst.base() != tmp1) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
589 |
__ movptr(tmp1, dst.base()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
590 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
591 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
592 |
__ lea(tmp1, dst); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
593 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
594 |
|
55146 | 595 |
assert_different_registers(val, tmp1, tmp2, tmp3, rthread); |
596 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
597 |
#ifndef _LP64 |
55146 | 598 |
__ get_thread(rthread); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
599 |
InterpreterMacroAssembler *imasm = static_cast<InterpreterMacroAssembler*>(masm); |
55146 | 600 |
imasm->save_bcp(); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
601 |
#endif |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
602 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
603 |
if (needs_pre_barrier) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
604 |
shenandoah_write_barrier_pre(masm /*masm*/, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
605 |
tmp1 /* obj */, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
606 |
tmp2 /* pre_val */, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
607 |
rthread /* thread */, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
608 |
tmp3 /* tmp */, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
609 |
val != noreg /* tosca_live */, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
610 |
false /* expand_call */); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
611 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
612 |
if (val == noreg) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
613 |
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
614 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
615 |
storeval_barrier(masm, val, tmp3); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
616 |
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
617 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
618 |
NOT_LP64(imasm->restore_bcp()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
619 |
} else { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
620 |
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
621 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
622 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
623 |
|
57542
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
624 |
void ShenandoahBarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env, |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
625 |
Register obj, Register tmp, Label& slowpath) { |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
626 |
Label done; |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
627 |
// Resolve jobject |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
628 |
BarrierSetAssembler::try_resolve_jobject_in_native(masm, jni_env, obj, tmp, slowpath); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
629 |
|
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
630 |
// Check for null. |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
631 |
__ testptr(obj, obj); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
632 |
__ jcc(Assembler::zero, done); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
633 |
|
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
634 |
Address gc_state(jni_env, ShenandoahThreadLocalData::gc_state_offset() - JavaThread::jni_environment_offset()); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
635 |
__ testb(gc_state, ShenandoahHeap::EVACUATION); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
636 |
__ jccb(Assembler::notZero, slowpath); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
637 |
__ bind(done); |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
638 |
} |
db740ced41c4
8228532: Shenandoah: Implement SBSA::try_resolve_jobject_in_native()
zgu
parents:
55735
diff
changeset
|
639 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
640 |
// Special Shenandoah CAS implementation that handles false negatives |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
641 |
// due to concurrent evacuation. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
642 |
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
643 |
Register res, Address addr, Register oldval, Register newval, |
53519
74a5ef4c81cc
8217016: Shenandoah: Streamline generation of CAS barriers
rkennke
parents:
52925
diff
changeset
|
644 |
bool exchange, Register tmp1, Register tmp2) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
645 |
assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
646 |
assert(oldval == rax, "must be in rax for implicit use in cmpxchg"); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
647 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
648 |
Label retry, done; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
649 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
650 |
// Remember oldval for retry logic below |
55146 | 651 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
652 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
653 |
__ movl(tmp1, oldval); |
55146 | 654 |
} else |
655 |
#endif |
|
656 |
{ |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
657 |
__ movptr(tmp1, oldval); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
658 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
659 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
660 |
// Step 1. Try to CAS with given arguments. If successful, then we are done, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
661 |
// and can safely return. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
662 |
if (os::is_MP()) __ lock(); |
55146 | 663 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
664 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
665 |
__ cmpxchgl(newval, addr); |
55146 | 666 |
} else |
667 |
#endif |
|
668 |
{ |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
669 |
__ cmpxchgptr(newval, addr); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
670 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
671 |
__ jcc(Assembler::equal, done, true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
672 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
673 |
// Step 2. CAS had failed. This may be a false negative. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
674 |
// |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
675 |
// The trouble comes when we compare the to-space pointer with the from-space |
54423 | 676 |
// pointer to the same object. To resolve this, it will suffice to resolve both |
677 |
// oldval and the value from memory -- this will give both to-space pointers. |
|
678 |
// If they mismatch, then it was a legitimate failure. |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
679 |
// |
55146 | 680 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
681 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
682 |
__ decode_heap_oop(tmp1); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
683 |
} |
55146 | 684 |
#endif |
54423 | 685 |
resolve_forward_pointer(masm, tmp1); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
686 |
|
55146 | 687 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
688 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
689 |
__ movl(tmp2, oldval); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
690 |
__ decode_heap_oop(tmp2); |
55146 | 691 |
} else |
692 |
#endif |
|
693 |
{ |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
694 |
__ movptr(tmp2, oldval); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
695 |
} |
54423 | 696 |
resolve_forward_pointer(masm, tmp2); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
697 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
698 |
__ cmpptr(tmp1, tmp2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
699 |
__ jcc(Assembler::notEqual, done, true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
700 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
701 |
// Step 3. Try to CAS again with resolved to-space pointers. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
702 |
// |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
703 |
// Corner case: it may happen that somebody stored the from-space pointer |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
704 |
// to memory while we were preparing for retry. Therefore, we can fail again |
54423 | 705 |
// on retry, and so need to do this in loop, always resolving the failure |
706 |
// witness. |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
707 |
__ bind(retry); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
708 |
if (os::is_MP()) __ lock(); |
55146 | 709 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
710 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
711 |
__ cmpxchgl(newval, addr); |
55146 | 712 |
} else |
713 |
#endif |
|
714 |
{ |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
715 |
__ cmpxchgptr(newval, addr); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
716 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
717 |
__ jcc(Assembler::equal, done, true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
718 |
|
55146 | 719 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
720 |
if (UseCompressedOops) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
721 |
__ movl(tmp2, oldval); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
722 |
__ decode_heap_oop(tmp2); |
55146 | 723 |
} else |
724 |
#endif |
|
725 |
{ |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
726 |
__ movptr(tmp2, oldval); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
727 |
} |
54423 | 728 |
resolve_forward_pointer(masm, tmp2); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
729 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
730 |
__ cmpptr(tmp1, tmp2); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
731 |
__ jcc(Assembler::equal, retry, true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
732 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
733 |
// Step 4. If we need a boolean result out of CAS, check the flag again, |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
734 |
// and promote the result. Note that we handle the flag from both the CAS |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
735 |
// itself and from the retry loop. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
736 |
__ bind(done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
737 |
if (!exchange) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
738 |
assert(res != NULL, "need result register"); |
55146 | 739 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
740 |
__ setb(Assembler::equal, res); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
741 |
__ movzbl(res, res); |
55146 | 742 |
#else |
743 |
// Need something else to clean the result, because some registers |
|
744 |
// do not have byte encoding that movzbl wants. Cannot do the xor first, |
|
745 |
// because it modifies the flags. |
|
746 |
Label res_non_zero; |
|
747 |
__ movptr(res, 1); |
|
748 |
__ jcc(Assembler::equal, res_non_zero, true); |
|
749 |
__ xorptr(res, res); |
|
750 |
__ bind(res_non_zero); |
|
751 |
#endif |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
752 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
753 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
754 |
|
54763
2584e5772546
8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents:
54755
diff
changeset
|
755 |
#undef __ |
2584e5772546
8222926: Shenandoah build fails with --with-jvm-features=-compiler1
aoqi
parents:
54755
diff
changeset
|
756 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
757 |
#ifdef COMPILER1 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
758 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
759 |
#define __ ce->masm()-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
760 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
761 |
void ShenandoahBarrierSetAssembler::gen_pre_barrier_stub(LIR_Assembler* ce, ShenandoahPreBarrierStub* stub) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
762 |
ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
763 |
// At this point we know that marking is in progress. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
764 |
// If do_load() is true then we have to emit the |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
765 |
// load of the previous value; otherwise it has already |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
766 |
// been loaded into _pre_val. |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
767 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
768 |
__ bind(*stub->entry()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
769 |
assert(stub->pre_val()->is_register(), "Precondition."); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
770 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
771 |
Register pre_val_reg = stub->pre_val()->as_register(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
772 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
773 |
if (stub->do_load()) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
774 |
ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
775 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
776 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
777 |
__ cmpptr(pre_val_reg, (int32_t)NULL_WORD); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
778 |
__ jcc(Assembler::equal, *stub->continuation()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
779 |
ce->store_parameter(stub->pre_val()->as_register(), 0); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
780 |
__ call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
781 |
__ jmp(*stub->continuation()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
782 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
783 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
784 |
|
54423 | 785 |
void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assembler* ce, ShenandoahLoadReferenceBarrierStub* stub) { |
57716 | 786 |
ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1(); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
787 |
__ bind(*stub->entry()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
788 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
789 |
Register obj = stub->obj()->as_register(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
790 |
Register res = stub->result()->as_register(); |
57716 | 791 |
Register tmp1 = stub->tmp1()->as_register(); |
792 |
Register tmp2 = stub->tmp2()->as_register(); |
|
793 |
||
794 |
Label slow_path; |
|
795 |
||
796 |
assert(res == rax, "result must arrive in rax"); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
797 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
798 |
if (res != obj) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
799 |
__ mov(res, obj); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
800 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
801 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
802 |
// Check for null. |
55735
08893cf52ee9
8228364: Shenandoah: Remove unused code from ShenandoahBarrierSetC1
rkennke
parents:
55718
diff
changeset
|
803 |
__ testptr(res, res); |
57716 | 804 |
__ jcc(Assembler::zero, *stub->continuation()); |
805 |
||
806 |
// Check for object being in the collection set. |
|
807 |
__ mov(tmp1, res); |
|
808 |
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint()); |
|
809 |
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr()); |
|
810 |
__ movbool(tmp2, Address(tmp2, tmp1, Address::times_1)); |
|
811 |
__ testbool(tmp2); |
|
812 |
__ jcc(Assembler::zero, *stub->continuation()); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
813 |
|
57716 | 814 |
// Test if object is resolved. |
815 |
__ movptr(tmp1, Address(res, oopDesc::mark_offset_in_bytes())); |
|
816 |
// Test if both lowest bits are set. We trick it by negating the bits |
|
817 |
// then test for both bits clear. |
|
818 |
__ notptr(tmp1); |
|
819 |
__ testb(tmp1, markOopDesc::marked_value); |
|
820 |
__ jccb(Assembler::notZero, slow_path); |
|
821 |
// Clear both lower bits. It's still inverted, so set them, and then invert back. |
|
822 |
__ orptr(tmp1, markOopDesc::marked_value); |
|
823 |
__ notptr(tmp1); |
|
824 |
// At this point, tmp1 contains the decoded forwarding pointer. |
|
825 |
__ mov(res, tmp1); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
826 |
|
57716 | 827 |
__ jmp(*stub->continuation()); |
828 |
||
829 |
__ bind(slow_path); |
|
830 |
ce->store_parameter(res, 0); |
|
831 |
__ call(RuntimeAddress(bs->load_reference_barrier_rt_code_blob()->code_begin())); |
|
832 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
833 |
__ jmp(*stub->continuation()); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
834 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
835 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
836 |
#undef __ |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
837 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
838 |
#define __ sasm-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
839 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
840 |
void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAssembler* sasm) { |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
841 |
__ prologue("shenandoah_pre_barrier", false); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
842 |
// arg0 : previous value of memory |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
843 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
844 |
__ push(rax); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
845 |
__ push(rdx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
846 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
847 |
const Register pre_val = rax; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
848 |
const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
849 |
const Register tmp = rdx; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
850 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
851 |
NOT_LP64(__ get_thread(thread);) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
852 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
853 |
Address queue_index(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
854 |
Address buffer(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
855 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
856 |
Label done; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
857 |
Label runtime; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
858 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
859 |
// Is SATB still active? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
860 |
Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
861 |
__ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
862 |
__ jcc(Assembler::zero, done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
863 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
864 |
// Can we store original value in the thread's buffer? |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
865 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
866 |
__ movptr(tmp, queue_index); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
867 |
__ testptr(tmp, tmp); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
868 |
__ jcc(Assembler::zero, runtime); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
869 |
__ subptr(tmp, wordSize); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
870 |
__ movptr(queue_index, tmp); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
871 |
__ addptr(tmp, buffer); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
872 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
873 |
// prev_val (rax) |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
874 |
__ load_parameter(0, pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
875 |
__ movptr(Address(tmp, 0), pre_val); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
876 |
__ jmp(done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
877 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
878 |
__ bind(runtime); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
879 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
880 |
__ save_live_registers_no_oop_map(true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
881 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
882 |
// load the pre-value |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
883 |
__ load_parameter(0, rcx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
884 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_field_pre_entry), rcx, thread); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
885 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
886 |
__ restore_live_registers(true); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
887 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
888 |
__ bind(done); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
889 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
890 |
__ pop(rdx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
891 |
__ pop(rax); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
892 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
893 |
__ epilogue(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
894 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
895 |
|
57716 | 896 |
void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub(StubAssembler* sasm) { |
897 |
__ prologue("shenandoah_load_reference_barrier", false); |
|
898 |
// arg0 : object to be resolved |
|
899 |
||
900 |
__ save_live_registers_no_oop_map(true); |
|
901 |
__ load_parameter(0, c_rarg0); |
|
902 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier), c_rarg0); |
|
903 |
__ restore_live_registers_except_rax(true); |
|
904 |
||
905 |
__ epilogue(); |
|
906 |
} |
|
907 |
||
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
908 |
#undef __ |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
909 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
910 |
#endif // COMPILER1 |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
911 |
|
54423 | 912 |
address ShenandoahBarrierSetAssembler::shenandoah_lrb() { |
913 |
assert(_shenandoah_lrb != NULL, "need load reference barrier stub"); |
|
914 |
return _shenandoah_lrb; |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
915 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
916 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
917 |
#define __ cgen->assembler()-> |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
918 |
|
54423 | 919 |
address ShenandoahBarrierSetAssembler::generate_shenandoah_lrb(StubCodeGenerator* cgen) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
920 |
__ align(CodeEntryAlignment); |
54423 | 921 |
StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb"); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
922 |
address start = __ pc(); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
923 |
|
57716 | 924 |
Label resolve_oop, slow_path, done; |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
925 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
926 |
// We use RDI, which also serves as argument register for slow call. |
57716 | 927 |
// RAX always holds the src object ptr, except after the slow call, |
928 |
// then it holds the result. R8/RBX is used as temporary register. |
|
55146 | 929 |
|
930 |
Register tmp1 = rdi; |
|
931 |
Register tmp2 = LP64_ONLY(r8) NOT_LP64(rbx); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
932 |
|
55146 | 933 |
__ push(tmp1); |
934 |
__ push(tmp2); |
|
935 |
||
936 |
// Check for object being in the collection set. |
|
937 |
__ mov(tmp1, rax); |
|
938 |
__ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint()); |
|
939 |
__ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr()); |
|
940 |
__ movbool(tmp2, Address(tmp2, tmp1, Address::times_1)); |
|
941 |
__ testbool(tmp2); |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
942 |
__ jccb(Assembler::notZero, resolve_oop); |
55146 | 943 |
__ pop(tmp2); |
944 |
__ pop(tmp1); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
945 |
__ ret(0); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
946 |
|
57716 | 947 |
// Test if object is already resolved. |
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
948 |
__ bind(resolve_oop); |
55146 | 949 |
__ movptr(tmp2, Address(rax, oopDesc::mark_offset_in_bytes())); |
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
950 |
// Test if both lowest bits are set. We trick it by negating the bits |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
951 |
// then test for both bits clear. |
55146 | 952 |
__ notptr(tmp2); |
953 |
__ testb(tmp2, markOopDesc::marked_value); |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
954 |
__ jccb(Assembler::notZero, slow_path); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
955 |
// Clear both lower bits. It's still inverted, so set them, and then invert back. |
55146 | 956 |
__ orptr(tmp2, markOopDesc::marked_value); |
957 |
__ notptr(tmp2); |
|
958 |
// At this point, tmp2 contains the decoded forwarding pointer. |
|
959 |
__ mov(rax, tmp2); |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
960 |
|
57716 | 961 |
__ bind(done); |
55146 | 962 |
__ pop(tmp2); |
963 |
__ pop(tmp1); |
|
55076
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
964 |
__ ret(0); |
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
965 |
|
785a12e0f89b
8224584: Shenandoah: Eliminate forwarding pointer word
rkennke
parents:
54766
diff
changeset
|
966 |
__ bind(slow_path); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
967 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
968 |
__ push(rcx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
969 |
__ push(rdx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
970 |
__ push(rdi); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
971 |
__ push(rsi); |
55146 | 972 |
#ifdef _LP64 |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
973 |
__ push(r8); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
974 |
__ push(r9); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
975 |
__ push(r10); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
976 |
__ push(r11); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
977 |
__ push(r12); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
978 |
__ push(r13); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
979 |
__ push(r14); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
980 |
__ push(r15); |
55146 | 981 |
#endif |
982 |
||
57716 | 983 |
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier), rax); |
55146 | 984 |
|
985 |
#ifdef _LP64 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
986 |
__ pop(r15); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
987 |
__ pop(r14); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
988 |
__ pop(r13); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
989 |
__ pop(r12); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
990 |
__ pop(r11); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
991 |
__ pop(r10); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
992 |
__ pop(r9); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
993 |
__ pop(r8); |
55146 | 994 |
#endif |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
995 |
__ pop(rsi); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
996 |
__ pop(rdi); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
997 |
__ pop(rdx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
998 |
__ pop(rcx); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
999 |
|
55146 | 1000 |
__ pop(tmp2); |
1001 |
__ pop(tmp1); |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1002 |
__ ret(0); |
55146 | 1003 |
|
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1004 |
return start; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1005 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1006 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1007 |
#undef __ |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1008 |
|
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1009 |
void ShenandoahBarrierSetAssembler::barrier_stubs_init() { |
54423 | 1010 |
if (ShenandoahLoadRefBarrier) { |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1011 |
int stub_code_size = 4096; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1012 |
ResourceMark rm; |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1013 |
BufferBlob* bb = BufferBlob::create("shenandoah_barrier_stubs", stub_code_size); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1014 |
CodeBuffer buf(bb); |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1015 |
StubCodeGenerator cgen(&buf); |
54423 | 1016 |
_shenandoah_lrb = generate_shenandoah_lrb(&cgen); |
52925
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1017 |
} |
9c18c9d839d3
8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff
changeset
|
1018 |
} |