Author: zoltan
Date: 2008-02-16 11:26:48 -0500 (Sat, 16 Feb 2008)
New Revision: 95899

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-s390.c
Log:
2008-02-16  Zoltan Varga  <[EMAIL PROTECTED]>

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


Modified: branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-16 
16:23:32 UTC (rev 95898)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/ChangeLog     2008-02-16 
16:26:48 UTC (rev 95899)
@@ -1,3 +1,7 @@
+2008-02-16  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * mini-s390.c cpu-s390.md: Ongoing s390 work.
+
 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/cpu-s390.md
===================================================================
--- branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md   2008-02-16 
16:23:32 UTC (rev 95898)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/cpu-s390.md   2008-02-16 
16:26:48 UTC (rev 95899)
@@ -317,4 +317,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
+long_conv_to_ovf_i4_2: dest:i src1:i src2:i len:44
+
+vcall2: len:8 clob:c
+vcall2_membase: src1:b len:12 clob:c
+vcall2_reg: src1:i len:8 clob:c

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-16 
16:23:32 UTC (rev 95898)
+++ branches/vargaz/mini-linear-il/mono/mono/mini/mini-s390.c   2008-02-16 
16:26:48 UTC (rev 95899)
@@ -1671,8 +1671,22 @@
        cinfo   = calculate_sizes (cfg, sig, &sz, sig->pinvoke);
 
        if (cinfo->struct_ret) {
-               cfg->ret->opcode = OP_REGVAR;
-               cfg->ret->inst_c0 = s390_r2;
+               if (cfg->new_ir) {
+                       /* 
+                        * In the new IR, the cfg->vret_addr variable 
represents the
+                        * vtype return value.
+                        */
+                       cfg->vret_addr->opcode = OP_REGOFFSET;
+                       cfg->vret_addr->inst_basereg = cfg->frame_reg;
+                       cfg->vret_addr->inst_offset = cinfo->ret.offset;
+                       if (G_UNLIKELY (cfg->verbose_level > 1)) {
+                               printf ("vret_addr =");
+                               mono_print_ins (cfg->vret_addr);
+                       }
+               } else {
+                       cfg->ret->opcode = OP_REGVAR;
+                       cfg->ret->inst_c0 = s390_r2;
+               }
        } else {
                switch (mono_type_get_underlying_type (sig->ret)->type) {
                case MONO_TYPE_VOID:
@@ -1693,7 +1707,7 @@
        offset          = (cfg->param_area + S390_MINIMAL_STACK_SIZE);
        cfg->sig_cookie = 0;
 
-       if (cinfo->struct_ret) {
+       if (cinfo->struct_ret && !cfg->new_ir) {
                inst               = cfg->ret;
                offset             = S390_ALIGN(offset, sizeof(gpointer));
                inst->inst_offset  = offset;
@@ -1729,49 +1743,72 @@
                if (inst->opcode != OP_REGVAR) {
                        switch (cinfo->args[iParm].regtype) {
                                case RegTypeStructByAddr :
-                               if (cinfo->args[iParm].reg == STK_BASE) {
-                                       inst->opcode       = OP_S390_LOADARG;
-                                       inst->inst_basereg = frame_reg;
-                                       size               = 
abs(cinfo->args[iParm].vtsize);
-                                       offset             = S390_ALIGN(offset, 
sizeof(long));
-                                       inst->inst_offset  = offset; 
-                                       inst->backend.arg_info       = 
cinfo->args[iParm].offset;
-                               } else {
-                                       inst->opcode       = OP_S390_ARGREG;
-                                       inst->inst_basereg = frame_reg;
-                                       size               = sizeof(gpointer);
-                                       offset             = S390_ALIGN(offset, 
size);
-                                       inst->inst_offset  = offset;
-                                       inst->backend.arg_info       = 
cinfo->args[iParm].offset;
-                               }
+                                       if (cfg->new_ir) {
+                                               inst->opcode = OP_REGOFFSET;
+                                               inst->inst_basereg = frame_reg;
+                                               inst->inst_offset = 
S390_ALIGN(offset, sizeof (gpointer));
+                                       } else {
+                                               if (cinfo->args[iParm].reg == 
STK_BASE) {
+                                                       inst->opcode       = 
OP_S390_LOADARG;
+                                                       inst->inst_basereg = 
frame_reg;
+                                                       size               = 
abs(cinfo->args[iParm].vtsize);
+                                                       offset             = 
S390_ALIGN(offset, sizeof(long));
+                                                       inst->inst_offset  = 
offset; 
+                                                       inst->backend.arg_info  
     = cinfo->args[iParm].offset;
+                                               } else {
+                                                       inst->opcode       = 
OP_S390_ARGREG;
+                                                       inst->inst_basereg = 
frame_reg;
+                                                       size               = 
sizeof(gpointer);
+                                                       offset             = 
S390_ALIGN(offset, size);
+                                                       inst->inst_offset  = 
offset;
+                                                       inst->backend.arg_info  
     = cinfo->args[iParm].offset;
+                                               }
+                                       }
                                        break;
                                case RegTypeStructByVal :
-                                       inst->opcode       = OP_S390_ARGPTR;
-                                       inst->inst_basereg = frame_reg;
-                                       size               = 
cinfo->args[iParm].size;
-                                       offset             = S390_ALIGN(offset, 
size);
-                                       inst->inst_offset  = offset;
-                                       inst->backend.arg_info       = 
cinfo->args[iParm].offset;
+                                       if (cfg->new_ir) {
+                                               size               = 
cinfo->args[iParm].size;
+                                               inst->opcode = OP_REGOFFSET;
+                                               inst->inst_basereg = frame_reg;
+                                               inst->inst_offset = S390_ALIGN 
(offset, size);
+                                       } else {
+                                               inst->opcode       = 
OP_S390_ARGPTR;
+                                               inst->inst_basereg = frame_reg;
+                                               size               = 
cinfo->args[iParm].size;
+                                               offset             = 
S390_ALIGN(offset, size);
+                                               inst->inst_offset  = offset;
+                                               inst->backend.arg_info       = 
cinfo->args[iParm].offset;
+                                       }
                                        break;
                                default :
-                               if (cinfo->args[iParm].reg != STK_BASE) {
-                                       inst->opcode       = OP_REGOFFSET;
-                                       inst->inst_basereg = frame_reg;
-                                       size               = 
(cinfo->args[iParm].size < 8
-                                                             ? sizeof(long)  
-                                                             : sizeof(long 
long));
-                                       offset             = S390_ALIGN(offset, 
size);
-                                       inst->inst_offset  = offset;
-                               } else {
-                                       inst->opcode       = OP_S390_STKARG;
-                                       inst->inst_basereg = frame_reg;
-                                       size               = 
(cinfo->args[iParm].size < 4
-                                                             ? 4 - 
cinfo->args[iParm].size
-                                                             : 0);
-                                       inst->inst_offset  = 
cinfo->args[iParm].offset + 
-                                                            size;
-                                       inst->backend.arg_info       = 0;
-                                       size               = sizeof(long);
+                                       if (cfg->new_ir) {
+                                               inst->opcode       = 
OP_REGOFFSET;
+                                               inst->inst_basereg = frame_reg;
+                                               size               = 
(cinfo->args[iParm].size < 8
+                                                                               
  ? sizeof(long)  
+                                                                               
  : sizeof(long long));
+                                               offset             = 
S390_ALIGN(offset, size);
+                                               inst->inst_offset  = offset;
+                                       } else {
+                                               if (cinfo->args[iParm].reg != 
STK_BASE) {
+                                                       inst->opcode       = 
OP_REGOFFSET;
+                                                       inst->inst_basereg = 
frame_reg;
+                                                       size               = 
(cinfo->args[iParm].size < 8
+                                                                               
          ? sizeof(long)  
+                                                                               
          : sizeof(long long));
+                                                       offset             = 
S390_ALIGN(offset, size);
+                                                       inst->inst_offset  = 
offset;
+                                               } else {
+                                                       inst->opcode       = 
OP_S390_STKARG;
+                                                       inst->inst_basereg = 
frame_reg;
+                                                       size               = 
(cinfo->args[iParm].size < 4
+                                                                               
          ? 4 - cinfo->args[iParm].size
+                                                                               
          : 0);
+                                                       inst->inst_offset  = 
cinfo->args[iParm].offset + 
+                                                               size;
+                                                       inst->backend.arg_info  
     = 0;
+                                                       size               = 
sizeof(long);
+                                               }
                                } 
                        }
                        if ((sig->call_convention == MONO_CALL_VARARG) && 
@@ -1840,7 +1877,23 @@
 void
 mono_arch_create_vars (MonoCompile *cfg)
 {
-       // FIXME:
+       MonoMethodSignature *sig;
+       CallInfo *cinfo;
+       size_data sz;
+
+       sig = mono_method_signature (cfg->method);
+
+       cinfo = calculate_sizes (cfg, sig, &sz, sig->pinvoke);
+
+       if (cfg->new_ir && cinfo->struct_ret) {
+               cfg->vret_addr = mono_compile_create_var (cfg, 
&mono_defaults.int_class->byval_arg, OP_ARG);
+               if (G_UNLIKELY (cfg->verbose_level > 1)) {
+                       printf ("vret_addr = ");
+                       mono_print_ins (cfg->vret_addr);
+               }
+       }
+
+       g_free (cinfo);
 }
 
 /*========================= End of Function ========================*/
@@ -2051,9 +2104,11 @@
        cfg->flags       |= MONO_CFG_HAS_CALLS;
 
        if (cinfo->struct_ret) {
-               // FIXME:
-               NOT_IMPLEMENTED;
-               call->used_iregs |= 1 << cinfo->ret.reg;
+               MONO_INST_NEW (cfg, ins, OP_MOVE);
+               ins->sreg1 = call->vret_var->dreg;
+               ins->dreg = mono_alloc_preg (cfg);
+               MONO_ADD_INS (cfg->cbb, ins);
+               mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, 
cinfo->ret.reg, FALSE);
        }
 
        for (i = 0; i < n; ++i) {
@@ -2097,7 +2152,8 @@
                                ainfo->regtype = RegTypeFPR4;
                        add_outarg_reg2 (cfg, call, ainfo->regtype, ainfo->reg, 
in);
                        break;
-               case RegTypeStructByVal: {
+               case RegTypeStructByVal:
+               case RegTypeStructByAddr: {
                        guint32 align;
                        guint32 size;
 
@@ -2157,6 +2213,16 @@
                        MONO_ADD_INS (cfg->cbb, ins);
                        break;
                }
+               case RegTypeBase:
+                       if (!t->byref && (t->type == MONO_TYPE_I8 || t->type == 
MONO_TYPE_U8 || t->type == MONO_TYPE_R4 || t->type == MONO_TYPE_R8))
+                               NOT_IMPLEMENTED;
+
+                       MONO_INST_NEW (cfg, ins, OP_STORE_MEMBASE_REG);
+                       ins->inst_destbasereg = STK_BASE;
+                       ins->inst_offset = ainfo->offset;
+                       ins->sreg1 = in->dreg;
+                       MONO_ADD_INS (cfg->cbb, ins);
+                       break;
                default:
                        // FIXME:
                        NOT_IMPLEMENTED;
@@ -2247,7 +2313,6 @@
 void
 mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
 {
-       MonoInst *arg;
        MonoCallInst *call = (MonoCallInst*)ins->inst_p0;
        ArgInfo *ainfo = (ArgInfo*)ins->inst_p1;
        int size = ins->backend.size;
@@ -2270,7 +2335,7 @@
                                          src->dreg, 0);
                }       
        } else {
-               g_assert_not_reached ();
+               mini_emit_memcpy2 (cfg, ainfo->reg, ainfo->offset, src->dreg, 
0, size, 4);
        }
 }
 
@@ -3787,6 +3852,7 @@
                        break;
                case OP_LCALL:
                case OP_VCALL:
+               case OP_VCALL2:
                case OP_VOIDCALL:
                case OP_CALL: {
                        call = (MonoCallInst*)ins;
@@ -3807,6 +3873,7 @@
                        break;
                case OP_LCALL_REG:
                case OP_VCALL_REG:
+               case OP_VCALL2_REG:
                case OP_VOIDCALL_REG:
                case OP_CALL_REG: {
                        s390_lr   (code, s390_r1, ins->sreg1);
@@ -3823,6 +3890,7 @@
                        break;
                case OP_LCALL_MEMBASE:
                case OP_VCALL_MEMBASE:
+               case OP_VCALL2_MEMBASE:
                case OP_VOIDCALL_MEMBASE:
                case OP_CALL_MEMBASE: {
                        s390_l    (code, s390_r1, 0, ins->sreg1, 
ins->inst_offset);
@@ -4725,7 +4793,10 @@
 
        if (cinfo->struct_ret) {
                ArgInfo *ainfo = &cinfo->ret;
-               inst         = cfg->ret;
+               if (cfg->new_ir)
+                       inst = cfg->vret_addr;
+               else
+                       inst         = cfg->ret;
                inst->backend.size = ainfo->vtsize;
                s390_st (code, ainfo->reg, 0, inst->inst_basereg, 
inst->inst_offset);
        }

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

Reply via email to