2 -- | Hard wired things related to registers.
3 -- This is module is preventing the native code generator being able to
4 -- emit code for non-host architectures.
6 -- TODO: Do a better job of the overloading, and eliminate this module.
7 -- We'd probably do better with a Register type class, and hook this to
8 -- Instruction somehow.
10 -- TODO: We should also make arch specific versions of RegAlloc.Graph.TrivColorable
13 targetVirtualRegSqueeze,
24 #include "HsVersions.h"
30 import CmmExpr (wordWidth)
36 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
37 import qualified X86.Regs as X86
38 import qualified X86.RegInfo as X86
40 #elif powerpc_TARGET_ARCH
41 import qualified PPC.Regs as PPC
42 import qualified PPC.RegInfo as PPC
44 #elif sparc_TARGET_ARCH
45 import qualified SPARC.Regs as SPARC
48 #error "RegAlloc.Graph.TargetReg: not defined"
51 -- x86 -------------------------------------------------------------------------
52 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
53 targetRegClasses :: Reg -> [RegClass]
54 targetRegClasses = X86.regClasses
56 targetRegSupportsClass :: Reg -> RegClass -> Bool
57 targetRegSupportsClass = X86.regSupportsClass
59 targetWordSize :: Size
60 targetWordSize = intSize wordWidth
62 targetMkVReg :: Unique -> Size -> Reg
63 targetMkVReg = X86.mkVReg
65 targetRegDotColor :: Reg -> SDoc
66 targetRegDotColor = X86.regDotColor
69 -- ppc -------------------------------------------------------------------------
70 #elif powerpc_TARGET_ARCH
71 targetRegClasses :: Reg -> [RegClass]
72 targetRegClasses = PPC.regClasses
74 targetRegSupportsClass :: Reg -> RegClass -> Bool
75 targetRegSupportsClass = PPC.regSupportsClass
77 targetWordSize :: Size
78 targetWordSize = intSize wordWidth
80 targetMkVReg :: Unique -> Size -> Reg
81 targetMkVReg = PPC.mkVReg
83 targetRegDotColor :: Reg -> SDoc
84 targetRegDotColor = PPC.regDotColor
87 -- sparc -----------------------------------------------------------------------
88 #elif sparc_TARGET_ARCH
90 targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
91 targetVirtualRegSqueeze = SPARC.virtualRegSqueeze
93 targetRealRegSqueeze :: RegClass -> RealReg -> FastInt
94 targetRealRegSqueeze = SPARC.realRegSqueeze
96 targetClassOfRealReg :: RealReg -> RegClass
97 targetClassOfRealReg = SPARC.classOfRealReg
99 -- | Size of a machine word.
100 -- This is big enough to hold a pointer.
101 targetWordSize :: Size
102 targetWordSize = intSize wordWidth
104 targetMkVirtualReg :: Unique -> Size -> VirtualReg
105 targetMkVirtualReg = SPARC.mkVirtualReg
107 targetRegDotColor :: RealReg -> SDoc
108 targetRegDotColor = SPARC.regDotColor
110 --------------------------------------------------------------------------------
112 #error "RegAlloc.Graph.TargetReg: not defined"
116 targetClassOfReg :: Reg -> RegClass
119 RegVirtual vr -> classOfVirtualReg vr
120 RegReal rr -> targetClassOfRealReg rr