< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page
rev 8300 : 8079564: Use FP register as proper frame pointer in JIT compiled code on aarch64
Summary: Add support for PreserveFramePointer for debug/profile
Reviewed-by: duke


3779     // handle it
3780     mov(reg1, dest);
3781     byte_offset = 0;
3782   } else {
3783     InstructionMark im(this);
3784     code_section()->relocate(inst_mark(), dest.rspec());
3785     byte_offset = (uint64_t)dest.target() & 0xfff;
3786     _adrp(reg1, dest.target());
3787   }
3788 }
3789 
3790   bool MacroAssembler::use_acq_rel_for_volatile_fields() {
3791 #ifdef PRODUCT
3792     return false;
3793 #else
3794     return UseAcqRelForVolatileFields;
3795 #endif
3796   }
3797 
3798 void MacroAssembler::build_frame(int framesize) {
3799   if (framesize == 0) {
3800     // Is this even possible?
3801     stp(rfp, lr, Address(pre(sp, -2 * wordSize)));
3802   } else if (framesize < ((1 << 9) + 2 * wordSize)) {
3803     sub(sp, sp, framesize);
3804     stp(rfp, lr, Address(sp, framesize - 2 * wordSize));

3805   } else {
3806     stp(rfp, lr, Address(pre(sp, -2 * wordSize)));

3807     if (framesize < ((1 << 12) + 2 * wordSize))
3808       sub(sp, sp, framesize - 2 * wordSize);
3809     else {
3810       mov(rscratch1, framesize - 2 * wordSize);
3811       sub(sp, sp, rscratch1);
3812     }
3813   }
3814 }
3815 
3816 void MacroAssembler::remove_frame(int framesize) {
3817   if (framesize == 0) {
3818     ldp(rfp, lr, Address(post(sp, 2 * wordSize)));
3819   } else if (framesize < ((1 << 9) + 2 * wordSize)) {
3820     ldp(rfp, lr, Address(sp, framesize - 2 * wordSize));
3821     add(sp, sp, framesize);
3822   } else {
3823     if (framesize < ((1 << 12) + 2 * wordSize))
3824       add(sp, sp, framesize - 2 * wordSize);
3825     else {
3826       mov(rscratch1, framesize - 2 * wordSize);
3827       add(sp, sp, rscratch1);
3828     }
3829     ldp(rfp, lr, Address(post(sp, 2 * wordSize)));
3830   }
3831 }
3832 
3833 
3834 // Search for str1 in str2 and return index or -1
3835 void MacroAssembler::string_indexof(Register str2, Register str1,
3836                                     Register cnt2, Register cnt1,
3837                                     Register tmp1, Register tmp2,
3838                                     Register tmp3, Register tmp4,
3839                                     int icnt1, Register result) {




3779     // handle it
3780     mov(reg1, dest);
3781     byte_offset = 0;
3782   } else {
3783     InstructionMark im(this);
3784     code_section()->relocate(inst_mark(), dest.rspec());
3785     byte_offset = (uint64_t)dest.target() & 0xfff;
3786     _adrp(reg1, dest.target());
3787   }
3788 }
3789 
3790   bool MacroAssembler::use_acq_rel_for_volatile_fields() {
3791 #ifdef PRODUCT
3792     return false;
3793 #else
3794     return UseAcqRelForVolatileFields;
3795 #endif
3796   }
3797 
3798 void MacroAssembler::build_frame(int framesize) {
3799   assert(framesize > 0, "framesize must be > 0");
3800   if (framesize < ((1 << 9) + 2 * wordSize)) {


3801     sub(sp, sp, framesize);
3802     stp(rfp, lr, Address(sp, framesize - 2 * wordSize));
3803     if (PreserveFramePointer) add(rfp, sp, framesize - 2 * wordSize);
3804   } else {
3805     stp(rfp, lr, Address(pre(sp, -2 * wordSize)));
3806     if (PreserveFramePointer) mov(rfp, sp);
3807     if (framesize < ((1 << 12) + 2 * wordSize))
3808       sub(sp, sp, framesize - 2 * wordSize);
3809     else {
3810       mov(rscratch1, framesize - 2 * wordSize);
3811       sub(sp, sp, rscratch1);
3812     }
3813   }
3814 }
3815 
3816 void MacroAssembler::remove_frame(int framesize) {
3817   assert(framesize > 0, "framesize must be > 0");
3818   if (framesize < ((1 << 9) + 2 * wordSize)) {

3819     ldp(rfp, lr, Address(sp, framesize - 2 * wordSize));
3820     add(sp, sp, framesize);
3821   } else {
3822     if (framesize < ((1 << 12) + 2 * wordSize))
3823       add(sp, sp, framesize - 2 * wordSize);
3824     else {
3825       mov(rscratch1, framesize - 2 * wordSize);
3826       add(sp, sp, rscratch1);
3827     }
3828     ldp(rfp, lr, Address(post(sp, 2 * wordSize)));
3829   }
3830 }
3831 
3832 
3833 // Search for str1 in str2 and return index or -1
3834 void MacroAssembler::string_indexof(Register str2, Register str1,
3835                                     Register cnt2, Register cnt1,
3836                                     Register tmp1, Register tmp2,
3837                                     Register tmp3, Register tmp4,
3838                                     int icnt1, Register result) {


< prev index next >