1 \section[STGRegs]{Macros for saving/restoring STG registers}
9 %************************************************************************
11 \subsection[saving-restoring-STG-regs]{Saving/restoring STG registers}
13 %************************************************************************
15 These routines will fail on the SPARC if they are allowed to drop out-of-line
16 (the wrong register window will be active).
20 #if defined(__STG_GCC_REGS__) && defined(MAIN_REG_MAP)
22 EXTDATA(STK_STUB_closure);
23 EXTFUN(STK_STUB_entry);
24 EXTDATA_RO(vtbl_StdUpdFrame);
26 /* Keep -Wmissing-prototypes from complaining */
27 void SaveAllStgRegs(STG_NO_ARGS);
28 void SaveAllStgContext(STG_NO_ARGS);
29 void SaveStgStackRegs(STG_NO_ARGS);
30 void RestoreAllStgRegs(STG_NO_ARGS);
31 void RestoreStackStgRegs(STG_NO_ARGS);
34 void SaveAllStgRegs(STG_NO_ARGS)
100 #if defined(REG_SpA) || defined(CONCURRENT)
104 #if defined(REG_SuA) || defined(CONCURRENT)
108 #if defined(REG_SpB) || defined(CONCURRENT)
112 #if defined(REG_SuB) || defined(CONCURRENT)
116 SAVE_Hp = Hp; /* always! */
117 SAVE_HpLim = HpLim; /* ditto! */
119 #if defined(DO_INSTR_COUNTING)
121 SAVE_Activity = ActivityReg;
127 void SaveAllStgContext(STG_NO_ARGS)
131 TSO_CCC(CurrentTSO) = CCC;
132 CCC = (CostCentre)STATIC_CC_REF(CC_MAIN);
133 SET_RETADDR(TSO_PC2(CurrentTSO))
138 void SaveStgStackRegs(STG_NO_ARGS)
140 #if defined(REG_SpA) || defined(CONCURRENT)
144 #if defined(REG_SuA) || defined(CONCURRENT)
148 #if defined(REG_SpB) || defined(CONCURRENT)
152 #if defined(REG_SuB) || defined(CONCURRENT)
157 extern STG_INLINE void
158 RestoreAllStgRegs (STG_NO_ARGS)
161 /* Re-initialise the register table pointer */
162 BaseReg = &MainRegTable;
229 #if defined(REG_StkO) && defined(CONCURRENT)
233 #if defined(REG_SpA) || defined(CONCURRENT)
237 #if defined(REG_SuA) || defined(CONCURRENT)
241 #if defined(REG_SpB) || defined(CONCURRENT)
245 #if defined(REG_SuB) || defined(CONCURRENT)
249 Hp = SAVE_Hp; /* always! */
250 HpLim = SAVE_HpLim; /* ditto! */
252 #ifdef REG_StdUpdRetVec
253 StdUpdRetVecReg = vtbl_StdUpdFrame;
257 StkStubReg = STK_STUB_closure;
260 #if defined(DO_INSTR_COUNTING) && defined(REG_Activity)
261 ActivityReg = SAVE_Activity;
265 CCC = TSO_CCC(CurrentTSO);
269 extern STG_INLINE void
270 RestoreStackStgRegs (STG_NO_ARGS)
272 #if defined(REG_SpA) || defined(CONCURRENT)
276 #if defined(REG_SuA) || defined(CONCURRENT)
280 #if defined(REG_SpB) || defined(CONCURRENT)
284 #if defined(REG_SuB) || defined(CONCURRENT)
289 #else /* For the unwashed and unregisterized */
293 #define SaveAllStgRegs() \
296 SAVE_HpLim = HpLim; \
303 #define RestoreAllStgRegs() \
306 HpLim = SAVE_HpLim; \
313 #define RestoreStackStgRegs() \
323 #define SaveAllStgRegs() do {SAVE_Hp = Hp; SAVE_HpLim = HpLim;} while(0)
325 #define RestoreAllStgRegs() do {Hp = SAVE_Hp; HpLim = SAVE_HpLim;} while(0)
326 #define RestoreStackStgRegs() /* nothing */
328 #endif /* CONCURRENT */
330 #define SaveAllStgContext() SaveAllStgRegs()
332 #endif /* __STG_GCC_REGS__ && MAIN_REG_MAP */
334 #endif /* STGREGS_H */