X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FRegs.h;h=4c2f911eb517f3c362214d100d4d580618771bf3;hb=8b356754aa206277c2b9f928b038bdb97a6e8aa3;hp=c6831372c328b1f544f298fad75e3d8e520b5d28;hpb=e77996aa35993a6c54a5b2e9dee813f223912bbf;p=ghc-hetmet.git diff --git a/ghc/includes/Regs.h b/ghc/includes/Regs.h index c683137..4c2f911 100644 --- a/ghc/includes/Regs.h +++ b/ghc/includes/Regs.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Regs.h,v 1.7 1999/11/09 15:57:39 simonmar Exp $ + * $Id: Regs.h,v 1.9 2000/03/23 17:45:31 simonpj Exp $ * * (c) The GHC Team, 1998-1999 * @@ -25,6 +25,13 @@ * 2) caller-saves registers are saved across a CCall */ +typedef struct StgSparkPool_ { + StgClosure **base; + StgClosure **lim; + StgClosure **hd; + StgClosure **tl; +} StgSparkPool; + typedef struct StgRegTable_ { StgUnion rR1; StgUnion rR2; @@ -51,8 +58,11 @@ typedef struct StgRegTable_ { StgTSO *rCurrentTSO; struct _bdescr *rNursery; struct _bdescr *rCurrentNursery; -#ifdef SMP - struct StgRegTable_ *link; +#if defined(SMP) || defined(PAR) + StgSparkPool rSparks; /* per-task spark pool */ +#endif +#if defined(SMP) + struct StgRegTable_ *link; /* per-task register tables are linked together */ #endif } StgRegTable; @@ -103,6 +113,12 @@ extern DLL_IMPORT_RTS StgRegTable MainRegTable; #define SAVE_CurrentTSO (BaseReg->rCurrentTSO) #define SAVE_CurrentNursery (BaseReg->rCurrentNursery) +#if defined(SMP) || defined(PAR) +#define SAVE_SparkHd (BaseReg->rSparks.hd) +#define SAVE_SparkTl (BaseReg->rSparks.tl) +#define SAVE_SparkBase (BaseReg->rSparks.base) +#define SAVE_SparkLim (BaseReg->rSparks.lim) +#endif /* We sometimes need to save registers across a C-call, eg. if they * are clobbered in the standard calling convention. We define the @@ -304,6 +320,30 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) #define CurrentNursery (BaseReg->rCurrentNursery) #endif +#ifdef REG_SparkHd +GLOBAL_REG_DECL(bdescr *,SparkHd,REG_SparkHd) +#else +#define SparkHd (BaseReg->rSparks.hd) +#endif + +#ifdef REG_SparkTl +GLOBAL_REG_DECL(bdescr *,SparkTl,REG_SparkTl) +#else +#define SparkTl (BaseReg->rSparks.tl) +#endif + +#ifdef REG_SparkBase +GLOBAL_REG_DECL(bdescr *,SparkBase,REG_SparkBase) +#else +#define SparkBase (BaseReg->rSparks.base) +#endif + +#ifdef REG_SparkLim +GLOBAL_REG_DECL(bdescr *,SparkLim,REG_SparkLim) +#else +#define SparkLim (BaseReg->rSparks.lim) +#endif + /* ----------------------------------------------------------------------------- For any registers which are denoted "caller-saves" by the C calling convention, we have to emit code to save and restore them across C @@ -513,6 +553,38 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) #define CALLER_RESTORE_CurrentNursery /* nothing */ #endif +#ifdef CALLER_SAVES_SparkHd +#define CALLER_SAVE_SparkHd SAVE_SparkHd = SparkHd; +#define CALLER_RESTORE_SparkHd SparkHd = SAVE_SparkHd; +#else +#define CALLER_SAVE_SparkHd /* nothing */ +#define CALLER_RESTORE_SparkHd /* nothing */ +#endif + +#ifdef CALLER_SAVES_SparkTl +#define CALLER_SAVE_SparkTl SAVE_SparkTl = SparkTl; +#define CALLER_RESTORE_SparkTl SparkTl = SAVE_SparkTl; +#else +#define CALLER_SAVE_SparkTl /* nothing */ +#define CALLER_RESTORE_SparkTl /* nothing */ +#endif + +#ifdef CALLER_SAVES_SparkBase +#define CALLER_SAVE_SparkBase SAVE_SparkBase = SparkBase; +#define CALLER_RESTORE_SparkBase SparkBase = SAVE_SparkBase; +#else +#define CALLER_SAVE_SparkBase /* nothing */ +#define CALLER_RESTORE_SparkBase /* nothing */ +#endif + +#ifdef CALLER_SAVES_SparkLim +#define CALLER_SAVE_SparkLim SAVE_SparkLim = SparkLim; +#define CALLER_RESTORE_SparkLim SparkLim = SAVE_SparkLim; +#else +#define CALLER_SAVE_SparkLim /* nothing */ +#define CALLER_RESTORE_SparkLim /* nothing */ +#endif + #endif /* IN_STG_CODE */ /* ---------------------------------------------------------------------------- @@ -538,6 +610,8 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) CALLER_SAVE_D2 \ CALLER_SAVE_L1 + /* Save Base last, since the others may + be addressed relative to it */ #define CALLER_SAVE_SYSTEM \ CALLER_SAVE_Sp \ CALLER_SAVE_Su \ @@ -545,7 +619,12 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) CALLER_SAVE_Hp \ CALLER_SAVE_HpLim \ CALLER_SAVE_CurrentTSO \ - CALLER_SAVE_CurrentNursery + CALLER_SAVE_CurrentNursery \ + CALLER_SAVE_SparkHd \ + CALLER_SAVE_SparkTl \ + CALLER_SAVE_SparkBase \ + CALLER_SAVE_SparkLim \ + CALLER_SAVE_Base #define CALLER_RESTORE_USER \ CALLER_RESTORE_R1 \ @@ -564,6 +643,8 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) CALLER_RESTORE_D2 \ CALLER_RESTORE_L1 + /* Restore Base first, since the others may + be addressed relative to it */ #define CALLER_RESTORE_SYSTEM \ CALLER_RESTORE_Base \ CALLER_RESTORE_Sp \ @@ -572,7 +653,11 @@ GLOBAL_REG_DECL(bdescr *,CurrentNursery,REG_CurrentNursery) CALLER_RESTORE_Hp \ CALLER_RESTORE_HpLim \ CALLER_RESTORE_CurrentTSO \ - CALLER_RESTORE_CurrentNursery + CALLER_RESTORE_CurrentNursery \ + CALLER_RESTORE_SparkHd \ + CALLER_RESTORE_SparkTl \ + CALLER_RESTORE_SparkBase \ + CALLER_RESTORE_SparkLim #else /* not IN_STG_CODE */