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