[project @ 1996-01-11 14:06:51 by partain]
[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 # ifdef 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 #ifdef PAR
283     CCC = TSO_CCC(CurrentTSO);
284 #endif
285 }
286
287 extern STG_INLINE void
288 RestoreStackStgRegs (STG_NO_ARGS)
289 {
290 #if defined(REG_SpA) || defined(CONCURRENT)
291     SpA = SAVE_SpA;
292 #endif
293
294 #if defined(REG_SuA) || defined(CONCURRENT)
295     SuA = SAVE_SuA;
296 #endif
297
298 #if defined(REG_SpB) || defined(CONCURRENT)
299     SpB = SAVE_SpB;
300 #endif
301
302 #if defined(REG_SuB) || defined(CONCURRENT)
303     SuB = SAVE_SuB;
304 #endif
305 }
306
307 #else /* For the unwashed and unregisterized */
308
309 #ifdef CONCURRENT
310
311 #define SaveAllStgRegs()    \
312   do {                      \
313      SAVE_Hp = Hp;          \
314      SAVE_HpLim = HpLim;    \
315      SAVE_SpA = SpA;        \
316      SAVE_SuA = SuA;        \
317      SAVE_SpB = SpB;        \
318      SAVE_SuB = SuB;        \
319   } while(0)
320
321 #define RestoreAllStgRegs() \
322   do {                      \
323      Hp = SAVE_Hp;          \
324      HpLim = SAVE_HpLim;    \
325      SpA = SAVE_SpA;        \
326      SuA = SAVE_SuA;        \
327      SpB = SAVE_SpB;        \
328      SuB = SAVE_SuB;        \
329   } while(0)
330
331 #define RestoreStackStgRegs()   \
332   do {                      \
333      SpA = SAVE_SpA;        \
334      SuA = SAVE_SuA;        \
335      SpB = SAVE_SpB;        \
336      SuB = SAVE_SuB;        \
337   } while(0)
338
339 #else
340
341 #define SaveAllStgRegs() do {SAVE_Hp = Hp; SAVE_HpLim = HpLim;} while(0)
342
343 #define RestoreAllStgRegs()  do {Hp = SAVE_Hp; HpLim = SAVE_HpLim;} while(0)
344 #define RestoreStackStgRegs()  /* nothing */
345
346 #endif  /* CONCURRENT */
347
348 #define SaveAllStgContext() SaveAllStgRegs()
349
350 #endif  /* __STG_GCC_REGS__ && MAIN_REG_MAP */
351
352 #endif  /* STGREGS_H */
353
354 \end{code}
355