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"