cmmTopCodeGen no longer takes DynFlags as an argument
[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 CmmType  (wordWidth)
31 import Outputable
32 import Unique
33 import FastTypes
34 import Platform
35
36 import qualified X86.Regs       as X86
37 import qualified X86.RegInfo    as X86
38
39 import qualified PPC.Regs       as PPC
40
41 import qualified SPARC.Regs     as SPARC
42
43 -- TODO: We shouldn't be using defaultTargetPlatform here.
44 --       We should be passing DynFlags in instead, and looking at
45 --       its targetPlatform.
46
47 targetVirtualRegSqueeze :: RegClass -> VirtualReg -> FastInt
48 targetVirtualRegSqueeze
49     = case platformArch defaultTargetPlatform of
50       ArchX86     -> X86.virtualRegSqueeze
51       ArchX86_64  -> X86.virtualRegSqueeze
52       ArchPPC     -> PPC.virtualRegSqueeze
53       ArchSPARC   -> SPARC.virtualRegSqueeze
54       ArchPPC_64  -> panic "targetVirtualRegSqueeze ArchPPC_64"
55       ArchUnknown -> panic "targetVirtualRegSqueeze ArchUnknown"
56
57 targetRealRegSqueeze :: RegClass -> RealReg -> FastInt
58 targetRealRegSqueeze
59     = case platformArch defaultTargetPlatform of
60       ArchX86     -> X86.realRegSqueeze
61       ArchX86_64  -> X86.realRegSqueeze
62       ArchPPC     -> PPC.realRegSqueeze
63       ArchSPARC   -> SPARC.realRegSqueeze
64       ArchPPC_64  -> panic "targetRealRegSqueeze ArchPPC_64"
65       ArchUnknown -> panic "targetRealRegSqueeze ArchUnknown"
66
67 targetClassOfRealReg :: RealReg -> RegClass
68 targetClassOfRealReg
69     = case platformArch defaultTargetPlatform of
70       ArchX86     -> X86.classOfRealReg
71       ArchX86_64  -> X86.classOfRealReg
72       ArchPPC     -> PPC.classOfRealReg
73       ArchSPARC   -> SPARC.classOfRealReg
74       ArchPPC_64  -> panic "targetClassOfRealReg ArchPPC_64"
75       ArchUnknown -> panic "targetClassOfRealReg ArchUnknown"
76
77 -- TODO: This should look at targetPlatform too
78 targetWordSize :: Size
79 targetWordSize = intSize wordWidth
80
81 targetMkVirtualReg :: Unique -> Size -> VirtualReg
82 targetMkVirtualReg
83     = case platformArch defaultTargetPlatform of
84       ArchX86     -> X86.mkVirtualReg
85       ArchX86_64  -> X86.mkVirtualReg
86       ArchPPC     -> PPC.mkVirtualReg
87       ArchSPARC   -> SPARC.mkVirtualReg
88       ArchPPC_64  -> panic "targetMkVirtualReg ArchPPC_64"
89       ArchUnknown -> panic "targetMkVirtualReg ArchUnknown"
90
91 targetRegDotColor :: RealReg -> SDoc
92 targetRegDotColor
93     = case platformArch defaultTargetPlatform of
94       ArchX86     -> X86.regDotColor
95       ArchX86_64  -> X86.regDotColor
96       ArchPPC     -> PPC.regDotColor
97       ArchSPARC   -> SPARC.regDotColor
98       ArchPPC_64  -> panic "targetRegDotColor ArchPPC_64"
99       ArchUnknown -> panic "targetRegDotColor ArchUnknown"
100
101
102 targetClassOfReg :: Reg -> RegClass
103 targetClassOfReg reg
104  = case reg of
105         RegVirtual vr   -> classOfVirtualReg vr
106         RegReal rr      -> targetClassOfRealReg rr
107
108