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 |