Optimization reduces code for EXPR_INSTANCE_FIELD from:

   add_imm_reg          $0x20, r2
   mov_imm_reg          $0x8, r27
   mov_memindex_reg     (r2, r27, 0), r28

to:

   mov_membase_reg      $0x28(r2), r28

and for STMT_STORE(inst_field, reg) from:

   add_imm_reg          $0x20, r16
   mov_imm_reg          $0x8, r17
   mov_reg_memindex     r2, (r16, r17, 0)

to:

   mov_reg_membase      r2, $0x28(r16)

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/insn-selector_32.brg |   37 ++++++++++++-------------------------
 1 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/arch/x86/insn-selector_32.brg b/arch/x86/insn-selector_32.brg
index 6725bb4..2b91b84 100644
--- a/arch/x86/insn-selector_32.brg
+++ b/arch/x86/insn-selector_32.brg
@@ -887,24 +887,21 @@ reg:      EXPR_CLASS_FIELD 1
 
 reg:   EXPR_INSTANCE_FIELD(reg) 1
 {
-       struct var_info *base, *index;
+       struct var_info *base;
        struct expression *expr;
+       unsigned long offset;
 
        expr = to_expr(tree);
 
        base = state->left->reg1;
-       index = get_var(s->b_parent);
        state->reg1 = get_var(s->b_parent);
 
-       select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, sizeof(struct 
vm_object), base));
-       select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, 
expr->instance_field->offset, index));
-       select_insn(s, tree, memindex_reg_insn(INSN_MOV_MEMINDEX_REG, base, 
index, 0, state->reg1));
+       offset = sizeof(struct vm_object) + expr->instance_field->offset;
+       select_insn(s, tree, membase_reg_insn(INSN_MOV_MEMBASE_REG, base, 
offset, state->reg1));
 
        if (expr->vm_type == J_LONG) {
                state->reg2 = get_var(s->b_parent);
-
-               select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, 4, index));
-               select_insn(s, tree, memindex_reg_insn(INSN_MOV_MEMINDEX_REG, 
base, index, 0, state->reg2));
+               select_insn(s, tree, membase_reg_insn(INSN_MOV_MEMBASE_REG, 
base, offset + 4, state->reg2));
        }
 }
 
@@ -1253,43 +1250,33 @@ stmt:   STMT_STORE(EXPR_CLASS_FIELD, reg)
 
 inst_field: EXPR_INSTANCE_FIELD(reg) 1
 {
-       struct var_info *src, *base, *index;
        struct expression *expr;
 
        expr = to_expr(tree);
 
-       src = state->left->reg1;
-
-       base = get_var(s->b_parent);
-       state->reg1 = base;
-
-       index = get_var(s->b_parent);
-       state->reg2 = index;
-
-       select_insn(s, tree, reg_reg_insn(INSN_MOV_REG_REG, src, base));
-       select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, sizeof(struct 
vm_object), base));
-       select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, 
expr->instance_field->offset, index));
+       state->reg1 = state->left->reg1;
+       state->reg2 = (void*)(sizeof(struct vm_object) + 
expr->instance_field->offset);
 }
 
 stmt:  STMT_STORE(inst_field, reg)
 {
-       struct var_info *src, *base, *index;
+       struct var_info *src, *base;
        struct expression *store_src;
        struct statement *stmt;
+       unsigned long offset;
 
        stmt = to_stmt(tree);
        store_src = to_expr(stmt->store_src);
        src = state->right->reg1;
 
        base = state->left->reg1;
-       index = state->left->reg2;
+       offset = (unsigned long)state->left->reg2;
 
-       select_insn(s, tree, reg_memindex_insn(INSN_MOV_REG_MEMINDEX, src, 
base, index, 0));
+       select_insn(s, tree, reg_membase_insn(INSN_MOV_REG_MEMBASE, src, base, 
offset));
 
        if (store_src->vm_type == J_LONG) {
                src = state->right->reg2;
-               select_insn(s, tree, imm_reg_insn(INSN_ADD_IMM_REG, 4, index));
-               select_insn(s, tree, reg_memindex_insn(INSN_MOV_REG_MEMINDEX, 
src, base, index, 0));
+               select_insn(s, tree, reg_membase_insn(INSN_MOV_REG_MEMBASE, 
src, base, offset + 4));
        }
 }
 
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to