< prev index next >
src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp
Print this page
*** 64,73 ****
--- 64,92 ----
_instructions->relocate(pc + NativeMovConstReg::sethi_offset, rspec);
_instructions->relocate(pc + NativeMovConstReg::add_offset, rspec);
}
}
+ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle& constant) {
+ address pc = _instructions->start() + pc_offset;
+ if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
+ #ifdef _LP64
+ NativeMovConstReg32* move = nativeMovConstReg32_at(pc);
+ narrowKlass narrowOop = record_narrow_metadata_reference(constant);
+ move->set_data((intptr_t)narrowOop);
+ TRACE_jvmci_3("relocating (narrow metaspace constant) at %p/%p", pc, narrowOop);
+ #else
+ fatal("compressed Klass* on 32bit");
+ #endif
+ } else {
+ NativeMovConstReg* move = nativeMovConstReg_at(pc);
+ Metadata* reference = record_metadata_reference(constant);
+ move->set_data((intptr_t)reference);
+ TRACE_jvmci_3("relocating (metaspace constant) at %p/%p", pc, reference);
+ }
+ }
+
void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, int data_offset) {
address pc = _instructions->start() + pc_offset;
NativeInstruction* inst = nativeInstruction_at(pc);
NativeInstruction* inst1 = nativeInstruction_at(pc + 4);
if(inst->is_sethi() && inst1->is_nop()) {
*** 85,98 ****
load->set_offset(- (const_size - data_offset + Assembler::min_simm13()));
TRACE_jvmci_3("relocating ld at " PTR_FORMAT " (+%d) with destination at %d", p2i(pc), pc_offset, data_offset);
}
}
- void CodeInstaller::pd_relocate_CodeBlob(CodeBlob* cb, NativeInstruction* inst) {
- fatal("CodeInstaller::pd_relocate_CodeBlob - sparc unimp");
- }
-
void CodeInstaller::pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination) {
address pc = (address) inst;
if (inst->is_call()) {
NativeCall* call = nativeCall_at(pc);
call->set_destination((address) foreign_call_destination);
--- 104,113 ----
*** 166,185 ****
}
}
// convert JVMCI register indices (as used in oop maps) to HotSpot registers
VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg) {
! if (jvmci_reg < RegisterImpl::number_of_registers) {
return as_Register(jvmci_reg)->as_VMReg();
} else {
! jint floatRegisterNumber = jvmci_reg - RegisterImpl::number_of_registers;
! floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed
! if (floatRegisterNumber < FloatRegisterImpl::number_of_registers) {
! return as_FloatRegister(floatRegisterNumber)->as_VMReg();
}
! ShouldNotReachHere();
! return NULL;
}
}
bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) {
return !hotspotRegister->is_FloatRegister();
--- 181,209 ----
}
}
// convert JVMCI register indices (as used in oop maps) to HotSpot registers
VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg) {
! // JVMCI Registers are numbered as follows:
! // 0..31: Thirty-two General Purpose registers (CPU Registers)
! // 32..63: Thirty-two single precision float registers
! // 64..95: Thirty-two double precision float registers
! // 96..111: Sixteen quad precision float registers
! if (jvmci_reg < 32) {
return as_Register(jvmci_reg)->as_VMReg();
} else {
! jint floatRegisterNumber;
! if(jvmci_reg < 64) { // Single precision
! floatRegisterNumber = jvmci_reg - 32;
! } else if(jvmci_reg < 96) {
! floatRegisterNumber = 2 * (jvmci_reg - 64);
! } else if(jvmci_reg < 112) {
! floatRegisterNumber = 4 * (jvmci_reg - 96);
! } else {
! fatal("Unknown jvmci register");
}
! return as_FloatRegister(floatRegisterNumber)->as_VMReg();
}
}
bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) {
return !hotspotRegister->is_FloatRegister();
< prev index next >