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 CmmType (wordWidth)
36 import qualified X86.Regs as X86
37 import qualified X86.RegInfo as X86
39 import qualified PPC.Regs as PPC
41 import qualified SPARC.Regs as SPARC
43 -- TODO: We shouldn't be using defaultTargetPlatform here.
44 -- We should be passing DynFlags in instead, and looking at
45 -- its targetPlatform.
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"
57 targetRealRegSqueeze :: RegClass -> RealReg -> FastInt
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"
67 targetClassOfRealReg :: RealReg -> RegClass
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"
77 -- TODO: This should look at targetPlatform too
78 targetWordSize :: Size
79 targetWordSize = intSize wordWidth
81 targetMkVirtualReg :: Unique -> Size -> VirtualReg
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"
91 targetRegDotColor :: RealReg -> SDoc
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"
102 targetClassOfReg :: Reg -> RegClass
105 RegVirtual vr -> classOfVirtualReg vr
106 RegReal rr -> targetClassOfRealReg rr