make StgReturn and cas functions Thumb friendly
authorKarel Gardas <karel.gardas@centrum.cz>
Tue, 5 Jul 2011 18:12:14 +0000 (20:12 +0200)
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>
Wed, 10 Aug 2011 12:03:41 +0000 (22:03 +1000)
includes/stg/SMP.h
rts/StgCRun.c

index 0b7592d..4770db9 100644 (file)
@@ -216,8 +216,10 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
         "1:     ldrex   %1, [%2]\n"
         "       mov     %0, #0\n"
         "       teq     %1, %3\n"
+        "       it      eq\n"
         "       strexeq %0, %4, [%2]\n"
         "       teq     %0, #1\n"
+        "       it      eq\n"
         "       beq     1b\n"
                 : "=&r"(tmp), "=&r"(result)
                 : "r"(p), "r"(o), "r"(n)
index 9e976ef..6182775 100644 (file)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------------
  *
- * (c) The GHC Team, 1998-2003
+ * (c) The GHC Team, 1998-2011
  *
  * STG-to-C glue.
  *
@@ -982,6 +982,13 @@ StgRun(StgFunPtr f, StgRegTable *basereg)
    -------------------------------------------------------------------------- */
 
 #ifdef arm_HOST_ARCH
+
+#if defined(__thumb__)
+#define THUMB_FUNC ".thumb\n\t.thumb_func\n\t"
+#else
+#define THUMB_FUNC
+#endif
+
 StgRegTable *
 StgRun(StgFunPtr f, StgRegTable *basereg) {
     StgRegTable * r;
@@ -1003,9 +1010,11 @@ StgRun(StgFunPtr f, StgRegTable *basereg) {
         /*
          * Jump to function argument.
          */
-        "mov pc, %1\n\t"
+        "bx %1\n\t"
 
-       ".global " STG_RETURN "\n"
+       ".global " STG_RETURN "\n\t"
+        THUMB_FUNC
+        ".type " STG_RETURN ", %%function\n"
                STG_RETURN ":\n\t"
         /*
          * Free the space we allocated