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 }
|