< prev index next >

src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

Print this page
rev 60010 : 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);


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


< prev index next >