< prev index next >

src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

Print this page
rev 61868 : manual merge with default


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


< prev index next >