changeset 22195:a0d0ecbceeb4

[SPARC] Use rdpc for constructing constant table base
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Thu, 09 Jul 2015 15:58:01 +0200
parents b8c1c277a6ef
children 4485282cce66
files graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp
diffstat 4 files changed, 7 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java	Thu Jul 09 15:57:22 2015 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCNodeLIRBuilder.java	Thu Jul 09 15:58:01 2015 +0200
@@ -25,7 +25,6 @@
 
 import jdk.internal.jvmci.code.*;
 import jdk.internal.jvmci.common.*;
-import jdk.internal.jvmci.debug.*;
 import jdk.internal.jvmci.meta.*;
 
 import com.oracle.graal.compiler.gen.*;
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java	Thu Jul 09 15:57:22 2015 +0200
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java	Thu Jul 09 15:58:01 2015 +0200
@@ -283,7 +283,7 @@
         // TODO: (sa) Fold the two traversals into one
         stuffDelayedControlTransfers(lir);
         int constantSize = calculateConstantSize(lir);
-        boolean canUseImmediateConstantLoad = constantSize < (1 << 13) - 1;
+        boolean canUseImmediateConstantLoad = constantSize < (1 << 12) - 1;
         masm.setImmediateConstantLoad(canUseImmediateConstantLoad);
         FrameMap frameMap = crb.frameMap;
         RegisterConfig regConfig = frameMap.getRegisterConfig();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Thu Jul 09 15:57:22 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Thu Jul 09 15:58:01 2015 +0200
@@ -24,7 +24,6 @@
 
 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
 import static jdk.internal.jvmci.code.ValueUtil.*;
-import jdk.internal.jvmci.code.CompilationResult.DataSectionReference;
 import jdk.internal.jvmci.code.*;
 import jdk.internal.jvmci.meta.*;
 
@@ -71,16 +70,9 @@
     @Override
     public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
         Register baseRegister = asRegister(base);
-        DataSectionReference ref = new DataSectionReference();
-        ref.setOffset(0);
-        crb.compilationResult.recordDataPatch(masm.position(), ref);
-        // TODO: (sa) Make this relocation shorter (right now it takes always 8 instructions)
-        new SPARCMacroAssembler.Setx(0, baseRegister, true).emit(masm);
-        /**
-         * Place the base register into the center of the reachable 8k range. This bias is reflected
-         * in CodeInstaller::pd_patch_DataSectionReference (jvmciCodeInstaller_sparc.cpp)
-         */
-        masm.sub(baseRegister, -1 & ~((1 << 12) - 1), baseRegister);
+        int beforePosition = masm.position();
+        masm.rdpc(baseRegister);
+        masm.sub(baseRegister, beforePosition, baseRegister);
     }
 
     public AllocatableValue getResult() {
--- a/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp	Thu Jul 09 15:57:22 2015 +0200
+++ b/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp	Thu Jul 09 15:58:01 2015 +0200
@@ -76,10 +76,10 @@
         _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 {
+  }else {
+    int const_size = align_size_up(_constants->end()-_constants->start(), CodeEntryAlignment);
     NativeMovRegMem* load = nativeMovRegMem_at(pc);
-    // The base pointer is set 4k off (see SPARCLoadConstantTableBaseOp)
-    load->set_offset(data_offset - (1<<12));
+    load->set_offset(- (const_size - data_offset));
     TRACE_jvmci_3("relocating ld at %p (+%d) with destination at %d", pc, pc_offset, data_offset);
   }
 }