1 -- -----------------------------------------------------------------------------
3 -- (c) The University of Glasgow 1994-2004
5 -- Alpha support is rotted and incomplete.
6 -- -----------------------------------------------------------------------------
15 gp, pv, ra, sp, t9, t10, t11, t12, v0, f0, zeroh
22 #include "nativeGen/NCG.h"
23 #include "HsVersions.h"
24 #include "../includes/stg/MachRegs.h"
30 import CLabel ( CLabel, mkMainCapabilityLabel )
32 import Outputable ( Outputable(..), pprPanic, panic )
33 import qualified Outputable
45 -- | W -- word (2 bytes): UNUSED
47 | L -- longword (4 bytes)
48 | Q -- quadword (8 bytes)
49 -- | FF -- VAX F-style floating pt: UNUSED
50 -- | GF -- VAX G-style floating pt: UNUSED
51 -- | DF -- VAX D-style floating pt: UNUSED
52 -- | SF -- IEEE single-precision floating pt: UNUSED
53 | TF -- IEEE double-precision floating pt
63 addrOffset :: AddrMode -> Int -> Maybe AddrMode
66 _ -> panic "MachMisc.addrOffset not defined for Alpha"
68 fits8Bits :: Integer -> Bool
69 fits8Bits i = i >= -256 && i < 256
72 -- The Alpha has 64 registers of interest; 32 integer registers and 32 floating
73 -- point registers. The mapping of STG registers to alpha machine registers
74 -- is defined in StgRegs.h. We are, of course, prepared for any eventuality.
79 v0, f0, ra, pv, gp, sp, zeroh :: Reg
82 ra = FixedReg ILIT(26)
84 gp = FixedReg ILIT(29)
85 sp = FixedReg ILIT(30)
86 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
88 t9, t10, t11, t12 :: Reg
129 -- allMachRegs is the complete set of machine regs.
130 allMachRegNos :: [RegNo]
131 allMachRegNos = [0..63]
134 -- these are the regs which we cannot assume stay alive over a
136 callClobberedRegs :: [Reg]
138 = [0, 1, 2, 3, 4, 5, 6, 7, 8,
139 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
140 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
141 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
142 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
145 -- argRegs is the set of regs which are read for an n-argument call to C.
146 -- For archs which pass all args on the stack (x86), is empty.
147 -- Sparc passes up to the first 6 args in regs.
148 -- Dunno about Alpha.
149 argRegs :: RegNo -> [Reg]
152 argRegs 1 = freeMappedRegs [16, fReg 16]
153 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
154 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
155 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
156 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
157 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
158 argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
161 -- all of the arg regs ??
162 allArgRegs :: [(Reg, Reg)]
163 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
166 -- horror show -----------------------------------------------------------------
168 freeReg :: RegNo -> FastBool
170 freeReg 26 = fastBool False -- return address (ra)
171 freeReg 28 = fastBool False -- reserved for the assembler (at)
172 freeReg 29 = fastBool False -- global pointer (gp)
173 freeReg 30 = fastBool False -- stack pointer (sp)
174 freeReg 31 = fastBool False -- always zero (zeroh)
175 freeReg 63 = fastBool False -- always zero (f31)
178 freeReg REG_Base = fastBool False
181 freeReg REG_R1 = fastBool False
184 freeReg REG_R2 = fastBool False
187 freeReg REG_R3 = fastBool False
190 freeReg REG_R4 = fastBool False
193 freeReg REG_R5 = fastBool False
196 freeReg REG_R6 = fastBool False
199 freeReg REG_R7 = fastBool False
202 freeReg REG_R8 = fastBool False
205 freeReg REG_F1 = fastBool False
208 freeReg REG_F2 = fastBool False
211 freeReg REG_F3 = fastBool False
214 freeReg REG_F4 = fastBool False
217 freeReg REG_D1 = fastBool False
220 freeReg REG_D2 = fastBool False
223 freeReg REG_Sp = fastBool False
226 freeReg REG_Su = fastBool False
229 freeReg REG_SpLim = fastBool False
232 freeReg REG_Hp = fastBool False
235 freeReg REG_HpLim = fastBool False
237 freeReg n = fastBool True
240 -- | Returns 'Nothing' if this global register is not stored
241 -- in a real machine register, otherwise returns @'Just' reg@, where
242 -- reg is the machine register it is stored in.
244 globalRegMaybe :: GlobalReg -> Maybe Reg
247 globalRegMaybe BaseReg = Just (RealReg REG_Base)
250 globalRegMaybe (VanillaReg 1 _) = Just (RealReg REG_R1)
253 globalRegMaybe (VanillaReg 2 _) = Just (RealReg REG_R2)
256 globalRegMaybe (VanillaReg 3 _) = Just (RealReg REG_R3)
259 globalRegMaybe (VanillaReg 4 _) = Just (RealReg REG_R4)
262 globalRegMaybe (VanillaReg 5 _) = Just (RealReg REG_R5)
265 globalRegMaybe (VanillaReg 6 _) = Just (RealReg REG_R6)
268 globalRegMaybe (VanillaReg 7 _) = Just (RealReg REG_R7)
271 globalRegMaybe (VanillaReg 8 _) = Just (RealReg REG_R8)
274 globalRegMaybe (VanillaReg 9 _) = Just (RealReg REG_R9)
277 globalRegMaybe (VanillaReg 10 _) = Just (RealReg REG_R10)
280 globalRegMaybe (FloatReg 1) = Just (RealReg REG_F1)
283 globalRegMaybe (FloatReg 2) = Just (RealReg REG_F2)
286 globalRegMaybe (FloatReg 3) = Just (RealReg REG_F3)
289 globalRegMaybe (FloatReg 4) = Just (RealReg REG_F4)
292 globalRegMaybe (DoubleReg 1) = Just (RealReg REG_D1)
295 globalRegMaybe (DoubleReg 2) = Just (RealReg REG_D2)
298 globalRegMaybe Sp = Just (RealReg REG_Sp)
301 globalRegMaybe (LongReg 1) = Just (RealReg REG_Lng1)
304 globalRegMaybe (LongReg 2) = Just (RealReg REG_Lng2)
307 globalRegMaybe SpLim = Just (RealReg REG_SpLim)
310 globalRegMaybe Hp = Just (RealReg REG_Hp)
313 globalRegMaybe HpLim = Just (RealReg REG_HpLim)
315 #ifdef REG_CurrentTSO
316 globalRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
318 #ifdef REG_CurrentNursery
319 globalRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
321 globalRegMaybe _ = Nothing