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());
|