changeset 22567:6de3a450bc17

[SPARC] Fix issues with new ConstantValue and JavaConstant handling
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 01 Sep 2015 14:30:54 +0200
parents e0bcb1f067cd
children 3714119dfbc0
files graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java
diffstat 4 files changed, 24 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Tue Sep 01 14:49:24 2015 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Tue Sep 01 14:30:54 2015 +0200
@@ -172,6 +172,15 @@
         append(new LoadDataAddressOp(dst, data));
     }
 
+    @Override
+    public Value emitConstant(LIRKind kind, Constant constant) {
+        if (JavaConstant.isNull(constant)) {
+            return new ConstantValue(kind, kind.getPlatformKind().getDefaultValue());
+        } else {
+            return super.emitConstant(kind, constant);
+        }
+    }
+
     protected SPARCAddressValue asAddressValue(Value address) {
         if (address instanceof SPARCAddressValue) {
             return (SPARCAddressValue) address;
@@ -796,7 +805,7 @@
 
     private Variable emitShift(SPARCArithmetic op, Value a, Value b) {
         Variable result = newVariable(LIRKind.combine(a, b).changeType(a.getPlatformKind()));
-        if (isJavaConstant(b) && canInlineConstant((JavaConstant) b)) {
+        if (isJavaConstant(b) && canInlineConstant(asJavaConstant(b))) {
             append(new BinaryRegConst(op, result, load(a), asJavaConstant(b), null));
         } else {
             append(new BinaryRegReg(op, result, load(a), load(b)));
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Tue Sep 01 14:49:24 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Tue Sep 01 14:30:54 2015 +0200
@@ -113,7 +113,7 @@
                     masm.cmp(asIntReg(x), crb.asIntConst(y));
                     break;
                 case ACMP:
-                    if (((JavaConstant) y).isNull()) {
+                    if (asJavaConstant(y).isNull()) {
                         masm.cmp(asObjectReg(x), 0);
                         break;
                     } else {
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Tue Sep 01 14:49:24 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCLoadConstantTableBaseOp.java	Tue Sep 01 14:30:54 2015 +0200
@@ -51,7 +51,7 @@
  * this case absolute addressing (without using the base pointer is used). See also:
  * CodeInstaller::pd_patch_DataSectionReference
  *
- * @see SPARCMove#loadFromConstantTable(CompilationResultBuilder, SPARCMacroAssembler, PlatformKind,
+ * @see SPARCMove#loadFromConstantTable(CompilationResultBuilder, SPARCMacroAssembler, int,
  *      Register, Register, SPARCDelayedControlTransfer, Runnable)
  */
 public class SPARCLoadConstantTableBaseOp extends SPARCLIRInstruction {
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 01 14:49:24 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 01 14:30:54 2015 +0200
@@ -99,18 +99,17 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            final int byteCount = crb.target.getSizeInBytes(constant.getKind());
-            assert byteCount >= 1 : "Byte values must not be loaded via constant table";
-            final Kind constantKind = constant.getKind();
+            final int byteCount = crb.target.getSizeInBytes(result.getPlatformKind());
+            assert byteCount > 1 : "Byte values must not be loaded via constant table";
             final Runnable recordReference = () -> crb.recordDataReferenceInCode(constant, byteCount);
             Register baseRegister = asRegister(constantTableBase);
             if (isRegister(result)) {
                 Register resultRegister = asRegister(result);
-                loadFromConstantTable(crb, masm, constantKind, baseRegister, resultRegister, getDelayedControlTransfer(), recordReference);
+                loadFromConstantTable(crb, masm, byteCount, baseRegister, resultRegister, getDelayedControlTransfer(), recordReference);
             } else if (isStackSlot(result)) {
                 try (ScratchRegister scratch = masm.getScratchRegister()) {
                     Register scratchRegister = scratch.getRegister();
-                    loadFromConstantTable(crb, masm, constantKind, baseRegister, scratchRegister, getDelayedControlTransfer(), recordReference);
+                    loadFromConstantTable(crb, masm, byteCount, baseRegister, scratchRegister, getDelayedControlTransfer(), recordReference);
                     StackSlot slot = asStackSlot(result);
                     reg2stack(crb, masm, slot, scratchRegister.asValue(), getDelayedControlTransfer());
                 }
@@ -608,6 +607,8 @@
             boolean hasVIS1 = cpuFeatures.contains(CPUFeature.VIS1);
             boolean hasVIS3 = cpuFeatures.contains(CPUFeature.VIS3);
             Register resultRegister = asRegister(result);
+            int byteCount = crb.target.getSizeInBytes(result.getPlatformKind());
+            Runnable recordReference = () -> crb.recordDataReferenceInCode(input, byteCount);
             switch (input.getKind().getStackKind()) {
                 case Int:
                     if (input.isDefaultForKind()) {
@@ -620,8 +621,7 @@
                         if (constantTableBase.equals(g0)) {
                             throw JVMCIError.shouldNotReachHere();
                         } else {
-                            Runnable recordReference = () -> crb.recordDataReferenceInCode(input, input.getKind().getByteCount());
-                            loadFromConstantTable(crb, masm, Int, constantTableBase, resultRegister, delaySlotLir, recordReference);
+                            loadFromConstantTable(crb, masm, byteCount, constantTableBase, resultRegister, delaySlotLir, recordReference);
                         }
                     }
                     break;
@@ -633,8 +633,7 @@
                         delaySlotLir.emitControlTransfer(crb, masm);
                         masm.or(g0, (int) input.asLong(), resultRegister);
                     } else {
-                        Runnable recordReference = () -> crb.asLongConstRef(input);
-                        loadFromConstantTable(crb, masm, Long, constantTableBase, resultRegister, delaySlotLir, recordReference);
+                        loadFromConstantTable(crb, masm, byteCount, constantTableBase, resultRegister, delaySlotLir, recordReference);
                     }
                     break;
                 case Float: {
@@ -649,9 +648,8 @@
                             delaySlotLir.emitControlTransfer(crb, masm);
                             masm.movwtos(scratch, resultRegister);
                         } else {
-                            Runnable recordReference = () -> crb.asFloatConstRef(input);
                             // First load the address into the scratch register
-                            loadFromConstantTable(crb, masm, Float, constantTableBase, resultRegister, delaySlotLir, recordReference);
+                            loadFromConstantTable(crb, masm, byteCount, constantTableBase, resultRegister, delaySlotLir, recordReference);
                         }
                     }
                     break;
@@ -668,8 +666,7 @@
                             delaySlotLir.emitControlTransfer(crb, masm);
                             masm.movxtod(scratch, resultRegister);
                         } else {
-                            Runnable recordReference = () -> crb.asDoubleConstRef(input);
-                            loadFromConstantTable(crb, masm, Double, constantTableBase, resultRegister, delaySlotLir, recordReference);
+                            loadFromConstantTable(crb, masm, byteCount, constantTableBase, resultRegister, delaySlotLir, recordReference);
                         }
                     }
                     break;
@@ -679,8 +676,7 @@
                         delaySlotLir.emitControlTransfer(crb, masm);
                         masm.clr(resultRegister);
                     } else {
-                        Runnable recordReference = () -> crb.recordDataReferenceInCode(input, 8);
-                        loadFromConstantTable(crb, masm, Long, constantTableBase, resultRegister, delaySlotLir, recordReference);
+                        loadFromConstantTable(crb, masm, byteCount, constantTableBase, resultRegister, delaySlotLir, recordReference);
                     }
                     break;
                 default:
@@ -740,7 +736,7 @@
      * generated patterns by this method must be understood by
      * CodeInstaller::pd_patch_DataSectionReference (jvmciCodeInstaller_sparc.cpp).
      */
-    public static void loadFromConstantTable(CompilationResultBuilder crb, SPARCMacroAssembler masm, PlatformKind kind, Register constantTableBase, Register dest,
+    public static void loadFromConstantTable(CompilationResultBuilder crb, SPARCMacroAssembler masm, int byteCount, Register constantTableBase, Register dest,
                     SPARCDelayedControlTransfer delaySlotInstruction, Runnable recordReference) {
         SPARCAddress address;
         ScratchRegister scratch = null;
@@ -757,7 +753,6 @@
                 new Sethix(0, sr, true).emit(masm);
                 address = new SPARCAddress(sr, 0);
             }
-            int byteCount = crb.target.getSizeInBytes(kind);
             masm.ld(address, dest, byteCount, false);
         } finally {
             if (scratch != null) {