You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/05/15 14:19:56 UTC

svn commit: r538149 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H1852/ src/test/regression/H1852/DivIntTest.java src/test/regression/H1852/run.test.xml vm/jitrino/src/jet/cg_ia32.cpp

Author: varlax
Date: Tue May 15 05:19:55 2007
New Revision: 538149

URL: http://svn.apache.org/viewvc?view=rev&rev=538149
Log:
Fixed HARMONY-1852 [drlvm][jit] irem and idiv return incorrect values when arguments are min value and -1 (Jitrino JET only)

Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H1852/
    harmony/enhanced/drlvm/trunk/src/test/regression/H1852/DivIntTest.java
    harmony/enhanced/drlvm/trunk/src/test/regression/H1852/run.test.xml
Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_ia32.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1852/DivIntTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1852/DivIntTest.java?view=auto&rev=538149
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1852/DivIntTest.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1852/DivIntTest.java Tue May 15 05:19:55 2007
@@ -0,0 +1,22 @@
+package org.apache.harmony.drlvm.tests.regression.h1852;
+
+import junit.framework.TestCase;
+
+public class DivIntTest extends TestCase {
+
+    public void testIDIV() {
+        int i_min = Integer.MIN_VALUE;
+        int i_1 = -1;
+        int res = i_min / i_1;
+
+        assertEquals(Integer.MIN_VALUE, res);
+    }
+
+    public void testIREM() {
+        int i_min = Integer.MIN_VALUE;
+        int i_1 = -1;
+        int res = i_min % i_1;
+
+        assertEquals(0, res);
+    }
+}

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1852/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1852/run.test.xml?view=auto&rev=538149
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1852/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1852/run.test.xml Tue May 15 05:19:55 2007
@@ -0,0 +1,9 @@
+<project name="RUN HARMONY-1852 Regression Test">
+    <target name="run-test">
+        <run-junit-test 
+             test="org.apache.harmony.drlvm.tests.regression.h1852.DivIntTest"
+             vmarg="-Xem:jet">
+        </run-junit-test>
+    </target>
+</project>
+

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_ia32.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_ia32.cpp?view=diff&rev=538149&r1=538148&r2=538149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_ia32.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_ia32.cpp Tue May 15 05:19:55 2007
@@ -37,6 +37,10 @@
 namespace Jitrino {
 namespace Jet {
 
+/**
+ * Provides fine-tuned implementation for IDIV/IREM operations on IA32-compatible platforms, 
+ * in replacement of common arithmetic helper (see arith_rt.h).
+ */
 bool CodeGen::gen_a_platf(JavaByteCodes op, jtype jt)
 {
     if (jt != i32) return false;
@@ -58,18 +62,16 @@
     alu(alu_cmp, v2.as_opnd(), Opnd(-1));
     unsigned br_normal = br(ne, 0, 0);
     alu(alu_cmp, v1.as_opnd(), Opnd(INT_MIN));
-    unsigned br_cont = NOTHING, br_exit = NOTHING;
+    unsigned br_exit = NOTHING;
     if (op == OPCODE_IREM) {
-        br_cont = br(ne, 0, 0);
-        br_exit = br(cond_none, 0, 0);
+        do_mov(edx, Opnd(0)); // prepare exit value for the corner case
+        br_exit = br(eq, 0, 0);
     }
     else {
+        do_mov(eax, v1);
         br_exit = br(eq, 0, 0);
     }
     patch(br_normal, ip());
-    if (br_cont != NOTHING) {
-        patch(br_cont, ip());
-    }
     do_mov(eax, v1);
     //
     // The method is supposed to be platform-depended, and may not have 
@@ -84,9 +86,8 @@
     EncoderBase::Operands args(RegName_EDX, RegName_EAX, 
                                devirt(v2.reg(), i32));
     ip(EncoderBase::encode(ip(), Mnemonic_IDIV, args));
-    if (br_exit != NOTHING) {
-        patch(br_exit, ip());
-    }
+    patch(br_exit, ip());
+
     vpop();
     vpop();
     vpush(op == OPCODE_IREM ? edx : eax);