< prev index next >

src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp

Print this page




 310     __ get_thread(thread);
 311 #endif
 312   }
 313 
 314 #ifdef _LP64
 315   if (var_size_in_bytes->is_valid()) {
 316     __ addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
 317   } else {
 318     __ addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
 319   }
 320 #else
 321   if (var_size_in_bytes->is_valid()) {
 322     __ addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
 323   } else {
 324     __ addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
 325   }
 326   __ adcl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())+4), 0);
 327 #endif
 328 }
 329 

 330 void BarrierSetAssembler::nmethod_entry_barrier(MacroAssembler* masm) {
 331   BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
 332   if (bs_nm == NULL) {
 333     return;
 334   }
 335 #ifndef _LP64
 336   ShouldNotReachHere();
 337 #else
 338   Label continuation;
 339   Register thread = LP64_ONLY(r15_thread);
 340   Address disarmed_addr(thread, in_bytes(bs_nm->thread_disarmed_offset()));
 341   __ align(8);
 342   __ cmpl(disarmed_addr, 0);
 343   __ jcc(Assembler::equal, continuation);
 344   __ call(RuntimeAddress(StubRoutines::x86::method_entry_barrier()));
 345   __ bind(continuation);
 346 #endif
 347 }





















 348 
 349 void BarrierSetAssembler::c2i_entry_barrier(MacroAssembler* masm) {
 350   BarrierSetNMethod* bs = BarrierSet::barrier_set()->barrier_set_nmethod();
 351   if (bs == NULL) {
 352     return;
 353   }
 354 
 355   Label bad_call;
 356   __ cmpptr(rbx, 0); // rbx contains the incoming method for c2i adapters.
 357   __ jcc(Assembler::equal, bad_call);
 358 
 359   // Pointer chase to the method holder to find out if the method is concurrently unloading.
 360   Label method_live;
 361   __ load_method_holder_cld(rscratch1, rbx);
 362 
 363   // Is it a strong CLD?
 364   __ movl(rscratch2, Address(rscratch1, ClassLoaderData::keep_alive_offset()));
 365   __ cmpptr(rscratch2, 0);
 366   __ jcc(Assembler::greater, method_live);
 367 


 310     __ get_thread(thread);
 311 #endif
 312   }
 313 
 314 #ifdef _LP64
 315   if (var_size_in_bytes->is_valid()) {
 316     __ addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
 317   } else {
 318     __ addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
 319   }
 320 #else
 321   if (var_size_in_bytes->is_valid()) {
 322     __ addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
 323   } else {
 324     __ addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
 325   }
 326   __ adcl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())+4), 0);
 327 #endif
 328 }
 329 
 330 #ifdef _LP64
 331 void BarrierSetAssembler::nmethod_entry_barrier(MacroAssembler* masm) {
 332   BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
 333   if (bs_nm == NULL) {
 334     return;
 335   }



 336   Label continuation;
 337   Register thread = r15_thread;
 338   Address disarmed_addr(thread, in_bytes(bs_nm->thread_disarmed_offset()));
 339   __ align(8);
 340   __ cmpl(disarmed_addr, 0);
 341   __ jcc(Assembler::equal, continuation);
 342   __ call(RuntimeAddress(StubRoutines::x86::method_entry_barrier()));
 343   __ bind(continuation);

 344 }
 345 #else
 346 void BarrierSetAssembler::nmethod_entry_barrier(MacroAssembler* masm) {
 347   BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
 348   if (bs_nm == NULL) {
 349     return;
 350   }
 351 
 352   Label continuation;
 353 
 354   Register tmp = rdi;
 355   __ push(tmp);
 356   __ movptr(tmp, bs_nm->disarmed_address());
 357   Address disarmed_addr(tmp, 0);
 358   __ align(4);
 359   __ cmpl(disarmed_addr, 0);
 360   __ pop(tmp);
 361   __ jcc(Assembler::equal, continuation);
 362   __ call(RuntimeAddress(StubRoutines::x86::method_entry_barrier()));
 363   __ bind(continuation);
 364 }
 365 #endif
 366 
 367 void BarrierSetAssembler::c2i_entry_barrier(MacroAssembler* masm) {
 368   BarrierSetNMethod* bs = BarrierSet::barrier_set()->barrier_set_nmethod();
 369   if (bs == NULL) {
 370     return;
 371   }
 372 
 373   Label bad_call;
 374   __ cmpptr(rbx, 0); // rbx contains the incoming method for c2i adapters.
 375   __ jcc(Assembler::equal, bad_call);
 376 
 377   // Pointer chase to the method holder to find out if the method is concurrently unloading.
 378   Label method_live;
 379   __ load_method_holder_cld(rscratch1, rbx);
 380 
 381   // Is it a strong CLD?
 382   __ movl(rscratch2, Address(rscratch1, ClassLoaderData::keep_alive_offset()));
 383   __ cmpptr(rscratch2, 0);
 384   __ jcc(Assembler::greater, method_live);
 385 
< prev index next >