Fri Nov 14 12:56:27 CET 2008 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Fri, 14 Nov 2008 11:59:03 +0000 (11:59 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Fri, 14 Nov 2008 11:59:03 +0000 (11:59 -0000)
* mini-ppc.c: portability fixes.

svn path=/trunk/mono/; revision=118844

mono/mini/ChangeLog
mono/mini/mini-ppc.c

index 0f245ad1d632bbb1b9f11e03408f41793d4a201e..e2e5f7ca30fc34851ef93533e4549d860b107402 100644 (file)
@@ -1,3 +1,8 @@
+
+Fri Nov 14 12:56:27 CET 2008 Paolo Molaro <lupus@ximian.com>
+
+       * mini-ppc.c: portability fixes.
+
 2008-11-14  Zoltan Varga  <vargaz@gmail.com>
 
        * mini-trampolines.c (mono_magic_trampoline): Move the patching of plt
index e7811ce9ca7d01694845f0ffcef99af28917196d..b87ab2f26b23aaaa73a1cf5a8e576343ca542e12 100644 (file)
@@ -571,7 +571,8 @@ typedef struct {
 void
 mono_arch_flush_icache (guint8 *code, gint size)
 {
-       guint8 *p, *endp, *start;
+       register guint8 *p;
+       guint8 *endp, *start;
        static int cachelinesize = 0;
        static int cachelineinc = 16;
 
@@ -604,6 +605,9 @@ mono_arch_flush_icache (guint8 *code, gint size)
                }
                if (!cachelinesize)
                        cachelinesize = 128;
+#elif defined(G_COMPILER_CODEWARRIOR)
+       cachelinesize = 32;
+       cachelineinc = 32;
 #else
 #warning Need a way to get cache line size
                cachelinesize = 128;
@@ -613,6 +617,29 @@ mono_arch_flush_icache (guint8 *code, gint size)
        endp = p + size;
        start = (guint8*)((gsize)start & ~(cachelinesize - 1));
        /* use dcbf for smp support, later optimize for UP, see pem._64bit.d20030611.pdf page 211 */
+#if defined(G_COMPILER_CODEWARRIOR)
+       if (1) {
+               for (p = start; p < endp; p += cachelineinc) {
+                       asm { dcbf 0, p };
+               }
+       } else {
+               for (p = start; p < endp; p += cachelineinc) {
+                       asm { dcbst 0, p };
+               }
+       }
+       asm { sync };
+       p = code;
+       for (p = start; p < endp; p += cachelineinc) {
+               asm {
+                       icbi 0, p
+                       sync
+               }
+       }
+       asm {
+               sync
+               isync
+       }
+#else
        if (1) {
                for (p = start; p < endp; p += cachelineinc) {
                        asm ("dcbf 0,%0;" : : "r"(p) : "memory");
@@ -629,6 +656,7 @@ mono_arch_flush_icache (guint8 *code, gint size)
        }
        asm ("sync");
        asm ("isync");
+#endif
 }
 
 void