Follow vreg/hreg patch in x86 NCG
[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 targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
52 targetRealRegSqueeze    :: RegClass -> RealReg -> FastInt
53 targetClassOfRealReg    :: RealReg -> RegClass
54 targetWordSize          :: Size
55 targetMkVirtualReg      :: Unique -> Size -> VirtualReg
56 targetRegDotColor       :: RealReg -> SDoc
57
58 -- x86 -------------------------------------------------------------------------
59 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
60 targetVirtualRegSqueeze = X86.virtualRegSqueeze
61 targetRealRegSqueeze    = X86.realRegSqueeze
62 targetClassOfRealReg    = X86.classOfRealReg
63 targetWordSize          = intSize wordWidth
64 targetMkVirtualReg      = X86.mkVirtualReg
65 targetRegDotColor       = X86.regDotColor
66
67 -- ppc -------------------------------------------------------------------------
68 #elif powerpc_TARGET_ARCH
69 targetVirtualRegSqueeze = PPC.virtualRegSqueeze
70 targetRealRegSqueeze    = PPC.realRegSqueeze
71 targetClassOfRealReg    = PPC.classOfRealReg
72 targetWordSize          = intSize wordWidth
73 targetMkVirtualReg      = PPC.mkVirtualReg
74 targetRegDotColor       = PPC.regDotColor
75
76 -- sparc -----------------------------------------------------------------------
77 #elif sparc_TARGET_ARCH
78 targetVirtualRegSqueeze = SPARC.virtualRegSqueeze
79 targetRealRegSqueeze    = SPARC.realRegSqueeze
80 targetClassOfRealReg    = SPARC.classOfRealReg
81 targetWordSize          = intSize wordWidth
82 targetMkVirtualReg      = SPARC.mkVirtualReg
83 targetRegDotColor       = SPARC.regDotColor
84
85 --------------------------------------------------------------------------------
86 #else
87 #error "RegAlloc.Graph.TargetReg: not defined"
88 #endif
89
90
91 targetClassOfReg :: Reg -> RegClass
92 targetClassOfReg reg
93  = case reg of
94         RegVirtual vr   -> classOfVirtualReg vr
95         RegReal rr      -> targetClassOfRealReg rr
96
97