1
+ #include " mmtkObjectBarrier.hpp"
2
+ #include " runtime/interfaceSupport.inline.hpp"
3
+
4
+ void MMTkObjectBarrierSetRuntime::record_modified_node_slow (void * obj) {
5
+ ::record_modified_node ((MMTk_Mutator) &Thread::current()->third_party_heap_mutator, (void *) obj);
6
+ }
7
+
8
+ void MMTkObjectBarrierSetRuntime::record_modified_node (oop src) {
9
+ record_modified_node_slow ((void *) src);
10
+ }
11
+
12
+ #define __ masm->
13
+
14
+ void MMTkObjectBarrierSetAssembler::oop_store_at (MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2) {
15
+ bool in_heap = (decorators & IN_HEAP) != 0 ;
16
+ bool as_normal = (decorators & AS_NORMAL) != 0 ;
17
+ assert ((decorators & IS_DEST_UNINITIALIZED) == 0 , " unsupported" );
18
+
19
+ if (!in_heap || val == noreg) {
20
+ BarrierSetAssembler::store_at (masm, decorators, type, dst, val, tmp1, tmp2);
21
+ return ;
22
+ }
23
+
24
+ assert_different_registers (tmp1, noreg);
25
+ assert_different_registers (tmp2, noreg);
26
+ assert_different_registers (tmp1, tmp2);
27
+
28
+ __ push (dst.base ());
29
+
30
+ if (dst.index () == noreg && dst.disp () == 0 ) {
31
+ if (dst.base () != tmp1) {
32
+ __ movptr (tmp1, dst.base ());
33
+ }
34
+ } else {
35
+ __ lea (tmp1, dst);
36
+ }
37
+
38
+ BarrierSetAssembler::store_at (masm, decorators, type, Address (tmp1, 0 ), val, noreg, noreg);
39
+
40
+ __ pop (tmp2);
41
+
42
+ record_modified_node (masm, tmp2);
43
+ }
44
+
45
+ void MMTkObjectBarrierSetAssembler::record_modified_node (MacroAssembler* masm, Register obj) {
46
+ __ pusha ();
47
+ __ movptr (c_rarg0, obj);
48
+ __ call_VM_leaf_base (CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_slow), 1 );
49
+ __ popa ();
50
+ }
51
+
52
+ #undef __
53
+
54
+ #ifdef ASSERT
55
+ #define __ gen->lir (__FILE__, __LINE__)->
56
+ #else
57
+ #define __ gen->lir ()->
58
+ #endif
59
+
60
+ void MMTkObjectBarrierSetC1::record_modified_node (LIRAccess& access, LIR_Opr src, LIR_Opr slot, LIR_Opr new_val) {
61
+ LIRGenerator* gen = access.gen ();
62
+ DecoratorSet decorators = access.decorators ();
63
+ if ((decorators & IN_HEAP) == 0 ) return ;
64
+ if (!src->is_register ()) {
65
+ LIR_Opr reg = gen->new_pointer_register ();
66
+ if (src->is_constant ()) {
67
+ __ move (src, reg);
68
+ } else {
69
+ __ leal (src, reg);
70
+ }
71
+ src = reg;
72
+ }
73
+ assert (src->is_register (), " must be a register at this point" );
74
+ if (!slot->is_register ()) {
75
+ LIR_Opr reg = gen->new_pointer_register ();
76
+ if (slot->is_constant ()) {
77
+ __ move (slot, reg);
78
+ } else {
79
+ __ leal (slot, reg);
80
+ }
81
+ slot = reg;
82
+ }
83
+ assert (slot->is_register (), " must be a register at this point" );
84
+ if (!new_val->is_register ()) {
85
+ LIR_Opr new_val_reg = gen->new_register (T_OBJECT);
86
+ if (new_val->is_constant ()) {
87
+ __ move (new_val, new_val_reg);
88
+ } else {
89
+ __ leal (new_val, new_val_reg);
90
+ }
91
+ new_val = new_val_reg;
92
+ }
93
+ assert (new_val->is_register (), " must be a register at this point" );
94
+ CodeStub* slow = new MMTkObjectBarrierStub (src, slot, new_val);
95
+ __ jump (slow);
96
+ __ branch_destination (slow->continuation ());
97
+ }
98
+
99
+ #undef __
100
+
101
+ #define __ ideal.
102
+
103
+ const TypeFunc* record_modified_node_entry_Type () {
104
+ const Type **fields = TypeTuple::fields (1 );
105
+ fields[TypeFunc::Parms+0 ] = TypeOopPtr::BOTTOM; // oop src
106
+ const TypeTuple *domain = TypeTuple::make (TypeFunc::Parms+1 , fields);
107
+ fields = TypeTuple::fields (0 );
108
+ const TypeTuple *range = TypeTuple::make (TypeFunc::Parms+0 , fields);
109
+ return TypeFunc::make (domain, range);
110
+ }
111
+
112
+ void MMTkObjectBarrierSetC2::record_modified_node (GraphKit* kit, Node* node) const {
113
+ IdealKit ideal (kit, true );
114
+ const TypeFunc *tf = record_modified_node_entry_Type ();
115
+ Node* x = __ make_leaf_call (tf, CAST_FROM_FN_PTR (address, MMTkObjectBarrierSetRuntime::record_modified_node_slow), " record_modified_node" , node);
116
+ kit->final_sync (ideal); // Final sync IdealKit and GraphKit.
117
+ }
118
+
119
+ #undef __
0 commit comments