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);
5709 void generate_all() {
5710 // support for verify_oop (must happen after universe_init)
5711 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
5712 StubRoutines::_throw_AbstractMethodError_entry =
5713 generate_throw_exception("AbstractMethodError throw_exception",
5714 CAST_FROM_FN_PTR(address,
5715 SharedRuntime::
5716 throw_AbstractMethodError));
5717
5718 StubRoutines::_throw_IncompatibleClassChangeError_entry =
5719 generate_throw_exception("IncompatibleClassChangeError throw_exception",
5720 CAST_FROM_FN_PTR(address,
5721 SharedRuntime::
5722 throw_IncompatibleClassChangeError));
5723
5724 StubRoutines::_throw_NullPointerException_at_call_entry =
5725 generate_throw_exception("NullPointerException at call throw_exception",
5726 CAST_FROM_FN_PTR(address,
5727 SharedRuntime::
5728 throw_NullPointerException_at_call));
5729
5730 // arraycopy stubs used by compilers
5731 generate_arraycopy_stubs();
5732
5733 // has negatives stub for large arrays.
5734 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long);
5735
5736 // array equals stub for large arrays.
5737 if (!UseSimpleArrayEquals) {
5738 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals();
5739 }
5740
5741 generate_compare_long_strings();
5742
5743 generate_string_indexof_stubs();
5744
5745 // byte_array_inflate stub for large arrays.
5746 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate();
5747
5748 #ifdef COMPILER2
|
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);
5719 void generate_all() {
5720 // support for verify_oop (must happen after universe_init)
5721 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop();
5722 StubRoutines::_throw_AbstractMethodError_entry =
5723 generate_throw_exception("AbstractMethodError throw_exception",
5724 CAST_FROM_FN_PTR(address,
5725 SharedRuntime::
5726 throw_AbstractMethodError));
5727
5728 StubRoutines::_throw_IncompatibleClassChangeError_entry =
5729 generate_throw_exception("IncompatibleClassChangeError throw_exception",
5730 CAST_FROM_FN_PTR(address,
5731 SharedRuntime::
5732 throw_IncompatibleClassChangeError));
5733
5734 StubRoutines::_throw_NullPointerException_at_call_entry =
5735 generate_throw_exception("NullPointerException at call throw_exception",
5736 CAST_FROM_FN_PTR(address,
5737 SharedRuntime::
5738 throw_NullPointerException_at_call));
5739
5740 StubRoutines::aarch64::_vector_iota_indices = generate_iota_indices("iota_indices");
5741
5742 // arraycopy stubs used by compilers
5743 generate_arraycopy_stubs();
5744
5745 // has negatives stub for large arrays.
5746 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long);
5747
5748 // array equals stub for large arrays.
5749 if (!UseSimpleArrayEquals) {
5750 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals();
5751 }
5752
5753 generate_compare_long_strings();
5754
5755 generate_string_indexof_stubs();
5756
5757 // byte_array_inflate stub for large arrays.
5758 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate();
5759
5760 #ifdef COMPILER2
|