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