Split Reg into vreg/hreg and add register pairs
[ghc-hetmet.git] / compiler / nativeGen / TargetReg.hs
1
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.
5 --
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.
9 --
10 --      TODO: We should also make arch specific versions of RegAlloc.Graph.TrivColorable
11
12 module TargetReg (
13         targetVirtualRegSqueeze,
14         targetRealRegSqueeze,
15         targetClassOfRealReg,
16         targetMkVirtualReg,
17         targetWordSize,
18         targetRegDotColor,
19         targetClassOfReg
20 )
21
22 where
23
24 #include "HsVersions.h"
25
26 import Reg
27 import RegClass
28 import Size
29
30 import CmmExpr  (wordWidth)
31 import Outputable
32 import Unique
33 import FastTypes
34
35
36 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
37 import qualified X86.Regs       as X86
38 import qualified X86.RegInfo    as X86
39
40 #elif powerpc_TARGET_ARCH
41 import qualified PPC.Regs       as PPC
42 import qualified PPC.RegInfo    as PPC
43
44 #elif sparc_TARGET_ARCH 
45 import qualified SPARC.Regs     as SPARC
46
47 #else
48 #error "RegAlloc.Graph.TargetReg: not defined"
49 #endif
50
51 -- x86 -------------------------------------------------------------------------
52 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
53 targetRegClasses :: Reg -> [RegClass]
54 targetRegClasses = X86.regClasses
55
56 targetRegSupportsClass :: Reg -> RegClass -> Bool
57 targetRegSupportsClass = X86.regSupportsClass
58
59 targetWordSize :: Size
60 targetWordSize = intSize wordWidth
61
62 targetMkVReg :: Unique -> Size -> Reg
63 targetMkVReg    = X86.mkVReg
64
65 targetRegDotColor :: Reg -> SDoc
66 targetRegDotColor = X86.regDotColor
67
68
69 -- ppc -------------------------------------------------------------------------
70 #elif powerpc_TARGET_ARCH
71 targetRegClasses :: Reg -> [RegClass]
72 targetRegClasses = PPC.regClasses
73
74 targetRegSupportsClass :: Reg -> RegClass -> Bool
75 targetRegSupportsClass = PPC.regSupportsClass
76
77 targetWordSize :: Size
78 targetWordSize = intSize wordWidth
79
80 targetMkVReg :: Unique -> Size -> Reg
81 targetMkVReg    = PPC.mkVReg
82
83 targetRegDotColor :: Reg -> SDoc
84 targetRegDotColor = PPC.regDotColor
85
86
87 -- sparc -----------------------------------------------------------------------
88 #elif sparc_TARGET_ARCH
89
90 targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
91 targetVirtualRegSqueeze = SPARC.virtualRegSqueeze
92
93 targetRealRegSqueeze :: RegClass -> RealReg -> FastInt
94 targetRealRegSqueeze = SPARC.realRegSqueeze
95
96 targetClassOfRealReg :: RealReg -> RegClass
97 targetClassOfRealReg = SPARC.classOfRealReg
98
99 -- | Size of a machine word. 
100 --      This is big enough to hold a pointer.
101 targetWordSize :: Size
102 targetWordSize = intSize wordWidth
103
104 targetMkVirtualReg :: Unique -> Size -> VirtualReg
105 targetMkVirtualReg = SPARC.mkVirtualReg
106
107 targetRegDotColor :: RealReg -> SDoc
108 targetRegDotColor = SPARC.regDotColor
109
110 --------------------------------------------------------------------------------
111 #else
112 #error "RegAlloc.Graph.TargetReg: not defined"
113 #endif
114
115
116 targetClassOfReg :: Reg -> RegClass
117 targetClassOfReg reg
118  = case reg of
119         RegVirtual vr   -> classOfVirtualReg vr
120         RegReal rr      -> targetClassOfRealReg rr
121
122