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);
29 void SaveAllStgContext(void * /*return address*/);
31 void SaveAllStgContext(STG_NO_ARGS);
33 void SaveStgStackRegs(STG_NO_ARGS);
34 void RestoreAllStgRegs(STG_NO_ARGS);
35 void RestoreStackStgRegs(STG_NO_ARGS);
38 void SaveAllStgRegs(STG_NO_ARGS)
42 /* I do not think so: CurrentRegTable will not have changed
43 between entry to and exit from "Haskell land" (WDP 95/12)
45 /* CurrentRegTable = BaseReg; */
113 #if defined(REG_SpA) || defined(CONCURRENT)
117 #if defined(REG_SuA) || defined(CONCURRENT)
121 #if defined(REG_SpB) || defined(CONCURRENT)
125 #if defined(REG_SuB) || defined(CONCURRENT)
129 SAVE_Hp = Hp; /* always! */
130 SAVE_HpLim = HpLim; /* ditto! */
136 SaveAllStgContext(void * ret_addr)
138 SaveAllStgContext(STG_NO_ARGS)
143 # if defined(PROFILING) || defined(PAR)
144 TSO_CCC(CurrentTSO) = CCC;
145 CCC = (CostCentre)STATIC_CC_REF(CC_MAIN);
147 # if i386_TARGET_ARCH
148 SET_RETADDR(TSO_PC2(CurrentTSO), ret_addr)
150 SET_RETADDR(TSO_PC2(CurrentTSO))
156 void SaveStgStackRegs(STG_NO_ARGS)
158 #if defined(REG_SpA) || defined(CONCURRENT)
162 #if defined(REG_SuA) || defined(CONCURRENT)
166 #if defined(REG_SpB) || defined(CONCURRENT)
170 #if defined(REG_SuB) || defined(CONCURRENT)
175 extern STG_INLINE void
176 RestoreAllStgRegs (STG_NO_ARGS)
179 /* Re-initialise the register table pointer */
181 BaseReg = CurrentRegTable;
183 BaseReg = &MainRegTable;
251 #if defined(REG_StkO) && defined(CONCURRENT)
255 #if defined(REG_SpA) || defined(CONCURRENT)
259 #if defined(REG_SuA) || defined(CONCURRENT)
263 #if defined(REG_SpB) || defined(CONCURRENT)
267 #if defined(REG_SuB) || defined(CONCURRENT)
271 Hp = SAVE_Hp; /* always! */
272 HpLim = SAVE_HpLim; /* ditto! */
274 #ifdef REG_StdUpdRetVec
275 StdUpdRetVecReg = vtbl_StdUpdFrame;
279 StkStubReg = STK_STUB_closure;
283 # if defined(PROFILING) || defined(PAR)
284 CCC = TSO_CCC(CurrentTSO);
289 extern STG_INLINE void
290 RestoreStackStgRegs (STG_NO_ARGS)
292 #if defined(REG_SpA) || defined(CONCURRENT)
296 #if defined(REG_SuA) || defined(CONCURRENT)
300 #if defined(REG_SpB) || defined(CONCURRENT)
304 #if defined(REG_SuB) || defined(CONCURRENT)
309 #else /* For the unwashed and unregisterized */
313 #define SaveAllStgRegs() \
316 SAVE_HpLim = HpLim; \
323 #define RestoreAllStgRegs() \
326 HpLim = SAVE_HpLim; \
333 #define RestoreStackStgRegs() \
343 #define SaveAllStgRegs() do {SAVE_Hp = Hp; SAVE_HpLim = HpLim;} while(0)
345 #define RestoreAllStgRegs() do {Hp = SAVE_Hp; HpLim = SAVE_HpLim;} while(0)
346 #define RestoreStackStgRegs() /* nothing */
348 #endif /* CONCURRENT */
350 #define SaveAllStgContext() SaveAllStgRegs()
352 #endif /* __STG_GCC_REGS__ && MAIN_REG_MAP */
354 #endif /* STGREGS_H */