* in libc.a clobbers $s6.
*/
#include "ghcconfig.h"
+#ifndef USE_MINIINTERPRETER
#ifdef alpha_HOST_ARCH
#define alpha_EXTRA_CAREFUL
register long fake_ra __asm__("$26");
register double fake_f9 __asm__("$f9");
#endif
#endif
+#endif
/* include Stg.h first because we want real machine regs in here: we
* have to get the value of R1 back from Stg land to C land intact.
StgRegTable * StgRun(StgFunPtr f, StgRegTable *basereg STG_UNUSED)
{
while (f) {
+ /* XXX Disabled due to RtsFlags[]/RtsFlags mismatch
IF_DEBUG(interpreter,
debugBelch("Jumping to ");
printPtr((P_)f); fflush(stdout);
debugBelch("\n");
);
+ */
f = (StgFunPtr) (f)();
}
return (StgRegTable *)R1.p;
#else /* !USE_MINIINTERPRETER */
#ifdef LEADING_UNDERSCORE
+#define STG_RUN "_StgRun"
+#else
+#define STG_RUN "StgRun"
+#endif
+
+#ifdef LEADING_UNDERSCORE
#define STG_RETURN "_StgReturn"
#else
#define STG_RETURN "StgReturn"
/*
* save callee-saves registers on behalf of the STG code.
*/
- ".globl StgRun\n"
- "StgRun:\n\t"
+ ".globl " STG_RUN "\n"
+ STG_RUN ":\n\t"
"subq %0, %%rsp\n\t"
"movq %%rsp, %%rax\n\t"
"addq %0-48, %%rax\n\t"
"movq %%rdi,%%rax\n\t"
"jmp *%%rax\n\t"
- ".global " STG_RETURN "\n"
+ ".globl " STG_RETURN "\n"
STG_RETURN ":\n\t"
"movq %%rbx, %%rax\n\t" /* Return value in R1 */
#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 */