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 } 165 r1 /* pre_val */, 166 rthread /* thread */, 167 r10 /* tmp */, 168 val != noreg /* tosca_live */, 169 false /* expand_call */); 170 if (val == noreg) { 171 __ store_heap_oop_null(Address(r3, 0)); 172 } else { 173 // G1 barrier needs uncompressed oop for region cross check. 174 Register new_val = val; 175 if (UseCompressedOops) { 176 new_val = rscratch2; 177 __ mov(new_val, val); 178 } 179 __ store_heap_oop(Address(r3, 0), val); 180 __ g1_write_barrier_post(r3 /* store_adr */, 181 new_val /* new_val */, 182 rthread /* thread */, 183 r10 /* tmp */, 184 r1 /* tmp2 */); 185 } 186 187 } 188 break; 189 #endif // INCLUDE_ALL_GCS 190 case BarrierSet::CardTableModRef: 191 case BarrierSet::CardTableExtension: 192 { 193 if (val == noreg) { 194 __ store_heap_oop_null(obj); 195 } else { 196 __ store_heap_oop(obj, val); 197 // flatten object address if needed 198 if (!precise || (obj.index() == noreg && obj.offset() == 0)) { 199 __ store_check(obj.base()); 200 } else { 201 __ lea(r3, obj); 202 __ store_check(r3); 203 } 204 } | 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 } 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 __ store_heap_oop(Address(r3, 0), val); 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 case BarrierSet::ShenandoahBarrierSet: 193 { 194 // flatten object address if needed 195 if (obj.index() == noreg && obj.offset() == 0) { 196 if (obj.base() != r3) { 197 __ mov(r3, obj.base()); 198 } 199 } else { 200 __ lea(r3, obj); 201 } 202 if (ShenandoahSATBBarrier) { 203 __ g1_write_barrier_pre(r3 /* obj */, 204 r1 /* pre_val */, 205 rthread /* thread */, 206 r10 /* tmp */, 207 val != noreg /* tosca_live */, 208 false /* expand_call */); 209 } 210 if (val == noreg) { 211 __ store_heap_oop_null(Address(r3, 0)); 212 } else { 213 if (ShenandoahStoreValEnqueueBarrier) { 214 ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r10); 215 } 216 __ store_heap_oop(Address(r3, 0), val); 217 } 218 219 } 220 break; 221 #endif // INCLUDE_ALL_GCS 222 case BarrierSet::CardTableModRef: 223 case BarrierSet::CardTableExtension: 224 { 225 if (val == noreg) { 226 __ store_heap_oop_null(obj); 227 } else { 228 __ store_heap_oop(obj, val); 229 // flatten object address if needed 230 if (!precise || (obj.index() == noreg && obj.offset() == 0)) { 231 __ store_check(obj.base()); 232 } else { 233 __ lea(r3, obj); 234 __ store_check(r3); 235 } 236 } |