Mips registerised support
authorSimon Marlow <simonmar@microsoft.com>
Fri, 25 Aug 2006 08:57:12 +0000 (08:57 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Fri, 25 Aug 2006 08:57:12 +0000 (08:57 +0000)
Contributed by: Thiemo Seufer <ths@networkno.de>

includes/MachRegs.h
includes/TailCalls.h
rts/StgCRun.c

index 92944e1..793c642 100644 (file)
 
 #define REG(x) __asm__("$" #x)
 
-#define CALLER_SAVES_R1
-#define CALLER_SAVES_R2
-#define CALLER_SAVES_R3
-#define CALLER_SAVES_R4
 #define CALLER_SAVES_R5
 #define CALLER_SAVES_R6
 #define CALLER_SAVES_R7
 
 #define CALLER_SAVES_USER
 
-#define REG_R1         9
-#define REG_R2         10
-#define REG_R3         11
-#define REG_R4         12
-#define REG_R5         13
-#define REG_R6         14
-#define REG_R7         15
-#define REG_R8         24
+#define REG_R1         16
+#define REG_R2         17
+#define REG_R3         18
+#define REG_R4         19
+#define REG_R5         12
+#define REG_R6         13
+#define REG_R7         14
+#define REG_R8         15
 
 #define REG_F1         f20
 #define REG_F2         f22
 #define REG_D1         f28
 #define REG_D2         f30
 
-#define REG_Sp         16
-#define REG_SpLim      18
+#define REG_Sp         20
+#define REG_SpLim      21
+
+#define REG_Hp         22
+#define REG_HpLim      23
 
-#define REG_Hp         19
-#define REG_HpLim      20
+#define REG_Base       30
 
 #endif /* mipse[lb] */
 
index 670da95..7927359 100644 (file)
@@ -242,6 +242,29 @@ but uses $$dyncall if necessary to cope, just in case you aren't.
 #endif
 
 /* -----------------------------------------------------------------------------
+   Tail calling on MIPS
+   -------------------------------------------------------------------------- */
+
+#ifdef mips_HOST_ARCH
+
+#if IN_STG_CODE
+register void *_procedure __asm__("$25");
+#endif
+
+#define JMP_(cont)                             \
+    {                                          \
+       _procedure = (void *)(cont);            \
+       __DISCARD__();                          \
+       goto *_procedure;                       \
+    }
+
+/* Don't need these for MIPS mangling */
+#define FB_
+#define FE_
+
+#endif /* mips_HOST_ARCH */
+
+/* -----------------------------------------------------------------------------
   FUNBEGIN and FUNEND.
 
   These are markers indicating the start and end of Real Code in a
index 98116ab..302e910 100644 (file)
@@ -899,4 +899,37 @@ StgRunIsImplementedInAssembler(void)
 
 #endif
 
+/* -----------------------------------------------------------------------------
+   MIPS architecture
+   -------------------------------------------------------------------------- */
+
+#ifdef mips_HOST_ARCH
+
+StgThreadReturnCode
+StgRun(StgFunPtr f, StgRegTable *basereg)
+{
+    register StgThreadReturnCode __v0 __asm__("$2");
+
+    __asm__ __volatile__(
+       "       la      $25, %1                 \n"
+       "       move    $30, %2                 \n"
+       "       jr      %1                      \n"
+       "       .align 3                        \n"
+       "       .globl " STG_RETURN "           \n"
+       "       .aent " STG_RETURN "            \n"
+       STG_RETURN ":                           \n"
+       "       move    %0, $16                 \n"
+       "       move    $3, $17                 \n"
+       : "=r" (__v0),
+       : "r" (f), "r" (basereg)
+       "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
+       "$25", "$28", "$30",
+       "$f20", "$f22", "$f24", "$f26", "$f28", "$f30",
+       "memory");
+
+    return __v0;
+}
+
+#endif /* mips_HOST_ARCH */
+
 #endif /* !USE_MINIINTERPRETER */