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,
41 , gp, pv, ra, sp, t9, t10, t11, t12, v0, f0, zeroh
44 , eax, ebx, ecx, edx, esi, esp
45 , fake0, fake1, fake2, fake3, fake4, fake5
49 , fpRel, gReg, iReg, lReg, oReg, largeOffsetError
50 , fp, sp, g0, g1, g2, o0, f0, f6, f8, f26, f27
55 #include "HsVersions.h"
57 import AbsCSyn ( MagicId(..) )
58 import AbsCUtils ( magicIdPrimRep )
59 import CLabel ( CLabel, mkMainRegTableLabel )
60 import PrimOp ( PrimOp(..) )
61 import PrimRep ( PrimRep(..), isFloatingRep )
62 import Stix ( StixTree(..), StixReg(..),
63 getUniqueNat, returnNat, thenNat, NatM )
64 import Unique ( mkPseudoUnique2, Uniquable(..), Unique )
68 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
73 | ImmInteger Integer -- Sigh.
74 | ImmCLbl CLabel -- AbstractC Label (with baggage)
75 | ImmLab Bool SDoc -- Simple string label (underscore-able)
76 -- Bool==True ==> in a different DLL
77 | ImmLit SDoc -- Simple string
82 | LO Imm -- Possible restrictions...
85 strImmLit s = ImmLit (text s)
88 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
99 = AddrBaseIndex Base Index Displacement
102 type Base = Maybe Reg
103 type Index = Maybe (Reg, Int) -- Int is 2, 4 or 8
104 type Displacement = Imm
107 #if sparc_TARGET_ARCH
112 addrOffset :: MachRegsAddr -> Int -> Maybe MachRegsAddr
116 #if alpha_TARGET_ARCH
117 _ -> panic "MachMisc.addrOffset not defined for Alpha"
120 ImmAddr i off0 -> Just (ImmAddr i (off0 + off))
121 AddrBaseIndex r i (ImmInt n) -> Just (AddrBaseIndex r i (ImmInt (n + off)))
122 AddrBaseIndex r i (ImmInteger n)
123 -> Just (AddrBaseIndex r i (ImmInt (fromInteger (n + toInteger off))))
126 #if sparc_TARGET_ARCH
127 AddrRegImm r (ImmInt n)
128 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
129 | otherwise -> Nothing
132 AddrRegImm r (ImmInteger n)
133 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
134 | otherwise -> Nothing
135 where n2 = n + toInteger off
137 AddrRegReg r (RealReg 0)
138 | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
139 | otherwise -> Nothing
146 #if alpha_TARGET_ARCH
148 fits8Bits :: Integer -> Bool
149 fits8Bits i = i >= -256 && i < 256
153 #if sparc_TARGET_ARCH
155 {-# SPECIALIZE fits13Bits :: Int -> Bool, Integer -> Bool #-}
156 fits13Bits :: Integral a => a -> Bool
157 fits13Bits x = x >= -4096 && x < 4096
161 = error ("ERROR: SPARC native-code generator cannot handle large offset ("
162 ++show i++");\nprobably because of large constant data structures;" ++
163 "\nworkaround: use -fvia-C on this module.\n")
168 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
170 @stgReg@: we map STG registers onto appropriate Stix Trees. First, we
171 handle the two constants, @STK_STUB_closure@ and @vtbl_StdUpdFrame@.
172 The rest are either in real machine registers or stored as offsets
176 data RegLoc = Save StixTree | Always StixTree
179 Trees for register save locations:
181 saveLoc :: MagicId -> StixTree
183 saveLoc reg = case (stgReg reg) of {Always loc -> loc; Save loc -> loc}
187 stgReg :: MagicId -> RegLoc
190 = case (magicIdRegMaybe x) of
191 Just _ -> Save nonReg
192 Nothing -> Always nonReg
194 offset = baseRegOffset x
196 baseLoc = case (magicIdRegMaybe BaseReg) of
197 Just _ -> StReg (StixMagicId BaseReg)
198 Nothing -> StCLbl mkMainRegTableLabel
201 BaseReg -> StCLbl mkMainRegTableLabel
203 _ -> StInd (magicIdPrimRep x)
204 (StPrim IntAddOp [baseLoc,
205 StInt (toInteger (offset*BYTES_PER_WORD))])
208 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
210 @spRel@ gives us a stack relative addressing mode for volatile
211 temporaries and for excess call arguments. @fpRel@, where
212 applicable, is the same but for the frame pointer.
215 spRel :: Int -- desired stack offset in words, positive or negative
220 = AddrBaseIndex (Just esp) Nothing (ImmInt (n * BYTES_PER_WORD))
222 = AddrRegImm sp (ImmInt (n * BYTES_PER_WORD))
225 #if sparc_TARGET_ARCH
226 fpRel :: Int -> MachRegsAddr
227 -- Duznae work for offsets greater than 13 bits; we just hope for
230 = AddrRegImm fp (ImmInt (n * BYTES_PER_WORD))
234 %************************************************************************
236 \subsection[Reg]{Real registers}
238 %************************************************************************
240 RealRegs are machine regs which are available for allocation, in the
241 usual way. We know what class they are, because that's part of the
242 processor's architecture.
244 VirtualRegs are virtual registers. The register allocator will
245 eventually have to map them into RealRegs, or into spill slots.
246 VirtualRegs are allocated on the fly, usually to represent a single
247 value in the abstract assembly code (i.e. dynamic registers are
248 usually single assignment). With the new register allocator, the
249 single assignment restriction isn't necessary to get correct code,
250 although a better register allocation will result if single assignment
251 is used -- because the allocator maps a VirtualReg into a single
252 RealReg, even if the VirtualReg has multiple live ranges.
254 Virtual regs can be of either class, so that info is attached.
270 unRealReg (RealReg i) = i
271 unRealReg vreg = pprPanic "unRealReg on VirtualReg" (ppr vreg)
273 mkVReg :: Unique -> PrimRep -> Reg
275 #if sparc_TARGET_ARCH
277 FloatRep -> VirtualRegF u
278 DoubleRep -> VirtualRegD u
279 other -> VirtualRegI u
281 = if isFloatingRep pk then VirtualRegD u else VirtualRegI u
284 isVirtualReg (RealReg _) = False
285 isVirtualReg (VirtualRegI _) = True
286 isVirtualReg (VirtualRegF _) = True
287 isVirtualReg (VirtualRegD _) = True
288 isRealReg = not . isVirtualReg
290 getNewRegNCG :: PrimRep -> NatM Reg
292 = getUniqueNat `thenNat` \ u -> returnNat (mkVReg u pk)
294 instance Eq Reg where
295 (==) (RealReg i1) (RealReg i2) = i1 == i2
296 (==) (VirtualRegI u1) (VirtualRegI u2) = u1 == u2
297 (==) (VirtualRegF u1) (VirtualRegF u2) = u1 == u2
298 (==) (VirtualRegD u1) (VirtualRegD u2) = u1 == u2
299 (==) reg1 reg2 = False
301 instance Ord Reg where
302 compare (RealReg i1) (RealReg i2) = compare i1 i2
303 compare (RealReg _) (VirtualRegI _) = LT
304 compare (RealReg _) (VirtualRegF _) = LT
305 compare (RealReg _) (VirtualRegD _) = LT
307 compare (VirtualRegI _) (RealReg _) = GT
308 compare (VirtualRegI u1) (VirtualRegI u2) = compare u1 u2
309 compare (VirtualRegI _) (VirtualRegF _) = LT
310 compare (VirtualRegI _) (VirtualRegD _) = LT
312 compare (VirtualRegF _) (RealReg _) = GT
313 compare (VirtualRegF _) (VirtualRegI _) = GT
314 compare (VirtualRegF u1) (VirtualRegF u2) = compare u1 u2
315 compare (VirtualRegF _) (VirtualRegD _) = LT
317 compare (VirtualRegD _) (RealReg _) = GT
318 compare (VirtualRegD _) (VirtualRegI _) = GT
319 compare (VirtualRegD _) (VirtualRegF _) = GT
320 compare (VirtualRegD u1) (VirtualRegD u2) = compare u1 u2
323 instance Show Reg where
324 showsPrec _ (RealReg i) = showString (showReg i)
325 showsPrec _ (VirtualRegI u) = showString "%vI_" . shows u
326 showsPrec _ (VirtualRegF u) = showString "%vF_" . shows u
327 showsPrec _ (VirtualRegD u) = showString "%vD_" . shows u
329 instance Outputable Reg where
330 ppr r = text (show r)
332 instance Uniquable Reg where
333 getUnique (RealReg i) = mkPseudoUnique2 i
334 getUnique (VirtualRegI u) = u
335 getUnique (VirtualRegF u) = u
336 getUnique (VirtualRegD u) = u
339 ** Machine-specific Reg stuff: **
341 The Alpha has 64 registers of interest; 32 integer registers and 32 floating
342 point registers. The mapping of STG registers to alpha machine registers
343 is defined in StgRegs.h. We are, of course, prepared for any eventuality.
345 #if alpha_TARGET_ARCH
349 v0, f0, ra, pv, gp, sp, zeroh :: Reg
351 f0 = realReg (fReg 0)
352 ra = FixedReg ILIT(26)
354 gp = FixedReg ILIT(29)
355 sp = FixedReg ILIT(30)
356 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
358 t9, t10, t11, t12 :: Reg
366 Intel x86 architecture:
367 - All registers except 7 (esp) are available for use.
368 - Only ebx, esi, edi and esp are available across a C call (they are callee-saves).
369 - Registers 0-7 have 16-bit counterparts (ax, bx etc.)
370 - Registers 0-3 have 8 bit counterparts (ah, bh etc.)
371 - Registers 8-13 are fakes; we pretend x86 has 6 conventionally-addressable
372 fp registers, and 3-operand insns for them, and we translate this into
373 real stack-based x86 fp code after register allocation.
378 fake0, fake1, fake2, fake3, fake4, fake5,
379 eax, ebx, ecx, edx, esp, ebp, esi, edi :: Reg
395 regClass (RealReg i) = if i < 8 then RcInteger else RcDouble
396 regClass (VirtualRegI u) = RcInteger
397 regClass (VirtualRegF u) = RcFloat
398 regClass (VirtualRegD u) = RcDouble
401 = ["%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp", "%esp",
402 "%fake0", "%fake1", "%fake2", "%fake3", "%fake4", "%fake5", "%fake6"]
404 showReg :: Int -> String
406 = if n >= 0 && n < 14
408 else "%unknown_x86_real_reg_" ++ show n
413 The SPARC has 64 registers of interest; 32 integer registers and 32
414 floating point registers. The mapping of STG registers to SPARC
415 machine registers is defined in StgRegs.h. We are, of course,
416 prepared for any eventuality.
418 The whole fp-register pairing thing on sparcs is a huge nuisance. See
419 fptools/ghc/includes/MachRegs.h for a description of what's going on
423 #if sparc_TARGET_ARCH
425 gReg,lReg,iReg,oReg,fReg :: Int -> Int
432 nCG_FirstFloatReg :: Int
433 nCG_FirstFloatReg = unRealReg NCG_FirstFloatReg
435 regClass (VirtualRegI u) = RcInteger
436 regClass (VirtualRegF u) = RcFloat
437 regClass (VirtualRegD u) = RcDouble
438 regClass (RealReg i) | i < 32 = RcInteger
439 | i < nCG_FirstFloatReg = RcDouble
440 | otherwise = RcFloat
442 showReg :: Int -> String
444 | n >= 0 && n < 8 = "%g" ++ show n
445 | n >= 8 && n < 16 = "%o" ++ show (n-8)
446 | n >= 16 && n < 24 = "%l" ++ show (n-16)
447 | n >= 24 && n < 32 = "%i" ++ show (n-24)
448 | n >= 32 && n < 64 = "%f" ++ show (n-32)
449 | otherwise = "%unknown_sparc_real_reg_" ++ show n
451 g0, g1, g2, fp, sp, o0, f0, f1, f6, f8, f22, f26, f27 :: Reg
453 f6 = RealReg (fReg 6)
454 f8 = RealReg (fReg 8)
455 f22 = RealReg (fReg 22)
456 f26 = RealReg (fReg 26)
457 f27 = RealReg (fReg 27)
460 -- g0 is useful for codegen; is always zero, and writes to it vanish.
461 g0 = RealReg (gReg 0)
462 g1 = RealReg (gReg 1)
463 g2 = RealReg (gReg 2)
465 -- FP, SP, int and float return (from C) regs.
466 fp = RealReg (iReg 6)
467 sp = RealReg (oReg 6)
468 o0 = RealReg (oReg 0)
469 f0 = RealReg (fReg 0)
470 f1 = RealReg (fReg 1)
475 Redefine the literals used for machine-registers with non-numeric
476 names in the header files. Gag me with a spoon, eh?
478 #if alpha_TARGET_ARCH
528 #if sparc_TARGET_ARCH
599 baseRegOffset :: MagicId -> Int
601 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
602 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
603 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
604 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
605 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
606 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
607 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
608 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
609 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
610 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
611 baseRegOffset (FloatReg ILIT(1)) = OFFSET_F1
612 baseRegOffset (FloatReg ILIT(2)) = OFFSET_F2
613 baseRegOffset (FloatReg ILIT(3)) = OFFSET_F3
614 baseRegOffset (FloatReg ILIT(4)) = OFFSET_F4
615 baseRegOffset (DoubleReg ILIT(1)) = OFFSET_D1
616 baseRegOffset (DoubleReg ILIT(2)) = OFFSET_D2
617 baseRegOffset Sp = OFFSET_Sp
618 baseRegOffset Su = OFFSET_Su
619 baseRegOffset SpLim = OFFSET_SpLim
621 baseRegOffset (LongReg _ ILIT(1)) = OFFSET_Lng1
624 baseRegOffset (LongReg _ ILIT(2)) = OFFSET_Lng2
626 baseRegOffset Hp = OFFSET_Hp
627 baseRegOffset HpLim = OFFSET_HpLim
628 baseRegOffset CurrentTSO = OFFSET_CurrentTSO
629 baseRegOffset CurrentNursery = OFFSET_CurrentNursery
631 baseRegOffset BaseReg = panic "baseRegOffset:BaseReg"
632 baseRegOffset CurCostCentre = panic "baseRegOffset:CurCostCentre"
633 baseRegOffset VoidReg = panic "baseRegOffset:VoidReg"
638 callerSaves :: MagicId -> Bool
640 #ifdef CALLER_SAVES_Base
641 callerSaves BaseReg = True
643 #ifdef CALLER_SAVES_R1
644 callerSaves (VanillaReg _ ILIT(1)) = True
646 #ifdef CALLER_SAVES_R2
647 callerSaves (VanillaReg _ ILIT(2)) = True
649 #ifdef CALLER_SAVES_R3
650 callerSaves (VanillaReg _ ILIT(3)) = True
652 #ifdef CALLER_SAVES_R4
653 callerSaves (VanillaReg _ ILIT(4)) = True
655 #ifdef CALLER_SAVES_R5
656 callerSaves (VanillaReg _ ILIT(5)) = True
658 #ifdef CALLER_SAVES_R6
659 callerSaves (VanillaReg _ ILIT(6)) = True
661 #ifdef CALLER_SAVES_R7
662 callerSaves (VanillaReg _ ILIT(7)) = True
664 #ifdef CALLER_SAVES_R8
665 callerSaves (VanillaReg _ ILIT(8)) = True
667 #ifdef CALLER_SAVES_F1
668 callerSaves (FloatReg ILIT(1)) = True
670 #ifdef CALLER_SAVES_F2
671 callerSaves (FloatReg ILIT(2)) = True
673 #ifdef CALLER_SAVES_F3
674 callerSaves (FloatReg ILIT(3)) = True
676 #ifdef CALLER_SAVES_F4
677 callerSaves (FloatReg ILIT(4)) = True
679 #ifdef CALLER_SAVES_D1
680 callerSaves (DoubleReg ILIT(1)) = True
682 #ifdef CALLER_SAVES_D2
683 callerSaves (DoubleReg ILIT(2)) = True
685 #ifdef CALLER_SAVES_L1
686 callerSaves (LongReg _ ILIT(1)) = True
688 #ifdef CALLER_SAVES_Sp
689 callerSaves Sp = True
691 #ifdef CALLER_SAVES_Su
692 callerSaves Su = True
694 #ifdef CALLER_SAVES_SpLim
695 callerSaves SpLim = True
697 #ifdef CALLER_SAVES_Hp
698 callerSaves Hp = True
700 #ifdef CALLER_SAVES_HpLim
701 callerSaves HpLim = True
703 #ifdef CALLER_SAVES_CurrentTSO
704 callerSaves CurrentTSO = True
706 #ifdef CALLER_SAVES_CurrentNursery
707 callerSaves CurrentNursery = True
709 callerSaves _ = False
713 magicIdRegMaybe :: MagicId -> Maybe Reg
716 magicIdRegMaybe BaseReg = Just (RealReg REG_Base)
719 magicIdRegMaybe (VanillaReg _ ILIT(1)) = Just (RealReg REG_R1)
722 magicIdRegMaybe (VanillaReg _ ILIT(2)) = Just (RealReg REG_R2)
725 magicIdRegMaybe (VanillaReg _ ILIT(3)) = Just (RealReg REG_R3)
728 magicIdRegMaybe (VanillaReg _ ILIT(4)) = Just (RealReg REG_R4)
731 magicIdRegMaybe (VanillaReg _ ILIT(5)) = Just (RealReg REG_R5)
734 magicIdRegMaybe (VanillaReg _ ILIT(6)) = Just (RealReg REG_R6)
737 magicIdRegMaybe (VanillaReg _ ILIT(7)) = Just (RealReg REG_R7)
740 magicIdRegMaybe (VanillaReg _ ILIT(8)) = Just (RealReg REG_R8)
743 magicIdRegMaybe (VanillaReg _ ILIT(9)) = Just (RealReg REG_R9)
746 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
749 magicIdRegMaybe (FloatReg ILIT(1)) = Just (RealReg REG_F1)
752 magicIdRegMaybe (FloatReg ILIT(2)) = Just (RealReg REG_F2)
755 magicIdRegMaybe (FloatReg ILIT(3)) = Just (RealReg REG_F3)
758 magicIdRegMaybe (FloatReg ILIT(4)) = Just (RealReg REG_F4)
761 magicIdRegMaybe (DoubleReg ILIT(1)) = Just (RealReg REG_D1)
764 magicIdRegMaybe (DoubleReg ILIT(2)) = Just (RealReg REG_D2)
767 magicIdRegMaybe Sp = Just (RealReg REG_Sp)
770 magicIdRegMaybe (LongReg _ ILIT(1)) = Just (RealReg REG_Lng1)
773 magicIdRegMaybe (LongReg _ ILIT(2)) = Just (RealReg REG_Lng2)
776 magicIdRegMaybe Su = Just (RealReg REG_Su)
779 magicIdRegMaybe SpLim = Just (RealReg REG_SpLim)
782 magicIdRegMaybe Hp = Just (RealReg REG_Hp)
785 magicIdRegMaybe HpLim = Just (RealReg REG_HpLim)
787 #ifdef REG_CurrentTSO
788 magicIdRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
790 #ifdef REG_CurrentNursery
791 magicIdRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
793 magicIdRegMaybe _ = Nothing
797 -------------------------------
798 -- allMachRegs is the complete set of machine regs.
799 allMachRegNos :: [Int]
801 = IF_ARCH_alpha( [0..63],
802 IF_ARCH_i386( [0..13],
803 IF_ARCH_sparc( ([0..31]
804 ++ [f0,f2 .. nCG_FirstFloatReg-1]
805 ++ [nCG_FirstFloatReg .. f31]),
807 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
808 allocatableRegs :: [Reg]
810 = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
811 in filter isFree (map RealReg allMachRegNos)
814 -------------------------------
815 callClobberedRegs :: [Reg]
818 #if alpha_TARGET_ARCH
819 [0, 1, 2, 3, 4, 5, 6, 7, 8,
820 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
821 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
822 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
823 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
824 #endif {- alpha_TARGET_ARCH -}
826 -- caller-saves registers
827 [eax,ecx,edx,fake0,fake1,fake2,fake3,fake4,fake5]
828 #endif {- i386_TARGET_ARCH -}
829 #if sparc_TARGET_ARCH
832 [oReg i | i <- [0..5]] ++
833 [gReg i | i <- [1..7]] ++
834 [fReg i | i <- [0..31]] )
835 #endif {- sparc_TARGET_ARCH -}
837 -------------------------------
838 -- argRegs is the set of regs which are read for an n-argument call to C.
839 -- For archs which pass all args on the stack (x86), is empty.
840 -- Sparc passes up to the first 6 args in regs.
841 -- Dunno about Alpha.
842 argRegs :: Int -> [Reg]
845 argRegs _ = panic "MachRegs.argRegs(x86): should not be used!"
848 #if alpha_TARGET_ARCH
850 argRegs 1 = freeMappedRegs [16, fReg 16]
851 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
852 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
853 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
854 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
855 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
856 argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
857 #endif {- alpha_TARGET_ARCH -}
859 #if sparc_TARGET_ARCH
861 argRegs 1 = map (RealReg . oReg) [0]
862 argRegs 2 = map (RealReg . oReg) [0,1]
863 argRegs 3 = map (RealReg . oReg) [0,1,2]
864 argRegs 4 = map (RealReg . oReg) [0,1,2,3]
865 argRegs 5 = map (RealReg . oReg) [0,1,2,3,4]
866 argRegs 6 = map (RealReg . oReg) [0,1,2,3,4,5]
867 argRegs _ = panic "MachRegs.argRegs(sparc): don't know about >6 arguments!"
868 #endif {- sparc_TARGET_ARCH -}
872 -------------------------------
873 -- all of the arg regs ??
874 #if alpha_TARGET_ARCH
875 allArgRegs :: [(Reg, Reg)]
876 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
877 #endif {- alpha_TARGET_ARCH -}
879 #if sparc_TARGET_ARCH
881 allArgRegs = map RealReg [oReg i | i <- [0..5]]
882 #endif {- sparc_TARGET_ARCH -}
884 #if linux_TARGET_ARCH
886 allArgRegs = panic "MachRegs.allArgRegs(x86): should not be used!"
891 freeReg :: FAST_INT -> FAST_BOOL
893 #if alpha_TARGET_ARCH
894 freeReg ILIT(26) = _FALSE_ -- return address (ra)
895 freeReg ILIT(28) = _FALSE_ -- reserved for the assembler (at)
896 freeReg ILIT(29) = _FALSE_ -- global pointer (gp)
897 freeReg ILIT(30) = _FALSE_ -- stack pointer (sp)
898 freeReg ILIT(31) = _FALSE_ -- always zero (zeroh)
899 freeReg ILIT(63) = _FALSE_ -- always zero (f31)
903 freeReg ILIT(esp) = _FALSE_ -- %esp is the C stack pointer
906 #if sparc_TARGET_ARCH
907 freeReg ILIT(g0) = _FALSE_ -- %g0 is always 0.
908 freeReg ILIT(g5) = _FALSE_ -- %g5 is reserved (ABI).
909 freeReg ILIT(g6) = _FALSE_ -- %g6 is reserved (ABI).
910 freeReg ILIT(g7) = _FALSE_ -- %g7 is reserved (ABI).
911 freeReg ILIT(i6) = _FALSE_ -- %i6 is our frame pointer.
912 freeReg ILIT(o6) = _FALSE_ -- %o6 is our stack pointer.
913 freeReg ILIT(f0) = _FALSE_ -- %f0/%f1 are the C fp return registers.
914 freeReg ILIT(f1) = _FALSE_
918 freeReg ILIT(REG_Base) = _FALSE_
921 freeReg ILIT(REG_R1) = _FALSE_
924 freeReg ILIT(REG_R2) = _FALSE_
927 freeReg ILIT(REG_R3) = _FALSE_
930 freeReg ILIT(REG_R4) = _FALSE_
933 freeReg ILIT(REG_R5) = _FALSE_
936 freeReg ILIT(REG_R6) = _FALSE_
939 freeReg ILIT(REG_R7) = _FALSE_
942 freeReg ILIT(REG_R8) = _FALSE_
945 freeReg ILIT(REG_F1) = _FALSE_
948 freeReg ILIT(REG_F2) = _FALSE_
951 freeReg ILIT(REG_F3) = _FALSE_
954 freeReg ILIT(REG_F4) = _FALSE_
957 freeReg ILIT(REG_D1) = _FALSE_
960 freeReg ILIT(REG_D2) = _FALSE_
963 freeReg ILIT(REG_Sp) = _FALSE_
966 freeReg ILIT(REG_Su) = _FALSE_
969 freeReg ILIT(REG_SpLim) = _FALSE_
972 freeReg ILIT(REG_Hp) = _FALSE_
975 freeReg ILIT(REG_HpLim) = _FALSE_