4036 assert(dest.getMode() == Address::literal, "ADRP must be applied to a literal address");
4037
4038 InstructionMark im(this);
4039 code_section()->relocate(inst_mark(), dest.rspec());
4040 // 8143067: Ensure that the adrp can reach the dest from anywhere within
4041 // the code cache so that if it is relocated we know it will still reach
4042 if (offset_high >= -(1<<20) && offset_low < (1<<20)) {
4043 _adrp(reg1, dest.target());
4044 } else {
4045 unsigned long target = (unsigned long)dest.target();
4046 unsigned long adrp_target
4047 = (target & 0xffffffffUL) | ((unsigned long)pc() & 0xffff00000000UL);
4048
4049 _adrp(reg1, (address)adrp_target);
4050 movk(reg1, target >> 32, 32);
4051 }
4052 byte_offset = (unsigned long)dest.target() & 0xfff;
4053 }
4054
4055 void MacroAssembler::load_byte_map_base(Register reg) {
4056 jbyte *byte_map_base =
4057 ((CardTableModRefBS*)(Universe::heap()->barrier_set()))->byte_map_base;
4058
4059 if (is_valid_AArch64_address((address)byte_map_base)) {
4060 // Strictly speaking the byte_map_base isn't an address at all,
4061 // and it might even be negative.
4062 unsigned long offset;
4063 adrp(reg, ExternalAddress((address)byte_map_base), offset);
4064 assert(offset == 0, "misaligned card table base");
4065 } else {
4066 mov(reg, (uint64_t)byte_map_base);
4067 }
4068 }
4069
4070 void MacroAssembler::build_frame(int framesize) {
4071 assert(framesize > 0, "framesize must be > 0");
4072 if (framesize < ((1 << 9) + 2 * wordSize)) {
4073 sub(sp, sp, framesize);
4074 stp(rfp, lr, Address(sp, framesize - 2 * wordSize));
4075 if (PreserveFramePointer) add(rfp, sp, framesize - 2 * wordSize);
4076 } else {
|
4036 assert(dest.getMode() == Address::literal, "ADRP must be applied to a literal address");
4037
4038 InstructionMark im(this);
4039 code_section()->relocate(inst_mark(), dest.rspec());
4040 // 8143067: Ensure that the adrp can reach the dest from anywhere within
4041 // the code cache so that if it is relocated we know it will still reach
4042 if (offset_high >= -(1<<20) && offset_low < (1<<20)) {
4043 _adrp(reg1, dest.target());
4044 } else {
4045 unsigned long target = (unsigned long)dest.target();
4046 unsigned long adrp_target
4047 = (target & 0xffffffffUL) | ((unsigned long)pc() & 0xffff00000000UL);
4048
4049 _adrp(reg1, (address)adrp_target);
4050 movk(reg1, target >> 32, 32);
4051 }
4052 byte_offset = (unsigned long)dest.target() & 0xfff;
4053 }
4054
4055 void MacroAssembler::load_byte_map_base(Register reg) {
4056 volatile jbyte *byte_map_base =
4057 ((CardTableModRefBS*)(Universe::heap()->barrier_set()))->byte_map_base;
4058
4059 if (is_valid_AArch64_address((address)byte_map_base)) {
4060 // Strictly speaking the byte_map_base isn't an address at all,
4061 // and it might even be negative.
4062 unsigned long offset;
4063 adrp(reg, ExternalAddress((address)byte_map_base), offset);
4064 assert(offset == 0, "misaligned card table base");
4065 } else {
4066 mov(reg, (uint64_t)byte_map_base);
4067 }
4068 }
4069
4070 void MacroAssembler::build_frame(int framesize) {
4071 assert(framesize > 0, "framesize must be > 0");
4072 if (framesize < ((1 << 9) + 2 * wordSize)) {
4073 sub(sp, sp, framesize);
4074 stp(rfp, lr, Address(sp, framesize - 2 * wordSize));
4075 if (PreserveFramePointer) add(rfp, sp, framesize - 2 * wordSize);
4076 } else {
|