PageRenderTime 50ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/compiler/nativeGen/Alpha/Regs.hs

https://github.com/albertz/ghc
Haskell | 323 lines | 3 code | 4 blank | 316 comment | 0 complexity | 731f8f7522f4e4749f764b322fa66958 MD5 | raw file
  1. -- -----------------------------------------------------------------------------
  2. --
  3. -- (c) The University of Glasgow 1994-2004
  4. --
  5. -- Alpha support is rotted and incomplete.
  6. -- -----------------------------------------------------------------------------
  7. module Alpha.Regs (
  8. {-
  9. Size(..),
  10. AddrMode(..),
  11. fits8Bits,
  12. fReg,
  13. gp, pv, ra, sp, t9, t10, t11, t12, v0, f0, zeroh
  14. -}
  15. )
  16. where
  17. {-
  18. #include "nativeGen/NCG.h"
  19. #include "HsVersions.h"
  20. #include "../includes/stg/MachRegs.h"
  21. import RegsBase
  22. import BlockId
  23. import Cmm
  24. import CLabel ( CLabel, mkMainCapabilityLabel )
  25. import Pretty
  26. import Outputable ( Outputable(..), pprPanic, panic )
  27. import qualified Outputable
  28. import Unique
  29. import UniqSet
  30. import Constants
  31. import FastTypes
  32. import FastBool
  33. import UniqFM
  34. data Size
  35. = B -- byte
  36. | Bu
  37. -- | W -- word (2 bytes): UNUSED
  38. -- | Wu -- : UNUSED
  39. | L -- longword (4 bytes)
  40. | Q -- quadword (8 bytes)
  41. -- | FF -- VAX F-style floating pt: UNUSED
  42. -- | GF -- VAX G-style floating pt: UNUSED
  43. -- | DF -- VAX D-style floating pt: UNUSED
  44. -- | SF -- IEEE single-precision floating pt: UNUSED
  45. | TF -- IEEE double-precision floating pt
  46. deriving Eq
  47. data AddrMode
  48. = AddrImm Imm
  49. | AddrReg Reg
  50. | AddrRegImm Reg Imm
  51. addrOffset :: AddrMode -> Int -> Maybe AddrMode
  52. addrOffset addr off
  53. = case addr of
  54. _ -> panic "MachMisc.addrOffset not defined for Alpha"
  55. fits8Bits :: Integer -> Bool
  56. fits8Bits i = i >= -256 && i < 256
  57. -- The Alpha has 64 registers of interest; 32 integer registers and 32 floating
  58. -- point registers. The mapping of STG registers to alpha machine registers
  59. -- is defined in StgRegs.h. We are, of course, prepared for any eventuality.
  60. fReg :: Int -> RegNo
  61. fReg x = (32 + x)
  62. v0, f0, ra, pv, gp, sp, zeroh :: Reg
  63. v0 = realReg 0
  64. f0 = realReg (fReg 0)
  65. ra = FixedReg ILIT(26)
  66. pv = t12
  67. gp = FixedReg ILIT(29)
  68. sp = FixedReg ILIT(30)
  69. zeroh = FixedReg ILIT(31) -- "zero" is used in 1.3 (MonadZero method)
  70. t9, t10, t11, t12 :: Reg
  71. t9 = realReg 23
  72. t10 = realReg 24
  73. t11 = realReg 25
  74. t12 = realReg 27
  75. #define f0 32
  76. #define f1 33
  77. #define f2 34
  78. #define f3 35
  79. #define f4 36
  80. #define f5 37
  81. #define f6 38
  82. #define f7 39
  83. #define f8 40
  84. #define f9 41
  85. #define f10 42
  86. #define f11 43
  87. #define f12 44
  88. #define f13 45
  89. #define f14 46
  90. #define f15 47
  91. #define f16 48
  92. #define f17 49
  93. #define f18 50
  94. #define f19 51
  95. #define f20 52
  96. #define f21 53
  97. #define f22 54
  98. #define f23 55
  99. #define f24 56
  100. #define f25 57
  101. #define f26 58
  102. #define f27 59
  103. #define f28 60
  104. #define f29 61
  105. #define f30 62
  106. #define f31 63
  107. -- allMachRegs is the complete set of machine regs.
  108. allMachRegNos :: [RegNo]
  109. allMachRegNos = [0..63]
  110. -- these are the regs which we cannot assume stay alive over a
  111. -- C call.
  112. callClobberedRegs :: [Reg]
  113. callClobberedRegs
  114. = [0, 1, 2, 3, 4, 5, 6, 7, 8,
  115. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  116. fReg 0, fReg 1, fReg 10, fReg 11, fReg 12, fReg 13, fReg 14, fReg 15,
  117. fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21, fReg 22, fReg 23,
  118. fReg 24, fReg 25, fReg 26, fReg 27, fReg 28, fReg 29, fReg 30]
  119. -- argRegs is the set of regs which are read for an n-argument call to C.
  120. -- For archs which pass all args on the stack (x86), is empty.
  121. -- Sparc passes up to the first 6 args in regs.
  122. -- Dunno about Alpha.
  123. argRegs :: RegNo -> [Reg]
  124. argRegs 0 = []
  125. argRegs 1 = freeMappedRegs [16, fReg 16]
  126. argRegs 2 = freeMappedRegs [16, 17, fReg 16, fReg 17]
  127. argRegs 3 = freeMappedRegs [16, 17, 18, fReg 16, fReg 17, fReg 18]
  128. argRegs 4 = freeMappedRegs [16, 17, 18, 19, fReg 16, fReg 17, fReg 18, fReg 19]
  129. argRegs 5 = freeMappedRegs [16, 17, 18, 19, 20, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20]
  130. argRegs 6 = freeMappedRegs [16, 17, 18, 19, 20, 21, fReg 16, fReg 17, fReg 18, fReg 19, fReg 20, fReg 21]
  131. argRegs _ = panic "MachRegs.argRegs(alpha): don't know about >6 arguments!"
  132. -- all of the arg regs ??
  133. allArgRegs :: [(Reg, Reg)]
  134. allArgRegs = [(realReg i, realReg (fReg i)) | i <- [16..21]]
  135. -- horror show -----------------------------------------------------------------
  136. freeReg :: RegNo -> FastBool
  137. freeReg 26 = fastBool False -- return address (ra)
  138. freeReg 28 = fastBool False -- reserved for the assembler (at)
  139. freeReg 29 = fastBool False -- global pointer (gp)
  140. freeReg 30 = fastBool False -- stack pointer (sp)
  141. freeReg 31 = fastBool False -- always zero (zeroh)
  142. freeReg 63 = fastBool False -- always zero (f31)
  143. #ifdef REG_Base
  144. freeReg REG_Base = fastBool False
  145. #endif
  146. #ifdef REG_R1
  147. freeReg REG_R1 = fastBool False
  148. #endif
  149. #ifdef REG_R2
  150. freeReg REG_R2 = fastBool False
  151. #endif
  152. #ifdef REG_R3
  153. freeReg REG_R3 = fastBool False
  154. #endif
  155. #ifdef REG_R4
  156. freeReg REG_R4 = fastBool False
  157. #endif
  158. #ifdef REG_R5
  159. freeReg REG_R5 = fastBool False
  160. #endif
  161. #ifdef REG_R6
  162. freeReg REG_R6 = fastBool False
  163. #endif
  164. #ifdef REG_R7
  165. freeReg REG_R7 = fastBool False
  166. #endif
  167. #ifdef REG_R8
  168. freeReg REG_R8 = fastBool False
  169. #endif
  170. #ifdef REG_F1
  171. freeReg REG_F1 = fastBool False
  172. #endif
  173. #ifdef REG_F2
  174. freeReg REG_F2 = fastBool False
  175. #endif
  176. #ifdef REG_F3
  177. freeReg REG_F3 = fastBool False
  178. #endif
  179. #ifdef REG_F4
  180. freeReg REG_F4 = fastBool False
  181. #endif
  182. #ifdef REG_D1
  183. freeReg REG_D1 = fastBool False
  184. #endif
  185. #ifdef REG_D2
  186. freeReg REG_D2 = fastBool False
  187. #endif
  188. #ifdef REG_Sp
  189. freeReg REG_Sp = fastBool False
  190. #endif
  191. #ifdef REG_Su
  192. freeReg REG_Su = fastBool False
  193. #endif
  194. #ifdef REG_SpLim
  195. freeReg REG_SpLim = fastBool False
  196. #endif
  197. #ifdef REG_Hp
  198. freeReg REG_Hp = fastBool False
  199. #endif
  200. #ifdef REG_HpLim
  201. freeReg REG_HpLim = fastBool False
  202. #endif
  203. freeReg n = fastBool True
  204. -- | Returns 'Nothing' if this global register is not stored
  205. -- in a real machine register, otherwise returns @'Just' reg@, where
  206. -- reg is the machine register it is stored in.
  207. globalRegMaybe :: GlobalReg -> Maybe Reg
  208. #ifdef REG_Base
  209. globalRegMaybe BaseReg = Just (RealReg REG_Base)
  210. #endif
  211. #ifdef REG_R1
  212. globalRegMaybe (VanillaReg 1 _) = Just (RealReg REG_R1)
  213. #endif
  214. #ifdef REG_R2
  215. globalRegMaybe (VanillaReg 2 _) = Just (RealReg REG_R2)
  216. #endif
  217. #ifdef REG_R3
  218. globalRegMaybe (VanillaReg 3 _) = Just (RealReg REG_R3)
  219. #endif
  220. #ifdef REG_R4
  221. globalRegMaybe (VanillaReg 4 _) = Just (RealReg REG_R4)
  222. #endif
  223. #ifdef REG_R5
  224. globalRegMaybe (VanillaReg 5 _) = Just (RealReg REG_R5)
  225. #endif
  226. #ifdef REG_R6
  227. globalRegMaybe (VanillaReg 6 _) = Just (RealReg REG_R6)
  228. #endif
  229. #ifdef REG_R7
  230. globalRegMaybe (VanillaReg 7 _) = Just (RealReg REG_R7)
  231. #endif
  232. #ifdef REG_R8
  233. globalRegMaybe (VanillaReg 8 _) = Just (RealReg REG_R8)
  234. #endif
  235. #ifdef REG_R9
  236. globalRegMaybe (VanillaReg 9 _) = Just (RealReg REG_R9)
  237. #endif
  238. #ifdef REG_R10
  239. globalRegMaybe (VanillaReg 10 _) = Just (RealReg REG_R10)
  240. #endif
  241. #ifdef REG_F1
  242. globalRegMaybe (FloatReg 1) = Just (RealReg REG_F1)
  243. #endif
  244. #ifdef REG_F2
  245. globalRegMaybe (FloatReg 2) = Just (RealReg REG_F2)
  246. #endif
  247. #ifdef REG_F3
  248. globalRegMaybe (FloatReg 3) = Just (RealReg REG_F3)
  249. #endif
  250. #ifdef REG_F4
  251. globalRegMaybe (FloatReg 4) = Just (RealReg REG_F4)
  252. #endif
  253. #ifdef REG_D1
  254. globalRegMaybe (DoubleReg 1) = Just (RealReg REG_D1)
  255. #endif
  256. #ifdef REG_D2
  257. globalRegMaybe (DoubleReg 2) = Just (RealReg REG_D2)
  258. #endif
  259. #ifdef REG_Sp
  260. globalRegMaybe Sp = Just (RealReg REG_Sp)
  261. #endif
  262. #ifdef REG_Lng1
  263. globalRegMaybe (LongReg 1) = Just (RealReg REG_Lng1)
  264. #endif
  265. #ifdef REG_Lng2
  266. globalRegMaybe (LongReg 2) = Just (RealReg REG_Lng2)
  267. #endif
  268. #ifdef REG_SpLim
  269. globalRegMaybe SpLim = Just (RealReg REG_SpLim)
  270. #endif
  271. #ifdef REG_Hp
  272. globalRegMaybe Hp = Just (RealReg REG_Hp)
  273. #endif
  274. #ifdef REG_HpLim
  275. globalRegMaybe HpLim = Just (RealReg REG_HpLim)
  276. #endif
  277. #ifdef REG_CurrentTSO
  278. globalRegMaybe CurrentTSO = Just (RealReg REG_CurrentTSO)
  279. #endif
  280. #ifdef REG_CurrentNursery
  281. globalRegMaybe CurrentNursery = Just (RealReg REG_CurrentNursery)
  282. #endif
  283. globalRegMaybe _ = Nothing
  284. -}