changeset 16319:a4bd33d52985

Fixing tests with number conversions, float and double handling. Introducing new VIS3 instructions. Adding testcases.
author Stefan Anzinger <stefan.anzinger@gmail.com>
date Tue, 03 Jun 2014 14:29:40 +0200
parents 31db7b7374f0
children fcac781d3592
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/GraalOptions.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/UnsafeAccess.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/PrimitiveStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampProvider.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMConstant.java graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMField.java graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMFlag.java graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMType.java graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_i2d.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BinaryOpLogicNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java test/whitelist_baseline.txt
diffstat 6 files changed, 118 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java	Tue Jun 03 14:29:40 2014 +0200
@@ -107,17 +107,17 @@
     }
 
     public static Register asObjectReg(Value value) {
-        assert value.getKind() == Kind.Object;
+        assert value.getKind() == Kind.Object : value.getKind();
         return asRegister(value);
     }
 
     public static Register asFloatReg(Value value) {
-        assert value.getKind() == Kind.Float;
+        assert value.getKind() == Kind.Float : value.getKind();
         return asRegister(value);
     }
 
     public static Register asDoubleReg(Value value) {
-        assert value.getKind() == Kind.Double;
+        assert value.getKind() == Kind.Double : value.getKind();
         return asRegister(value);
     }
 
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Tue Jun 03 14:29:40 2014 +0200
@@ -1181,7 +1181,8 @@
         Fnsmuld(0x79, "fnsmuld"),
         Fnhadds(0x71, "fnhadds"),
         Fnhaddd(0x72, "fnhaddd"),
-        Movtos(0x119, "movtos"),
+        Movxtod(0x118, "movxtod"),
+        Movwtos(0x119, "movwtos"),
         // end VIS3
 
         // start CAMMELLIA
@@ -1230,7 +1231,15 @@
 
         Fstoi(0xD1, "fstoi"),
         Fdtoi(0xD2, "fdtoi"),
-        Fitos(0xC4, "fitos");
+        Fxtos(0x84, "fxtos"),
+        Fxtod(0x88, "fxtod"),
+        Fxtoq(0x8C, "fxtoq"),
+        Fitos(0xC4, "fitos"),
+        Fdtos(0xC6, "fdtos"),
+        Fitod(0xC8, "fitod"),
+        Fstod(0xC9, "fstod"),
+        Fitoq(0xCC, "fitoq")
+        ;
         // @formatter:on
 
         private final int value;
@@ -1672,7 +1681,21 @@
     public static class Movwtos extends Fmt3p {
         public Movwtos(Register src, Register dst) {
             /* VIS3 only */
-            super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movtos, g0, src, dst);
+            super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movwtos, g0, src, dst);
+        }
+    }
+
+    public static class Movxtod extends Fmt3p {
+        public Movxtod(Register src, Register dst) {
+            /* VIS3 only */
+            super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movxtod, g0, src, dst);
+        }
+    }
+
+    public static class Fdtos extends Fmt3p {
+        public Fdtos(Register src, Register dst) {
+            /* VIS3 only */
+            super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fdtos, g0, src, dst);
         }
     }
 
@@ -2636,6 +2659,13 @@
         }
     }
 
+    public static class Fstod extends Fmt3n {
+
+        public Fstod(SPARCAssembler masm, Register src2, Register dst) {
+            super(masm, Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fstod.getValue(), src2.encoding(), dst.encoding());
+        }
+    }
+
     /**
      * Convert Double to 32-bit Integer
      */
@@ -2653,6 +2683,20 @@
         }
     }
 
+    public static class Fitod extends Fmt3n {
+
+        public Fitod(SPARCAssembler masm, Register src2, Register dst) {
+            super(masm, Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fitod.getValue(), src2.encoding(), dst.encoding());
+        }
+    }
+
+    public static class Fxtod extends Fmt3n {
+
+        public Fxtod(SPARCAssembler masm, Register src2, Register dst) {
+            super(masm, Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fxtod.getValue(), src2.encoding(), dst.encoding());
+        }
+    }
+
     /**
      * Flush register windows
      */
@@ -2873,6 +2917,10 @@
         public Lddf(SPARCAddress src, Register dst) {
             super(Op3s.Lddf, src, dst);
         }
+
+        public Lddf(Register src, Register dst) {
+            super(Op3s.Lddf, src, dst);
+        }
     }
 
     public static class Ldf extends Fmt11 {
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Tue Jun 03 14:29:40 2014 +0200
@@ -443,6 +443,9 @@
     public Value emitNegate(Value input) {
         Variable result = newVariable(input.getKind());
         switch (input.getKind().getStackKind()) {
+            case Long:
+                append(new Op1Stack(LNEG, result, input));
+                break;
             case Int:
                 append(new Op1Stack(INEG, result, input));
                 break;
@@ -782,13 +785,13 @@
             case F2L:
                 return emitConvert2Op(Kind.Long, F2L, input);
             case I2D:
-                return emitConvert2Op(Kind.Double, I2D, input);
+                return emitConvert2Op(Kind.Double, L2D, emitConvert2Op(Kind.Long, I2L, input));
             case I2F:
                 return emitConvert2Op(Kind.Float, I2F, input);
             case L2D:
                 return emitConvert2Op(Kind.Double, L2D, input);
             case L2F:
-                return emitConvert2Op(Kind.Float, L2F, input);
+                return emitConvert2Op(Kind.Float, D2F, emitConvert2Op(Kind.Double, L2D, input));
             default:
                 throw GraalInternalError.shouldNotReachHere();
         }
@@ -841,13 +844,13 @@
         if (fromBits == toBits) {
             return inputVal;
         } else if (fromBits > 32) {
-            assert inputVal.getKind() == Kind.Long;
+            assert inputVal.getKind() == Kind.Long : inputVal.getKind();
             Variable result = newVariable(Kind.Long);
             long mask = IntegerStamp.defaultMask(fromBits);
             append(new BinaryRegConst(SPARCArithmetic.LAND, result, asAllocatable(inputVal), Constant.forLong(mask)));
             return result;
         } else {
-            assert inputVal.getKind() == Kind.Int;
+            assert inputVal.getKind() == Kind.Int || inputVal.getKind() == Kind.Short || inputVal.getKind() == Kind.Byte : inputVal.getKind();
             Variable result = newVariable(Kind.Int);
             int mask = (int) IntegerStamp.defaultMask(fromBits);
             Constant constant = Constant.forInt(mask);
--- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_i2d.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_i2d.java	Tue Jun 03 14:29:40 2014 +0200
@@ -49,4 +49,24 @@
         runTest("test", -34);
     }
 
+    @Test
+    public void run3() throws Throwable {
+        runTest("test", Integer.MIN_VALUE);
+    }
+
+    @Test
+    public void run4() throws Throwable {
+        runTest("test", Integer.MAX_VALUE);
+    }
+
+    @Test
+    public void run5() throws Throwable {
+        runTest("test", 34);
+    }
+
+    @Test
+    public void run6() throws Throwable {
+        runTest("test", new Integer(Short.MAX_VALUE));
+    }
+
 }
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Tue Jun 03 14:29:40 2014 +0200
@@ -404,10 +404,10 @@
                     new Sll(asIntReg(src1), asIntReg(src2), asIntReg(dst)).emit(masm);
                     break;
                 case ISHR:
-                    new Srl(asIntReg(src1), asIntReg(src2), asIntReg(dst)).emit(masm);
+                    new Sra(asIntReg(src1), asIntReg(src2), asIntReg(dst)).emit(masm);
                     break;
                 case IUSHR:
-                    new Sra(asIntReg(src1), asIntReg(src2), asIntReg(dst)).emit(masm);
+                    new Srl(asIntReg(src1), asIntReg(src2), asIntReg(dst)).emit(masm);
                     break;
                 case IREM:
                     throw GraalInternalError.unimplemented();
@@ -553,26 +553,48 @@
                 case LNOT:
                     new Not(asLongReg(src), asLongReg(dst)).emit(masm);
                     break;
+                case D2F:
+                    new Fdtos(asDoubleReg(src), asFloatReg(dst)).emit(masm);
+                    break;
+                /*
+                 * case L2F:
+                 * 
+                 * new Movxtod(asLongReg(src), asDoubleReg(dst)).emit(masm); new Fxtod(masm,
+                 * asDoubleReg(dst), asDoubleReg(dst)); new Fdtos(asDoubleReg(dst),
+                 * asFloatReg(dst)).emit(masm); break;
+                 */
+                case L2D:
+                    new Movxtod(asLongReg(src), asDoubleReg(dst)).emit(masm);
+                    new Fxtod(masm, asDoubleReg(dst), asDoubleReg(dst));
+                    break;
                 case I2L:
                     new Signx(asIntReg(src), asLongReg(dst)).emit(masm);
                     break;
                 case L2I:
                     new Signx(asLongReg(src), asIntReg(dst)).emit(masm);
                     break;
+                case B2L:
+                    new Sllx(asIntReg(src), 56, asLongReg(dst)).emit(masm);
+                    new Srax(asLongReg(dst), 56, asLongReg(dst)).emit(masm);
+                    break;
+                case S2L:
+                    new Sllx(asIntReg(src), 48, asLongReg(dst)).emit(masm);
+                    new Srax(asLongReg(dst), 48, asLongReg(dst)).emit(masm);
+                    break;
                 case B2I:
                     new Sll(asIntReg(src), 24, asIntReg(dst)).emit(masm);
-                    new Srl(asIntReg(dst), 24, asIntReg(dst)).emit(masm);
+                    new Sra(asIntReg(dst), 24, asIntReg(dst)).emit(masm);
                     break;
                 case S2I:
                     new Sll(asIntReg(src), 16, asIntReg(dst)).emit(masm);
-                    new Srl(asIntReg(dst), 16, asIntReg(dst)).emit(masm);
+                    new Sra(asIntReg(dst), 16, asIntReg(dst)).emit(masm);
                     break;
                 case I2F:
                     new Movwtos(asIntReg(src), asFloatReg(dst)).emit(masm);
                     new Fitos(masm, asFloatReg(dst), asFloatReg(dst));
                     break;
-                case I2D:
-                    new Fdtoi(masm, asIntReg(src), asDoubleReg(dst));
+                case F2D:
+                    new Fstod(masm, asDoubleReg(dst), asDoubleReg(dst));
                     break;
                 case FNEG:
                     new Fnegs(masm, asFloatReg(src), asFloatReg(dst));
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Mon Jun 02 21:08:05 2014 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Jun 03 14:29:40 2014 +0200
@@ -455,6 +455,7 @@
     }
 
     private static void const2reg(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Constant input) {
+        Register scratch = g5;
         switch (input.getKind().getStackKind()) {
             case Int:
                 if (crb.codeCache.needsDataPatch(input)) {
@@ -482,12 +483,19 @@
                 break;
             case Float:
                 crb.asFloatConstRef(input);
-                Register scratch = g5;
                 // First load the address into the scratch register
                 new Setx(0, scratch, true).emit(masm);
                 // Now load the float value
                 new Ldf(scratch, asFloatReg(result)).emit(masm);
                 break;
+            case Double:
+                crb.asDoubleConstRef(input);
+                scratch = g5;
+                // First load the address into the scratch register
+                new Setx(0, scratch, true).emit(masm);
+                // Now load the float value
+                new Lddf(scratch, asDoubleReg(result)).emit(masm);
+                break;
             case Object:
                 if (input.isNull()) {
                     new Clr(asRegister(result)).emit(masm);