src/hotspot/cpu/arm/methodHandles_arm.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File open Cdiff src/hotspot/cpu/arm/methodHandles_arm.cpp

src/hotspot/cpu/arm/methodHandles_arm.cpp

Print this page

        

*** 123,141 **** if (!for_compiler_entry && (JvmtiExport::can_post_interpreter_events())) { // JVMTI events, such as single-stepping, are implemented partly by avoiding running // compiled code in threads for which the event is enabled. Check here for // interp_only_mode if these events CAN be enabled. __ ldr_s32(Rtemp, Address(Rthread, JavaThread::interp_only_mode_offset())); - #ifdef AARCH64 - Label L; - __ cbz(Rtemp, L); - __ indirect_jump(Address(Rmethod, Method::interpreter_entry_offset()), Rtemp); - __ bind(L); - #else __ cmp(Rtemp, 0); __ ldr(PC, Address(Rmethod, Method::interpreter_entry_offset()), ne); - #endif // AARCH64 } const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() : Method::from_interpreted_offset(); __ indirect_jump(Address(Rmethod, entry_offset), Rtemp); --- 123,134 ----
*** 266,280 **** // Load the receiver (not the MH; the actual MemberName's receiver) up from the interpreter stack. __ ldr(rcx_recv = rcx_mh, rdx_first_arg_addr); DEBUG_ONLY(rdx_param_size = noreg); } Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now - #ifdef AARCH64 - __ ldr(rbx_member, Address(Rparams, Interpreter::stackElementSize, post_indexed)); - #else __ pop(rbx_member); - #endif generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry); } return entry_point; } --- 259,269 ----
*** 286,311 **** assert(is_signature_polymorphic(iid), "expected invoke iid"); // Use same name as x86 to ease future merges Register rbx_method = Rmethod; // eventual target of this invocation // temps used in this code are not used in *either* compiled or interpreted calling sequences Register temp1 = (for_compiler_entry ? saved_last_sp_register() : R1_tmp); ! Register temp2 = AARCH64_ONLY(R9) NOT_AARCH64(R8); Register temp3 = Rtemp; // R12/R16 ! Register temp4 = AARCH64_ONLY(Rtemp2) NOT_AARCH64(R5); if (for_compiler_entry) { assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : j_rarg0), "only valid assignment"); - #ifdef AARCH64 - assert_different_registers(temp1, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5, j_rarg6, j_rarg7); - assert_different_registers(temp2, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5, j_rarg6, j_rarg7); - assert_different_registers(temp3, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5, j_rarg6, j_rarg7); - assert_different_registers(temp4, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5, j_rarg6, j_rarg7); - #else assert_different_registers(temp1, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp2, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp3, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp4, j_rarg0, j_rarg1, j_rarg2, j_rarg3); - #endif // AARCH64 } assert_different_registers(temp1, temp2, temp3, receiver_reg); assert_different_registers(temp1, temp2, temp3, temp4, member_reg); if (!for_compiler_entry) assert_different_registers(temp1, temp2, temp3, temp4, saved_last_sp_register()); // don't trash lastSP --- 275,293 ---- assert(is_signature_polymorphic(iid), "expected invoke iid"); // Use same name as x86 to ease future merges Register rbx_method = Rmethod; // eventual target of this invocation // temps used in this code are not used in *either* compiled or interpreted calling sequences Register temp1 = (for_compiler_entry ? saved_last_sp_register() : R1_tmp); ! Register temp2 = R8; Register temp3 = Rtemp; // R12/R16 ! Register temp4 = R5; if (for_compiler_entry) { assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : j_rarg0), "only valid assignment"); assert_different_registers(temp1, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp2, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp3, j_rarg0, j_rarg1, j_rarg2, j_rarg3); assert_different_registers(temp4, j_rarg0, j_rarg1, j_rarg2, j_rarg3); } assert_different_registers(temp1, temp2, temp3, receiver_reg); assert_different_registers(temp1, temp2, temp3, temp4, member_reg); if (!for_compiler_entry) assert_different_registers(temp1, temp2, temp3, temp4, saved_last_sp_register()); // don't trash lastSP
*** 351,366 **** Label L_ok; Register temp2_defc = temp2; __ load_heap_oop(temp2_defc, member_clazz); load_klass_from_Class(_masm, temp2_defc, temp3, temp4); __ verify_klass_ptr(temp2_defc); - #ifdef AARCH64 - // TODO-AARCH64 - __ b(L_ok); - #else __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, noreg, L_ok); - #endif // If we get here, the type check failed! __ stop("receiver class disagrees with MemberName.clazz"); __ bind(L_ok); } BLOCK_COMMENT("} check_receiver"); --- 333,343 ----
*** 482,509 **** // use this parameter for checking for garbage stack movements: UNREASONABLE_STACK_MOVE = (ARG_LIMIT + SLOP) // the slop defends against false alarms due to fencepost errors }; - #ifdef AARCH64 - const int trace_mh_nregs = 32; // R0-R30, PC - #else const int trace_mh_nregs = 15; const Register trace_mh_regs[trace_mh_nregs] = {R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR, PC}; - #endif // AARCH64 void trace_method_handle_stub(const char* adaptername, intptr_t* saved_regs, intptr_t* saved_bp, oop mh) { // called as a leaf from native code: do not block the JVM! bool has_mh = (strstr(adaptername, "/static") == NULL && strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH intptr_t* entry_sp = (intptr_t*) &saved_regs[trace_mh_nregs]; // just after the saved regs intptr_t* saved_sp = (intptr_t*) saved_regs[Rsender_sp->encoding()]; // save of Rsender_sp ! intptr_t* last_sp = (intptr_t*) saved_bp[AARCH64_ONLY(frame::interpreter_frame_stack_top_offset) NOT_AARCH64(frame::interpreter_frame_last_sp_offset)]; intptr_t* base_sp = last_sp; intptr_t mh_reg = (intptr_t)saved_regs[R5_mh->encoding()]; const char* mh_reg_name = "R5_mh"; if (!has_mh) mh_reg_name = "R5"; --- 459,482 ---- // use this parameter for checking for garbage stack movements: UNREASONABLE_STACK_MOVE = (ARG_LIMIT + SLOP) // the slop defends against false alarms due to fencepost errors }; const int trace_mh_nregs = 15; const Register trace_mh_regs[trace_mh_nregs] = {R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR, PC}; void trace_method_handle_stub(const char* adaptername, intptr_t* saved_regs, intptr_t* saved_bp, oop mh) { // called as a leaf from native code: do not block the JVM! bool has_mh = (strstr(adaptername, "/static") == NULL && strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH intptr_t* entry_sp = (intptr_t*) &saved_regs[trace_mh_nregs]; // just after the saved regs intptr_t* saved_sp = (intptr_t*) saved_regs[Rsender_sp->encoding()]; // save of Rsender_sp ! intptr_t* last_sp = (intptr_t*) saved_bp[frame::interpreter_frame_last_sp_offset]; intptr_t* base_sp = last_sp; intptr_t mh_reg = (intptr_t)saved_regs[R5_mh->encoding()]; const char* mh_reg_name = "R5_mh"; if (!has_mh) mh_reg_name = "R5";
*** 515,531 **** tty->print_cr("*** last_sp=" INTPTR_FORMAT, p2i(last_sp)); if (Verbose) { tty->print(" reg dump: "); int i; for (i = 0; i < trace_mh_nregs; i++) { ! if (i > 0 && i % AARCH64_ONLY(2) NOT_AARCH64(4) == 0) tty->print("\n + dump: "); - #ifdef AARCH64 - const char* reg_name = (i == trace_mh_nregs-1) ? "pc" : as_Register(i)->name(); - #else const char* reg_name = trace_mh_regs[i]->name(); - #endif tty->print(" %s: " INTPTR_FORMAT, reg_name, p2i((void *)saved_regs[i])); } tty->cr(); } --- 488,500 ---- tty->print_cr("*** last_sp=" INTPTR_FORMAT, p2i(last_sp)); if (Verbose) { tty->print(" reg dump: "); int i; for (i = 0; i < trace_mh_nregs; i++) { ! if (i > 0 && i % 4 == 0) tty->print("\n + dump: "); const char* reg_name = trace_mh_regs[i]->name(); tty->print(" %s: " INTPTR_FORMAT, reg_name, p2i((void *)saved_regs[i])); } tty->cr(); }
src/hotspot/cpu/arm/methodHandles_arm.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File