2
-- | Nasty #ifdefery that generates the definitions for
3
-- freeReg and globalRegMaybe from the information in includes/MachRegs.h.
5
-- If the current TARGET_ARCH isn't sparc then these functions will be wrong.
7
module SPARC.RegPlate (
14
#include "HsVersions.h"
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.
24
#ifdef sparc_TARGET_ARCH
96
#include "../includes/stg/MachRegs.h"
98
-- | Check whether a machine register is free for allocation.
99
freeReg :: RegNo -> FastBool
102
-- SPARC regs used by the OS / ABI
103
-- %g0(r0) is always zero
104
freeReg g0 = fastBool False
107
-- are reserved for the OS
108
freeReg g5 = fastBool False
109
freeReg g6 = fastBool False
110
freeReg g7 = fastBool False
113
-- is the C stack pointer
114
freeReg o6 = fastBool False
117
-- holds the C return address
118
freeReg o7 = fastBool False
121
-- is the C frame pointer
122
freeReg i6 = fastBool False
125
-- is used for C return addresses
126
freeReg i7 = fastBool False
128
-- %f0(r32) - %f1(r32)
129
-- are C floating point return regs
130
freeReg f0 = fastBool False
131
freeReg f1 = fastBool False
135
-- don't release high half of double regs
137
, regNo < NCG_FirstFloatReg
141
--------------------------------------
145
freeReg REG_Base = fastBool False
148
freeReg REG_R1 = fastBool False
151
freeReg REG_R2 = fastBool False
154
freeReg REG_R3 = fastBool False
157
freeReg REG_R4 = fastBool False
160
freeReg REG_R5 = fastBool False
163
freeReg REG_R6 = fastBool False
166
freeReg REG_R7 = fastBool False
169
freeReg REG_R8 = fastBool False
172
freeReg REG_F1 = fastBool False
175
freeReg REG_F2 = fastBool False
178
freeReg REG_F3 = fastBool False
181
freeReg REG_F4 = fastBool False
184
freeReg REG_D1 = fastBool False
187
freeReg REG_D1_2 = fastBool False
190
freeReg REG_D2 = fastBool False
193
freeReg REG_D2_2 = fastBool False
196
freeReg REG_Sp = fastBool False
199
freeReg REG_Su = fastBool False
202
freeReg REG_SpLim = fastBool False
205
freeReg REG_Hp = fastBool False
208
freeReg REG_HpLim = fastBool False
210
freeReg _ = fastBool True
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.
219
globalRegMaybe :: GlobalReg -> Maybe RealReg
222
globalRegMaybe BaseReg = Just (RealRegSingle REG_Base)
225
globalRegMaybe (VanillaReg 1 _) = Just (RealRegSingle REG_R1)
228
globalRegMaybe (VanillaReg 2 _) = Just (RealRegSingle REG_R2)
231
globalRegMaybe (VanillaReg 3 _) = Just (RealRegSingle REG_R3)
234
globalRegMaybe (VanillaReg 4 _) = Just (RealRegSingle REG_R4)
237
globalRegMaybe (VanillaReg 5 _) = Just (RealRegSingle REG_R5)
240
globalRegMaybe (VanillaReg 6 _) = Just (RealRegSingle REG_R6)
243
globalRegMaybe (VanillaReg 7 _) = Just (RealRegSingle REG_R7)
246
globalRegMaybe (VanillaReg 8 _) = Just (RealRegSingle REG_R8)
249
globalRegMaybe (VanillaReg 9 _) = Just (RealRegSingle REG_R9)
252
globalRegMaybe (VanillaReg 10 _) = Just (RealRegSingle REG_R10)
255
globalRegMaybe (FloatReg 1) = Just (RealRegSingle REG_F1)
258
globalRegMaybe (FloatReg 2) = Just (RealRegSingle REG_F2)
261
globalRegMaybe (FloatReg 3) = Just (RealRegSingle REG_F3)
264
globalRegMaybe (FloatReg 4) = Just (RealRegSingle REG_F4)
267
globalRegMaybe (DoubleReg 1) = Just (RealRegPair REG_D1 (REG_D1 + 1))
270
globalRegMaybe (DoubleReg 2) = Just (RealRegPair REG_D2 (REG_D2 + 1))
273
globalRegMaybe Sp = Just (RealRegSingle REG_Sp)
276
globalRegMaybe (LongReg 1) = Just (RealRegSingle REG_Lng1)
279
globalRegMaybe (LongReg 2) = Just (RealRegSingle REG_Lng2)
282
globalRegMaybe SpLim = Just (RealRegSingle REG_SpLim)
285
globalRegMaybe Hp = Just (RealRegSingle REG_Hp)
288
globalRegMaybe HpLim = Just (RealRegSingle REG_HpLim)
290
#ifdef REG_CurrentTSO
291
globalRegMaybe CurrentTSO = Just (RealRegSingle REG_CurrentTSO)
293
#ifdef REG_CurrentNursery
294
globalRegMaybe CurrentNursery = Just (RealRegSingle REG_CurrentNursery)
296
globalRegMaybe _ = Nothing
299
freeReg :: RegNo -> FastBool
300
freeReg = error "SPARC.RegPlate.freeReg: not defined"
302
globalRegMaybe :: GlobalReg -> Maybe RealReg
303
globalRegMaybe = error "SPARC.RegPlate.globalRegMaybe: not defined"