# HG changeset patch # User Stefan Anzinger # Date 1409966891 25200 # Node ID 62505bdc6960af4895838f66f478eb728706509c # Parent 4f8c81b1d1cbf53155ef765315dcdf3dc2450cf5 [SPARC] fixing irem diff -r 4f8c81b1d1cb -r 62505bdc6960 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 20:50:40 2014 -0700 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Sep 05 18:28:11 2014 -0700 @@ -653,10 +653,10 @@ Variable q = null; switch (a.getKind().getStackKind()) { case Int: - append(new RemOp(IREM, result, a, loadNonConst(b), state, this)); + append(new RemOp(IREM, result, load(a), loadNonConst(b), state, this)); break; case Long: - append(new RemOp(LREM, result, a, loadNonConst(b), state, this)); + append(new RemOp(LREM, result, load(a), loadNonConst(b), state, this)); break; case Float: q = newVariable(LIRKind.value(Kind.Float)); diff -r 4f8c81b1d1cb -r 62505bdc6960 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_irem.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_irem.java Tue Sep 02 20:50:40 2014 -0700 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_irem.java Fri Sep 05 18:28:11 2014 -0700 @@ -44,6 +44,13 @@ return a % 13; } + // Tests if the zero extension works fine with 64 bit registers behind + public static long test4(int a, int b) { + int ra = Math.abs(a % b); + int rb = Math.abs(a) % b; + return ra << 32 | rb; + } + @Test public void run0() throws Throwable { runTest("test", 1, 2); @@ -93,4 +100,19 @@ public void run32() throws Throwable { runTest("test3", -200000000); } + + @Test + public void run41() throws Throwable { + runTest("test4", -100000, 3000000); + } + + @Test + public void run42() throws Throwable { + runTest("test4", -100000, 30); + } + + @Test + public void run43() throws Throwable { + runTest("test4", -1000000, -30); + } } diff -r 4f8c81b1d1cb -r 62505bdc6960 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 20:50:40 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Fri Sep 05 18:28:11 2014 -0700 @@ -595,10 +595,11 @@ assert !src2.equals(scratch1); // But src2 can be scratch2 assert isSimm13(crb.asIntConst(src2)); + new Sra(asIntReg(src1), 0, asIntReg(dst)).emit(masm); exceptionOffset = masm.position(); - new Sdivx(asIntReg(src1), crb.asIntConst(src2), asIntReg(scratch1)).emit(masm); + new Sdivx(asIntReg(dst), crb.asIntConst(src2), asIntReg(scratch1)).emit(masm); new Mulx(asIntReg(scratch1), crb.asIntConst(src2), asIntReg(scratch2)).emit(masm); - new Sub(asIntReg(src1), asIntReg(scratch2), asIntReg(dst)).emit(masm); + new Sub(asIntReg(dst), asIntReg(scratch2), asIntReg(dst)).emit(masm); break; case IUREM: GraalInternalError.unimplemented(); @@ -663,10 +664,12 @@ } assert !asIntReg(srcLeft).equals(asIntReg(scratch1)); assert !asIntReg(src2).equals(asIntReg(scratch1)); + new Sra(asIntReg(src1), 0, asIntReg(scratch1)).emit(masm); + new Sra(asIntReg(src2), 0, asIntReg(scratch2)).emit(masm); exceptionOffset = masm.position(); - new Sdivx(asIntReg(srcLeft), asIntReg(src2), asIntReg(scratch1)).emit(masm); - new Mulx(asIntReg(scratch1), asIntReg(src2), asIntReg(scratch1)).emit(masm); - new Sub(asIntReg(srcLeft), asIntReg(scratch1), asIntReg(dst)).emit(masm); + new Sdivx(asIntReg(scratch1), asIntReg(scratch2), asIntReg(dst)).emit(masm); + new Mulx(asIntReg(dst), asIntReg(scratch2), asIntReg(dst)).emit(masm); + new Sub(asIntReg(scratch1), asIntReg(dst), asIntReg(dst)).emit(masm); break; case IUREM: assert !asIntReg(dst).equals(asIntReg(scratch1));