-- 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
import CmmExpr (wordWidth)
import Outputable
import Unique
+import FastTypes
#if i386_TARGET_ARCH || x86_64_TARGET_ARCH
#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
+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
-targetRegClass :: Reg -> RegClass
-targetRegClass = X86.regClass
-
-targetWordSize :: Size
-targetWordSize = intSize wordWidth
-
-targetMkVReg :: Unique -> Size -> Reg
-targetMkVReg = X86.mkVReg
-
-targetRegDotColor :: Reg -> SDoc
-targetRegDotColor = X86.regDotColor
-
+targetVirtualRegSqueeze = X86.virtualRegSqueeze
+targetRealRegSqueeze = X86.realRegSqueeze
+targetClassOfRealReg = X86.classOfRealReg
+targetWordSize = intSize wordWidth
+targetMkVirtualReg = X86.mkVirtualReg
+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
-
+targetVirtualRegSqueeze = PPC.virtualRegSqueeze
+targetRealRegSqueeze = PPC.realRegSqueeze
+targetClassOfRealReg = PPC.classOfRealReg
+targetWordSize = intSize wordWidth
+targetMkVirtualReg = PPC.mkVirtualReg
+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
+targetVirtualRegSqueeze = SPARC.virtualRegSqueeze
+targetRealRegSqueeze = SPARC.realRegSqueeze
+targetClassOfRealReg = SPARC.classOfRealReg
+targetWordSize = intSize wordWidth
+targetMkVirtualReg = SPARC.mkVirtualReg
+targetRegDotColor = SPARC.regDotColor
--------------------------------------------------------------------------------
#else
#endif
+targetClassOfReg :: Reg -> RegClass
+targetClassOfReg reg
+ = case reg of
+ RegVirtual vr -> classOfVirtualReg vr
+ RegReal rr -> targetClassOfRealReg rr
+