< prev index next >

src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp

Print this page




 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 


< prev index next >