import RegClass
import Size
-import CmmExpr (wordWidth)
+import CmmType (wordWidth)
import Outputable
import Unique
import FastTypes
+import Platform
+import qualified X86.Regs as X86
+import qualified X86.RegInfo as X86
-#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
-import qualified X86.Regs as X86
-import qualified X86.RegInfo as X86
+import qualified PPC.Regs as PPC
-#elif powerpc_TARGET_ARCH
-import qualified PPC.Regs as PPC
-import qualified PPC.RegInfo as PPC
+import qualified SPARC.Regs as SPARC
-#elif sparc_TARGET_ARCH
-import qualified SPARC.Regs as SPARC
-
-#else
-#error "RegAlloc.Graph.TargetReg: not defined"
-#endif
-
--- x86 -------------------------------------------------------------------------
-#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
-targetRegClasses :: Reg -> [RegClass]
-targetRegClasses = X86.regClasses
-
-targetRegSupportsClass :: Reg -> RegClass -> Bool
-targetRegSupportsClass = X86.regSupportsClass
-
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg = X86.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = X86.regDotColor
-
-
--- ppc -------------------------------------------------------------------------
-#elif powerpc_TARGET_ARCH
-targetRegClasses :: Reg -> [RegClass]
-targetRegClasses = PPC.regClasses
-
-targetRegSupportsClass :: Reg -> RegClass -> Bool
-targetRegSupportsClass = PPC.regSupportsClass
-
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg = PPC.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = PPC.regDotColor
-
-
--- sparc -----------------------------------------------------------------------
-#elif sparc_TARGET_ARCH
+-- 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 = SPARC.virtualRegSqueeze
+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 = SPARC.realRegSqueeze
+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 = SPARC.classOfRealReg
-
--- | Size of a machine word.
--- This is big enough to hold a pointer.
+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
targetMkVirtualReg :: Unique -> Size -> VirtualReg
-targetMkVirtualReg = SPARC.mkVirtualReg
+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 = SPARC.regDotColor
-
---------------------------------------------------------------------------------
-#else
-#error "RegAlloc.Graph.TargetReg: not defined"
-#endif
+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