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
49 , fpRel, gReg, iReg, lReg, oReg, largeOffsetError
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
81 | LO Imm -- Possible restrictions...
84 strImmLit s = ImmLit (text s)
87 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
98 = AddrBaseIndex Base Index Displacement
101 type Base = Maybe Reg
102 type Index = Maybe (Reg, Int) -- Int is 2, 4 or 8
103 type Displacement = Imm
106 #if sparc_TARGET_ARCH
111 addrOffset :: MachRegsAddr -> Int -> Maybe MachRegsAddr
115 #if alpha_TARGET_ARCH
116 _ -> panic "MachMisc.addrOffset not defined for Alpha"
119 ImmAddr i off0 -> Just (ImmAddr i (off0 + off))
120 AddrBaseIndex r i (ImmInt n) -> Just (AddrBaseIndex r i (ImmInt (n + off)))
121 AddrBaseIndex r i (ImmInteger n)
122 -> Just (AddrBaseIndex r i (ImmInt (fromInteger (n + toInteger off))))
125 #if sparc_TARGET_ARCH
126 AddrRegImm r (ImmInt n)
127 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt n2))
128 | otherwise -> Nothing
131 AddrRegImm r (ImmInteger n)
132 | fits13Bits n2 -> Just (AddrRegImm r (ImmInt (fromInteger n2)))
133 | otherwise -> Nothing
134 where n2 = n + toInteger off
136 AddrRegReg r (RealReg 0)
137 | fits13Bits off -> Just (AddrRegImm r (ImmInt off))
138 | otherwise -> Nothing
145 #if alpha_TARGET_ARCH
147 fits8Bits :: Integer -> Bool
148 fits8Bits i = i >= -256 && i < 256
152 #if sparc_TARGET_ARCH
154 fits13Bits :: Int -> Bool
157 fits13Bits :: Integer -> Bool
160 fits13Bits :: Integral a => a -> Bool
161 fits13Bits x = x >= -4096 && x < 4096
165 = error ("ERROR: SPARC native-code generator cannot handle large offset ("
166 ++show i++");\nprobably because of large constant data structures;" ++
167 "\nworkaround: use -fvia-C on this module.\n")
172 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
174 @stgReg@: we map STG registers onto appropriate Stix Trees. First, we
175 handle the two constants, @STK_STUB_closure@ and @vtbl_StdUpdFrame@.
176 The rest are either in real machine registers or stored as offsets
180 data RegLoc = Save StixTree | Always StixTree
183 Trees for register save locations:
185 saveLoc :: MagicId -> StixTree
187 saveLoc reg = case (stgReg reg) of {Always loc -> loc; Save loc -> loc}
191 stgReg :: MagicId -> RegLoc
194 = case (magicIdRegMaybe x) of
195 Just _ -> Save nonReg
196 Nothing -> Always nonReg
198 offset = baseRegOffset x
200 baseLoc = case (magicIdRegMaybe BaseReg) of
201 Just _ -> StReg (StixMagicId BaseReg)
202 Nothing -> StCLbl mkMainRegTableLabel
205 BaseReg -> StCLbl mkMainRegTableLabel
207 _ -> StInd (magicIdPrimRep x)
208 (StPrim IntAddOp [baseLoc,
209 StInt (toInteger (offset*BYTES_PER_WORD))])
212 % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
214 @spRel@ gives us a stack relative addressing mode for volatile
215 temporaries and for excess call arguments. @fpRel@, where
216 applicable, is the same but for the frame pointer.
219 spRel :: Int -- desired stack offset in words, positive or negative
224 = AddrBaseIndex (Just esp) Nothing (ImmInt (n * BYTES_PER_WORD))
226 = AddrRegImm sp (ImmInt (n * BYTES_PER_WORD))
229 #if sparc_TARGET_ARCH
230 fpRel :: Int -> MachRegsAddr
231 -- Duznae work for offsets greater than 13 bits; we just hope for
234 = AddrRegImm fp (ImmInt (n * BYTES_PER_WORD))
238 %************************************************************************
240 \subsection[Reg]{Real registers}
242 %************************************************************************
244 RealRegs are machine regs which are available for allocation, in the
245 usual way. We know what class they are, because that's part of the
246 processor's architecture.
248 VirtualRegs are virtual registers. The register allocator will
249 eventually have to map them into RealRegs, or into spill slots.
250 VirtualRegs are allocated on the fly, usually to represent a single
251 value in the abstract assembly code (i.e. dynamic registers are
252 usually single assignment). With the new register allocator, the
253 single assignment restriction isn't necessary to get correct code,
254 although a better register allocation will result if single assignment
255 is used -- because the allocator maps a VirtualReg into a single
256 RealReg, even if the VirtualReg has multiple live ranges.
258 Virtual regs can be of either class, so that info is attached.
272 mkVReg :: Unique -> PrimRep -> Reg
274 = if isFloatingRep pk then VirtualRegF u else VirtualRegI u
276 isVirtualReg (RealReg _) = False
277 isVirtualReg (VirtualRegI _) = True
278 isVirtualReg (VirtualRegF _) = True
279 isRealReg = not . isVirtualReg
281 getNewRegNCG :: PrimRep -> NatM Reg
283 = if isFloatingRep pk
284 then getUniqueNat `thenNat` \ u -> returnNat (VirtualRegF u)
285 else getUniqueNat `thenNat` \ u -> returnNat (VirtualRegI u)
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 (==) reg1 reg2 = False
293 instance Ord Reg where
294 compare (RealReg i1) (RealReg i2) = compare i1 i2
295 compare (RealReg _) (VirtualRegI _) = LT
296 compare (RealReg _) (VirtualRegF _) = LT
297 compare (VirtualRegI _) (RealReg _) = GT
298 compare (VirtualRegI u1) (VirtualRegI u2) = compare u1 u2
299 compare (VirtualRegI _) (VirtualRegF _) = LT
300 compare (VirtualRegF _) (RealReg _) = GT
301 compare (VirtualRegF _) (VirtualRegI _) = GT
302 compare (VirtualRegF u1) (VirtualRegF u2) = compare u1 u2
304 instance Show Reg where
305 showsPrec _ (RealReg i) = showString (showReg i)
306 showsPrec _ (VirtualRegI u) = showString "%vI_" . shows u
307 showsPrec _ (VirtualRegF u) = showString "%vF_" . shows u
309 instance Outputable Reg where
310 ppr r = text (show r)
312 instance Uniquable Reg where
313 getUnique (RealReg i) = mkPseudoUnique2 i
314 getUnique (VirtualRegI u) = u
315 getUnique (VirtualRegF u) = u
318 ** Machine-specific Reg stuff: **
320 The Alpha has 64 registers of interest; 32 integer registers and 32 floating
321 point registers. The mapping of STG registers to alpha machine registers
322 is defined in StgRegs.h. We are, of course, prepared for any eventuality.
324 #if alpha_TARGET_ARCH
328 v0, f0, ra, pv, gp, sp, zeroh :: Reg
330 f0 = realReg (fReg 0)
331 ra = FixedReg ILIT(26)
333 gp = FixedReg ILIT(29)
334 sp = FixedReg ILIT(30)
335 zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
337 t9, t10, t11, t12 :: Reg
345 Intel x86 architecture:
346 - All registers except 7 (esp) are available for use.
347 - Only ebx, esi, edi and esp are available across a C call (they are callee-saves).
348 - Registers 0-7 have 16-bit counterparts (ax, bx etc.)
349 - Registers 0-3 have 8 bit counterparts (ah, bh etc.)
350 - Registers 8-13 are fakes; we pretend x86 has 6 conventionally-addressable
351 fp registers, and 3-operand insns for them, and we translate this into
352 real stack-based x86 fp code after register allocation.
357 fake0, fake1, fake2, fake3, fake4, fake5,
358 eax, ebx, ecx, edx, esp, ebp, esi, edi :: Reg
374 regClass (RealReg i) = if i < 8 then RcInteger else RcFloating
375 regClass (VirtualRegI u) = RcInteger
376 regClass (VirtualRegF u) = RcFloating
379 = ["%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp", "%esp",
380 "%fake0", "%fake1", "%fake2", "%fake3", "%fake4", "%fake5", "%fake6"]
382 showReg :: Int -> String
384 = if n >= 0 && n < 14
386 else "%unknown_x86_real_reg_" ++ show n
391 The SPARC has 64 registers of interest; 32 integer registers and 32
392 floating point registers. The mapping of STG registers to SPARC
393 machine registers is defined in StgRegs.h. We are, of course,
394 prepared for any eventuality. When (if?) the sparc nativegen is
395 ever revived, we should just treat it as if it has 16 floating
396 regs, and use them in pairs.
399 #if sparc_TARGET_ARCH
401 gReg,lReg,iReg,oReg,fReg :: Int -> Int
409 regClass (RealReg i) = if i < 32 then RcInteger else RcFloating
410 regClass (VirtualRegI u) = RcInteger
411 regClass (VirtualRegF u) = RcFloating
414 showReg :: Int -> String
416 = if n >= 0 && n < 64
417 then "%sparc_real_reg_" ++ show n
418 else "%unknown_sparc_real_reg_" ++ show n
420 g0, fp, sp, o0, f0 :: Reg
421 g0 = RealReg (gReg 0)
422 fp = RealReg (iReg 6)
423 sp = RealReg (oReg 6)
424 o0 = RealReg (oReg 0)
425 f0 = RealReg (fReg 0)
430 Redefine the literals used for machine-registers with non-numeric
431 names in the header files. Gag me with a spoon, eh?
433 #if alpha_TARGET_ARCH
483 #if sparc_TARGET_ARCH
552 baseRegOffset :: MagicId -> Int
554 baseRegOffset (VanillaReg _ ILIT(1)) = OFFSET_R1
555 baseRegOffset (VanillaReg _ ILIT(2)) = OFFSET_R2
556 baseRegOffset (VanillaReg _ ILIT(3)) = OFFSET_R3
557 baseRegOffset (VanillaReg _ ILIT(4)) = OFFSET_R4
558 baseRegOffset (VanillaReg _ ILIT(5)) = OFFSET_R5
559 baseRegOffset (VanillaReg _ ILIT(6)) = OFFSET_R6
560 baseRegOffset (VanillaReg _ ILIT(7)) = OFFSET_R7
561 baseRegOffset (VanillaReg _ ILIT(8)) = OFFSET_R8
562 baseRegOffset (VanillaReg _ ILIT(9)) = OFFSET_R9
563 baseRegOffset (VanillaReg _ ILIT(10)) = OFFSET_R10
564 baseRegOffset (FloatReg ILIT(1)) = OFFSET_F1
565 baseRegOffset (FloatReg ILIT(2)) = OFFSET_F2
566 baseRegOffset (FloatReg ILIT(3)) = OFFSET_F3
567 baseRegOffset (FloatReg ILIT(4)) = OFFSET_F4
568 baseRegOffset (DoubleReg ILIT(1)) = OFFSET_D1
569 baseRegOffset (DoubleReg ILIT(2)) = OFFSET_D2
570 baseRegOffset Sp = OFFSET_Sp
571 baseRegOffset Su = OFFSET_Su
572 baseRegOffset SpLim = OFFSET_SpLim
574 baseRegOffset (LongReg _ ILIT(1)) = OFFSET_Lng1
577 baseRegOffset (LongReg _ ILIT(2)) = OFFSET_Lng2
579 baseRegOffset Hp = OFFSET_Hp
580 baseRegOffset HpLim = OFFSET_HpLim
581 baseRegOffset CurrentTSO = OFFSET_CurrentTSO
582 baseRegOffset CurrentNursery = OFFSET_CurrentNursery
584 baseRegOffset BaseReg = panic "baseRegOffset:BaseReg"
585 baseRegOffset CurCostCentre = panic "baseRegOffset:CurCostCentre"
586 baseRegOffset VoidReg = panic "baseRegOffset:VoidReg"
591 callerSaves :: MagicId -> Bool
593 #ifdef CALLER_SAVES_Base
594 callerSaves BaseReg = True
596 #ifdef CALLER_SAVES_R1
597 callerSaves (VanillaReg _ ILIT(1)) = True
599 #ifdef CALLER_SAVES_R2
600 callerSaves (VanillaReg _ ILIT(2)) = True
602 #ifdef CALLER_SAVES_R3
603 callerSaves (VanillaReg _ ILIT(3)) = True
605 #ifdef CALLER_SAVES_R4
606 callerSaves (VanillaReg _ ILIT(4)) = True
608 #ifdef CALLER_SAVES_R5
609 callerSaves (VanillaReg _ ILIT(5)) = True
611 #ifdef CALLER_SAVES_R6
612 callerSaves (VanillaReg _ ILIT(6)) = True
614 #ifdef CALLER_SAVES_R7
615 callerSaves (VanillaReg _ ILIT(7)) = True
617 #ifdef CALLER_SAVES_R8
618 callerSaves (VanillaReg _ ILIT(8)) = True
620 #ifdef CALLER_SAVES_F1
621 callerSaves (FloatReg ILIT(1)) = True
623 #ifdef CALLER_SAVES_F2
624 callerSaves (FloatReg ILIT(2)) = True
626 #ifdef CALLER_SAVES_F3
627 callerSaves (FloatReg ILIT(3)) = True
629 #ifdef CALLER_SAVES_F4
630 callerSaves (FloatReg ILIT(4)) = True
632 #ifdef CALLER_SAVES_D1
633 callerSaves (DoubleReg ILIT(1)) = True
635 #ifdef CALLER_SAVES_D2
636 callerSaves (DoubleReg ILIT(2)) = True
638 #ifdef CALLER_SAVES_L1
639 callerSaves (LongReg _ ILIT(1)) = True
641 #ifdef CALLER_SAVES_Sp
642 callerSaves Sp = True
644 #ifdef CALLER_SAVES_Su
645 callerSaves Su = True
647 #ifdef CALLER_SAVES_SpLim
648 callerSaves SpLim = True
650 #ifdef CALLER_SAVES_Hp
651 callerSaves Hp = True
653 #ifdef CALLER_SAVES_HpLim
654 callerSaves HpLim = True
656 #ifdef CALLER_SAVES_CurrentTSO
657 callerSaves CurrentTSO = True
659 #ifdef CALLER_SAVES_CurrentNursery
660 callerSaves CurrentNursery = True
662 callerSaves _ = False
666 magicIdRegMaybe :: MagicId -> Maybe Reg
669 magicIdRegMaybe BaseReg = Just (RealReg REG_Base)
672 magicIdRegMaybe (VanillaReg _ ILIT(1)) = Just (RealReg REG_R1)
675 magicIdRegMaybe (VanillaReg _ ILIT(2)) = Just (RealReg REG_R2)
678 magicIdRegMaybe (VanillaReg _ ILIT(3)) = Just (RealReg REG_R3)
681 magicIdRegMaybe (VanillaReg _ ILIT(4)) = Just (RealReg REG_R4)
684 magicIdRegMaybe (VanillaReg _ ILIT(5)) = Just (RealReg REG_R5)
687 magicIdRegMaybe (VanillaReg _ ILIT(6)) = Just (RealReg REG_R6)
690 magicIdRegMaybe (VanillaReg _ ILIT(7)) = Just (RealReg REG_R7)
693 magicIdRegMaybe (VanillaReg _ ILIT(8)) = Just (RealReg REG_R8)
696 magicIdRegMaybe (VanillaReg _ ILIT(9)) = Just (RealReg REG_R9)
699 magicIdRegMaybe (VanillaReg _ ILIT(10)) = Just (RealReg REG_R10)
702 magicIdRegMaybe (FloatReg ILIT(1)) = Just (RealReg REG_F1)
705 magicIdRegMaybe (FloatReg ILIT(2)) = Just (RealReg REG_F2)
708 magicIdRegMaybe (FloatReg ILIT(3)) = Just (RealReg REG_F3)
711 magicIdRegMaybe (FloatReg ILIT(4)) = Just (RealReg REG_F4)
714 magicIdRegMaybe (DoubleReg ILIT(1)) = Just (RealReg REG_D1)
717 magicIdRegMaybe (DoubleReg ILIT(2)) = Just (RealReg REG_D2)
720 magicIdRegMaybe Sp = Just (RealReg REG_Sp)
723 magicIdRegMaybe (LongReg _ ILIT(1)) = Just (RealReg REG_Lng1)
726 magicIdRegMaybe (LongReg _ ILIT(2)) = Just (RealReg REG_Lng2)
729 magicIdRegMaybe Su = Just (RealReg REG_Su)
732 magicIdRegMaybe SpLim = Just (RealReg REG_SpLim)
735 magicIdRegMaybe Hp = Just (RealReg REG_Hp)
738 magicIdRegMaybe HpLim = Just (RealReg REG_HpLim)
740 #ifdef REG_CurrentTSO
741 magicIdRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
743 #ifdef REG_CurrentNursery
744 magicIdRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
746 magicIdRegMaybe _ = Nothing
750 -------------------------------
754 = freeMappedRegs IF_ARCH_alpha( [0..63],
755 IF_ARCH_i386( [0..13],
756 IF_ARCH_sparc( [0..63],)))
758 -- allMachRegs is the complete set of machine regs.
759 allMachRegNos :: [Int]
761 = IF_ARCH_alpha( [0..63],
762 IF_ARCH_i386( [0..13],
763 IF_ARCH_sparc( [0..63],)))
764 -- allocatableRegs is allMachRegNos with the fixed-use regs removed.
765 allocatableRegs :: [Reg]
767 = let isFree (RealReg (I# i)) = _IS_TRUE_(freeReg i)
768 in filter isFree (map RealReg allMachRegNos)
771 -------------------------------
773 callClobberedRegs :: [Reg]
776 #if alpha_TARGET_ARCH
777 [0, 1, 2, 3, 4, 5, 6, 7, 8,
778 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
779 fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
780 fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
781 fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
782 #endif {- alpha_TARGET_ARCH -}
785 #endif {- i386_TARGET_ARCH -}
786 #if sparc_TARGET_ARCH
788 [oReg i | i <- [0..5]] ++
789 [gReg i | i <- [1..7]] ++
790 [fReg i | i <- [0..31]] )
791 #endif {- sparc_TARGET_ARCH -}
794 -------------------------------
796 argRegs :: Int -> [Reg]
800 argRegs _ = panic "MachRegs.argRegs: doesn't work on I386"
802 #if alpha_TARGET_ARCH
803 argRegs 1 = freeMappedRegs [16, fReg 16]
804 argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
805 argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
806 argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
807 argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
808 argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
809 #endif {- alpha_TARGET_ARCH -}
810 #if sparc_TARGET_ARCH
811 argRegs 1 = freeMappedRegs (map oReg [0])
812 argRegs 2 = freeMappedRegs (map oReg [0,1])
813 argRegs 3 = freeMappedRegs (map oReg [0,1,2])
814 argRegs 4 = freeMappedRegs (map oReg [0,1,2,3])
815 argRegs 5 = freeMappedRegs (map oReg [0,1,2,3,4])
816 argRegs 6 = freeMappedRegs (map oReg [0,1,2,3,4,5])
817 #endif {- sparc_TARGET_ARCH -}
818 argRegs _ = panic "MachRegs.argRegs: don't know about >6 arguments!"
819 #endif {- i386_TARGET_ARCH -}
822 -------------------------------
825 #if alpha_TARGET_ARCH
826 allArgRegs :: [(Reg, Reg)]
828 allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
829 #endif {- alpha_TARGET_ARCH -}
831 #if sparc_TARGET_ARCH
834 allArgRegs = map realReg [oReg i | i <- [0..5]]
835 #endif {- sparc_TARGET_ARCH -}
840 freeReg :: FAST_INT -> FAST_BOOL
842 #if alpha_TARGET_ARCH
843 freeReg ILIT(26) = _FALSE_ -- return address (ra)
844 freeReg ILIT(28) = _FALSE_ -- reserved for the assembler (at)
845 freeReg ILIT(29) = _FALSE_ -- global pointer (gp)
846 freeReg ILIT(30) = _FALSE_ -- stack pointer (sp)
847 freeReg ILIT(31) = _FALSE_ -- always zero (zeroh)
848 freeReg ILIT(63) = _FALSE_ -- always zero (f31)
852 freeReg ILIT(esp) = _FALSE_ -- %esp is the C stack pointer
855 #if sparc_TARGET_ARCH
856 freeReg ILIT(g0) = _FALSE_ -- %g0 is always 0.
857 freeReg ILIT(g5) = _FALSE_ -- %g5 is reserved (ABI).
858 freeReg ILIT(g6) = _FALSE_ -- %g6 is reserved (ABI).
859 freeReg ILIT(g7) = _FALSE_ -- %g7 is reserved (ABI).
860 freeReg ILIT(i6) = _FALSE_ -- %i6 is our frame pointer.
861 freeReg ILIT(o6) = _FALSE_ -- %o6 is our stack pointer.
865 freeReg ILIT(REG_Base) = _FALSE_
868 freeReg ILIT(REG_R1) = _FALSE_
871 freeReg ILIT(REG_R2) = _FALSE_
874 freeReg ILIT(REG_R3) = _FALSE_
877 freeReg ILIT(REG_R4) = _FALSE_
880 freeReg ILIT(REG_R5) = _FALSE_
883 freeReg ILIT(REG_R6) = _FALSE_
886 freeReg ILIT(REG_R7) = _FALSE_
889 freeReg ILIT(REG_R8) = _FALSE_
892 freeReg ILIT(REG_F1) = _FALSE_
895 freeReg ILIT(REG_F2) = _FALSE_
898 freeReg ILIT(REG_F3) = _FALSE_
901 freeReg ILIT(REG_F4) = _FALSE_
904 freeReg ILIT(REG_D1) = _FALSE_
907 freeReg ILIT(REG_D2) = _FALSE_
910 freeReg ILIT(REG_Sp) = _FALSE_
913 freeReg ILIT(REG_Su) = _FALSE_
916 freeReg ILIT(REG_SpLim) = _FALSE_
919 freeReg ILIT(REG_Hp) = _FALSE_
922 freeReg ILIT(REG_HpLim) = _FALSE_
925 -- we hang onto two double regs for dedicated
926 -- use; this is not necessary on Alphas and
927 -- may not be on other non-SPARCs.
929 | n _EQ_ (ILIT(REG_D1) _ADD_ ILIT(1)) = _FALSE_
932 | n _EQ_ (ILIT(REG_D2) _ADD_ ILIT(1)) = _FALSE_