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