< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page
rev 10742 : Make fields used in lock-free algorithms volatile


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 {


< prev index next >