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 (
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.
22 #ifdef sparc_TARGET_ARCH
94 #include "../includes/MachRegs.h"
96 -- | Check whether a machine register is free for allocation.
97 freeReg :: RegNo -> FastBool
100 -- SPARC regs used by the OS / ABI
101 -- %g0(r0) is always zero
102 freeReg g0 = fastBool False
105 -- are reserved for the OS
106 freeReg g5 = fastBool False
107 freeReg g6 = fastBool False
108 freeReg g7 = fastBool False
111 -- is the C stack pointer
112 freeReg o6 = fastBool False
115 -- holds the C return address
116 freeReg o7 = fastBool False
119 -- is the C frame pointer
120 freeReg i6 = fastBool False
123 -- is used for C return addresses
124 freeReg i7 = fastBool False
126 -- %f0(r32) - %f1(r32)
127 -- are C floating point return regs
128 freeReg f0 = fastBool False
129 freeReg f1 = fastBool False
132 -- don't release high half of double regs
134 , regNo < NCG_FirstFloatReg
137 --------------------------------------
141 freeReg REG_Base = fastBool False
144 freeReg REG_R1 = fastBool False
147 freeReg REG_R2 = fastBool False
150 freeReg REG_R3 = fastBool False
153 freeReg REG_R4 = fastBool False
156 freeReg REG_R5 = fastBool False
159 freeReg REG_R6 = fastBool False
162 freeReg REG_R7 = fastBool False
165 freeReg REG_R8 = fastBool False
168 freeReg REG_F1 = fastBool False
171 freeReg REG_F2 = fastBool False
174 freeReg REG_F3 = fastBool False
177 freeReg REG_F4 = fastBool False
180 freeReg REG_D1 = fastBool False
183 freeReg REG_D2 = fastBool False
186 freeReg REG_Sp = fastBool False
189 freeReg REG_Su = fastBool False
192 freeReg REG_SpLim = fastBool False
195 freeReg REG_Hp = fastBool False
198 freeReg REG_HpLim = fastBool False
200 freeReg _ = fastBool True
204 -- | Returns 'Nothing' if this global register is not stored
205 -- in a real machine register, otherwise returns @'Just' reg@, where
206 -- reg is the machine register it is stored in.
208 globalRegMaybe :: GlobalReg -> Maybe Reg
211 globalRegMaybe BaseReg = Just (RealReg REG_Base)
214 globalRegMaybe (VanillaReg 1 _) = Just (RealReg REG_R1)
217 globalRegMaybe (VanillaReg 2 _) = Just (RealReg REG_R2)
220 globalRegMaybe (VanillaReg 3 _) = Just (RealReg REG_R3)
223 globalRegMaybe (VanillaReg 4 _) = Just (RealReg REG_R4)
226 globalRegMaybe (VanillaReg 5 _) = Just (RealReg REG_R5)
229 globalRegMaybe (VanillaReg 6 _) = Just (RealReg REG_R6)
232 globalRegMaybe (VanillaReg 7 _) = Just (RealReg REG_R7)
235 globalRegMaybe (VanillaReg 8 _) = Just (RealReg REG_R8)
238 globalRegMaybe (VanillaReg 9 _) = Just (RealReg REG_R9)
241 globalRegMaybe (VanillaReg 10 _) = Just (RealReg REG_R10)
244 globalRegMaybe (FloatReg 1) = Just (RealReg REG_F1)
247 globalRegMaybe (FloatReg 2) = Just (RealReg REG_F2)
250 globalRegMaybe (FloatReg 3) = Just (RealReg REG_F3)
253 globalRegMaybe (FloatReg 4) = Just (RealReg REG_F4)
256 globalRegMaybe (DoubleReg 1) = Just (RealReg REG_D1)
259 globalRegMaybe (DoubleReg 2) = Just (RealReg REG_D2)
262 globalRegMaybe Sp = Just (RealReg REG_Sp)
265 globalRegMaybe (LongReg 1) = Just (RealReg REG_Lng1)
268 globalRegMaybe (LongReg 2) = Just (RealReg REG_Lng2)
271 globalRegMaybe SpLim = Just (RealReg REG_SpLim)
274 globalRegMaybe Hp = Just (RealReg REG_Hp)
277 globalRegMaybe HpLim = Just (RealReg REG_HpLim)
279 #ifdef REG_CurrentTSO
280 globalRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
282 #ifdef REG_CurrentNursery
283 globalRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
285 globalRegMaybe _ = Nothing
289 freeReg :: RegNo -> FastBool
290 freeReg = error "SPARC.RegPlate.freeReg: not defined"
292 globalRegMaybe :: GlobalReg -> Maybe Reg
293 globalRegMaybe = error "SPARC.RegPlate.globalRegMaybe: not defined"