X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FnativeGen%2FTargetReg.hs;h=b357675eeb27788565e532a7c3be7cb4a56eff02;hp=471ee21384aa60c0f711b6248883bf93877da0b8;hb=8133a9f47b99f4e65ed30551de32ad72c6b61b27;hpb=547bf6827f1fc3f2fb31bc6323cc0d33b445f32a diff --git a/compiler/nativeGen/TargetReg.hs b/compiler/nativeGen/TargetReg.hs index 471ee21..b357675 100644 --- a/compiler/nativeGen/TargetReg.hs +++ b/compiler/nativeGen/TargetReg.hs @@ -10,10 +10,13 @@ -- 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,76 +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 - -#else -#error "RegAlloc.Graph.TargetReg: not defined" -#endif - --- 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 - - --- 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. +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 = 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