2 % (c) The AQUA Project, Glasgow University, 1996-1998
4 \section[MachRegs]{Machine-specific info about registers}
6 Also includes stuff about immediate operands, which are
7 often/usually quite entangled with registers.
9 (Immediates could be untangled from registers at some cost in tangled
10 modules --- the pleasure has been foregone.)
13 #include "nativeGen/NCG.h"
17 RegClass(..), regClass,
18 Reg(..), isRealReg, isVirtualReg,
19 allocatableRegs, argRegs, allArgRegs, callClobberedRegs,
30 get_MagicId_reg_or_addr,
32 get_Regtable_addr_from_offset,
40 , gp, pv, ra, sp, t9, t10, t11, t12, v0, f0, zeroh
43 , eax, ebx, ecx, edx, esi, esp
44 , fake0, fake1, fake2, fake3, fake4, fake5
48 , fpRel, gReg, iReg, lReg, oReg, largeOffsetError
49 , fp, sp, g0, g1, g2, o0, f0, f6, f8, f26, f27
54 #include "HsVersions.h"
56 import AbsCSyn ( MagicId(..) )
57 import CLabel ( CLabel, mkMainRegTableLabel )
58 import MachOp ( MachOp(..) )
59 import PrimRep ( PrimRep(..), isFloatingRep )
60 import Stix ( StixExpr(..), StixReg(..),
61 getUniqueNat, returnNat, thenNat, NatM )
62 import Unique ( mkPseudoUnique2, Uniquable(..), Unique )
64 import Outputable ( Outputable(..), pprPanic, panic )
65 import qualified Outputable
69 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74 | ImmInteger Integer -- Sigh.
75 | ImmCLbl CLabel -- AbstractC Label (with baggage)
76 | ImmLab Bool Doc -- Simple string label (underscore-able)
77 -- Bool==True ==> in a different DLL
78 | ImmLit Doc -- Simple string
83 | LO Imm -- Possible restrictions...
86 strImmLit s = ImmLit (text s)
89 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100 = AddrBaseIndex Base Index Displacement
103 type Base = Maybe Reg
104 type Index = Maybe (Reg, Int) -- Int is 2, 4 or 8
105 type Displacement = Imm
108 #if sparc_TARGET_ARCH
113 addrOffset :: MachRegsAddr -> Int -> Maybe MachRegsAddr
117 #if alpha_TARGET_ARCH
118 _ -> panic "MachMisc.addrOffset not defined for Alpha"
121 ImmAddr i off0 -> Just (ImmAddr i (off0 + off))
122 AddrBaseIndex r i (ImmInt n) -> Just (AddrBaseIndex r i (ImmInt (n + off)))
123 AddrBaseIndex r i (ImmInteger n)
124 -> Just (AddrBaseIndex r i (ImmInt (fromInteger (n + toInteger off))))
127 #if sparc_TARGET_ARCH
128 AddrRegImm r (ImmInt n)
129 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
130 | otherwise -> Nothing
133 AddrRegImm r (ImmInteger n)
134 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
135 | otherwise -> Nothing
136 where n2 = n + toInteger off
138 AddrRegReg r (RealReg 0)
139 | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
140 | otherwise -> Nothing
147 #if alpha_TARGET_ARCH
149 fits8Bits :: Integer -> Bool
150 fits8Bits i = i >= -256 && i < 256
154 #if sparc_TARGET_ARCH
156 {-# SPECIALIZE fits13Bits :: Int -> Bool, Integer -> Bool #-}
157 fits13Bits :: Integral a => a -> Bool
158 fits13Bits x = x >= -4096 && x < 4096
162 = error ("ERROR: SPARC native-code generator cannot handle large offset ("
163 ++show i++");\nprobably because of large constant data structures;" ++
164 "\nworkaround: use -fvia-C on this module.\n")
169 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
171 @stgReg@: we map STG registers onto appropriate Stix Trees. Either
172 they map to real machine registers or stored as offsets from BaseReg.
173 Given a MagicId, get_MagicId_reg_or_addr produces either the real
174 register it is in, on this platform, or a StixExpr denoting the
175 address in the register table holding it. get_MagicId_addr always
176 produces the register table address for it.
179 get_MagicId_reg_or_addr :: MagicId -> Either Reg StixExpr
180 get_MagicId_addr :: MagicId -> StixExpr
181 get_Regtable_addr_from_offset :: Int -> StixExpr
183 get_MagicId_reg_or_addr mid
184 = case magicIdRegMaybe mid of
186 Nothing -> Right (get_MagicId_addr mid)
188 get_MagicId_addr BaseReg
189 = panic "MachRegs.get_MagicId_addr of BaseReg"
191 = get_Regtable_addr_from_offset (baseRegOffset mid)
193 get_Regtable_addr_from_offset offset_in_words
194 = case magicIdRegMaybe BaseReg of
195 Nothing -> panic "MachRegs.get_Regtable_addr_from_offset: BaseReg not in a reg"
196 Just rr -> StMachOp MO_Nat_Add
197 [StReg (StixMagicId BaseReg),
198 StInt (toInteger (offset_in_words*BYTES_PER_WORD))]
201 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
203 @spRel@ gives us a stack relative addressing mode for volatile
204 temporaries and for excess call arguments. @fpRel@, where
205 applicable, is the same but for the frame pointer.
208 spRel :: Int -- desired stack offset in words, positive or negative
213 = AddrBaseIndex (Just esp) Nothing (ImmInt (n * BYTES_PER_WORD))
215 = AddrRegImm sp (ImmInt (n * BYTES_PER_WORD))
218 #if sparc_TARGET_ARCH
219 fpRel :: Int -> MachRegsAddr
220 -- Duznae work for offsets greater than 13 bits; we just hope for
223 = AddrRegImm fp (ImmInt (n * BYTES_PER_WORD))
227 %************************************************************************
229 \subsection[Reg]{Real registers}
231 %************************************************************************
233 RealRegs are machine regs which are available for allocation, in the
234 usual way. We know what class they are, because that's part of the
235 processor's architecture.
237 VirtualRegs are virtual registers. The register allocator will
238 eventually have to map them into RealRegs, or into spill slots.
239 VirtualRegs are allocated on the fly, usually to represent a single
240 value in the abstract assembly code (i.e. dynamic registers are
241 usually single assignment). With the new register allocator, the
242 single assignment restriction isn't necessary to get correct code,
243 although a better register allocation will result if single assignment
244 is used -- because the allocator maps a VirtualReg into a single
245 RealReg, even if the VirtualReg has multiple live ranges.
247 Virtual regs can be of either class, so that info is attached.
263 unRealReg (RealReg i) = i
264 unRealReg vreg = pprPanic "unRealReg on VirtualReg" (ppr vreg)
266 mkVReg :: Unique -> PrimRep -> Reg
268 #if sparc_TARGET_ARCH
270 FloatRep -> VirtualRegF u
271 DoubleRep -> VirtualRegD u
272 other -> VirtualRegI u
274 = if isFloatingRep pk then VirtualRegD u else VirtualRegI u
277 isVirtualReg (RealReg _) = False
278 isVirtualReg (VirtualRegI _) = True
279 isVirtualReg (VirtualRegF _) = True
280 isVirtualReg (VirtualRegD _) = True
281 isRealReg = not . isVirtualReg
283 getNewRegNCG :: PrimRep -> NatM Reg
285 = getUniqueNat `thenNat` \ u -> returnNat (mkVReg u pk)
287 instance Eq Reg where
288 (==) (RealReg i1) (RealReg i2) = i1 == i2
289 (==) (VirtualRegI u1) (VirtualRegI u2) = u1 == u2
290 (==) (VirtualRegF u1) (VirtualRegF u2) = u1 == u2
291 (==) (VirtualRegD u1) (VirtualRegD u2) = u1 == u2
292 (==) reg1 reg2 = False
294 instance Ord Reg where
295 compare (RealReg i1) (RealReg i2) = compare i1 i2
296 compare (RealReg _) (VirtualRegI _) = LT
297 compare (RealReg _) (VirtualRegF _) = LT
298 compare (RealReg _) (VirtualRegD _) = LT
300 compare (VirtualRegI _) (RealReg _) = GT
301 compare (VirtualRegI u1) (VirtualRegI u2) = compare u1 u2
302 compare (VirtualRegI _) (VirtualRegF _) = LT
303 compare (VirtualRegI _) (VirtualRegD _) = LT
305 compare (VirtualRegF _) (RealReg _) = GT
306 compare (VirtualRegF _) (VirtualRegI _) = GT
307 compare (VirtualRegF u1) (VirtualRegF u2) = compare u1 u2
308 compare (VirtualRegF _) (VirtualRegD _) = LT
310 compare (VirtualRegD _) (RealReg _) = GT
311 compare (VirtualRegD _) (VirtualRegI _) = GT
312 compare (VirtualRegD _) (VirtualRegF _) = GT
313 compare (VirtualRegD u1) (VirtualRegD u2) = compare u1 u2
316 instance Show Reg where
317 showsPrec _ (RealReg i) = showString (showReg i)
318 showsPrec _ (VirtualRegI u) = showString "%vI_" . shows u
319 showsPrec _ (VirtualRegF u) = showString "%vF_" . shows u
320 showsPrec _ (VirtualRegD u) = showString "%vD_" . shows u
322 instance Outputable Reg where
323 ppr r = Outputable.text (show r)
325 instance Uniquable Reg where
326 getUnique (RealReg i) = mkPseudoUnique2 i
327 getUnique (VirtualRegI u) = u
328 getUnique (VirtualRegF u) = u
329 getUnique (VirtualRegD u) = u
332 ** Machine-specific Reg stuff: **
334 The Alpha has 64 registers of interest; 32 integer registers and 32 floating
335 point registers. The mapping of STG registers to alpha machine registers
336 is defined in StgRegs.h. We are, of course, prepared for any eventuality.
338 #if alpha_TARGET_ARCH
342 v0, f0, ra, pv, gp, sp, zeroh :: Reg
344 f0 = realReg (fReg 0)
345 ra = FixedReg ILIT(26)
347 gp = FixedReg ILIT(29)
348 sp = FixedReg ILIT(30)
349 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
351 t9, t10, t11, t12 :: Reg
359 Intel x86 architecture:
360 - All registers except 7 (esp) are available for use.
361 - Only ebx, esi, edi and esp are available across a C call (they are callee-saves).
362 - Registers 0-7 have 16-bit counterparts (ax, bx etc.)
363 - Registers 0-3 have 8 bit counterparts (ah, bh etc.)
364 - Registers 8-13 are fakes; we pretend x86 has 6 conventionally-addressable
365 fp registers, and 3-operand insns for them, and we translate this into
366 real stack-based x86 fp code after register allocation.
368 The fp registers are all Double registers; we don't have any RcFloat class
369 regs. @regClass@ barfs if you give it a VirtualRegF, and mkVReg above should
375 fake0, fake1, fake2, fake3, fake4, fake5,
376 eax, ebx, ecx, edx, esp, ebp, esi, edi :: Reg
392 regClass (RealReg i) = if i < 8 then RcInteger else RcDouble
393 regClass (VirtualRegI u) = RcInteger
394 regClass (VirtualRegD u) = RcDouble
395 regClass (VirtualRegF u) = pprPanic "regClass(x86):VirtualRegF"
396 (ppr (VirtualRegF u))
399 = ["%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp", "%esp",
400 "%fake0", "%fake1", "%fake2", "%fake3", "%fake4", "%fake5", "%fake6"]
402 showReg :: Int -> String
404 = if n >= 0 && n < 14
406 else "%unknown_x86_real_reg_" ++ show n
411 The SPARC has 64 registers of interest; 32 integer registers and 32
412 floating point registers. The mapping of STG registers to SPARC
413 machine registers is defined in StgRegs.h. We are, of course,
414 prepared for any eventuality.
416 The whole fp-register pairing thing on sparcs is a huge nuisance. See
417 fptools/ghc/includes/MachRegs.h for a description of what's going on
421 #if sparc_TARGET_ARCH
423 gReg,lReg,iReg,oReg,fReg :: Int -> Int
430 nCG_FirstFloatReg :: Int
431 nCG_FirstFloatReg = unRealReg NCG_FirstFloatReg
433 regClass (VirtualRegI u) = RcInteger
434 regClass (VirtualRegF u) = RcFloat
435 regClass (VirtualRegD u) = RcDouble
436 regClass (RealReg i) | i < 32 = RcInteger
437 | i < nCG_FirstFloatReg = RcDouble
438 | otherwise = RcFloat
440 showReg :: Int -> String
442 | n >= 0 && n < 8 = "%g" ++ show n
443 | n >= 8 && n < 16 = "%o" ++ show (n-8)
444 | n >= 16 && n < 24 = "%l" ++ show (n-16)
445 | n >= 24 && n < 32 = "%i" ++ show (n-24)
446 | n >= 32 && n < 64 = "%f" ++ show (n-32)
447 | otherwise = "%unknown_sparc_real_reg_" ++ show n
449 g0, g1, g2, fp, sp, o0, f0, f1, f6, f8, f22, f26, f27 :: Reg
451 f6 = RealReg (fReg 6)
452 f8 = RealReg (fReg 8)
453 f22 = RealReg (fReg 22)
454 f26 = RealReg (fReg 26)
455 f27 = RealReg (fReg 27)
458 -- g0 is useful for codegen; is always zero, and writes to it vanish.
459 g0 = RealReg (gReg 0)
460 g1 = RealReg (gReg 1)
461 g2 = RealReg (gReg 2)
463 -- FP, SP, int and float return (from C) regs.
464 fp = RealReg (iReg 6)
465 sp = RealReg (oReg 6)
466 o0 = RealReg (oReg 0)
467 f0 = RealReg (fReg 0)
468 f1 = RealReg (fReg 1)
473 Redefine the literals used for machine-registers with non-numeric
474 names in the header files. Gag me with a spoon, eh?
476 #if alpha_TARGET_ARCH
526 #if sparc_TARGET_ARCH
597 baseRegOffset :: MagicId -> Int
599 baseRegOffset (VanillaReg _ 1#) = OFFSET_R1
600 baseRegOffset (VanillaReg _ 2#) = OFFSET_R2
601 baseRegOffset (VanillaReg _ 3#) = OFFSET_R3
602 baseRegOffset (VanillaReg _ 4#) = OFFSET_R4
603 baseRegOffset (VanillaReg _ 5#) = OFFSET_R5
604 baseRegOffset (VanillaReg _ 6#) = OFFSET_R6
605 baseRegOffset (VanillaReg _ 7#) = OFFSET_R7
606 baseRegOffset (VanillaReg _ 8#) = OFFSET_R8
607 baseRegOffset (VanillaReg _ 9#) = OFFSET_R9
608 baseRegOffset (VanillaReg _ 10#) = OFFSET_R10
609 baseRegOffset (FloatReg 1#) = OFFSET_F1
610 baseRegOffset (FloatReg 2#) = OFFSET_F2
611 baseRegOffset (FloatReg 3#) = OFFSET_F3
612 baseRegOffset (FloatReg 4#) = OFFSET_F4
613 baseRegOffset (DoubleReg 1#) = OFFSET_D1
614 baseRegOffset (DoubleReg 2#) = OFFSET_D2
615 baseRegOffset Sp = OFFSET_Sp
616 baseRegOffset Su = OFFSET_Su
617 baseRegOffset SpLim = OFFSET_SpLim
619 baseRegOffset (LongReg _ 1#) = OFFSET_L1
621 baseRegOffset Hp = OFFSET_Hp
622 baseRegOffset HpLim = OFFSET_HpLim
623 baseRegOffset CurrentTSO = OFFSET_CurrentTSO
624 baseRegOffset CurrentNursery = OFFSET_CurrentNursery
625 baseRegOffset HpAlloc = OFFSET_HpAlloc
627 baseRegOffset BaseReg = panic "baseRegOffset:BaseReg"
628 baseRegOffset CurCostCentre = panic "baseRegOffset:CurCostCentre"
629 baseRegOffset VoidReg = panic "baseRegOffset:VoidReg"
634 callerSaves :: MagicId -> Bool
636 #ifdef CALLER_SAVES_Base
637 callerSaves BaseReg = True
639 #ifdef CALLER_SAVES_R1
640 callerSaves (VanillaReg _ ILIT(1)) = True
642 #ifdef CALLER_SAVES_R2
643 callerSaves (VanillaReg _ ILIT(2)) = True
645 #ifdef CALLER_SAVES_R3
646 callerSaves (VanillaReg _ ILIT(3)) = True
648 #ifdef CALLER_SAVES_R4
649 callerSaves (VanillaReg _ ILIT(4)) = True
651 #ifdef CALLER_SAVES_R5
652 callerSaves (VanillaReg _ ILIT(5)) = True
654 #ifdef CALLER_SAVES_R6
655 callerSaves (VanillaReg _ ILIT(6)) = True
657 #ifdef CALLER_SAVES_R7
658 callerSaves (VanillaReg _ ILIT(7)) = True
660 #ifdef CALLER_SAVES_R8
661 callerSaves (VanillaReg _ ILIT(8)) = True
663 #ifdef CALLER_SAVES_F1
664 callerSaves (FloatReg 1#) = True
666 #ifdef CALLER_SAVES_F2
667 callerSaves (FloatReg 2#) = True
669 #ifdef CALLER_SAVES_F3
670 callerSaves (FloatReg 3#) = True
672 #ifdef CALLER_SAVES_F4
673 callerSaves (FloatReg 4#) = True
675 #ifdef CALLER_SAVES_D1
676 callerSaves (DoubleReg 1#) = True
678 #ifdef CALLER_SAVES_D2
679 callerSaves (DoubleReg 2#) = True
681 #ifdef CALLER_SAVES_L1
682 callerSaves (LongReg _ ILIT(1)) = True
684 #ifdef CALLER_SAVES_Sp
685 callerSaves Sp = True
687 #ifdef CALLER_SAVES_Su
688 callerSaves Su = True
690 #ifdef CALLER_SAVES_SpLim
691 callerSaves SpLim = True
693 #ifdef CALLER_SAVES_Hp
694 callerSaves Hp = True
696 #ifdef CALLER_SAVES_HpLim
697 callerSaves HpLim = True
699 #ifdef CALLER_SAVES_CurrentTSO
700 callerSaves CurrentTSO = True
702 #ifdef CALLER_SAVES_CurrentNursery
703 callerSaves CurrentNursery = True
705 callerSaves _ = False
709 magicIdRegMaybe :: MagicId -> Maybe Reg
712 magicIdRegMaybe BaseReg = Just (RealReg REG_Base)
715 magicIdRegMaybe (VanillaReg _ 1#) = Just (RealReg REG_R1)
718 magicIdRegMaybe (VanillaReg _ 2#) = Just (RealReg REG_R2)
721 magicIdRegMaybe (VanillaReg _ 3#) = Just (RealReg REG_R3)
724 magicIdRegMaybe (VanillaReg _ 4#) = Just (RealReg REG_R4)
727 magicIdRegMaybe (VanillaReg _ 5#) = Just (RealReg REG_R5)
730 magicIdRegMaybe (VanillaReg _ 6#) = Just (RealReg REG_R6)
733 magicIdRegMaybe (VanillaReg _ 7#) = Just (RealReg REG_R7)
736 magicIdRegMaybe (VanillaReg _ 8#) = Just (RealReg REG_R8)
739 magicIdRegMaybe (VanillaReg _ 9#) = Just (RealReg REG_R9)
742 magicIdRegMaybe (VanillaReg _ 10#) = Just (RealReg REG_R10)
745 magicIdRegMaybe (FloatReg 1#) = Just (RealReg REG_F1)
748 magicIdRegMaybe (FloatReg 2#) = Just (RealReg REG_F2)
751 magicIdRegMaybe (FloatReg 3#) = Just (RealReg REG_F3)
754 magicIdRegMaybe (FloatReg 4#) = Just (RealReg REG_F4)
757 magicIdRegMaybe (DoubleReg 1#) = Just (RealReg REG_D1)
760 magicIdRegMaybe (DoubleReg 2#) = Just (RealReg REG_D2)
763 magicIdRegMaybe Sp = Just (RealReg REG_Sp)
766 magicIdRegMaybe (LongReg _ ILIT(1)) = Just (RealReg REG_Lng1)
769 magicIdRegMaybe (LongReg _ ILIT(2)) = Just (RealReg REG_Lng2)
772 magicIdRegMaybe Su = Just (RealReg REG_Su)
775 magicIdRegMaybe SpLim = Just (RealReg REG_SpLim)
778 magicIdRegMaybe Hp = Just (RealReg REG_Hp)
781 magicIdRegMaybe HpLim = Just (RealReg REG_HpLim)
783 #ifdef REG_CurrentTSO
784 magicIdRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
786 #ifdef REG_CurrentNursery
787 magicIdRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
789 magicIdRegMaybe _ = Nothing
793 -------------------------------
794 -- allMachRegs is the complete set of machine regs.
795 allMachRegNos :: [Int]
797 = IF_ARCH_alpha( [0..63],
798 IF_ARCH_i386( [0..13],
799 IF_ARCH_sparc( ([0..31]
800 ++ [f0,f2 .. nCG_FirstFloatReg-1]
801 ++ [nCG_FirstFloatReg .. f31]),
803 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
804 -- i.e., these are the regs for which we are prepared to allow the
805 -- register allocator to attempt to map VRegs to.
806 allocatableRegs :: [Reg]
808 = let isFree i = isFastTrue (freeReg i)
809 in map RealReg (filter isFree allMachRegNos)
811 -------------------------------
812 -- these are the regs which we cannot assume stay alive over a
814 callClobberedRegs :: [Reg]
817 #if alpha_TARGET_ARCH
818 [0, 1, 2, 3, 4, 5, 6, 7, 8,
819 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
820 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
821 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
822 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
823 #endif {- alpha_TARGET_ARCH -}
825 -- caller-saves registers
826 map RealReg [eax,ecx,edx,fake0,fake1,fake2,fake3,fake4,fake5]
827 #endif {- i386_TARGET_ARCH -}
828 #if sparc_TARGET_ARCH
831 [oReg i | i <- [0..5]] ++
832 [gReg i | i <- [1..7]] ++
833 [fReg i | i <- [0..31]] )
834 #endif {- sparc_TARGET_ARCH -}
836 -------------------------------
837 -- argRegs is the set of regs which are read for an n-argument call to C.
838 -- For archs which pass all args on the stack (x86), is empty.
839 -- Sparc passes up to the first 6 args in regs.
840 -- Dunno about Alpha.
841 argRegs :: Int -> [Reg]
844 argRegs _ = panic "MachRegs.argRegs(x86): should not be used!"
847 #if alpha_TARGET_ARCH
849 argRegs 1 = freeMappedRegs [16, fReg 16]
850 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
851 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
852 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
853 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
854 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
855 argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
856 #endif {- alpha_TARGET_ARCH -}
858 #if sparc_TARGET_ARCH
860 argRegs 1 = map (RealReg . oReg) [0]
861 argRegs 2 = map (RealReg . oReg) [0,1]
862 argRegs 3 = map (RealReg . oReg) [0,1,2]
863 argRegs 4 = map (RealReg . oReg) [0,1,2,3]
864 argRegs 5 = map (RealReg . oReg) [0,1,2,3,4]
865 argRegs 6 = map (RealReg . oReg) [0,1,2,3,4,5]
866 argRegs _ = panic "MachRegs.argRegs(sparc): don't know about >6 arguments!"
867 #endif {- sparc_TARGET_ARCH -}
869 -------------------------------
870 -- all of the arg regs ??
871 #if alpha_TARGET_ARCH
872 allArgRegs :: [(Reg, Reg)]
873 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
874 #endif {- alpha_TARGET_ARCH -}
876 #if sparc_TARGET_ARCH
878 allArgRegs = map RealReg [oReg i | i <- [0..5]]
879 #endif {- sparc_TARGET_ARCH -}
883 allArgRegs = panic "MachRegs.allArgRegs(x86): should not be used!"
888 freeReg :: Int -> FastBool
890 #if alpha_TARGET_ARCH
891 freeReg 26 = fastBool False -- return address (ra)
892 freeReg 28 = fastBool False -- reserved for the assembler (at)
893 freeReg 29 = fastBool False -- global pointer (gp)
894 freeReg 30 = fastBool False -- stack pointer (sp)
895 freeReg 31 = fastBool False -- always zero (zeroh)
896 freeReg 63 = fastBool False -- always zero (f31)
900 freeReg esp = fastBool False -- %esp is the C stack pointer
903 #if sparc_TARGET_ARCH
904 freeReg g0 = fastBool False -- %g0 is always 0.
905 freeReg g5 = fastBool False -- %g5 is reserved (ABI).
906 freeReg g6 = fastBool False -- %g6 is reserved (ABI).
907 freeReg g7 = fastBool False -- %g7 is reserved (ABI).
908 freeReg i6 = fastBool False -- %i6 is our frame pointer.
909 freeReg i7 = fastBool False -- %i7 tends to have ret-addr-ish things
910 freeReg o6 = fastBool False -- %o6 is our stack pointer.
911 freeReg o7 = fastBool False -- %o7 holds ret addrs (???)
912 freeReg f0 = fastBool False -- %f0/%f1 are the C fp return registers.
913 freeReg f1 = fastBool False
917 freeReg REG_Base = fastBool False
920 freeReg REG_R1 = fastBool False
923 freeReg REG_R2 = fastBool False
926 freeReg REG_R3 = fastBool False
929 freeReg REG_R4 = fastBool False
932 freeReg REG_R5 = fastBool False
935 freeReg REG_R6 = fastBool False
938 freeReg REG_R7 = fastBool False
941 freeReg REG_R8 = fastBool False
944 freeReg REG_F1 = fastBool False
947 freeReg REG_F2 = fastBool False
950 freeReg REG_F3 = fastBool False
953 freeReg REG_F4 = fastBool False
956 freeReg REG_D1 = fastBool False
959 freeReg REG_D2 = fastBool False
962 freeReg REG_Sp = fastBool False
965 freeReg REG_Su = fastBool False
968 freeReg REG_SpLim = fastBool False
971 freeReg REG_Hp = fastBool False
974 freeReg REG_HpLim = fastBool False
976 freeReg n = fastBool True