97 |
97 |
98 // we use S0 as bcp, be sure you have bcp in S0 before you call any of the Template generator |
98 // we use S0 as bcp, be sure you have bcp in S0 before you call any of the Template generator |
99 Address TemplateTable::at_bcp(int offset) { |
99 Address TemplateTable::at_bcp(int offset) { |
100 assert(_desc->uses_bcp(), "inconsistent uses_bcp information"); |
100 assert(_desc->uses_bcp(), "inconsistent uses_bcp information"); |
101 return Address(BCP, offset); |
101 return Address(BCP, offset); |
|
102 } |
|
103 |
|
104 // Miscelaneous helper routines |
|
105 // Store an oop (or NULL) at the address described by obj. |
|
106 // If val == noreg this means store a NULL |
|
107 |
|
108 static void do_oop_store(InterpreterMacroAssembler* _masm, |
|
109 Address obj, |
|
110 Register val, |
|
111 BarrierSet::Name barrier, |
|
112 bool precise) { |
|
113 assert(val == noreg || val == V0, "parameter is just for looks"); |
|
114 switch (barrier) { |
|
115 #if INCLUDE_ALL_GCS |
|
116 // case BarrierSet::G1SATBCT: |
|
117 // case BarrierSet::G1SATBCTLogging: |
|
118 // { |
|
119 // // flatten object address if needed |
|
120 // if (obj.index() == noreg && obj.disp() == 0) { |
|
121 // if (obj.base() != rdx) { |
|
122 // __ movq(rdx, obj.base()); |
|
123 // } |
|
124 // } else { |
|
125 // __ leaq(rdx, obj); |
|
126 // } |
|
127 // __ g1_write_barrier_pre(rdx /* obj */, |
|
128 // rbx /* pre_val */, |
|
129 // r15_thread /* thread */, |
|
130 // r8 /* tmp */, |
|
131 // val != noreg /* tosca_live */, |
|
132 // false /* expand_call */); |
|
133 // if (val == noreg) { |
|
134 // __ store_heap_oop_null(Address(rdx, 0)); |
|
135 // } else { |
|
136 // // G1 barrier needs uncompressed oop for region cross check. |
|
137 // Register new_val = val; |
|
138 // if (UseCompressedOops) { |
|
139 // new_val = rbx; |
|
140 // __ movptr(new_val, val); |
|
141 // } |
|
142 // __ store_heap_oop(Address(rdx, 0), val); |
|
143 // __ g1_write_barrier_post(rdx /* store_adr */, |
|
144 // new_val /* new_val */, |
|
145 // r15_thread /* thread */, |
|
146 // r8 /* tmp */, |
|
147 // rbx /* tmp2 */); |
|
148 // } |
|
149 // } |
|
150 break; |
|
151 #endif // INCLUDE_ALL_GCS |
|
152 case BarrierSet::CardTableModRef: |
|
153 case BarrierSet::CardTableExtension: |
|
154 { |
|
155 if (val == noreg) { |
|
156 __ store_heap_oop_null(obj); |
|
157 } else { |
|
158 __ store_heap_oop(obj, val); |
|
159 // flatten object address if needed |
|
160 if (!precise || (obj.index() == noreg && obj.disp() == 0)) { |
|
161 __ store_check(obj.base()); |
|
162 } else { |
|
163 //__ leaq(rdx, obj); |
|
164 //__ store_check(rdx); |
|
165 } |
|
166 } |
|
167 } |
|
168 break; |
|
169 case BarrierSet::ModRef: |
|
170 case BarrierSet::Other: |
|
171 if (val == noreg) { |
|
172 __ store_heap_oop_null(obj); |
|
173 } else { |
|
174 __ store_heap_oop(obj, val); |
|
175 } |
|
176 break; |
|
177 default : |
|
178 ShouldNotReachHere(); |
|
179 |
|
180 } |
102 } |
181 } |
103 |
182 |
104 // bytecode folding |
183 // bytecode folding |
105 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, |
184 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, |
106 Register tmp_reg, bool load_bc_into_bc_reg/*=true*/, |
185 Register tmp_reg, bool load_bc_into_bc_reg/*=true*/, |