< prev index next >
src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
Print this page
*** 383,400 ****
// For all these cases generate long instruction first.
nop();
}
// build frame
- // DMS CHECK: is it nop?
// verify_FPU(0, "method_entry");
-
}
int C1_MacroAssembler::scalarized_entry(const CompiledEntrySignature *ces, int frame_size_in_bytes, int bang_size_in_bytes, Label& verified_value_entry_label, bool is_value_ro_entry) {
! guarantee(false, "Support for ValueTypePassFieldsAsArgs and ValueTypeReturnedAsFields is not implemented");
! return 0;
}
void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg) {
// rbp, + 0: link
--- 383,472 ----
// For all these cases generate long instruction first.
nop();
}
// build frame
// verify_FPU(0, "method_entry");
}
int C1_MacroAssembler::scalarized_entry(const CompiledEntrySignature *ces, int frame_size_in_bytes, int bang_size_in_bytes, Label& verified_value_entry_label, bool is_value_ro_entry) {
! // This function required to support for ValueTypePassFieldsAsArgs
! if (C1Breakpoint || VerifyFPU || !UseStackBanging) {
! // Verified Entry first instruction should be 5 bytes long for correct
! // patching by patch_verified_entry().
! //
! // C1Breakpoint and VerifyFPU have one byte first instruction.
! // Also first instruction will be one byte "push(rbp)" if stack banging
! // code is not generated (see build_frame() above).
! // For all these cases generate long instruction first.
! nop();
! }
!
! // verify_FPU(0, "method_entry");
!
! assert(ValueTypePassFieldsAsArgs, "sanity");
!
! GrowableArray<SigEntry>* sig = &ces->sig();
! GrowableArray<SigEntry>* sig_cc = is_value_ro_entry ? &ces->sig_cc_ro() : &ces->sig_cc();
! VMRegPair* regs = ces->regs();
! VMRegPair* regs_cc = is_value_ro_entry ? ces->regs_cc_ro() : ces->regs_cc();
! int args_on_stack = ces->args_on_stack();
! int args_on_stack_cc = is_value_ro_entry ? ces->args_on_stack_cc_ro() : ces->args_on_stack_cc();
!
! assert(sig->length() <= sig_cc->length(), "Zero-sized value class not allowed!");
! BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sig_cc->length());
! int args_passed = sig->length();
! int args_passed_cc = SigEntry::fill_sig_bt(sig_cc, sig_bt);
!
! int extra_stack_offset = wordSize; // tos is return address.
!
! // Create a temp frame so we can call into runtime. It must be properly set up to accomodate GC.
! int sp_inc = (args_on_stack - args_on_stack_cc) * VMRegImpl::stack_slot_size;
! if (sp_inc > 0) {
! sp_inc = align_up(sp_inc, StackAlignmentInBytes);
! sub(sp, sp, sp_inc);
! } else {
! sp_inc = 0;
! }
!
! sub(sp, sp, frame_size_in_bytes);
! if (sp_inc > 0) {
! int real_frame_size = frame_size_in_bytes +
! + wordSize // pushed rbp
! + wordSize // returned address pushed by the stack extension code
! + sp_inc; // stack extension
! mov(rscratch1, real_frame_size);
! str(rscratch1, Address(sp, frame_size_in_bytes - wordSize));
! }
!
! // FIXME -- call runtime only if we cannot in-line allocate all the incoming value args.
! mov(r1, (intptr_t) ces->method());
! if (is_value_ro_entry) {
! far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::buffer_value_args_no_receiver_id)));
! } else {
! far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::buffer_value_args_id)));
! }
! int rt_call_offset = offset();
!
! // Remove the temp frame
! add(sp, sp, frame_size_in_bytes);
!
! int n = shuffle_value_args(true, is_value_ro_entry, extra_stack_offset, sig_bt, sig_cc,
! args_passed_cc, args_on_stack_cc, regs_cc, // from
! args_passed, args_on_stack, regs); // to
! assert(sp_inc == n, "must be");
!
! if (sp_inc != 0) {
! // Do the stack banging here, and skip over the stack repair code in the
! // verified_value_entry (which has a different real_frame_size).
! assert(sp_inc > 0, "stack should not shrink");
! generate_stack_overflow_check(bang_size_in_bytes);
! decrement(sp, frame_size_in_bytes);
! }
!
! b(verified_value_entry_label);
! return rt_call_offset;
}
void C1_MacroAssembler::load_parameter(int offset_in_words, Register reg) {
// rbp, + 0: link
< prev index next >