# (C) 2002 Ximian, Inc.
#
+stmt: OP_START_HANDLER {
+ MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, s->spvar->inst_basereg, s->spvar->inst_offset, X86_ESP);
+}
+
+stmt: CEE_ENDFINALLY {
+ MONO_EMIT_NEW_LOAD_MEMBASE (s, X86_ESP, s->spvar->inst_basereg, s->spvar->inst_offset);
+ tree->opcode = CEE_RET;
+ mono_bblock_add_inst (s->cbb, tree);
+}
+
+stmt: OP_ENDFILTER (reg) {
+ MONO_EMIT_NEW_UNALU (s, OP_MOVE, X86_EAX, state->left->reg1);
+ MONO_EMIT_NEW_LOAD_MEMBASE (s, X86_ESP, s->spvar->inst_basereg, s->spvar->inst_offset);
+ tree->opcode = CEE_RET;
+ mono_bblock_add_inst (s->cbb, tree);
+}
+
stmt: CEE_STIND_I8 (OP_REGVAR, lreg) {
/* this should only happen for methods returning a long */
MONO_EMIT_NEW_UNALU (s, OP_MOVE, X86_EAX, state->right->reg1);
mono_bblock_add_inst (s->cbb, tree);
}
+stmt: CEE_STIND_I1 (base, OP_CEQ (cflags)) {
+ tree->opcode = OP_X86_SETEQ_MEMBASE;
+ tree->inst_offset = state->left->tree->inst_offset;
+ tree->inst_basereg = state->left->tree->inst_basereg;
+ mono_bblock_add_inst (s->cbb, tree);
+}
+
reg: OP_LOCALLOC (OP_ICONST) {
if (tree->flags & MONO_INST_INIT) {
/* microcoded in mini-x86.c */
stmt: OP_OUTARG_VT (CEE_LDOBJ (base)) {
MonoInst *vt = state->left->left->tree;
//g_print ("vt size: %d at R%d + %d\n", tree->inst_imm, vt->inst_basereg, vt->inst_offset);
+
+ if (!tree->inst_imm)
+ return;
+
if (tree->inst_imm <= 4) {
tree->opcode = OP_X86_PUSH_MEMBASE;
tree->inst_basereg = vt->inst_basereg;
mono_bblock_add_inst (s->cbb, tree);
}
+reg: CEE_LDIND_I2 (OP_REGVAR) {
+ MONO_EMIT_UNALU (s, tree, OP_SEXT_I2, state->reg1, state->left->tree->dreg);
+}
+
# on x86, fp compare overwrites EAX, so we must
# either improve the local register allocator or
# emit coarse opcodes which saves EAX for us.