X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FTailCalls.h;h=1f562ebc83fcf9103d78ab98e3409b9ace267e4b;hb=dff9bb4f02554f39d73faea100a35c2d1dd07556;hp=2dbd99c490df46969bdd21b8e29d6b367e210fc3;hpb=19f8036efd024ccf19cdf8426853b21e0467d0c5;p=ghc-hetmet.git diff --git a/ghc/includes/TailCalls.h b/ghc/includes/TailCalls.h index 2dbd99c..1f562eb 100644 --- a/ghc/includes/TailCalls.h +++ b/ghc/includes/TailCalls.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: TailCalls.h,v 1.9 2002/05/28 09:22:08 wolfgang Exp $ + * $Id: TailCalls.h,v 1.12 2003/01/06 13:11:26 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -51,10 +51,10 @@ extern void __DISCARD__(void); #define JMP_(cont) \ { \ - void *target; \ + void *__target; \ __DISCARD__(); \ - target = (void *)(cont); \ - goto *target; \ + __target = (void *)(cont); \ + goto *__target; \ } #endif /* i386_TARGET_ARCH */ @@ -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