#ifdef ia64_HOST_ARCH
/* The compiler can more intelligently decide how to do this. We therefore
- * implement it as a call and optimise to a jump at mangle time. */
-#define JMP_(cont) ((F_) (cont))(); __asm__ volatile ("--- TAILCALL ---");
+ * implement it as a call and optimise to a jump at mangle time.
+ *
+ * Sometimes GCC likes to move instructions between the function call and
+ * the "--- TAILCALL ---". To stop it from finding instructions to put
+ * there, we insert a jump to the end of the function after the TAILCALL. */
+#define JMP_(cont) \
+ ((F_) (cont))(); \
+ __asm__ volatile ("--- TAILCALL ---"); \
+ goto _function_end;
+
+#define FE_ _function_end: __asm__ volatile ("--- END ---");
/* Don't emit calls to __DISCARD__ as this causes hassles */
#define __DISCARD__()
#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