# HG changeset patch # User Stefan Anzinger # Date 1401798580 -7200 # Node ID a4bd33d52985c707a612d53469dbafdb0de8fd3b # Parent 31db7b7374f0f67b4d6063ef86a612ea445ff3f2 Fixing tests with number conversions, float and double handling. Introducing new VIS3 instructions. Adding testcases. diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java --- 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); } diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java --- 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 { diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/GraalOptions.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/UnsafeAccess.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/PrimitiveStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampProvider.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- 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); diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMConstant.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMField.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMFlag.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMType.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_i2d.java --- 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)); + } + } diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java --- 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)); diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java --- 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); diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BinaryOpLogicNode.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningPhase.java diff -r 31db7b7374f0 -r a4bd33d52985 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java diff -r 31db7b7374f0 -r a4bd33d52985 test/whitelist_baseline.txt