changeset 22652:3a68d50004d8

Support inline null comparisons in SPARC backend.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 17 Sep 2015 16:48:47 +0200
parents 00ee7def5b54
children 9ca1a782b6c7
files graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java 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/SPARCControlFlow.java
diffstat 4 files changed, 23 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Thu Sep 17 15:05:54 2015 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Thu Sep 17 16:48:47 2015 +0200
@@ -1562,7 +1562,7 @@
                 bits = Float.floatToRawIntBits(constant.asFloat());
                 break;
             case Object:
-                return JavaConstant.NULL_POINTER.equals(constant);
+                return constant.isNull();
             default:
                 bits = constant.asLong();
                 break;
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Sep 17 15:05:54 2015 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Sep 17 16:48:47 2015 +0200
@@ -361,18 +361,9 @@
             default:
                 throw JVMCIError.shouldNotReachHere(actualCmpKind.toString());
         }
-        right = toDefaultConstantOfKind(cmpKind, right);
         append(new SPARCControlFlow.CompareBranchOp(opcode, left, right, actualCondition, trueDestination, falseDestination, actualCmpKind, unorderedIsTrue, trueDestinationProbability));
     }
 
-    private static Value toDefaultConstantOfKind(PlatformKind forKind, Value value) {
-        if (isJavaConstant(value) && asJavaConstant(value).isDefaultForKind()) {
-            return new ConstantValue(LIRKind.value(forKind), forKind.getDefaultValue());
-        } else {
-            return value;
-        }
-    }
-
     @Override
     public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, LIRKind cmpLIRKind, double overflowProbability) {
         JavaKind cmpKind = (JavaKind) cmpLIRKind.getPlatformKind();
@@ -463,7 +454,6 @@
             right = loadNonConst(b);
             mirrored = false;
         }
-        right = toDefaultConstantOfKind(cmpKind, right);
         switch ((JavaKind) cmpKind) {
             case Short:
             case Char:
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Thu Sep 17 15:05:54 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java	Thu Sep 17 16:48:47 2015 +0200
@@ -29,13 +29,14 @@
 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.CONST;
 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.REG;
 import static com.oracle.graal.lir.LIRValueUtil.asJavaConstant;
-import static com.oracle.graal.lir.LIRValueUtil.isJavaConstant;
 import static jdk.internal.jvmci.code.ValueUtil.asRegister;
 import static jdk.internal.jvmci.code.ValueUtil.isRegister;
 import jdk.internal.jvmci.common.JVMCIError;
+import jdk.internal.jvmci.meta.JavaConstant;
 import jdk.internal.jvmci.meta.JavaKind;
 import jdk.internal.jvmci.meta.Value;
 
+import com.oracle.graal.asm.NumUtil;
 import com.oracle.graal.asm.sparc.SPARCMacroAssembler;
 import com.oracle.graal.lir.LIRInstructionClass;
 import com.oracle.graal.lir.Opcode;
@@ -108,28 +109,27 @@
                     throw JVMCIError.shouldNotReachHere();
             }
         } else {
-            assert isJavaConstant(y);
+            JavaConstant c = asJavaConstant(y);
+            int imm;
+            if (c.isNull()) {
+                imm = 0;
+            } else {
+                assert NumUtil.isInt(c.asLong());
+                imm = (int) c.asLong();
+            }
+
             switch (opcode) {
                 case LCMP:
-                    assert isSimm13(crb.asLongConst(y));
-                    masm.cmp(asRegister(x, JavaKind.Long), (int) crb.asLongConst(y));
+                    assert isSimm13(imm);
+                    masm.cmp(asRegister(x, JavaKind.Long), imm);
                     break;
                 case ICMP:
                     assert isSimm13(crb.asIntConst(y));
-                    masm.cmp(asRegister(x, JavaKind.Int), crb.asIntConst(y));
+                    masm.cmp(asRegister(x, JavaKind.Int), imm);
                     break;
                 case ACMP:
-                    if (asJavaConstant(y).isNull()) {
-                        masm.cmp(asRegister(x), 0);
-                        break;
-                    } else {
-                        throw JVMCIError.shouldNotReachHere("Only null object constants are allowed in comparisons");
-                    }
-                case FCMP:
-                    masm.fcmp(Fcc0, Fcmps, asRegister(x, JavaKind.Float), asRegister(y, JavaKind.Float));
-                    break;
-                case DCMP:
-                    masm.fcmp(Fcc0, Fcmpd, asRegister(x, JavaKind.Double), asRegister(y, JavaKind.Double));
+                    assert imm == 0 : "Only null object constants are allowed in comparisons";
+                    masm.cmp(asRegister(x), 0);
                     break;
                 default:
                     throw JVMCIError.shouldNotReachHere();
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Thu Sep 17 15:05:54 2015 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Thu Sep 17 16:48:47 2015 +0200
@@ -83,6 +83,7 @@
 import com.oracle.graal.asm.Assembler;
 import com.oracle.graal.asm.Assembler.LabelHint;
 import com.oracle.graal.asm.Label;
+import com.oracle.graal.asm.NumUtil;
 import com.oracle.graal.asm.sparc.SPARCAssembler;
 import com.oracle.graal.asm.sparc.SPARCAssembler.BranchPredict;
 import com.oracle.graal.asm.sparc.SPARCAssembler.CC;
@@ -284,7 +285,8 @@
             switch ((JavaKind) actualX.getLIRKind().getPlatformKind()) {
                 case Int:
                     if (isJavaConstant(actualY)) {
-                        int constantY = asJavaConstant(actualY).asInt();
+                        JavaConstant c = asJavaConstant(actualY);
+                        int constantY = c.isNull() ? 0 : c.asInt();
                         CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, JavaKind.Int), constantY, actualTrueTarget);
                     } else {
                         CBCOND.emit(masm, conditionFlag, false, asRegister(actualX, JavaKind.Int), asRegister(actualY, JavaKind.Int), actualTrueTarget);
@@ -292,7 +294,9 @@
                     break;
                 case Long:
                     if (isJavaConstant(actualY)) {
-                        int constantY = (int) asJavaConstant(actualY).asLong();
+                        JavaConstant c = asJavaConstant(actualY);
+                        assert NumUtil.is32bit(c.asLong());
+                        int constantY = c.isNull() ? 0 : (int) c.asLong();
                         CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, JavaKind.Long), constantY, actualTrueTarget);
                     } else {
                         CBCOND.emit(masm, conditionFlag, true, asRegister(actualX, JavaKind.Long), asRegister(actualY, JavaKind.Long), actualTrueTarget);