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)
474 -------------------------------
475 callClobberedRegs :: [Reg]
478 #if alpha_TARGET_ARCH
479 [0, 1, 2, 3, 4, 5, 6, 7, 8,
480 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
481 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
482 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
483 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
484 #endif {- alpha_TARGET_ARCH -}
486 -- caller-saves registers
487 [eax,ecx,edx,fake0,fake1,fake2,fake3,fake4,fake5]
488 #endif {- i386_TARGET_ARCH -}
489 #if sparc_TARGET_ARCH
492 [oReg i | i <- [0..5]] ++
493 [gReg i | i <- [1..7]] ++
494 [fReg i | i <- [0..31]] )
495 #endif {- sparc_TARGET_ARCH -}
498 Redefine the literals used for machine-registers with non-numeric
499 names in the header files. Gag me with a spoon, eh?
501 #if alpha_TARGET_ARCH
551 #if sparc_TARGET_ARCH
622 baseRegOffset :: MagicId -> Int
624 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
625 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
626 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
627 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
628 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
629 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
630 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
631 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
632 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
633 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
634 baseRegOffset (FloatReg ILIT(1)) = OFFSET_F1
635 baseRegOffset (FloatReg ILIT(2)) = OFFSET_F2
636 baseRegOffset (FloatReg ILIT(3)) = OFFSET_F3
637 baseRegOffset (FloatReg ILIT(4)) = OFFSET_F4
638 baseRegOffset (DoubleReg ILIT(1)) = OFFSET_D1
639 baseRegOffset (DoubleReg ILIT(2)) = OFFSET_D2
640 baseRegOffset Sp = OFFSET_Sp
641 baseRegOffset Su = OFFSET_Su
642 baseRegOffset SpLim = OFFSET_SpLim
644 baseRegOffset (LongReg _ ILIT(1)) = OFFSET_Lng1
647 baseRegOffset (LongReg _ ILIT(2)) = OFFSET_Lng2
649 baseRegOffset Hp = OFFSET_Hp
650 baseRegOffset HpLim = OFFSET_HpLim
651 baseRegOffset CurrentTSO = OFFSET_CurrentTSO
652 baseRegOffset CurrentNursery = OFFSET_CurrentNursery
654 baseRegOffset BaseReg = panic "baseRegOffset:BaseReg"
655 baseRegOffset CurCostCentre = panic "baseRegOffset:CurCostCentre"
656 baseRegOffset VoidReg = panic "baseRegOffset:VoidReg"
661 callerSaves :: MagicId -> Bool
663 #ifdef CALLER_SAVES_Base
664 callerSaves BaseReg = True
666 #ifdef CALLER_SAVES_R1
667 callerSaves (VanillaReg _ ILIT(1)) = True
669 #ifdef CALLER_SAVES_R2
670 callerSaves (VanillaReg _ ILIT(2)) = True
672 #ifdef CALLER_SAVES_R3
673 callerSaves (VanillaReg _ ILIT(3)) = True
675 #ifdef CALLER_SAVES_R4
676 callerSaves (VanillaReg _ ILIT(4)) = True
678 #ifdef CALLER_SAVES_R5
679 callerSaves (VanillaReg _ ILIT(5)) = True
681 #ifdef CALLER_SAVES_R6
682 callerSaves (VanillaReg _ ILIT(6)) = True
684 #ifdef CALLER_SAVES_R7
685 callerSaves (VanillaReg _ ILIT(7)) = True
687 #ifdef CALLER_SAVES_R8
688 callerSaves (VanillaReg _ ILIT(8)) = True
690 #ifdef CALLER_SAVES_F1
691 callerSaves (FloatReg ILIT(1)) = True
693 #ifdef CALLER_SAVES_F2
694 callerSaves (FloatReg ILIT(2)) = True
696 #ifdef CALLER_SAVES_F3
697 callerSaves (FloatReg ILIT(3)) = True
699 #ifdef CALLER_SAVES_F4
700 callerSaves (FloatReg ILIT(4)) = True
702 #ifdef CALLER_SAVES_D1
703 callerSaves (DoubleReg ILIT(1)) = True
705 #ifdef CALLER_SAVES_D2
706 callerSaves (DoubleReg ILIT(2)) = True
708 #ifdef CALLER_SAVES_L1
709 callerSaves (LongReg _ ILIT(1)) = True
711 #ifdef CALLER_SAVES_Sp
712 callerSaves Sp = True
714 #ifdef CALLER_SAVES_Su
715 callerSaves Su = True
717 #ifdef CALLER_SAVES_SpLim
718 callerSaves SpLim = True
720 #ifdef CALLER_SAVES_Hp
721 callerSaves Hp = True
723 #ifdef CALLER_SAVES_HpLim
724 callerSaves HpLim = True
726 #ifdef CALLER_SAVES_CurrentTSO
727 callerSaves CurrentTSO = True
729 #ifdef CALLER_SAVES_CurrentNursery
730 callerSaves CurrentNursery = True
732 callerSaves _ = False
736 magicIdRegMaybe :: MagicId -> Maybe Reg
739 magicIdRegMaybe BaseReg = Just (RealReg REG_Base)
742 magicIdRegMaybe (VanillaReg _ ILIT(1)) = Just (RealReg REG_R1)
745 magicIdRegMaybe (VanillaReg _ ILIT(2)) = Just (RealReg REG_R2)
748 magicIdRegMaybe (VanillaReg _ ILIT(3)) = Just (RealReg REG_R3)
751 magicIdRegMaybe (VanillaReg _ ILIT(4)) = Just (RealReg REG_R4)
754 magicIdRegMaybe (VanillaReg _ ILIT(5)) = Just (RealReg REG_R5)
757 magicIdRegMaybe (VanillaReg _ ILIT(6)) = Just (RealReg REG_R6)
760 magicIdRegMaybe (VanillaReg _ ILIT(7)) = Just (RealReg REG_R7)
763 magicIdRegMaybe (VanillaReg _ ILIT(8)) = Just (RealReg REG_R8)
766 magicIdRegMaybe (VanillaReg _ ILIT(9)) = Just (RealReg REG_R9)
769 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
772 magicIdRegMaybe (FloatReg ILIT(1)) = Just (RealReg REG_F1)
775 magicIdRegMaybe (FloatReg ILIT(2)) = Just (RealReg REG_F2)
778 magicIdRegMaybe (FloatReg ILIT(3)) = Just (RealReg REG_F3)
781 magicIdRegMaybe (FloatReg ILIT(4)) = Just (RealReg REG_F4)
784 magicIdRegMaybe (DoubleReg ILIT(1)) = Just (RealReg REG_D1)
787 magicIdRegMaybe (DoubleReg ILIT(2)) = Just (RealReg REG_D2)
790 magicIdRegMaybe Sp = Just (RealReg REG_Sp)
793 magicIdRegMaybe (LongReg _ ILIT(1)) = Just (RealReg REG_Lng1)
796 magicIdRegMaybe (LongReg _ ILIT(2)) = Just (RealReg REG_Lng2)
799 magicIdRegMaybe Su = Just (RealReg REG_Su)
802 magicIdRegMaybe SpLim = Just (RealReg REG_SpLim)
805 magicIdRegMaybe Hp = Just (RealReg REG_Hp)
808 magicIdRegMaybe HpLim = Just (RealReg REG_HpLim)
810 #ifdef REG_CurrentTSO
811 magicIdRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
813 #ifdef REG_CurrentNursery
814 magicIdRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
816 magicIdRegMaybe _ = Nothing
820 -------------------------------
821 -- allMachRegs is the complete set of machine regs.
822 allMachRegNos :: [Int]
824 = IF_ARCH_alpha( [0..63],
825 IF_ARCH_i386( [0..13],
826 IF_ARCH_sparc( ([0..31]
827 ++ [f0,f2 .. nCG_FirstFloatReg-1]
828 ++ [nCG_FirstFloatReg .. f31]),
830 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
831 allocatableRegs :: [Reg]
833 = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
834 in filter isFree (map RealReg allMachRegNos)
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 -}
871 -------------------------------
872 -- all of the arg regs ??
873 #if alpha_TARGET_ARCH
874 allArgRegs :: [(Reg, Reg)]
875 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
876 #endif {- alpha_TARGET_ARCH -}
878 #if sparc_TARGET_ARCH
880 allArgRegs = map RealReg [oReg i | i <- [0..5]]
881 #endif {- sparc_TARGET_ARCH -}
885 allArgRegs = panic "MachRegs.allArgRegs(x86): should not be used!"
890 freeReg :: FAST_INT -> FAST_BOOL
892 #if alpha_TARGET_ARCH
893 freeReg ILIT(26) = _FALSE_ -- return address (ra)
894 freeReg ILIT(28) = _FALSE_ -- reserved for the assembler (at)
895 freeReg ILIT(29) = _FALSE_ -- global pointer (gp)
896 freeReg ILIT(30) = _FALSE_ -- stack pointer (sp)
897 freeReg ILIT(31) = _FALSE_ -- always zero (zeroh)
898 freeReg ILIT(63) = _FALSE_ -- always zero (f31)
902 freeReg ILIT(esp) = _FALSE_ -- %esp is the C stack pointer
905 #if sparc_TARGET_ARCH
906 freeReg ILIT(g0) = _FALSE_ -- %g0 is always 0.
907 freeReg ILIT(g5) = _FALSE_ -- %g5 is reserved (ABI).
908 freeReg ILIT(g6) = _FALSE_ -- %g6 is reserved (ABI).
909 freeReg ILIT(g7) = _FALSE_ -- %g7 is reserved (ABI).
910 freeReg ILIT(i6) = _FALSE_ -- %i6 is our frame pointer.
911 freeReg ILIT(o6) = _FALSE_ -- %o6 is our stack pointer.
912 freeReg ILIT(f0) = _FALSE_ -- %f0/%f1 are the C fp return registers.
913 freeReg ILIT(f1) = _FALSE_
917 freeReg ILIT(REG_Base) = _FALSE_
920 freeReg ILIT(REG_R1) = _FALSE_
923 freeReg ILIT(REG_R2) = _FALSE_
926 freeReg ILIT(REG_R3) = _FALSE_
929 freeReg ILIT(REG_R4) = _FALSE_
932 freeReg ILIT(REG_R5) = _FALSE_
935 freeReg ILIT(REG_R6) = _FALSE_
938 freeReg ILIT(REG_R7) = _FALSE_
941 freeReg ILIT(REG_R8) = _FALSE_
944 freeReg ILIT(REG_F1) = _FALSE_
947 freeReg ILIT(REG_F2) = _FALSE_
950 freeReg ILIT(REG_F3) = _FALSE_
953 freeReg ILIT(REG_F4) = _FALSE_
956 freeReg ILIT(REG_D1) = _FALSE_
959 freeReg ILIT(REG_D2) = _FALSE_
962 freeReg ILIT(REG_Sp) = _FALSE_
965 freeReg ILIT(REG_Su) = _FALSE_
968 freeReg ILIT(REG_SpLim) = _FALSE_
971 freeReg ILIT(REG_Hp) = _FALSE_
974 freeReg ILIT(REG_HpLim) = _FALSE_