< prev index next >

src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp

Print this page




 456         // only a float use just part of the slot
 457         __ strs(r_1->as_FloatRegister(), Address(sp, st_off));
 458       } else {
 459 #ifdef ASSERT
 460         // Overwrite the unused slot with known junk
 461         __ mov(rscratch1, 0xdeadffffdeadaaacul);
 462         __ str(rscratch1, Address(sp, st_off));
 463 #endif /* ASSERT */
 464         __ strd(r_1->as_FloatRegister(), Address(sp, next_off));
 465       }
 466     }
 467   }
 468 
 469   __ mov(esp, sp); // Interp expects args on caller's expression stack
 470 
 471   __ ldr(rscratch1, Address(rmethod, in_bytes(Method::interpreter_entry_offset())));
 472   __ br(rscratch1);
 473 }
 474 
 475 
 476 static void gen_i2c_adapter(MacroAssembler *masm,
 477                             int total_args_passed,
 478                             int comp_args_on_stack,
 479                             const BasicType *sig_bt,
 480                             const VMRegPair *regs) {
 481 
 482   // Note: r13 contains the senderSP on entry. We must preserve it since
 483   // we may do a i2c -> c2i transition if we lose a race where compiled
 484   // code goes non-entrant while we get args ready.
 485 
 486   // In addition we use r13 to locate all the interpreter args because
 487   // we must align the stack to 16 bytes.
 488 
 489   // Adapters are frameless.
 490 
 491   // An i2c adapter is frameless because the *caller* frame, which is
 492   // interpreted, routinely repairs its own esp (from
 493   // interpreter_frame_last_sp), even if a callee has modified the
 494   // stack pointer.  It also recalculates and aligns sp.
 495 
 496   // A c2i adapter is frameless because the *callee* frame, which is




 456         // only a float use just part of the slot
 457         __ strs(r_1->as_FloatRegister(), Address(sp, st_off));
 458       } else {
 459 #ifdef ASSERT
 460         // Overwrite the unused slot with known junk
 461         __ mov(rscratch1, 0xdeadffffdeadaaacul);
 462         __ str(rscratch1, Address(sp, st_off));
 463 #endif /* ASSERT */
 464         __ strd(r_1->as_FloatRegister(), Address(sp, next_off));
 465       }
 466     }
 467   }
 468 
 469   __ mov(esp, sp); // Interp expects args on caller's expression stack
 470 
 471   __ ldr(rscratch1, Address(rmethod, in_bytes(Method::interpreter_entry_offset())));
 472   __ br(rscratch1);
 473 }
 474 
 475 
 476 void SharedRuntime::gen_i2c_adapter(MacroAssembler *masm,
 477                                     int total_args_passed,
 478                                     int comp_args_on_stack,
 479                                     const BasicType *sig_bt,
 480                                     const VMRegPair *regs) {
 481 
 482   // Note: r13 contains the senderSP on entry. We must preserve it since
 483   // we may do a i2c -> c2i transition if we lose a race where compiled
 484   // code goes non-entrant while we get args ready.
 485 
 486   // In addition we use r13 to locate all the interpreter args because
 487   // we must align the stack to 16 bytes.
 488 
 489   // Adapters are frameless.
 490 
 491   // An i2c adapter is frameless because the *caller* frame, which is
 492   // interpreted, routinely repairs its own esp (from
 493   // interpreter_frame_last_sp), even if a callee has modified the
 494   // stack pointer.  It also recalculates and aligns sp.
 495 
 496   // A c2i adapter is frameless because the *callee* frame, which is


< prev index next >