[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mono-patches
Subject:    [Mono-patches] r120297 - trunk/mono/mono/mini
From:       "Mark E Mason (mark.e.mason () broadcom ! com)"
Date:       2008-11-30 5:16:48
Message-ID: 20081130051648.5F3D99472C () mono-cvs ! ximian ! com
[Download RAW message or body]

Author: markmason
Date: 2008-11-30 00:16:46 -0500 (Sun, 30 Nov 2008)
New Revision: 120297

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/cpu-mips.md
   trunk/mono/mono/mini/mini-mips.c
Log:
2008-11-29  Mark Mason   <mmason@upwardaccess.com>

        * cpu-mips.md: fix length on int_rem_un
        * mini-mips.c (mips_stackframe_adjust): fix insertion of spillvars region in \
MIPS stackframes.

Contributed under the MIT X11 license.



Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog	2008-11-30 05:08:59 UTC (rev 120296)
+++ trunk/mono/mono/mini/ChangeLog	2008-11-30 05:16:46 UTC (rev 120297)
@@ -1,3 +1,8 @@
+2008-11-29  Mark Mason   <mmason@upwardaccess.com>
+
+	* cpu-mips.md: fix length on int_rem_un
+	* mini-mips.c (mips_stackframe_adjust): fix insertion of spillvars region in MIPS \
stackframes. +	
 2008-11-29  Zoltan Varga  <vargaz@gmail.com>
 
 	* mini.h aot-runtime.c: Fix building with DISABLE_AOT.

Modified: trunk/mono/mono/mini/cpu-mips.md
===================================================================
--- trunk/mono/mono/mini/cpu-mips.md	2008-11-30 05:08:59 UTC (rev 120296)
+++ trunk/mono/mono/mini/cpu-mips.md	2008-11-30 05:16:46 UTC (rev 120297)
@@ -164,7 +164,7 @@
 int_div: dest:i src1:i src2:i len:76
 int_div_un: dest:i src1:i src2:i len:16
 int_rem: dest:i src1:i src2:i len:76
-int_rem_un: dest:i src1:i src2:i len:24
+int_rem_un: dest:i src1:i src2:i len:76
 int_and: dest:i src1:i src2:i len:4
 int_or: dest:i src1:i src2:i len:4
 int_xor: dest:i src1:i src2:i len:4

Modified: trunk/mono/mono/mini/mini-mips.c
===================================================================
--- trunk/mono/mono/mini/mini-mips.c	2008-11-30 05:08:59 UTC (rev 120296)
+++ trunk/mono/mono/mini/mini-mips.c	2008-11-30 05:16:46 UTC (rev 120297)
@@ -1413,7 +1413,15 @@
 	int i, soffset, dreg;
 
 	if (ainfo->regtype == RegTypeStructByVal) {
-		guint32 size = 0;
+#if 1
+		if (cfg->verbose_level > 0) {
+			char* nm = mono_method_full_name (cfg->method, TRUE);
+			g_print ("Method %s outarg_vt struct doffset=%d ainfo->size=%d ovf_size=%d\n", 
+				 nm, doffset, ainfo->size, ovf_size);
+			g_free (nm);
+		}
+#endif
+
 		soffset = 0;
 		for (i = 0; i < ainfo->size; ++i) {
 			dreg = mono_alloc_ireg (cfg);
@@ -1421,10 +1429,12 @@
 			mono_call_inst_add_outarg_reg (cfg, call, dreg, ainfo->reg + i, FALSE);
 			soffset += sizeof (gpointer);
 		}
-		if (ovf_size != 0)
-			mini_emit_memcpy (cfg, mips_at, doffset + soffset, src->dreg, soffset, ovf_size * \
sizeof (gpointer), 0); +		if (ovf_size != 0) {
+			mini_emit_memcpy (cfg, mips_fp, doffset + soffset, src->dreg, soffset, ovf_size * \
sizeof (gpointer), 0); +		}
 	} else if (ainfo->regtype == RegTypeFP) {
 		int tmpr = mono_alloc_freg (cfg);
+
 		if (ainfo->size == 4)
 			MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADR4_MEMBASE, tmpr, src->dreg, 0);
 		else
@@ -1494,7 +1504,6 @@
 {
 	MonoInst *ins, *n, *last_ins = NULL;
 	int op;
-	int tmp;
 
 	if (cfg->verbose_level > 2)
 		g_print ("Basic block %d peephole pass 1\n", bb->block_num);
@@ -1617,6 +1626,12 @@
 			ins_rewrite(ins, OP_MIPS_COND_EXC_LE_UN, last_ins->sreg1, last_ins->sreg2);
 			MONO_DELETE_INS(bb, last_ins);
 			break;
+
+		case OP_COND_EXC_OV:
+			g_assert (ins_is_compare(last_ins));
+			ins_rewrite(ins, OP_MIPS_COND_EXC_OV, last_ins->sreg1, last_ins->sreg2);
+			MONO_DELETE_INS(bb, last_ins);
+			break;
 		}
 		last_ins = ins;
 		ins = ins->next;
@@ -1957,7 +1972,6 @@
 mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
 {
 	MonoInst *ins, *next, *temp, *last_ins = NULL;
-	int tmp;
 	int imm;
 
 	MONO_BB_FOR_EACH_INS (bb, ins) {
@@ -2554,13 +2568,15 @@
 			mips_break (code, 0xfd);
 			break;
 		case OP_ADDCC:
-			g_assert_not_reached ();
+		case OP_IADDCC:
+			mips_addu (code, ins->dreg, ins->sreg1, ins->sreg2);
 			break;
 		case OP_IADD:
 			mips_addu (code, ins->dreg, ins->sreg1, ins->sreg2);
 			break;
 		case OP_ADC:
-			g_assert_not_reached ();
+		case OP_IADC:
+			mips_addu (code, ins->dreg, ins->sreg1, ins->sreg2);
 			break;
 		case OP_ADDCC_IMM:
 			g_assert_not_reached ();
@@ -2611,7 +2627,8 @@
 			}
 			break;
 		case OP_IDIV:
-		case OP_IREM: {
+		case OP_IREM:
+		case OP_IREM_UN: {
 			guint32 *divisor_is_m1;
 			guint32 *divisor_is_zero;
 
@@ -2642,6 +2659,24 @@
 				mips_mfhi (code, ins->dreg);
 			break;
 		}
+#if 0
+		case OP_IREM:
+		case OP_IREM_UN: {
+			guint32 *divisor_is_zero = (guint32 *)(void *)code;
+
+			/* Put divide in branch delay slot (NOT YET) */
+			mips_bne (code, ins->sreg2, mips_zero, 0);
+			mips_nop (code);
+
+			/* Divide by zero -- throw exception */
+			EMIT_SYSTEM_EXCEPTION_NAME("DivideByZeroException");
+
+			mips_patch (divisor_is_zero, (guint32)code);
+			mips_divu (code, ins->sreg1, ins->sreg2);
+			mips_mfhi (code, ins->dreg);
+			break;
+		}
+#endif
 		case CEE_DIV_UN: {
 			guint32 *divisor_is_zero = (guint32 *)(void *)code;
 
@@ -2669,21 +2704,6 @@
 #endif
 			g_assert_not_reached();
 			break;
-		case CEE_REM_UN: {
-			guint32 *divisor_is_zero = (guint32 *)(void *)code;
-
-			/* Put divide in branch delay slot (NOT YET) */
-			mips_bne (code, ins->sreg2, mips_zero, 0);
-			mips_nop (code);
-
-			/* Divide by zero -- throw exception */
-			EMIT_SYSTEM_EXCEPTION_NAME("DivideByZeroException");
-
-			mips_patch (divisor_is_zero, (guint32)code);
-			mips_divu (code, ins->sreg1, ins->sreg2);
-			mips_mfhi (code, ins->dreg);
-			break;
-		}
 		case OP_REM_IMM:
 			g_assert_not_reached ();
 		case OP_IOR:
@@ -3717,7 +3737,7 @@
 	MonoBasicBlock *bb;
 	int delta, threshold, i;
 	MonoMethodSignature *sig;
-	int verbose = (cfg->verbose_level > 2);
+	int ra_offset;
 
 	if (cfg->stack_offset == cfg->arch.local_alloc_offset)
 		return;
@@ -3728,11 +3748,15 @@
 	/* re-align cfg->stack_offset if needed (due to var spilling) */
 	cfg->stack_offset = (cfg->stack_offset + MIPS_STACK_ALIGNMENT - 1) & \
~(MIPS_STACK_ALIGNMENT - 1);  delta = cfg->stack_offset - \
                cfg->arch.local_alloc_offset;
-	if (verbose) {
+	if (cfg->verbose_level > 2) {
 		g_print ("mips_adjust_stackframe:\n");
-		g_print ("\tspillvars allocated 0x%x -> 0x%x (+%d)\n", \
cfg->arch.local_alloc_offset, cfg->stack_offset, delta); +		g_print ("\tspillvars \
allocated 0x%x -> 0x%x\n", cfg->arch.local_alloc_offset, cfg->stack_offset);  }
-	threshold = cfg->arch.local_alloc_offset - 4;
+	threshold = cfg->arch.local_alloc_offset;
+	ra_offset = cfg->stack_offset - 4;
+	if (cfg->verbose_level > 2) {
+		g_print ("\tra_offset %d/0x%x delta %d/0x%x\n", ra_offset, ra_offset, delta, \
delta); +	}
 
 #if 0
 	if (sig && sig->ret && MONO_TYPE_ISSTRUCT (sig->ret)) {
@@ -3767,28 +3791,29 @@
 		int ins_cnt = 0;
 		MonoInst *ins;
 
-		if (verbose) {
+		if (cfg->verbose_level > 2) {
 			g_print ("BASIC BLOCK %d:\n", bb->block_num);
 		}
 		MONO_BB_FOR_EACH_INS (bb, ins) {
-			if (verbose) {
+			if (cfg->verbose_level > 2) {
 				mono_print_ins_index (ins_cnt, ins);
 			}
 			if ((MONO_IS_LOAD_MEMBASE(ins) && (ins->inst_basereg == mips_fp)) || \
                (MONO_IS_STORE_MEMBASE(ins) && (ins->dreg == mips_fp))) {
-				if (ins->inst_c0 > threshold) {
+				if (ins->inst_c0 >= threshold) {
 					ins->inst_c0 += delta;
-					if (verbose) {
+					if (cfg->verbose_level > 2) {
 						g_print ("adj");
 						mono_print_ins_index (ins_cnt, ins);
 					}
 				}
 				else if (ins->inst_c0 < 0) {
-					ins->inst_c0 = - ins->inst_c0;
-					if (verbose) {
+					ins->inst_c0 = - ins->inst_c0 - 4;
+					if (cfg->verbose_level > 2) {
 						g_print ("spill");
 						mono_print_ins_index (ins_cnt, ins);
 					}
 				}
+				g_assert (ins->inst_c0 != ra_offset);
 			}
 			++ins_cnt;
 		}

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic