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/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
134 -- don't release high half of double regs
136 , regNo < NCG_FirstFloatReg
139 --------------------------------------
143 freeReg REG_Base = fastBool False
146 freeReg REG_R1 = fastBool False
149 freeReg REG_R2 = fastBool False
152 freeReg REG_R3 = fastBool False
155 freeReg REG_R4 = fastBool False
158 freeReg REG_R5 = fastBool False
161 freeReg REG_R6 = fastBool False
164 freeReg REG_R7 = fastBool False
167 freeReg REG_R8 = fastBool False
170 freeReg REG_F1 = fastBool False
173 freeReg REG_F2 = fastBool False
176 freeReg REG_F3 = fastBool False
179 freeReg REG_F4 = fastBool False
182 freeReg REG_D1 = fastBool False
185 freeReg REG_D2 = fastBool False
188 freeReg REG_Sp = fastBool False
191 freeReg REG_Su = fastBool False
194 freeReg REG_SpLim = fastBool False
197 freeReg REG_Hp = fastBool False
200 freeReg REG_HpLim = fastBool False
202 freeReg _ = fastBool True
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.
210 globalRegMaybe :: GlobalReg -> Maybe Reg
213 globalRegMaybe BaseReg = Just (RealReg REG_Base)
216 globalRegMaybe (VanillaReg 1 _) = Just (RealReg REG_R1)
219 globalRegMaybe (VanillaReg 2 _) = Just (RealReg REG_R2)
222 globalRegMaybe (VanillaReg 3 _) = Just (RealReg REG_R3)
225 globalRegMaybe (VanillaReg 4 _) = Just (RealReg REG_R4)
228 globalRegMaybe (VanillaReg 5 _) = Just (RealReg REG_R5)
231 globalRegMaybe (VanillaReg 6 _) = Just (RealReg REG_R6)
234 globalRegMaybe (VanillaReg 7 _) = Just (RealReg REG_R7)
237 globalRegMaybe (VanillaReg 8 _) = Just (RealReg REG_R8)
240 globalRegMaybe (VanillaReg 9 _) = Just (RealReg REG_R9)
243 globalRegMaybe (VanillaReg 10 _) = Just (RealReg REG_R10)
246 globalRegMaybe (FloatReg 1) = Just (RealReg REG_F1)
249 globalRegMaybe (FloatReg 2) = Just (RealReg REG_F2)
252 globalRegMaybe (FloatReg 3) = Just (RealReg REG_F3)
255 globalRegMaybe (FloatReg 4) = Just (RealReg REG_F4)
258 globalRegMaybe (DoubleReg 1) = Just (RealReg REG_D1)
261 globalRegMaybe (DoubleReg 2) = Just (RealReg REG_D2)
264 globalRegMaybe Sp = Just (RealReg REG_Sp)
267 globalRegMaybe (LongReg 1) = Just (RealReg REG_Lng1)
270 globalRegMaybe (LongReg 2) = Just (RealReg REG_Lng2)
273 globalRegMaybe SpLim = Just (RealReg REG_SpLim)
276 globalRegMaybe Hp = Just (RealReg REG_Hp)
279 globalRegMaybe HpLim = Just (RealReg REG_HpLim)
281 #ifdef REG_CurrentTSO
282 globalRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
284 #ifdef REG_CurrentNursery
285 globalRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
287 globalRegMaybe _ = Nothing
291 freeReg :: RegNo -> FastBool
292 freeReg = error "SPARC.RegPlate.freeReg: not defined"
294 globalRegMaybe :: GlobalReg -> Maybe Reg
295 globalRegMaybe = error "SPARC.RegPlate.globalRegMaybe: not defined"