~ubuntu-branches/ubuntu/precise/ghc/precise

« back to all changes in this revision

Viewing changes to compiler/nativeGen/SPARC/RegPlate.hs

  • Committer: Bazaar Package Importer
  • Author(s): Joachim Breitner
  • Date: 2011-01-17 12:49:24 UTC
  • Revision ID: james.westby@ubuntu.com-20110117124924-do1pym1jlf5o636m
Tags: upstream-7.0.1
ImportĀ upstreamĀ versionĀ 7.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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/stg/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 RealReg
 
303
globalRegMaybe  = error "SPARC.RegPlate.globalRegMaybe: not defined"
 
304
 
 
305
#endif