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