cmmTopCodeGen no longer takes DynFlags as an argument
[ghc-hetmet.git] / compiler / nativeGen / TargetReg.hs
index 2643b00..b357675 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,78 +27,82 @@ import Reg
 import RegClass
 import Size
 
-import CmmExpr (wordWidth)
+import CmmType (wordWidth)
 import Outputable
 import Unique
-
-
-#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
-import qualified X86.Regs      as X86
-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
-
--- x86 -------------------------------------------------------------------------
-#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
-targetRegClass :: Reg -> RegClass
-targetRegClass = X86.regClass
-
+import FastTypes
+import Platform
+
+import qualified X86.Regs       as X86
+import qualified X86.RegInfo    as X86
+
+import qualified PPC.Regs       as PPC
+
+import qualified SPARC.Regs     as SPARC
+
+-- TODO: We shouldn't be using defaultTargetPlatform here.
+--       We should be passing DynFlags in instead, and looking at
+--       its targetPlatform.
+
+targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
+targetVirtualRegSqueeze
+    = case platformArch defaultTargetPlatform of
+      ArchX86     -> X86.virtualRegSqueeze
+      ArchX86_64  -> X86.virtualRegSqueeze
+      ArchPPC     -> PPC.virtualRegSqueeze
+      ArchSPARC   -> SPARC.virtualRegSqueeze
+      ArchPPC_64  -> panic "targetVirtualRegSqueeze ArchPPC_64"
+      ArchUnknown -> panic "targetVirtualRegSqueeze ArchUnknown"
+
+targetRealRegSqueeze :: RegClass -> RealReg -> FastInt
+targetRealRegSqueeze
+    = case platformArch defaultTargetPlatform of
+      ArchX86     -> X86.realRegSqueeze
+      ArchX86_64  -> X86.realRegSqueeze
+      ArchPPC     -> PPC.realRegSqueeze
+      ArchSPARC   -> SPARC.realRegSqueeze
+      ArchPPC_64  -> panic "targetRealRegSqueeze ArchPPC_64"
+      ArchUnknown -> panic "targetRealRegSqueeze ArchUnknown"
+
+targetClassOfRealReg :: RealReg -> RegClass
+targetClassOfRealReg
+    = case platformArch defaultTargetPlatform of
+      ArchX86     -> X86.classOfRealReg
+      ArchX86_64  -> X86.classOfRealReg
+      ArchPPC     -> PPC.classOfRealReg
+      ArchSPARC   -> SPARC.classOfRealReg
+      ArchPPC_64  -> panic "targetClassOfRealReg ArchPPC_64"
+      ArchUnknown -> panic "targetClassOfRealReg ArchUnknown"
+
+-- TODO: This should look at targetPlatform too
 targetWordSize :: Size
 targetWordSize = intSize wordWidth
 
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg   = X86.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-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
-
-
--- 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
-
---------------------------------------------------------------------------------
-#else
-#error "RegAlloc.Graph.TargetReg: not defined"
-#endif
-
+targetMkVirtualReg :: Unique -> Size -> VirtualReg
+targetMkVirtualReg
+    = case platformArch defaultTargetPlatform of
+      ArchX86     -> X86.mkVirtualReg
+      ArchX86_64  -> X86.mkVirtualReg
+      ArchPPC     -> PPC.mkVirtualReg
+      ArchSPARC   -> SPARC.mkVirtualReg
+      ArchPPC_64  -> panic "targetMkVirtualReg ArchPPC_64"
+      ArchUnknown -> panic "targetMkVirtualReg ArchUnknown"
+
+targetRegDotColor :: RealReg -> SDoc
+targetRegDotColor
+    = case platformArch defaultTargetPlatform of
+      ArchX86     -> X86.regDotColor
+      ArchX86_64  -> X86.regDotColor
+      ArchPPC     -> PPC.regDotColor
+      ArchSPARC   -> SPARC.regDotColor
+      ArchPPC_64  -> panic "targetRegDotColor ArchPPC_64"
+      ArchUnknown -> panic "targetRegDotColor ArchUnknown"
+
+
+targetClassOfReg :: Reg -> RegClass
+targetClassOfReg reg
+ = case reg of
+       RegVirtual vr   -> classOfVirtualReg vr
+       RegReal rr      -> targetClassOfRealReg rr