Wed Jun 11 18:01:06 CEST 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / inssel-x86.brg
index 04500ed5d280e8a4a9dfb551bf690c2278e4105a..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);
@@ -80,6 +97,13 @@ cflags: OP_COMPARE (reg, CEE_LDIND_I4 (base)) {
        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 */
@@ -257,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;
@@ -411,6 +439,10 @@ stmt: CEE_STIND_I4 (OP_REGVAR, CEE_ADD (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST)) {
        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.