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

List:       mono-patches
Subject:    [Mono-patches] r47858 - trunk/mono/mono/mini
From:       "Zoltan Varga (vargaz AT freemail.hu)" <zoltan () mono-cvs ! ximian ! com>
Date:       2005-07-30 15:48:28
Message-ID: 20050730154828.CE2BA9472C () mono-cvs ! ximian ! com
[Download RAW message or body]

Author: zoltan
Date: 2005-07-30 11:48:28 -0400 (Sat, 30 Jul 2005)
New Revision: 47858

Modified:
   trunk/mono/mono/mini/inssel.brg
Log:
2005-07-30  Zoltan Varga  <vargaz@freemail.hu>

	* inssel.brg (mini_emit_memset): Add support for unaligned access.


Modified: trunk/mono/mono/mini/inssel.brg
===================================================================
--- trunk/mono/mono/mini/inssel.brg	2005-07-30 15:48:14 UTC (rev 47857)
+++ trunk/mono/mono/mini/inssel.brg	2005-07-30 15:48:28 UTC (rev 47858)
@@ -1818,6 +1818,42 @@
 	MONO_EMIT_NEW_COND_EXC (s, EQ, "InvalidCastException");
 }
 
+static int
+size_to_load_u_membase (int size)
+{
+	switch (size) {
+	case 1:
+		return OP_LOADU1_MEMBASE;
+	case 2:
+		return OP_LOADU2_MEMBASE;
+	case 4:
+		return OP_LOADU4_MEMBASE;
+	case 8:
+		return OP_LOADI8_MEMBASE;
+	default:
+		g_assert_not_reached ();
+		return -1;
+	}
+}
+
+static int
+size_to_store_membase_reg (int size)
+{
+	switch (size) {
+	case 1:
+		return OP_STOREI1_MEMBASE_REG;
+	case 2:
+		return OP_STOREI2_MEMBASE_REG;
+	case 4:
+		return OP_STOREI4_MEMBASE_REG;
+	case 8:
+		return OP_STOREI8_MEMBASE_REG;
+	default:
+		g_assert_not_reached ();
+		return -1;
+	}
+}
+
 void 
 mini_emit_memcpy (MonoCompile *s, int destreg, int doffset, int srcreg, int soffset, \
int size, int align)  {
@@ -1864,7 +1900,7 @@
 }
 
 void 
-mini_emit_memset (MonoCompile *s, int destreg, int offset, int size, int val, int \
alignl) +mini_emit_memset (MonoCompile *s, int destreg, int offset, int size, int \
val, int align)  {
 	int val_reg = mono_regstate_next_int (s->rs);
 
@@ -1873,13 +1909,21 @@
 	else
 		MONO_EMIT_NEW_ICONST (s, val_reg, val);
 
+	/* FIXME: consider alignment for archs that need it. */
+#if !NO_UNALIGNED_ACCESS
 	if (sizeof (gpointer) == 8) {
+		if (offset % 8) {
+			MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, destreg, offset, \
val_reg); +			offset += 4;
+			size -= 4;
+		}
 		while (size >= 8) {
 			MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI8_MEMBASE_REG, destreg, offset, \
val_reg);  offset += 8;
 			size -= 8;
 		}
 	}	
+#endif
 
 	while (size >= 4) {
 		MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, destreg, offset, val_reg);

_______________________________________________
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