Author: zoltan
Date: 2008-02-15 09:48:17 -0500 (Fri, 15 Feb 2008)
New Revision: 95758

Modified:
   branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
   branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.c
   branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.h
Log:
2008-02-15  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini-s390.h mini-s390.c cpu-s390.md mini-ops.h: Ongoing s390 work.


Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-15 
14:39:13 UTC (rev 95757)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-15 
14:48:17 UTC (rev 95758)
@@ -1,5 +1,7 @@
 2008-02-15  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * mini-s390.h mini-s390.c cpu-s390.md mini-ops.h: Ongoing s390 work.
+
        * exceptions-arm.c mini-arm.c cpu-arm.md: Fix arm build.
 
        * method-to-ir.c (mini_emit_inst_for_method): Fix 64 bit issues in 
array access

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md   2008-02-15 
14:39:13 UTC (rev 95757)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md   2008-02-15 
14:48:17 UTC (rev 95758)
@@ -46,38 +46,12 @@
 # See the code in mini-x86.c for more details on how the specifiers are used.
 #
 
-<<<<<<< .working
-nop: len:0
-dummy_use: len:0
-dummy_store: len:0
-not_reached: len:0
-not_null: src1:i len:0
-
-ceq: dest:i len:12
-cgt.un: dest:i len:12
-cgt: dest:i len:12
-clt.un: dest:i len:12
-clt: dest:i len:12
-
-add.ovf.un: len: 10 dest:i src1:i src2:i
-add.ovf: len: 24 dest:i src1:i src2:i
-addcc_imm: dest:i src1:i len:18
-
-add_imm: dest:i src1:i len:18
-sub_imm: dest:i src1:i len:18
-mul_imm: dest:i src1:i len:20
-div_imm: dest:i src1:i src2:i len:24
-div_un_imm: dest:i src1:i src2:i len:24
-adc_imm: dest:i src1:i len:18
-sbb_imm: dest:i src1:i len:18
-
-=======
 nop: len:4
 
 adc: dest:i src1:i src2:i len:6
->>>>>>> .merge-right.r95529
 add_ovf_carry: dest:i src1:1 src2:i len:28
 add_ovf_un_carry: dest:i src1:1 src2:i len:28
+addcc: dest:i src1:i src2:i len:6
 aot_const: dest:i len:8
 atomic_add_i4: src1:b src2:i dest:i len:20
 atomic_exchange_i4: src1:b src2:i dest:i len:20
@@ -86,10 +60,16 @@
 br_reg: src1:i len:8
 break: len:6
 call: dest:o len:6 clob:c
-checkthis: src1:b len:4
 call_handler: len:12
 call_membase: dest:o src1:b len:12 clob:c
 call_reg: dest:o src1:i len:8 clob:c
+ceq: dest:i len:12
+cgt.un: dest:i len:12
+cgt: dest:i len:12
+checkthis: src1:b len:4
+ckfinite: dest:f src1:f len:22
+clt.un: dest:i len:12
+clt: dest:i len:12
 compare: src1:i src2:i len:4
 compare_imm: src1:i len:14
 cond_exc_c: len:8
@@ -106,27 +86,12 @@
 cond_exc_ne_un: len:8
 cond_exc_no: len:8
 cond_exc_ov: len:8
-<<<<<<< .working
-conv.i1: dest:i src1:i len:26
-conv.i2: dest:i src1:i len:26
-conv.i4: dest:i src1:i len:2
-conv.i: dest:i src1:i len:2
-conv.r.un: dest:f src1:i len:30
-conv.r4: dest:f src1:i len:4
-conv.r8: dest:f src1:i len:4
-conv.u1: dest:i src1:i len:8
-conv.u2: dest:i src1:i len:16
-conv.u4: dest:i src1:i
-conv.u: dest:i src1:i len:4
-=======
->>>>>>> .merge-right.r95529
 endfinally: len: 20
 fcall: dest:g len:10 clob:c
 fcall_membase: dest:g src1:b len:14 clob:c
 fcall_reg: dest:g src1:i len:10 clob:c
 fcompare: src1:f src2:f len:14
-ckfinite: dest:f src1:f len:22
-
+float_add: dest:f src1:f src2:f len:6
 float_beq: len:10
 float_bge: len:10
 float_bge_un: len:8
@@ -153,19 +118,16 @@
 float_conv_to_u4: dest:i src1:f len:62
 float_conv_to_u8: dest:l src1:f len:62
 float_conv_to_u: dest:i src1:f len:36
-float_add: dest:f src1:f src2:f len:6
-float_sub: dest:f src1:f src2:f len:6
-float_mul: dest:f src1:f src2:f len:6
 float_div: dest:f src1:f src2:f len:6
 float_div_un: dest:f src1:f src2:f len:6
-float_rem: dest:f src1:f src2:f len:16
-float_rem_un: dest:f src1:f src2:f len:16
+float_mul: dest:f src1:f src2:f len:6
 float_neg: dest:f src1:f len:6
 float_not: dest:f src1:f len:6
+float_rem: dest:f src1:f src2:f len:16
+float_rem_un: dest:f src1:f src2:f len:16
+float_sub: dest:f src1:f src2:f len:6
 fmove: dest:f src1:f len:4
-
 iconst: dest:i len:16
-jump_table: dest:i len:16
 jmp: len:56
 label: len:0
 lcall: dest:L len:8 clob:c
@@ -197,13 +159,6 @@
 long_sub_ovf: len:36 dest:l src1:l src2:i clob:1
 memory_barrier: len: 10
 move: dest:i src1:i len:4
-<<<<<<< .working
-mul.ovf.un: dest:i src1:i src2:i len:20
-mul.ovf: dest:i src1:i src2:i len:42
-neg: dest:i src1:i len:4
-not: dest:i src1:i len:8
-=======
->>>>>>> .merge-right.r95529
 bigmul: len:2 dest:l src1:a src2:i
 bigmul_un: len:2 dest:l src1:a src2:i
 endfilter: src1:i len:12
@@ -217,10 +172,7 @@
 s390_move: len:48 dest:b src1:b
 s390_setf4ret: dest:f src1:f len:4
 tls_get: dest:i len:44
-<<<<<<< .working
-=======
 sbb: dest:i src1:i src2:i len:8
->>>>>>> .merge-right.r95529
 setlret: src1:i src2:i len:12
 setret: dest:a src1:i len:6
 sqrt: dest:f src1:f len:4
@@ -237,14 +189,9 @@
 storei8_membase_reg: dest:b src1:i 
 storer4_membase_reg: dest:b src1:f len:22
 storer8_membase_reg: dest:b src1:f len:22
-<<<<<<< .working
-sub.ovf.un: len:10 dest:i src1:i src2:i 
-sub.ovf: len:24 dest:i src1:i src2:i
-subcc_imm: dest:i src1:i len:18
-=======
->>>>>>> .merge-right.r95529
 sub_ovf_carry: dest:i src1:1 src2:i len:28
 sub_ovf_un_carry: dest:i src1:1 src2:i len:28
+subcc: dest:i src1:i src2:i len:6
 throw: src1:i len:8
 vcall: len:8 clob:c
 vcall_membase: src1:b len:12 clob:c
@@ -317,69 +264,17 @@
 subcc_imm: dest:i src1:i len:18
 xor_imm: dest:i src1:i len:16
 
+# Linear IR opcodes
+dummy_use: len:0
+dummy_store: len:0
+not_reached: len:0
+not_null: src1:i len:0
+
+jump_table: dest:i len:16
+
 icompare: src1:i src2:i len:4
 icompare_imm: src1:i len:14
 
-int_add: dest:i src1:i src2:i len:6
-int_sub: dest:i src1:i src2:i len:6
-int_mul: dest:i src1:i src2:i len:6
-int_mul_ovf: dest:i src1:i src2:i clob:1 len:64
-int_mul_ovf_un: dest:i src1:i src2:i clob:1 len:64
-int_div: dest:a src1:i src2:i len:10
-int_div_un: dest:a src1:i src2:i len:12
-int_rem: dest:d src1:i src2:i len:10
-int_rem_un: dest:d src1:i src2:i len:12
-int_and: dest:i src1:i src2:i len:6
-int_or: dest:i src1:i src2:i len:4
-int_xor: dest:i src1:i src2:i len:4
-int_adc: dest:i src1:i src2:i len:6
-int_sbb: dest:i src1:i src2:i len:8
-int_addcc: dest:i src1:i src2:i len:6
-int_subcc: dest:i src1:i src2:i len:6
-int_shl: dest:i src1:i src2:i clob:s len:8
-int_shr_un: dest:i src1:i src2:i clob:s len:8
-int_shr: dest:i src1:i src2:i clob:s len:8
-
-int_add_imm: dest:i src1:i len:18
-int_sub_imm: dest:i src1:i len:18
-int_mul_imm: dest:i src1:i len:20
-int_div_imm: dest:i src1:i len:24
-int_div_un_imm: dest:i src1:i len:24
-int_rem_imm: dest:i src1:i len:24
-int_rem_un_imm: dest:i src1:i len:24
-int_and_imm: dest:i src1:i len:16
-int_or_imm: dest:i src1:i len:16
-int_xor_imm: dest:i src1:i len:16
-int_adc_imm: dest:i src1:i len:18
-int_sbb_imm: dest:i src1:i len:18
-int_shl_imm: dest:i src1:i len:8
-int_shr_imm: dest:i src1:i len:8
-int_shr_un_imm: dest:i src1:i len:8
-
-
-int_conv_to_i1: dest:i src1:i len:26
-int_conv_to_i2: dest:i src1:i len:26
-int_conv_to_i4: dest:i src1:i len:2
-int_conv_to_i: dest:i src1:i len:2
-int_conv_to_r_un: dest:f src1:i len:30
-int_conv_to_r4: dest:f src1:i len:4
-int_conv_to_r8: dest:f src1:i len:4
-int_conv_to_u1: dest:i src1:i len:8
-int_conv_to_u2: dest:i src1:i len:16
-int_conv_to_u4: dest:i src1:i
-int_conv_to_u: dest:i src1:i len:4
-
-int_beq: len:8
-int_bge_un: len:8
-int_bge: len:8
-int_bgt_un: len:8
-int_bgt: len:8
-int_ble_un: len:8
-int_ble: len:8
-int_blt_un: len:8
-int_blt: len:8
-int_bne_un: len:8
-
 int_ceq: dest:i len:12
 int_cgt_un: dest:i len:12
 int_cgt: dest:i len:12
@@ -400,3 +295,26 @@
 cond_exc_ine_un: len:8
 cond_exc_ino: len:8
 cond_exc_iov: len:8
+
+int_add_imm: dest:i src1:i len:18
+int_sub_imm: dest:i src1:i len:18
+int_mul_imm: dest:i src1:i len:20
+int_div_imm: dest:i src1:i len:24
+int_div_un_imm: dest:i src1:i len:24
+int_rem_imm: dest:i src1:i len:24
+int_rem_un_imm: dest:i src1:i len:24
+int_and_imm: dest:i src1:i len:16
+int_or_imm: dest:i src1:i len:16
+int_xor_imm: dest:i src1:i len:16
+int_adc_imm: dest:i src1:i len:18
+int_sbb_imm: dest:i src1:i len:18
+int_shl_imm: dest:i src1:i len:8
+int_shr_imm: dest:i src1:i len:8
+int_shr_un_imm: dest:i src1:i len:8
+
+int_adc: dest:i src1:i src2:i len:6
+int_sbb: dest:i src1:i src2:i len:8
+int_addcc: dest:i src1:i src2:i len:6
+int_subcc: dest:i src1:i src2:i len:6
+
+long_conv_to_ovf_i4_2: dest:i src1:i src2:i len:44
\ No newline at end of file

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h    2008-02-15 
14:39:13 UTC (rev 95757)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-ops.h    2008-02-15 
14:48:17 UTC (rev 95758)
@@ -772,7 +772,7 @@
 MINI_OP(OP_S390_ARGPTR,           "s390_argptr", NONE, NONE, NONE)
 MINI_OP(OP_S390_STKARG,           "s390_stkarg", NONE, NONE, NONE)
 MINI_OP(OP_S390_MOVE,             "s390_move", NONE, NONE, NONE)
-MINI_OP(OP_S390_SETF4RET,         "s390_setf4ret", NONE, NONE, NONE)
+MINI_OP(OP_S390_SETF4RET,         "s390_setf4ret", FREG, FREG, NONE)
 MINI_OP(OP_S390_BKCHAIN,          "s390_bkchain", NONE, NONE, NONE)
 #endif
 

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.c
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.c   2008-02-15 
14:39:13 UTC (rev 95757)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.c   2008-02-15 
14:48:17 UTC (rev 95758)
@@ -204,6 +204,7 @@
        RegTypeGeneral,
        RegTypeBase,
        RegTypeFP,
+       RegTypeFPR4,
        RegTypeStructByVal,
        RegTypeStructByAddr
 } ArgStorage;
@@ -213,7 +214,7 @@
        gint32  offparm;        /* offset from callee's stack */
        guint16 vtsize;         /* in param area */
        guint8  reg;
-       guint8  regtype;        /* See RegType* */
+       ArgStorage regtype;             /* See RegType* */
        guint32 size;           /* Size of structure used by RegTypeStructByVal 
*/
 } ArgInfo;
 
@@ -1999,6 +2000,20 @@
                MONO_ADD_INS (cfg->cbb, ins);
                mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, reg, 
FALSE);
                break;
+       case RegTypeFP:
+               MONO_INST_NEW (cfg, ins, OP_FMOVE);
+               ins->dreg = mono_alloc_freg (cfg);
+               ins->sreg1 = tree->dreg;
+               MONO_ADD_INS (cfg->cbb, ins);
+               mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, reg, TRUE);
+               break;
+       case RegTypeFPR4:
+               MONO_INST_NEW (cfg, ins, OP_S390_SETF4RET);
+               ins->dreg = mono_alloc_freg (cfg);
+               ins->sreg1 = tree->dreg;
+               MONO_ADD_INS (cfg->cbb, ins);
+               mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, reg, TRUE);
+               break;
        default:
                g_assert_not_reached ();
        }
@@ -2016,6 +2031,7 @@
        MonoInst *in;
        MonoCallArgParm *arg;
        MonoMethodSignature *sig;
+       MonoInst *ins;
        int i, n, lParamArea;
        CallInfo *cinfo;
        ArgInfo *ainfo = NULL;
@@ -2042,7 +2058,14 @@
 
        for (i = 0; i < n; ++i) {
                ainfo = cinfo->args + i;
+               MonoType *t;
 
+               if (i >= sig->hasthis)
+                       t = sig->params [i - sig->hasthis];
+               else
+                       t = &mono_defaults.int_class->byval_arg;
+               t = mono_type_get_underlying_type (t);
+
                in = call->args [i];
 
                if ((sig->call_convention == MONO_CALL_VARARG) &&
@@ -2052,9 +2075,89 @@
                        emit_sig_cookie (cfg, call, cinfo, ainfo->size);
                }
 
-               if (ainfo->regtype == RegTypeGeneral) {
+               switch (ainfo->regtype) {
+               case RegTypeGeneral:
+                       if (!t->byref && (t->type == MONO_TYPE_I8 || t->type == 
MONO_TYPE_U8)) {
+                               MONO_INST_NEW (cfg, ins, OP_MOVE);
+                               ins->dreg = mono_alloc_ireg (cfg);
+                               ins->sreg1 = in->dreg + 2;
+                               MONO_ADD_INS (cfg->cbb, ins);
+                               mono_call_inst_add_outarg_reg (cfg, call, 
ins->dreg, ainfo->reg, FALSE);
+                               MONO_INST_NEW (cfg, ins, OP_MOVE);
+                               ins->dreg = mono_alloc_ireg (cfg);
+                               ins->sreg1 = in->dreg + 1;
+                               MONO_ADD_INS (cfg->cbb, ins);
+                               mono_call_inst_add_outarg_reg (cfg, call, 
ins->dreg, ainfo->reg + 1, FALSE);
+                       } else {
+                               add_outarg_reg2 (cfg, call, ainfo->regtype, 
ainfo->reg, in);
+                       }
+                       break;
+               case RegTypeFP:
+                       if (ainfo->size == 4)
+                               ainfo->regtype = RegTypeFPR4;
                        add_outarg_reg2 (cfg, call, ainfo->regtype, ainfo->reg, 
in);
-               } else {
+                       break;
+               case RegTypeStructByVal: {
+                       guint32 align;
+                       guint32 size;
+
+                       if (sig->params [i - sig->hasthis]->type == 
MONO_TYPE_TYPEDBYREF) {
+                               size = sizeof (MonoTypedRef);
+                               align = sizeof (gpointer);
+                       }
+                       else
+                               if (sig->pinvoke)
+                                       size = mono_type_native_stack_size 
(&in->klass->byval_arg, &align);
+                               else {
+                                       /* 
+                                        * Other backends use 
mono_type_stack_size (), but that
+                                        * aligns the size to 8, which is 
larger than the size of
+                                        * the source, leading to reads of 
invalid memory if the
+                                        * source is at the end of address 
space.
+                                        */
+                                       size = mono_class_value_size 
(in->klass, &align);
+                               }
+
+                       g_assert (in->klass);
+
+                       /*
+                       if (ainfo->reg != STK_BASE) {
+                               switch (ainfo->size) {
+                               case 0:
+                               case 1:
+                               case 2:
+                               case 4:
+                                       call->used_iregs |= 1 << ainfo->reg;
+                                       break;
+                               case 8:
+                                       call->used_iregs |= 1 << ainfo->reg;
+                                       call->used_iregs |= 1 << (ainfo->reg+1);
+                                       break;
+                               default:
+                                       call->used_iregs |= 1 << ainfo->reg;
+                               }
+                       } 
+                       arg->ins.sreg1  = ainfo->reg;
+                       arg->ins.opcode = OP_OUTARG_VT;
+                       arg->size       = ainfo->size;
+                       arg->offset     = ainfo->offset;
+                       arg->offPrm     = ainfo->offparm + sz.offStruct;
+                       */
+
+                       ainfo->offparm += sz.offStruct;
+
+                       MONO_INST_NEW (cfg, ins, OP_OUTARG_VT);
+                       ins->sreg1 = in->dreg;
+                       ins->klass = in->klass;
+                       ins->backend.size = size;
+                       ins->inst_p0 = call;
+                       ins->inst_p1 = mono_mempool_alloc (cfg->mempool, sizeof 
(ArgInfo));
+                       memcpy (ins->inst_p1, ainfo, sizeof (ArgInfo));
+
+                       MONO_ADD_INS (cfg->cbb, ins);
+                       break;
+               }
+               default:
                        // FIXME:
                        NOT_IMPLEMENTED;
 
@@ -2144,8 +2247,31 @@
 void
 mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
 {
-       // FIXME:
-       NOT_IMPLEMENTED;
+       MonoInst *arg;
+       MonoCallInst *call = (MonoCallInst*)ins->inst_p0;
+       ArgInfo *ainfo = (ArgInfo*)ins->inst_p1;
+       int size = ins->backend.size;
+
+       if (ainfo->regtype == RegTypeStructByVal) {
+               /*
+                               arg->ins.sreg1  = ainfo->reg;
+                               arg->ins.opcode = OP_OUTARG_VT;
+                               arg->size       = ainfo->size;
+                               arg->offset     = ainfo->offset;
+                               arg->offPrm     = ainfo->offparm + sz.offStruct;
+               */
+               if (ainfo->size < 0)
+                       NOT_IMPLEMENTED;
+
+               if (ainfo->reg != STK_BASE) {
+                       MONO_OUTPUT_VTR(cfg, size, ainfo->reg, src->dreg, 0);
+               } else {
+                       MONO_OUTPUT_VTS(cfg, size, ainfo->reg, ainfo->offset,
+                                         src->dreg, 0);
+               }       
+       } else {
+               g_assert_not_reached ();
+       }
 }
 
 /*------------------------------------------------------------------*/
@@ -2161,15 +2287,15 @@
 
        if (!ret->byref) {
                if (ret->type == MONO_TYPE_R4) {
-                       // FIXME:
-                       NOT_IMPLEMENTED;
-                       //MONO_EMIT_NEW_UNALU (cfg, OP_AMD64_SET_XMMREG_R4, 
cfg->ret->dreg, val->dreg);
+                       MONO_EMIT_NEW_UNALU (cfg, OP_S390_SETF4RET, s390_f0, 
val->dreg);
                        return;
                } else if (ret->type == MONO_TYPE_R8) {
-                       // FIXME:
-                       NOT_IMPLEMENTED;
-                       //MONO_EMIT_NEW_UNALU (cfg, use_sse2 ? OP_FMOVE : 
OP_AMD64_SET_XMMREG_R8, cfg->ret->dreg, val->dreg);
+                       MONO_EMIT_NEW_UNALU (cfg, OP_FMOVE, s390_f0, val->dreg);
                        return;
+               } else if (ret->type == MONO_TYPE_I8 || ret->type == 
MONO_TYPE_U8) {
+                       MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, s390_r3, val->dreg + 
1);
+                       MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, s390_r2, val->dreg + 
2);
+                       return;
                }
        }
                        
@@ -2940,17 +3066,7 @@
 
                        if (s390_is_imm16 (ins->inst_imm)) {
                                s390_lhi  (code, s390_r0, ins->inst_imm);
-<<<<<<< .working
                                if (un)
-=======
-                               if ((next) && 
-                                   (((next->opcode >= OP_IBNE_UN) &&
-                                     (next->opcode <= OP_IBLT_UN)) || 
-                                    ((next->opcode >= OP_COND_EXC_NE_UN) &&
-                                     (next->opcode <= OP_COND_EXC_LT_UN)) ||
-                                    ((next->opcode == OP_CLT_UN) ||
-                                     (next->opcode == OP_CGT_UN))))
->>>>>>> .merge-right.r95529
                                        s390_clr  (code, ins->sreg1, s390_r0);
                                else
                                        s390_cr   (code, ins->sreg1, s390_r0);
@@ -2959,17 +3075,7 @@
                                s390_basr (code, s390_r13, 0);
                                s390_j    (code, 4);
                                s390_word (code, ins->inst_imm);
-<<<<<<< .working
                                if (un)
-=======
-                               if ((next) && 
-                                   (((next->opcode >= OP_IBNE_UN) &&
-                                     (next->opcode <= OP_IBLT_UN)) || 
-                                    ((next->opcode >= OP_COND_EXC_NE_UN) &&
-                                     (next->opcode <= OP_COND_EXC_LT_UN)) ||
-                                    ((next->opcode == OP_CLT_UN) ||
-                                     (next->opcode == OP_CGT_UN))))
->>>>>>> .merge-right.r95529
                                        s390_cl   (code, ins->sreg1, 0, 
s390_r13, 4);
                                else
                                        s390_c    (code, ins->sreg1, 0, 
s390_r13, 4);
@@ -2992,7 +3098,8 @@
                        s390_ar   (code, ins->dreg, src2);
                }
                        break;
-               case OP_ADC: {
+               case OP_ADC:
+               case OP_IADC: {
                        CHECK_SRCDST_COM;
                        s390_alcr (code, ins->dreg, src2);
                }
@@ -3563,7 +3670,6 @@
                        s390_l    (code,ins->dreg, 0, s390_r13, 4);
                }
                        break;
-<<<<<<< .working
                case OP_JUMP_TABLE: {
                        mono_add_patch_info (cfg, code - cfg->native_code, 
                                (MonoJumpInfoType)ins->inst_i1, ins->inst_p0);
@@ -3573,10 +3679,8 @@
                        s390_l    (code, ins->dreg, 0, s390_r13, 4);
                }
                        break;
-=======
                case OP_ICONV_TO_I4:
                case OP_ICONV_TO_U4:
->>>>>>> .merge-right.r95529
                case OP_MOVE: {
                        if (ins->dreg != ins->sreg1) {
                                s390_lr (code, ins->dreg, ins->sreg1);
@@ -3619,11 +3723,17 @@
                }
                        break;
                case OP_FCONV_TO_R4: {
+                       // FIXME:
+                       if (ins->dreg != ins->sreg1) {
+                               s390_ldr   (code, ins->dreg, ins->sreg1);
+                       }
+                       /*
                        NOT_IMPLEMENTED;
                        if ((ins->next) &&
                             (ins->next->opcode != OP_FMOVE) &&
                             (ins->next->opcode != OP_STORER4_MEMBASE_REG))
                                s390_ledbr (code, ins->dreg, ins->sreg1);
+                       */
                }
                        break;
                case OP_JMP: {
@@ -3675,15 +3785,10 @@
                                s390_ldebr (code, s390_f0, s390_f0);
                }
                        break;
-               case OP_CALL:
                case OP_LCALL:
                case OP_VCALL:
-<<<<<<< .working
-               case OP_VOIDCALL: {
-=======
                case OP_VOIDCALL:
                case OP_CALL: {
->>>>>>> .merge-right.r95529
                        call = (MonoCallInst*)ins;
                        if (ins->flags & MONO_INST_HAS_METHOD)
                                mono_add_patch_info (cfg, offset, 
MONO_PATCH_INFO_METHOD, call->method);
@@ -4096,7 +4201,8 @@
                        g_assert_not_reached ();
                        /* Implemented as helper calls */
                        break;
-               case OP_LCONV_TO_OVF_I: {
+               case OP_LCONV_TO_OVF_I:
+               case OP_LCONV_TO_OVF_I4_2: {
                        /* Valid ints: 0xffffffff:8000000 to 
00000000:0x7f000000 */
                        short int *o[5];
                        s390_ltr  (code, ins->sreg1, ins->sreg1);

Modified: branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.h
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.h   2008-02-15 
14:39:13 UTC (rev 95757)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.h   2008-02-15 
14:48:17 UTC (rev 95758)
@@ -59,32 +59,31 @@
        switch (size) {                                                         
\
                case 0:                                                         
\
                        MONO_EMIT_NEW_ICONST(cfg, reg, 0);                      
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, 
FALSE);       \
                break;                                                          
\
                case 1:                                                         
\
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU1_MEMBASE,   
\
                                reg, sr, so);                                   
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, 
FALSE);       \
                break;                                                          
\
                case 2:                                                         
\
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOADU2_MEMBASE,   
\
                                reg, sr, so);                                   
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, 
FALSE);       \
                break;                                                          
\
                case 4:                                                         
\
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     
\
                                reg, sr, so);                                   
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, 
FALSE);       \
                break;                                                          
\
                case 8:                                                         
\
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     
\
                                reg, sr, so);                                   
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
-                       dr++; so += sizeof(guint32);                            
\
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr, 
FALSE);       \
                        reg = mono_regstate_next_int (cfg->rs);                 
\
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP(cfg, OP_LOAD_MEMBASE,     
\
-                               reg, sr, so);                                   
\
-                       mono_call_inst_add_outarg_reg(s, call, reg, dr, FALSE); 
\
+                               reg, sr, so + sizeof (guint32));                
                        \
+                       mono_call_inst_add_outarg_reg(cfg, call, reg, dr + 1, 
FALSE);   \
                break;                                                          
\
        }                                                                       
\
 } while (0)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to