Author: zoltan
Date: 2005-08-22 08:17:57 -0400 (Mon, 22 Aug 2005)
New Revision: 48652
Modified:
trunk/mono/mono/mini/ChangeLog
Log:
2005-08-22 Zoltan Varga <vargaz (AT) freemail (DOT) hu>
* mini-x86.h tramp-x86.c: Add support for delegate trampolines.
* inssel-x86.brg: Add some optimized call rules.
Modified: trunk/mono/mono/mini/ChangeLog
trunk/mono/mono/mini/ChangeLog2005-08-22 12:00:13 UTC (rev 48651)
trunk/mono/mono/mini/ChangeLog2005-08-22 12:17:57 UTC (rev 48652)
@@ -1,3 +1,9 @@
+2005-08-22 Zoltan Varga <vargaz (AT) freemail (DOT) hu>
+
+* mini-x86.h tramp-x86.c: Add support for delegate trampolines.
+
+* inssel-x86.brg: Add some optimized call rules.
+
2005-08-21 Zoltan Varga <vargaz (AT) freemail (DOT) hu>
* mini.c (): Do not return an already compiled
Modified:
2005-08-22 12:00:13 UTC (rev 48651)
2005-08-22 12:17:57 UTC (rev 48652)
@@ -37,6 +37,7 @@
} \
} while (0)
+int call_reg_to_call_membase (int opcode);
%%
@@ -743,4 +744,54 @@
mono_bblock_add_inst (s->cbb, tree);
}
+# call instructions
+# depends on these
+reg: P_CALL_REG (CEE_LDIND_I (base)),
+reg: P_FCALL_REG (CEE_LDIND_I (base)),
+reg: P_LCALL_REG (CEE_LDIND_I (base)) {
+tree->opcode = call_reg_to_call_membase (tree->opcode);
+tree->inst_basereg = state->left->left->tree->inst_basereg;
+tree->inst_offset = state->left->left->tree->inst_offset;
+tree->dreg = state->reg1;
+mono_bblock_add_inst (s->cbb, tree);
+}
+
+stmt: P_VIDCALL_REG (CEE_LDIND_I (base)) {
+tree->opcode = call_reg_to_call_membase (tree->opcode);
+tree->inst_basereg = state->left->left->tree->inst_basereg;
+tree->inst_offset = state->left->left->tree->inst_offset;
+mono_bblock_add_inst (s->cbb, tree);
+}
+
+stmt: P_VCALL_REG (CEE_LDIND_I (base), reg) {
+mono_arch_emit_this_vret_args (s, (MonoCallInst*)tree, -1, -1, state->right->reg1);
+
+tree->opcode = call_reg_to_call_membase (tree->opcode);
+tree->inst_basereg = state->left->left->tree->inst_basereg;
+tree->inst_offset = state->left->left->tree->inst_offset;
+tree->dreg = state->reg1;
+mono_bblock_add_inst (s->cbb, tree);
+}
+
%%
+
+int
+call_reg_to_call_membase (int opcode)
+{
+switch (opcode) {
+case P_CALL_REG:
+return P_CALL_MEMBASE;
+case P_FCALL_REG:
+return P_FCALL_MEMBASE;
+case P_VCALL_REG:
+return P_VCALL_MEMBASE;
+case P_LCALL_REG:
+return P_LCALL_MEMBASE;
+case P_VIDCALL_REG:
+return P_VIDCALL_MEMBASE;
+default:
+g_assert_not_reached ();
+}
+
+return -1;
+}
Modified:
2005-08-22 12:00:13 UTC (rev 48651)
2005-08-22 12:17:57 UTC (rev 48652)
@@ -241,6 +241,7 @@
#define MNARCH_ENABLE_EMIT_STATEPT 1
#define 1
#define 1
+#define 1
#define MNARCH_HAVE_CREATE_VARS 1
#endif /* __MNMINI_X86_H__ */
Modified:
2005-08-22 12:00:13 UTC (rev 48651)
2005-08-22 12:17:57 UTC (rev 48652)
@@ -134,6 +134,24 @@
}
}
+void
+ (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr)
+{
+guint32 reg;
+guint32 disp;
+
+if ((code [-3] == 0xff) && (x86_modrm_reg (code [-2]) == 0x2) && (x86_modrm_mod (code [-2]) == 0x1)) {
+/* call *[reg+disp8] */
+reg = x86_modrm_rm (code [-2]);
+disp = *(guint8*)(code - 1);
+//printf ("B: [%%r%d+0x%x]\n", reg, disp);
+}
+else
+g_assert_not_reached ();
+
+*(gpointer*)(((guint32)(regs [reg])) + disp) = addr;
+}
+
guchar*
(MonoTrampolineType tramp_type)
{
@@ -194,6 +212,8 @@
x86_call_code (buf, mono_class_init_trampoline);
else if (tramp_type == MNTRAMPLINE_AT)
x86_call_code (buf, mono_aot_trampoline);
+else if (tramp_type == MNTRAMPLINE_DELEGATE)
+x86_call_code (buf, mono_delegate_trampoline);
else
x86_call_code (buf, mono_magic_trampoline);
x86_alu_reg_imm (buf, X86_ADD, X86_ESP, 4*4);
Mono-patches maillist - Mono-patches (AT) lists (DOT) ximian.com