# HG changeset patch # User Stefan Anzinger # Date 1401798696 -7200 # Node ID fcac781d35927950b56022f9c18d55ec66696d75 # Parent a4bd33d52985c707a612d53469dbafdb0de8fd3b# Parent 2e1957c8ccb8a378b657292c7c0eec155c24c330 Merge diff -r 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java Tue Jun 03 14:31:36 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 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Tue Jun 03 14:31:36 2014 +0200 @@ -1181,6 +1181,8 @@ Fnsmuld(0x79, "fnsmuld"), Fnhadds(0x71, "fnhadds"), Fnhaddd(0x72, "fnhaddd"), + Movxtod(0x118, "movxtod"), + Movwtos(0x119, "movwtos"), // end VIS3 // start CAMMELLIA @@ -1215,9 +1217,9 @@ Fsubq(0x47, "fsubq"), Fmuls(0x49, "fmuls"), Fmuld(0x4A, "fmuld"), - Fdivs(0x4C, "fdivs"), - Fdivd(0x4D, "fdivd"), - Fdivq(0x4E, "fdivq"), + Fdivs(0x4D, "fdivs"), + Fdivd(0x4E, "fdivd"), + Fdivq(0x4F, "fdivq"), Fsqrts(0x29, "fsqrts"), Fsqrtd(0x2A, "fsqrtd"), @@ -1228,7 +1230,16 @@ Fdmuldq(0x6E, "fdmulq"), Fstoi(0xD1, "fstoi"), - Fdtoi(0xD2, "fdtoi"); + Fdtoi(0xD2, "fdtoi"), + 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; @@ -1278,10 +1289,18 @@ } } + /** + * Condition Codes to use for instruction + */ public enum CC { // @formatter:off - + /** + * Condition is considered as 32bit operation condition + */ Icc(0b00, "icc"), + /** + * Condition is considered as 64bit operation condition + */ Xcc(0b10, "xcc"), Ptrcc(getHostWordKind() == Kind.Long ? Xcc.getValue() : Icc.getValue(), "ptrcc"), Fcc0(0b00, "fcc0"), @@ -1402,6 +1421,9 @@ } } + /** + * Represents the Address Space Identifier defined in the SPARC architec + */ public enum Asi { // @formatter:off @@ -1656,6 +1678,27 @@ } } + public static class Movwtos extends Fmt3p { + public Movwtos(Register src, Register dst) { + /* VIS3 only */ + 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); + } + } + public static class Bpa extends Fmt00c { public Bpa(int simm19) { @@ -1906,6 +1949,9 @@ } } + /** + * Compare and Branch if Carry Clear ( Greater not C Than or Equal, Unsigned ) + */ public static class Cwbcc extends Fmt00e { public Cwbcc(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1917,6 +1963,9 @@ } } + /** + * Compare and Branch if Carry Set (Less Than, Unsigned) + */ public static class Cwbcs extends Fmt00e { public Cwbcs(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1928,6 +1977,9 @@ } } + /** + * Compare and Branch if Equal + */ public static class Cwbe extends Fmt00e { public Cwbe(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1939,6 +1991,9 @@ } } + /** + * Compare and Branch if Greater + */ public static class Cwbg extends Fmt00e { public Cwbg(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1950,6 +2005,9 @@ } } + /** + * Compare and Branch if Greater or Equal + */ public static class Cwbge extends Fmt00e { public Cwbge(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1961,6 +2019,9 @@ } } + /** + * Compare and Branch if Greater Unsigned + */ public static class Cwbgu extends Fmt00e { public Cwbgu(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1972,6 +2033,9 @@ } } + /** + * Compare and Branch if Less + */ public static class Cwbl extends Fmt00e { public Cwbl(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1983,6 +2047,9 @@ } } + /** + * Compare and Branch if Less or Equal + */ public static class Cwble extends Fmt00e { public Cwble(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -1994,6 +2061,9 @@ } } + /** + * Compare and Branch if Less or Equal Unsigned + */ public static class Cwbleu extends Fmt00e { public Cwbleu(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2005,6 +2075,9 @@ } } + /** + * Compare and Branch if Not Equal + */ public static class Cwbne extends Fmt00e { public Cwbne(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2016,6 +2089,9 @@ } } + /** + * Compare and Branch if Negative + */ public static class Cwbneg extends Fmt00e { public Cwbneg(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2027,6 +2103,9 @@ } } + /** + * Compare and Branch if Positive + */ public static class Cwbpos extends Fmt00e { public Cwbpos(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2038,6 +2117,9 @@ } } + /** + * Compare and Branch if Overflow Clear + */ public static class Cwbvc extends Fmt00e { public Cwbvc(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2049,6 +2131,9 @@ } } + /** + * Compare and Branch if Overflow Set + */ public static class Cwbvs extends Fmt00e { public Cwbvs(SPARCAssembler asm, Register src1, Register src2, int simm10) { @@ -2340,6 +2425,9 @@ } } + /** + * Floating-point multiply-add single (fused) + */ public static class Fmadds extends Fmt5a { public Fmadds(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { @@ -2347,6 +2435,9 @@ } } + /** + * Floating-point multiply-add double (fused) + */ public static class Fmaddd extends Fmt5a { public Fmaddd(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { @@ -2354,6 +2445,9 @@ } } + /** + * 16-bit partitioned average + */ public static class Fmean16 extends Fmt3p { public Fmean16(Register src1, Register src2, Register dst) { @@ -2565,6 +2659,16 @@ } } + 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 + */ public static class Fdtoi extends Fmt3n { public Fdtoi(SPARCAssembler masm, Register src2, Register dst) { @@ -2572,6 +2676,30 @@ } } + 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()); + } + } + + 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 + */ public static class Flushw extends Fmt10 { public Flushw() { @@ -2789,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 { @@ -2796,6 +2928,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 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/GraalOptions.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/UnsafeAccess.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/PrimitiveStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampFactory.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/StampProvider.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java diff -r 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Jun 03 14:31:36 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,16 +844,23 @@ 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); - 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 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotForeignCallsProvider.java Tue Jun 03 14:31:36 2014 +0200 @@ -61,6 +61,7 @@ register(new HotSpotForeignCallLinkage(EXCEPTION_HANDLER, 0L, PRESERVES_REGISTERS, LEAF_NOFP, outgoingExceptionCc, incomingExceptionCc, NOT_REEXECUTABLE, ANY_LOCATION)); register(new HotSpotForeignCallLinkage(EXCEPTION_HANDLER_IN_CALLER, JUMP_ADDRESS, PRESERVES_REGISTERS, LEAF_NOFP, outgoingExceptionCc, incomingExceptionCc, NOT_REEXECUTABLE, ANY_LOCATION)); + link(new SPARCDeoptimizationStub(providers, target, registerStubCall(DEOPTIMIZATION_HANDLER, REEXECUTABLE, LEAF, NO_LOCATIONS))); link(new SPARCDeoptimizationStub(providers, target, registerStubCall(UNCOMMON_TRAP_HANDLER, REEXECUTABLE, LEAF, NO_LOCATIONS))); super.initialize(providers, config); diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java Tue Jun 03 14:31:36 2014 +0200 @@ -61,6 +61,10 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + // Move the values up one level to be the input for the next call. + new SPARCMacroAssembler.Mov(asRegister(handlerInCallerPc), i2).emit(masm); + new SPARCMacroAssembler.Mov(asRegister(exception), i0).emit(masm); + new SPARCMacroAssembler.Mov(asRegister(exceptionPc), i1).emit(masm); leaveFrame(crb); // Restore SP from L7 if the exception PC is a method handle call site. diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerationResult.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Tue Jun 03 14:31:36 2014 +0200 @@ -290,6 +290,19 @@ return result; } + @Override + public Value emitDeoptimizationFetchUnrollInfoCall(SaveRegistersOp saveRegisterOp) { + ForeignCallLinkage linkage = getForeignCalls().lookupForeignCall(FETCH_UNROLL_INFO); + + Register threadRegister = getProviders().getRegisters().getThreadRegister(); + Register stackPointerRegister = getProviders().getRegisters().getStackPointerRegister(); + append(new SPARCHotSpotCRuntimeCallPrologueOp(config.threadLastJavaSpOffset(), threadRegister, stackPointerRegister)); + Variable result = super.emitForeignCall(linkage, null, threadRegister.asValue(Kind.Long)); + append(new SPARCHotSpotCRuntimeCallEpilogueOp(config.threadLastJavaSpOffset(), config.threadLastJavaPcOffset(), config.threadJavaFrameAnchorFlagsOffset(), threadRegister)); + + return result; + } + public void emitNullCheck(Value address, LIRFrameState state) { assert address.getKind() == Kind.Object : address + " - " + address.getKind() + " not an object!"; append(new NullCheckOp(load(address), state)); diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveCurrentStackFrameOp.java Tue Jun 03 14:31:36 2014 +0200 @@ -28,12 +28,13 @@ import com.oracle.graal.asm.sparc.SPARCMacroAssembler.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; +import com.oracle.graal.lir.sparc.*; /** * Pops the current frame off the stack. */ @Opcode("LEAVE_CURRENT_STACK_FRAME") -final class SPARCHotSpotLeaveCurrentStackFrameOp extends SPARCHotSpotEpilogueOp { +final class SPARCHotSpotLeaveCurrentStackFrameOp extends SPARCLIRInstruction { @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { @@ -44,6 +45,6 @@ new Mov(o3, i3).emit(masm); new Mov(o4, i4).emit(masm); - leaveFrame(crb); + crb.frameContext.leave(crb); } } diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveDeoptimizedStackFrameOp.java Tue Jun 03 14:31:36 2014 +0200 @@ -28,12 +28,13 @@ import com.oracle.graal.asm.sparc.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; +import com.oracle.graal.lir.sparc.*; /** * Pops the current frame off the stack including the return address. */ @Opcode("LEAVE_DEOPTIMIZED_STACK_FRAME") -final class SPARCHotSpotLeaveDeoptimizedStackFrameOp extends SPARCHotSpotEpilogueOp { +final class SPARCHotSpotLeaveDeoptimizedStackFrameOp extends SPARCLIRInstruction { @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotUnwindOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotUnwindOp.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotUnwindOp.java Tue Jun 03 14:31:36 2014 +0200 @@ -49,6 +49,9 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + // This Frame is left but the called unwind (which is sibling) method needs the exception as + // input in i0 + new Mov(o0, i0).emit(masm); leaveFrame(crb); ForeignCallLinkage linkage = crb.foreignCalls.lookupForeignCall(UNWIND_EXCEPTION_TO_CALLER); @@ -59,7 +62,6 @@ // Get return address (is in o7 after leave). Register returnAddress = asRegister(cc.getArgument(1)); new Mov(o7, returnAddress).emit(masm); - Register scratch = g5; SPARCCall.indirectJmp(crb, masm, scratch, linkage); } diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java diff -r 2e1957c8ccb8 -r fcac781d3592 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 Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotForeignCallsProviderImpl.java Tue Jun 03 14:31:36 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 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMConstant.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMField.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMFlag.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.hotspotvmconfig/src/com/oracle/graal/hotspotvmconfig/HotSpotVMType.java diff -r 2e1957c8ccb8 -r fcac781d3592 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 Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_fadd.java Tue Jun 03 14:31:36 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 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_i2d.java Tue Jun 03 14:31:36 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 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_lcmp.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_lcmp.java Mon Jun 02 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_lcmp.java Tue Jun 03 14:31:36 2014 +0200 @@ -49,4 +49,24 @@ runTest("test", -1L, 0L); } + /** + * Test with ugly numbers (which probably does not fit into one instruction + * + * @throws Throwable + */ + @Test + public void run3() throws Throwable { + runTest("test", 293521900824L, 97726785831L); + } + + /** + * Test with big numbers where it makes difference if the value is handled with 64 bits + * + * @throws Throwable + */ + @Test + public void run4() throws Throwable { + runTest("test", -1L, Long.MIN_VALUE); + } + } diff -r 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Tue Jun 03 14:31:36 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: @@ -431,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(); @@ -539,6 +512,17 @@ } else { switch (opcode) { case LREM: + new Sdivx(asLongReg(src1), asLongReg(src2), asLongReg(scratch1)).emit(masm); + exceptionOffset = masm.position(); + new Mulx(asLongReg(scratch1), asLongReg(src2), asLongReg(scratch2)).emit(masm); + new Sub(asLongReg(src1), asLongReg(scratch2), asLongReg(dst)).emit(masm); + break; + case IREM: + new Sdivx(asIntReg(src1), asIntReg(src2), asIntReg(scratch1)).emit(masm); + exceptionOffset = masm.position(); + new Mulx(asIntReg(scratch1), asIntReg(src2), asIntReg(scratch2)).emit(masm); + new Sub(asIntReg(src1), asIntReg(scratch2), asIntReg(dst)).emit(masm); + break; case LUREM: throw GraalInternalError.unimplemented(); default: @@ -560,31 +544,57 @@ case INEG: new Neg(asIntReg(src), asIntReg(dst)).emit(masm); break; + case LNEG: + new Neg(asLongReg(src), asLongReg(dst)).emit(masm); + break; case INOT: new Not(asIntReg(src), asIntReg(dst)).emit(masm); break; 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 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)); + case F2D: + new Fstod(masm, asDoubleReg(dst), asDoubleReg(dst)); break; case FNEG: new Fnegs(masm, asFloatReg(src), asFloatReg(dst)); diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java diff -r 2e1957c8ccb8 -r fcac781d3592 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 18:14:39 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Tue Jun 03 14:31:36 2014 +0200 @@ -23,24 +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.*; public class SPARCMove { - @Opcode("MOVE") + @Opcode("MOVE_TOREG") public static class MoveToRegOp extends SPARCLIRInstruction implements MoveOp { @Def({REG, HINT}) protected AllocatableValue result; @@ -67,7 +66,7 @@ } } - @Opcode("MOVE") + @Opcode("MOVE_FROMREG") public static class MoveFromRegOp extends SPARCLIRInstruction implements MoveOp { @Def({REG, STACK}) protected AllocatableValue result; @@ -207,7 +206,8 @@ SPARCAddress addr = (SPARCAddress) crb.recordDataReferenceInCode(rawData); assert addr == masm.getPlaceholder(); final boolean forceRelocatable = true; - new Setx(0, asRegister(result), forceRelocatable).emit(masm); + Register dstReg = asRegister(result); + new Setx(0, dstReg, forceRelocatable).emit(masm); } } @@ -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)) { @@ -481,7 +482,19 @@ } break; case Float: - new Ldf((SPARCAddress) crb.asFloatConstRef(input), asFloatReg(result)).emit(masm); + crb.asFloatConstRef(input); + // 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()) { diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BinaryOpLogicNode.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadExceptionObjectNode.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningPhase.java diff -r 2e1957c8ccb8 -r fcac781d3592 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java diff -r 2e1957c8ccb8 -r fcac781d3592 mx/JUnitWrapper.java diff -r 2e1957c8ccb8 -r fcac781d3592 mx/mx_graal.py diff -r 2e1957c8ccb8 -r fcac781d3592 mx/projects diff -r 2e1957c8ccb8 -r fcac781d3592 src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp --- a/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Mon Jun 02 18:14:39 2014 +0200 +++ b/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Tue Jun 03 14:31:36 2014 +0200 @@ -59,11 +59,11 @@ void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, oop data) { address pc = _instructions->start() + pc_offset; + address const_start = _constants->start(); jint offset = DataSectionReference::offset(data); NativeMovRegMem* load = nativeMovRegMem_at(pc); - int disp = _constants_size + pc_offset - offset - BytesPerInstWord; - load->set_offset(-disp); + load->add_offset_in_bytes((long)const_start+offset); } void CodeInstaller::pd_relocate_CodeBlob(CodeBlob* cb, NativeInstruction* inst) { diff -r 2e1957c8ccb8 -r fcac781d3592 src/cpu/sparc/vm/sharedRuntime_sparc.cpp --- a/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Jun 02 18:14:39 2014 +0200 +++ b/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue Jun 03 14:31:36 2014 +0200 @@ -990,6 +990,19 @@ // Jump to the compiled code just as if compiled code was doing it. __ ld_ptr(G5_method, in_bytes(Method::from_compiled_offset()), G3); +#ifdef GRAAL + // check if this call should be routed towards a specific entry point + __ ld(Address(G2_thread, in_bytes(JavaThread::graal_alternate_call_target_offset())), G1); + __ cmp(G0, G1); + Label no_alternative_target; + __ br(Assembler::equal, false, Assembler::pn, no_alternative_target); + __ delayed()->nop(); + + __ ld_ptr(G2_thread, in_bytes(JavaThread::graal_alternate_call_target_offset()), G3); + __ st(G0, Address(G2_thread, in_bytes(JavaThread::graal_alternate_call_target_offset()))); + + __ bind(no_alternative_target); +#endif // 6243940 We might end up in handle_wrong_method if // the callee is deoptimized as we race thru here. If that diff -r 2e1957c8ccb8 -r fcac781d3592 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Mon Jun 02 18:14:39 2014 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Jun 03 14:31:36 2014 +0200 @@ -596,7 +596,23 @@ } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY) { return JNIHandles::make_local((oop) result.get_jobject()); } else { - oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL); + jvalue *value = (jvalue *) result.get_value_addr(); + // Narrow the value down if required (Important on big endian machines) + switch (jap.get_ret_type()) { + case T_BOOLEAN: + value->z = (jboolean) value->i; + break; + case T_BYTE: + value->b = (jbyte) value->i; + break; + case T_CHAR: + value->c = (jchar) value->i; + break; + case T_SHORT: + value->s = (jshort) value->i; + break; + } + oop o = java_lang_boxing_object::create(jap.get_ret_type(), value, CHECK_NULL); return JNIHandles::make_local(o); } C2V_END diff -r 2e1957c8ccb8 -r fcac781d3592 test/whitelist_baseline.txt