21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 *
25 */
26
27 #include "precompiled.hpp"
28 #include "asm/macroAssembler.hpp"
29 #include "interpreter/interpreter.hpp"
30 #include "interpreter/interpreterRuntime.hpp"
31 #include "interpreter/templateTable.hpp"
32 #include "memory/universe.inline.hpp"
33 #include "oops/methodData.hpp"
34 #include "oops/method.hpp"
35 #include "oops/objArrayKlass.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "prims/methodHandles.hpp"
38 #include "runtime/sharedRuntime.hpp"
39 #include "runtime/stubRoutines.hpp"
40 #include "runtime/synchronizer.hpp"
41
42 #ifndef CC_INTERP
43
44 #define __ _masm->
45
46 // Platform-dependent initialization
47
48 void TemplateTable::pd_initialize() {
49 // No amd64 specific initialization
50 }
51
52 // Address computation: local variables
53
54 static inline Address iaddress(int n) {
55 return Address(rlocals, Interpreter::local_offset_in_bytes(n));
56 }
57
58 static inline Address laddress(int n) {
59 return iaddress(n + 1);
60 }
135 case TemplateTable::greater_equal: return Assembler::LT;
136 }
137 ShouldNotReachHere();
138 return Assembler::EQ;
139 }
140
141
142 // Miscelaneous helper routines
143 // Store an oop (or NULL) at the Address described by obj.
144 // If val == noreg this means store a NULL
145 static void do_oop_store(InterpreterMacroAssembler* _masm,
146 Address obj,
147 Register val,
148 BarrierSet::Name barrier,
149 bool precise) {
150 assert(val == noreg || val == r0, "parameter is just for looks");
151 switch (barrier) {
152 #if INCLUDE_ALL_GCS
153 case BarrierSet::G1SATBCT:
154 case BarrierSet::G1SATBCTLogging:
155 case BarrierSet::ShenandoahBarrierSet:
156 {
157 // flatten object address if needed
158 if (obj.index() == noreg && obj.offset() == 0) {
159 if (obj.base() != r3) {
160 __ mov(r3, obj.base());
161 }
162 } else {
163 __ lea(r3, obj);
164 }
165 __ g1_write_barrier_pre(r3 /* obj */,
166 r1 /* pre_val */,
167 rthread /* thread */,
168 r10 /* tmp */,
169 val != noreg /* tosca_live */,
170 false /* expand_call */);
171 if (val == noreg) {
172 __ store_heap_oop_null(Address(r3, 0));
173 } else {
174 // G1 barrier needs uncompressed oop for region cross check.
175 Register new_val = val;
176 if (UseCompressedOops) {
177 new_val = rscratch2;
178 __ mov(new_val, val);
179 }
180
181 __ store_heap_oop(Address(r3, 0), val);
182
183 __ g1_write_barrier_post(r3 /* store_adr */,
184 new_val /* new_val */,
185 rthread /* thread */,
186 r10 /* tmp */,
187 r1 /* tmp2 */);
188 }
189
190 }
191 break;
192 #endif // INCLUDE_ALL_GCS
193 case BarrierSet::CardTableModRef:
194 case BarrierSet::CardTableExtension:
195 {
196 if (val == noreg) {
197 __ store_heap_oop_null(obj);
198 } else {
199 __ store_heap_oop(obj, val);
200 // flatten object address if needed
201 if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
202 __ store_check(obj.base());
203 } else {
204 __ lea(r3, obj);
205 __ store_check(r3);
206 }
207 }
|
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 *
25 */
26
27 #include "precompiled.hpp"
28 #include "asm/macroAssembler.hpp"
29 #include "interpreter/interpreter.hpp"
30 #include "interpreter/interpreterRuntime.hpp"
31 #include "interpreter/templateTable.hpp"
32 #include "memory/universe.inline.hpp"
33 #include "oops/methodData.hpp"
34 #include "oops/method.hpp"
35 #include "oops/objArrayKlass.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "prims/methodHandles.hpp"
38 #include "runtime/sharedRuntime.hpp"
39 #include "runtime/stubRoutines.hpp"
40 #include "runtime/synchronizer.hpp"
41 #if INCLUDE_ALL_GCS
42 #include "shenandoahBarrierSetAssembler_aarch64.hpp"
43 #endif
44
45 #ifndef CC_INTERP
46
47 #define __ _masm->
48
49 // Platform-dependent initialization
50
51 void TemplateTable::pd_initialize() {
52 // No amd64 specific initialization
53 }
54
55 // Address computation: local variables
56
57 static inline Address iaddress(int n) {
58 return Address(rlocals, Interpreter::local_offset_in_bytes(n));
59 }
60
61 static inline Address laddress(int n) {
62 return iaddress(n + 1);
63 }
138 case TemplateTable::greater_equal: return Assembler::LT;
139 }
140 ShouldNotReachHere();
141 return Assembler::EQ;
142 }
143
144
145 // Miscelaneous helper routines
146 // Store an oop (or NULL) at the Address described by obj.
147 // If val == noreg this means store a NULL
148 static void do_oop_store(InterpreterMacroAssembler* _masm,
149 Address obj,
150 Register val,
151 BarrierSet::Name barrier,
152 bool precise) {
153 assert(val == noreg || val == r0, "parameter is just for looks");
154 switch (barrier) {
155 #if INCLUDE_ALL_GCS
156 case BarrierSet::G1SATBCT:
157 case BarrierSet::G1SATBCTLogging:
158 {
159 // flatten object address if needed
160 if (obj.index() == noreg && obj.offset() == 0) {
161 if (obj.base() != r3) {
162 __ mov(r3, obj.base());
163 }
164 } else {
165 __ lea(r3, obj);
166 }
167 __ g1_write_barrier_pre(r3 /* obj */,
168 r1 /* pre_val */,
169 rthread /* thread */,
170 r10 /* tmp */,
171 val != noreg /* tosca_live */,
172 false /* expand_call */);
173 if (val == noreg) {
174 __ store_heap_oop_null(Address(r3, 0));
175 } else {
176 // G1 barrier needs uncompressed oop for region cross check.
177 Register new_val = val;
178 if (UseCompressedOops) {
179 new_val = rscratch2;
180 __ mov(new_val, val);
181 }
182
183 __ store_heap_oop(Address(r3, 0), val);
184
185 __ g1_write_barrier_post(r3 /* store_adr */,
186 new_val /* new_val */,
187 rthread /* thread */,
188 r10 /* tmp */,
189 r1 /* tmp2 */);
190 }
191
192 }
193 break;
194 case BarrierSet::ShenandoahBarrierSet:
195 {
196 // flatten object address if needed
197 if (obj.index() == noreg && obj.offset() == 0) {
198 if (obj.base() != r3) {
199 __ mov(r3, obj.base());
200 }
201 } else {
202 __ lea(r3, obj);
203 }
204 if (ShenandoahSATBBarrier) {
205 __ g1_write_barrier_pre(r3 /* obj */,
206 r1 /* pre_val */,
207 rthread /* thread */,
208 r10 /* tmp */,
209 val != noreg /* tosca_live */,
210 false /* expand_call */);
211 }
212 if (val == noreg) {
213 __ store_heap_oop_null(Address(r3, 0));
214 } else {
215 if (ShenandoahStoreValEnqueueBarrier) {
216 ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r10);
217 }
218 __ store_heap_oop(Address(r3, 0), val);
219 }
220
221 }
222 break;
223 #endif // INCLUDE_ALL_GCS
224 case BarrierSet::CardTableModRef:
225 case BarrierSet::CardTableExtension:
226 {
227 if (val == noreg) {
228 __ store_heap_oop_null(obj);
229 } else {
230 __ store_heap_oop(obj, val);
231 // flatten object address if needed
232 if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
233 __ store_check(obj.base());
234 } else {
235 __ lea(r3, obj);
236 __ store_check(r3);
237 }
238 }
|