/compiler/GHC/Platform/Reg.hs

https://github.com/bgamari/ghc · Haskell · 239 lines · 144 code · 45 blank · 50 comment · 19 complexity · ac4895639630b7dc7c995eac50ae6093 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 GHC.Platform.Reg (
  7. RegNo,
  8. Reg(..),
  9. regSingle,
  10. realRegSingle,
  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 GHC.Prelude
  25. import GHC.Utils.Outputable
  26. import GHC.Utils.Panic
  27. import GHC.Types.Unique
  28. import GHC.Builtin.Uniques
  29. import GHC.Platform.Reg.Class
  30. -- | An identifier for a primitive real machine register.
  31. type RegNo
  32. = Int
  33. -- VirtualRegs are virtual registers. The register allocator will
  34. -- eventually have to map them into RealRegs, or into spill slots.
  35. --
  36. -- VirtualRegs are allocated on the fly, usually to represent a single
  37. -- value in the abstract assembly code (i.e. dynamic registers are
  38. -- usually single assignment).
  39. --
  40. -- The single assignment restriction isn't necessary to get correct code,
  41. -- although a better register allocation will result if single
  42. -- assignment is used -- because the allocator maps a VirtualReg into
  43. -- a single RealReg, even if the VirtualReg has multiple live ranges.
  44. --
  45. -- Virtual regs can be of either class, so that info is attached.
  46. --
  47. data VirtualReg
  48. = VirtualRegI {-# UNPACK #-} !Unique
  49. | VirtualRegHi {-# UNPACK #-} !Unique -- High part of 2-word register
  50. | VirtualRegF {-# UNPACK #-} !Unique
  51. | VirtualRegD {-# UNPACK #-} !Unique
  52. deriving (Eq, Show)
  53. -- This is laborious, but necessary. We can't derive Ord because
  54. -- Unique doesn't have an Ord instance. Note nonDetCmpUnique in the
  55. -- implementation. See Note [No Ord for Unique]
  56. -- This is non-deterministic but we do not currently support deterministic
  57. -- code-generation. See Note [Unique Determinism and code generation]
  58. instance Ord VirtualReg where
  59. compare (VirtualRegI a) (VirtualRegI b) = nonDetCmpUnique a b
  60. compare (VirtualRegHi a) (VirtualRegHi b) = nonDetCmpUnique a b
  61. compare (VirtualRegF a) (VirtualRegF b) = nonDetCmpUnique a b
  62. compare (VirtualRegD a) (VirtualRegD b) = nonDetCmpUnique a b
  63. compare VirtualRegI{} _ = LT
  64. compare _ VirtualRegI{} = GT
  65. compare VirtualRegHi{} _ = LT
  66. compare _ VirtualRegHi{} = GT
  67. compare VirtualRegF{} _ = LT
  68. compare _ VirtualRegF{} = GT
  69. instance Uniquable VirtualReg where
  70. getUnique reg
  71. = case reg of
  72. VirtualRegI u -> u
  73. VirtualRegHi u -> u
  74. VirtualRegF u -> u
  75. VirtualRegD u -> u
  76. instance Outputable VirtualReg where
  77. ppr reg
  78. = case reg of
  79. VirtualRegI u -> text "%vI_" <> pprUniqueAlways u
  80. VirtualRegHi u -> text "%vHi_" <> pprUniqueAlways u
  81. -- this code is kinda wrong on x86
  82. -- because float and double occupy the same register set
  83. -- namely SSE2 register xmm0 .. xmm15
  84. VirtualRegF u -> text "%vFloat_" <> pprUniqueAlways u
  85. VirtualRegD u -> text "%vDouble_" <> pprUniqueAlways u
  86. renameVirtualReg :: Unique -> VirtualReg -> VirtualReg
  87. renameVirtualReg u r
  88. = case r of
  89. VirtualRegI _ -> VirtualRegI u
  90. VirtualRegHi _ -> VirtualRegHi u
  91. VirtualRegF _ -> VirtualRegF u
  92. VirtualRegD _ -> VirtualRegD u
  93. classOfVirtualReg :: VirtualReg -> RegClass
  94. classOfVirtualReg vr
  95. = case vr of
  96. VirtualRegI{} -> RcInteger
  97. VirtualRegHi{} -> RcInteger
  98. VirtualRegF{} -> RcFloat
  99. VirtualRegD{} -> RcDouble
  100. -- Determine the upper-half vreg for a 64-bit quantity on a 32-bit platform
  101. -- when supplied with the vreg for the lower-half of the quantity.
  102. -- (NB. Not reversible).
  103. getHiVirtualRegFromLo :: VirtualReg -> VirtualReg
  104. getHiVirtualRegFromLo reg
  105. = case reg of
  106. -- makes a pseudo-unique with tag 'H'
  107. VirtualRegI u -> VirtualRegHi (newTagUnique u 'H')
  108. _ -> panic "Reg.getHiVirtualRegFromLo"
  109. getHiVRegFromLo :: Reg -> Reg
  110. getHiVRegFromLo reg
  111. = case reg of
  112. RegVirtual vr -> RegVirtual (getHiVirtualRegFromLo vr)
  113. RegReal _ -> panic "Reg.getHiVRegFromLo"
  114. ------------------------------------------------------------------------------------
  115. -- | RealRegs are machine regs which are available for allocation, in
  116. -- the usual way. We know what class they are, because that's part of
  117. -- the processor's architecture.
  118. --
  119. newtype RealReg
  120. = RealRegSingle RegNo
  121. deriving (Eq, Show, Ord)
  122. instance Uniquable RealReg where
  123. getUnique reg
  124. = case reg of
  125. RealRegSingle i -> mkRegSingleUnique i
  126. instance Outputable RealReg where
  127. ppr reg
  128. = case reg of
  129. RealRegSingle i -> text "%r" <> int i
  130. regNosOfRealReg :: RealReg -> [RegNo]
  131. regNosOfRealReg rr
  132. = case rr of
  133. RealRegSingle r1 -> [r1]
  134. realRegsAlias :: RealReg -> RealReg -> Bool
  135. realRegsAlias rr1 rr2 =
  136. -- used to be `not $ null $ intersect (regNosOfRealReg rr1) (regNosOfRealReg rr2)`
  137. -- but that resulted in some gnarly, gnarly, allocating code. So we manually
  138. -- write out all the cases which gives us nice non-allocating code.
  139. case rr1 of
  140. RealRegSingle r1 ->
  141. case rr2 of RealRegSingle r2 -> r1 == r2
  142. --------------------------------------------------------------------------------
  143. -- | A register, either virtual or real
  144. data Reg
  145. = RegVirtual !VirtualReg
  146. | RegReal !RealReg
  147. deriving (Eq, Ord, Show)
  148. regSingle :: RegNo -> Reg
  149. regSingle regNo = RegReal (realRegSingle regNo)
  150. realRegSingle :: RegNo -> RealReg
  151. realRegSingle regNo = RealRegSingle regNo
  152. -- We like to have Uniques for Reg so that we can make UniqFM and UniqSets
  153. -- in the register allocator.
  154. instance Uniquable Reg where
  155. getUnique reg
  156. = case reg of
  157. RegVirtual vr -> getUnique vr
  158. RegReal rr -> getUnique rr
  159. -- | Print a reg in a generic manner
  160. -- If you want the architecture specific names, then use the pprReg
  161. -- function from the appropriate Ppr module.
  162. instance Outputable Reg where
  163. ppr reg
  164. = case reg of
  165. RegVirtual vr -> ppr vr
  166. RegReal rr -> ppr rr
  167. isRealReg :: Reg -> Bool
  168. isRealReg reg
  169. = case reg of
  170. RegReal _ -> True
  171. RegVirtual _ -> False
  172. takeRealReg :: Reg -> Maybe RealReg
  173. takeRealReg reg
  174. = case reg of
  175. RegReal rr -> Just rr
  176. _ -> Nothing
  177. isVirtualReg :: Reg -> Bool
  178. isVirtualReg reg
  179. = case reg of
  180. RegReal _ -> False
  181. RegVirtual _ -> True
  182. takeVirtualReg :: Reg -> Maybe VirtualReg
  183. takeVirtualReg reg
  184. = case reg of
  185. RegReal _ -> Nothing
  186. RegVirtual vr -> Just vr
  187. -- | The patch function supplied by the allocator maps VirtualReg to RealReg
  188. -- regs, but sometimes we want to apply it to plain old Reg.
  189. --
  190. liftPatchFnToRegReg :: (VirtualReg -> RealReg) -> (Reg -> Reg)
  191. liftPatchFnToRegReg patchF reg
  192. = case reg of
  193. RegVirtual vr -> RegReal (patchF vr)
  194. RegReal _ -> reg