< prev index next >
src/cpu/aarch64/vm/jvmciCodeInstaller_aarch64.cpp
Print this page
rev 12320 : 8170106: AArch64: Multiple JVMCI issues
Reviewed-by: rschatz
@@ -39,32 +39,38 @@
}
}
void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle constant, TRAPS) {
address pc = _instructions->start() + pc_offset;
- Handle obj = HotSpotObjectConstantImpl::object(constant);
- jobject value = JNIHandles::make_local(obj());
+#ifdef ASSERT
+ {
+ NativeInstruction *insn = nativeInstruction_at(pc);
if (HotSpotObjectConstantImpl::compressed(constant)) {
- int oop_index = _oop_recorder->find_index(value);
- RelocationHolder rspec = oop_Relocation::spec(oop_index);
- _instructions->relocate(pc, rspec, 1);
- Unimplemented();
+ // Mov narrow constant: movz n << 16, movk
+ assert(Instruction_aarch64::extract(insn->encoding(), 31, 21) == 0b11010010101 &&
+ nativeInstruction_at(pc+4)->is_movk(), "wrong insn in patch");
} else {
- NativeMovConstReg* move = nativeMovConstReg_at(pc);
- move->set_data((intptr_t) value);
+ // Move wide constant: movz n, movk, movk.
+ assert(nativeInstruction_at(pc+4)->is_movk()
+ && nativeInstruction_at(pc+8)->is_movk(), "wrong insn in patch");
+ }
+ }
+#endif // ASSERT
+ Handle obj = HotSpotObjectConstantImpl::object(constant);
+ jobject value = JNIHandles::make_local(obj());
+ MacroAssembler::patch_oop(pc, (address)obj());
int oop_index = _oop_recorder->find_index(value);
RelocationHolder rspec = oop_Relocation::spec(oop_index);
_instructions->relocate(pc, rspec);
- }
}
void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, TRAPS) {
address pc = _instructions->start() + pc_offset;
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
narrowKlass narrowOop = record_narrow_metadata_reference(_instructions, pc, constant, CHECK);
+ MacroAssembler::patch_narrow_klass(pc, narrowOop);
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop);
- Unimplemented();
} else {
NativeMovConstReg* move = nativeMovConstReg_at(pc);
void* reference = record_metadata_reference(_instructions, pc, constant, CHECK);
move->set_data((intptr_t) reference);
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference));
@@ -165,12 +171,12 @@
// convert JVMCI register indices (as used in oop maps) to HotSpot registers
VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg, TRAPS) {
if (jvmci_reg < RegisterImpl::number_of_registers) {
return as_Register(jvmci_reg)->as_VMReg();
} else {
- jint floatRegisterNumber = jvmci_reg - RegisterImpl::number_of_registers;
- if (floatRegisterNumber < FloatRegisterImpl::number_of_registers) {
+ jint floatRegisterNumber = jvmci_reg - RegisterImpl::number_of_registers_for_jvmci;
+ if (floatRegisterNumber >= 0 && floatRegisterNumber < FloatRegisterImpl::number_of_registers) {
return as_FloatRegister(floatRegisterNumber)->as_VMReg();
}
JVMCI_ERROR_NULL("invalid register number: %d", jvmci_reg);
}
}
< prev index next >