+++ /dev/null
-\section[STGRegs]{Macros for saving/restoring STG registers}
-
-\begin{code}
-#ifndef STGREGS_H
-#define STGREGS_H
-\end{code}
-
-
-%************************************************************************
-%* *
-\subsection[saving-restoring-STG-regs]{Saving/restoring STG registers}
-%* *
-%************************************************************************
-
-These routines will fail on the SPARC if they are allowed to drop out-of-line
-(the wrong register window will be active).
-
-\begin{code}
-
-#if defined(__STG_GCC_REGS__) && defined(MAIN_REG_MAP)
-
-EXTDATA(STK_STUB_closure);
-EXTFUN(STK_STUB_entry);
-EXTDATA_RO(vtbl_StdUpdFrame);
-
-/* Keep -Wmissing-prototypes from complaining */
-void SaveAllStgRegs(STG_NO_ARGS);
-#if i386_TARGET_ARCH
-void SaveAllStgContext(void * /*return address*/);
-#else
-void SaveAllStgContext(STG_NO_ARGS);
-#endif
-void SaveStgStackRegs(STG_NO_ARGS);
-void RestoreAllStgRegs(STG_NO_ARGS);
-void RestoreStackStgRegs(STG_NO_ARGS);
-
-extern STG_INLINE
-void SaveAllStgRegs(STG_NO_ARGS)
-{
-#ifdef REG_Base
-# ifdef CONCURRENT
- /* I do not think so: CurrentRegTable will not have changed
- between entry to and exit from "Haskell land" (WDP 95/12)
- */
- /* CurrentRegTable = BaseReg; */
-# endif
-#endif
-/* Hack!!! slam the current C stack pointer into the reg. table
- in the event that we need to copy a chunk of the C stack
- before entering Haskell via a stable pointer (contact
- <sof> for (gruesome) details!)
-
- Only save this once.
-
- ToDo: support this across platforms.
-*/
-#if 0 && defined(CONCURRENT) && defined(i386_TARGET_ARCH)
- if (CurrentTSO != CurrentTSOinC) {
- __asm__ volatile (" mov %%esp,%0" : "m=" (CurrentRegTable->rCstkptr));
- }
-#endif
-
-#ifdef REG_R1
- SAVE_R1 = R1;
-#endif
-
-#ifdef REG_R2
- SAVE_R2 = R2;
-#endif
-
-#ifdef REG_R3
- SAVE_R3 = R3;
-#endif
-
-#ifdef REG_R4
- SAVE_R4 = R4;
-#endif
-
-#ifdef REG_R5
- SAVE_R5 = R5;
-#endif
-
-#ifdef REG_R6
- SAVE_R6 = R6;
-#endif
-
-#ifdef REG_R7
- SAVE_R7 = R7;
-#endif
-
-#ifdef REG_R8
- SAVE_R8 = R8;
-#endif
-
-#ifdef REG_Flt1
- SAVE_Flt1 = FltReg1;
-#endif
-
-#ifdef REG_Flt2
- SAVE_Flt2 = FltReg2;
-#endif
-
-#ifdef REG_Flt3
- SAVE_Flt3 = FltReg3;
-#endif
-
-#ifdef REG_Flt4
- SAVE_Flt4 = FltReg4;
-#endif
-
-#ifdef REG_Dbl1
- SAVE_Dbl1 = DblReg1;
-#endif
-
-#ifdef REG_Dbl2
- SAVE_Dbl2 = DblReg2;
-#endif
-
-#ifdef REG_Lng1
- SAVE_Lng1 = LngReg1;
-#endif
-
-#ifdef REG_Lng2
- SAVE_Lng2 = LngReg2;
-#endif
-
-#ifdef REG_Tag
- SAVE_Tag = TagReg;
-#endif
-
-#ifdef REG_Ret
- SAVE_Ret = RetReg;
-#endif
-
-#if defined(REG_SpA) || defined(CONCURRENT)
- SAVE_SpA = SpA;
-#endif
-
-#if defined(REG_SuA) || defined(CONCURRENT)
- SAVE_SuA = SuA;
-#endif
-
-#if defined(REG_SpB) || defined(CONCURRENT)
- SAVE_SpB = SpB;
-#endif
-
-#if defined(REG_SuB) || defined(CONCURRENT)
- SAVE_SuB = SuB;
-#endif
-
- SAVE_Hp = Hp; /* always! */
- SAVE_HpLim = HpLim; /* ditto! */
-}
-
-extern STG_INLINE
-void
-#if i386_TARGET_ARCH
-SaveAllStgContext(void * ret_addr)
-#else
-SaveAllStgContext(STG_NO_ARGS)
-#endif
-{
- SaveAllStgRegs();
-#ifdef CONCURRENT
-# if defined(PROFILING) || defined(PAR)
- TSO_CCC(CurrentTSO) = CCC;
- CCC = (CostCentre)STATIC_CC_REF(CC_MAIN);
-# endif
-# if i386_TARGET_ARCH
- SET_RETADDR(TSO_PC2(CurrentTSO), ret_addr)
-# else
- SET_RETADDR(TSO_PC2(CurrentTSO))
-# endif
-#endif
-}
-
-extern STG_INLINE
-void SaveStgStackRegs(STG_NO_ARGS)
-{
-#if defined(REG_SpA) || defined(CONCURRENT)
- SAVE_SpA = SpA;
-#endif
-
-#if defined(REG_SuA) || defined(CONCURRENT)
- SAVE_SuA = SuA;
-#endif
-
-#if defined(REG_SpB) || defined(CONCURRENT)
- SAVE_SpB = SpB;
-#endif
-
-#if defined(REG_SuB) || defined(CONCURRENT)
- SAVE_SuB = SuB;
-#endif
-}
-
-extern STG_INLINE void
-RestoreAllStgRegs (STG_NO_ARGS)
-{
-#ifdef REG_Base
- /* Re-initialise the register table pointer */
-# ifdef CONCURRENT
- BaseReg = CurrentRegTable;
-# else
- BaseReg = &MainRegTable;
-# endif
-#endif
-
-#ifdef REG_R1
- R1 = SAVE_R1;
-#endif
-
-#ifdef REG_R2
- R2 = SAVE_R2;
-#endif
-
-#ifdef REG_R3
- R3 = SAVE_R3;
-#endif
-
-#ifdef REG_R4
- R4 = SAVE_R4;
-#endif
-
-#ifdef REG_R5
- R5 = SAVE_R5;
-#endif
-
-#ifdef REG_R6
- R6 = SAVE_R6;
-#endif
-
-#ifdef REG_R7
- R7 = SAVE_R7;
-#endif
-
-#ifdef REG_R8
- R8 = SAVE_R8;
-#endif
-
-#ifdef REG_Flt1
- FltReg1 = SAVE_Flt1;
-#endif
-
-#ifdef REG_Flt2
- FltReg2 = SAVE_Flt2;
-#endif
-
-#ifdef REG_Flt3
- FltReg3 = SAVE_Flt3;
-#endif
-
-#ifdef REG_Flt4
- FltReg4 = SAVE_Flt4;
-#endif
-
-#ifdef REG_Dbl1
- DblReg1 = SAVE_Dbl1;
-#endif
-
-#ifdef REG_Dbl2
- DblReg2 = SAVE_Dbl2;
-#endif
-
-#ifdef REG_Lng1
- LngReg1 = SAVE_Lng1;
-#endif
-
-#ifdef REG_Lng2
- LngReg2 = SAVE_Lng2;
-#endif
-
-#ifdef REG_Tag
- TagReg = SAVE_Tag;
-#endif
-
-#ifdef REG_Ret
- RetReg = SAVE_Ret;
-#endif
-
-#if defined(REG_StkO) && defined(CONCURRENT)
- StkOReg = SAVE_StkO;
-#endif
-
-#if defined(REG_SpA) || defined(CONCURRENT)
- SpA = SAVE_SpA;
-#endif
-
-#if defined(REG_SuA) || defined(CONCURRENT)
- SuA = SAVE_SuA;
-#endif
-
-#if defined(REG_SpB) || defined(CONCURRENT)
- SpB = SAVE_SpB;
-#endif
-
-#if defined(REG_SuB) || defined(CONCURRENT)
- SuB = SAVE_SuB;
-#endif
-
- Hp = SAVE_Hp; /* always! */
- HpLim = SAVE_HpLim; /* ditto! */
-
-#ifdef REG_StdUpdRetVec
- StdUpdRetVecReg = vtbl_StdUpdFrame;
-#endif
-
-#ifdef REG_StkStub
- StkStubReg = STK_STUB_closure;
-#endif
-
-#if CONCURRENT
-# if defined(PROFILING) || defined(PAR)
- CCC = TSO_CCC(CurrentTSO);
-# endif
-#endif
-}
-
-extern STG_INLINE void
-RestoreStackStgRegs (STG_NO_ARGS)
-{
-#if defined(REG_SpA) || defined(CONCURRENT)
- SpA = SAVE_SpA;
-#endif
-
-#if defined(REG_SuA) || defined(CONCURRENT)
- SuA = SAVE_SuA;
-#endif
-
-#if defined(REG_SpB) || defined(CONCURRENT)
- SpB = SAVE_SpB;
-#endif
-
-#if defined(REG_SuB) || defined(CONCURRENT)
- SuB = SAVE_SuB;
-#endif
-}
-
-#else /* For the unwashed and unregisterized */
-
-#ifdef CONCURRENT
-
-#define SaveAllStgRegs() \
- do { \
- SAVE_Hp = Hp; \
- SAVE_HpLim = HpLim; \
- SAVE_SpA = SpA; \
- SAVE_SuA = SuA; \
- SAVE_SpB = SpB; \
- SAVE_SuB = SuB; \
- } while(0)
-
-#define RestoreAllStgRegs() \
- do { \
- Hp = SAVE_Hp; \
- HpLim = SAVE_HpLim; \
- SpA = SAVE_SpA; \
- SuA = SAVE_SuA; \
- SpB = SAVE_SpB; \
- SuB = SAVE_SuB; \
- } while(0)
-
-#define RestoreStackStgRegs() \
- do { \
- SpA = SAVE_SpA; \
- SuA = SAVE_SuA; \
- SpB = SAVE_SpB; \
- SuB = SAVE_SuB; \
- } while(0)
-
-#else
-
-#define SaveAllStgRegs() do {SAVE_Hp = Hp; SAVE_HpLim = HpLim;} while(0)
-
-#define RestoreAllStgRegs() do {Hp = SAVE_Hp; HpLim = SAVE_HpLim;} while(0)
-#define RestoreStackStgRegs() /* nothing */
-
-#endif /* CONCURRENT */
-
-#define SaveAllStgContext() SaveAllStgRegs()
-
-#endif /* __STG_GCC_REGS__ && MAIN_REG_MAP */
-
-#endif /* STGREGS_H */
-
-\end{code}
-