Don't run test-318 with gmcs.
[mono.git] / mono / mini / inssel-s390.brg
index f85df29a58e4119513005ec4321a3e7044f738a6..4a1daf4ad5b4188a4aa01f564e8cb3131748083e 100644 (file)
@@ -80,10 +80,22 @@ stmt: CEE_STIND_I8 (OP_REGVAR, lreg) {
 }
 
 freg: OP_LCONV_TO_R8 (lreg) {
+       tree->dreg = state->reg1;
+       tree->sreg1 = state->left->reg1;
+       tree->sreg2 = state->left->reg2;
        mono_bblock_add_inst (s->cbb, tree);
 }
 
 freg: OP_LCONV_TO_R4 (lreg) {
+       tree->dreg = state->reg1;
+       tree->sreg1 = state->left->reg1;
+       tree->sreg2 = state->left->reg2;
+       mono_bblock_add_inst (s->cbb, tree);
+}
+
+freg: CEE_CONV_R_UN (reg) {
+       tree->dreg = state->reg1;
+       tree->sreg1 = state->left->reg1;
        mono_bblock_add_inst (s->cbb, tree);
 }
 
@@ -94,7 +106,18 @@ freg: CEE_CONV_R_UN (reg) {
 stmt: OP_MEMCPY (reg, reg) "0" {
        int size = tree->unused;
        if (size > 0) 
-               MONO_EMIT_NEW_MOVE (s, state->left->reg1, 0, state->right->reg1, 0, size);
+               MONO_EMIT_NEW_MOVE (s, state->left->reg1, 0, 
+                                   state->right->reg1, 0, size);
+}
+
+stmt: OP_MEMCPY (base, base) "0" {
+       int size = tree->unused;
+       if (size > 0)  
+               MONO_EMIT_NEW_MOVE (s, state->left->tree->sreg1, 
+                                   state->left->tree->inst_offset, 
+                                   state->right->tree->sreg1,
+                                   state->right->tree->inst_offset,
+                                   size);
 }
 
 reg: OP_LOCALLOC (OP_ICONST) {
@@ -273,7 +296,7 @@ stmt: OP_OUTARG_VT (CEE_LDOBJ (base)) {
        int soffset   = vt->inst_offset;
        int tmpr;
        
-printf("OP_OUTARG_VT(CEE_LDOBJ(base))\n");
+//printf("OP_OUTARG_VT(CEE_LDOBJ(base))\n");
        if (size < 0) { 
                size = -size;
                if (start_reg != STK_BASE) {
@@ -307,7 +330,7 @@ stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_S390_ARGPTR)) {
        int soffset   = vt->inst_offset;
        int tmpr;
 
-printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_ARGPTR))\n");
+//printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_ARGPTR))\n");
        if (size < 0) { 
                size = -size;
                if (start_reg != STK_BASE) {
@@ -344,7 +367,7 @@ stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_REGOFFSET)) "0" {
        int soffset   = vt->inst_offset;
        int tmpr;
 
-printf("OP_OUTARG_VT(CEE_LDOBJ(OP_REGOFFSET))\n");
+//printf("OP_OUTARG_VT(CEE_LDOBJ(OP_REGOFFSET))\n");
        if (size < 0) { 
                size = -size;
                if (start_reg != STK_BASE) {
@@ -380,7 +403,7 @@ stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_S390_LOADARG)) {
        int soffset   = vt->inst_offset;
        int tmpr;
 
-printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_LOADARG))\n");
+//printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_LOADARG))\n");
        if (start_reg != STK_BASE) {
                MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg, STK_BASE, soffset);
                MONO_EMIT_NEW_MOVE (s, STK_BASE, tree->sreg2, start_reg, 0, size);
@@ -424,15 +447,26 @@ stmt: OP_OUTARG_VT (reg) {
        int soffset   = tree->sreg2;
        int tmpr;
 
-printf("OP_OUTARG_VT(reg)\n");
+//printf("OP_OUTARG_VT(reg)\n");
        if (size < 0) { 
                size = -size;
-               MONO_EMIT_NEW_MOVE (s, STK_BASE, soffset, 
-                                 state->left->tree->sreg1, 
-                                 tree->inst_imm, size);
                if (start_reg != STK_BASE) {
+                       MONO_EMIT_NEW_MOVE (s, STK_BASE, soffset,
+                                           state->left->tree->sreg1,
+                                           tree->inst_imm, size);
                        MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg, 
-                                                STK_BASE, soffset);
+                                                STK_BASE, soffset);
+               } else {
+                       MONO_EMIT_NEW_MOVE (s, STK_BASE, 
+                                           soffset+sizeof(gpointer),
+                                           state->left->tree->sreg1,
+                                           tree->inst_imm, size);
+                       tmpr = mono_regstate_next_int (s->rs);
+                       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
+                                                soffset+sizeof(gpointer));
+                       MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, 
+                                                    STK_BASE, tree->inst_imm,
+                                                    tmpr);
                }
        } else {
                if (start_reg != STK_BASE) {
@@ -551,8 +585,9 @@ base: OP_S390_STKARG "0" {
        int tmpr;
 
        tmpr = mono_regstate_next_int (s->rs);
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg, 
-                               (s->stack_offset+state->tree->unused));
+//     MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg, 
+//                             (s->stack_offset+state->tree->unused));
+       MONO_EMIT_NEW_LOAD_MEMBASE (s, tmpr, s->frame_reg, 0);
        tree->inst_offset  = state->tree->inst_offset;
        tree->inst_basereg = tmpr;
 }
@@ -580,9 +615,11 @@ base: OP_LDADDR (OP_S390_ARGPTR) "0" {
 base: OP_LDADDR (OP_S390_STKARG) "0" {
        int tmpr;
 
+printf("OP_LDADDR (OP_S390_STKARG)\n");
        tmpr = mono_regstate_next_int (s->rs);
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg, 
-                                (s->stack_offset + state->left->tree->unused));
+//     MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg, 
+//                              (s->stack_offset + state->left->tree->unused));
+       MONO_EMIT_NEW_LOAD_MEMBASE (s, tmpr, s->frame_reg, 0);
        MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, tmpr, 
                                 state->left->tree->inst_offset);
        tree->inst_offset  = 0;
@@ -628,17 +665,17 @@ reg: CEE_LDOBJ (OP_S390_STKARG) "1" {
        MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->reg1,
                                 state->left->tree->inst_offset);
        tree->inst_offset  = 0;
-       tree->dreg         = state->reg1;
+       tree->inst_basereg = state->reg1;
 }
 
 base: CEE_LDOBJ (OP_S390_ARGPTR) "0" {
        int tmpr;
 
        tmpr = mono_regstate_next_int (s->rs);
-       MONO_EMIT_NEW_LOAD_MEMBASE (s, tmpr, s->frame_reg, 
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg, 
                                    state->left->tree->inst_offset);
        tree->inst_offset  = 0;
-       tree->dreg         = tmpr;
+       tree->inst_basereg = tmpr;
 }
 
 base: CEE_LDOBJ (OP_S390_STKARG) "0" {