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