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:21:53 UTC
svn commit: r538151 - in /harmony/enhanced/drlvm/trunk:
src/test/regression/H1861/ src/test/regression/H1861/Test.java
src/test/regression/H1861/run.test.xml vm/jitrino/src/jet/cg_regs.cpp
Author: varlax
Date: Tue May 15 05:21:52 2007
New Revision: 538151
URL: http://svn.apache.org/viewvc?view=rev&rev=538151
Log:
Fixed HARMONY-1861 [drlvm][jit] Double arithmetic instructions work incorrectly (Jitrino JET)
Added:
harmony/enhanced/drlvm/trunk/src/test/regression/H1861/
harmony/enhanced/drlvm/trunk/src/test/regression/H1861/Test.java
harmony/enhanced/drlvm/trunk/src/test/regression/H1861/run.test.xml
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_regs.cpp
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1861/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1861/Test.java?view=auto&rev=538151
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1861/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1861/Test.java Tue May 15 05:21:52 2007
@@ -0,0 +1,30 @@
+package org.apache.harmony.drlvm.tests.regression.h1861;
+
+import junit.framework.TestCase;
+
+public class Test extends TestCase {
+ public static long [] arr = new long [] {6, 25, 50};
+ public static Test t = new Test();
+ public double d = 30d;
+
+
+ public void test() {
+ double d1 = t.d / arr[0];
+ assertEquals(5.0d, d1, 0);
+
+ d1 = t.d % arr[1];
+ assertEquals(5.0d, d1, 0);
+
+ d1= t.d - arr[1];
+ assertEquals(5.0d, d1, 0);
+
+ d1= t.d + arr[0];
+ assertEquals(36.0d, d1, 0);
+
+ boolean b = (t.d >= arr[0]);
+ assertTrue(b);
+
+ b = (t.d < arr[1]);
+ assertFalse(b);
+ }
+}
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1861/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1861/run.test.xml?view=auto&rev=538151
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1861/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1861/run.test.xml Tue May 15 05:21:52 2007
@@ -0,0 +1,9 @@
+<project name="RUN HARMONY-1861 Regression Test">
+ <target name="run-test">
+ <run-junit-test
+ test="org.apache.harmony.drlvm.tests.regression.h1861.Test"
+ vmarg="-Xem:jet">
+ </run-junit-test>
+ </target>
+</project>
+
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_regs.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_regs.cpp?view=diff&rev=538151&r1=538150&r2=538151
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_regs.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_regs.cpp Tue May 15 05:21:52 2007
@@ -149,7 +149,7 @@
s.to_mem(m_base, vstack_off(i));
rref(s);
}
-
+ // Next, free out the locals, which are the register
for (unsigned i=0; i<m_jframe->num_vars(); i++) {
Val& s = m_jframe->var(i);
if (!s.is_reg() || s.reg() != ar) { continue; };
@@ -161,15 +161,26 @@
}
//
// Now, free up the stack items that are the memory
+ // addressed via register (e.g. an instance field value)
//
for (unsigned i=0; is_gr(ar) && i<m_jframe->size(); i++) {
Val& s = m_jframe->dip(i);
if (!s.is_mem() || !s.uses(ar)) { continue; };
- push(s.as_opnd(jobj));
+ bool need_double_slot = is_ia32() && is_wide(s.jt());
+ push(s.as_opnd(iplatf));
+ if (need_double_slot) {
+ Opnd hi_mem(iplatf, s.base(), s.disp() + STACK_SLOT_SIZE, s.index(), s.scale());
+ push(hi_mem);
+ }
rfree(s);
- s.to_mem(m_base, vstack_off(i));
+ int stack_off = vstack_off(i);
+ s.to_mem(m_base, stack_off);
rref(s);
- Opnd stk(jobj, m_base, vstack_off(i));
+ if (need_double_slot) {
+ Opnd hi_stk(iplatf, m_base, stack_off + STACK_SLOT_SIZE);
+ pop(hi_stk);
+ }
+ Opnd stk(iplatf, m_base, stack_off);
pop(stk);
}
if (is_set(DBG_TRACE_CG)) { dbg(";;>~spill\n"); }