[project @ 2000-05-15 15:03:36 by simonmar]
[ghc-hetmet.git] / ghc / compiler / nativeGen / MachRegs.lhs
index f32024f..81ff772 100644 (file)
@@ -26,13 +26,13 @@ module MachRegs (
        callClobberedRegs,
        callerSaves,
        extractMappedRegNos,
+        mappedRegNo,
        freeMappedRegs,
        freeReg, freeRegs,
        getNewRegNCG,
        magicIdRegMaybe,
        mkReg,
        realReg,
-       reservedRegs,
        saveLoc,
        spRel,
        stgReg,
@@ -64,11 +64,12 @@ import AbsCUtils    ( magicIdPrimRep )
 import CLabel           ( CLabel )
 import PrimOp          ( PrimOp(..) )
 import PrimRep         ( PrimRep(..) )
-import Stix            ( sStLitLbl, StixTree(..), StixReg(..) )
+import Stix            ( sStLitLbl, StixTree(..), StixReg(..),
+                          getUniqueNat, returnNat, thenNat, NatM )
 import Unique          ( mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
                          Uniquable(..), Unique
                        )
-import UniqSupply      ( getUniqueUs, returnUs, thenUs, UniqSM )
+--import UniqSupply    ( getUniqueUs, returnUs, thenUs, UniqSM )
 import Outputable
 \end{code}
 
@@ -270,12 +271,12 @@ data Reg
 mkReg :: Unique -> PrimRep -> Reg
 mkReg = UnmappedReg
 
-getNewRegNCG :: PrimRep -> UniqSM Reg
+getNewRegNCG :: PrimRep -> NatM Reg
 getNewRegNCG pk
-  = getUniqueUs        `thenUs` \ u ->
-    returnUs (UnmappedReg u pk)
+  = getUniqueNat `thenNat` \ u ->
+    returnNat (UnmappedReg u pk)
 
-instance Text Reg where
+instance Show Reg where
     showsPrec _ (FixedReg i)   = showString "%"  . shows IBOX(i)
     showsPrec _ (MappedReg i)  = showString "%"  . shows IBOX(i)
     showsPrec _ (MemoryReg i _) = showString "%M"  . shows i
@@ -336,6 +337,10 @@ extractMappedRegNos regs
   where
     ex (MappedReg i) acc = IBOX(i) : acc  -- we'll take it
     ex _            acc = acc            -- leave it out
+
+mappedRegNo :: Reg -> RegNo
+mappedRegNo (MappedReg i) = IBOX(i)
+mappedRegNo _             = pprPanic "mappedRegNo" empty
 \end{code}
 
 ** Machine-specific Reg stuff: **
@@ -579,6 +584,8 @@ baseRegOffset (LongReg _ ILIT(2))    = OFFSET_Lng2
 #endif
 baseRegOffset Hp                    = OFFSET_Hp
 baseRegOffset HpLim                 = OFFSET_HpLim
+baseRegOffset CurrentTSO            = OFFSET_CurrentTSO
+baseRegOffset CurrentNursery        = OFFSET_CurrentNursery
 #ifdef DEBUG
 baseRegOffset BaseReg               = panic "baseRegOffset:BaseReg"
 baseRegOffset CurCostCentre         = panic "baseRegOffset:CurCostCentre"
@@ -652,6 +659,12 @@ callerSaves Hp                             = True
 #ifdef CALLER_SAVES_HpLim
 callerSaves HpLim                      = True
 #endif
+#ifdef CALLER_SAVES_CurrentTSO
+callerSaves CurrentTSO                 = True
+#endif
+#ifdef CALLER_SAVES_CurrentNursery
+callerSaves CurrentNursery             = True
+#endif
 callerSaves _                          = False
 \end{code}
 
@@ -730,43 +743,16 @@ magicIdRegMaybe Hp                        = Just (FixedReg ILIT(REG_Hp))
 #ifdef REG_HpLim                       
 magicIdRegMaybe HpLim                  = Just (FixedReg ILIT(REG_HpLim))
 #endif                                 
+#ifdef REG_CurrentTSO                          
+magicIdRegMaybe CurrentTSO             = Just (FixedReg ILIT(REG_CurrentTSO))
+#endif                                 
+#ifdef REG_CurrentNursery                              
+magicIdRegMaybe CurrentNursery         = Just (FixedReg ILIT(REG_CurrentNursery))
+#endif                                 
 magicIdRegMaybe _                      = Nothing
 \end{code}
 
-%************************************************************************
-%*                                                                     *
-\subsection{Free, reserved, call-clobbered, and argument registers}
-%*                                                                     *
-%************************************************************************
-
-@freeRegs@ is the list of registers we can use in register allocation.
-@freeReg@ (below) says if a particular register is free.
-
-With a per-instruction clobber list, we might be able to get some of
-these back, but it's probably not worth the hassle.
-
-@callClobberedRegs@ ... the obvious.
-
-@argRegs@: assuming a call with N arguments, what registers will be
-used to hold arguments?  (NB: it doesn't know whether the arguments
-are integer or floating-point...)
-
 \begin{code}
-reservedRegs :: [RegNo]
-reservedRegs
-#if alpha_TARGET_ARCH
-  = [NCG_Reserved_I1, NCG_Reserved_I2,
-     NCG_Reserved_F1, NCG_Reserved_F2]
-#endif
-#if i386_TARGET_ARCH
-  = [{-certainly cannot afford any!-}]
-#endif
-#if sparc_TARGET_ARCH
-  = [NCG_Reserved_I1, NCG_Reserved_I2,
-     NCG_Reserved_F1, NCG_Reserved_F2,
-     NCG_Reserved_D1, NCG_Reserved_D2]
-#endif
-
 -------------------------------
 freeRegs :: [Reg]
 freeRegs