Mercurial > hg > graal-compiler
diff src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp @ 22114:d9f3acb4a9a1
[SPARC] Implement constant loads from constant table with base register
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Sat, 27 Jun 2015 18:02:44 +0200 |
parents | be896a1983c0 |
children | a0d0ecbceeb4 |
line wrap: on
line diff
--- a/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Sat Jun 27 17:59:37 2015 +0200 +++ b/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Sat Jun 27 18:02:44 2015 +0200 @@ -66,12 +66,22 @@ void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, int data_offset) { address pc = _instructions->start() + pc_offset; - address const_start = _constants->start(); - address dest = _constants->start() + data_offset; - - _instructions->relocate(pc + NativeMovConstReg::sethi_offset, internal_word_Relocation::spec((address) dest)); - _instructions->relocate(pc + NativeMovConstReg::add_offset, internal_word_Relocation::spec((address) dest)); - TRACE_jvmci_3("relocating at %p with destination at %p (%d)", pc, dest, data_offset); + NativeInstruction* inst = nativeInstruction_at(pc); + NativeInstruction* inst1 = nativeInstruction_at(pc + 4); + if(inst->is_sethi() && inst1->is_nop()) { + address const_start = _constants->start(); + address dest = _constants->start() + data_offset; + if(_constants_size > 0) { + _instructions->relocate(pc + NativeMovConstReg::sethi_offset, internal_word_Relocation::spec((address) dest)); + _instructions->relocate(pc + NativeMovConstReg::add_offset, internal_word_Relocation::spec((address) dest)); + } + TRACE_jvmci_3("relocating at %p (+%d) with destination at %d", pc, pc_offset, data_offset); + } else { + NativeMovRegMem* load = nativeMovRegMem_at(pc); + // The base pointer is set 4k off (see SPARCLoadConstantTableBaseOp) + load->set_offset(data_offset - (1<<12)); + TRACE_jvmci_3("relocating ld at %p (+%d) with destination at %d", pc, pc_offset, data_offset); + } } void CodeInstaller::pd_relocate_CodeBlob(CodeBlob* cb, NativeInstruction* inst) {