2 -- | A description of the register set of the X86.
3 -- This isn't used directly in GHC proper.
5 -- See RegArchBase.hs for the reference.
6 -- See MachRegs.hs for the actual trivColorable function used in GHC.
10 -- The above warning supression flag is a temporary kludge.
11 -- While working on this module you are encouraged to remove it and fix
12 -- any warnings in the module. See
13 -- http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
25 import RegArchBase (Reg(..), RegSub(..), RegClass(..))
29 -- | Determine the class of a register
30 classOfReg :: Reg -> RegClass
35 RegSub SubL16 r -> ClassG16
36 RegSub SubL8 r -> ClassG8
37 RegSub SubL8H r -> ClassG8
40 -- | Determine all the regs that make up a certain class.
42 regsOfClass :: RegClass -> UniqSet Reg
46 -> mkUniqSet [ Reg ClassG32 i | i <- [0..7] ]
49 -> mkUniqSet [ RegSub SubL16 (Reg ClassG32 i) | i <- [0..7] ]
53 (mkUniqSet [ RegSub SubL8 (Reg ClassG32 i) | i <- [0..3] ])
54 (mkUniqSet [ RegSub SubL8H (Reg ClassG32 i) | i <- [0..3] ])
57 -> mkUniqSet [ Reg ClassF64 i | i <- [0..5] ]
60 -- | Determine the common name of a reg
61 -- returns Nothing if this reg is not part of the machine.
63 regName :: Reg -> Maybe String
67 | i <= 7 -> Just ([ "eax", "ebx", "ecx", "edx", "ebp", "esi", "edi", "esp" ] !! i)
69 RegSub SubL16 (Reg ClassG32 i)
70 | i <= 7 -> Just ([ "ax", "bx", "cx", "dx", "bp", "si", "di", "sp"] !! i)
72 RegSub SubL8 (Reg ClassG32 i)
73 | i <= 3 -> Just ([ "al", "bl", "cl", "dl"] !! i)
75 RegSub SubL8H (Reg ClassG32 i)
76 | i <= 3 -> Just ([ "ah", "bh", "ch", "dh"] !! i)
81 -- | Which regs alias what other regs
82 regAlias :: Reg -> UniqSet Reg
86 -- 32 bit regs alias all of the subregs
89 -- for eax, ebx, ecx, eds
91 -> mkUniqSet $ [ Reg ClassG32 i, RegSub SubL16 reg, RegSub SubL8 reg, RegSub SubL8H reg ]
93 -- for esi, edi, esp, ebp
95 -> mkUniqSet $ [ Reg ClassG32 i, RegSub SubL16 reg ]
98 -- 16 bit subregs alias the whole reg
99 RegSub SubL16 r@(Reg ClassG32 i)
102 -- 8 bit subregs alias the 32 and 16, but not the other 8 bit subreg
103 RegSub SubL8 r@(Reg ClassG32 i)
104 -> mkUniqSet $ [ r, RegSub SubL16 r, RegSub SubL8 r ]
106 RegSub SubL8H r@(Reg ClassG32 i)
107 -> mkUniqSet $ [ r, RegSub SubL16 r, RegSub SubL8H r ]
113 _ -> error "regAlias: invalid register"
116 -- | Optimised versions of RegColorBase.{worst, squeese} specific to x86
118 worst :: Int -> RegClass -> RegClass -> Int
119 worst n classN classC
137 ClassG32 -> min (n*2) 8
138 ClassG16 -> min (n*2) 8
147 squeese :: RegClass -> [(Int, RegClass)] -> Int
148 squeese classN countCs
149 = sum (map (\(i, classC) -> worst i classN classC) countCs)