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) {
|