# HG changeset patch # User Stefan Anzinger # Date 1401734457 -7200 # Node ID b955d649fca851cd83b2cdfece9a7fec14928cdd # Parent f57cf459f5d3e8780714088e447c7ef93df6c0b3 Fixing BC_i2f, BC_i2c, BC_fadd Implementing instructions in assembler Movwtos and Fitos diff -r f57cf459f5d3 -r b955d649fca8 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 Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Mon Jun 02 20:40:57 2014 +0200 @@ -1181,6 +1181,7 @@ Fnsmuld(0x79, "fnsmuld"), Fnhadds(0x71, "fnhadds"), Fnhaddd(0x72, "fnhaddd"), + Movtos(0x119, "movtos"), // end VIS3 // start CAMMELLIA @@ -1228,7 +1229,8 @@ Fdmuldq(0x6E, "fdmulq"), Fstoi(0xD1, "fstoi"), - Fdtoi(0xD2, "fdtoi"); + Fdtoi(0xD2, "fdtoi"), + Fitos(0xC4, "fitos"); // @formatter:on private final int value; @@ -1667,6 +1669,13 @@ } } + public static class Movwtos extends Fmt3p { + public Movwtos(Register src, Register dst) { + /* VIS3 only */ + super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movtos, g0, src, dst); + } + } + public static class Bpa extends Fmt00c { public Bpa(int simm19) { @@ -2637,6 +2646,13 @@ } } + public static class Fitos extends Fmt3n { + + public Fitos(SPARCAssembler masm, Register src2, Register dst) { + super(masm, Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fitos.getValue(), src2.encoding(), dst.encoding()); + } + } + /** * Flush register windows */ @@ -2864,6 +2880,10 @@ public Ldf(SPARCAddress src, Register dst) { super(Op3s.Ldf, src, dst); } + + public Ldf(Register src, Register dst) { + super(Op3s.Ldf, src, dst); + } } public static class Ldsb extends Fmt11 { diff -r f57cf459f5d3 -r b955d649fca8 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 Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Jun 02 20:40:57 2014 +0200 @@ -850,7 +850,14 @@ assert inputVal.getKind() == Kind.Int; Variable result = newVariable(Kind.Int); int mask = (int) IntegerStamp.defaultMask(fromBits); - append(new BinaryRegConst(SPARCArithmetic.IAND, result, asAllocatable(inputVal), Constant.forInt(mask))); + Constant constant = Constant.forInt(mask); + if (canInlineConstant(constant)) { + append(new BinaryRegConst(SPARCArithmetic.IAND, result, asAllocatable(inputVal), constant)); + } else { + Variable maskVar = newVariable(Kind.Int); + emitMove(maskVar, constant); + append(new BinaryRegReg(IAND, result, maskVar, (inputVal))); + } if (toBits > 32) { Variable longResult = newVariable(Kind.Long); emitMove(longResult, result); diff -r f57cf459f5d3 -r b955d649fca8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java Mon Jun 02 20:40:57 2014 +0200 @@ -69,7 +69,7 @@ /** * Creates and registers the details for linking a foreign call to a {@link Stub}. - * + * * @param descriptor the signature of the call to the stub * @param reexecutable specifies if the stub call can be re-executed without (meaningful) side * effects. Deoptimization will not return to a point before a stub call that cannot @@ -83,7 +83,7 @@ /** * Creates and registers the linkage for a foreign call. - * + * * @param descriptor the signature of the foreign call * @param address the address of the code to call * @param outgoingCcType outgoing (caller) calling convention type @@ -104,7 +104,7 @@ /** * Creates a {@linkplain ForeignCallStub stub} for a foreign call. - * + * * @param descriptor the signature of the call to the stub * @param address the address of the foreign code to call * @param prependThread true if the JavaThread value for the current thread is to be prepended diff -r f57cf459f5d3 -r b955d649fca8 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_fadd.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_fadd.java Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_fadd.java Mon Jun 02 20:40:57 2014 +0200 @@ -49,4 +49,14 @@ runTest("test", 253.11f, 54.43f); } + @Test + public void run3() throws Throwable { + runTest("test", Float.MAX_VALUE, Float.MIN_VALUE); + } + + @Test + public void run4() throws Throwable { + runTest("test", Float.MAX_VALUE / 2, Float.MAX_VALUE / 2); + } + } diff -r f57cf459f5d3 -r b955d649fca8 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 Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Mon Jun 02 20:40:57 2014 +0200 @@ -28,34 +28,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.sparc.*; -import com.oracle.graal.asm.sparc.SPARCAssembler.Add; -import com.oracle.graal.asm.sparc.SPARCAssembler.And; -import com.oracle.graal.asm.sparc.SPARCAssembler.Faddd; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fadds; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fdivd; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fdivs; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fdtoi; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fmuld; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fmuls; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fnegd; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fnegs; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fstoi; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fsubd; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fsubs; -import com.oracle.graal.asm.sparc.SPARCAssembler.Mulx; -import com.oracle.graal.asm.sparc.SPARCAssembler.Or; -import com.oracle.graal.asm.sparc.SPARCAssembler.Sdivx; -import com.oracle.graal.asm.sparc.SPARCAssembler.Sll; -import com.oracle.graal.asm.sparc.SPARCAssembler.Sllx; -import com.oracle.graal.asm.sparc.SPARCAssembler.Sra; -import com.oracle.graal.asm.sparc.SPARCAssembler.Srax; -import com.oracle.graal.asm.sparc.SPARCAssembler.Srl; -import com.oracle.graal.asm.sparc.SPARCAssembler.Srlx; -import com.oracle.graal.asm.sparc.SPARCAssembler.Sub; -import com.oracle.graal.asm.sparc.SPARCAssembler.Xor; -import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Neg; -import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Not; -import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Signx; +import com.oracle.graal.asm.sparc.SPARCMacroAssembler.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; @@ -330,7 +303,7 @@ new Sdivx(asIntReg(src1), crb.asIntConst(src2), asIntReg(dst)).emit(masm); break; case IAND: - assert isSimm13(crb.asIntConst(src2)); + assert isSimm13(crb.asIntConst(src2)) : src2; new And(asIntReg(src1), crb.asIntConst(src2), asIntReg(dst)).emit(masm); break; case ISHL: @@ -595,7 +568,8 @@ new Srl(asIntReg(dst), 16, asIntReg(dst)).emit(masm); break; case I2F: - new Fstoi(masm, asIntReg(src), asFloatReg(dst)); + 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)); diff -r f57cf459f5d3 -r b955d649fca8 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCConstDataOp.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCConstDataOp.java Sat May 31 00:30:26 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -package com.oracle.graal.lir.sparc; - -import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; - -import com.oracle.graal.api.code.CompilationResult.RawData; -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.asm.sparc.*; -import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Nop; -import com.oracle.graal.lir.*; -import com.oracle.graal.lir.asm.*; -import com.oracle.graal.sparc.*; - -@Opcode("CONST_DATA") -public class SPARCConstDataOp extends SPARCLIRInstruction { - - @Def({REG}) private AllocatableValue dst; - private byte[] val; - - public SPARCConstDataOp(AllocatableValue dst, byte[] val) { - this.dst = dst; - this.val = val; - } - - @Override - public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { - RawData rawData = new RawData(val, 16); - // recordDataReferenceInCoe will fix up PC relative. Therefore - // the PC will be added later on to gather an absolute address - crb.recordDataReferenceInCode(rawData); - Register dstReg = ValueUtil.asLongReg(dst); - new SPARCAssembler.Sethi(0, dstReg).emit(masm); - - Nop nop = new SPARCMacroAssembler.Nop(); - nop.emit(masm); - nop.emit(masm); - nop.emit(masm); - nop.emit(masm); - nop.emit(masm); - nop.emit(masm); - new SPARCAssembler.Add(dstReg, 0, dstReg).emit(masm); - // TODO: Fix this issue with the pc relative addressing (This is just my first guess how to - // do this) - new SPARCAssembler.Sub(dstReg, 10 * 4, dstReg).emit(masm); - new SPARCAssembler.Rdpc(SPARC.g5).emit(masm); - new SPARCAssembler.Add(SPARC.g5, dstReg, dstReg).emit(masm); - } - -} diff -r f57cf459f5d3 -r b955d649fca8 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 Sat May 31 00:30:26 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Mon Jun 02 20:40:57 2014 +0200 @@ -23,25 +23,23 @@ package com.oracle.graal.lir.sparc; import static com.oracle.graal.api.code.ValueUtil.*; -import static com.oracle.graal.asm.sparc.SPARCMacroAssembler.*; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; import static com.oracle.graal.sparc.SPARC.*; +import com.oracle.graal.api.code.CompilationResult.RawData; import com.oracle.graal.api.code.*; -import com.oracle.graal.api.code.CompilationResult.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.sparc.*; +import com.oracle.graal.asm.sparc.SPARCAssembler.*; +import com.oracle.graal.asm.sparc.SPARCMacroAssembler.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.lir.*; -import com.oracle.graal.lir.StandardOp.ImplicitNullCheck; -import com.oracle.graal.lir.StandardOp.MoveOp; -import com.oracle.graal.lir.StandardOp.NullCheck; +import com.oracle.graal.lir.StandardOp.*; import com.oracle.graal.lir.asm.*; -import com.oracle.graal.sparc.*; public class SPARCMove { - @Opcode("MOVE") + @Opcode("MOVE_TOREG") public static class MoveToRegOp extends SPARCLIRInstruction implements MoveOp { @Def({REG, HINT}) protected AllocatableValue result; @@ -68,7 +66,7 @@ } } - @Opcode("MOVE") + @Opcode("MOVE_FROMREG") public static class MoveFromRegOp extends SPARCLIRInstruction implements MoveOp { @Def({REG, STACK}) protected AllocatableValue result; @@ -210,11 +208,6 @@ final boolean forceRelocatable = true; Register dstReg = asRegister(result); new Setx(0, dstReg, forceRelocatable).emit(masm); - // TODO: Fix this issue with the pc relative addressing (This is just my first guess how - // to do this) - new SPARCAssembler.Sub(dstReg, 10 * 4, dstReg).emit(masm); - new SPARCAssembler.Rdpc(SPARC.g5).emit(masm); - new SPARCAssembler.Add(SPARC.g5, dstReg, dstReg).emit(masm); } } @@ -488,7 +481,12 @@ } break; case Float: - new Ldf((SPARCAddress) crb.asFloatConstRef(input), asFloatReg(result)).emit(masm); + 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 Object: if (input.isNull()) {