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=b357675eeb27788565e532a7c3be7cb4a56eff02;hp=35b49d1809bf98789b5a00554bb234e36a13b83f;hb=7e95df790b34e11d7308e43dab0a7175b69b70fc;hpb=c0687066474aa4ce4912f31a5c09c1bcd673fb06 diff --git a/compiler/nativeGen/TargetReg.hs b/compiler/nativeGen/TargetReg.hs index 35b49d1..b357675 100644 --- a/compiler/nativeGen/TargetReg.hs +++ b/compiler/nativeGen/TargetReg.hs @@ -31,60 +31,72 @@ 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" + 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 + +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