\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); void SaveAllStgContext(STG_NO_ARGS); 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_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_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! */ #if defined(DO_INSTR_COUNTING) #ifdef REG_Activity SAVE_Activity = ActivityReg; #endif #endif } extern STG_INLINE void SaveAllStgContext(STG_NO_ARGS) { SaveAllStgRegs(); #ifdef CONCURRENT TSO_CCC(CurrentTSO) = CCC; CCC = (CostCentre)STATIC_CC_REF(CC_MAIN); SET_RETADDR(TSO_PC2(CurrentTSO)) #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 */ BaseReg = &MainRegTable; #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_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 defined(DO_INSTR_COUNTING) && defined(REG_Activity) ActivityReg = SAVE_Activity; #endif #ifdef CONCURRENT CCC = TSO_CCC(CurrentTSO); #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}