< prev index next >

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

Print this page




 261   BLOCK_COMMENT("} ZBarrierSetAssembler::try_resolve_jobject_in_native");
 262 }
 263 
 264 #ifdef COMPILER1
 265 
 266 #undef __
 267 #define __ ce->masm()->
 268 
 269 void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
 270                                                          LIR_Opr ref) const {
 271   __ testptr(ref->as_register(), address_bad_mask_from_thread(r15_thread));
 272 }
 273 
 274 void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
 275                                                          ZLoadBarrierStubC1* stub) const {
 276   // Stub entry
 277   __ bind(*stub->entry());
 278 
 279   Register ref = stub->ref()->as_register();
 280   Register ref_addr = noreg;

 281 
 282   if (stub->tmp()->is_valid()) {
 283     // Load address into tmp register
 284     ce->leal(stub->ref_addr(), stub->tmp());
 285     ref_addr = stub->tmp()->as_pointer_register();
 286   } else {
 287     // Address already in register
 288     ref_addr = stub->ref_addr()->as_address_ptr()->base()->as_pointer_register();
 289   }
 290 
 291   assert_different_registers(ref, ref_addr, noreg);
 292 
 293   // Save rax unless it is the result register
 294   if (ref != rax) {
 295     __ push(rax);
 296   }
 297 
 298   // Setup arguments and call runtime stub
 299   __ subptr(rsp, 2 * BytesPerWord);
 300   ce->store_parameter(ref_addr, 1);
 301   ce->store_parameter(ref, 0);
 302   __ call(RuntimeAddress(stub->runtime_stub()));
 303   __ addptr(rsp, 2 * BytesPerWord);
 304 
 305   // Verify result
 306   __ verify_oop(rax, "Bad oop");
 307 
 308   // Restore rax unless it is the result register
 309   if (ref != rax) {
 310     __ movptr(ref, rax);




 311     __ pop(rax);
 312   }
 313 
 314   // Stub exit
 315   __ jmp(*stub->continuation());
 316 }
 317 
 318 #undef __
 319 #define __ sasm->
 320 
 321 void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler* sasm,
 322                                                                  DecoratorSet decorators) const {
 323   // Enter and save registers
 324   __ enter();
 325   __ save_live_registers_no_oop_map(true /* save_fpu_registers */);
 326 
 327   // Setup arguments
 328   __ load_parameter(1, c_rarg1);
 329   __ load_parameter(0, c_rarg0);
 330 




 261   BLOCK_COMMENT("} ZBarrierSetAssembler::try_resolve_jobject_in_native");
 262 }
 263 
 264 #ifdef COMPILER1
 265 
 266 #undef __
 267 #define __ ce->masm()->
 268 
 269 void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
 270                                                          LIR_Opr ref) const {
 271   __ testptr(ref->as_register(), address_bad_mask_from_thread(r15_thread));
 272 }
 273 
 274 void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
 275                                                          ZLoadBarrierStubC1* stub) const {
 276   // Stub entry
 277   __ bind(*stub->entry());
 278 
 279   Register ref = stub->ref()->as_register();
 280   Register ref_addr = noreg;
 281   Register tmp = noreg;
 282 
 283   if (stub->tmp()->is_valid()) {
 284     // Load address into tmp register
 285     ce->leal(stub->ref_addr(), stub->tmp());
 286     ref_addr = tmp = stub->tmp()->as_pointer_register();
 287   } else {
 288     // Address already in register
 289     ref_addr = stub->ref_addr()->as_address_ptr()->base()->as_pointer_register();
 290   }
 291 
 292   assert_different_registers(ref, ref_addr, noreg);
 293 
 294   // Save rax unless it is the result or tmp register
 295   if (ref != rax && tmp != rax) {
 296     __ push(rax);
 297   }
 298 
 299   // Setup arguments and call runtime stub
 300   __ subptr(rsp, 2 * BytesPerWord);
 301   ce->store_parameter(ref_addr, 1);
 302   ce->store_parameter(ref, 0);
 303   __ call(RuntimeAddress(stub->runtime_stub()));
 304   __ addptr(rsp, 2 * BytesPerWord);
 305 
 306   // Verify result
 307   __ verify_oop(rax, "Bad oop");
 308 
 309   // Move result into place
 310   if (ref != rax) {
 311     __ movptr(ref, rax);
 312   }
 313 
 314   // Restore rax unless it is the result or tmp register
 315   if (ref != rax && tmp != rax) {
 316     __ pop(rax);
 317   }
 318 
 319   // Stub exit
 320   __ jmp(*stub->continuation());
 321 }
 322 
 323 #undef __
 324 #define __ sasm->
 325 
 326 void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler* sasm,
 327                                                                  DecoratorSet decorators) const {
 328   // Enter and save registers
 329   __ enter();
 330   __ save_live_registers_no_oop_map(true /* save_fpu_registers */);
 331 
 332   // Setup arguments
 333   __ load_parameter(1, c_rarg1);
 334   __ load_parameter(0, c_rarg0);
 335 


< prev index next >