X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FTailCalls.h;h=13eea0e48043f31c678c78475ebcd97bd2bb6859;hb=153b9cb9b11e05c4edb1b6bc0a7b972660e41f70;hp=2dbd99c490df46969bdd21b8e29d6b367e210fc3;hpb=19f8036efd024ccf19cdf8426853b21e0467d0c5;p=ghc-hetmet.git diff --git a/ghc/includes/TailCalls.h b/ghc/includes/TailCalls.h index 2dbd99c..13eea0e 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.18 2005/01/28 12:55:54 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -16,7 +16,7 @@ #ifdef USE_MINIINTERPRETER -#define JMP_(cont) return(stgCast(StgFunPtr,cont)) +#define JMP_(cont) return((StgFunPtr)(cont)) #define FB_ #define FE_ @@ -28,7 +28,7 @@ extern void __DISCARD__(void); Tail calling on x86 -------------------------------------------------------------------------- */ -#if i386_TARGET_ARCH +#if i386_HOST_ARCH /* Note about discard: possibly there to fool GCC into clearing up before we do the jump eg. if there are some arguments left on the C @@ -51,19 +51,34 @@ extern void __DISCARD__(void); #define JMP_(cont) \ { \ - void *target; \ + void *__target; \ __DISCARD__(); \ - target = (void *)(cont); \ - goto *target; \ + __target = (void *)(cont); \ + goto *__target; \ + } + +#endif /* i386_HOST_ARCH */ + +/* ----------------------------------------------------------------------------- + Tail calling on x86_64 + -------------------------------------------------------------------------- */ + +#if x86_64_HOST_ARCH + +#define JMP_(cont) \ + { \ + void *__target; \ + __target = (void *)(cont); \ + goto *__target; \ } -#endif /* i386_TARGET_ARCH */ +#endif /* x86_64_HOST_ARCH */ /* ----------------------------------------------------------------------------- Tail calling on Sparc -------------------------------------------------------------------------- */ -#ifdef sparc_TARGET_ARCH +#ifdef sparc_HOST_ARCH #define JMP_(cont) ((F_) (cont))() /* Oh so happily, the above turns into a "call" instruction, @@ -75,26 +90,29 @@ extern void __DISCARD__(void); #define FB_ #define FE_ -#endif /* sparc_TARGET_ARCH */ +#endif /* sparc_HOST_ARCH */ /* ----------------------------------------------------------------------------- Tail calling on Alpha -------------------------------------------------------------------------- */ -#ifdef alpha_TARGET_ARCH +#ifdef alpha_HOST_ARCH +#if IN_STG_CODE register void *_procedure __asm__("$27"); +#endif -#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 */ #define FB_ #define FE_ -#endif /* alpha_TARGET_ARCH */ +#endif /* alpha_HOST_ARCH */ /* ----------------------------------------------------------------------------- Tail calling on HP @@ -155,7 +173,7 @@ but uses $$dyncall if necessary to cope, just in case you aren't. Tail calling on PowerPC -------------------------------------------------------------------------- */ -#ifdef powerpc_TARGET_ARCH +#ifdef powerpc_HOST_ARCH #define JMP_(cont) \ { \ @@ -183,7 +201,26 @@ but uses $$dyncall if necessary to cope, just in case you aren't. #define JMP_(cont) ((F_) (cont))() */ -#endif /* powerpc_TARGET_ARCH */ +#endif /* powerpc_HOST_ARCH */ + +#ifdef powerpc64_HOST_ARCH +#define JMP_(cont) ((F_) (cont))() +#endif + +/* ----------------------------------------------------------------------------- + Tail calling on IA64 + -------------------------------------------------------------------------- */ + +#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 ---"); + +/* Don't emit calls to __DISCARD__ as this causes hassles */ +#define __DISCARD__() + +#endif /* ----------------------------------------------------------------------------- FUNBEGIN and FUNEND.