This adds support for laload and lastore for x86.

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/insn-selector.brg    |   24 ++++++++++++++++++++++--
 regression/jvm/ArrayTest.java |    2 +-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/arch/x86/insn-selector.brg b/arch/x86/insn-selector.brg
index a8a418e..40fc329 100644
--- a/arch/x86/insn-selector.brg
+++ b/arch/x86/insn-selector.brg
@@ -2234,11 +2234,13 @@ stmt:   STMT_STORE(array_deref, reg)
 {
        struct var_info *src, *base, *index;
        struct expression *dest_expr;
+       struct expression *src_expr;
        struct statement *stmt;
        unsigned char scale;
 
        stmt = to_stmt(tree);
        dest_expr = to_expr(stmt->store_dest);
+       src_expr = to_expr(stmt->store_src);
 
        scale = type_to_scale(dest_expr->vm_type);
 
@@ -2247,6 +2249,15 @@ stmt:    STMT_STORE(array_deref, reg)
        src = state->right->reg1;
 
        select_insn(s, tree, reg_memindex_insn(INSN_MOV_REG_MEMINDEX, src, 
base, index, scale));
+
+       if (src_expr->vm_type == J_LONG) {
+               src = state->right->reg2;
+               select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, 4, base));
+               select_insn(s, tree, reg_memindex_insn(INSN_MOV_REG_MEMINDEX, 
src, base, index, scale));
+               /* We should not modify base permanently here because
+                  this expression might be reused. */
+               select_insn(s, tree, imm_reg_insn(INSN_SUB_IMM_REG, 4, base));
+       }
 }
 
 stmt:  STMT_STORE(array_deref, freg)
@@ -2275,11 +2286,13 @@ stmt:   STMT_STORE(reg, array_deref)
 {
        struct var_info *dest, *base, *index;
        struct expression *src_expr;
+       struct expression *dest_expr;
        struct statement *stmt;
        unsigned char scale;
 
        stmt = to_stmt(tree);
        src_expr = to_expr(stmt->store_src);
+       dest_expr = to_expr(stmt->store_dest);
 
        scale = type_to_scale(src_expr->vm_type);
 
@@ -2287,9 +2300,16 @@ stmt:    STMT_STORE(reg, array_deref)
        index = state->right->reg2;
        dest = state->left->reg1;
 
-       state->reg1 = dest;
-
        select_insn(s, tree, memindex_reg_insn(INSN_MOV_MEMINDEX_REG, base, 
index, scale, dest));
+
+       if (dest_expr->vm_type == J_LONG) {
+               dest = state->left->reg2;
+               select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, 4, base));
+               select_insn(s, tree, memindex_reg_insn(INSN_MOV_MEMINDEX_REG, 
base, index, scale, dest));
+               /* We should not modify base permanently here because
+                  this expression might be reused. */
+               select_insn(s, tree, imm_reg_insn(INSN_SUB_IMM_REG, 4, base));
+       }
 }
 
 stmt:  STMT_STORE(freg, array_deref)
diff --git a/regression/jvm/ArrayTest.java b/regression/jvm/ArrayTest.java
index d688f2c..6c85ebc 100644
--- a/regression/jvm/ArrayTest.java
+++ b/regression/jvm/ArrayTest.java
@@ -175,7 +175,7 @@ public class ArrayTest extends TestCase {
         testCharElementLoadStore();
         testByteElementLoadStore();
         testShortElementLoadStore();
-        /* FIXME: testLongElementLoadStore(); */
+        testLongElementLoadStore();
         testReferenceElementLoadStore();
         testFloatElementLoadStore();
         testDoubleElementLoadStore();
-- 
1.6.0.6


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to