ddeebf375f2979f56dcf7b4b57231de76a1895f3
[ghc-hetmet.git] / ghc / includes / StgRegs.lh
1 \section[STGRegs]{Macros for saving/restoring STG registers}
2
3 \begin{code}
4 #ifndef STGREGS_H
5 #define STGREGS_H
6 \end{code}
7
8
9 %************************************************************************
10 %*                                                                      *
11 \subsection[saving-restoring-STG-regs]{Saving/restoring STG registers}
12 %*                                                                      *
13 %************************************************************************
14
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).
17
18 \begin{code}
19
20 #if defined(__STG_GCC_REGS__) && defined(MAIN_REG_MAP)
21
22 EXTDATA(STK_STUB_closure);
23 EXTFUN(STK_STUB_entry);
24 EXTDATA_RO(vtbl_StdUpdFrame);
25
26 /* Keep -Wmissing-prototypes from complaining */
27 void SaveAllStgRegs(STG_NO_ARGS);
28 #if i386_TARGET_ARCH
29 void SaveAllStgContext(void * /*return address*/);
30 #else
31 void SaveAllStgContext(STG_NO_ARGS);
32 #endif
33 void SaveStgStackRegs(STG_NO_ARGS);
34 void RestoreAllStgRegs(STG_NO_ARGS);
35 void RestoreStackStgRegs(STG_NO_ARGS);
36
37 extern STG_INLINE 
38 void SaveAllStgRegs(STG_NO_ARGS)
39 {
40 #ifdef REG_Base
41 # ifdef CONCURRENT
42     /* I do not think so: CurrentRegTable will not have changed
43        between entry to and exit from "Haskell land" (WDP 95/12)
44     */
45     /* CurrentRegTable = BaseReg; */
46 # endif
47 #endif
48
49 #ifdef REG_R1
50     SAVE_R1 = R1;       
51 #endif
52
53 #ifdef REG_R2
54     SAVE_R2 = R2;       
55 #endif
56
57 #ifdef REG_R3
58     SAVE_R3 = R3;       
59 #endif
60
61 #ifdef REG_R4
62     SAVE_R4 = R4;       
63 #endif
64
65 #ifdef REG_R5
66     SAVE_R5 = R5;       
67 #endif
68
69 #ifdef REG_R6
70     SAVE_R6 = R6;       
71 #endif
72
73 #ifdef REG_R7
74     SAVE_R7 = R7;        
75 #endif
76
77 #ifdef REG_R8
78     SAVE_R8 = R8;        
79 #endif
80
81 #ifdef REG_Flt1
82     SAVE_Flt1 = FltReg1;
83 #endif
84
85 #ifdef REG_Flt2
86     SAVE_Flt2 = FltReg2;
87 #endif
88
89 #ifdef REG_Flt3
90     SAVE_Flt3 = FltReg3;
91 #endif
92
93 #ifdef REG_Flt4
94     SAVE_Flt4 = FltReg4;
95 #endif
96
97 #ifdef REG_Dbl1
98     SAVE_Dbl1 = DblReg1;
99 #endif
100
101 #ifdef REG_Dbl2
102     SAVE_Dbl2 = DblReg2;
103 #endif
104
105 #ifdef REG_Tag
106     SAVE_Tag = TagReg;
107 #endif
108
109 #ifdef REG_Ret
110     SAVE_Ret = RetReg;
111 #endif
112
113 #if defined(REG_SpA) || defined(CONCURRENT)
114     SAVE_SpA = SpA;
115 #endif
116
117 #if defined(REG_SuA) || defined(CONCURRENT)
118     SAVE_SuA = SuA;
119 #endif
120
121 #if defined(REG_SpB) || defined(CONCURRENT)
122     SAVE_SpB = SpB;
123 #endif
124
125 #if defined(REG_SuB) || defined(CONCURRENT)
126     SAVE_SuB = SuB;
127 #endif
128
129     SAVE_Hp    = Hp;    /* always! */
130     SAVE_HpLim = HpLim; /* ditto! */
131 }
132
133 extern STG_INLINE
134 void
135 #if i386_TARGET_ARCH
136 SaveAllStgContext(void * ret_addr)
137 #else
138 SaveAllStgContext(STG_NO_ARGS)
139 #endif
140 {
141     SaveAllStgRegs(); 
142 #ifdef CONCURRENT
143 # if defined(PROFILING) || defined(PAR)
144     TSO_CCC(CurrentTSO) = CCC;
145     CCC = (CostCentre)STATIC_CC_REF(CC_MAIN);
146 # endif
147 # if i386_TARGET_ARCH
148     SET_RETADDR(TSO_PC2(CurrentTSO), ret_addr)
149 # else
150     SET_RETADDR(TSO_PC2(CurrentTSO))
151 # endif
152 #endif
153 }
154
155 extern STG_INLINE 
156 void SaveStgStackRegs(STG_NO_ARGS)
157 {
158 #if defined(REG_SpA) || defined(CONCURRENT)
159     SAVE_SpA = SpA;
160 #endif
161
162 #if defined(REG_SuA) || defined(CONCURRENT)
163     SAVE_SuA = SuA;
164 #endif
165
166 #if defined(REG_SpB) || defined(CONCURRENT)
167     SAVE_SpB = SpB;
168 #endif
169
170 #if defined(REG_SuB) || defined(CONCURRENT)
171     SAVE_SuB = SuB;
172 #endif
173 }
174
175 extern STG_INLINE void
176 RestoreAllStgRegs (STG_NO_ARGS)
177 {
178 #ifdef REG_Base
179     /* Re-initialise the register table pointer */
180 # ifdef CONCURRENT
181     BaseReg = CurrentRegTable;
182 # else 
183     BaseReg = &MainRegTable;
184 # endif
185 #endif
186
187 #ifdef REG_R1
188     R1 = SAVE_R1;       
189 #endif
190
191 #ifdef REG_R2
192     R2 = SAVE_R2;       
193 #endif
194
195 #ifdef REG_R3
196     R3 = SAVE_R3;       
197 #endif
198
199 #ifdef REG_R4
200     R4 = SAVE_R4;       
201 #endif
202
203 #ifdef REG_R5
204     R5 = SAVE_R5;       
205 #endif
206
207 #ifdef REG_R6
208     R6 = SAVE_R6;       
209 #endif
210
211 #ifdef REG_R7
212     R7 = SAVE_R7;        
213 #endif
214
215 #ifdef REG_R8
216     R8 = SAVE_R8;        
217 #endif
218
219 #ifdef REG_Flt1
220     FltReg1 = SAVE_Flt1;
221 #endif
222
223 #ifdef REG_Flt2
224     FltReg2 = SAVE_Flt2;
225 #endif
226
227 #ifdef REG_Flt3
228     FltReg3 = SAVE_Flt3;
229 #endif
230
231 #ifdef REG_Flt4
232     FltReg4 = SAVE_Flt4;
233 #endif
234
235 #ifdef REG_Dbl1
236     DblReg1 = SAVE_Dbl1;
237 #endif
238
239 #ifdef REG_Dbl2
240     DblReg2 = SAVE_Dbl2;
241 #endif
242
243 #ifdef REG_Tag
244     TagReg = SAVE_Tag;
245 #endif
246
247 #ifdef REG_Ret
248     RetReg = SAVE_Ret;
249 #endif
250
251 #if defined(REG_StkO) && defined(CONCURRENT)
252     StkOReg = SAVE_StkO;
253 #endif
254
255 #if defined(REG_SpA) || defined(CONCURRENT)
256     SpA = SAVE_SpA;
257 #endif
258
259 #if defined(REG_SuA) || defined(CONCURRENT)
260     SuA = SAVE_SuA;
261 #endif
262
263 #if defined(REG_SpB) || defined(CONCURRENT)
264     SpB = SAVE_SpB;
265 #endif
266
267 #if defined(REG_SuB) || defined(CONCURRENT)
268     SuB = SAVE_SuB;
269 #endif
270
271     Hp    = SAVE_Hp; /* always! */
272     HpLim = SAVE_HpLim; /* ditto! */
273
274 #ifdef REG_StdUpdRetVec
275     StdUpdRetVecReg = vtbl_StdUpdFrame;
276 #endif
277
278 #ifdef REG_StkStub
279     StkStubReg = STK_STUB_closure;
280 #endif
281
282 #if CONCURRENT
283 # if defined(PROFILING) || defined(PAR)
284     CCC = TSO_CCC(CurrentTSO);
285 # endif
286 #endif
287 }
288
289 extern STG_INLINE void
290 RestoreStackStgRegs (STG_NO_ARGS)
291 {
292 #if defined(REG_SpA) || defined(CONCURRENT)
293     SpA = SAVE_SpA;
294 #endif
295
296 #if defined(REG_SuA) || defined(CONCURRENT)
297     SuA = SAVE_SuA;
298 #endif
299
300 #if defined(REG_SpB) || defined(CONCURRENT)
301     SpB = SAVE_SpB;
302 #endif
303
304 #if defined(REG_SuB) || defined(CONCURRENT)
305     SuB = SAVE_SuB;
306 #endif
307 }
308
309 #else /* For the unwashed and unregisterized */
310
311 #ifdef CONCURRENT
312
313 #define SaveAllStgRegs()    \
314   do {                      \
315      SAVE_Hp = Hp;          \
316      SAVE_HpLim = HpLim;    \
317      SAVE_SpA = SpA;        \
318      SAVE_SuA = SuA;        \
319      SAVE_SpB = SpB;        \
320      SAVE_SuB = SuB;        \
321   } while(0)
322
323 #define RestoreAllStgRegs() \
324   do {                      \
325      Hp = SAVE_Hp;          \
326      HpLim = SAVE_HpLim;    \
327      SpA = SAVE_SpA;        \
328      SuA = SAVE_SuA;        \
329      SpB = SAVE_SpB;        \
330      SuB = SAVE_SuB;        \
331   } while(0)
332
333 #define RestoreStackStgRegs()   \
334   do {                      \
335      SpA = SAVE_SpA;        \
336      SuA = SAVE_SuA;        \
337      SpB = SAVE_SpB;        \
338      SuB = SAVE_SuB;        \
339   } while(0)
340
341 #else
342
343 #define SaveAllStgRegs() do {SAVE_Hp = Hp; SAVE_HpLim = HpLim;} while(0)
344
345 #define RestoreAllStgRegs()  do {Hp = SAVE_Hp; HpLim = SAVE_HpLim;} while(0)
346 #define RestoreStackStgRegs()  /* nothing */
347
348 #endif  /* CONCURRENT */
349
350 #define SaveAllStgContext() SaveAllStgRegs()
351
352 #endif  /* __STG_GCC_REGS__ && MAIN_REG_MAP */
353
354 #endif  /* STGREGS_H */
355
356 \end{code}
357