< prev index next >

src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp

Print this page
rev 58026 : [mq]: JDK-8238851-2.patch


 807   Register pre_val_reg = stub->pre_val()->as_register();
 808 
 809   if (stub->do_load()) {
 810     ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/);
 811   }
 812 
 813   __ cmpptr(pre_val_reg, (int32_t)NULL_WORD);
 814   __ jcc(Assembler::equal, *stub->continuation());
 815   ce->store_parameter(stub->pre_val()->as_register(), 0);
 816   __ call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin()));
 817   __ jmp(*stub->continuation());
 818 
 819 }
 820 
 821 void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assembler* ce, ShenandoahLoadReferenceBarrierStub* stub) {
 822   ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
 823   __ bind(*stub->entry());
 824 
 825   Register obj = stub->obj()->as_register();
 826   Register res = stub->result()->as_register();
 827   Register addr = stub->addr()->as_register();
 828   Register tmp1 = stub->tmp1()->as_register();
 829   Register tmp2 = stub->tmp2()->as_register();
 830   assert_different_registers(obj, res, addr, tmp1, tmp2);
 831 
 832   Label slow_path;
 833 
 834   assert(res == rax, "result must arrive in rax");
 835 
 836   if (res != obj) {
 837     __ mov(res, obj);
 838   }
 839 
 840   // Check for null.
 841   __ testptr(res, res);
 842   __ jcc(Assembler::zero, *stub->continuation());
 843 
 844   // Check for object being in the collection set.
 845   __ mov(tmp1, res);
 846   __ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
 847   __ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());




 807   Register pre_val_reg = stub->pre_val()->as_register();
 808 
 809   if (stub->do_load()) {
 810     ce->mem2reg(stub->addr(), stub->pre_val(), T_OBJECT, stub->patch_code(), stub->info(), false /*wide*/, false /*unaligned*/);
 811   }
 812 
 813   __ cmpptr(pre_val_reg, (int32_t)NULL_WORD);
 814   __ jcc(Assembler::equal, *stub->continuation());
 815   ce->store_parameter(stub->pre_val()->as_register(), 0);
 816   __ call(RuntimeAddress(bs->pre_barrier_c1_runtime_code_blob()->code_begin()));
 817   __ jmp(*stub->continuation());
 818 
 819 }
 820 
 821 void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assembler* ce, ShenandoahLoadReferenceBarrierStub* stub) {
 822   ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set()->barrier_set_c1();
 823   __ bind(*stub->entry());
 824 
 825   Register obj = stub->obj()->as_register();
 826   Register res = stub->result()->as_register();
 827   Register addr = stub->addr()->as_pointer_register();
 828   Register tmp1 = stub->tmp1()->as_register();
 829   Register tmp2 = stub->tmp2()->as_register();
 830   assert_different_registers(obj, res, addr, tmp1, tmp2);
 831 
 832   Label slow_path;
 833 
 834   assert(res == rax, "result must arrive in rax");
 835 
 836   if (res != obj) {
 837     __ mov(res, obj);
 838   }
 839 
 840   // Check for null.
 841   __ testptr(res, res);
 842   __ jcc(Assembler::zero, *stub->continuation());
 843 
 844   // Check for object being in the collection set.
 845   __ mov(tmp1, res);
 846   __ shrptr(tmp1, ShenandoahHeapRegion::region_size_bytes_shift_jint());
 847   __ movptr(tmp2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr());


< prev index next >