< prev index next >

src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

Print this page




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


< prev index next >