< prev index next >

src/hotspot/cpu/riscv/c1_Runtime1_riscv.cpp

Print this page

 736     case C1StubId::new_type_array_id:
 737     case C1StubId::new_object_array_id:
 738       {
 739         Register length   = x9;  // Incoming
 740         Register klass    = x13; // Incoming
 741         Register obj      = x10; // Result
 742 
 743         if (id == C1StubId::new_type_array_id) {
 744           __ set_info("new_type_array", dont_gc_arguments);
 745         } else {
 746           __ set_info("new_object_array", dont_gc_arguments);
 747         }
 748 
 749 #ifdef ASSERT
 750         // assert object type is really an array of the proper kind
 751         {
 752           Label ok;
 753           Register tmp = obj;
 754           __ lwu(tmp, Address(klass, Klass::layout_helper_offset()));
 755           __ sraiw(tmp, tmp, Klass::_lh_array_tag_shift);
 756           int tag = ((id == C1StubId::new_type_array_id) ? Klass::_lh_array_tag_type_value : Klass::_lh_array_tag_obj_value);
 757           __ mv(t0, tag);
 758           __ beq(t0, tmp, ok);
 759           __ stop("assert(is an array klass)");
 760           __ should_not_reach_here();
 761           __ bind(ok);
 762         }
 763 #endif // ASSERT
 764 
 765         __ enter();
 766         OopMap* map = save_live_registers(sasm);
 767         assert_cond(map != nullptr);
 768         int call_offset = 0;
 769         if (id == C1StubId::new_type_array_id) {
 770           call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
 771         } else {
 772           call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
 773         }
 774 
 775         oop_maps = new OopMapSet();
 776         assert_cond(oop_maps != nullptr);

 736     case C1StubId::new_type_array_id:
 737     case C1StubId::new_object_array_id:
 738       {
 739         Register length   = x9;  // Incoming
 740         Register klass    = x13; // Incoming
 741         Register obj      = x10; // Result
 742 
 743         if (id == C1StubId::new_type_array_id) {
 744           __ set_info("new_type_array", dont_gc_arguments);
 745         } else {
 746           __ set_info("new_object_array", dont_gc_arguments);
 747         }
 748 
 749 #ifdef ASSERT
 750         // assert object type is really an array of the proper kind
 751         {
 752           Label ok;
 753           Register tmp = obj;
 754           __ lwu(tmp, Address(klass, Klass::layout_helper_offset()));
 755           __ sraiw(tmp, tmp, Klass::_lh_array_tag_shift);
 756           int tag = ((id == C1StubId::new_type_array_id) ? Klass::_lh_array_tag_type_value : Klass::_lh_array_tag_ref_value);
 757           __ mv(t0, tag);
 758           __ beq(t0, tmp, ok);
 759           __ stop("assert(is an array klass)");
 760           __ should_not_reach_here();
 761           __ bind(ok);
 762         }
 763 #endif // ASSERT
 764 
 765         __ enter();
 766         OopMap* map = save_live_registers(sasm);
 767         assert_cond(map != nullptr);
 768         int call_offset = 0;
 769         if (id == C1StubId::new_type_array_id) {
 770           call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
 771         } else {
 772           call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
 773         }
 774 
 775         oop_maps = new OopMapSet();
 776         assert_cond(oop_maps != nullptr);
< prev index next >