Author: zoltan
Date: 2005-04-12 15:18:08 -0400 (Tue, 12 Apr 2005)
New Revision: 42864

Modified:
   branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/ChangeLog
   branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/inssel-amd64.brg
   branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-amd64.c
   branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-codegen.c
   branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini.h
Log:
2005-04-12  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini.h mini-amd64.c inssel-amd64.brg mini-codegen.c: Add new helper 
function
        to add a register to the argument registers used for a call. Change the
        encoding of the hreg-vreg pair to also work on 32 bit platforms.


Modified: branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/ChangeLog
===================================================================
--- branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/ChangeLog     
2005-04-12 19:06:07 UTC (rev 42863)
+++ branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/ChangeLog     
2005-04-12 19:18:08 UTC (rev 42864)
@@ -1,5 +1,9 @@
 2005-04-12  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * mini.h mini-amd64.c inssel-amd64.brg mini-codegen.c: Add new helper 
function
+       to add a register to the argument registers used for a call. Change the
+       encoding of the hreg-vreg pair to also work on 32 bit platforms.
+
        * mini.h mini-codegen.c mini-amd64.c: Rename mono_arch_regname_full () 
to
        mono_regname_full () and move it to mini-codegen.c.
 

Modified: branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/inssel-amd64.brg
===================================================================
--- branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/inssel-amd64.brg      
2005-04-12 19:06:07 UTC (rev 42863)
+++ branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/inssel-amd64.brg      
2005-04-12 19:18:08 UTC (rev 42864)
@@ -202,15 +202,13 @@
 
 stmt: OP_OUTARG_REG (reg) {    
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
 
        tree->opcode = OP_SETREG;
        tree->sreg1 = state->left->reg1;
        tree->dreg = mono_regstate_next_int (s->rs);
        mono_bblock_add_inst (s->cbb, tree);
 
-       regpair = (((guint64)tree->unused) << 32) + tree->dreg;
-       call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
 }
 
 stmt: OP_OUTARG_REG (CEE_LDIND_I (base)),
@@ -223,7 +221,6 @@
 stmt: OP_OUTARG_REG (CEE_LDIND_U4 (base)),
 stmt: OP_OUTARG_REG (CEE_LDIND_I8 (base)) {
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
        guint32 dreg;
        MonoInst *base = state->left->left->tree;
 
@@ -231,22 +228,19 @@
        MONO_EMIT_LOAD_MEMBASE_OP (s, tree, ldind_to_load_membase 
(state->left->tree->opcode),
                                        dreg, base->inst_basereg, 
base->inst_offset);
 
-       regpair = (((guint64)tree->unused) << 32) + dreg;
-       call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
 }
 
 stmt: OP_OUTARG_REG (OP_I8CONST),
 stmt: OP_OUTARG_REG (OP_ICONST) {      
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
 
        tree->opcode = OP_ICONST;
        tree->inst_c0 = state->left->tree->inst_c0;
        tree->dreg = mono_regstate_next_int (s->rs);
        mono_bblock_add_inst (s->cbb, tree);
 
-       regpair = (((guint64)tree->unused) << 32) + tree->dreg;
-       call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
 }
 
 stmt: OP_OUTARG_REG (CEE_LDIND_I (OP_REGVAR)),
@@ -255,15 +249,13 @@
 stmt: OP_OUTARG_REG (CEE_LDIND_U4 (OP_REGVAR)),
 stmt: OP_OUTARG_REG (CEE_LDIND_REF (OP_REGVAR)) {      
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
 
        tree->opcode = OP_SETREG;
        tree->sreg1 = state->left->left->tree->dreg;
        tree->dreg = mono_regstate_next_int (s->rs);
        mono_bblock_add_inst (s->cbb, tree);
 
-       regpair = (((guint64)tree->unused) << 32) + tree->dreg;
-       call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, FALSE);
 }
 
 # we need to reduce this code duplication with some burg syntax extension
@@ -360,28 +352,24 @@
 
 stmt: OP_AMD64_OUTARG_XMMREG_R4 (freg) {
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
 
        tree->opcode = OP_AMD64_SET_XMMREG_R4;
        tree->sreg1 = state->left->reg1;
        tree->dreg = mono_regstate_next_float (s->rs);
        mono_bblock_add_inst (s->cbb, tree);
 
-       regpair = (((guint64)tree->unused) << 32) + tree->dreg;
-       call->out_freg_args = g_slist_append (call->out_freg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, TRUE);
 }
 
 stmt: OP_AMD64_OUTARG_XMMREG_R8 (freg) {
        MonoCallInst *call = (MonoCallInst*)tree->inst_right;
-       guint64 regpair;
 
        tree->opcode = OP_AMD64_SET_XMMREG_R8;
        tree->sreg1 = state->left->reg1;
        tree->dreg = mono_regstate_next_float (s->rs);
        mono_bblock_add_inst (s->cbb, tree);
 
-       regpair = (((guint64)tree->unused) << 32) + tree->dreg;
-       call->out_freg_args = g_slist_append (call->out_freg_args, 
(gpointer)(regpair));
+       mono_call_inst_add_outarg_reg (call, tree->dreg, tree->unused, TRUE);
 }
 
 stmt: OP_OUTARG_VT (CEE_LDOBJ (base)) {

Modified: branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-amd64.c
===================================================================
--- branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-amd64.c  
2005-04-12 19:06:07 UTC (rev 42863)
+++ branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-amd64.c  
2005-04-12 19:18:08 UTC (rev 42864)
@@ -4692,8 +4692,7 @@
                        vtarg->dreg = mono_regstate_next_int (cfg->rs);
                        mono_bblock_add_inst (cfg->cbb, vtarg);
 
-                       regpair = (((guint64)out_reg) << 32) + vtarg->dreg;
-                       call->out_ireg_args = g_slist_append 
(call->out_ireg_args, (gpointer)(regpair));
+                       mono_call_inst_add_outarg_reg (call, vtarg->dreg, 
out_reg, FALSE);
 
                        out_reg = param_regs [1];
                }
@@ -4710,8 +4709,7 @@
                this->dreg = mono_regstate_next_int (cfg->rs);
                mono_bblock_add_inst (cfg->cbb, this);
 
-               regpair = (((guint64)out_reg) << 32) + this->dreg;
-               call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(regpair));
+               mono_call_inst_add_outarg_reg (call, this->dreg, out_reg, 
FALSE);
        }
 }
 

Modified: branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-codegen.c
===================================================================
--- branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-codegen.c        
2005-04-12 19:06:07 UTC (rev 42863)
+++ branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini-codegen.c        
2005-04-12 19:18:08 UTC (rev 42864)
@@ -43,6 +43,18 @@
                return mono_arch_regname (reg);
 }
 
+void
+mono_call_inst_add_outarg_reg (MonoCallInst *call, int vreg, int hreg, 
gboolean fp)
+{
+       guint32 regpair;
+
+       regpair = (((guint32)hreg) << 24) + vreg;
+       if (fp)
+               call->out_freg_args = g_slist_append (call->out_freg_args, 
(gpointer)(gssize)(regpair));
+       else
+               call->out_ireg_args = g_slist_append (call->out_ireg_args, 
(gpointer)(gssize)(regpair));
+}
+
 /*
  * returns the offset used by spillvar. It allocates a new
  * spill variable if necessary. 
@@ -681,12 +693,12 @@
                        list = call->out_ireg_args;
                        if (list) {
                                while (list) {
-                                       guint64 regpair;
+                                       guint32 regpair;
                                        int reg, hreg;
 
-                                       regpair = (guint64) (list->data);
-                                       hreg = regpair >> 32;
-                                       reg = regpair & 0xffffffff;
+                                       regpair = (guint32)(gssize)(list->data);
+                                       hreg = regpair >> 24;
+                                       reg = regpair & 0xffffff;
 
                                        reginfo [reg].prev_use = reginfo 
[reg].last_use;
                                        reginfo [reg].last_use = i;
@@ -698,12 +710,12 @@
                        list = call->out_freg_args;
                        if (!use_fpstack && list) {
                                while (list) {
-                                       guint64 regpair;
+                                       guint32 regpair;
                                        int reg, hreg;
 
-                                       regpair = (guint64) (list->data);
-                                       hreg = regpair >> 32;
-                                       reg = regpair & 0xffffffff;
+                                       regpair = (guint32)(gssize)(list->data);
+                                       hreg = regpair >> 24;
+                                       reg = regpair & 0xffffff;
 
                                        reginfof [reg].prev_use = reginfof 
[reg].last_use;
                                        reginfof [reg].last_use = i;
@@ -1065,12 +1077,12 @@
                        list = call->out_ireg_args;
                        if (list) {
                                while (list) {
-                                       guint64 regpair;
+                                       guint32 regpair;
                                        int reg, hreg;
 
-                                       regpair = (guint64) (list->data);
-                                       hreg = regpair >> 32;
-                                       reg = regpair & 0xffffffff;
+                                       regpair = (guint32)(gssize)(list->data);
+                                       hreg = regpair >> 24;
+                                       reg = regpair & 0xffffff;
 
                                        assign_reg (rs, reg, hreg, FALSE);
 
@@ -1084,12 +1096,12 @@
                        list = call->out_freg_args;
                        if (list && !use_fpstack) {
                                while (list) {
-                                       guint64 regpair;
+                                       guint32 regpair;
                                        int reg, hreg;
 
-                                       regpair = (guint64) (list->data);
-                                       hreg = regpair >> 32;
-                                       reg = regpair & 0xffffffff;
+                                       regpair = (guint32)(gssize)(list->data);
+                                       hreg = regpair >> 24;
+                                       reg = regpair & 0xffffff;
 
                                        assign_reg (rs, reg, hreg, TRUE);
 

Modified: branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini.h
===================================================================
--- branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini.h        
2005-04-12 19:06:07 UTC (rev 42863)
+++ branches/vargaz/mini-xp-local-regalloc/mono/mono/mini/mini.h        
2005-04-12 19:18:08 UTC (rev 42864)
@@ -838,6 +838,7 @@
 MonoCallInst *mono_arch_call_opcode             (MonoCompile *cfg, 
MonoBasicBlock* bb, MonoCallInst *call, int is_virtual);
 MonoInst *mono_arch_get_inst_for_method       (MonoCompile *cfg, MonoMethod 
*cmethod, MonoMethodSignature *fsig, MonoInst **args);
 void      mono_codegen                          (MonoCompile *cfg);
+void      mono_call_inst_add_outarg_reg         (MonoCallInst *call, int vreg, 
int hreg, gboolean fp);
 const char *mono_arch_regname                   (int reg);
 const char *mono_arch_fregname                  (int reg);
 gpointer  mono_arch_get_throw_exception         (void);

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

Reply via email to