X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FnativeGen%2FRegArchX86.hs;h=c6c3050a647986c504d9948aa0e296db7d638a9c;hb=8c4b04006dcf5aedfb11fcbc7fcfb05c2b387f92;hp=53f9929906f88afa8bebadfa1316f32b34367101;hpb=0f7d268d00795a58a06ae3c92ebbd14571295b84;p=ghc-hetmet.git diff --git a/compiler/nativeGen/RegArchX86.hs b/compiler/nativeGen/RegArchX86.hs index 53f9929..c6c3050 100644 --- a/compiler/nativeGen/RegArchX86.hs +++ b/compiler/nativeGen/RegArchX86.hs @@ -5,6 +5,7 @@ -- See RegArchBase.hs for the reference. -- See MachRegs.hs for the actual trivColorable function used in GHC. -- + module RegArchX86 ( classOfReg, regsOfClass, @@ -16,38 +17,37 @@ module RegArchX86 ( import RegArchBase (Reg(..), RegSub(..), RegClass(..)) -import qualified Data.Set as Set -import Data.Set (Set) +import UniqSet -- | Determine the class of a register classOfReg :: Reg -> RegClass classOfReg reg = case reg of - Reg c i -> c + Reg c _ -> c - RegSub SubL16 r -> ClassG16 - RegSub SubL8 r -> ClassG8 - RegSub SubL8H r -> ClassG8 + RegSub SubL16 _ -> ClassG16 + RegSub SubL8 _ -> ClassG8 + RegSub SubL8H _ -> ClassG8 -- | Determine all the regs that make up a certain class. -- -regsOfClass :: RegClass -> Set Reg +regsOfClass :: RegClass -> UniqSet Reg regsOfClass c = case c of ClassG32 - -> Set.fromList [ Reg ClassG32 i | i <- [0..7] ] + -> mkUniqSet [ Reg ClassG32 i | i <- [0..7] ] ClassG16 - -> Set.fromList [ RegSub SubL16 (Reg ClassG32 i) | i <- [0..7] ] + -> mkUniqSet [ RegSub SubL16 (Reg ClassG32 i) | i <- [0..7] ] ClassG8 - -> Set.union - (Set.fromList [ RegSub SubL8 (Reg ClassG32 i) | i <- [0..3] ]) - (Set.fromList [ RegSub SubL8H (Reg ClassG32 i) | i <- [0..3] ]) + -> unionUniqSets + (mkUniqSet [ RegSub SubL8 (Reg ClassG32 i) | i <- [0..3] ]) + (mkUniqSet [ RegSub SubL8H (Reg ClassG32 i) | i <- [0..3] ]) ClassF64 - -> Set.fromList [ Reg ClassF64 i | i <- [0..5] ] + -> mkUniqSet [ Reg ClassF64 i | i <- [0..5] ] -- | Determine the common name of a reg @@ -72,7 +72,7 @@ regName reg -- | Which regs alias what other regs -regAlias :: Reg -> Set Reg +regAlias :: Reg -> UniqSet Reg regAlias reg = case reg of @@ -81,27 +81,27 @@ regAlias reg -- for eax, ebx, ecx, eds | i <= 3 - -> Set.fromList $ [ Reg ClassG32 i, RegSub SubL16 reg, RegSub SubL8 reg, RegSub SubL8H reg ] + -> mkUniqSet $ [ Reg ClassG32 i, RegSub SubL16 reg, RegSub SubL8 reg, RegSub SubL8H reg ] -- for esi, edi, esp, ebp | 4 <= i && i <= 7 - -> Set.fromList $ [ Reg ClassG32 i, RegSub SubL16 reg ] + -> mkUniqSet $ [ Reg ClassG32 i, RegSub SubL16 reg ] -- 16 bit subregs alias the whole reg - RegSub SubL16 r@(Reg ClassG32 i) + RegSub SubL16 r@(Reg ClassG32 _) -> regAlias r -- 8 bit subregs alias the 32 and 16, but not the other 8 bit subreg - RegSub SubL8 r@(Reg ClassG32 i) - -> Set.fromList $ [ r, RegSub SubL16 r, RegSub SubL8 r ] + RegSub SubL8 r@(Reg ClassG32 _) + -> mkUniqSet $ [ r, RegSub SubL16 r, RegSub SubL8 r ] - RegSub SubL8H r@(Reg ClassG32 i) - -> Set.fromList $ [ r, RegSub SubL16 r, RegSub SubL8H r ] + RegSub SubL8H r@(Reg ClassG32 _) + -> mkUniqSet $ [ r, RegSub SubL16 r, RegSub SubL8H r ] -- fp - Reg ClassF64 i - -> Set.singleton reg + Reg ClassF64 _ + -> unitUniqSet reg _ -> error "regAlias: invalid register"