SPARC NCG: Base freeRegs on includes/MachRegs.h again
[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
23 #define g0      0
24 #define g1      1
25 #define g2      2
26 #define g3      3
27 #define g4      4
28 #define g5      5
29 #define g6      6
30 #define g7      7
31
32 #define o0      8
33 #define o1      9       
34 #define o2      10
35 #define o3      11
36 #define o4      12
37 #define o5      13
38 #define o6      14
39 #define o7      15
40
41 #define l0      16
42 #define l1      17
43 #define l2      18
44 #define l3      19
45 #define l4      20
46 #define l5      21
47 #define l6      22
48 #define l7      23
49
50 #define i0      24
51 #define i1      25
52 #define i2      26
53 #define i3      27
54 #define i4      28
55 #define i5      29
56 #define i6      30
57 #define i7      31
58
59 #define f0      32
60 #define f1      33
61 #define f2      34
62 #define f3      35
63 #define f4      36
64 #define f5      37
65 #define f6      38
66 #define f7      39
67 #define f8      40
68 #define f9      41
69 #define f10     42
70 #define f11     43
71 #define f12     44
72 #define f13     45
73 #define f14     46
74 #define f15     47
75 #define f16     48
76 #define f17     49
77 #define f18     50
78 #define f19     51
79 #define f20     52
80 #define f21     53
81 #define f22     54
82 #define f23     55
83 #define f24     56
84 #define f25     57
85 #define f26     58
86 #define f27     59
87 #define f28     60
88 #define f29     61
89 #define f30     62
90 #define f31     63
91
92
93 #include "../includes/MachRegs.h"
94
95 -- | Check whether a machine register is free for allocation.
96 freeReg :: RegNo -> FastBool
97
98
99 #ifdef sparc_REGS
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 #endif
139
140
141
142 #ifdef REG_Base
143 freeReg REG_Base = fastBool False
144 #endif
145 #ifdef REG_R1
146 freeReg REG_R1  = fastBool False
147 #endif  
148 #ifdef REG_R2  
149 freeReg REG_R2  = fastBool False
150 #endif  
151 #ifdef REG_R3  
152 freeReg REG_R3  = fastBool False
153 #endif  
154 #ifdef REG_R4  
155 freeReg REG_R4  = fastBool False
156 #endif  
157 #ifdef REG_R5  
158 freeReg REG_R5  = fastBool False
159 #endif  
160 #ifdef REG_R6  
161 freeReg REG_R6  = fastBool False
162 #endif  
163 #ifdef REG_R7  
164 freeReg REG_R7  = fastBool False
165 #endif  
166 #ifdef REG_R8  
167 freeReg REG_R8  = fastBool False
168 #endif
169 #ifdef REG_F1
170 freeReg REG_F1  = fastBool False
171 #endif
172 #ifdef REG_F2
173 freeReg REG_F2  = fastBool False
174 #endif
175 #ifdef REG_F3
176 freeReg REG_F3  = fastBool False
177 #endif
178 #ifdef REG_F4
179 freeReg REG_F4  = fastBool False
180 #endif
181 #ifdef REG_D1
182 freeReg REG_D1  = fastBool False
183 #endif
184 #ifdef REG_D2
185 freeReg REG_D2  = fastBool False
186 #endif
187 #ifdef REG_Sp 
188 freeReg REG_Sp  = fastBool False
189 #endif 
190 #ifdef REG_Su
191 freeReg REG_Su  = fastBool False
192 #endif 
193 #ifdef REG_SpLim 
194 freeReg REG_SpLim = fastBool False
195 #endif 
196 #ifdef REG_Hp 
197 freeReg REG_Hp  = fastBool False
198 #endif
199 #ifdef REG_HpLim
200 freeReg REG_HpLim = fastBool False
201 #endif
202 freeReg _       = fastBool True
203
204
205
206 --  | Returns 'Nothing' if this global register is not stored
207 -- in a real machine register, otherwise returns @'Just' reg@, where
208 -- reg is the machine register it is stored in.
209
210 globalRegMaybe :: GlobalReg -> Maybe Reg
211
212 #ifdef REG_Base
213 globalRegMaybe BaseReg                  = Just (RealReg REG_Base)
214 #endif
215 #ifdef REG_R1
216 globalRegMaybe (VanillaReg 1 _)         = Just (RealReg REG_R1)
217 #endif 
218 #ifdef REG_R2 
219 globalRegMaybe (VanillaReg 2 _)         = Just (RealReg REG_R2)
220 #endif 
221 #ifdef REG_R3 
222 globalRegMaybe (VanillaReg 3 _)         = Just (RealReg REG_R3)
223 #endif 
224 #ifdef REG_R4 
225 globalRegMaybe (VanillaReg 4 _)         = Just (RealReg REG_R4)
226 #endif 
227 #ifdef REG_R5 
228 globalRegMaybe (VanillaReg 5 _)         = Just (RealReg REG_R5)
229 #endif 
230 #ifdef REG_R6 
231 globalRegMaybe (VanillaReg 6 _)         = Just (RealReg REG_R6)
232 #endif 
233 #ifdef REG_R7 
234 globalRegMaybe (VanillaReg 7 _)         = Just (RealReg REG_R7)
235 #endif 
236 #ifdef REG_R8 
237 globalRegMaybe (VanillaReg 8 _)         = Just (RealReg REG_R8)
238 #endif
239 #ifdef REG_R9 
240 globalRegMaybe (VanillaReg 9 _)         = Just (RealReg REG_R9)
241 #endif
242 #ifdef REG_R10 
243 globalRegMaybe (VanillaReg 10 _)        = Just (RealReg REG_R10)
244 #endif
245 #ifdef REG_F1
246 globalRegMaybe (FloatReg 1)             = Just (RealReg REG_F1)
247 #endif                                  
248 #ifdef REG_F2                           
249 globalRegMaybe (FloatReg 2)             = Just (RealReg REG_F2)
250 #endif                                  
251 #ifdef REG_F3                           
252 globalRegMaybe (FloatReg 3)             = Just (RealReg REG_F3)
253 #endif                                  
254 #ifdef REG_F4                           
255 globalRegMaybe (FloatReg 4)             = Just (RealReg REG_F4)
256 #endif                                  
257 #ifdef REG_D1                           
258 globalRegMaybe (DoubleReg 1)            = Just (RealReg REG_D1)
259 #endif                                  
260 #ifdef REG_D2                           
261 globalRegMaybe (DoubleReg 2)            = Just (RealReg REG_D2)
262 #endif
263 #ifdef REG_Sp       
264 globalRegMaybe Sp                       = Just (RealReg REG_Sp)
265 #endif
266 #ifdef REG_Lng1                         
267 globalRegMaybe (LongReg 1)              = Just (RealReg REG_Lng1)
268 #endif                                  
269 #ifdef REG_Lng2                         
270 globalRegMaybe (LongReg 2)              = Just (RealReg REG_Lng2)
271 #endif
272 #ifdef REG_SpLim                                
273 globalRegMaybe SpLim                    = Just (RealReg REG_SpLim)
274 #endif                                  
275 #ifdef REG_Hp                           
276 globalRegMaybe Hp                       = Just (RealReg REG_Hp)
277 #endif                                  
278 #ifdef REG_HpLim                        
279 globalRegMaybe HpLim                    = Just (RealReg REG_HpLim)
280 #endif                                  
281 #ifdef REG_CurrentTSO                           
282 globalRegMaybe CurrentTSO               = Just (RealReg REG_CurrentTSO)
283 #endif                                  
284 #ifdef REG_CurrentNursery                       
285 globalRegMaybe CurrentNursery           = Just (RealReg REG_CurrentNursery)
286 #endif                                  
287 globalRegMaybe _                        = Nothing