/* -----------------------------------------------------------------------------
- * $Id: TailCalls.h,v 1.9 2002/05/28 09:22:08 wolfgang Exp $
+ * $Id: TailCalls.h,v 1.11 2002/08/21 22:06:03 ken Exp $
*
* (c) The GHC Team, 1998-1999
*
register void *_procedure __asm__("$27");
-#define JMP_(cont) \
- do { _procedure = (void *)(cont); \
- goto *_procedure; \
+#define JMP_(cont) \
+ do { _procedure = (void *)(cont); \
+ __DISCARD__(); \
+ goto *_procedure; \
} while(0)
/* Don't need these for alpha mangling */
#endif /* powerpc_TARGET_ARCH */
/* -----------------------------------------------------------------------------
+ Tail calling on IA64
+ -------------------------------------------------------------------------- */
+
+#ifdef ia64_TARGET_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 ---");
+
+/* Don't emit calls to __DISCARD__ as this causes hassles */
+#define __DISCARD__()
+
+#endif
+
+/* -----------------------------------------------------------------------------
FUNBEGIN and FUNEND.
These are markers indicating the start and end of Real Code in a