Wed Jun 11 18:01:06 CEST 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / inssel-x86.brg
index d234e8a0c1d0e778732526eecfdb7b6ff6c9f7ff..a5317454fda4981bf829e4065efe1f855ba36daf 100644 (file)
 # (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);
@@ -264,6 +281,10 @@ stmt: OP_OUTARG_R8 (freg) {
 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;