Split Reg into vreg/hreg and add register pairs
[ghc-hetmet.git] / compiler / nativeGen / SPARC / RegPlate.hs
1
2 -- | Nasty #ifdefery that generates the definitions for
3 --      freeReg and globalRegMaybe from the information in includes/MachRegs.h.
4 --      
5 --      If the current TARGET_ARCH isn't sparc then these functions will be wrong.
6 --
7 module SPARC.RegPlate (
8         freeReg,
9         globalRegMaybe
10 )
11
12 where
13
14 #include "HsVersions.h"
15
16 import Reg
17 import CmmExpr
18 import FastBool
19
20 -- Register numbers for SPARC hardware registers.
21 --      These names are the same as the ones in Regs.hs, but those have
22 --      type Reg and not RegNo.
23 --
24 #ifdef sparc_TARGET_ARCH
25
26 #define g0      0
27 #define g1      1
28 #define g2      2
29 #define g3      3
30 #define g4      4
31 #define g5      5
32 #define g6      6
33 #define g7      7
34
35 #define o0      8
36 #define o1      9       
37 #define o2      10
38 #define o3      11
39 #define o4      12
40 #define o5      13
41 #define o6      14
42 #define o7      15
43
44 #define l0      16
45 #define l1      17
46 #define l2      18
47 #define l3      19
48 #define l4      20
49 #define l5      21
50 #define l6      22
51 #define l7      23
52
53 #define i0      24
54 #define i1      25
55 #define i2      26
56 #define i3      27
57 #define i4      28
58 #define i5      29
59 #define i6      30
60 #define i7      31
61
62 #define f0      32
63 #define f1      33
64 #define f2      34
65 #define f3      35
66 #define f4      36
67 #define f5      37
68 #define f6      38
69 #define f7      39
70 #define f8      40
71 #define f9      41
72 #define f10     42
73 #define f11     43
74 #define f12     44
75 #define f13     45
76 #define f14     46
77 #define f15     47
78 #define f16     48
79 #define f17     49
80 #define f18     50
81 #define f19     51
82 #define f20     52
83 #define f21     53
84 #define f22     54
85 #define f23     55
86 #define f24     56
87 #define f25     57
88 #define f26     58
89 #define f27     59
90 #define f28     60
91 #define f29     61
92 #define f30     62
93 #define f31     63
94
95
96 #include "../includes/MachRegs.h"
97
98 -- | Check whether a machine register is free for allocation.
99 freeReg :: RegNo -> FastBool
100
101
102 -- SPARC regs used by the OS / ABI
103 -- %g0(r0) is always zero
104 freeReg g0      = fastBool False
105
106 -- %g5(r5) - %g7(r7) 
107 --      are reserved for the OS
108 freeReg g5      = fastBool False
109 freeReg g6      = fastBool False
110 freeReg g7      = fastBool False
111
112 -- %o6(r14) 
113 --      is the C stack pointer
114 freeReg o6      = fastBool False
115
116 -- %o7(r15) 
117 --      holds the C return address
118 freeReg o7      = fastBool False
119
120 -- %i6(r30) 
121 --      is the C frame pointer
122 freeReg i6      = fastBool False
123
124 -- %i7(r31) 
125 --      is used for C return addresses
126 freeReg i7      = fastBool False
127
128 -- %f0(r32) - %f1(r32)
129 --      are C floating point return regs
130 freeReg f0      = fastBool False
131 freeReg f1      = fastBool False
132         
133 {-
134 freeReg regNo
135         -- don't release high half of double regs
136         | regNo >= f0
137         , regNo <  NCG_FirstFloatReg
138         , regNo `mod` 2 /= 0
139         = fastBool False
140 -}
141 --------------------------------------
142
143
144 #ifdef REG_Base
145 freeReg REG_Base = fastBool False
146 #endif
147 #ifdef REG_R1
148 freeReg REG_R1  = fastBool False
149 #endif  
150 #ifdef REG_R2  
151 freeReg REG_R2  = fastBool False
152 #endif  
153 #ifdef REG_R3  
154 freeReg REG_R3  = fastBool False
155 #endif  
156 #ifdef REG_R4  
157 freeReg REG_R4  = fastBool False
158 #endif  
159 #ifdef REG_R5  
160 freeReg REG_R5  = fastBool False
161 #endif  
162 #ifdef REG_R6  
163 freeReg REG_R6  = fastBool False
164 #endif  
165 #ifdef REG_R7  
166 freeReg REG_R7  = fastBool False
167 #endif  
168 #ifdef REG_R8  
169 freeReg REG_R8  = fastBool False
170 #endif
171 #ifdef REG_F1
172 freeReg REG_F1  = fastBool False
173 #endif
174 #ifdef REG_F2
175 freeReg REG_F2  = fastBool False
176 #endif
177 #ifdef REG_F3
178 freeReg REG_F3  = fastBool False
179 #endif
180 #ifdef REG_F4
181 freeReg REG_F4  = fastBool False
182 #endif
183 #ifdef REG_D1
184 freeReg REG_D1  = fastBool False
185 #endif
186 #ifdef REG_D1_2
187 freeReg REG_D1_2 = fastBool False
188 #endif
189 #ifdef REG_D2
190 freeReg REG_D2  = fastBool False
191 #endif
192 #ifdef REG_D2_2
193 freeReg REG_D2_2 = fastBool False
194 #endif
195 #ifdef REG_Sp 
196 freeReg REG_Sp  = fastBool False
197 #endif 
198 #ifdef REG_Su
199 freeReg REG_Su  = fastBool False
200 #endif 
201 #ifdef REG_SpLim 
202 freeReg REG_SpLim = fastBool False
203 #endif 
204 #ifdef REG_Hp 
205 freeReg REG_Hp  = fastBool False
206 #endif
207 #ifdef REG_HpLim
208 freeReg REG_HpLim = fastBool False
209 #endif
210 freeReg _       = fastBool True
211
212
213
214 --  | Returns 'Nothing' if this global register is not stored
215 -- in a real machine register, otherwise returns @'Just' reg@, where
216 -- reg is the machine register it is stored in.
217
218
219 globalRegMaybe :: GlobalReg -> Maybe RealReg
220
221 #ifdef REG_Base
222 globalRegMaybe BaseReg                  = Just (RealRegSingle REG_Base)
223 #endif
224 #ifdef REG_R1
225 globalRegMaybe (VanillaReg 1 _)         = Just (RealRegSingle REG_R1)
226 #endif 
227 #ifdef REG_R2 
228 globalRegMaybe (VanillaReg 2 _)         = Just (RealRegSingle REG_R2)
229 #endif 
230 #ifdef REG_R3 
231 globalRegMaybe (VanillaReg 3 _)         = Just (RealRegSingle REG_R3)
232 #endif 
233 #ifdef REG_R4 
234 globalRegMaybe (VanillaReg 4 _)         = Just (RealRegSingle REG_R4)
235 #endif 
236 #ifdef REG_R5 
237 globalRegMaybe (VanillaReg 5 _)         = Just (RealRegSingle REG_R5)
238 #endif 
239 #ifdef REG_R6 
240 globalRegMaybe (VanillaReg 6 _)         = Just (RealRegSingle REG_R6)
241 #endif 
242 #ifdef REG_R7 
243 globalRegMaybe (VanillaReg 7 _)         = Just (RealRegSingle REG_R7)
244 #endif 
245 #ifdef REG_R8 
246 globalRegMaybe (VanillaReg 8 _)         = Just (RealRegSingle REG_R8)
247 #endif
248 #ifdef REG_R9 
249 globalRegMaybe (VanillaReg 9 _)         = Just (RealRegSingle REG_R9)
250 #endif
251 #ifdef REG_R10 
252 globalRegMaybe (VanillaReg 10 _)        = Just (RealRegSingle REG_R10)
253 #endif
254 #ifdef REG_F1
255 globalRegMaybe (FloatReg 1)             = Just (RealRegSingle REG_F1)
256 #endif                                  
257 #ifdef REG_F2                           
258 globalRegMaybe (FloatReg 2)             = Just (RealRegSingle REG_F2)
259 #endif                                  
260 #ifdef REG_F3                           
261 globalRegMaybe (FloatReg 3)             = Just (RealRegSingle REG_F3)
262 #endif                                  
263 #ifdef REG_F4                           
264 globalRegMaybe (FloatReg 4)             = Just (RealRegSingle REG_F4)
265 #endif                                  
266 #ifdef REG_D1                           
267 globalRegMaybe (DoubleReg 1)            = Just (RealRegPair REG_D1 (REG_D1 + 1))
268 #endif                                  
269 #ifdef REG_D2                           
270 globalRegMaybe (DoubleReg 2)            = Just (RealRegPair REG_D2 (REG_D2 + 1))
271 #endif
272 #ifdef REG_Sp       
273 globalRegMaybe Sp                       = Just (RealRegSingle REG_Sp)
274 #endif
275 #ifdef REG_Lng1                         
276 globalRegMaybe (LongReg 1)              = Just (RealRegSingle REG_Lng1)
277 #endif                                  
278 #ifdef REG_Lng2                         
279 globalRegMaybe (LongReg 2)              = Just (RealRegSingle REG_Lng2)
280 #endif
281 #ifdef REG_SpLim                                
282 globalRegMaybe SpLim                    = Just (RealRegSingle REG_SpLim)
283 #endif                                  
284 #ifdef REG_Hp                           
285 globalRegMaybe Hp                       = Just (RealRegSingle REG_Hp)
286 #endif                                  
287 #ifdef REG_HpLim                        
288 globalRegMaybe HpLim                    = Just (RealRegSingle REG_HpLim)
289 #endif                                  
290 #ifdef REG_CurrentTSO                           
291 globalRegMaybe CurrentTSO               = Just (RealRegSingle REG_CurrentTSO)
292 #endif                                  
293 #ifdef REG_CurrentNursery                       
294 globalRegMaybe CurrentNursery           = Just (RealRegSingle REG_CurrentNursery)
295 #endif                                  
296 globalRegMaybe _                        = Nothing
297
298 #else
299 freeReg :: RegNo -> FastBool
300 freeReg         = error "SPARC.RegPlate.freeReg: not defined"
301
302 globalRegMaybe :: GlobalReg -> Maybe Reg
303 globalRegMaybe  = error "SPARC.RegPlate.globalRegMaybe: not defined"
304
305 #endif