Author: lupus
Date: 2006-01-30 06:52:35 -0500 (Mon, 30 Jan 2006)
New Revision: 56244

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/cpu-pentium.md
   trunk/mono/mono/mini/inssel-x86.brg
   trunk/mono/mono/mini/inssel.brg
   trunk/mono/mono/mini/mini-ops.h
   trunk/mono/mono/mini/mini-x86.c
Log:


Mon Jan 30 12:51:10 CET 2006 Paolo Molaro <[EMAIL PROTECTED]>

        * cpu-pentium.md, mini-x86.c, inssel.brg, inssel-x86.brg,
        mini-ops.h: alu membase optimizations.



Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/ChangeLog      2006-01-30 11:52:35 UTC (rev 56244)
@@ -1,4 +1,9 @@
 
+Mon Jan 30 12:51:10 CET 2006 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * cpu-pentium.md, mini-x86.c, inssel.brg, inssel-x86.brg,
+       mini-ops.h: alu membase optimizations.
+
 Fri Jan 27 21:11:08 CET 2006 Paolo Molaro <[EMAIL PROTECTED]>
 
        * mini-ops.h, mini.c, inssel.brg, inssel-x86.brg: opcode

Modified: trunk/mono/mono/mini/cpu-pentium.md
===================================================================
--- trunk/mono/mono/mini/cpu-pentium.md 2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/cpu-pentium.md 2006-01-30 11:52:35 UTC (rev 56244)
@@ -269,6 +269,9 @@
 x86_dec_membase: src1:b len:6
 x86_add_membase_imm: src1:b len:11
 x86_sub_membase_imm: src1:b len:11
+x86_and_membase_imm: src1:b len:11
+x86_or_membase_imm: src1:b len:11
+x86_xor_membase_imm: src1:b len:11
 x86_push: src1:i len:1
 x86_push_imm: len:5
 x86_push_membase: src1:b len:6

Modified: trunk/mono/mono/mini/inssel-x86.brg
===================================================================
--- trunk/mono/mono/mini/inssel-x86.brg 2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/inssel-x86.brg 2006-01-30 11:52:35 UTC (rev 56244)
@@ -38,6 +38,8 @@
        } while (0)
 
 int call_reg_to_call_membase (int opcode);
+int alu_reg_to_alu_imm (int op);
+int alu_reg_to_alu_membase_imm (int op);
 
 %%
 
@@ -440,46 +442,46 @@
        /* nothing to do: the value is already on the FP stack */
 }
 
+stmt: CEE_STIND_I4 (base, CEE_AND (CEE_LDIND_U4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_OR (CEE_LDIND_U4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_XOR (CEE_LDIND_U4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_SUB (CEE_LDIND_U4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_ADD (CEE_LDIND_U4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_AND (CEE_LDIND_I4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_OR (CEE_LDIND_I4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_XOR (CEE_LDIND_I4 (base), OP_ICONST)),
+stmt: CEE_STIND_I4 (base, CEE_SUB (CEE_LDIND_I4 (base), OP_ICONST)),
 stmt: CEE_STIND_I4 (base, CEE_ADD (CEE_LDIND_I4 (base), OP_ICONST)) {
        int con = state->right->right->tree->inst_c0;   
+       MBTREE_TYPE *t1 = state->left->tree;
+       MBTREE_TYPE *t2 = state->right->left->left->tree;
+       int op = state->right->tree->opcode;
 
-       if (con == 1) {
-               tree->opcode = OP_X86_INC_MEMBASE;
-       } else {
-               tree->opcode = OP_X86_ADD_MEMBASE_IMM;
-               tree->inst_imm = con;
-       }
+       /* inst_basereg/offset can't be used for base
+        * operands in cost functions, since they are not set yet,
+        * so we catch all the cases and handle them here.
+        */
+       if (t1->inst_basereg == t2->inst_basereg && t1->inst_offset == 
t2->inst_offset) {
+               if (con == 1 && op == CEE_ADD) {
+                       tree->opcode = OP_X86_INC_MEMBASE;
+               } else if (con == 1 && op == CEE_SUB) {
+                       tree->opcode = OP_X86_DEC_MEMBASE;
+               } else {
+                       tree->opcode = alu_reg_to_alu_membase_imm (op);
+                       tree->inst_imm = con;
+               }
 
-       tree->inst_basereg = state->left->tree->inst_basereg;
-       tree->inst_offset = state->left->tree->inst_offset;
-       mono_bblock_add_inst (s->cbb, tree);
-} cost {
-       MBTREE_TYPE *t1 = state->right->left->left->tree;
-       MBTREE_TYPE *t2 = state->left->tree;
-       MBCOND (t1->inst_basereg == t2->inst_basereg &&
-               t1->inst_offset == t2->inst_offset);
-       return 2;
-}
-
-stmt: CEE_STIND_I4 (base, CEE_SUB (CEE_LDIND_I4 (base), OP_ICONST)) {
-       int con = state->right->right->tree->inst_c0;   
-
-       if (con == 1) {
-               tree->opcode = OP_X86_DEC_MEMBASE;
+               tree->inst_basereg = state->left->tree->inst_basereg;
+               tree->inst_offset = state->left->tree->inst_offset;
+               mono_bblock_add_inst (s->cbb, tree);
        } else {
-               tree->opcode = OP_X86_SUB_MEMBASE_IMM;
-               tree->inst_imm = con;
+               /* emit by hand */
+               int loaded_reg = mono_regstate_next_int (s->rs);
+               int add_reg = mono_regstate_next_int (s->rs);
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, 
loaded_reg, t2->inst_basereg, t2->inst_offset);
+               MONO_EMIT_NEW_BIALU_IMM (s, alu_reg_to_alu_imm (op), add_reg, 
loaded_reg, con);
+               MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, 
t1->inst_basereg, t1->inst_offset, add_reg);
        }
-
-       tree->inst_basereg = state->left->tree->inst_basereg;
-       tree->inst_offset = state->left->tree->inst_offset;
-       mono_bblock_add_inst (s->cbb, tree);
-} cost {
-       MBTREE_TYPE *t1 = state->right->left->left->tree;
-       MBTREE_TYPE *t2 = state->left->tree;
-       MBCOND (t1->inst_basereg == t2->inst_basereg &&
-               t1->inst_offset == t2->inst_offset);
-       return 2;
 }
 
 #
@@ -801,6 +803,46 @@
 %%
 
 int
+alu_reg_to_alu_imm (int op)
+{
+       switch (op) {
+       case CEE_ADD:
+               return OP_ADD_IMM;
+       case CEE_SUB:
+               return OP_SUB_IMM;
+       case CEE_AND:
+               return OP_AND_IMM;
+       case CEE_OR:
+               return OP_OR_IMM;
+       case CEE_XOR:
+               return OP_XOR_IMM;
+       default:
+               g_assert_not_reached ();
+       }
+       return -1;
+}
+
+int
+alu_reg_to_alu_membase_imm (int op)
+{
+       switch (op) {
+       case CEE_ADD:
+               return OP_X86_ADD_MEMBASE_IMM;
+       case CEE_SUB:
+               return OP_X86_SUB_MEMBASE_IMM;
+       case CEE_AND:
+               return OP_X86_AND_MEMBASE_IMM;
+       case CEE_OR:
+               return OP_X86_OR_MEMBASE_IMM;
+       case CEE_XOR:
+               return OP_X86_XOR_MEMBASE_IMM;
+       default:
+               g_assert_not_reached ();
+       }
+       return -1;
+}
+
+int
 call_reg_to_call_membase (int opcode)
 {
        switch (opcode) {

Modified: trunk/mono/mono/mini/inssel.brg
===================================================================
--- trunk/mono/mono/mini/inssel.brg     2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/inssel.brg     2006-01-30 11:52:35 UTC (rev 56244)
@@ -1444,7 +1444,7 @@
        MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADU2_MEMBASE, state->reg1, 
state->left->reg1, ind);
 }
 
-reg: OP_STR_CHAR_ADDR (reg, reg) "1" {
+reg: OP_STR_CHAR_ADDR (reg, reg) "4" {
        int mult_reg = mono_regstate_next_int (s->rs);
        int add_reg = mono_regstate_next_int (s->rs);
 

Modified: trunk/mono/mono/mini/mini-ops.h
===================================================================
--- trunk/mono/mono/mini/mini-ops.h     2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/mini-ops.h     2006-01-30 11:52:35 UTC (rev 56244)
@@ -537,6 +537,9 @@
 MINI_OP(OP_X86_DEC_MEMBASE,        "x86_dec_membase")
 MINI_OP(OP_X86_ADD_MEMBASE_IMM,    "x86_add_membase_imm")
 MINI_OP(OP_X86_SUB_MEMBASE_IMM,    "x86_sub_membase_imm")
+MINI_OP(OP_X86_AND_MEMBASE_IMM,    "x86_and_membase_imm")
+MINI_OP(OP_X86_OR_MEMBASE_IMM,     "x86_or_membase_imm")
+MINI_OP(OP_X86_XOR_MEMBASE_IMM,    "x86_xor_membase_imm")
 MINI_OP(OP_X86_PUSH_MEMBASE,       "x86_push_membase")
 MINI_OP(OP_X86_PUSH_IMM,           "x86_push_imm")
 MINI_OP(OP_X86_PUSH,               "x86_push")

Modified: trunk/mono/mono/mini/mini-x86.c
===================================================================
--- trunk/mono/mono/mini/mini-x86.c     2006-01-30 11:49:49 UTC (rev 56243)
+++ trunk/mono/mono/mini/mini-x86.c     2006-01-30 11:52:35 UTC (rev 56244)
@@ -1822,6 +1822,15 @@
                case OP_X86_SUB_MEMBASE:
                        x86_alu_reg_membase (code, X86_SUB, ins->sreg1, 
ins->sreg2, ins->inst_offset);
                        break;
+               case OP_X86_AND_MEMBASE_IMM:
+                       x86_alu_membase_imm (code, X86_AND, ins->inst_basereg, 
ins->inst_offset, ins->inst_imm);
+                       break;
+               case OP_X86_OR_MEMBASE_IMM:
+                       x86_alu_membase_imm (code, X86_OR, ins->inst_basereg, 
ins->inst_offset, ins->inst_imm);
+                       break;
+               case OP_X86_XOR_MEMBASE_IMM:
+                       x86_alu_membase_imm (code, X86_XOR, ins->inst_basereg, 
ins->inst_offset, ins->inst_imm);
+                       break;
                case OP_X86_INC_MEMBASE:
                        x86_inc_membase (code, ins->inst_basereg, 
ins->inst_offset);
                        break;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to