X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FnativeGen%2FTargetReg.hs;fp=compiler%2FnativeGen%2FTargetReg.hs;h=9c15a779bb984fda0cbd69200bf570f9466493f5;hp=35b49d1809bf98789b5a00554bb234e36a13b83f;hb=a87ffbd2eba9a4e351814d35ce1a7cfdeb2d53af;hpb=67d845652defc09807eaf134c6d30c8bd26b665a diff --git a/compiler/nativeGen/TargetReg.hs b/compiler/nativeGen/TargetReg.hs index 35b49d1..9c15a77 100644 --- a/compiler/nativeGen/TargetReg.hs +++ b/compiler/nativeGen/TargetReg.hs @@ -31,60 +31,67 @@ 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 SPARC.Regs as SPARC -#elif sparc_TARGET_ARCH -import qualified SPARC.Regs as SPARC - -#else -#error "RegAlloc.Graph.TargetReg: not defined" -#endif +-- TODO: We shouldn't be using defaultTargetPlatform here. +-- We should be passing DynFlags in instead, and looking at +-- its targetPlatform. 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 -targetVirtualRegSqueeze = X86.virtualRegSqueeze -targetRealRegSqueeze = X86.realRegSqueeze -targetClassOfRealReg = X86.classOfRealReg -targetWordSize = intSize wordWidth -targetMkVirtualReg = X86.mkVirtualReg -targetRegDotColor = X86.regDotColor - --- ppc ------------------------------------------------------------------------- -#elif powerpc_TARGET_ARCH -targetVirtualRegSqueeze = PPC.virtualRegSqueeze -targetRealRegSqueeze = PPC.realRegSqueeze -targetClassOfRealReg = PPC.classOfRealReg -targetWordSize = intSize wordWidth -targetMkVirtualReg = PPC.mkVirtualReg -targetRegDotColor = PPC.regDotColor - --- sparc ----------------------------------------------------------------------- -#elif sparc_TARGET_ARCH -targetVirtualRegSqueeze = SPARC.virtualRegSqueeze -targetRealRegSqueeze = SPARC.realRegSqueeze -targetClassOfRealReg = SPARC.classOfRealReg -targetWordSize = intSize wordWidth -targetMkVirtualReg = SPARC.mkVirtualReg -targetRegDotColor = SPARC.regDotColor - --------------------------------------------------------------------------------- -#else -#error "RegAlloc.Graph.TargetReg: not defined" -#endif +targetVirtualRegSqueeze + = case platformArch defaultTargetPlatform of + ArchX86 -> X86.virtualRegSqueeze + ArchX86_64 -> X86.virtualRegSqueeze + ArchPPC -> PPC.virtualRegSqueeze + ArchSPARC -> SPARC.virtualRegSqueeze + ArchPPC_64 -> panic "targetVirtualRegSqueeze ArchPPC_64" + +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" + +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" + +-- TODO: This should look at targetPlatform too +targetWordSize :: Size +targetWordSize = intSize wordWidth + +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" + +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" targetClassOfReg :: Reg -> RegClass