263 #define __ ce->masm()->
264
265 void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
266 LIR_Opr ref) const {
267 __ testptr(ref->as_register(), address_bad_mask_from_thread(r15_thread));
268 }
269
270 void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
271 ZLoadBarrierStubC1* stub) const {
272 // Stub entry
273 __ bind(*stub->entry());
274
275 Register ref = stub->ref()->as_register();
276 Register ref_addr = noreg;
277
278 if (stub->ref_addr()->is_register()) {
279 // Address already in register
280 ref_addr = stub->ref_addr()->as_pointer_register();
281 } else {
282 // Load address into tmp register
283 ce->leal(stub->ref_addr(), stub->tmp(), stub->patch_code(), stub->patch_info());
284 ref_addr = stub->tmp()->as_pointer_register();
285 }
286
287 assert_different_registers(ref, ref_addr, noreg);
288
289 // Save rax unless it is the result register
290 if (ref != rax) {
291 __ push(rax);
292 }
293
294 // Setup arguments and call runtime stub
295 __ subptr(rsp, 2 * BytesPerWord);
296 ce->store_parameter(ref_addr, 1);
297 ce->store_parameter(ref, 0);
298 __ call(RuntimeAddress(stub->runtime_stub()));
299 __ addptr(rsp, 2 * BytesPerWord);
300
301 // Verify result
302 __ verify_oop(rax, "Bad oop");
303
|
263 #define __ ce->masm()->
264
265 void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
266 LIR_Opr ref) const {
267 __ testptr(ref->as_register(), address_bad_mask_from_thread(r15_thread));
268 }
269
270 void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
271 ZLoadBarrierStubC1* stub) const {
272 // Stub entry
273 __ bind(*stub->entry());
274
275 Register ref = stub->ref()->as_register();
276 Register ref_addr = noreg;
277
278 if (stub->ref_addr()->is_register()) {
279 // Address already in register
280 ref_addr = stub->ref_addr()->as_pointer_register();
281 } else {
282 // Load address into tmp register
283 ce->leal(stub->ref_addr(), stub->tmp());
284 ref_addr = stub->tmp()->as_pointer_register();
285 }
286
287 assert_different_registers(ref, ref_addr, noreg);
288
289 // Save rax unless it is the result register
290 if (ref != rax) {
291 __ push(rax);
292 }
293
294 // Setup arguments and call runtime stub
295 __ subptr(rsp, 2 * BytesPerWord);
296 ce->store_parameter(ref_addr, 1);
297 ce->store_parameter(ref, 0);
298 __ call(RuntimeAddress(stub->runtime_stub()));
299 __ addptr(rsp, 2 * BytesPerWord);
300
301 // Verify result
302 __ verify_oop(rax, "Bad oop");
303
|