/compiler/nativeGen/Reg.hs

https://github.com/pepeiborra/ghc · Haskell · 220 lines · 138 code · 40 blank · 42 comment · 16 complexity · 4a692eebdac607be8e55e8662dec4aa7 MD5 · raw file

  1. -- | An architecture independent description of a register.
  2. -- This needs to stay architecture independent because it is used
  3. -- by NCGMonad and the register allocators, which are shared
  4. -- by all architectures.
  5. --
  6. module Reg (
  7. RegNo,
  8. Reg(..),
  9. regPair,
  10. regSingle,
  11. isRealReg, takeRealReg,
  12. isVirtualReg, takeVirtualReg,
  13. VirtualReg(..),
  14. renameVirtualReg,
  15. classOfVirtualReg,
  16. getHiVirtualRegFromLo,
  17. getHiVRegFromLo,
  18. RealReg(..),
  19. regNosOfRealReg,
  20. realRegsAlias,
  21. liftPatchFnToRegReg
  22. )
  23. where
  24. import Outputable
  25. import Unique
  26. import RegClass
  27. import Data.List
  28. -- | An identifier for a primitive real machine register.
  29. type RegNo
  30. = Int
  31. -- VirtualRegs are virtual registers. The register allocator will
  32. -- eventually have to map them into RealRegs, or into spill slots.
  33. --
  34. -- VirtualRegs are allocated on the fly, usually to represent a single
  35. -- value in the abstract assembly code (i.e. dynamic registers are
  36. -- usually single assignment).
  37. --
  38. -- The single assignment restriction isn't necessary to get correct code,
  39. -- although a better register allocation will result if single
  40. -- assignment is used -- because the allocator maps a VirtualReg into
  41. -- a single RealReg, even if the VirtualReg has multiple live ranges.
  42. --
  43. -- Virtual regs can be of either class, so that info is attached.
  44. --
  45. data VirtualReg
  46. = VirtualRegI {-# UNPACK #-} !Unique
  47. | VirtualRegHi {-# UNPACK #-} !Unique -- High part of 2-word register
  48. | VirtualRegF {-# UNPACK #-} !Unique
  49. | VirtualRegD {-# UNPACK #-} !Unique
  50. | VirtualRegSSE {-# UNPACK #-} !Unique
  51. deriving (Eq, Show, Ord)
  52. instance Uniquable VirtualReg where
  53. getUnique reg
  54. = case reg of
  55. VirtualRegI u -> u
  56. VirtualRegHi u -> u
  57. VirtualRegF u -> u
  58. VirtualRegD u -> u
  59. VirtualRegSSE u -> u
  60. instance Outputable VirtualReg where
  61. ppr reg
  62. = case reg of
  63. VirtualRegI u -> text "%vI_" <> pprUnique u
  64. VirtualRegHi u -> text "%vHi_" <> pprUnique u
  65. VirtualRegF u -> text "%vF_" <> pprUnique u
  66. VirtualRegD u -> text "%vD_" <> pprUnique u
  67. VirtualRegSSE u -> text "%vSSE_" <> pprUnique u
  68. renameVirtualReg :: Unique -> VirtualReg -> VirtualReg
  69. renameVirtualReg u r
  70. = case r of
  71. VirtualRegI _ -> VirtualRegI u
  72. VirtualRegHi _ -> VirtualRegHi u
  73. VirtualRegF _ -> VirtualRegF u
  74. VirtualRegD _ -> VirtualRegD u
  75. VirtualRegSSE _ -> VirtualRegSSE u
  76. classOfVirtualReg :: VirtualReg -> RegClass
  77. classOfVirtualReg vr
  78. = case vr of
  79. VirtualRegI{} -> RcInteger
  80. VirtualRegHi{} -> RcInteger
  81. VirtualRegF{} -> RcFloat
  82. VirtualRegD{} -> RcDouble
  83. VirtualRegSSE{} -> RcDoubleSSE
  84. -- Determine the upper-half vreg for a 64-bit quantity on a 32-bit platform
  85. -- when supplied with the vreg for the lower-half of the quantity.
  86. -- (NB. Not reversible).
  87. getHiVirtualRegFromLo :: VirtualReg -> VirtualReg
  88. getHiVirtualRegFromLo reg
  89. = case reg of
  90. -- makes a pseudo-unique with tag 'H'
  91. VirtualRegI u -> VirtualRegHi (newTagUnique u 'H')
  92. _ -> panic "Reg.getHiVirtualRegFromLo"
  93. getHiVRegFromLo :: Reg -> Reg
  94. getHiVRegFromLo reg
  95. = case reg of
  96. RegVirtual vr -> RegVirtual (getHiVirtualRegFromLo vr)
  97. RegReal _ -> panic "Reg.getHiVRegFromLo"
  98. ------------------------------------------------------------------------------------
  99. -- | RealRegs are machine regs which are available for allocation, in
  100. -- the usual way. We know what class they are, because that's part of
  101. -- the processor's architecture.
  102. --
  103. -- RealRegPairs are pairs of real registers that are allocated together
  104. -- to hold a larger value, such as with Double regs on SPARC.
  105. --
  106. data RealReg
  107. = RealRegSingle {-# UNPACK #-} !RegNo
  108. | RealRegPair {-# UNPACK #-} !RegNo {-# UNPACK #-} !RegNo
  109. deriving (Eq, Show, Ord)
  110. instance Uniquable RealReg where
  111. getUnique reg
  112. = case reg of
  113. RealRegSingle i -> mkRegSingleUnique i
  114. RealRegPair r1 r2 -> mkRegPairUnique (r1 * 65536 + r2)
  115. instance Outputable RealReg where
  116. ppr reg
  117. = case reg of
  118. RealRegSingle i -> text "%r" <> int i
  119. RealRegPair r1 r2 -> text "%r(" <> int r1 <> text "|" <> int r2 <> text ")"
  120. regNosOfRealReg :: RealReg -> [RegNo]
  121. regNosOfRealReg rr
  122. = case rr of
  123. RealRegSingle r1 -> [r1]
  124. RealRegPair r1 r2 -> [r1, r2]
  125. realRegsAlias :: RealReg -> RealReg -> Bool
  126. realRegsAlias rr1 rr2
  127. = not $ null $ intersect (regNosOfRealReg rr1) (regNosOfRealReg rr2)
  128. --------------------------------------------------------------------------------
  129. -- | A register, either virtual or real
  130. data Reg
  131. = RegVirtual !VirtualReg
  132. | RegReal !RealReg
  133. deriving (Eq, Ord)
  134. regSingle :: RegNo -> Reg
  135. regSingle regNo = RegReal $ RealRegSingle regNo
  136. regPair :: RegNo -> RegNo -> Reg
  137. regPair regNo1 regNo2 = RegReal $ RealRegPair regNo1 regNo2
  138. -- We like to have Uniques for Reg so that we can make UniqFM and UniqSets
  139. -- in the register allocator.
  140. instance Uniquable Reg where
  141. getUnique reg
  142. = case reg of
  143. RegVirtual vr -> getUnique vr
  144. RegReal rr -> getUnique rr
  145. -- | Print a reg in a generic manner
  146. -- If you want the architecture specific names, then use the pprReg
  147. -- function from the appropriate Ppr module.
  148. instance Outputable Reg where
  149. ppr reg
  150. = case reg of
  151. RegVirtual vr -> ppr vr
  152. RegReal rr -> ppr rr
  153. isRealReg :: Reg -> Bool
  154. isRealReg reg
  155. = case reg of
  156. RegReal _ -> True
  157. RegVirtual _ -> False
  158. takeRealReg :: Reg -> Maybe RealReg
  159. takeRealReg reg
  160. = case reg of
  161. RegReal rr -> Just rr
  162. _ -> Nothing
  163. isVirtualReg :: Reg -> Bool
  164. isVirtualReg reg
  165. = case reg of
  166. RegReal _ -> False
  167. RegVirtual _ -> True
  168. takeVirtualReg :: Reg -> Maybe VirtualReg
  169. takeVirtualReg reg
  170. = case reg of
  171. RegReal _ -> Nothing
  172. RegVirtual vr -> Just vr
  173. -- | The patch function supplied by the allocator maps VirtualReg to RealReg
  174. -- regs, but sometimes we want to apply it to plain old Reg.
  175. --
  176. liftPatchFnToRegReg :: (VirtualReg -> RealReg) -> (Reg -> Reg)
  177. liftPatchFnToRegReg patchF reg
  178. = case reg of
  179. RegVirtual vr -> RegReal (patchF vr)
  180. RegReal _ -> reg