# HG changeset patch # User Stefan Anzinger # Date 1409711023 25200 # Node ID 2110fe2b72847203d2254399fa51f7dd995fbca2 # Parent 790e5e5072a2232bbc6ddda32204078c846d0519# Parent 66bf28082a142ad04f45dfa84cb84ca3ea620584 Merge diff -r 66bf28082a14 -r 2110fe2b7284 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 Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Tue Sep 02 19:23:43 2014 -0700 @@ -1998,6 +1998,7 @@ public Movwtos(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movwtos, g0, src, dst); + assert isSingleFloatRegister(dst); } } @@ -2012,6 +2013,7 @@ public Movxtod(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movxtod, g0, src, dst); + assert isDoubleFloatRegister(dst); } } @@ -2019,6 +2021,7 @@ public Movdtox(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movdtox, g0, src, dst); + assert isDoubleFloatRegister(src); } } @@ -2026,6 +2029,7 @@ public Movstosw(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movstosw, g0, src, dst); + assert isSingleFloatRegister(src); } } @@ -2033,6 +2037,7 @@ public Movstouw(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Movstouw, g0, src, dst); + assert isSingleFloatRegister(src); } } @@ -2040,6 +2045,8 @@ public Fdtos(Register src, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fdtos, g0, src, dst); + assert isSingleFloatRegister(dst); + assert isDoubleFloatRegister(src); } } @@ -2804,6 +2811,10 @@ public Fmsubs(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fmsubs.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(src3); + assert isSingleFloatRegister(dst); } } @@ -2811,6 +2822,10 @@ public Fmsubd(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fmsubd.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(src3); + assert isDoubleFloatRegister(dst); } } @@ -2818,6 +2833,8 @@ public Fmovs(Register src, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fmovs, g0, src, dst); + assert isSingleFloatRegister(src); + assert isSingleFloatRegister(dst); } } @@ -2832,6 +2849,9 @@ public Fmuls(Register src1, Register src2, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fmuls, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -2839,6 +2859,9 @@ public Fmuld(Register src1, Register src2, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fmuld, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -2846,6 +2869,9 @@ public Fsmuld(Register src1, Register src2, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fsmuld, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -2910,6 +2936,9 @@ public Fnadds(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnadds, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -2918,6 +2947,9 @@ public Fnaddd(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnaddd, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -2925,6 +2957,8 @@ public Fnegs(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fnegs.getValue(), src2.encoding(), dst.encoding()); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -2932,6 +2966,8 @@ public Fnegd(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fnegd.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -2940,6 +2976,9 @@ public Fnhadds(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnhadds, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -2948,6 +2987,9 @@ public Fnhaddd(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnhaddd, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -2955,6 +2997,10 @@ public Fnmadds(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fnmadds.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(src3); + assert isSingleFloatRegister(dst); } } @@ -2962,6 +3008,10 @@ public Fnmaddd(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fnmaddd.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(src3); + assert isDoubleFloatRegister(dst); } } @@ -2969,6 +3019,10 @@ public Fnmsubs(SPARCAssembler masm, Register src1, Register src2, Register src3, Register dst) { super(masm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fnmsubs.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(src3); + assert isSingleFloatRegister(dst); } } @@ -2976,6 +3030,10 @@ public Fnmsubd(SPARCAssembler masm, Register src1, Register src2, Register src3, Register dst) { super(masm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), Op5s.Fnmsubd.getValue(), src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(src3); + assert isDoubleFloatRegister(dst); } } @@ -2984,6 +3042,9 @@ public Fnmuls(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnmuls, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -2992,6 +3053,9 @@ public Fnmuld(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnmuld, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3000,6 +3064,9 @@ public Fnsmuld(Register src1, Register src2, Register dst) { /* VIS3 only */ super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fnsmuld, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3007,6 +3074,8 @@ public Fstoi(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fstoi.getValue(), src2.encoding(), dst.encoding()); + assert isSingleFloatRegister(dst); + assert isSingleFloatRegister(src2); } } @@ -3014,6 +3083,8 @@ public Fstox(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fstox.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(dst); + assert isSingleFloatRegister(src2); } } @@ -3021,6 +3092,8 @@ public Fdtox(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fdtox.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3028,6 +3101,8 @@ public Fstod(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fstod.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(dst); + assert isSingleFloatRegister(src2); } } @@ -3038,6 +3113,8 @@ public Fdtoi(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fdtoi.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -3045,6 +3122,8 @@ public Fitos(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fitos.getValue(), src2.encoding(), dst.encoding()); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -3052,6 +3131,8 @@ public Fitod(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fitod.getValue(), src2.encoding(), dst.encoding()); + assert isSingleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3059,6 +3140,8 @@ public Fxtod(Register src2, Register dst) { super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fxtod.getValue(), src2.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3097,6 +3180,10 @@ public Fpmaddx(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), 0, src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(src3); + assert isDoubleFloatRegister(dst); } } @@ -3104,6 +3191,10 @@ public Fpmaddxhi(SPARCAssembler asm, Register src1, Register src2, Register src3, Register dst) { super(asm, Ops.ArithOp.getValue(), Op3s.Impdep2.getValue(), 4, src1.encoding(), src2.encoding(), src3.encoding(), dst.encoding()); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(src3); + assert isDoubleFloatRegister(dst); } } @@ -3112,6 +3203,9 @@ public Fpmerge(Register src1, Register src2, Register dst) { /* VIS1 only */ super(Ops.ArithOp, Op3s.Impdep1, Opfs.Fpmerge, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3230,6 +3324,9 @@ public Fsubs(Register src1, Register src2, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fsubs, src1, src2, dst); + assert isSingleFloatRegister(src1); + assert isSingleFloatRegister(src2); + assert isSingleFloatRegister(dst); } } @@ -3237,6 +3334,9 @@ public Fsubd(Register src1, Register src2, Register dst) { super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fsubd, src1, src2, dst); + assert isDoubleFloatRegister(src1); + assert isDoubleFloatRegister(src2); + assert isDoubleFloatRegister(dst); } } @@ -3252,6 +3352,7 @@ public Fzeros(Register dst) { /* VIS1 only */ super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fzeros.getValue(), 0, dst.encoding()); + assert isSingleFloatRegister(dst); } } @@ -3260,6 +3361,7 @@ public Fzerod(Register dst) { /* VIS1 only */ super(Ops.ArithOp.getValue(), Op3s.Fpop1.getValue(), Opfs.Fzerod.getValue(), 0, dst.encoding()); + assert isDoubleFloatRegister(dst); } } @@ -3267,6 +3369,8 @@ public Fcmp(CC cc, Opfs opf, Register r1, Register r2) { super(Ops.ArithOp, cc, 0b110101, opf, r1, r2); + assert opf != Opfs.Fcmpd || (isDoubleFloatRegister(r1) && isDoubleFloatRegister(r2)); + assert opf != Opfs.Fcmps || (isSingleFloatRegister(r1) && isSingleFloatRegister(r2)); } } @@ -3452,10 +3556,12 @@ public Lddf(SPARCAddress src, Register dst) { super(Op3s.Lddf, src, dst); + assert dst == f0 || dst == f2 || dst == f4 || dst == f6 || isDoubleFloatRegister(dst); } public Lddf(Register src, Register dst) { super(Op3s.Lddf, src, dst); + assert dst == f0 || dst == f2 || dst == f4 || dst == f6 || isDoubleFloatRegister(dst); } } @@ -3463,10 +3569,12 @@ public Ldf(SPARCAddress src, Register dst) { super(Op3s.Ldf, src, dst); + assert isSingleFloatRegister(dst); } public Ldf(Register src, Register dst) { super(Op3s.Ldf, src, dst); + assert isSingleFloatRegister(dst); } } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Tue Sep 02 19:23:43 2014 -0700 @@ -24,6 +24,8 @@ import java.util.*; +import com.oracle.graal.compiler.common.*; + public interface AbstractControlFlowGraph> { static final int BLOCK_ID_INITIAL = -1; @@ -72,13 +74,18 @@ */ static boolean isDominatedBy(AbstractBlock a, AbstractBlock b) { assert a != null; - if (a == b) { - return true; + AbstractBlock dominator = a; + int i = 0; + while (dominator != null) { + if (i++ == Integer.MAX_VALUE) { // For safety + throw GraalInternalError.shouldNotReachHere(); + } + if (dominator == b) { + return true; + } + dominator = dominator.getDominator(); } - if (a.getDominator() == null) { - return false; - } - return isDominatedBy(a.getDominator(), b); + return false; } /** diff -r 66bf28082a14 -r 2110fe2b7284 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 Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Sep 02 19:23:43 2014 -0700 @@ -224,7 +224,6 @@ double trueDestinationProbability) { boolean mirrored = emitCompare(cmpKind, left, right); Condition finalCondition = mirrored ? cond.mirror() : cond; - boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue; Kind kind = left.getKind().getStackKind(); switch (kind) { @@ -235,7 +234,7 @@ break; case Float: case Double: - append(new BranchOp(finalCondition, trueDestination, falseDestination, kind, finalUnorderedIsTrue)); + append(new BranchOp(finalCondition, trueDestination, falseDestination, kind, unorderedIsTrue)); break; default: throw GraalInternalError.shouldNotReachHere("" + left.getKind()); @@ -705,7 +704,7 @@ Value actualB = b; switch (a.getKind().getStackKind()) { case Int: - op = IUDIV; + op = LUDIV; actualA = emitZeroExtend(actualA, 32, 64); actualB = emitZeroExtend(actualB, 32, 64); break; @@ -756,10 +755,10 @@ Variable result = newVariable(LIRKind.derive(a, b)); switch (a.getKind().getStackKind()) { case Int: - append(new Op2Stack(IXOR, result, a, loadNonConst(b))); + append(new Op2Stack(IXOR, result, load(a), loadNonConst(b))); break; case Long: - append(new Op2Stack(LXOR, result, a, loadNonConst(b))); + append(new Op2Stack(LXOR, result, load(a), loadNonConst(b))); break; default: throw GraalInternalError.shouldNotReachHere(); @@ -829,45 +828,43 @@ @Override public Value emitFloatConvert(FloatConvert op, Value inputVal) { AllocatableValue input = asAllocatable(inputVal); - Kind fromRegisterKind = null; - Kind toRegisterKind = null; - SPARCArithmetic conversionInstruction = null; switch (op) { case D2F: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), D2F, input); - case D2I: - fromRegisterKind = Kind.Double; - toRegisterKind = Kind.Int; - conversionInstruction = D2I; - break; - case F2L: - Variable v = newVariable(LIRKind.derive(inputVal).changeType(Kind.Double)); - emitMove(v, input); - input = v; - case D2L: - fromRegisterKind = Kind.Double; - toRegisterKind = Kind.Long; - conversionInstruction = D2L; - break; case F2D: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), F2D, input); - case F2I: - fromRegisterKind = Kind.Float; - toRegisterKind = Kind.Int; - conversionInstruction = F2I; - break; - case I2D: - // Implemented in two steps, as this consists of sign extension and then move the - // bits over to the double register and then convert to double, in fact this does - // not generate any overhead in generated code - { - AllocatableValue tmp = emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Long), I2L, input); - return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, tmp); - } case I2F: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), I2F, input); case L2D: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, input); + case D2I: { + AllocatableValue convertedFloatReg = emitConvert2Op(LIRKind.derive(input).changeType(Kind.Float), D2I, input); + AllocatableValue convertedIntReg = newVariable(LIRKind.derive(convertedFloatReg).changeType(Kind.Int)); + emitMove(convertedIntReg, convertedFloatReg); + return convertedIntReg; + } + case F2L: { + AllocatableValue convertedDoubleReg = emitConvert2Op(LIRKind.derive(input).changeType(Kind.Double), F2L, input); + AllocatableValue convertedLongReg = newVariable(LIRKind.derive(convertedDoubleReg).changeType(Kind.Long)); + emitMove(convertedLongReg, convertedDoubleReg); + return convertedLongReg; + } + case F2I: { + AllocatableValue convertedFloatReg = emitConvert2Op(LIRKind.derive(input).changeType(Kind.Float), F2I, input); + AllocatableValue convertedIntReg = newVariable(LIRKind.derive(convertedFloatReg).changeType(Kind.Int)); + emitMove(convertedIntReg, convertedFloatReg); + return convertedIntReg; + } + case D2L: { + AllocatableValue convertedDoubleReg = emitConvert2Op(LIRKind.derive(input).changeType(Kind.Double), D2L, input); + AllocatableValue convertedLongReg = newVariable(LIRKind.derive(convertedDoubleReg).changeType(Kind.Long)); + emitMove(convertedLongReg, convertedDoubleReg); + return convertedLongReg; + } + case I2D: { + AllocatableValue tmp = emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Long), I2L, input); + return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, tmp); + } case L2F: { AllocatableValue tmp = emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, input); return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), D2F, tmp); @@ -875,13 +872,6 @@ default: throw GraalInternalError.shouldNotReachHere(); } - if (fromRegisterKind != null) { - AllocatableValue var = newVariable(LIRKind.derive(inputVal).changeType(toRegisterKind)); - emitMove(var, emitConvert2Op(LIRKind.derive(inputVal).changeType(fromRegisterKind), conversionInstruction, input)); - return var; - } else { - throw GraalInternalError.shouldNotReachHere(); - } } @Override diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Sep 02 19:23:43 2014 -0700 @@ -54,6 +54,7 @@ import com.oracle.graal.lir.sparc.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.sparc.*; /** * HotSpot SPARC specific backend. @@ -113,8 +114,11 @@ if (SPARCAssembler.isSimm13(address.getDisplacement())) { new Stx(g0, address).emit(masm); } else { - new Setx(address.getDisplacement(), g3).emit(masm); - new Stx(g0, new SPARCAddress(sp, g3)).emit(masm); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + new Setx(address.getDisplacement(), scratch).emit(masm); + new Stx(g0, new SPARCAddress(sp, scratch)).emit(masm); + } } } } @@ -145,8 +149,11 @@ if (SPARCAssembler.isSimm13(stackpoinerChange)) { new Save(sp, stackpoinerChange, sp).emit(masm); } else { - new Setx(stackpoinerChange, g3).emit(masm); - new Save(sp, g3, sp).emit(masm); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + new Setx(stackpoinerChange, scratch).emit(masm); + new Save(sp, scratch, sp).emit(masm); + } } if (ZapStackOnMethodEntry.getValue()) { @@ -213,12 +220,15 @@ // We need to use JavaCall here because we haven't entered the frame yet. CallingConvention cc = regConfig.getCallingConvention(JavaCall, null, new JavaType[]{getProviders().getMetaAccess().lookupJavaType(Object.class)}, getTarget(), false); Register inlineCacheKlass = g5; // see MacroAssembler::ic_call - Register scratch = g3; - Register receiver = asRegister(cc.getArgument(0)); - SPARCAddress src = new SPARCAddress(receiver, config.hubOffset); - new Ldx(src, scratch).emit(masm); - new Cmp(scratch, inlineCacheKlass).emit(masm); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + Register receiver = asRegister(cc.getArgument(0)); + SPARCAddress src = new SPARCAddress(receiver, config.hubOffset); + + new Ldx(src, scratch).emit(masm); + new Cmp(scratch, inlineCacheKlass).emit(masm); + } new Bpne(CC.Xcc, unverifiedStub).emit(masm); new Nop().emit(masm); // delay slot } @@ -244,8 +254,10 @@ if (unverifiedStub != null) { masm.bind(unverifiedStub); - Register scratch = g3; - SPARCCall.indirectJmp(crb, masm, scratch, foreignCalls.lookupForeignCall(IC_MISS_HANDLER)); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + SPARCCall.indirectJmp(crb, masm, scratch, foreignCalls.lookupForeignCall(IC_MISS_HANDLER)); + } } } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotDeoptimizeCallerOp.java Tue Sep 02 19:23:43 2014 -0700 @@ -23,13 +23,13 @@ package com.oracle.graal.hotspot.sparc; import static com.oracle.graal.hotspot.HotSpotHostBackend.*; -import static com.oracle.graal.sparc.SPARC.*; import com.oracle.graal.api.code.*; import com.oracle.graal.asm.sparc.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.sparc.*; +import com.oracle.graal.sparc.*; /** * Removes the current frame and tail calls the uncommon trap routine. @@ -46,8 +46,11 @@ // final boolean isStub = true; // HotSpotFrameContext frameContext = backend.new HotSpotFrameContext(isStub); // frameContext.enter(crb); - Register scratch = g3; - SPARCCall.indirectJmp(crb, masm, scratch, crb.foreignCalls.lookupForeignCall(UNCOMMON_TRAP_HANDLER)); + + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + SPARCCall.indirectJmp(crb, masm, scratch, crb.foreignCalls.lookupForeignCall(UNCOMMON_TRAP_HANDLER)); + } // frameContext.leave(crb); } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveUnpackFramesStackFrameOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveUnpackFramesStackFrameOp.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLeaveUnpackFramesStackFrameOp.java Tue Sep 02 19:23:43 2014 -0700 @@ -64,6 +64,6 @@ new Stx(g0, new SPARCAddress(thread, threadLastJavaPcOffset)).emit(masm); new Stw(g0, new SPARCAddress(thread, threadJavaFrameAnchorFlagsOffset)).emit(masm); - new Movdtox(f31, i0).emit(masm); + new Movdtox(SPARCSaveRegistersOp.RETURN_REGISTER_STORAGE, i0).emit(masm); } } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Tue Sep 02 19:23:43 2014 -0700 @@ -110,7 +110,8 @@ protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { AllocatableValue metaspaceMethod = g5.asValue(); gen.emitMove(metaspaceMethod, operand(((HotSpotIndirectCallTargetNode) callTarget).metaspaceMethod())); - AllocatableValue targetAddress = g3.asValue(); + + AllocatableValue targetAddress = o7.asValue(); gen.emitMove(targetAddress, operand(callTarget.computedAddress())); append(new SPARCIndirectCallOp(callTarget.targetMethod(), result, parameters, temps, metaspaceMethod, targetAddress, callState)); } diff -r 66bf28082a14 -r 2110fe2b7284 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 Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Tue Sep 02 19:23:43 2014 -0700 @@ -26,6 +26,7 @@ import static com.oracle.graal.asm.sparc.SPARCAssembler.*; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.*; import com.oracle.graal.asm.sparc.*; @@ -67,7 +68,7 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { - emit(crb, masm, opcode, result, x, null); + emitUnary(crb, masm, opcode, result, x, null); } } @@ -85,7 +86,7 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { - emit(crb, masm, opcode, result, x, null); + emitUnary(crb, masm, opcode, result, x, null); } } @@ -423,8 +424,11 @@ break; case DAND: SPARCAddress addr = (SPARCAddress) crb.recordDataReferenceInCode(asConstant(src2), 4); - addr = SPARCMove.guaranueeLoadable(addr, masm); - new Lddf(addr, asDoubleReg(dst)).emit(masm); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + addr = SPARCMove.guaranueeLoadable(addr, masm, scratch); + new Lddf(addr, asDoubleReg(dst)).emit(masm); + } new Fandd(asDoubleReg(src1), asDoubleReg(dst), asDoubleReg(dst)).emit(masm); break; case FADD: @@ -685,7 +689,7 @@ } } - public static void emit(CompilationResultBuilder crb, SPARCAssembler masm, SPARCArithmetic opcode, Value dst, Value src, LIRFrameState info) { + public static void emitUnary(CompilationResultBuilder crb, SPARCAssembler masm, SPARCArithmetic opcode, Value dst, Value src, LIRFrameState info) { int exceptionOffset = -1; Label notOrdered = new Label(); if (isRegister(src)) { @@ -738,7 +742,7 @@ new Sra(asIntReg(dst), 16, asIntReg(dst)).emit(masm); break; case I2F: - if (src.getPlatformKind() == Kind.Int) { + if (src.getPlatformKind() == Kind.Int || src.getPlatformKind() == Kind.Char || src.getPlatformKind() == Kind.Short || src.getPlatformKind() == Kind.Byte) { new Movwtos(asIntReg(src), asFloatReg(dst)).emit(masm); new Fitos(asFloatReg(dst), asFloatReg(dst)).emit(masm); } else if (src.getPlatformKind() == Kind.Float) { @@ -752,15 +756,14 @@ break; case F2L: new Fcmp(CC.Fcc0, Opfs.Fcmps, asFloatReg(src), asFloatReg(src)).emit(masm); - new Fbo(false, notOrdered).emit(masm); - new Fstox(asFloatReg(src), asFloatReg(dst)).emit(masm); - new Fitos(asFloatReg(dst), asFloatReg(dst)).emit(masm); - new Fsubs(asFloatReg(dst), asFloatReg(dst), asFloatReg(dst)).emit(masm); + new Fbo(true, notOrdered).emit(masm); + new Fstox(asFloatReg(src), asDoubleReg(dst)).emit(masm); + new Fsubd(asDoubleReg(dst), asDoubleReg(dst), asDoubleReg(dst)).emit(masm); masm.bind(notOrdered); break; case F2I: new Fcmp(CC.Fcc0, Opfs.Fcmps, asFloatReg(src), asFloatReg(src)).emit(masm); - new Fbo(false, notOrdered).emit(masm); + new Fbo(true, notOrdered).emit(masm); new Fstoi(asFloatReg(src), asFloatReg(dst)).emit(masm); new Fitos(asFloatReg(dst), asFloatReg(dst)).emit(masm); new Fsubs(asFloatReg(dst), asFloatReg(dst), asFloatReg(dst)).emit(masm); @@ -788,10 +791,10 @@ break; case D2I: new Fcmp(CC.Fcc0, Opfs.Fcmpd, asDoubleReg(src), asDoubleReg(src)).emit(masm); - new Fbo(false, notOrdered).emit(masm); - new Fdtoi(asDoubleReg(src), asDoubleReg(dst)).emit(masm); - new Fitod(asDoubleReg(dst), asDoubleReg(dst)).emit(masm); - new Fsubd(asDoubleReg(dst), asDoubleReg(dst), asDoubleReg(dst)).emit(masm); + new Fbo(true, notOrdered).emit(masm); + new Fdtoi(asDoubleReg(src), asFloatReg(dst)).emit(masm); + new Fsubs(asFloatReg(dst), asFloatReg(dst), asFloatReg(dst)).emit(masm); + new Fstoi(asFloatReg(dst), asFloatReg(dst)).emit(masm); masm.bind(notOrdered); break; case FNEG: diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Tue Sep 02 19:23:43 2014 -0700 @@ -38,6 +38,7 @@ import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.SwitchStrategy.BaseSwitchClosure; import com.oracle.graal.lir.asm.*; +import com.oracle.graal.sparc.*; public class SPARCControlFlow { @@ -139,28 +140,44 @@ } private static void emitFloatCompare(SPARCMacroAssembler masm, Label target, Condition actualCondition, boolean branchOnUnordered) { - if (branchOnUnordered) { - // new Fbu(false, target).emit(masm); - // new Nop().emit(masm); - } switch (actualCondition) { case EQ: - new Fbe(false, target).emit(masm); + if (branchOnUnordered) { + new Fbue(false, target).emit(masm); + } else { + new Fbe(false, target).emit(masm); + } break; case NE: - new Fbne(false, target).emit(masm); + new Fbne(false, target).emit(masm); // Is also unordered break; case LT: - new Fbl(false, target).emit(masm); + if (branchOnUnordered) { + new Fbul(false, target).emit(masm); + } else { + new Fbl(false, target).emit(masm); + } break; case LE: - new Fble(false, target).emit(masm); + if (branchOnUnordered) { + new Fbule(false, target).emit(masm); + } else { + new Fble(false, target).emit(masm); + } break; case GT: - new Fbg(false, target).emit(masm); + if (branchOnUnordered) { + new Fbug(false, target).emit(masm); + } else { + new Fbg(false, target).emit(masm); + } break; case GE: - new Fbge(false, target).emit(masm); + if (branchOnUnordered) { + new Fbuge(false, target).emit(masm); + } else { + new Fbge(false, target).emit(masm); + } break; case AE: case AT: @@ -305,32 +322,38 @@ if (isSimm13(lowKey)) { new Sub(value, lowKey, scratchReg).emit(masm); } else { - new Setx(lowKey, g3).emit(masm); - new Sub(value, g3, scratchReg).emit(masm); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch2 = sc.getRegister(); + new Setx(lowKey, scratch2).emit(masm); + new Sub(value, scratch2, scratchReg).emit(masm); + } } int upperLimit = highKey - lowKey; - if (isSimm13(upperLimit)) { - new Cmp(scratchReg, upperLimit).emit(masm); - } else { - new Setx(upperLimit, g3).emit(masm); - new Cmp(scratchReg, upperLimit).emit(masm); - } + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch2 = sc.getRegister(); + if (isSimm13(upperLimit)) { + new Cmp(scratchReg, upperLimit).emit(masm); + } else { + new Setx(upperLimit, scratch2).emit(masm); + new Cmp(scratchReg, upperLimit).emit(masm); + } - // Jump to default target if index is not within the jump table - if (defaultTarget != null) { - new Bpgu(CC.Icc, defaultTarget.label()).emit(masm); - new Nop().emit(masm); // delay slot - } + // Jump to default target if index is not within the jump table + if (defaultTarget != null) { + new Bpgu(CC.Icc, defaultTarget.label()).emit(masm); + new Nop().emit(masm); // delay slot + } - // Load jump table entry into scratch and jump to it - new Sll(scratchReg, 3, scratchReg).emit(masm); // Multiply by 8 - // Zero the left bits sll with shcnt>0 does not mask upper 32 bits - new Srl(scratchReg, 0, scratchReg).emit(masm); - new Rdpc(g3).emit(masm); + // Load jump table entry into scratch and jump to it + new Sll(scratchReg, 3, scratchReg).emit(masm); // Multiply by 8 + // Zero the left bits sll with shcnt>0 does not mask upper 32 bits + new Srl(scratchReg, 0, scratchReg).emit(masm); + new Rdpc(scratch2).emit(masm); - // The jump table follows four instructions after rdpc - new Add(scratchReg, 4 * 4, scratchReg).emit(masm); - new Jmpl(g3, scratchReg, g0).emit(masm); + // The jump table follows four instructions after rdpc + new Add(scratchReg, 4 * 4, scratchReg).emit(masm); + new Jmpl(scratch2, scratchReg, g0).emit(masm); + } new Nop().emit(masm); // new Sra(value, 3, value).emit(masm); // delay slot, correct the value (division by 8) diff -r 66bf28082a14 -r 2110fe2b7284 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 Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Tue Sep 02 19:23:43 2014 -0700 @@ -38,6 +38,7 @@ import com.oracle.graal.lir.StandardOp.MoveOp; import com.oracle.graal.lir.StandardOp.NullCheck; import com.oracle.graal.lir.asm.*; +import com.oracle.graal.sparc.*; public class SPARCMove { @@ -137,36 +138,39 @@ @Override public void emitMemAccess(SPARCMacroAssembler masm) { - final SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm); - final Register dst = asRegister(result); - switch (kind) { - case Boolean: - case Byte: - new Ldsb(addr, dst).emit(masm); - break; - case Short: - new Ldsh(addr, dst).emit(masm); - break; - case Char: - new Lduh(addr, dst).emit(masm); - break; - case Int: - new Ldsw(addr, dst).emit(masm); - break; - case Long: - new Ldx(addr, dst).emit(masm); - break; - case Float: - new Ldf(addr, dst).emit(masm); - break; - case Double: - new Lddf(addr, dst).emit(masm); - break; - case Object: - new Ldx(addr, dst).emit(masm); - break; - default: - throw GraalInternalError.shouldNotReachHere(); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + final SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + final Register dst = asRegister(result); + switch (kind) { + case Boolean: + case Byte: + new Ldsb(addr, dst).emit(masm); + break; + case Short: + new Ldsh(addr, dst).emit(masm); + break; + case Char: + new Lduh(addr, dst).emit(masm); + break; + case Int: + new Ldsw(addr, dst).emit(masm); + break; + case Long: + new Ldx(addr, dst).emit(masm); + break; + case Float: + new Ldf(addr, dst).emit(masm); + break; + case Double: + new Lddf(addr, dst).emit(masm); + break; + case Object: + new Ldx(addr, dst).emit(masm); + break; + default: + throw GraalInternalError.shouldNotReachHere(); + } } } } @@ -311,33 +315,36 @@ @Override public void emitMemAccess(SPARCMacroAssembler masm) { assert isRegister(input); - SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm); - switch (kind) { - case Boolean: - case Byte: - new Stb(asRegister(input), addr).emit(masm); - break; - case Short: - case Char: - new Sth(asRegister(input), addr).emit(masm); - break; - case Int: - new Stw(asRegister(input), addr).emit(masm); - break; - case Long: - new Stx(asRegister(input), addr).emit(masm); - break; - case Object: - new Stx(asRegister(input), addr).emit(masm); - break; - case Float: - new Stf(asRegister(input), addr).emit(masm); - break; - case Double: - new Stdf(asRegister(input), addr).emit(masm); - break; - default: - throw GraalInternalError.shouldNotReachHere("missing: " + kind); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + switch (kind) { + case Boolean: + case Byte: + new Stb(asRegister(input), addr).emit(masm); + break; + case Short: + case Char: + new Sth(asRegister(input), addr).emit(masm); + break; + case Int: + new Stw(asRegister(input), addr).emit(masm); + break; + case Long: + new Stx(asRegister(input), addr).emit(masm); + break; + case Object: + new Stx(asRegister(input), addr).emit(masm); + break; + case Float: + new Stf(asRegister(input), addr).emit(masm); + break; + case Double: + new Stdf(asRegister(input), addr).emit(masm); + break; + default: + throw GraalInternalError.shouldNotReachHere("missing: " + kind); + } } } } @@ -356,28 +363,31 @@ @Override public void emitMemAccess(SPARCMacroAssembler masm) { - SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm); - switch (kind) { - case Boolean: - case Byte: - new Stb(g0, addr).emit(masm); - break; - case Short: - case Char: - new Sth(g0, addr).emit(masm); - break; - case Int: - new Stw(g0, addr).emit(masm); - break; - case Long: - case Object: - new Stx(g0, addr).emit(masm); - break; - case Float: - case Double: - throw GraalInternalError.shouldNotReachHere("Cannot store float constants to memory"); - default: - throw GraalInternalError.shouldNotReachHere(); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + switch (kind) { + case Boolean: + case Byte: + new Stb(g0, addr).emit(masm); + break; + case Short: + case Char: + new Sth(g0, addr).emit(masm); + break; + case Int: + new Stw(g0, addr).emit(masm); + break; + case Long: + case Object: + new Stx(g0, addr).emit(masm); + break; + case Float: + case Double: + throw GraalInternalError.shouldNotReachHere("Cannot store float constants to memory"); + default: + throw GraalInternalError.shouldNotReachHere(); + } } } } @@ -401,10 +411,16 @@ if (isRegister(result)) { const2reg(crb, masm, result, (Constant) input); } else if (isStackSlot(result)) { - // Move a Constant to a stack slot (Probably a 7th output parameter) - Value scratch = input.getKind() == Kind.Float || input.getKind() == Kind.Double ? f30.asValue(input.getLIRKind()) : g5.asValue(input.getLIRKind()); - const2reg(crb, masm, scratch, (Constant) input); - reg2stack(crb, masm, result, scratch); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + Constant constant = asConstant(input); + if (constant.isNull()) { + new Clr(scratch).emit(masm); + } else { + new Setx(constant.asLong(), scratch).emit(masm); + } + reg2stack(crb, masm, result, scratch.asValue(LIRKind.derive(input))); + } } else { throw GraalInternalError.shouldNotReachHere("Result is a: " + result); } @@ -473,10 +489,9 @@ * @param masm assembler to output the prior stx command * @return a loadable SPARCAddress */ - public static SPARCAddress guaranueeLoadable(SPARCAddress addr, SPARCMacroAssembler masm) { + public static SPARCAddress guaranueeLoadable(SPARCAddress addr, SPARCMacroAssembler masm, Register scratch) { boolean displacementOutOfBound = addr.getIndex().equals(Register.None) && !SPARCAssembler.isSimm13(addr.getDisplacement()); if (displacementOutOfBound) { - Register scratch = g3; new Setx(addr.getDisplacement(), scratch, false).emit(masm); return new SPARCAddress(addr.getBase(), scratch); } else { @@ -486,109 +501,117 @@ private static void reg2stack(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Value input) { SPARCAddress dst = (SPARCAddress) crb.asAddress(result); - dst = guaranueeLoadable(dst, masm); - Register src = asRegister(input); - switch (input.getKind()) { - case Byte: - case Boolean: - new Stb(src, dst).emit(masm); - break; - case Char: - case Short: - new Sth(src, dst).emit(masm); - break; - case Int: - new Stw(src, dst).emit(masm); - break; - case Long: - case Object: - new Stx(src, dst).emit(masm); - break; - case Float: - new Stf(src, dst).emit(masm); - break; - case Double: - new Stdf(src, dst).emit(masm); - break; - default: - throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind() + "(" + input + ")"); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + dst = guaranueeLoadable(dst, masm, scratch); + Register src = asRegister(input); + switch (input.getKind()) { + case Byte: + case Boolean: + new Stb(src, dst).emit(masm); + break; + case Char: + case Short: + new Sth(src, dst).emit(masm); + break; + case Int: + new Stw(src, dst).emit(masm); + break; + case Long: + case Object: + new Stx(src, dst).emit(masm); + break; + case Float: + new Stf(src, dst).emit(masm); + break; + case Double: + new Stdf(src, dst).emit(masm); + break; + default: + throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind() + "(" + input + ")"); + } } } private static void stack2reg(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Value input) { SPARCAddress src = (SPARCAddress) crb.asAddress(input); - src = guaranueeLoadable(src, masm); - Register dst = asRegister(result); - switch (input.getKind()) { - case Boolean: - case Byte: - new Ldsb(src, dst).emit(masm); - break; - case Short: - new Ldsh(src, dst).emit(masm); - break; - case Char: - new Lduh(src, dst).emit(masm); - break; - case Int: - new Ldsw(src, dst).emit(masm); - break; - case Long: - case Object: - new Ldx(src, dst).emit(masm); - break; - case Float: - new Ldf(src, dst).emit(masm); - break; - case Double: - new Lddf(src, dst).emit(masm); - break; - default: - throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind()); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + src = guaranueeLoadable(src, masm, scratch); + Register dst = asRegister(result); + switch (input.getKind()) { + case Boolean: + case Byte: + new Ldsb(src, dst).emit(masm); + break; + case Short: + new Ldsh(src, dst).emit(masm); + break; + case Char: + new Lduh(src, dst).emit(masm); + break; + case Int: + new Ldsw(src, dst).emit(masm); + break; + case Long: + case Object: + new Ldx(src, dst).emit(masm); + break; + case Float: + new Ldf(src, dst).emit(masm); + break; + case Double: + new Lddf(src, dst).emit(masm); + break; + default: + throw GraalInternalError.shouldNotReachHere("Input is a: " + input.getKind()); + } } } private static void const2reg(CompilationResultBuilder crb, SPARCMacroAssembler masm, Value result, Constant input) { - Register scratch = g5; - switch (input.getKind().getStackKind()) { - case Int: - new Setx(input.asLong(), asIntReg(result)).emit(masm); - break; - case Long: - new Setx(input.asLong(), asLongReg(result)).emit(masm); - break; - case Float: - // TODO: Handle it the same way, as in the double case with Movwtos - 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: - // instead loading this from memory and do the complicated lookup, - // just load it directly into a scratch register - // First load the address into the scratch register - new Setx(Double.doubleToLongBits(input.asDouble()), scratch, true).emit(masm); - // Now load the float value - new Movxtod(scratch, asDoubleReg(result)).emit(masm); - break; - case Object: - if (input.isNull()) { - new Clr(asRegister(result)).emit(masm); - } else if (crb.target.inlineObjects) { - crb.recordInlineDataInCode(input); - new Setx(0xDEADDEADDEADDEADL, asRegister(result), true).emit(masm); - } else { - Register dst = asRegister(result); - new Rdpc(dst).emit(masm); - crb.asObjectConstRef(input); - new Ldx(new SPARCAddress(dst, 0), dst).emit(masm); - throw GraalInternalError.shouldNotReachHere("the patched offset might be too big for the load"); - } - break; - default: - throw GraalInternalError.shouldNotReachHere("missing: " + input.getKind()); + try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { + Register scratch = sc.getRegister(); + switch (input.getKind().getStackKind()) { + case Int: + new Setx(input.asLong(), asIntReg(result)).emit(masm); + break; + case Long: + new Setx(input.asLong(), asLongReg(result)).emit(masm); + break; + case Float: + // TODO: Handle it the same way, as in the double case with Movwtos + 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: + // instead loading this from memory and do the complicated lookup, + // just load it directly into a scratch register + // First load the address into the scratch register + new Setx(Double.doubleToLongBits(input.asDouble()), scratch, true).emit(masm); + // Now load the float value + new Movxtod(scratch, asDoubleReg(result)).emit(masm); + break; + case Object: + if (input.isNull()) { + new Clr(asRegister(result)).emit(masm); + } else if (crb.target.inlineObjects) { + crb.recordInlineDataInCode(input); + new Setx(0xDEADDEADDEADDEADL, asRegister(result), true).emit(masm); + } else { + Register dst = asRegister(result); + new Rdpc(dst).emit(masm); + crb.asObjectConstRef(input); + new Ldx(new SPARCAddress(dst, 0), dst).emit(masm); + throw GraalInternalError.shouldNotReachHere("the patched offset might be too big for the load"); + } + break; + default: + throw GraalInternalError.shouldNotReachHere("missing: " + input.getKind()); + } } } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCSaveRegistersOp.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCSaveRegistersOp.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCSaveRegistersOp.java Tue Sep 02 19:23:43 2014 -0700 @@ -39,7 +39,7 @@ */ @Opcode("SAVE_REGISTER") public class SPARCSaveRegistersOp extends SPARCLIRInstruction implements SaveRegistersOp { - + public static Register RETURN_REGISTER_STORAGE = SPARC.d62; /** * The registers (potentially) saved by this operation. */ @@ -80,7 +80,7 @@ saveRegister(crb, masm, slots[i], savedRegisters[i]); } } - new Movxtod(SPARC.i0, SPARC.f31).emit(masm); + new Movxtod(SPARC.i0, RETURN_REGISTER_STORAGE).emit(masm); } public StackSlot[] getSlots() { diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/FixedNodeProbabilityCache.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/FixedNodeProbabilityCache.java Tue Sep 02 15:44:33 2014 -0700 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/FixedNodeProbabilityCache.java Tue Sep 02 19:23:43 2014 -0700 @@ -99,10 +99,15 @@ return cachedValue; } - double probability; + double probability = 0.0; if (current.predecessor() == null) { if (current instanceof MergeNode) { - probability = ((MergeNode) current).forwardEnds().stream().mapToDouble(this::applyAsDouble).sum(); + MergeNode currentMerge = (MergeNode) current; + NodeInputList currentForwardEnds = currentMerge.forwardEnds(); + // Using simple iteration instead of lambda as the lambda blows up the stack + for (AbstractEndNode endNode : currentForwardEnds) { + probability += applyAsDouble(endNode); + } if (current instanceof LoopBeginNode) { probability *= ((LoopBeginNode) current).loopFrequency(); } diff -r 66bf28082a14 -r 2110fe2b7284 graal/com.oracle.graal.sparc/src/com/oracle/graal/sparc/SPARCScratchRegister.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.sparc/src/com/oracle/graal/sparc/SPARCScratchRegister.java Tue Sep 02 19:23:43 2014 -0700 @@ -0,0 +1,57 @@ +package com.oracle.graal.sparc; + +import com.oracle.graal.api.code.*; + +public class SPARCScratchRegister implements AutoCloseable { + private final ThreadLocal locked = new ThreadLocal<>(); + private final ThreadLocal where = new ThreadLocal<>(); + private final Register register; + private static final SPARCScratchRegister scratch1 = new SPARCScratchRegister(SPARC.g3); + private static final SPARCScratchRegister scratch2 = new SPARCScratchRegister(SPARC.g1); + + private SPARCScratchRegister(Register register) { + super(); + this.register = register; + } + + public Register getRegister() { + if (locked.get() == null) { + locked.set(false); + } + boolean isLocked = locked.get(); + if (isLocked) { + where.get().printStackTrace(); + throw new RuntimeException("Temp Register is already taken!"); + } else { + where.set(new Exception()); + locked.set(true); + return register; + } + } + + public void close() { + boolean isLocked = locked.get(); + if (isLocked) { + locked.set(false); + } else { + throw new RuntimeException("Temp Register is not taken!"); + } + } + + public static SPARCScratchRegister get() { + if (scratch1.isLocked()) { + return scratch2; + } else { + return scratch1; + } + } + + public boolean isLocked() { + Boolean isLocked = locked.get(); + if (isLocked == null) { + return false; + } else { + return isLocked; + } + } +} diff -r 66bf28082a14 -r 2110fe2b7284 src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp --- a/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Tue Sep 02 15:44:33 2014 -0700 +++ b/src/cpu/sparc/vm/graalCodeInstaller_sparc.cpp Tue Sep 02 19:23:43 2014 -0700 @@ -25,6 +25,7 @@ #include "graal/graalRuntime.hpp" #include "graal/graalCompilerToVM.hpp" #include "graal/graalJavaAccess.hpp" +#include "vmreg_sparc.inline.hpp" jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) { if (inst->is_call() || inst->is_jump()) { @@ -146,3 +147,22 @@ break; } } + +// convert Graal register indices (as used in oop maps) to HotSpot registers +VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) { + if (graal_reg < RegisterImpl::number_of_registers) { + return as_Register(graal_reg)->as_VMReg(); + } else { + jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers; + floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed + if (floatRegisterNumber < FloatRegisterImpl::number_of_registers) { + return as_FloatRegister(floatRegisterNumber)->as_VMReg(); + } + ShouldNotReachHere(); + return NULL; + } +} + +bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) { + return !hotspotRegister->is_FloatRegister(); +} diff -r 66bf28082a14 -r 2110fe2b7284 src/cpu/x86/vm/graalCodeInstaller_x86.cpp --- a/src/cpu/x86/vm/graalCodeInstaller_x86.cpp Tue Sep 02 15:44:33 2014 -0700 +++ b/src/cpu/x86/vm/graalCodeInstaller_x86.cpp Tue Sep 02 19:23:43 2014 -0700 @@ -32,6 +32,7 @@ #include "asm/register.hpp" #include "classfile/vmSymbols.hpp" #include "code/vmreg.hpp" +#include "vmreg_x86.inline.hpp" jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method) { if (inst->is_call() || inst->is_jump()) { @@ -209,3 +210,21 @@ break; } } + +// convert Graal register indices (as used in oop maps) to HotSpot registers +VMReg CodeInstaller::get_hotspot_reg(jint graal_reg) { + if (graal_reg < RegisterImpl::number_of_registers) { + return as_Register(graal_reg)->as_VMReg(); + } else { + jint floatRegisterNumber = graal_reg - RegisterImpl::number_of_registers; + if (floatRegisterNumber < XMMRegisterImpl::number_of_registers) { + return as_XMMRegister(floatRegisterNumber)->as_VMReg(); + } + ShouldNotReachHere(); + return NULL; + } +} + +bool CodeInstaller::is_general_purpose_reg(VMReg hotspotRegister) { + return !(hotspotRegister->is_FloatRegister() || hotspotRegister->is_XMMRegister()); +} diff -r 66bf28082a14 -r 2110fe2b7284 src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Tue Sep 02 15:44:33 2014 -0700 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Tue Sep 02 19:23:43 2014 -0700 @@ -57,27 +57,6 @@ return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method)); } -// convert Graal register indices (as used in oop maps) to HotSpot registers -VMReg get_hotspot_reg(jint graal_reg) { - if (graal_reg < RegisterImpl::number_of_registers) { - return as_Register(graal_reg)->as_VMReg(); - } else { - int remainder = graal_reg - RegisterImpl::number_of_registers; -#ifdef TARGET_ARCH_x86 - if (remainder < XMMRegisterImpl::number_of_registers) { - return as_XMMRegister(remainder)->as_VMReg(); - } -#endif -#ifdef TARGET_ARCH_sparc - if (remainder < FloatRegisterImpl::number_of_registers) { - return as_FloatRegister(remainder)->as_VMReg(); - } -#endif - ShouldNotReachHere(); - return NULL; - } -} - const int MapWordBits = 64; static bool is_bit_set(oop bitset, int i) { @@ -155,7 +134,7 @@ for (jint i = 0; i < slots->length(); i++) { oop graal_reg = registers->obj_at(i); jint graal_reg_number = code_Register::number(graal_reg); - VMReg hotspot_reg = get_hotspot_reg(graal_reg_number); + VMReg hotspot_reg = CodeInstaller::get_hotspot_reg(graal_reg_number); // HotSpot stack slots are 4 bytes jint graal_slot = ((jint*) slots->base(T_INT))[i]; jint hotspot_slot = graal_slot * VMRegImpl::slots_per_word; @@ -227,10 +206,8 @@ if (value->is_a(RegisterValue::klass())) { oop reg = RegisterValue::reg(value); jint number = code_Register::number(reg); - jint encoding = code_Register::encoding(reg); - oop registerCategory = code_Register::registerCategory(reg); - jint referenceMapOffset = RegisterCategory::referenceMapOffset(registerCategory); - if (number < RegisterImpl::number_of_registers) { + VMReg hotspotRegister = get_hotspot_reg(number); + if (is_general_purpose_reg(hotspotRegister)) { Location::Type locationType; if (type == T_INT) { locationType = reference ? Location::narrowoop : Location::int_in_long; @@ -244,7 +221,7 @@ assert(type == T_OBJECT && reference, "unexpected type in cpu register"); locationType = Location::oop; } - ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_Register(number)->as_VMReg())); + ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister)); if (type == T_LONG && !reference) { second = value; } @@ -259,25 +236,11 @@ locationType = Location::dbl; } assert(!reference, "unexpected type in floating point register"); - jint floatRegisterNumber = number - referenceMapOffset; -#ifdef TARGET_ARCH_x86 - ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_XMMRegister(floatRegisterNumber)->as_VMReg())); + ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister)); if (type == T_DOUBLE) { second = value; } return value; -#else -#ifdef TARGET_ARCH_sparc - floatRegisterNumber += MAX2(0, floatRegisterNumber-32); // Beginning with f32, only every second register is going to be addressed - ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, as_FloatRegister(floatRegisterNumber)->as_VMReg())); - if (type == T_DOUBLE) { - second = value; - } - return value; -#else - ShouldNotReachHere("Platform currently does not support floating point values."); -#endif -#endif } } else if (value->is_a(StackSlot::klass())) { Location::Type locationType; diff -r 66bf28082a14 -r 2110fe2b7284 src/share/vm/graal/graalCodeInstaller.hpp --- a/src/share/vm/graal/graalCodeInstaller.hpp Tue Sep 02 15:44:33 2014 -0700 +++ b/src/share/vm/graal/graalCodeInstaller.hpp Tue Sep 02 19:23:43 2014 -0700 @@ -86,12 +86,15 @@ void pd_relocate_JavaMethod(oop method, jint pc_offset); void pd_relocate_poll(address pc, jint mark); + public: CodeInstaller() {}; GraalEnv::CodeInstallResult install(Handle& compiled_code, CodeBlob*& cb, Handle installed_code, Handle speculation_log); static address runtime_call_target_address(oop runtime_call); + static VMReg get_hotspot_reg(jint graalRegisterNumber); + static bool is_general_purpose_reg(VMReg hotspotRegister); protected: @@ -131,4 +134,6 @@ */ Method* getMethodFromHotSpotMethod(oop hotspot_method); + + #endif // SHARE_VM_GRAAL_GRAAL_CODE_INSTALLER_HPP diff -r 66bf28082a14 -r 2110fe2b7284 test/blacklist_sparc.txt --- a/test/blacklist_sparc.txt Tue Sep 02 15:44:33 2014 -0700 +++ b/test/blacklist_sparc.txt Tue Sep 02 19:23:43 2014 -0700 @@ -1,310 +1,5 @@ -com.oracle.graal.jtt.lang.Object_equals01 -com.oracle.graal.replacements.test.CheckCastTest -com.oracle.graal.hotspot.test.AheadOfTimeCompilationTest -com.oracle.graal.jtt.reflect.Invoke_except01 -com.oracle.graal.jtt.bytecode.BC_fastore -com.oracle.graal.compiler.test.deopt.MonitorDeoptTest -com.oracle.graal.jtt.loop.LoopParseLong -com.oracle.graal.jtt.bytecode.BC_baload -com.oracle.graal.jtt.threads.ThreadLocal01 -com.oracle.graal.jtt.jdk.UnsafeAllocateInstance01 -com.oracle.graal.jtt.threads.ThreadLocal02 -com.oracle.graal.jtt.optimize.ConditionalElimination01 -com.oracle.graal.jtt.threads.ThreadLocal03 -com.oracle.graal.jtt.except.BC_athrow3 -com.oracle.graal.jtt.except.BC_checkcast -com.oracle.graal.jtt.micro.VarArgs_short01 -com.oracle.graal.replacements.test.InvokeTest -com.oracle.graal.jtt.reflect.Invoke_virtual01 -com.oracle.graal.jtt.lang.Math_cos -com.oracle.graal.jtt.lang.Math_log10 -com.oracle.graal.jtt.optimize.Narrow_char02 -com.oracle.graal.jtt.lang.Math_sin -com.oracle.graal.jtt.bytecode.BC_lookupswitch05 -com.oracle.graal.jtt.except.BC_aastore0 -com.oracle.graal.jtt.reflect.Class_getDeclaredField01 -com.oracle.graal.jtt.micro.VarArgs_double01 -com.oracle.graal.jtt.micro.String_format02 -com.oracle.graal.compiler.hsail.test.lambda.ArrayListSetTest -com.oracle.graal.jtt.optimize.List_reorder_bug -com.oracle.graal.jtt.hotpath.HP_idea -com.oracle.graal.jtt.except.Throw_Synchronized01 -com.oracle.graal.jtt.lang.Bridge_method01 -com.oracle.graal.compiler.test.IfReorderTest -com.oracle.graal.jtt.optimize.Switch02 -com.oracle.graal.jtt.jdk.Thread_setName -com.oracle.graal.jtt.reflect.Array_set01 -com.oracle.graal.jtt.reflect.Array_set02 -com.oracle.graal.jtt.except.BC_checkcast5 -com.oracle.graal.jtt.micro.VarArgs_float01 -com.oracle.graal.jtt.bytecode.BC_monitorenter -com.oracle.graal.jtt.hotpath.HP_array04 -com.oracle.graal.compiler.hsail.test.lambda.StringSubstringTest -com.oracle.graal.jtt.hotpath.HP_array03 -com.oracle.graal.jtt.hotpath.HP_array02 -com.oracle.graal.jtt.threads.Thread_isInterrupted03 -com.oracle.graal.jtt.threads.Thread_isInterrupted02 -com.oracle.graal.jtt.threads.Thread_isInterrupted05 -com.oracle.graal.jtt.lang.ClassLoader_loadClass01 -com.oracle.graal.jtt.optimize.NCE_02 -com.oracle.graal.jtt.lang.Object_hashCode01 -com.oracle.graal.jtt.loop.Loop09 -com.oracle.graal.compiler.hsail.test.lambda.DremTest com.oracle.graal.replacements.test.StandardMethodSubstitutionsTest -com.oracle.graal.jtt.jdk.UnsafeAccess01 -com.oracle.graal.jtt.loop.LoopSwitch01 -com.oracle.graal.jtt.except.Catch_NASE_2 -com.oracle.graal.jtt.threads.Thread_setPriority01 -com.oracle.graal.jtt.except.BC_checkcast3 -com.oracle.graal.jtt.reflect.Invoke_main03 -com.oracle.graal.jtt.except.BC_aastore1 -com.oracle.graal.jtt.except.BC_saload -com.oracle.graal.jtt.threads.Monitor_contended01 -com.oracle.graal.jtt.lang.Class_getName02 -com.oracle.graal.jtt.reflect.Invoke_main01 -com.oracle.graal.jtt.lang.Math_sqrt -com.oracle.graal.jtt.bytecode.BC_ldc_06 -com.oracle.graal.jtt.optimize.ConditionalElimination02 -com.oracle.graal.jtt.lang.String_intern02 -com.oracle.truffle.sl.test.SLSimpleTestSuite -com.oracle.graal.jtt.micro.Bubblesort -com.oracle.graal.jtt.lang.String_intern03 -com.oracle.graal.jtt.hotpath.HP_demo01 -com.oracle.graal.jtt.optimize.ArrayLength01 -com.oracle.graal.replacements.test.DynamicNewArrayTest -com.oracle.graal.jtt.micro.InvokeVirtual_02 -com.oracle.graal.jtt.lang.Object_getClass01 -com.oracle.graal.jtt.micro.Matrix01 -com.oracle.graal.replacements.test.NewInstanceTest -com.oracle.graal.jtt.lang.Class_getSimpleName01 -com.oracle.graal.jtt.lang.Class_getSimpleName02 -com.oracle.graal.jtt.bytecode.BC_d2l02 -com.oracle.graal.jtt.except.BC_checkcast6 -com.oracle.graal.jtt.lang.Class_getSuperClass01 -com.oracle.graal.jtt.lang.Class_getInterfaces01 -com.oracle.graal.jtt.lang.Class_Literal01 com.oracle.graal.replacements.test.StringSubstitutionsTest -com.oracle.graal.jtt.except.BC_checkcast4 -com.oracle.graal.jtt.bytecode.BC_f2l02 -com.oracle.graal.jtt.micro.VarArgs_long01 -com.oracle.graal.compiler.test.ea.UnsafeEATest -com.oracle.graal.jtt.except.Catch_NASE_1 -com.oracle.graal.jtt.bytecode.BC_iastore -com.oracle.graal.compiler.test.ShortCircuitNodeTest -com.oracle.graal.jtt.threads.Thread_isInterrupted04 -com.oracle.graal.jtt.jdk.EnumMap02 -com.oracle.graal.jtt.threads.Monitor_notowner01 -com.oracle.graal.hotspot.test.ArrayCopyIntrinsificationTest -com.oracle.graal.jtt.bytecode.BC_putfield_01 -com.oracle.graal.jtt.lang.Math_tan -com.oracle.graal.jtt.bytecode.BC_aaload -com.oracle.graal.jtt.optimize.Narrow_short03 -com.oracle.graal.jtt.optimize.Narrow_short02 -com.oracle.graal.jtt.optimize.ArrayCopy01 -com.oracle.graal.jtt.bytecode.BC_athrow -com.oracle.graal.jtt.except.BC_sastore -com.oracle.graal.jtt.bytecode.BC_d2i02 -com.oracle.graal.jtt.threads.Object_wait01 -com.oracle.graal.jtt.bytecode.BC_sastore -com.oracle.graal.jtt.bytecode.BC_l2i_2 -com.oracle.graal.jtt.micro.BigObjectParams02 -com.oracle.graal.jtt.except.StackTrace_NPE_01 -com.oracle.graal.compiler.test.CommonedConstantsTest -com.oracle.graal.jtt.bytecode.BC_getfield -com.oracle.graal.jtt.bytecode.BC_laload -com.oracle.graal.hotspot.test.WriteBarrierAdditionTest -com.oracle.graal.jtt.hotpath.HP_life -com.oracle.graal.hotspot.test.CRC32SubstitutionsTest -com.oracle.graal.jtt.lang.Boxed_TYPE_01 -com.oracle.graal.jtt.reflect.Class_getDeclaredMethod01 -com.oracle.graal.jtt.threads.Thread_new02 -com.oracle.graal.jtt.threads.Thread_new01 -com.oracle.graal.jtt.except.BC_caload -com.oracle.graal.compiler.hsail.test.StaticMethod16InArraysTest -com.oracle.graal.jtt.jdk.Unsafe_compareAndSwap -com.oracle.graal.replacements.test.MonitorTest -com.oracle.graal.jtt.except.Throw_Synchronized05 -com.oracle.graal.jtt.reflect.Array_newInstance02 -com.oracle.graal.jtt.reflect.Array_newInstance03 -com.oracle.graal.jtt.reflect.Array_newInstance01 -com.oracle.graal.jtt.reflect.Array_newInstance06 -com.oracle.graal.jtt.micro.VarArgs_byte01 -com.oracle.graal.jtt.except.BC_laload -com.oracle.graal.compiler.test.ea.EscapeAnalysisTest -com.oracle.graal.jtt.except.Throw_Synchronized02 -com.oracle.graal.jtt.except.Throw_Synchronized04 -com.oracle.graal.jtt.optimize.NestedLoop_EA -com.oracle.graal.jtt.except.BC_newarray -com.oracle.graal.jtt.loop.Loop15 -com.oracle.graal.compiler.hsail.test.lambda.ObjectArrayInstanceDerivedTest -com.oracle.graal.jtt.bytecode.BC_checkcast01 -com.oracle.graal.jtt.except.BC_anewarray com.oracle.graal.hotspot.amd64.test.CompressedNullCheckTest -com.oracle.graal.compiler.test.MemoryArithmeticTest -com.oracle.graal.jtt.bytecode.BC_getfield_o -com.oracle.graal.jtt.lang.Class_getComponentType01 -com.oracle.graal.jtt.reflect.Array_newInstance04 -com.oracle.graal.jtt.reflect.Method_getParameterTypes01 -com.oracle.graal.compiler.test.inlining.InliningTest -com.oracle.graal.hotspot.test.InstalledCodeExecuteHelperTest -com.oracle.graal.jtt.except.BC_castore -com.oracle.graal.jtt.lang.Class_isInstance06 -com.oracle.graal.jtt.lang.Class_isInstance07 -com.oracle.graal.jtt.threads.Thread_join03 -com.oracle.graal.jtt.threads.Thread_join01 -com.oracle.graal.jtt.except.BC_putfield -com.oracle.graal.jtt.lang.Class_forName03 -com.oracle.graal.jtt.lang.Class_forName04 -com.oracle.graal.jtt.lang.Class_forName05 -com.oracle.graal.jtt.hotspot.Test6186134 -com.oracle.graal.jtt.optimize.NCE_03 -com.oracle.graal.jtt.micro.String_format01 -com.oracle.graal.jtt.except.BC_lastore -com.oracle.graal.jtt.bytecode.BC_monitorenter02 -com.oracle.graal.jtt.micro.ReferenceMap01 -com.oracle.graal.jtt.bytecode.BC_instanceof -com.oracle.graal.jtt.except.Catch_Unresolved -com.oracle.graal.compiler.test.MemoryScheduleTest -com.oracle.graal.jtt.bytecode.BC_castore -com.oracle.graal.jtt.except.Throw_InCatch03 -com.oracle.graal.jtt.except.Throw_InCatch02 -com.oracle.graal.jtt.except.Throw_InCatch01 -com.oracle.graal.jtt.except.BC_iaload -com.oracle.graal.jtt.lang.Double_toString -com.oracle.graal.jtt.optimize.ABCE_02 -com.oracle.graal.replacements.test.CompiledExceptionHandlerTest -com.oracle.graal.jtt.except.Throw_Synchronized03 -com.oracle.graal.jtt.threads.Thread_join02 -com.oracle.graal.jtt.threads.SynchronizedLoopExit01 -com.oracle.graal.jtt.bytecode.BC_daload -com.oracle.graal.jtt.optimize.Conditional01 -com.oracle.graal.jtt.lang.JDK_ClassLoaders02 -com.oracle.graal.jtt.bytecode.BC_putfield_03 -com.oracle.graal.jtt.bytecode.BC_putfield_02 -com.oracle.graal.jtt.micro.BigInterfaceParams01 -com.oracle.graal.jtt.micro.VarArgs_String01 -com.oracle.graal.jtt.optimize.LongToSomethingArray01 -com.oracle.graal.jtt.except.BC_checkcast1 -com.oracle.graal.jtt.except.Catch_NPE_07 -com.oracle.graal.jtt.except.Catch_NPE_06 -com.oracle.graal.jtt.except.Catch_NPE_02 -com.oracle.graal.jtt.except.Catch_NPE_01 com.oracle.graal.replacements.test.ArraysSubstitutionsTest -com.oracle.graal.jtt.except.StackTrace_CCE_00 -com.oracle.graal.jtt.lang.ProcessEnvironment_init -com.oracle.graal.jtt.except.BC_bastore -com.oracle.graal.jtt.except.BC_baload -com.oracle.graal.jtt.lang.Class_asSubclass01 -com.oracle.graal.jtt.bytecode.BC_invokevirtual -com.oracle.graal.compiler.test.BoxingEliminationTest -com.oracle.graal.compiler.test.deopt.CompiledMethodTest -com.oracle.graal.compiler.ptx.test.ArrayPTXTest -com.oracle.graal.jtt.reflect.Class_getMethod01 -com.oracle.graal.compiler.test.InfopointReasonTest -com.oracle.graal.jtt.reflect.Class_getMethod02 -com.oracle.graal.jtt.bytecode.BC_invokespecial2 -com.oracle.graal.jtt.reflect.Method_getReturnType01 -com.oracle.graal.replacements.test.InstanceOfTest -com.oracle.graal.jtt.bytecode.BC_invokespecial -com.oracle.graal.jtt.lang.Object_toString02 -com.oracle.graal.jtt.lang.Object_toString01 -com.oracle.graal.jtt.jdk.EnumMap01 -com.oracle.graal.jtt.except.BC_checkcast2 -com.oracle.graal.replacements.test.InstanceOfDynamicTest -com.oracle.graal.hotspot.test.HotSpotNodeSubstitutionsTest -com.oracle.graal.replacements.test.UnsignedMathTest -com.oracle.graal.jtt.reflect.Field_get03 -com.oracle.graal.jtt.bytecode.BC_putfield_04 -com.oracle.graal.hotspot.test.CompressedOopTest -com.oracle.graal.jtt.except.BC_daload -com.oracle.graal.hotspot.amd64.test.AMD64HotSpotFrameOmissionTest -com.oracle.graal.jtt.hotpath.HP_allocate04 -com.oracle.graal.jtt.hotpath.HP_allocate03 -com.oracle.graal.jtt.optimize.NCE_01 -com.oracle.graal.jtt.optimize.NCE_04 -com.oracle.graal.jtt.lang.Class_getName01 -com.oracle.graal.hotspot.test.HotSpotMonitorValueTest -com.oracle.graal.jtt.threads.Thread_getState02 -com.oracle.graal.jtt.except.BC_arraylength -com.oracle.graal.jtt.bytecode.BC_caload -com.oracle.graal.replacements.test.UnsafeSubstitutionsTest -com.oracle.graal.jtt.bytecode.BC_saload -com.oracle.graal.hotspot.test.HotSpotNmethodTest -com.oracle.graal.replacements.test.DeoptimizeOnExceptionTest -com.oracle.graal.jtt.optimize.ArrayCopyGeneric -com.oracle.graal.jtt.lang.Class_forName01 -com.oracle.graal.jtt.except.BC_monitorenter -com.oracle.graal.jtt.except.Catch_Loop02 -com.oracle.graal.jtt.bytecode.BC_lastore -com.oracle.graal.jtt.except.BC_getfield -com.oracle.graal.jtt.except.BC_aaload1 -com.oracle.graal.jtt.except.BC_aaload0 -com.oracle.graal.jtt.except.BC_dastore -com.oracle.graal.jtt.micro.VarArgs_char01 -com.oracle.graal.jtt.optimize.NCE_FlowSensitive05 -com.oracle.graal.jtt.optimize.NCE_FlowSensitive03 -com.oracle.graal.jtt.bytecode.BC_aaload_1 -com.oracle.graal.jtt.lang.Math_abs -com.oracle.graal.hotspot.test.CompileTheWorldTest -com.oracle.graal.jtt.micro.FloatingReads -com.oracle.graal.jtt.except.BC_fastore -com.oracle.graal.jtt.optimize.ArrayCopy05 -com.oracle.graal.jtt.bytecode.BC_aastore -com.oracle.graal.compiler.test.LockEliminationTest -com.oracle.graal.jtt.hotpath.HP_invoke01 -com.oracle.graal.jtt.bytecode.BC_dastore -com.oracle.graal.jtt.loop.DegeneratedLoop -com.oracle.graal.jtt.hotpath.HP_array01 -com.oracle.graal.jtt.except.BC_iastore -com.oracle.graal.jtt.except.BC_athrow2 -com.oracle.graal.jtt.except.BC_athrow0 -com.oracle.graal.jtt.except.BC_athrow1 -com.oracle.graal.jtt.micro.VarArgs_int01 -com.oracle.graal.jtt.micro.BigVirtualParams01 -com.oracle.graal.jtt.jdk.Class_getName -com.oracle.graal.jtt.reflect.Array_newInstance05 -com.oracle.graal.jtt.optimize.ABCE_01 -com.oracle.graal.jtt.micro.InvokeVirtual_01 -com.oracle.graal.jtt.except.StackTrace_AIOOBE_00 -com.oracle.graal.jtt.bytecode.BC_invokeinterface -com.oracle.graal.jtt.micro.BigMixedParams04 -com.oracle.graal.jtt.reflect.Invoke_main02 -com.oracle.graal.jtt.threads.Object_wait02 -com.oracle.graal.jtt.threads.Object_wait03 -com.oracle.graal.jtt.threads.Object_wait04 -com.oracle.graal.jtt.except.Catch_Unresolved02 -com.oracle.graal.jtt.except.Catch_Unresolved03 com.oracle.graal.compiler.test.CheckGraalInvariants -com.oracle.graal.jtt.except.Catch_Unresolved01 -com.oracle.graal.jtt.optimize.Narrow_byte03 -com.oracle.graal.jtt.except.BC_faload -com.oracle.graal.nodes.test.LoopPhiCanonicalizerTest -com.oracle.graal.jtt.bytecode.BC_f2i02 -com.oracle.graal.jtt.bytecode.BC_iaload -com.oracle.graal.jtt.reflect.Array_set03 -com.oracle.graal.jtt.lang.Class_forName02 -com.oracle.graal.compiler.hsail.test.lambda.ObjectArrayInstanceTest -com.oracle.graal.jtt.micro.VarArgs_boolean01 -com.oracle.graal.jtt.lang.Math_log -com.oracle.graal.compiler.test.FlowSensitiveReductionTest -com.oracle.graal.jtt.bytecode.BC_faload -com.oracle.graal.jtt.bytecode.BC_multianewarray03 -com.oracle.graal.jtt.loop.Loop06 -com.oracle.graal.jtt.loop.Loop07 -com.oracle.graal.jtt.loop.Loop13 -com.oracle.graal.jtt.bytecode.BC_bastore -com.oracle.graal.jtt.except.Catch_Two02 -com.oracle.graal.jtt.except.Catch_Two03 -com.oracle.graal.jtt.except.Catch_Two01 -com.oracle.graal.jtt.optimize.Narrow_byte02 -com.oracle.graal.jtt.loop.Loop05 -com.oracle.graal.jtt.loop.Loop12 -com.oracle.graal.jtt.jdk.System_setOut -com.oracle.graal.jtt.except.Catch_Loop03 -com.oracle.graal.jtt.micro.BC_invokevirtual2 -com.oracle.graal.jtt.optimize.Narrow_char03 -com.oracle.graal.jtt.optimize.ArrayCopy02 -com.oracle.graal.jtt.optimize.ArrayCopy04 -com.oracle.graal.jtt.optimize.ArrayCopy06 -com.oracle.graal.replacements.test.NewArrayTest -com.oracle.graal.jtt.optimize.ArrayCopy03