589 __ ldp(c_rarg3, c_rarg2, Address(__ post(sp, 16)));
590
591 __ push(RegSet::range(r0, r29), sp);
592 // debug(char* msg, int64_t pc, int64_t regs[])
593 __ mov(c_rarg0, rscratch1); // pass address of error message
594 __ mov(c_rarg1, lr); // pass return address
595 __ mov(c_rarg2, sp); // pass address of regs on stack
596 #ifndef PRODUCT
597 assert(frame::arg_reg_save_area_bytes == 0, "not expecting frame reg save area");
598 #endif
599 BLOCK_COMMENT("call MacroAssembler::debug");
600 __ mov(rscratch1, CAST_FROM_FN_PTR(address, MacroAssembler::debug64));
601 __ blr(rscratch1);
602 __ hlt(0);
603
604 return start;
605 }
606
607 void array_overlap_test(Label& L_no_overlap, Address::sxtw sf) { __ b(L_no_overlap); }
608
609 // The inner part of zero_words(). This is the bulk operation,
610 // zeroing words in blocks, possibly using DC ZVA to do it. The
611 // caller is responsible for zeroing the last few words.
612 //
613 // Inputs:
614 // r10: the HeapWord-aligned base address of an array to zero.
615 // r11: the count in HeapWords, r11 > 0.
616 //
617 // Returns r10 and r11, adjusted for the caller to clear.
618 // r10: the base address of the tail of words left to clear.
619 // r11: the number of words in the tail.
620 // r11 < MacroAssembler::zero_words_block_size.
621
622 address generate_zero_blocks() {
623 Label done;
624 Label base_aligned;
625
626 Register base = r10, cnt = r11;
627
628 __ align(CodeEntryAlignment);
5761 void generate_all() {
5762 // support for verify_oop (must happen after universe_init)
5763 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
5764 StubRoutines::_throw_AbstractMethodError_entry =
5765 generate_throw_exception("AbstractMethodError throw_exception",
5766 CAST_FROM_FN_PTR(address,
5767 SharedRuntime::
5768 throw_AbstractMethodError));
5769
5770 StubRoutines::_throw_IncompatibleClassChangeError_entry =
5771 generate_throw_exception("IncompatibleClassChangeError throw_exception",
5772 CAST_FROM_FN_PTR(address,
5773 SharedRuntime::
5774 throw_IncompatibleClassChangeError));
5775
5776 StubRoutines::_throw_NullPointerException_at_call_entry =
5777 generate_throw_exception("NullPointerException at call throw_exception",
5778 CAST_FROM_FN_PTR(address,
5779 SharedRuntime::
5780 throw_NullPointerException_at_call));
5781
5782 // arraycopy stubs used by compilers
5783 generate_arraycopy_stubs();
5784
5785 // has negatives stub for large arrays.
5786 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long);
5787
5788 // array equals stub for large arrays.
5789 if (!UseSimpleArrayEquals) {
5790 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals();
5791 }
5792
5793 generate_compare_long_strings();
5794
5795 generate_string_indexof_stubs();
5796
5797 // byte_array_inflate stub for large arrays.
5798 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate();
5799
5800 BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
|
589 __ ldp(c_rarg3, c_rarg2, Address(__ post(sp, 16)));
590
591 __ push(RegSet::range(r0, r29), sp);
592 // debug(char* msg, int64_t pc, int64_t regs[])
593 __ mov(c_rarg0, rscratch1); // pass address of error message
594 __ mov(c_rarg1, lr); // pass return address
595 __ mov(c_rarg2, sp); // pass address of regs on stack
596 #ifndef PRODUCT
597 assert(frame::arg_reg_save_area_bytes == 0, "not expecting frame reg save area");
598 #endif
599 BLOCK_COMMENT("call MacroAssembler::debug");
600 __ mov(rscratch1, CAST_FROM_FN_PTR(address, MacroAssembler::debug64));
601 __ blr(rscratch1);
602 __ hlt(0);
603
604 return start;
605 }
606
607 void array_overlap_test(Label& L_no_overlap, Address::sxtw sf) { __ b(L_no_overlap); }
608
609 // Generate indices for iota vector.
610 address generate_iota_indices(const char *stub_name) {
611 __ align(CodeEntryAlignment);
612 StubCodeMark mark(this, "StubRoutines", stub_name);
613 address start = __ pc();
614 __ emit_data64(0x0706050403020100, relocInfo::none);
615 __ emit_data64(0x0F0E0D0C0B0A0908, relocInfo::none);
616 return start;
617 }
618
619 // The inner part of zero_words(). This is the bulk operation,
620 // zeroing words in blocks, possibly using DC ZVA to do it. The
621 // caller is responsible for zeroing the last few words.
622 //
623 // Inputs:
624 // r10: the HeapWord-aligned base address of an array to zero.
625 // r11: the count in HeapWords, r11 > 0.
626 //
627 // Returns r10 and r11, adjusted for the caller to clear.
628 // r10: the base address of the tail of words left to clear.
629 // r11: the number of words in the tail.
630 // r11 < MacroAssembler::zero_words_block_size.
631
632 address generate_zero_blocks() {
633 Label done;
634 Label base_aligned;
635
636 Register base = r10, cnt = r11;
637
638 __ align(CodeEntryAlignment);
5771 void generate_all() {
5772 // support for verify_oop (must happen after universe_init)
5773 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
5774 StubRoutines::_throw_AbstractMethodError_entry =
5775 generate_throw_exception("AbstractMethodError throw_exception",
5776 CAST_FROM_FN_PTR(address,
5777 SharedRuntime::
5778 throw_AbstractMethodError));
5779
5780 StubRoutines::_throw_IncompatibleClassChangeError_entry =
5781 generate_throw_exception("IncompatibleClassChangeError throw_exception",
5782 CAST_FROM_FN_PTR(address,
5783 SharedRuntime::
5784 throw_IncompatibleClassChangeError));
5785
5786 StubRoutines::_throw_NullPointerException_at_call_entry =
5787 generate_throw_exception("NullPointerException at call throw_exception",
5788 CAST_FROM_FN_PTR(address,
5789 SharedRuntime::
5790 throw_NullPointerException_at_call));
5791
5792 StubRoutines::aarch64::_vector_iota_indices = generate_iota_indices("iota_indices");
5793
5794 // arraycopy stubs used by compilers
5795 generate_arraycopy_stubs();
5796
5797 // has negatives stub for large arrays.
5798 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long);
5799
5800 // array equals stub for large arrays.
5801 if (!UseSimpleArrayEquals) {
5802 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals();
5803 }
5804
5805 generate_compare_long_strings();
5806
5807 generate_string_indexof_stubs();
5808
5809 // byte_array_inflate stub for large arrays.
5810 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate();
5811
5812 BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
|