< prev index next >

src/hotspot/cpu/riscv/gc/shenandoah/shenandoahBarrierSetAssembler_riscv.cpp

Print this page

505 
506   Register obj = stub->obj()->as_register();
507   Register res = stub->result()->as_register();
508   Register addr = stub->addr()->as_pointer_register();
509   Register tmp1 = stub->tmp1()->as_register();
510   Register tmp2 = stub->tmp2()->as_register();
511 
512   assert(res == x10, "result must arrive in x10");
513   assert_different_registers(tmp1, tmp2, t0);
514 
515   if (res != obj) {
516     __ mv(res, obj);
517   }
518 
519   if (is_strong) {
520     // Check for object in cset.
521     __ mv(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
522     __ srli(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
523     __ add(tmp2, tmp2, tmp1);
524     __ lbu(tmp2, Address(tmp2));
525     __ beqz(tmp2, *stub->continuation(), true /* is_far */);
526   }
527 
528   ce->store_parameter(res, 0);
529   ce->store_parameter(addr, 1);
530 
531   if (is_strong) {
532     if (is_native) {
533       __ far_call(RuntimeAddress(bs->load_reference_barrier_strong_native_rt_code_blob()->code_begin()));
534     } else {
535       __ far_call(RuntimeAddress(bs->load_reference_barrier_strong_rt_code_blob()->code_begin()));
536     }
537   } else if (is_weak) {
538     __ far_call(RuntimeAddress(bs->load_reference_barrier_weak_rt_code_blob()->code_begin()));
539   } else {
540     assert(is_phantom, "only remaining strength");
541     __ far_call(RuntimeAddress(bs->load_reference_barrier_phantom_rt_code_blob()->code_begin()));
542   }
543 
544   __ j(*stub->continuation());
545 }

505 
506   Register obj = stub->obj()->as_register();
507   Register res = stub->result()->as_register();
508   Register addr = stub->addr()->as_pointer_register();
509   Register tmp1 = stub->tmp1()->as_register();
510   Register tmp2 = stub->tmp2()->as_register();
511 
512   assert(res == x10, "result must arrive in x10");
513   assert_different_registers(tmp1, tmp2, t0);
514 
515   if (res != obj) {
516     __ mv(res, obj);
517   }
518 
519   if (is_strong) {
520     // Check for object in cset.
521     __ mv(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
522     __ srli(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
523     __ add(tmp2, tmp2, tmp1);
524     __ lbu(tmp2, Address(tmp2));
525     __ beqz(tmp2, *stub->continuation(), /* is_far */ true);
526   }
527 
528   ce->store_parameter(res, 0);
529   ce->store_parameter(addr, 1);
530 
531   if (is_strong) {
532     if (is_native) {
533       __ far_call(RuntimeAddress(bs->load_reference_barrier_strong_native_rt_code_blob()->code_begin()));
534     } else {
535       __ far_call(RuntimeAddress(bs->load_reference_barrier_strong_rt_code_blob()->code_begin()));
536     }
537   } else if (is_weak) {
538     __ far_call(RuntimeAddress(bs->load_reference_barrier_weak_rt_code_blob()->code_begin()));
539   } else {
540     assert(is_phantom, "only remaining strength");
541     __ far_call(RuntimeAddress(bs->load_reference_barrier_phantom_rt_code_blob()->code_begin()));
542   }
543 
544   __ j(*stub->continuation());
545 }
< prev index next >