changeset 17081:62505bdc6960

[SPARC] fixing irem
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Fri, 05 Sep 2014 18:28:11 -0700
parents 4f8c81b1d1cb
children f8586d059f9d
files graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_irem.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java
diffstat 3 files changed, 32 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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));
--- 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);
+    }
 }
--- 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));