[project @ 2002-09-25 20:44:23 by wolfgang]
[ghc-hetmet.git] / ghc / includes / TailCalls.h
index 2dbd99c..1e52be5 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $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
  *
@@ -85,9 +85,10 @@ extern void __DISCARD__(void);
 
 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 */
@@ -186,6 +187,21 @@ but uses $$dyncall if necessary to cope, just in case you aren't.
 #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