Small step toward call-conv improvement: separate out calls and returns
[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         targetRegClass,
14         targetMkVReg,
15         targetWordSize,
16         targetRegDotColor
17 )
18
19 where
20
21 #include "HsVersions.h"
22
23 import Reg
24 import RegClass
25 import Size
26
27 import CmmExpr  (wordWidth)
28 import Outputable
29 import Unique
30
31
32 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
33 import qualified X86.Regs       as X86
34 import qualified X86.RegInfo    as X86
35
36 #elif powerpc_TARGET_ARCH
37 import qualified PPC.Regs       as PPC
38 import qualified PPC.RegInfo    as PPC
39
40 #elif sparc_TARGET_ARCH 
41 import qualified SPARC.Regs     as SPARC
42
43 #else
44 #error "RegAlloc.Graph.TargetReg: not defined"
45 #endif
46
47 -- x86 -------------------------------------------------------------------------
48 #if i386_TARGET_ARCH || x86_64_TARGET_ARCH
49 targetRegClass :: Reg -> RegClass
50 targetRegClass  = X86.regClass
51
52 targetWordSize :: Size
53 targetWordSize = intSize wordWidth
54
55 targetMkVReg :: Unique -> Size -> Reg
56 targetMkVReg    = X86.mkVReg
57
58 targetRegDotColor :: Reg -> SDoc
59 targetRegDotColor = X86.regDotColor
60
61
62 -- ppc -------------------------------------------------------------------------
63 #elif powerpc_TARGET_ARCH
64 targetRegClass :: Reg -> RegClass
65 targetRegClass  = PPC.regClass
66
67 targetWordSize :: Size
68 targetWordSize = intSize wordWidth
69
70 targetMkVReg :: Unique -> Size -> Reg
71 targetMkVReg    = PPC.mkVReg
72
73 targetRegDotColor :: Reg -> SDoc
74 targetRegDotColor = PPC.regDotColor
75
76
77 -- sparc -----------------------------------------------------------------------
78 #elif sparc_TARGET_ARCH
79 targetRegClass :: Reg -> RegClass
80 targetRegClass  = SPARC.regClass
81
82 -- | Size of a machine word. 
83 --      This is big enough to hold a pointer.
84 targetWordSize :: Size
85 targetWordSize = intSize wordWidth
86
87 targetMkVReg :: Unique -> Size -> Reg
88 targetMkVReg    = SPARC.mkVReg
89
90 targetRegDotColor :: Reg -> SDoc
91 targetRegDotColor = SPARC.regDotColor
92
93 --------------------------------------------------------------------------------
94 #else
95 #error "RegAlloc.Graph.TargetReg: not defined"
96 #endif
97
98
99