add -fsimpleopt-before-flatten
[ghc-hetmet.git] / compiler / nativeGen / TargetReg.hs
index 2643b00..35b49d1 100644 (file)
 --     TODO: We should also make arch specific versions of RegAlloc.Graph.TrivColorable
 
 module TargetReg (
-       targetRegClass,
-       targetMkVReg,
+       targetVirtualRegSqueeze,
+       targetRealRegSqueeze,
+       targetClassOfRealReg,
+       targetMkVirtualReg,
        targetWordSize,
-       targetRegDotColor
+       targetRegDotColor,
+       targetClassOfReg
 )
 
 where
@@ -24,9 +27,10 @@ import Reg
 import RegClass
 import Size
 
-import CmmExpr (wordWidth)
+import CmmType (wordWidth)
 import Outputable
 import Unique
+import FastTypes
 
 
 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
@@ -35,62 +39,47 @@ import qualified X86.RegInfo        as X86
 
 #elif powerpc_TARGET_ARCH
 import qualified PPC.Regs      as PPC
-import qualified PPC.RegInfo   as PPC
 
 #elif sparc_TARGET_ARCH        
 import qualified SPARC.Regs    as SPARC
-import qualified SPARC.RegInfo as SPARC
-
 
 #else
 #error "RegAlloc.Graph.TargetReg: not defined"
 #endif
 
+targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
+targetRealRegSqueeze   :: RegClass -> RealReg -> FastInt
+targetClassOfRealReg   :: RealReg -> RegClass
+targetWordSize                 :: Size
+targetMkVirtualReg     :: Unique -> Size -> VirtualReg
+targetRegDotColor      :: RealReg -> SDoc
+
 -- x86 -------------------------------------------------------------------------
 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
-targetRegClass :: Reg -> RegClass
-targetRegClass = X86.regClass
-
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg   = X86.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = X86.regDotColor
-
+targetVirtualRegSqueeze = X86.virtualRegSqueeze
+targetRealRegSqueeze   = X86.realRegSqueeze
+targetClassOfRealReg   = X86.classOfRealReg
+targetWordSize                 = intSize wordWidth
+targetMkVirtualReg     = X86.mkVirtualReg
+targetRegDotColor      = X86.regDotColor
 
 -- ppc -------------------------------------------------------------------------
 #elif powerpc_TARGET_ARCH
-targetRegClass :: Reg -> RegClass
-targetRegClass = PPC.regClass
-
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg   = PPC.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = PPC.regDotColor
-
+targetVirtualRegSqueeze = PPC.virtualRegSqueeze
+targetRealRegSqueeze   = PPC.realRegSqueeze
+targetClassOfRealReg   = PPC.classOfRealReg
+targetWordSize                 = intSize wordWidth
+targetMkVirtualReg     = PPC.mkVirtualReg
+targetRegDotColor      = PPC.regDotColor
 
 -- sparc -----------------------------------------------------------------------
 #elif sparc_TARGET_ARCH
-targetRegClass :: Reg -> RegClass
-targetRegClass = SPARC.regClass
-
--- | Size of a machine word. 
---     This is big enough to hold a pointer.
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg   = SPARC.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = SPARC.regDotColor
+targetVirtualRegSqueeze = SPARC.virtualRegSqueeze
+targetRealRegSqueeze   = SPARC.realRegSqueeze
+targetClassOfRealReg   = SPARC.classOfRealReg
+targetWordSize                 = intSize wordWidth
+targetMkVirtualReg     = SPARC.mkVirtualReg
+targetRegDotColor      = SPARC.regDotColor
 
 --------------------------------------------------------------------------------
 #else
@@ -98,4 +87,10 @@ targetRegDotColor = SPARC.regDotColor
 #endif
 
 
+targetClassOfReg :: Reg -> RegClass
+targetClassOfReg reg
+ = case reg of
+       RegVirtual vr   -> classOfVirtualReg vr
+       RegReal rr      -> targetClassOfRealReg rr
+