8293035: Cleanup MacroAssembler::movoop code patching logic aarch64 riscv

Reviewed-by: eosterlund, fyang
This commit is contained in:
Axel Boldt-Christmas 2022-08-31 07:42:22 +00:00 committed by Stefan Karlsson
parent c42478b723
commit 9e3176bd09
13 changed files with 33 additions and 35 deletions

View File

@ -3368,7 +3368,7 @@ encode %{
} else {
relocInfo::relocType rtype = $src->constant_reloc();
if (rtype == relocInfo::oop_type) {
__ movoop(dst_reg, (jobject)con, /*immediate*/true);
__ movoop(dst_reg, (jobject)con);
} else if (rtype == relocInfo::metadata_type) {
__ mov_metadata(dst_reg, (Metadata*)con);
} else {

View File

@ -331,7 +331,7 @@ void LIR_Assembler::jobject2reg(jobject o, Register reg) {
if (o == NULL) {
__ mov(reg, zr);
} else {
__ movoop(reg, o, /*immediate*/true);
__ movoop(reg, o);
}
}

View File

@ -72,6 +72,12 @@ public:
virtual void nmethod_entry_barrier(MacroAssembler* masm, Label* slow_path, Label* continuation, Label* guard);
virtual void c2i_entry_barrier(MacroAssembler* masm);
virtual bool supports_instruction_patching() {
NMethodPatchingType patching_type = nmethod_patching_type();
return patching_type == NMethodPatchingType::conc_instruction_and_data_patch ||
patching_type == NMethodPatchingType::stw_instruction_and_data_patch;
}
static address patching_epoch_addr();
static void clear_patching_epoch();
static void increment_patching_epoch();

View File

@ -4440,11 +4440,8 @@ Address MacroAssembler::allocate_metadata_address(Metadata* obj) {
return Address((address)obj, rspec);
}
// Move an oop into a register. immediate is true if we want
// immediate instructions and nmethod entry barriers are not enabled.
// i.e. we are not going to patch this instruction while the code is being
// executed by another thread.
void MacroAssembler::movoop(Register dst, jobject obj, bool immediate) {
// Move an oop into a register.
void MacroAssembler::movoop(Register dst, jobject obj) {
int oop_index;
if (obj == NULL) {
oop_index = oop_recorder()->allocate_oop_index(obj);
@ -4459,15 +4456,12 @@ void MacroAssembler::movoop(Register dst, jobject obj, bool immediate) {
}
RelocationHolder rspec = oop_Relocation::spec(oop_index);
// nmethod entry barrier necessitate using the constant pool. They have to be
// ordered with respected to oop accesses.
// Using immediate literals would necessitate ISBs.
BarrierSet* bs = BarrierSet::barrier_set();
if ((bs->barrier_set_nmethod() != NULL && bs->barrier_set_assembler()->nmethod_patching_type() == NMethodPatchingType::conc_data_patch) || !immediate) {
if (BarrierSet::barrier_set()->barrier_set_assembler()->supports_instruction_patching()) {
mov(dst, Address((address)obj, rspec));
} else {
address dummy = address(uintptr_t(pc()) & -wordSize); // A nearby aligned address
ldr_constant(dst, Address(dummy, rspec));
} else
mov(dst, Address((address)obj, rspec));
}
}

View File

@ -1223,7 +1223,7 @@ public:
Address allocate_metadata_address(Metadata* obj);
Address constant_oop_address(jobject obj);
void movoop(Register dst, jobject obj, bool immediate = false);
void movoop(Register dst, jobject obj);
// CRC32 code for java.util.zip.CRC32::updateBytes() intrinsic.
void kernel_crc32(Register crc, Register buf, Register len,

View File

@ -1554,8 +1554,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
// load oop into a register
__ movoop(c_rarg1,
JNIHandles::make_local(method->method_holder()->java_mirror()),
/*immediate*/true);
JNIHandles::make_local(method->method_holder()->java_mirror()));
// Now handlize the static class mirror it's known not-null.
__ str(c_rarg1, Address(sp, klass_offset));

View File

@ -291,7 +291,7 @@ void LIR_Assembler::jobject2reg(jobject o, Register reg) {
if (o == NULL) {
__ mv(reg, zr);
} else {
__ movoop(reg, o, /* immediate */ true);
__ movoop(reg, o);
}
}

View File

@ -74,6 +74,12 @@ public:
virtual void nmethod_entry_barrier(MacroAssembler* masm, Label* slow_path, Label* continuation, Label* guard);
virtual void c2i_entry_barrier(MacroAssembler* masm);
virtual bool supports_instruction_patching() {
NMethodPatchingType patching_type = nmethod_patching_type();
return patching_type == NMethodPatchingType::conc_instruction_and_data_patch ||
patching_type == NMethodPatchingType::stw_instruction_and_data_patch;
}
static address patching_epoch_addr();
static void clear_patching_epoch();
static void increment_patching_epoch();

View File

@ -1648,11 +1648,8 @@ void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp,
beq(trial_klass, tmp, L);
}
// Move an oop into a register. immediate is true if we want
// immediate instructions and nmethod entry barriers are not enabled.
// i.e. we are not going to patch this instruction while the code is being
// executed by another thread.
void MacroAssembler::movoop(Register dst, jobject obj, bool immediate) {
// Move an oop into a register.
void MacroAssembler::movoop(Register dst, jobject obj) {
int oop_index;
if (obj == NULL) {
oop_index = oop_recorder()->allocate_oop_index(obj);
@ -1667,15 +1664,12 @@ void MacroAssembler::movoop(Register dst, jobject obj, bool immediate) {
}
RelocationHolder rspec = oop_Relocation::spec(oop_index);
// nmethod entry barrier necessitate using the constant pool. They have to be
// ordered with respected to oop access.
// Using immediate literals would necessitate fence.i.
BarrierSet* bs = BarrierSet::barrier_set();
if ((bs->barrier_set_nmethod() != NULL && bs->barrier_set_assembler()->nmethod_patching_type() == NMethodPatchingType::conc_data_patch) || !immediate) {
if (BarrierSet::barrier_set()->barrier_set_assembler()->supports_instruction_patching()) {
mv(dst, Address((address)obj, rspec));
} else {
address dummy = address(uintptr_t(pc()) & -wordSize); // A nearby aligned address
ld_constant(dst, Address(dummy, rspec));
} else
mv(dst, Address((address)obj, rspec));
}
}
// Move a metadata address into a register.

View File

@ -175,7 +175,7 @@ class MacroAssembler: public Assembler {
void resolve_oop_handle(Register result, Register tmp = x15);
void resolve_jobject(Register value, Register thread, Register tmp);
void movoop(Register dst, jobject obj, bool immediate = false);
void movoop(Register dst, jobject obj);
void mov_metadata(Register dst, Metadata* obj);
void bang_stack_size(Register size, Register tmp);
void set_narrow_oop(Register dst, jobject obj);

View File

@ -41,7 +41,7 @@ void Relocation::pd_set_data_value(address x, intptr_t o, bool verify_only) {
switch (type()) {
case relocInfo::oop_type: {
oop_Relocation *reloc = (oop_Relocation *)this;
// in movoop when BarrierSet::barrier_set()->barrier_set_nmethod() != NULL || !immediate
// in movoop when BarrierSet::barrier_set()->barrier_set_nmethod() != NULL
if (NativeInstruction::is_load_pc_relative_at(addr())) {
address constptr = (address)code()->oop_addr_at(reloc->oop_index());
bytes = MacroAssembler::pd_patch_instruction_size(addr(), constptr);

View File

@ -2114,7 +2114,7 @@ encode %{
} else {
relocInfo::relocType rtype = $src->constant_reloc();
if (rtype == relocInfo::oop_type) {
__ movoop(dst_reg, (jobject)con, /*immediate*/true);
__ movoop(dst_reg, (jobject)con);
} else if (rtype == relocInfo::metadata_type) {
__ mov_metadata(dst_reg, (Metadata*)con);
} else {

View File

@ -1455,8 +1455,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
// load oop into a register
__ movoop(c_rarg1,
JNIHandles::make_local(method->method_holder()->java_mirror()),
/*immediate*/true);
JNIHandles::make_local(method->method_holder()->java_mirror()));
// Now handlize the static class mirror it's known not-null.
__ sd(c_rarg1, Address(sp, klass_offset));