Index: vm/jitrino/src/jet/cg_regs.cpp =================================================================== --- vm/jitrino/src/jet/cg_regs.cpp (revision 537699) +++ vm/jitrino/src/jet/cg_regs.cpp (working copy) @@ -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; inum_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) && isize(); 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"); } Index: src/test/regression/H1861/Test.java =================================================================== --- src/test/regression/H1861/Test.java (revision 0) +++ src/test/regression/H1861/Test.java (revision 0) @@ -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); + } +} Index: src/test/regression/H1861/run.test.xml =================================================================== --- src/test/regression/H1861/run.test.xml (revision 0) +++ src/test/regression/H1861/run.test.xml (revision 0) @@ -0,0 +1,9 @@ + + + + + + +