PPCScheduleE5500.td 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. //===-- PPCScheduleE500mc.td - e5500 Scheduling Defs -------*- tablegen -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines the itinerary class data for the Freescale e5500 64-bit
  10. // Power processor.
  11. //
  12. // All information is derived from the "e5500 Core Reference Manual",
  13. // Freescale Document Number e5500RM, Rev. 1, 03/2012.
  14. //
  15. //===----------------------------------------------------------------------===//
  16. // Relevant functional units in the Freescale e5500 core
  17. // (These are the same as for the e500mc)
  18. //
  19. // * Decode & Dispatch
  20. // Can dispatch up to 2 instructions per clock cycle to either the GPR Issue
  21. // queues (GIQx), FP Issue Queue (FIQ), or Branch issue queue (BIQ).
  22. def E5500_DIS0 : FuncUnit;
  23. def E5500_DIS1 : FuncUnit;
  24. // * Execute
  25. // 6 pipelined execution units: SFX0, SFX1, BU, FPU, LSU, CFX.
  26. // The CFX has a bypass path, allowing non-divide instructions to execute
  27. // while a divide instruction is being executed.
  28. def E5500_SFX0 : FuncUnit; // Simple unit 0
  29. def E5500_SFX1 : FuncUnit; // Simple unit 1
  30. def E5500_BU : FuncUnit; // Branch unit
  31. def E5500_CFX_DivBypass
  32. : FuncUnit; // CFX divide bypass path
  33. def E5500_CFX_0 : FuncUnit; // CFX pipeline stage 0
  34. def E5500_CFX_1 : FuncUnit; // CFX pipeline stage 1
  35. def E5500_LSU_0 : FuncUnit; // LSU pipeline
  36. def E5500_FPU_0 : FuncUnit; // FPU pipeline
  37. def E5500_GPR_Bypass : Bypass;
  38. def E5500_FPR_Bypass : Bypass;
  39. def E5500_CR_Bypass : Bypass;
  40. def PPCE5500Itineraries : ProcessorItineraries<
  41. [E5500_DIS0, E5500_DIS1, E5500_SFX0, E5500_SFX1, E5500_BU,
  42. E5500_CFX_DivBypass, E5500_CFX_0, E5500_CFX_1,
  43. E5500_LSU_0, E5500_FPU_0],
  44. [E5500_CR_Bypass, E5500_GPR_Bypass, E5500_FPR_Bypass], [
  45. InstrItinData<IIC_IntSimple, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  46. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  47. [5, 2, 2], // Latency = 1
  48. [E5500_GPR_Bypass,
  49. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  50. InstrItinData<IIC_IntGeneral, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  51. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  52. [5, 2, 2], // Latency = 1
  53. [E5500_GPR_Bypass,
  54. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  55. InstrItinData<IIC_IntISEL, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  56. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  57. [5, 2, 2, 2], // Latency = 1
  58. [E5500_GPR_Bypass,
  59. E5500_GPR_Bypass, E5500_GPR_Bypass,
  60. E5500_CR_Bypass]>,
  61. InstrItinData<IIC_IntCompare, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  62. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  63. [6, 2, 2], // Latency = 1 or 2
  64. [E5500_CR_Bypass,
  65. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  66. InstrItinData<IIC_IntDivD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  67. InstrStage<1, [E5500_CFX_0], 0>,
  68. InstrStage<26, [E5500_CFX_DivBypass]>],
  69. [30, 2, 2], // Latency= 4..26, Repeat rate= 4..26
  70. [E5500_GPR_Bypass,
  71. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  72. InstrItinData<IIC_IntDivW, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  73. InstrStage<1, [E5500_CFX_0], 0>,
  74. InstrStage<16, [E5500_CFX_DivBypass]>],
  75. [20, 2, 2], // Latency= 4..16, Repeat rate= 4..16
  76. [E5500_GPR_Bypass,
  77. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  78. InstrItinData<IIC_IntMFFS, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  79. InstrStage<1, [E5500_FPU_0]>],
  80. [11], // Latency = 7, Repeat rate = 1
  81. [E5500_FPR_Bypass]>,
  82. InstrItinData<IIC_IntMTFSB0, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  83. InstrStage<7, [E5500_FPU_0]>],
  84. [11, 2, 2], // Latency = 7, Repeat rate = 7
  85. [NoBypass, NoBypass, NoBypass]>,
  86. InstrItinData<IIC_IntMulHD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  87. InstrStage<1, [E5500_CFX_0], 0>,
  88. InstrStage<2, [E5500_CFX_1]>],
  89. [9, 2, 2], // Latency = 4..7, Repeat rate = 2..4
  90. [E5500_GPR_Bypass,
  91. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  92. InstrItinData<IIC_IntMulHW, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  93. InstrStage<1, [E5500_CFX_0], 0>,
  94. InstrStage<1, [E5500_CFX_1]>],
  95. [8, 2, 2], // Latency = 4, Repeat rate = 1
  96. [E5500_GPR_Bypass,
  97. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  98. InstrItinData<IIC_IntMulHWU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  99. InstrStage<1, [E5500_CFX_0], 0>,
  100. InstrStage<1, [E5500_CFX_1]>],
  101. [8, 2, 2], // Latency = 4, Repeat rate = 1
  102. [E5500_GPR_Bypass,
  103. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  104. InstrItinData<IIC_IntMulLI, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  105. InstrStage<1, [E5500_CFX_0], 0>,
  106. InstrStage<2, [E5500_CFX_1]>],
  107. [8, 2, 2], // Latency = 4 or 5, Repeat = 2
  108. [E5500_GPR_Bypass,
  109. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  110. InstrItinData<IIC_IntRotate, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  111. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  112. [5, 2, 2], // Latency = 1
  113. [E5500_GPR_Bypass,
  114. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  115. InstrItinData<IIC_IntRotateD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  116. InstrStage<2, [E5500_SFX0, E5500_SFX1]>],
  117. [6, 2, 2], // Latency = 2, Repeat rate = 2
  118. [E5500_GPR_Bypass,
  119. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  120. InstrItinData<IIC_IntRotateDI, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  121. InstrStage<1, [E5500_SFX0, E5500_SFX1]>],
  122. [5, 2, 2], // Latency = 1, Repeat rate = 1
  123. [E5500_GPR_Bypass,
  124. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  125. InstrItinData<IIC_IntShift, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  126. InstrStage<2, [E5500_SFX0, E5500_SFX1]>],
  127. [6, 2, 2], // Latency = 2, Repeat rate = 2
  128. [E5500_GPR_Bypass,
  129. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  130. InstrItinData<IIC_IntTrapW, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  131. InstrStage<2, [E5500_SFX0]>],
  132. [6, 2], // Latency = 2, Repeat rate = 2
  133. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  134. InstrItinData<IIC_BrB, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  135. InstrStage<1, [E5500_BU]>],
  136. [5, 2], // Latency = 1
  137. [NoBypass, E5500_GPR_Bypass]>,
  138. InstrItinData<IIC_BrCR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  139. InstrStage<1, [E5500_BU]>],
  140. [5, 2, 2], // Latency = 1
  141. [E5500_CR_Bypass,
  142. E5500_CR_Bypass, E5500_CR_Bypass]>,
  143. InstrItinData<IIC_BrMCR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  144. InstrStage<1, [E5500_BU]>],
  145. [5, 2], // Latency = 1
  146. [E5500_CR_Bypass, E5500_CR_Bypass]>,
  147. InstrItinData<IIC_BrMCRX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  148. InstrStage<1, [E5500_CFX_0]>],
  149. [5, 2, 2], // Latency = 1
  150. [E5500_CR_Bypass, E5500_GPR_Bypass]>,
  151. InstrItinData<IIC_LdStDCBA, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  152. InstrStage<1, [E5500_LSU_0]>],
  153. [7, 2], // Latency = 3, Repeat rate = 1
  154. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  155. InstrItinData<IIC_LdStDCBF, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  156. InstrStage<1, [E5500_LSU_0]>],
  157. [7, 2], // Latency = 3, Repeat rate = 1
  158. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  159. InstrItinData<IIC_LdStDCBI, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  160. InstrStage<1, [E5500_LSU_0]>],
  161. [7, 2], // Latency = 3, Repeat rate = 1
  162. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  163. InstrItinData<IIC_LdStLoad, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  164. InstrStage<1, [E5500_LSU_0]>],
  165. [7, 2], // Latency = 3
  166. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  167. InstrItinData<IIC_LdStLoadUpd, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  168. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  169. InstrStage<1, [E5500_LSU_0]>],
  170. [7, 2], // Latency = 3, Repeat rate = 1
  171. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  172. 2>, // 2 micro-ops
  173. InstrItinData<IIC_LdStLoadUpdX,[InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  174. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  175. InstrStage<1, [E5500_LSU_0]>],
  176. [7, 2], // Latency = 3, Repeat rate = 1
  177. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  178. 2>, // 2 micro-ops
  179. InstrItinData<IIC_LdStLD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  180. InstrStage<1, [E5500_LSU_0]>],
  181. [7, 2], // Latency = 3, Repeat rate = 1
  182. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  183. InstrItinData<IIC_LdStLDARX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  184. InstrStage<3, [E5500_LSU_0]>],
  185. [7, 2], // Latency = 3, Repeat rate = 3
  186. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  187. InstrItinData<IIC_LdStLDU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  188. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  189. InstrStage<1, [E5500_LSU_0]>],
  190. [7, 2], // Latency = 3, Repeat rate = 1
  191. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  192. 2>, // 2 micro-ops
  193. InstrItinData<IIC_LdStLDUX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  194. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  195. InstrStage<1, [E5500_LSU_0]>],
  196. [7, 2], // Latency = 3, Repeat rate = 1
  197. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  198. 2>, // 2 micro-ops
  199. InstrItinData<IIC_LdStStore, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  200. InstrStage<1, [E5500_LSU_0]>],
  201. [7, 2], // Latency = 3, Repeat rate = 1
  202. [NoBypass, E5500_GPR_Bypass]>,
  203. InstrItinData<IIC_LdStICBI, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  204. InstrStage<1, [E5500_LSU_0]>],
  205. [7, 2], // Latency = 3, Repeat rate = 1
  206. [NoBypass, E5500_GPR_Bypass]>,
  207. InstrItinData<IIC_LdStSTFD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  208. InstrStage<1, [E5500_LSU_0]>],
  209. [7, 2, 2], // Latency = 3, Repeat rate = 1
  210. [E5500_GPR_Bypass,
  211. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  212. InstrItinData<IIC_LdStSTFDU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  213. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  214. InstrStage<1, [E5500_LSU_0]>],
  215. [7, 2, 2], // Latency = 3, Repeat rate = 1
  216. [E5500_GPR_Bypass,
  217. E5500_GPR_Bypass, E5500_GPR_Bypass],
  218. 2>, // 2 micro-ops
  219. InstrItinData<IIC_LdStLFD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  220. InstrStage<1, [E5500_LSU_0]>],
  221. [8, 2, 2], // Latency = 4, Repeat rate = 1
  222. [E5500_FPR_Bypass,
  223. E5500_GPR_Bypass, E5500_GPR_Bypass],
  224. 2>, // 2 micro-ops
  225. InstrItinData<IIC_LdStLFDU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  226. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  227. InstrStage<1, [E5500_LSU_0]>],
  228. [8, 2, 2], // Latency = 4, Repeat rate = 1
  229. [E5500_FPR_Bypass,
  230. E5500_GPR_Bypass, E5500_GPR_Bypass],
  231. 2>, // 2 micro-ops
  232. InstrItinData<IIC_LdStLFDUX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  233. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  234. InstrStage<1, [E5500_LSU_0]>],
  235. [8, 2, 2], // Latency = 4, Repeat rate = 1
  236. [E5500_FPR_Bypass,
  237. E5500_GPR_Bypass, E5500_GPR_Bypass],
  238. 2>, // 2 micro-ops
  239. InstrItinData<IIC_LdStLHA, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  240. InstrStage<1, [E5500_LSU_0]>],
  241. [7, 2], // Latency = 3
  242. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  243. InstrItinData<IIC_LdStLHAU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  244. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  245. InstrStage<1, [E5500_LSU_0]>],
  246. [7, 2], // Latency = 3, Repeat rate = 1
  247. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  248. 2>, // 2 micro-ops
  249. InstrItinData<IIC_LdStLHAUX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  250. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  251. InstrStage<1, [E5500_LSU_0]>],
  252. [7, 2], // Latency = 3, Repeat rate = 1
  253. [E5500_GPR_Bypass, E5500_GPR_Bypass],
  254. 2>, // 2 micro-ops
  255. InstrItinData<IIC_LdStLMW, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  256. InstrStage<4, [E5500_LSU_0]>],
  257. [8, 2], // Latency = r+3, Repeat rate = r+3
  258. [NoBypass, E5500_GPR_Bypass]>,
  259. InstrItinData<IIC_LdStLWARX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  260. InstrStage<3, [E5500_LSU_0]>],
  261. [7, 2, 2], // Latency = 3, Repeat rate = 3
  262. [E5500_GPR_Bypass,
  263. E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  264. InstrItinData<IIC_LdStSTD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  265. InstrStage<1, [E5500_LSU_0]>],
  266. [7, 2], // Latency = 3, Repeat rate = 1
  267. [NoBypass, E5500_GPR_Bypass]>,
  268. InstrItinData<IIC_LdStSTDCX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  269. InstrStage<1, [E5500_LSU_0]>],
  270. [7, 2], // Latency = 3, Repeat rate = 1
  271. [NoBypass, E5500_GPR_Bypass]>,
  272. InstrItinData<IIC_LdStSTU, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  273. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  274. InstrStage<1, [E5500_LSU_0]>],
  275. [7, 2], // Latency = 3, Repeat rate = 1
  276. [NoBypass, E5500_GPR_Bypass],
  277. 2>, // 2 micro-ops
  278. InstrItinData<IIC_LdStSTUX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  279. InstrStage<1, [E5500_SFX0, E5500_SFX1], 0>,
  280. InstrStage<1, [E5500_LSU_0]>],
  281. [7, 2], // Latency = 3, Repeat rate = 1
  282. [NoBypass, E5500_GPR_Bypass],
  283. 2>, // 2 micro-ops
  284. InstrItinData<IIC_LdStSTWCX, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  285. InstrStage<1, [E5500_LSU_0]>],
  286. [7, 2], // Latency = 3, Repeat rate = 1
  287. [NoBypass, E5500_GPR_Bypass]>,
  288. InstrItinData<IIC_LdStSync, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  289. InstrStage<1, [E5500_LSU_0]>]>,
  290. InstrItinData<IIC_SprMTMSR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  291. InstrStage<2, [E5500_CFX_0]>],
  292. [6, 2], // Latency = 2, Repeat rate = 4
  293. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  294. InstrItinData<IIC_SprTLBSYNC, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  295. InstrStage<1, [E5500_LSU_0], 0>]>,
  296. InstrItinData<IIC_SprMFCR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  297. InstrStage<5, [E5500_CFX_0]>],
  298. [9, 2], // Latency = 5, Repeat rate = 5
  299. [E5500_GPR_Bypass, E5500_CR_Bypass]>,
  300. InstrItinData<IIC_SprMFCRF, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  301. InstrStage<5, [E5500_CFX_0]>],
  302. [9, 2], // Latency = 5, Repeat rate = 5
  303. [E5500_GPR_Bypass, E5500_CR_Bypass]>,
  304. InstrItinData<IIC_SprMFPMR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  305. InstrStage<4, [E5500_CFX_0]>],
  306. [8, 2], // Latency = 4, Repeat rate = 4
  307. [E5500_GPR_Bypass, E5500_GPR_Bypass]>,
  308. InstrItinData<IIC_SprMFSPR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  309. InstrStage<1, [E5500_CFX_0]>],
  310. [5], // Latency = 1, Repeat rate = 1
  311. [E5500_GPR_Bypass]>,
  312. InstrItinData<IIC_SprMTPMR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  313. InstrStage<1, [E5500_CFX_0]>],
  314. [5], // Latency = 1, Repeat rate = 1
  315. [E5500_GPR_Bypass]>,
  316. InstrItinData<IIC_SprMFTB, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  317. InstrStage<4, [E5500_CFX_0]>],
  318. [8, 2], // Latency = 4, Repeat rate = 4
  319. [NoBypass, E5500_GPR_Bypass]>,
  320. InstrItinData<IIC_SprMTSPR, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  321. InstrStage<1, [E5500_CFX_0]>],
  322. [5], // Latency = 1, Repeat rate = 1
  323. [E5500_GPR_Bypass]>,
  324. InstrItinData<IIC_FPGeneral, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  325. InstrStage<1, [E5500_FPU_0]>],
  326. [11, 2, 2], // Latency = 7, Repeat rate = 1
  327. [E5500_FPR_Bypass,
  328. E5500_FPR_Bypass, E5500_FPR_Bypass]>,
  329. InstrItinData<IIC_FPAddSub, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  330. InstrStage<1, [E5500_FPU_0]>],
  331. [11, 2, 2], // Latency = 7, Repeat rate = 1
  332. [E5500_FPR_Bypass,
  333. E5500_FPR_Bypass, E5500_FPR_Bypass]>,
  334. InstrItinData<IIC_FPCompare, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  335. InstrStage<1, [E5500_FPU_0]>],
  336. [11, 2, 2], // Latency = 7, Repeat rate = 1
  337. [E5500_CR_Bypass,
  338. E5500_FPR_Bypass, E5500_FPR_Bypass]>,
  339. InstrItinData<IIC_FPDivD, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  340. InstrStage<31, [E5500_FPU_0]>],
  341. [39, 2, 2], // Latency = 35, Repeat rate = 31
  342. [E5500_FPR_Bypass,
  343. E5500_FPR_Bypass, E5500_FPR_Bypass]>,
  344. InstrItinData<IIC_FPDivS, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  345. InstrStage<16, [E5500_FPU_0]>],
  346. [24, 2, 2], // Latency = 20, Repeat rate = 16
  347. [E5500_FPR_Bypass,
  348. E5500_FPR_Bypass, E5500_FPR_Bypass]>,
  349. InstrItinData<IIC_FPFused, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  350. InstrStage<1, [E5500_FPU_0]>],
  351. [11, 2, 2, 2], // Latency = 7, Repeat rate = 1
  352. [E5500_FPR_Bypass,
  353. E5500_FPR_Bypass, E5500_FPR_Bypass,
  354. E5500_FPR_Bypass]>,
  355. InstrItinData<IIC_FPRes, [InstrStage<1, [E5500_DIS0, E5500_DIS1], 0>,
  356. InstrStage<2, [E5500_FPU_0]>],
  357. [12, 2], // Latency = 8, Repeat rate = 2
  358. [E5500_FPR_Bypass, E5500_FPR_Bypass]>
  359. ]>;
  360. // ===---------------------------------------------------------------------===//
  361. // e5500 machine model for scheduling and other instruction cost heuristics.
  362. def PPCE5500Model : SchedMachineModel {
  363. let IssueWidth = 2; // 2 micro-ops are dispatched per cycle.
  364. let LoadLatency = 6; // Optimistic load latency assuming bypass.
  365. // This is overriden by OperandCycles if the
  366. // Itineraries are queried instead.
  367. let CompleteModel = 0;
  368. let Itineraries = PPCE5500Itineraries;
  369. }