1 -- -----------------------------------------------------------------------------
3 -- (c) The University of Glasgow 1994-2004
5 -- -----------------------------------------------------------------------------
13 -- machine specific info
14 gReg, iReg, lReg, oReg, fReg,
15 fp, sp, g0, g1, g2, o0, o1, f0, f6, f8, f22, f26, f27,
23 get_GlobalReg_reg_or_addr,
43 import CgUtils ( get_GlobalReg_addr )
54 The SPARC has 64 registers of interest; 32 integer registers and 32
55 floating point registers. The mapping of STG registers to SPARC
56 machine registers is defined in StgRegs.h. We are, of course,
57 prepared for any eventuality.
59 The whole fp-register pairing thing on sparcs is a huge nuisance. See
60 fptools/ghc/includes/MachRegs.h for a description of what's going on
65 -- | Get the standard name for the register with this number.
66 showReg :: RegNo -> String
68 | n >= 0 && n < 8 = "%g" ++ show n
69 | n >= 8 && n < 16 = "%o" ++ show (n-8)
70 | n >= 16 && n < 24 = "%l" ++ show (n-16)
71 | n >= 24 && n < 32 = "%i" ++ show (n-24)
72 | n >= 32 && n < 64 = "%f" ++ show (n-32)
73 | otherwise = panic "SPARC.Regs.showReg: unknown sparc register"
76 -- | Get the class of a register.
77 {-# INLINE regClass #-}
78 regClass :: Reg -> RegClass
81 VirtualRegI _ -> RcInteger
82 VirtualRegHi _ -> RcInteger
83 VirtualRegF _ -> RcFloat
84 VirtualRegD _ -> RcDouble
87 | i < nCG_FirstFloatReg -> RcDouble
88 | otherwise -> RcFloat
91 -- | The RegNos corresponding to all the registers in the machine.
92 -- For SPARC we use f0-f22 as doubles, so pretend that the high halves
93 -- of these, ie f23, f25 .. don't exist.
95 allMachRegNos :: [RegNo]
98 ++ [32,34 .. nCG_FirstFloatReg-1]
99 ++ [nCG_FirstFloatReg .. 63])
102 -- | Get the regno for this sort of reg
103 gReg, lReg, iReg, oReg, fReg :: Int -> RegNo
105 gReg x = x -- global regs
106 oReg x = (8 + x) -- output regs
107 lReg x = (16 + x) -- local regs
108 iReg x = (24 + x) -- input regs
109 fReg x = (32 + x) -- float regs
112 -- | Some specific regs used by the code generator.
113 g0, g1, g2, fp, sp, o0, o1, f0, f6, f8, f22, f26, f27 :: Reg
115 f6 = RealReg (fReg 6)
116 f8 = RealReg (fReg 8)
117 f22 = RealReg (fReg 22)
118 f26 = RealReg (fReg 26)
119 f27 = RealReg (fReg 27)
121 g0 = RealReg (gReg 0) -- g0 is always zero, and writes to it vanish.
122 g1 = RealReg (gReg 1)
123 g2 = RealReg (gReg 2)
125 -- FP, SP, int and float return (from C) regs.
126 fp = RealReg (iReg 6)
127 sp = RealReg (oReg 6)
128 o0 = RealReg (oReg 0)
129 o1 = RealReg (oReg 1)
130 f0 = RealReg (fReg 0)
133 -- | We use he first few float regs as double precision.
134 -- This is the RegNo of the first float regs we use as single precision.
136 nCG_FirstFloatReg :: RegNo
137 nCG_FirstFloatReg = 54
140 -- | Produce the second-half-of-a-double register given the first half.
141 fPair :: Reg -> Maybe Reg
143 | n >= 32 && n `mod` 2 == 0 = Just (RealReg (n+1))
145 fPair (VirtualRegD u)
146 = Just (VirtualRegHi u)
149 = trace ("MachInstrs.fPair: can't get high half of supposed double reg ")
153 -- | Check whether a machine register is free for allocation.
154 -- This needs to match the info in includes/MachRegs.h otherwise modules
155 -- compiled with the NCG won't be compatible with via-C ones.
157 freeReg :: RegNo -> FastBool
160 -- %g0(r0) is always 0.
163 -- %g1(r1) - %g4(r4) are allocable -----------------
166 -- are reserved for the OS
171 -- %o0(r8) - %o5(r13) are allocable ----------------
174 -- is the C stack pointer
178 -- holds C return addresses (???)
181 -- %l0(r16) is allocable ---------------------------
183 -- %l1(r17) - %l5(r21)
184 -- are STG regs R1 - R5
191 -- %l6(r22) - %l7(r23) are allocable --------------
193 -- %i0(r24) - %i5(r29)
194 -- are STG regs Sp, Base, SpLim, Hp, HpLim, R6
203 -- is the C frame pointer
207 -- is used for C return addresses
210 -- %f0(r32) - %f1(r33)
211 -- are C fp return registers
215 -- %f2(r34) - %f5(r37)
216 -- are STG regs D1 - D2
222 -- %f22(r54) - %f25(r57)
223 -- are STG regs F1 - F4
229 -- regs not matched above are allocable.
233 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
234 -- i.e., these are the regs for which we are prepared to allow the
235 -- register allocator to attempt to map VRegs to.
236 allocatableRegs :: [RegNo]
238 = let isFree i = isFastTrue (freeReg i)
239 in filter isFree allMachRegNos
242 -- | Returns Just the real register that a global register is stored in.
243 -- Returns Nothing if the global has no real register, and is stored
244 -- in the in-memory register table instead.
246 globalRegMaybe :: GlobalReg -> Maybe Reg
249 -- Argument and return regs
250 VanillaReg 1 _ -> Just (RealReg 17) -- %l1
251 VanillaReg 2 _ -> Just (RealReg 18) -- %l2
252 VanillaReg 3 _ -> Just (RealReg 19) -- %l3
253 VanillaReg 4 _ -> Just (RealReg 20) -- %l4
254 VanillaReg 5 _ -> Just (RealReg 21) -- %l5
255 VanillaReg 6 _ -> Just (RealReg 29) -- %i5
257 FloatReg 1 -> Just (RealReg 54) -- %f22
258 FloatReg 2 -> Just (RealReg 55) -- %f23
259 FloatReg 3 -> Just (RealReg 56) -- %f24
260 FloatReg 4 -> Just (RealReg 57) -- %f25
262 DoubleReg 1 -> Just (RealReg 34) -- %f2
263 DoubleReg 2 -> Just (RealReg 36) -- %f4
266 Sp -> Just (RealReg 24) -- %i0
267 SpLim -> Just (RealReg 26) -- %i2
268 Hp -> Just (RealReg 27) -- %i3
269 HpLim -> Just (RealReg 28) -- %i4
271 BaseReg -> Just (RealReg 25) -- %i1
276 -- We map STG registers onto appropriate CmmExprs. Either they map
277 -- to real machine registers or stored as offsets from BaseReg. Given
278 -- a GlobalReg, get_GlobalReg_reg_or_addr produces either the real
279 -- register it is in, on this platform, or a CmmExpr denoting the
280 -- address in the register table holding it.
281 -- (See also get_GlobalReg_addr in CgUtils.)
283 get_GlobalReg_reg_or_addr :: GlobalReg -> Either Reg CmmExpr
284 get_GlobalReg_reg_or_addr mid
285 = case globalRegMaybe mid of
287 Nothing -> Right (get_GlobalReg_addr mid)
290 -- | The registers to place arguments for function calls,
291 -- for some number of arguments.
293 argRegs :: RegNo -> [Reg]
297 1 -> map (RealReg . oReg) [0]
298 2 -> map (RealReg . oReg) [0,1]
299 3 -> map (RealReg . oReg) [0,1,2]
300 4 -> map (RealReg . oReg) [0,1,2,3]
301 5 -> map (RealReg . oReg) [0,1,2,3,4]
302 6 -> map (RealReg . oReg) [0,1,2,3,4,5]
303 _ -> panic "MachRegs.argRegs(sparc): don't know about >6 arguments!"
306 -- | All all the regs that could possibly be returned by argRegs
310 = map RealReg [oReg i | i <- [0..5]]
313 -- These are the regs that we cannot assume stay alive over a C call.
314 -- TODO: Why can we assume that o6 isn't clobbered? -- BL 2009/02
316 callClobberedRegs :: [Reg]
320 [oReg i | i <- [0..5]] ++
321 [gReg i | i <- [1..7]] ++
322 [fReg i | i <- [0..31]] )
326 -- | Make a virtual reg with this size.
327 mkVReg :: Unique -> Size -> Reg
329 | not (isFloatSize size)
334 FF32 -> VirtualRegF u
335 FF64 -> VirtualRegD u
339 regDotColor :: Reg -> SDoc
341 = case regClass reg of
342 RcInteger -> text "blue"
343 RcFloat -> text "red"
344 RcDouble -> text "green"