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); 5753 void generate_all() { 5754 // support for verify_oop (must happen after universe_init) 5755 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop(); 5756 StubRoutines::_throw_AbstractMethodError_entry = 5757 generate_throw_exception("AbstractMethodError throw_exception", 5758 CAST_FROM_FN_PTR(address, 5759 SharedRuntime:: 5760 throw_AbstractMethodError)); 5761 5762 StubRoutines::_throw_IncompatibleClassChangeError_entry = 5763 generate_throw_exception("IncompatibleClassChangeError throw_exception", 5764 CAST_FROM_FN_PTR(address, 5765 SharedRuntime:: 5766 throw_IncompatibleClassChangeError)); 5767 5768 StubRoutines::_throw_NullPointerException_at_call_entry = 5769 generate_throw_exception("NullPointerException at call throw_exception", 5770 CAST_FROM_FN_PTR(address, 5771 SharedRuntime:: 5772 throw_NullPointerException_at_call)); 5773 5774 // arraycopy stubs used by compilers 5775 generate_arraycopy_stubs(); 5776 5777 // has negatives stub for large arrays. 5778 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long); 5779 5780 // array equals stub for large arrays. 5781 if (!UseSimpleArrayEquals) { 5782 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals(); 5783 } 5784 5785 generate_compare_long_strings(); 5786 5787 generate_string_indexof_stubs(); 5788 5789 // byte_array_inflate stub for large arrays. 5790 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate(); 5791 5792 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); 5763 void generate_all() { 5764 // support for verify_oop (must happen after universe_init) 5765 StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop(); 5766 StubRoutines::_throw_AbstractMethodError_entry = 5767 generate_throw_exception("AbstractMethodError throw_exception", 5768 CAST_FROM_FN_PTR(address, 5769 SharedRuntime:: 5770 throw_AbstractMethodError)); 5771 5772 StubRoutines::_throw_IncompatibleClassChangeError_entry = 5773 generate_throw_exception("IncompatibleClassChangeError throw_exception", 5774 CAST_FROM_FN_PTR(address, 5775 SharedRuntime:: 5776 throw_IncompatibleClassChangeError)); 5777 5778 StubRoutines::_throw_NullPointerException_at_call_entry = 5779 generate_throw_exception("NullPointerException at call throw_exception", 5780 CAST_FROM_FN_PTR(address, 5781 SharedRuntime:: 5782 throw_NullPointerException_at_call)); 5783 5784 StubRoutines::aarch64::_vector_iota_indices = generate_iota_indices("iota_indices"); 5785 5786 // arraycopy stubs used by compilers 5787 generate_arraycopy_stubs(); 5788 5789 // has negatives stub for large arrays. 5790 StubRoutines::aarch64::_has_negatives = generate_has_negatives(StubRoutines::aarch64::_has_negatives_long); 5791 5792 // array equals stub for large arrays. 5793 if (!UseSimpleArrayEquals) { 5794 StubRoutines::aarch64::_large_array_equals = generate_large_array_equals(); 5795 } 5796 5797 generate_compare_long_strings(); 5798 5799 generate_string_indexof_stubs(); 5800 5801 // byte_array_inflate stub for large arrays. 5802 StubRoutines::aarch64::_large_byte_array_inflate = generate_large_byte_array_inflate(); 5803 5804 BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod(); |