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,
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
50 , fPair, fpRel, gReg, iReg, lReg, oReg, largeOffsetError
56 #include "HsVersions.h"
58 import AbsCSyn ( MagicId(..) )
59 import AbsCUtils ( magicIdPrimRep )
60 import CLabel ( CLabel, mkMainRegTableLabel )
61 import PrimOp ( PrimOp(..) )
62 import PrimRep ( PrimRep(..), isFloatingRep )
63 import Stix ( StixTree(..), StixReg(..),
64 getUniqueNat, returnNat, thenNat, NatM )
65 import Unique ( mkPseudoUnique2, Uniquable(..), Unique )
69 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74 | ImmInteger Integer -- Sigh.
75 | ImmCLbl CLabel -- AbstractC Label (with baggage)
76 | ImmLab Bool SDoc -- Simple string label (underscore-able)
77 -- Bool==True ==> in a different DLL
78 | 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 (FixedReg ILIT(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 fits13Bits :: Int -> Bool
158 fits13Bits :: Integer -> Bool
161 fits13Bits :: Integral a => a -> Bool
162 fits13Bits x = x >= -4096 && x < 4096
166 = error ("ERROR: SPARC native-code generator cannot handle large offset ("
167 ++show i++");\nprobably because of large constant data structures;" ++
168 "\nworkaround: use -fvia-C on this module.\n")
173 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
175 @stgReg@: we map STG registers onto appropriate Stix Trees. First, we
176 handle the two constants, @STK_STUB_closure@ and @vtbl_StdUpdFrame@.
177 The rest are either in real machine registers or stored as offsets
181 data RegLoc = Save StixTree | Always StixTree
184 Trees for register save locations:
186 saveLoc :: MagicId -> StixTree
188 saveLoc reg = case (stgReg reg) of {Always loc -> loc; Save loc -> loc}
192 stgReg :: MagicId -> RegLoc
195 = case (magicIdRegMaybe x) of
196 Just _ -> Save nonReg
197 Nothing -> Always nonReg
199 offset = baseRegOffset x
201 baseLoc = case (magicIdRegMaybe BaseReg) of
202 Just _ -> StReg (StixMagicId BaseReg)
203 Nothing -> StCLbl mkMainRegTableLabel
206 BaseReg -> StCLbl mkMainRegTableLabel
208 _ -> StInd (magicIdPrimRep x)
209 (StPrim IntAddOp [baseLoc,
210 StInt (toInteger (offset*BYTES_PER_WORD))])
213 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
215 @spRel@ gives us a stack relative addressing mode for volatile
216 temporaries and for excess call arguments. @fpRel@, where
217 applicable, is the same but for the frame pointer.
220 spRel :: Int -- desired stack offset in words, positive or negative
225 = AddrBaseIndex (Just esp) Nothing (ImmInt (n * BYTES_PER_WORD))
227 = AddrRegImm sp (ImmInt (n * BYTES_PER_WORD))
230 #if sparc_TARGET_ARCH
231 fpRel :: Int -> MachRegsAddr
232 -- Duznae work for offsets greater than 13 bits; we just hope for
235 = AddrRegImm fp (ImmInt (n * BYTES_PER_WORD))
239 %************************************************************************
241 \subsection[Reg]{Real registers}
243 %************************************************************************
245 RealRegs are machine regs which are available for allocation, in the
246 usual way. We know what class they are, because that's part of the
247 processor's architecture.
249 VirtualRegs are virtual registers. The register allocator will
250 eventually have to map them into RealRegs, or into spill slots.
251 VirtualRegs are allocated on the fly, usually to represent a single
252 value in the abstract assembly code (i.e. dynamic registers are
253 usually single assignment). With the new register allocator, the
254 single assignment restriction isn't necessary to get correct code,
255 although a better register allocation will result if single assignment
256 is used -- because the allocator maps a VirtualReg into a single
257 RealReg, even if the VirtualReg has multiple live ranges.
259 Virtual regs can be of either class, so that info is attached.
273 mkVReg :: Unique -> PrimRep -> Reg
275 = if isFloatingRep pk then VirtualRegF u else VirtualRegI u
277 isVirtualReg (RealReg _) = False
278 isVirtualReg (VirtualRegI _) = True
279 isVirtualReg (VirtualRegF _) = True
280 isRealReg = not . isVirtualReg
282 getNewRegNCG :: PrimRep -> NatM Reg
284 = if isFloatingRep pk
285 then getUniqueNat `thenNat` \ u -> returnNat (VirtualRegF u)
286 else getUniqueNat `thenNat` \ u -> returnNat (VirtualRegI u)
288 instance Eq Reg where
289 (==) (RealReg i1) (RealReg i2) = i1 == i2
290 (==) (VirtualRegI u1) (VirtualRegI u2) = u1 == u2
291 (==) (VirtualRegF u1) (VirtualRegF 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 (VirtualRegI _) (RealReg _) = GT
299 compare (VirtualRegI u1) (VirtualRegI u2) = compare u1 u2
300 compare (VirtualRegI _) (VirtualRegF _) = LT
301 compare (VirtualRegF _) (RealReg _) = GT
302 compare (VirtualRegF _) (VirtualRegI _) = GT
303 compare (VirtualRegF u1) (VirtualRegF u2) = compare u1 u2
305 instance Show Reg where
306 showsPrec _ (RealReg i) = showString (showReg i)
307 showsPrec _ (VirtualRegI u) = showString "%vI_" . shows u
308 showsPrec _ (VirtualRegF u) = showString "%vF_" . shows u
310 instance Outputable Reg where
311 ppr r = text (show r)
313 instance Uniquable Reg where
314 getUnique (RealReg i) = mkPseudoUnique2 i
315 getUnique (VirtualRegI u) = u
316 getUnique (VirtualRegF u) = u
319 ** Machine-specific Reg stuff: **
321 The Alpha has 64 registers of interest; 32 integer registers and 32 floating
322 point registers. The mapping of STG registers to alpha machine registers
323 is defined in StgRegs.h. We are, of course, prepared for any eventuality.
325 #if alpha_TARGET_ARCH
329 v0, f0, ra, pv, gp, sp, zeroh :: Reg
331 f0 = realReg (fReg 0)
332 ra = FixedReg ILIT(26)
334 gp = FixedReg ILIT(29)
335 sp = FixedReg ILIT(30)
336 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
338 t9, t10, t11, t12 :: Reg
346 Intel x86 architecture:
347 - All registers except 7 (esp) are available for use.
348 - Only ebx, esi, edi and esp are available across a C call (they are callee-saves).
349 - Registers 0-7 have 16-bit counterparts (ax, bx etc.)
350 - Registers 0-3 have 8 bit counterparts (ah, bh etc.)
351 - Registers 8-13 are fakes; we pretend x86 has 6 conventionally-addressable
352 fp registers, and 3-operand insns for them, and we translate this into
353 real stack-based x86 fp code after register allocation.
358 fake0, fake1, fake2, fake3, fake4, fake5,
359 eax, ebx, ecx, edx, esp, ebp, esi, edi :: Reg
375 regClass (RealReg i) = if i < 8 then RcInteger else RcFloating
376 regClass (VirtualRegI u) = RcInteger
377 regClass (VirtualRegF u) = RcFloating
380 = ["%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp", "%esp",
381 "%fake0", "%fake1", "%fake2", "%fake3", "%fake4", "%fake5", "%fake6"]
383 = if n >= 0 && n < 14
385 else "%unknown_x86_real_reg_" ++ show n
390 The SPARC has 64 registers of interest; 32 integer registers and 32
391 floating point registers. The mapping of STG registers to SPARC
392 machine registers is defined in StgRegs.h. We are, of course,
393 prepared for any eventuality.
396 #if sparc_TARGET_ARCH
398 gReg,lReg,iReg,oReg,fReg :: Int -> Int
406 fPair (FixedReg i) = FixedReg (i _ADD_ ILIT(1))
407 fPair (MappedReg i) = MappedReg (i _ADD_ ILIT(1))
409 g0, fp, sp, o0, f0 :: Reg
410 g0 = case (gReg 0) of { IBOX(g0) -> FixedReg g0 }
411 fp = case (iReg 6) of { IBOX(i6) -> FixedReg i6 }
412 sp = case (oReg 6) of { IBOX(o6) -> FixedReg o6 }
413 o0 = realReg (oReg 0)
414 f0 = realReg (fReg 0)
419 Redefine the literals used for machine-registers with non-numeric
420 names in the header files. Gag me with a spoon, eh?
422 #if alpha_TARGET_ARCH
472 #if sparc_TARGET_ARCH
541 baseRegOffset :: MagicId -> Int
543 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
544 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
545 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
546 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
547 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
548 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
549 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
550 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
551 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
552 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
553 baseRegOffset (FloatReg ILIT(1)) = OFFSET_F1
554 baseRegOffset (FloatReg ILIT(2)) = OFFSET_F2
555 baseRegOffset (FloatReg ILIT(3)) = OFFSET_F3
556 baseRegOffset (FloatReg ILIT(4)) = OFFSET_F4
557 baseRegOffset (DoubleReg ILIT(1)) = OFFSET_D1
558 baseRegOffset (DoubleReg ILIT(2)) = OFFSET_D2
559 baseRegOffset Sp = OFFSET_Sp
560 baseRegOffset Su = OFFSET_Su
561 baseRegOffset SpLim = OFFSET_SpLim
563 baseRegOffset (LongReg _ ILIT(1)) = OFFSET_Lng1
566 baseRegOffset (LongReg _ ILIT(2)) = OFFSET_Lng2
568 baseRegOffset Hp = OFFSET_Hp
569 baseRegOffset HpLim = OFFSET_HpLim
570 baseRegOffset CurrentTSO = OFFSET_CurrentTSO
571 baseRegOffset CurrentNursery = OFFSET_CurrentNursery
573 baseRegOffset BaseReg = panic "baseRegOffset:BaseReg"
574 baseRegOffset CurCostCentre = panic "baseRegOffset:CurCostCentre"
575 baseRegOffset VoidReg = panic "baseRegOffset:VoidReg"
580 callerSaves :: MagicId -> Bool
582 #ifdef CALLER_SAVES_Base
583 callerSaves BaseReg = True
585 #ifdef CALLER_SAVES_R1
586 callerSaves (VanillaReg _ ILIT(1)) = True
588 #ifdef CALLER_SAVES_R2
589 callerSaves (VanillaReg _ ILIT(2)) = True
591 #ifdef CALLER_SAVES_R3
592 callerSaves (VanillaReg _ ILIT(3)) = True
594 #ifdef CALLER_SAVES_R4
595 callerSaves (VanillaReg _ ILIT(4)) = True
597 #ifdef CALLER_SAVES_R5
598 callerSaves (VanillaReg _ ILIT(5)) = True
600 #ifdef CALLER_SAVES_R6
601 callerSaves (VanillaReg _ ILIT(6)) = True
603 #ifdef CALLER_SAVES_R7
604 callerSaves (VanillaReg _ ILIT(7)) = True
606 #ifdef CALLER_SAVES_R8
607 callerSaves (VanillaReg _ ILIT(8)) = True
609 #ifdef CALLER_SAVES_F1
610 callerSaves (FloatReg ILIT(1)) = True
612 #ifdef CALLER_SAVES_F2
613 callerSaves (FloatReg ILIT(2)) = True
615 #ifdef CALLER_SAVES_F3
616 callerSaves (FloatReg ILIT(3)) = True
618 #ifdef CALLER_SAVES_F4
619 callerSaves (FloatReg ILIT(4)) = True
621 #ifdef CALLER_SAVES_D1
622 callerSaves (DoubleReg ILIT(1)) = True
624 #ifdef CALLER_SAVES_D2
625 callerSaves (DoubleReg ILIT(2)) = True
627 #ifdef CALLER_SAVES_L1
628 callerSaves (LongReg _ ILIT(1)) = True
630 #ifdef CALLER_SAVES_Sp
631 callerSaves Sp = True
633 #ifdef CALLER_SAVES_Su
634 callerSaves Su = True
636 #ifdef CALLER_SAVES_SpLim
637 callerSaves SpLim = True
639 #ifdef CALLER_SAVES_Hp
640 callerSaves Hp = True
642 #ifdef CALLER_SAVES_HpLim
643 callerSaves HpLim = True
645 #ifdef CALLER_SAVES_CurrentTSO
646 callerSaves CurrentTSO = True
648 #ifdef CALLER_SAVES_CurrentNursery
649 callerSaves CurrentNursery = True
651 callerSaves _ = False
655 magicIdRegMaybe :: MagicId -> Maybe Reg
658 magicIdRegMaybe BaseReg = Just (RealReg REG_Base)
661 magicIdRegMaybe (VanillaReg _ ILIT(1)) = Just (RealReg REG_R1)
664 magicIdRegMaybe (VanillaReg _ ILIT(2)) = Just (RealReg REG_R2)
667 magicIdRegMaybe (VanillaReg _ ILIT(3)) = Just (RealReg REG_R3)
670 magicIdRegMaybe (VanillaReg _ ILIT(4)) = Just (RealReg REG_R4)
673 magicIdRegMaybe (VanillaReg _ ILIT(5)) = Just (RealReg REG_R5)
676 magicIdRegMaybe (VanillaReg _ ILIT(6)) = Just (RealReg REG_R6)
679 magicIdRegMaybe (VanillaReg _ ILIT(7)) = Just (RealReg REG_R7)
682 magicIdRegMaybe (VanillaReg _ ILIT(8)) = Just (RealReg REG_R8)
685 magicIdRegMaybe (VanillaReg _ ILIT(9)) = Just (RealReg REG_R9)
688 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
691 magicIdRegMaybe (FloatReg ILIT(1)) = Just (RealReg REG_F1)
694 magicIdRegMaybe (FloatReg ILIT(2)) = Just (RealReg REG_F2)
697 magicIdRegMaybe (FloatReg ILIT(3)) = Just (RealReg REG_F3)
700 magicIdRegMaybe (FloatReg ILIT(4)) = Just (RealReg REG_F4)
703 magicIdRegMaybe (DoubleReg ILIT(1)) = Just (RealReg REG_D1)
706 magicIdRegMaybe (DoubleReg ILIT(2)) = Just (RealReg REG_D2)
709 magicIdRegMaybe Sp = Just (RealReg REG_Sp)
712 magicIdRegMaybe (LongReg _ ILIT(1)) = Just (RealReg REG_Lng1)
715 magicIdRegMaybe (LongReg _ ILIT(2)) = Just (RealReg REG_Lng2)
718 magicIdRegMaybe Su = Just (RealReg REG_Su)
721 magicIdRegMaybe SpLim = Just (RealReg REG_SpLim)
724 magicIdRegMaybe Hp = Just (RealReg REG_Hp)
727 magicIdRegMaybe HpLim = Just (RealReg REG_HpLim)
729 #ifdef REG_CurrentTSO
730 magicIdRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
732 #ifdef REG_CurrentNursery
733 magicIdRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
735 magicIdRegMaybe _ = Nothing
739 -------------------------------
743 = freeMappedRegs IF_ARCH_alpha( [0..63],
744 IF_ARCH_i386( [0..13],
745 IF_ARCH_sparc( [0..63],)))
747 -- allMachRegs is the complete set of machine regs.
748 allMachRegNos :: [Int]
750 = IF_ARCH_alpha( [0..63],
751 IF_ARCH_i386( [0..13],
752 IF_ARCH_sparc( [0..63],)))
753 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
754 allocatableRegs :: [Reg]
756 = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
757 in filter isFree (map RealReg allMachRegNos)
760 -------------------------------
762 callClobberedRegs :: [Reg]
765 #if alpha_TARGET_ARCH
766 [0, 1, 2, 3, 4, 5, 6, 7, 8,
767 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
768 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
769 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
770 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
771 #endif {- alpha_TARGET_ARCH -}
774 #endif {- i386_TARGET_ARCH -}
775 #if sparc_TARGET_ARCH
777 [oReg i | i <- [0..5]] ++
778 [gReg i | i <- [1..7]] ++
779 [fReg i | i <- [0..31]] )
780 #endif {- sparc_TARGET_ARCH -}
783 -------------------------------
785 argRegs :: Int -> [Reg]
789 argRegs _ = panic "MachRegs.argRegs: doesn't work on I386"
791 #if alpha_TARGET_ARCH
792 argRegs 1 = freeMappedRegs [16, fReg 16]
793 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
794 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
795 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
796 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
797 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
798 #endif {- alpha_TARGET_ARCH -}
799 #if sparc_TARGET_ARCH
800 argRegs 1 = freeMappedRegs (map oReg [0])
801 argRegs 2 = freeMappedRegs (map oReg [0,1])
802 argRegs 3 = freeMappedRegs (map oReg [0,1,2])
803 argRegs 4 = freeMappedRegs (map oReg [0,1,2,3])
804 argRegs 5 = freeMappedRegs (map oReg [0,1,2,3,4])
805 argRegs 6 = freeMappedRegs (map oReg [0,1,2,3,4,5])
806 #endif {- sparc_TARGET_ARCH -}
807 argRegs _ = panic "MachRegs.argRegs: don't know about >6 arguments!"
808 #endif {- i386_TARGET_ARCH -}
811 -------------------------------
814 #if alpha_TARGET_ARCH
815 allArgRegs :: [(Reg, Reg)]
817 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
818 #endif {- alpha_TARGET_ARCH -}
820 #if sparc_TARGET_ARCH
823 allArgRegs = map realReg [oReg i | i <- [0..5]]
824 #endif {- sparc_TARGET_ARCH -}
829 freeReg :: FAST_INT -> FAST_BOOL
831 #if alpha_TARGET_ARCH
832 freeReg ILIT(26) = _FALSE_ -- return address (ra)
833 freeReg ILIT(28) = _FALSE_ -- reserved for the assembler (at)
834 freeReg ILIT(29) = _FALSE_ -- global pointer (gp)
835 freeReg ILIT(30) = _FALSE_ -- stack pointer (sp)
836 freeReg ILIT(31) = _FALSE_ -- always zero (zeroh)
837 freeReg ILIT(63) = _FALSE_ -- always zero (f31)
841 freeReg ILIT(esp) = _FALSE_ -- %esp is the C stack pointer
844 #if sparc_TARGET_ARCH
845 freeReg ILIT(g0) = _FALSE_ -- %g0 is always 0.
846 freeReg ILIT(g5) = _FALSE_ -- %g5 is reserved (ABI).
847 freeReg ILIT(g6) = _FALSE_ -- %g6 is reserved (ABI).
848 freeReg ILIT(g7) = _FALSE_ -- %g7 is reserved (ABI).
849 freeReg ILIT(i6) = _FALSE_ -- %i6 is our frame pointer.
850 freeReg ILIT(o6) = _FALSE_ -- %o6 is our stack pointer.
854 freeReg ILIT(REG_Base) = _FALSE_
857 freeReg ILIT(REG_R1) = _FALSE_
860 freeReg ILIT(REG_R2) = _FALSE_
863 freeReg ILIT(REG_R3) = _FALSE_
866 freeReg ILIT(REG_R4) = _FALSE_
869 freeReg ILIT(REG_R5) = _FALSE_
872 freeReg ILIT(REG_R6) = _FALSE_
875 freeReg ILIT(REG_R7) = _FALSE_
878 freeReg ILIT(REG_R8) = _FALSE_
881 freeReg ILIT(REG_F1) = _FALSE_
884 freeReg ILIT(REG_F2) = _FALSE_
887 freeReg ILIT(REG_F3) = _FALSE_
890 freeReg ILIT(REG_F4) = _FALSE_
893 freeReg ILIT(REG_D1) = _FALSE_
896 freeReg ILIT(REG_D2) = _FALSE_
899 freeReg ILIT(REG_Sp) = _FALSE_
902 freeReg ILIT(REG_Su) = _FALSE_
905 freeReg ILIT(REG_SpLim) = _FALSE_
908 freeReg ILIT(REG_Hp) = _FALSE_
911 freeReg ILIT(REG_HpLim) = _FALSE_
914 -- we hang onto two double regs for dedicated
915 -- use; this is not necessary on Alphas and
916 -- may not be on other non-SPARCs.
918 | n _EQ_ (ILIT(REG_D1) _ADD_ ILIT(1)) = _FALSE_
921 | n _EQ_ (ILIT(REG_D2) _ADD_ ILIT(1)) = _FALSE_