PPCInstrFormats.td 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210
  1. //===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- 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. //
  10. // PowerPC instruction formats
  11. class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
  12. : Instruction {
  13. field bits<32> Inst;
  14. field bits<32> SoftFail = 0;
  15. let Size = 4;
  16. bit PPC64 = 0; // Default value, override with isPPC64
  17. let Namespace = "PPC";
  18. let Inst{0-5} = opcode;
  19. let OutOperandList = OOL;
  20. let InOperandList = IOL;
  21. let AsmString = asmstr;
  22. let Itinerary = itin;
  23. bits<1> PPC970_First = 0;
  24. bits<1> PPC970_Single = 0;
  25. bits<1> PPC970_Cracked = 0;
  26. bits<3> PPC970_Unit = 0;
  27. /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
  28. /// these must be reflected there! See comments there for what these are.
  29. let TSFlags{0} = PPC970_First;
  30. let TSFlags{1} = PPC970_Single;
  31. let TSFlags{2} = PPC970_Cracked;
  32. let TSFlags{5-3} = PPC970_Unit;
  33. // Indicate that this instruction is of type X-Form Load or Store
  34. bits<1> XFormMemOp = 0;
  35. let TSFlags{6} = XFormMemOp;
  36. // Indicate that this instruction is prefixed.
  37. bits<1> Prefixed = 0;
  38. let TSFlags{7} = Prefixed;
  39. // Indicate that this instruction produces a result that is sign extended from
  40. // 32 bits to 64 bits.
  41. bits<1> SExt32To64 = 0;
  42. let TSFlags{8} = SExt32To64;
  43. // Indicate that this instruction produces a result that is zero extended from
  44. // 32 bits to 64 bits.
  45. bits<1> ZExt32To64 = 0;
  46. let TSFlags{9} = ZExt32To64;
  47. // Fields used for relation models.
  48. string BaseName = "";
  49. // For cases where multiple instruction definitions really represent the
  50. // same underlying instruction but with one definition for 64-bit arguments
  51. // and one for 32-bit arguments, this bit breaks the degeneracy between
  52. // the two forms and allows TableGen to generate mapping tables.
  53. bit Interpretation64Bit = 0;
  54. }
  55. class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
  56. class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
  57. class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
  58. class PPC970_MicroCode;
  59. class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
  60. class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
  61. class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
  62. class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
  63. class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
  64. class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
  65. class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
  66. class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
  67. class XFormMemOp { bits<1> XFormMemOp = 1; }
  68. class SExt32To64 { bits<1> SExt32To64 = 1; }
  69. class ZExt32To64 { bits<1> ZExt32To64 = 1; }
  70. // Two joined instructions; used to emit two adjacent instructions as one.
  71. // The itinerary from the first instruction is used for scheduling and
  72. // classification.
  73. class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
  74. InstrItinClass itin>
  75. : Instruction {
  76. field bits<64> Inst;
  77. field bits<64> SoftFail = 0;
  78. let Size = 8;
  79. bit PPC64 = 0; // Default value, override with isPPC64
  80. let Namespace = "PPC";
  81. let Inst{0-5} = opcode1;
  82. let Inst{32-37} = opcode2;
  83. let OutOperandList = OOL;
  84. let InOperandList = IOL;
  85. let AsmString = asmstr;
  86. let Itinerary = itin;
  87. bits<1> PPC970_First = 0;
  88. bits<1> PPC970_Single = 0;
  89. bits<1> PPC970_Cracked = 0;
  90. bits<3> PPC970_Unit = 0;
  91. /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
  92. /// these must be reflected there! See comments there for what these are.
  93. let TSFlags{0} = PPC970_First;
  94. let TSFlags{1} = PPC970_Single;
  95. let TSFlags{2} = PPC970_Cracked;
  96. let TSFlags{5-3} = PPC970_Unit;
  97. // Fields used for relation models.
  98. string BaseName = "";
  99. bit Interpretation64Bit = 0;
  100. }
  101. // Base class for all X-Form memory instructions
  102. class IXFormMemOp<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  103. InstrItinClass itin>
  104. :I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp;
  105. // 1.7.1 I-Form
  106. class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
  107. InstrItinClass itin, list<dag> pattern>
  108. : I<opcode, OOL, IOL, asmstr, itin> {
  109. let Pattern = pattern;
  110. bits<24> LI;
  111. let Inst{6-29} = LI;
  112. let Inst{30} = aa;
  113. let Inst{31} = lk;
  114. }
  115. // 1.7.2 B-Form
  116. class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
  117. : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  118. bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
  119. bits<3> CR;
  120. bits<14> BD;
  121. bits<5> BI;
  122. let BI{0-1} = BIBO{5-6};
  123. let BI{2-4} = CR{0-2};
  124. let Inst{6-10} = BIBO{4-0};
  125. let Inst{11-15} = BI;
  126. let Inst{16-29} = BD;
  127. let Inst{30} = aa;
  128. let Inst{31} = lk;
  129. }
  130. class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
  131. string asmstr>
  132. : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
  133. let BIBO{4-0} = bo;
  134. let BIBO{6-5} = 0;
  135. let CR = 0;
  136. }
  137. class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
  138. dag OOL, dag IOL, string asmstr>
  139. : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  140. bits<14> BD;
  141. let Inst{6-10} = bo;
  142. let Inst{11-15} = bi;
  143. let Inst{16-29} = BD;
  144. let Inst{30} = aa;
  145. let Inst{31} = lk;
  146. }
  147. class BForm_3<bits<6> opcode, bit aa, bit lk,
  148. dag OOL, dag IOL, string asmstr>
  149. : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  150. bits<5> BO;
  151. bits<5> BI;
  152. bits<14> BD;
  153. let Inst{6-10} = BO;
  154. let Inst{11-15} = BI;
  155. let Inst{16-29} = BD;
  156. let Inst{30} = aa;
  157. let Inst{31} = lk;
  158. }
  159. class BForm_3_at<bits<6> opcode, bit aa, bit lk,
  160. dag OOL, dag IOL, string asmstr>
  161. : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  162. bits<5> BO;
  163. bits<2> at;
  164. bits<5> BI;
  165. bits<14> BD;
  166. let Inst{6-8} = BO{4-2};
  167. let Inst{9-10} = at;
  168. let Inst{11-15} = BI;
  169. let Inst{16-29} = BD;
  170. let Inst{30} = aa;
  171. let Inst{31} = lk;
  172. }
  173. class BForm_4<bits<6> opcode, bits<5> bo, bit aa, bit lk,
  174. dag OOL, dag IOL, string asmstr>
  175. : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
  176. bits<5> BI;
  177. bits<14> BD;
  178. let Inst{6-10} = bo;
  179. let Inst{11-15} = BI;
  180. let Inst{16-29} = BD;
  181. let Inst{30} = aa;
  182. let Inst{31} = lk;
  183. }
  184. // 1.7.3 SC-Form
  185. class SCForm<bits<6> opcode, bits<1> xo,
  186. dag OOL, dag IOL, string asmstr, InstrItinClass itin,
  187. list<dag> pattern>
  188. : I<opcode, OOL, IOL, asmstr, itin> {
  189. bits<7> LEV;
  190. let Pattern = pattern;
  191. let Inst{20-26} = LEV;
  192. let Inst{30} = xo;
  193. }
  194. // 1.7.4 D-Form
  195. class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  196. InstrItinClass itin, list<dag> pattern>
  197. : I<opcode, OOL, IOL, asmstr, itin> {
  198. bits<5> A;
  199. bits<5> B;
  200. bits<16> C;
  201. let Pattern = pattern;
  202. let Inst{6-10} = A;
  203. let Inst{11-15} = B;
  204. let Inst{16-31} = C;
  205. }
  206. class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  207. InstrItinClass itin, list<dag> pattern>
  208. : I<opcode, OOL, IOL, asmstr, itin> {
  209. bits<5> A;
  210. bits<21> Addr;
  211. let Pattern = pattern;
  212. let Inst{6-10} = A;
  213. let Inst{11-15} = Addr{20-16}; // Base Reg
  214. let Inst{16-31} = Addr{15-0}; // Displacement
  215. }
  216. class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  217. InstrItinClass itin, list<dag> pattern>
  218. : I<opcode, OOL, IOL, asmstr, itin> {
  219. bits<5> A;
  220. bits<16> C;
  221. bits<5> B;
  222. let Pattern = pattern;
  223. let Inst{6-10} = A;
  224. let Inst{11-15} = B;
  225. let Inst{16-31} = C;
  226. }
  227. class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  228. InstrItinClass itin, list<dag> pattern>
  229. : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
  230. // Even though ADDIC_rec does not really have an RC bit, provide
  231. // the declaration of one here so that isRecordForm has something to set.
  232. bit RC = 0;
  233. }
  234. class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  235. InstrItinClass itin, list<dag> pattern>
  236. : I<opcode, OOL, IOL, asmstr, itin> {
  237. bits<5> A;
  238. bits<16> B;
  239. let Pattern = pattern;
  240. let Inst{6-10} = A;
  241. let Inst{11-15} = 0;
  242. let Inst{16-31} = B;
  243. }
  244. class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  245. InstrItinClass itin, list<dag> pattern>
  246. : I<opcode, OOL, IOL, asmstr, itin> {
  247. bits<5> B;
  248. bits<5> A;
  249. bits<16> C;
  250. let Pattern = pattern;
  251. let Inst{6-10} = A;
  252. let Inst{11-15} = B;
  253. let Inst{16-31} = C;
  254. }
  255. class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  256. InstrItinClass itin, list<dag> pattern>
  257. : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
  258. let A = 0;
  259. let Addr = 0;
  260. }
  261. class DForm_4_fixedreg_zero<bits<6> opcode, bits<5> R, dag OOL, dag IOL,
  262. string asmstr, InstrItinClass itin,
  263. list<dag> pattern>
  264. : DForm_4<opcode, OOL, IOL, asmstr, itin, pattern> {
  265. let A = R;
  266. let B = R;
  267. let C = 0;
  268. }
  269. class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
  270. dag OOL, dag IOL, string asmstr,
  271. InstrItinClass itin, list<dag> pattern>
  272. : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
  273. bits<5> A;
  274. bits<21> Addr;
  275. let Pattern = pattern;
  276. bits<24> LI;
  277. let Inst{6-29} = LI;
  278. let Inst{30} = aa;
  279. let Inst{31} = lk;
  280. let Inst{38-42} = A;
  281. let Inst{43-47} = Addr{20-16}; // Base Reg
  282. let Inst{48-63} = Addr{15-0}; // Displacement
  283. }
  284. // This is used to emit BL8+NOP.
  285. class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
  286. dag OOL, dag IOL, string asmstr,
  287. InstrItinClass itin, list<dag> pattern>
  288. : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
  289. OOL, IOL, asmstr, itin, pattern> {
  290. let A = 0;
  291. let Addr = 0;
  292. }
  293. class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  294. InstrItinClass itin>
  295. : I<opcode, OOL, IOL, asmstr, itin> {
  296. bits<3> BF;
  297. bits<1> L;
  298. bits<5> RA;
  299. bits<16> I;
  300. let Inst{6-8} = BF;
  301. let Inst{9} = 0;
  302. let Inst{10} = L;
  303. let Inst{11-15} = RA;
  304. let Inst{16-31} = I;
  305. }
  306. class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  307. InstrItinClass itin>
  308. : DForm_5<opcode, OOL, IOL, asmstr, itin> {
  309. let L = PPC64;
  310. }
  311. class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  312. InstrItinClass itin>
  313. : DForm_5<opcode, OOL, IOL, asmstr, itin>;
  314. class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  315. InstrItinClass itin>
  316. : DForm_6<opcode, OOL, IOL, asmstr, itin> {
  317. let L = PPC64;
  318. }
  319. // 1.7.5 DS-Form
  320. class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
  321. InstrItinClass itin, list<dag> pattern>
  322. : I<opcode, OOL, IOL, asmstr, itin> {
  323. bits<5> RST;
  324. bits<19> DS_RA;
  325. let Pattern = pattern;
  326. let Inst{6-10} = RST;
  327. let Inst{11-15} = DS_RA{18-14}; // Register #
  328. let Inst{16-29} = DS_RA{13-0}; // Displacement.
  329. let Inst{30-31} = xo;
  330. }
  331. // ISA V3.0B 1.6.6 DX-Form
  332. class DXForm<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  333. InstrItinClass itin, list<dag> pattern>
  334. : I<opcode, OOL, IOL, asmstr, itin> {
  335. bits<5> RT;
  336. bits<16> D;
  337. let Pattern = pattern;
  338. let Inst{6-10} = RT;
  339. let Inst{11-15} = D{5-1}; // d1
  340. let Inst{16-25} = D{15-6}; // d0
  341. let Inst{26-30} = xo;
  342. let Inst{31} = D{0}; // d2
  343. }
  344. // DQ-Form: [PO T RA DQ TX XO] or [PO S RA DQ SX XO]
  345. class DQ_RD6_RS5_DQ12<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
  346. string asmstr, InstrItinClass itin, list<dag> pattern>
  347. : I<opcode, OOL, IOL, asmstr, itin> {
  348. bits<6> XT;
  349. bits<17> DS_RA;
  350. let Pattern = pattern;
  351. let Inst{6-10} = XT{4-0};
  352. let Inst{11-15} = DS_RA{16-12}; // Register #
  353. let Inst{16-27} = DS_RA{11-0}; // Displacement.
  354. let Inst{28} = XT{5};
  355. let Inst{29-31} = xo;
  356. }
  357. class DQForm_RTp5_RA17_MEM<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
  358. string asmstr, InstrItinClass itin,
  359. list<dag> pattern>
  360. : I<opcode, OOL, IOL, asmstr, itin> {
  361. bits<5> RTp;
  362. bits<17> DQ_RA;
  363. let Pattern = pattern;
  364. let Inst{6-10} = RTp{4-0};
  365. let Inst{11-15} = DQ_RA{16-12}; // Register #
  366. let Inst{16-27} = DQ_RA{11-0}; // Displacement.
  367. let Inst{28-31} = xo;
  368. }
  369. // 1.7.6 X-Form
  370. class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  371. InstrItinClass itin, list<dag> pattern>
  372. : I<opcode, OOL, IOL, asmstr, itin> {
  373. bits<5> RST;
  374. bits<5> A;
  375. bits<5> B;
  376. let Pattern = pattern;
  377. bit RC = 0; // set by isRecordForm
  378. let Inst{6-10} = RST;
  379. let Inst{11-15} = A;
  380. let Inst{16-20} = B;
  381. let Inst{21-30} = xo;
  382. let Inst{31} = RC;
  383. }
  384. class XForm_base_r3xo_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  385. string asmstr, InstrItinClass itin,
  386. list<dag> pattern>
  387. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
  388. class XForm_tlb<bits<10> xo, dag OOL, dag IOL, string asmstr,
  389. InstrItinClass itin> : XForm_base_r3xo<31, xo, OOL, IOL, asmstr, itin, []> {
  390. let RST = 0;
  391. }
  392. class XForm_attn<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  393. InstrItinClass itin>
  394. : I<opcode, OOL, IOL, asmstr, itin> {
  395. let Inst{21-30} = xo;
  396. }
  397. // This is the same as XForm_base_r3xo, but the first two operands are swapped
  398. // when code is emitted.
  399. class XForm_base_r3xo_swapped
  400. <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  401. InstrItinClass itin>
  402. : I<opcode, OOL, IOL, asmstr, itin> {
  403. bits<5> A;
  404. bits<5> RST;
  405. bits<5> B;
  406. bit RC = 0; // set by isRecordForm
  407. let Inst{6-10} = RST;
  408. let Inst{11-15} = A;
  409. let Inst{16-20} = B;
  410. let Inst{21-30} = xo;
  411. let Inst{31} = RC;
  412. }
  413. class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  414. InstrItinClass itin, list<dag> pattern>
  415. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
  416. class XForm_1_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  417. InstrItinClass itin, list<dag> pattern>
  418. : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
  419. class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  420. InstrItinClass itin, list<dag> pattern>
  421. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  422. let RST = 0;
  423. }
  424. class XForm_rs<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  425. InstrItinClass itin, list<dag> pattern>
  426. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  427. let A = 0;
  428. let B = 0;
  429. }
  430. class XForm_tlbws<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  431. InstrItinClass itin, list<dag> pattern>
  432. : I<opcode, OOL, IOL, asmstr, itin> {
  433. bits<5> RST;
  434. bits<5> A;
  435. bits<1> WS;
  436. let Pattern = pattern;
  437. let Inst{6-10} = RST;
  438. let Inst{11-15} = A;
  439. let Inst{20} = WS;
  440. let Inst{21-30} = xo;
  441. let Inst{31} = 0;
  442. }
  443. class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  444. InstrItinClass itin, list<dag> pattern>
  445. : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
  446. let Pattern = pattern;
  447. }
  448. class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  449. InstrItinClass itin, list<dag> pattern>
  450. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
  451. class XForm_8_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  452. InstrItinClass itin, list<dag> pattern>
  453. : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
  454. class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  455. InstrItinClass itin, list<dag> pattern>
  456. : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
  457. let Pattern = pattern;
  458. }
  459. class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  460. InstrItinClass itin, list<dag> pattern>
  461. : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
  462. let B = 0;
  463. let Pattern = pattern;
  464. }
  465. class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  466. InstrItinClass itin>
  467. : I<opcode, OOL, IOL, asmstr, itin> {
  468. bits<3> BF;
  469. bits<1> L;
  470. bits<5> RA;
  471. bits<5> RB;
  472. let Inst{6-8} = BF;
  473. let Inst{9} = 0;
  474. let Inst{10} = L;
  475. let Inst{11-15} = RA;
  476. let Inst{16-20} = RB;
  477. let Inst{21-30} = xo;
  478. let Inst{31} = 0;
  479. }
  480. class XForm_icbt<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  481. InstrItinClass itin>
  482. : I<opcode, OOL, IOL, asmstr, itin> {
  483. bits<4> CT;
  484. bits<5> RA;
  485. bits<5> RB;
  486. let Inst{6} = 0;
  487. let Inst{7-10} = CT;
  488. let Inst{11-15} = RA;
  489. let Inst{16-20} = RB;
  490. let Inst{21-30} = xo;
  491. let Inst{31} = 0;
  492. }
  493. class XForm_sr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  494. InstrItinClass itin>
  495. : I<opcode, OOL, IOL, asmstr, itin> {
  496. bits<5> RS;
  497. bits<4> SR;
  498. let Inst{6-10} = RS;
  499. let Inst{12-15} = SR;
  500. let Inst{21-30} = xo;
  501. }
  502. class XForm_mbar<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  503. InstrItinClass itin>
  504. : I<opcode, OOL, IOL, asmstr, itin> {
  505. bits<5> MO;
  506. let Inst{6-10} = MO;
  507. let Inst{21-30} = xo;
  508. }
  509. class XForm_srin<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  510. InstrItinClass itin>
  511. : I<opcode, OOL, IOL, asmstr, itin> {
  512. bits<5> RS;
  513. bits<5> RB;
  514. let Inst{6-10} = RS;
  515. let Inst{16-20} = RB;
  516. let Inst{21-30} = xo;
  517. }
  518. class XForm_mtmsr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  519. InstrItinClass itin>
  520. : I<opcode, OOL, IOL, asmstr, itin> {
  521. bits<5> RS;
  522. bits<1> L;
  523. let Inst{6-10} = RS;
  524. let Inst{15} = L;
  525. let Inst{21-30} = xo;
  526. }
  527. class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  528. InstrItinClass itin>
  529. : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
  530. let L = PPC64;
  531. }
  532. class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  533. InstrItinClass itin>
  534. : I<opcode, OOL, IOL, asmstr, itin> {
  535. bits<3> BF;
  536. bits<5> FRA;
  537. bits<5> FRB;
  538. let Inst{6-8} = BF;
  539. let Inst{9-10} = 0;
  540. let Inst{11-15} = FRA;
  541. let Inst{16-20} = FRB;
  542. let Inst{21-30} = xo;
  543. let Inst{31} = 0;
  544. }
  545. class XForm_17a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  546. InstrItinClass itin, list<dag> pattern>
  547. : XForm_17<opcode, xo, OOL, IOL, asmstr, itin > {
  548. let FRA = 0;
  549. let Pattern = pattern;
  550. }
  551. class XForm_18<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  552. InstrItinClass itin, list<dag> pattern>
  553. : I<opcode, OOL, IOL, asmstr, itin> {
  554. bits<5> FRT;
  555. bits<5> FRA;
  556. bits<5> FRB;
  557. let Pattern = pattern;
  558. let Inst{6-10} = FRT;
  559. let Inst{11-15} = FRA;
  560. let Inst{16-20} = FRB;
  561. let Inst{21-30} = xo;
  562. let Inst{31} = 0;
  563. }
  564. class XForm_19<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  565. InstrItinClass itin, list<dag> pattern>
  566. : XForm_18<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  567. let FRA = 0;
  568. }
  569. class XForm_20<bits<6> opcode, bits<6> xo, dag OOL, dag IOL, string asmstr,
  570. InstrItinClass itin, list<dag> pattern>
  571. : I<opcode, OOL, IOL, asmstr, itin> {
  572. bits<5> FRT;
  573. bits<5> FRA;
  574. bits<5> FRB;
  575. bits<4> tttt;
  576. let Pattern = pattern;
  577. let Inst{6-10} = FRT;
  578. let Inst{11-15} = FRA;
  579. let Inst{16-20} = FRB;
  580. let Inst{21-24} = tttt;
  581. let Inst{25-30} = xo;
  582. let Inst{31} = 0;
  583. }
  584. class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  585. InstrItinClass itin, list<dag> pattern>
  586. : I<opcode, OOL, IOL, asmstr, itin> {
  587. let Pattern = pattern;
  588. let Inst{6-10} = 31;
  589. let Inst{11-15} = 0;
  590. let Inst{16-20} = 0;
  591. let Inst{21-30} = xo;
  592. let Inst{31} = 0;
  593. }
  594. class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  595. string asmstr, InstrItinClass itin, list<dag> pattern>
  596. : I<opcode, OOL, IOL, asmstr, itin> {
  597. bits<2> L;
  598. let Pattern = pattern;
  599. let Inst{6-8} = 0;
  600. let Inst{9-10} = L;
  601. let Inst{11-15} = 0;
  602. let Inst{16-20} = 0;
  603. let Inst{21-30} = xo;
  604. let Inst{31} = 0;
  605. }
  606. class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  607. string asmstr, InstrItinClass itin, list<dag> pattern>
  608. : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  609. let L = 0;
  610. }
  611. class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  612. InstrItinClass itin, list<dag> pattern>
  613. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  614. }
  615. class XForm_25_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  616. string asmstr, InstrItinClass itin, list<dag> pattern>
  617. : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  618. }
  619. // [PO RT /// RB XO RC]
  620. class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  621. InstrItinClass itin, list<dag> pattern>
  622. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  623. let A = 0;
  624. }
  625. class XForm_28_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  626. string asmstr, InstrItinClass itin, list<dag> pattern>
  627. : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  628. }
  629. class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  630. InstrItinClass itin, list<dag> pattern>
  631. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  632. }
  633. // This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
  634. // numbers presumably relates to some document, but I haven't found it.
  635. class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  636. InstrItinClass itin, list<dag> pattern>
  637. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  638. let Pattern = pattern;
  639. bit RC = 0; // set by isRecordForm
  640. let Inst{6-10} = RST;
  641. let Inst{11-20} = 0;
  642. let Inst{21-30} = xo;
  643. let Inst{31} = RC;
  644. }
  645. class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  646. InstrItinClass itin, list<dag> pattern>
  647. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  648. let Pattern = pattern;
  649. bits<5> FM;
  650. bit RC = 0; // set by isRecordForm
  651. let Inst{6-10} = FM;
  652. let Inst{11-20} = 0;
  653. let Inst{21-30} = xo;
  654. let Inst{31} = RC;
  655. }
  656. class XForm_44<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  657. InstrItinClass itin>
  658. : I<opcode, OOL, IOL, asmstr, itin> {
  659. bits<5> RT;
  660. bits<3> BFA;
  661. let Inst{6-10} = RT;
  662. let Inst{11-13} = BFA;
  663. let Inst{14-15} = 0;
  664. let Inst{16-20} = 0;
  665. let Inst{21-30} = xo;
  666. let Inst{31} = 0;
  667. }
  668. class XForm_45<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  669. InstrItinClass itin>
  670. : I<opcode, OOL, IOL, asmstr, itin> {
  671. bits<5> RT;
  672. bits<2> L;
  673. let Inst{6-10} = RT;
  674. let Inst{11-13} = 0;
  675. let Inst{14-15} = L;
  676. let Inst{16-20} = 0;
  677. let Inst{21-30} = xo;
  678. let Inst{31} = 0;
  679. }
  680. class X_FRT5_XO2_XO3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2, bits<10> xo,
  681. dag OOL, dag IOL, string asmstr, InstrItinClass itin,
  682. list<dag> pattern>
  683. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  684. let Pattern = pattern;
  685. let Inst{6-10} = RST;
  686. let Inst{11-12} = xo1;
  687. let Inst{13-15} = xo2;
  688. let Inst{16-20} = 0;
  689. let Inst{21-30} = xo;
  690. let Inst{31} = 0;
  691. }
  692. class X_FRT5_XO2_XO3_FRB5_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
  693. bits<10> xo, dag OOL, dag IOL, string asmstr,
  694. InstrItinClass itin, list<dag> pattern>
  695. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  696. let Pattern = pattern;
  697. bits<5> FRB;
  698. let Inst{6-10} = RST;
  699. let Inst{11-12} = xo1;
  700. let Inst{13-15} = xo2;
  701. let Inst{16-20} = FRB;
  702. let Inst{21-30} = xo;
  703. let Inst{31} = 0;
  704. }
  705. class X_FRT5_XO2_XO3_DRM3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
  706. bits<10> xo, dag OOL, dag IOL, string asmstr,
  707. InstrItinClass itin, list<dag> pattern>
  708. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  709. let Pattern = pattern;
  710. bits<3> DRM;
  711. let Inst{6-10} = RST;
  712. let Inst{11-12} = xo1;
  713. let Inst{13-15} = xo2;
  714. let Inst{16-17} = 0;
  715. let Inst{18-20} = DRM;
  716. let Inst{21-30} = xo;
  717. let Inst{31} = 0;
  718. }
  719. class X_FRT5_XO2_XO3_RM2_X10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
  720. bits<10> xo, dag OOL, dag IOL, string asmstr,
  721. InstrItinClass itin, list<dag> pattern>
  722. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  723. let Pattern = pattern;
  724. bits<2> RM;
  725. let Inst{6-10} = RST;
  726. let Inst{11-12} = xo1;
  727. let Inst{13-15} = xo2;
  728. let Inst{16-18} = 0;
  729. let Inst{19-20} = RM;
  730. let Inst{21-30} = xo;
  731. let Inst{31} = 0;
  732. }
  733. class XForm_0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  734. InstrItinClass itin, list<dag> pattern>
  735. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  736. let RST = 0;
  737. let A = 0;
  738. let B = 0;
  739. }
  740. class XForm_16b<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  741. InstrItinClass itin, list<dag> pattern>
  742. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  743. let RST = 0;
  744. let A = 0;
  745. }
  746. class XForm_htm0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  747. string asmstr, InstrItinClass itin>
  748. : I<opcode, OOL, IOL, asmstr, itin> {
  749. bit R;
  750. bit RC = 1;
  751. let Inst{6-9} = 0;
  752. let Inst{10} = R;
  753. let Inst{11-20} = 0;
  754. let Inst{21-30} = xo;
  755. let Inst{31} = RC;
  756. }
  757. class XForm_htm1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  758. string asmstr, InstrItinClass itin>
  759. : I<opcode, OOL, IOL, asmstr, itin> {
  760. bit A;
  761. bit RC = 1;
  762. let Inst{6} = A;
  763. let Inst{7-20} = 0;
  764. let Inst{21-30} = xo;
  765. let Inst{31} = RC;
  766. }
  767. class XForm_htm2<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  768. InstrItinClass itin>
  769. : I<opcode, OOL, IOL, asmstr, itin> {
  770. bit L;
  771. bit RC = 0; // set by isRecordForm
  772. let Inst{7-9} = 0;
  773. let Inst{10} = L;
  774. let Inst{11-20} = 0;
  775. let Inst{21-30} = xo;
  776. let Inst{31} = RC;
  777. }
  778. class XForm_htm3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  779. InstrItinClass itin>
  780. : I<opcode, OOL, IOL, asmstr, itin> {
  781. bits<3> BF;
  782. bit RC = 0;
  783. let Inst{6-8} = BF;
  784. let Inst{9-20} = 0;
  785. let Inst{21-30} = xo;
  786. let Inst{31} = RC;
  787. }
  788. // [PO RT RA RB XO /]
  789. class X_BF3_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  790. string asmstr, InstrItinClass itin, list<dag> pattern>
  791. : I<opcode, OOL, IOL, asmstr, itin> {
  792. bits<3> BF;
  793. bits<1> L;
  794. bits<5> RA;
  795. bits<5> RB;
  796. let Pattern = pattern;
  797. let Inst{6-8} = BF;
  798. let Inst{9} = 0;
  799. let Inst{10} = L;
  800. let Inst{11-15} = RA;
  801. let Inst{16-20} = RB;
  802. let Inst{21-30} = xo;
  803. let Inst{31} = 0;
  804. }
  805. // Same as XForm_17 but with GPR's and new naming convention
  806. class X_BF3_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  807. string asmstr, InstrItinClass itin, list<dag> pattern>
  808. : I<opcode, OOL, IOL, asmstr, itin> {
  809. bits<3> BF;
  810. bits<5> RA;
  811. bits<5> RB;
  812. let Pattern = pattern;
  813. let Inst{6-8} = BF;
  814. let Inst{9-10} = 0;
  815. let Inst{11-15} = RA;
  816. let Inst{16-20} = RB;
  817. let Inst{21-30} = xo;
  818. let Inst{31} = 0;
  819. }
  820. // e.g. [PO VRT XO VRB XO /] or [PO VRT XO VRB XO RO]
  821. class X_RD5_XO5_RS5<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL,
  822. string asmstr, InstrItinClass itin, list<dag> pattern>
  823. : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  824. let A = xo2;
  825. }
  826. class X_BF3_DCMX7_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  827. string asmstr, InstrItinClass itin, list<dag> pattern>
  828. : I<opcode, OOL, IOL, asmstr, itin> {
  829. bits<3> BF;
  830. bits<7> DCMX;
  831. bits<5> VB;
  832. let Pattern = pattern;
  833. let Inst{6-8} = BF;
  834. let Inst{9-15} = DCMX;
  835. let Inst{16-20} = VB;
  836. let Inst{21-30} = xo;
  837. let Inst{31} = 0;
  838. }
  839. class X_RD6_IMM8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  840. string asmstr, InstrItinClass itin, list<dag> pattern>
  841. : I<opcode, OOL, IOL, asmstr, itin> {
  842. bits<6> XT;
  843. bits<8> IMM8;
  844. let Pattern = pattern;
  845. let Inst{6-10} = XT{4-0};
  846. let Inst{11-12} = 0;
  847. let Inst{13-20} = IMM8;
  848. let Inst{21-30} = xo;
  849. let Inst{31} = XT{5};
  850. }
  851. // XForm_base_r3xo for instructions such as P9 atomics where we don't want
  852. // to specify an SDAG pattern for matching.
  853. class X_RD5_RS5_IM5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  854. string asmstr, InstrItinClass itin>
  855. : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, []> {
  856. }
  857. class X_BF3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  858. InstrItinClass itin>
  859. : XForm_17<opcode, xo, OOL, IOL, asmstr, itin> {
  860. let FRA = 0;
  861. let FRB = 0;
  862. }
  863. // [PO /// L RA RB XO /]
  864. class X_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  865. string asmstr, InstrItinClass itin, list<dag> pattern>
  866. : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
  867. let BF = 0;
  868. let Pattern = pattern;
  869. bit RC = 0;
  870. let Inst{31} = RC;
  871. }
  872. // XX*-Form (VSX)
  873. class XX1Form<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  874. InstrItinClass itin, list<dag> pattern>
  875. : I<opcode, OOL, IOL, asmstr, itin> {
  876. bits<6> XT;
  877. bits<5> A;
  878. bits<5> B;
  879. let Pattern = pattern;
  880. let Inst{6-10} = XT{4-0};
  881. let Inst{11-15} = A;
  882. let Inst{16-20} = B;
  883. let Inst{21-30} = xo;
  884. let Inst{31} = XT{5};
  885. }
  886. class XX1Form_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  887. string asmstr, InstrItinClass itin, list<dag> pattern>
  888. : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
  889. class XX1_RS6_RD5_XO<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  890. string asmstr, InstrItinClass itin, list<dag> pattern>
  891. : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  892. let B = 0;
  893. }
  894. class XX2Form<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
  895. InstrItinClass itin, list<dag> pattern>
  896. : I<opcode, OOL, IOL, asmstr, itin> {
  897. bits<6> XT;
  898. bits<6> XB;
  899. let Pattern = pattern;
  900. let Inst{6-10} = XT{4-0};
  901. let Inst{11-15} = 0;
  902. let Inst{16-20} = XB{4-0};
  903. let Inst{21-29} = xo;
  904. let Inst{30} = XB{5};
  905. let Inst{31} = XT{5};
  906. }
  907. class XX2Form_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
  908. InstrItinClass itin, list<dag> pattern>
  909. : I<opcode, OOL, IOL, asmstr, itin> {
  910. bits<3> CR;
  911. bits<6> XB;
  912. let Pattern = pattern;
  913. let Inst{6-8} = CR;
  914. let Inst{9-15} = 0;
  915. let Inst{16-20} = XB{4-0};
  916. let Inst{21-29} = xo;
  917. let Inst{30} = XB{5};
  918. let Inst{31} = 0;
  919. }
  920. class XX2Form_2<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
  921. InstrItinClass itin, list<dag> pattern>
  922. : I<opcode, OOL, IOL, asmstr, itin> {
  923. bits<6> XT;
  924. bits<6> XB;
  925. bits<2> D;
  926. let Pattern = pattern;
  927. let Inst{6-10} = XT{4-0};
  928. let Inst{11-13} = 0;
  929. let Inst{14-15} = D;
  930. let Inst{16-20} = XB{4-0};
  931. let Inst{21-29} = xo;
  932. let Inst{30} = XB{5};
  933. let Inst{31} = XT{5};
  934. }
  935. class XX2_RD6_UIM5_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
  936. string asmstr, InstrItinClass itin, list<dag> pattern>
  937. : I<opcode, OOL, IOL, asmstr, itin> {
  938. bits<6> XT;
  939. bits<6> XB;
  940. bits<5> UIM5;
  941. let Pattern = pattern;
  942. let Inst{6-10} = XT{4-0};
  943. let Inst{11-15} = UIM5;
  944. let Inst{16-20} = XB{4-0};
  945. let Inst{21-29} = xo;
  946. let Inst{30} = XB{5};
  947. let Inst{31} = XT{5};
  948. }
  949. // [PO T XO B XO BX /]
  950. class XX2_RD5_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
  951. string asmstr, InstrItinClass itin, list<dag> pattern>
  952. : I<opcode, OOL, IOL, asmstr, itin> {
  953. bits<5> RT;
  954. bits<6> XB;
  955. let Pattern = pattern;
  956. let Inst{6-10} = RT;
  957. let Inst{11-15} = xo2;
  958. let Inst{16-20} = XB{4-0};
  959. let Inst{21-29} = xo;
  960. let Inst{30} = XB{5};
  961. let Inst{31} = 0;
  962. }
  963. // [PO T XO B XO BX TX]
  964. class XX2_RD6_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
  965. string asmstr, InstrItinClass itin, list<dag> pattern>
  966. : I<opcode, OOL, IOL, asmstr, itin> {
  967. bits<6> XT;
  968. bits<6> XB;
  969. let Pattern = pattern;
  970. let Inst{6-10} = XT{4-0};
  971. let Inst{11-15} = xo2;
  972. let Inst{16-20} = XB{4-0};
  973. let Inst{21-29} = xo;
  974. let Inst{30} = XB{5};
  975. let Inst{31} = XT{5};
  976. }
  977. class XX2_BF3_DCMX7_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
  978. string asmstr, InstrItinClass itin, list<dag> pattern>
  979. : I<opcode, OOL, IOL, asmstr, itin> {
  980. bits<3> BF;
  981. bits<7> DCMX;
  982. bits<6> XB;
  983. let Pattern = pattern;
  984. let Inst{6-8} = BF;
  985. let Inst{9-15} = DCMX;
  986. let Inst{16-20} = XB{4-0};
  987. let Inst{21-29} = xo;
  988. let Inst{30} = XB{5};
  989. let Inst{31} = 0;
  990. }
  991. class XX2_RD6_DCMX7_RS6<bits<6> opcode, bits<4> xo1, bits<3> xo2,
  992. dag OOL, dag IOL, string asmstr, InstrItinClass itin,
  993. list<dag> pattern>
  994. : I<opcode, OOL, IOL, asmstr, itin> {
  995. bits<6> XT;
  996. bits<7> DCMX;
  997. bits<6> XB;
  998. let Pattern = pattern;
  999. let Inst{6-10} = XT{4-0};
  1000. let Inst{11-15} = DCMX{4-0};
  1001. let Inst{16-20} = XB{4-0};
  1002. let Inst{21-24} = xo1;
  1003. let Inst{25} = DCMX{6};
  1004. let Inst{26-28} = xo2;
  1005. let Inst{29} = DCMX{5};
  1006. let Inst{30} = XB{5};
  1007. let Inst{31} = XT{5};
  1008. }
  1009. class XForm_XD6_RA5_RB5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
  1010. string asmstr, InstrItinClass itin, list<dag> pattern>
  1011. : I<opcode, OOL, IOL, asmstr, itin> {
  1012. bits<11> D_RA_XD;
  1013. bits<5> RB;
  1014. let Pattern = pattern;
  1015. let Inst{6-10} = D_RA_XD{4-0}; // D
  1016. let Inst{11-15} = D_RA_XD{10-6}; // RA
  1017. let Inst{16-20} = RB;
  1018. let Inst{21-30} = xo;
  1019. let Inst{31} = D_RA_XD{5}; // DX
  1020. }
  1021. class XX3Form<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
  1022. InstrItinClass itin, list<dag> pattern>
  1023. : I<opcode, OOL, IOL, asmstr, itin> {
  1024. bits<6> XT;
  1025. bits<6> XA;
  1026. bits<6> XB;
  1027. let Pattern = pattern;
  1028. let Inst{6-10} = XT{4-0};
  1029. let Inst{11-15} = XA{4-0};
  1030. let Inst{16-20} = XB{4-0};
  1031. let Inst{21-28} = xo;
  1032. let Inst{29} = XA{5};
  1033. let Inst{30} = XB{5};
  1034. let Inst{31} = XT{5};
  1035. }
  1036. class XX3Form_SameOp<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
  1037. InstrItinClass itin, list<dag> pattern>
  1038. : XX3Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1039. let XA = XT;
  1040. let XB = XT;
  1041. }
  1042. class XX3Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
  1043. InstrItinClass itin, list<dag> pattern>
  1044. : I<opcode, OOL, IOL, asmstr, itin> {
  1045. bits<3> CR;
  1046. bits<6> XA;
  1047. bits<6> XB;
  1048. let Pattern = pattern;
  1049. let Inst{6-8} = CR;
  1050. let Inst{9-10} = 0;
  1051. let Inst{11-15} = XA{4-0};
  1052. let Inst{16-20} = XB{4-0};
  1053. let Inst{21-28} = xo;
  1054. let Inst{29} = XA{5};
  1055. let Inst{30} = XB{5};
  1056. let Inst{31} = 0;
  1057. }
  1058. class XX3Form_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  1059. InstrItinClass itin, list<dag> pattern>
  1060. : I<opcode, OOL, IOL, asmstr, itin> {
  1061. bits<6> XT;
  1062. bits<6> XA;
  1063. bits<6> XB;
  1064. bits<2> D;
  1065. let Pattern = pattern;
  1066. let Inst{6-10} = XT{4-0};
  1067. let Inst{11-15} = XA{4-0};
  1068. let Inst{16-20} = XB{4-0};
  1069. let Inst{21} = 0;
  1070. let Inst{22-23} = D;
  1071. let Inst{24-28} = xo;
  1072. let Inst{29} = XA{5};
  1073. let Inst{30} = XB{5};
  1074. let Inst{31} = XT{5};
  1075. }
  1076. class XX3Form_Rc<bits<6> opcode, bits<7> xo, dag OOL, dag IOL, string asmstr,
  1077. InstrItinClass itin, list<dag> pattern>
  1078. : I<opcode, OOL, IOL, asmstr, itin> {
  1079. bits<6> XT;
  1080. bits<6> XA;
  1081. bits<6> XB;
  1082. let Pattern = pattern;
  1083. bit RC = 0; // set by isRecordForm
  1084. let Inst{6-10} = XT{4-0};
  1085. let Inst{11-15} = XA{4-0};
  1086. let Inst{16-20} = XB{4-0};
  1087. let Inst{21} = RC;
  1088. let Inst{22-28} = xo;
  1089. let Inst{29} = XA{5};
  1090. let Inst{30} = XB{5};
  1091. let Inst{31} = XT{5};
  1092. }
  1093. class XX4Form<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
  1094. InstrItinClass itin, list<dag> pattern>
  1095. : I<opcode, OOL, IOL, asmstr, itin> {
  1096. bits<6> XT;
  1097. bits<6> XA;
  1098. bits<6> XB;
  1099. bits<6> XC;
  1100. let Pattern = pattern;
  1101. let Inst{6-10} = XT{4-0};
  1102. let Inst{11-15} = XA{4-0};
  1103. let Inst{16-20} = XB{4-0};
  1104. let Inst{21-25} = XC{4-0};
  1105. let Inst{26-27} = xo;
  1106. let Inst{28} = XC{5};
  1107. let Inst{29} = XA{5};
  1108. let Inst{30} = XB{5};
  1109. let Inst{31} = XT{5};
  1110. }
  1111. // DCB_Form - Form X instruction, used for dcb* instructions.
  1112. class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
  1113. InstrItinClass itin, list<dag> pattern>
  1114. : I<31, OOL, IOL, asmstr, itin> {
  1115. bits<5> A;
  1116. bits<5> B;
  1117. let Pattern = pattern;
  1118. let Inst{6-10} = immfield;
  1119. let Inst{11-15} = A;
  1120. let Inst{16-20} = B;
  1121. let Inst{21-30} = xo;
  1122. let Inst{31} = 0;
  1123. }
  1124. class DCB_Form_hint<bits<10> xo, dag OOL, dag IOL, string asmstr,
  1125. InstrItinClass itin, list<dag> pattern>
  1126. : I<31, OOL, IOL, asmstr, itin> {
  1127. bits<5> TH;
  1128. bits<5> A;
  1129. bits<5> B;
  1130. let Pattern = pattern;
  1131. let Inst{6-10} = TH;
  1132. let Inst{11-15} = A;
  1133. let Inst{16-20} = B;
  1134. let Inst{21-30} = xo;
  1135. let Inst{31} = 0;
  1136. }
  1137. // DSS_Form - Form X instruction, used for altivec dss* instructions.
  1138. class DSS_Form<bits<1> T, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1139. InstrItinClass itin, list<dag> pattern>
  1140. : I<31, OOL, IOL, asmstr, itin> {
  1141. bits<2> STRM;
  1142. bits<5> A;
  1143. bits<5> B;
  1144. let Pattern = pattern;
  1145. let Inst{6} = T;
  1146. let Inst{7-8} = 0;
  1147. let Inst{9-10} = STRM;
  1148. let Inst{11-15} = A;
  1149. let Inst{16-20} = B;
  1150. let Inst{21-30} = xo;
  1151. let Inst{31} = 0;
  1152. }
  1153. // 1.7.7 XL-Form
  1154. class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1155. InstrItinClass itin, list<dag> pattern>
  1156. : I<opcode, OOL, IOL, asmstr, itin> {
  1157. bits<5> CRD;
  1158. bits<5> CRA;
  1159. bits<5> CRB;
  1160. let Pattern = pattern;
  1161. let Inst{6-10} = CRD;
  1162. let Inst{11-15} = CRA;
  1163. let Inst{16-20} = CRB;
  1164. let Inst{21-30} = xo;
  1165. let Inst{31} = 0;
  1166. }
  1167. // XL-Form for unary alias for CRNOR (CRNOT)
  1168. class XLForm_1s<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1169. InstrItinClass itin, list<dag> pattern>
  1170. : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1171. let CRB = CRA;
  1172. }
  1173. class XLForm_1_np<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1174. InstrItinClass itin, list<dag> pattern>
  1175. : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1176. let CRD = 0;
  1177. let CRA = 0;
  1178. let CRB = 0;
  1179. }
  1180. class XLForm_1_gen<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1181. InstrItinClass itin, list<dag> pattern>
  1182. : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1183. bits<5> RT;
  1184. bits<5> RB;
  1185. let CRD = RT;
  1186. let CRA = 0;
  1187. let CRB = RB;
  1188. }
  1189. class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1190. InstrItinClass itin, list<dag> pattern>
  1191. : I<opcode, OOL, IOL, asmstr, itin> {
  1192. bits<5> CRD;
  1193. let Pattern = pattern;
  1194. let Inst{6-10} = CRD;
  1195. let Inst{11-15} = CRD;
  1196. let Inst{16-20} = CRD;
  1197. let Inst{21-30} = xo;
  1198. let Inst{31} = 0;
  1199. }
  1200. class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
  1201. InstrItinClass itin, list<dag> pattern>
  1202. : I<opcode, OOL, IOL, asmstr, itin> {
  1203. bits<5> BO;
  1204. bits<5> BI;
  1205. bits<2> BH;
  1206. let Pattern = pattern;
  1207. let Inst{6-10} = BO;
  1208. let Inst{11-15} = BI;
  1209. let Inst{16-18} = 0;
  1210. let Inst{19-20} = BH;
  1211. let Inst{21-30} = xo;
  1212. let Inst{31} = lk;
  1213. }
  1214. class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
  1215. dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
  1216. : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
  1217. bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
  1218. bits<3> CR;
  1219. let BO = BIBO{4-0};
  1220. let BI{0-1} = BIBO{5-6};
  1221. let BI{2-4} = CR{0-2};
  1222. let BH = 0;
  1223. }
  1224. class XLForm_2_br2<bits<6> opcode, bits<10> xo, bits<5> bo, bit lk,
  1225. dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
  1226. : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
  1227. let BO = bo;
  1228. let BH = 0;
  1229. }
  1230. class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
  1231. dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
  1232. : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
  1233. let BO = bo;
  1234. let BI = bi;
  1235. let BH = 0;
  1236. }
  1237. class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1238. InstrItinClass itin>
  1239. : I<opcode, OOL, IOL, asmstr, itin> {
  1240. bits<3> BF;
  1241. bits<3> BFA;
  1242. let Inst{6-8} = BF;
  1243. let Inst{9-10} = 0;
  1244. let Inst{11-13} = BFA;
  1245. let Inst{14-15} = 0;
  1246. let Inst{16-20} = 0;
  1247. let Inst{21-30} = xo;
  1248. let Inst{31} = 0;
  1249. }
  1250. class XLForm_4<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1251. InstrItinClass itin>
  1252. : I<opcode, OOL, IOL, asmstr, itin> {
  1253. bits<3> BF;
  1254. bit W;
  1255. bits<4> U;
  1256. bit RC = 0;
  1257. let Inst{6-8} = BF;
  1258. let Inst{9-10} = 0;
  1259. let Inst{11-14} = 0;
  1260. let Inst{15} = W;
  1261. let Inst{16-19} = U;
  1262. let Inst{20} = 0;
  1263. let Inst{21-30} = xo;
  1264. let Inst{31} = RC;
  1265. }
  1266. class XLForm_S<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1267. InstrItinClass itin, list<dag> pattern>
  1268. : I<opcode, OOL, IOL, asmstr, itin> {
  1269. bits<1> S;
  1270. let Pattern = pattern;
  1271. let Inst{6-19} = 0;
  1272. let Inst{20} = S;
  1273. let Inst{21-30} = xo;
  1274. let Inst{31} = 0;
  1275. }
  1276. class XLForm_2_and_DSForm_1<bits<6> opcode1, bits<10> xo1, bit lk,
  1277. bits<6> opcode2, bits<2> xo2,
  1278. dag OOL, dag IOL, string asmstr,
  1279. InstrItinClass itin, list<dag> pattern>
  1280. : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
  1281. bits<5> BO;
  1282. bits<5> BI;
  1283. bits<2> BH;
  1284. bits<5> RST;
  1285. bits<19> DS_RA;
  1286. let Pattern = pattern;
  1287. let Inst{6-10} = BO;
  1288. let Inst{11-15} = BI;
  1289. let Inst{16-18} = 0;
  1290. let Inst{19-20} = BH;
  1291. let Inst{21-30} = xo1;
  1292. let Inst{31} = lk;
  1293. let Inst{38-42} = RST;
  1294. let Inst{43-47} = DS_RA{18-14}; // Register #
  1295. let Inst{48-61} = DS_RA{13-0}; // Displacement.
  1296. let Inst{62-63} = xo2;
  1297. }
  1298. class XLForm_2_ext_and_DSForm_1<bits<6> opcode1, bits<10> xo1,
  1299. bits<5> bo, bits<5> bi, bit lk,
  1300. bits<6> opcode2, bits<2> xo2,
  1301. dag OOL, dag IOL, string asmstr,
  1302. InstrItinClass itin, list<dag> pattern>
  1303. : XLForm_2_and_DSForm_1<opcode1, xo1, lk, opcode2, xo2,
  1304. OOL, IOL, asmstr, itin, pattern> {
  1305. let BO = bo;
  1306. let BI = bi;
  1307. let BH = 0;
  1308. }
  1309. class XLForm_2_ext_and_DForm_1<bits<6> opcode1, bits<10> xo1, bits<5> bo,
  1310. bits<5> bi, bit lk, bits<6> opcode2, dag OOL,
  1311. dag IOL, string asmstr, InstrItinClass itin,
  1312. list<dag> pattern>
  1313. : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
  1314. bits<5> RST;
  1315. bits<21> D_RA;
  1316. let Pattern = pattern;
  1317. let Inst{6-10} = bo;
  1318. let Inst{11-15} = bi;
  1319. let Inst{16-18} = 0;
  1320. let Inst{19-20} = 0; // Unused (BH)
  1321. let Inst{21-30} = xo1;
  1322. let Inst{31} = lk;
  1323. let Inst{38-42} = RST;
  1324. let Inst{43-47} = D_RA{20-16}; // Base Register
  1325. let Inst{48-63} = D_RA{15-0}; // Displacement
  1326. }
  1327. // 1.7.8 XFX-Form
  1328. class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1329. InstrItinClass itin>
  1330. : I<opcode, OOL, IOL, asmstr, itin> {
  1331. bits<5> RT;
  1332. bits<10> SPR;
  1333. let Inst{6-10} = RT;
  1334. let Inst{11} = SPR{4};
  1335. let Inst{12} = SPR{3};
  1336. let Inst{13} = SPR{2};
  1337. let Inst{14} = SPR{1};
  1338. let Inst{15} = SPR{0};
  1339. let Inst{16} = SPR{9};
  1340. let Inst{17} = SPR{8};
  1341. let Inst{18} = SPR{7};
  1342. let Inst{19} = SPR{6};
  1343. let Inst{20} = SPR{5};
  1344. let Inst{21-30} = xo;
  1345. let Inst{31} = 0;
  1346. }
  1347. class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
  1348. dag OOL, dag IOL, string asmstr, InstrItinClass itin>
  1349. : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
  1350. let SPR = spr;
  1351. }
  1352. class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1353. InstrItinClass itin>
  1354. : I<opcode, OOL, IOL, asmstr, itin> {
  1355. bits<5> RT;
  1356. let Inst{6-10} = RT;
  1357. let Inst{11-20} = 0;
  1358. let Inst{21-30} = xo;
  1359. let Inst{31} = 0;
  1360. }
  1361. class XFXForm_3p<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1362. InstrItinClass itin, list<dag> pattern>
  1363. : I<opcode, OOL, IOL, asmstr, itin> {
  1364. bits<5> RT;
  1365. bits<10> Entry;
  1366. let Pattern = pattern;
  1367. let Inst{6-10} = RT;
  1368. let Inst{11-20} = Entry;
  1369. let Inst{21-30} = xo;
  1370. let Inst{31} = 0;
  1371. }
  1372. class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1373. InstrItinClass itin>
  1374. : I<opcode, OOL, IOL, asmstr, itin> {
  1375. bits<8> FXM;
  1376. bits<5> rS;
  1377. let Inst{6-10} = rS;
  1378. let Inst{11} = 0;
  1379. let Inst{12-19} = FXM;
  1380. let Inst{20} = 0;
  1381. let Inst{21-30} = xo;
  1382. let Inst{31} = 0;
  1383. }
  1384. class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1385. InstrItinClass itin>
  1386. : I<opcode, OOL, IOL, asmstr, itin> {
  1387. bits<5> ST;
  1388. bits<8> FXM;
  1389. let Inst{6-10} = ST;
  1390. let Inst{11} = 1;
  1391. let Inst{12-19} = FXM;
  1392. let Inst{20} = 0;
  1393. let Inst{21-30} = xo;
  1394. let Inst{31} = 0;
  1395. }
  1396. class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1397. InstrItinClass itin>
  1398. : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
  1399. class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
  1400. dag OOL, dag IOL, string asmstr, InstrItinClass itin>
  1401. : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
  1402. let SPR = spr;
  1403. }
  1404. // XFL-Form - MTFSF
  1405. // This is probably 1.7.9, but I don't have the reference that uses this
  1406. // numbering scheme...
  1407. class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1408. InstrItinClass itin, list<dag>pattern>
  1409. : I<opcode, OOL, IOL, asmstr, itin> {
  1410. bits<8> FM;
  1411. bits<5> rT;
  1412. bit RC = 0; // set by isRecordForm
  1413. let Pattern = pattern;
  1414. let Inst{6} = 0;
  1415. let Inst{7-14} = FM;
  1416. let Inst{15} = 0;
  1417. let Inst{16-20} = rT;
  1418. let Inst{21-30} = xo;
  1419. let Inst{31} = RC;
  1420. }
  1421. class XFLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
  1422. InstrItinClass itin, list<dag>pattern>
  1423. : I<opcode, OOL, IOL, asmstr, itin> {
  1424. bit L;
  1425. bits<8> FLM;
  1426. bit W;
  1427. bits<5> FRB;
  1428. bit RC = 0; // set by isRecordForm
  1429. let Pattern = pattern;
  1430. let Inst{6} = L;
  1431. let Inst{7-14} = FLM;
  1432. let Inst{15} = W;
  1433. let Inst{16-20} = FRB;
  1434. let Inst{21-30} = xo;
  1435. let Inst{31} = RC;
  1436. }
  1437. // 1.7.10 XS-Form - SRADI.
  1438. class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
  1439. InstrItinClass itin, list<dag> pattern>
  1440. : I<opcode, OOL, IOL, asmstr, itin> {
  1441. bits<5> A;
  1442. bits<5> RS;
  1443. bits<6> SH;
  1444. bit RC = 0; // set by isRecordForm
  1445. let Pattern = pattern;
  1446. let Inst{6-10} = RS;
  1447. let Inst{11-15} = A;
  1448. let Inst{16-20} = SH{4,3,2,1,0};
  1449. let Inst{21-29} = xo;
  1450. let Inst{30} = SH{5};
  1451. let Inst{31} = RC;
  1452. }
  1453. // 1.7.11 XO-Form
  1454. class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
  1455. InstrItinClass itin, list<dag> pattern>
  1456. : I<opcode, OOL, IOL, asmstr, itin> {
  1457. bits<5> RT;
  1458. bits<5> RA;
  1459. bits<5> RB;
  1460. let Pattern = pattern;
  1461. bit RC = 0; // set by isRecordForm
  1462. let Inst{6-10} = RT;
  1463. let Inst{11-15} = RA;
  1464. let Inst{16-20} = RB;
  1465. let Inst{21} = oe;
  1466. let Inst{22-30} = xo;
  1467. let Inst{31} = RC;
  1468. }
  1469. class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
  1470. dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
  1471. : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
  1472. let RB = 0;
  1473. }
  1474. // 1.7.12 A-Form
  1475. class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  1476. InstrItinClass itin, list<dag> pattern>
  1477. : I<opcode, OOL, IOL, asmstr, itin> {
  1478. bits<5> FRT;
  1479. bits<5> FRA;
  1480. bits<5> FRC;
  1481. bits<5> FRB;
  1482. let Pattern = pattern;
  1483. bit RC = 0; // set by isRecordForm
  1484. let Inst{6-10} = FRT;
  1485. let Inst{11-15} = FRA;
  1486. let Inst{16-20} = FRB;
  1487. let Inst{21-25} = FRC;
  1488. let Inst{26-30} = xo;
  1489. let Inst{31} = RC;
  1490. }
  1491. class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  1492. InstrItinClass itin, list<dag> pattern>
  1493. : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1494. let FRC = 0;
  1495. }
  1496. class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  1497. InstrItinClass itin, list<dag> pattern>
  1498. : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
  1499. let FRB = 0;
  1500. }
  1501. class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
  1502. InstrItinClass itin, list<dag> pattern>
  1503. : I<opcode, OOL, IOL, asmstr, itin> {
  1504. bits<5> RT;
  1505. bits<5> RA;
  1506. bits<5> RB;
  1507. bits<5> COND;
  1508. let Pattern = pattern;
  1509. let Inst{6-10} = RT;
  1510. let Inst{11-15} = RA;
  1511. let Inst{16-20} = RB;
  1512. let Inst{21-25} = COND;
  1513. let Inst{26-30} = xo;
  1514. let Inst{31} = 0;
  1515. }
  1516. // 1.7.13 M-Form
  1517. class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  1518. InstrItinClass itin, list<dag> pattern>
  1519. : I<opcode, OOL, IOL, asmstr, itin> {
  1520. bits<5> RA;
  1521. bits<5> RS;
  1522. bits<5> RB;
  1523. bits<5> MB;
  1524. bits<5> ME;
  1525. let Pattern = pattern;
  1526. bit RC = 0; // set by isRecordForm
  1527. let Inst{6-10} = RS;
  1528. let Inst{11-15} = RA;
  1529. let Inst{16-20} = RB;
  1530. let Inst{21-25} = MB;
  1531. let Inst{26-30} = ME;
  1532. let Inst{31} = RC;
  1533. }
  1534. class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
  1535. InstrItinClass itin, list<dag> pattern>
  1536. : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
  1537. }
  1538. // 1.7.14 MD-Form
  1539. class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
  1540. InstrItinClass itin, list<dag> pattern>
  1541. : I<opcode, OOL, IOL, asmstr, itin> {
  1542. bits<5> RA;
  1543. bits<5> RS;
  1544. bits<6> SH;
  1545. bits<6> MBE;
  1546. let Pattern = pattern;
  1547. bit RC = 0; // set by isRecordForm
  1548. let Inst{6-10} = RS;
  1549. let Inst{11-15} = RA;
  1550. let Inst{16-20} = SH{4,3,2,1,0};
  1551. let Inst{21-26} = MBE{4,3,2,1,0,5};
  1552. let Inst{27-29} = xo;
  1553. let Inst{30} = SH{5};
  1554. let Inst{31} = RC;
  1555. }
  1556. class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
  1557. InstrItinClass itin, list<dag> pattern>
  1558. : I<opcode, OOL, IOL, asmstr, itin> {
  1559. bits<5> RA;
  1560. bits<5> RS;
  1561. bits<5> RB;
  1562. bits<6> MBE;
  1563. let Pattern = pattern;
  1564. bit RC = 0; // set by isRecordForm
  1565. let Inst{6-10} = RS;
  1566. let Inst{11-15} = RA;
  1567. let Inst{16-20} = RB;
  1568. let Inst{21-26} = MBE{4,3,2,1,0,5};
  1569. let Inst{27-30} = xo;
  1570. let Inst{31} = RC;
  1571. }
  1572. // E-1 VA-Form
  1573. // VAForm_1 - DACB ordering.
  1574. class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
  1575. InstrItinClass itin, list<dag> pattern>
  1576. : I<4, OOL, IOL, asmstr, itin> {
  1577. bits<5> VD;
  1578. bits<5> VA;
  1579. bits<5> VC;
  1580. bits<5> VB;
  1581. let Pattern = pattern;
  1582. let Inst{6-10} = VD;
  1583. let Inst{11-15} = VA;
  1584. let Inst{16-20} = VB;
  1585. let Inst{21-25} = VC;
  1586. let Inst{26-31} = xo;
  1587. }
  1588. // VAForm_1a - DABC ordering.
  1589. class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
  1590. InstrItinClass itin, list<dag> pattern>
  1591. : I<4, OOL, IOL, asmstr, itin> {
  1592. bits<5> VD;
  1593. bits<5> VA;
  1594. bits<5> VB;
  1595. bits<5> VC;
  1596. let Pattern = pattern;
  1597. let Inst{6-10} = VD;
  1598. let Inst{11-15} = VA;
  1599. let Inst{16-20} = VB;
  1600. let Inst{21-25} = VC;
  1601. let Inst{26-31} = xo;
  1602. }
  1603. class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
  1604. InstrItinClass itin, list<dag> pattern>
  1605. : I<4, OOL, IOL, asmstr, itin> {
  1606. bits<5> VD;
  1607. bits<5> VA;
  1608. bits<5> VB;
  1609. bits<4> SH;
  1610. let Pattern = pattern;
  1611. let Inst{6-10} = VD;
  1612. let Inst{11-15} = VA;
  1613. let Inst{16-20} = VB;
  1614. let Inst{21} = 0;
  1615. let Inst{22-25} = SH;
  1616. let Inst{26-31} = xo;
  1617. }
  1618. // E-2 VX-Form
  1619. class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1620. InstrItinClass itin, list<dag> pattern>
  1621. : I<4, OOL, IOL, asmstr, itin> {
  1622. bits<5> VD;
  1623. bits<5> VA;
  1624. bits<5> VB;
  1625. let Pattern = pattern;
  1626. let Inst{6-10} = VD;
  1627. let Inst{11-15} = VA;
  1628. let Inst{16-20} = VB;
  1629. let Inst{21-31} = xo;
  1630. }
  1631. class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1632. InstrItinClass itin, list<dag> pattern>
  1633. : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
  1634. let VA = VD;
  1635. let VB = VD;
  1636. }
  1637. class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1638. InstrItinClass itin, list<dag> pattern>
  1639. : I<4, OOL, IOL, asmstr, itin> {
  1640. bits<5> VD;
  1641. bits<5> VB;
  1642. let Pattern = pattern;
  1643. let Inst{6-10} = VD;
  1644. let Inst{11-15} = 0;
  1645. let Inst{16-20} = VB;
  1646. let Inst{21-31} = xo;
  1647. }
  1648. class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1649. InstrItinClass itin, list<dag> pattern>
  1650. : I<4, OOL, IOL, asmstr, itin> {
  1651. bits<5> VD;
  1652. bits<5> IMM;
  1653. let Pattern = pattern;
  1654. let Inst{6-10} = VD;
  1655. let Inst{11-15} = IMM;
  1656. let Inst{16-20} = 0;
  1657. let Inst{21-31} = xo;
  1658. }
  1659. /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
  1660. class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1661. InstrItinClass itin, list<dag> pattern>
  1662. : I<4, OOL, IOL, asmstr, itin> {
  1663. bits<5> VD;
  1664. let Pattern = pattern;
  1665. let Inst{6-10} = VD;
  1666. let Inst{11-15} = 0;
  1667. let Inst{16-20} = 0;
  1668. let Inst{21-31} = xo;
  1669. }
  1670. /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
  1671. class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1672. InstrItinClass itin, list<dag> pattern>
  1673. : I<4, OOL, IOL, asmstr, itin> {
  1674. bits<5> VB;
  1675. let Pattern = pattern;
  1676. let Inst{6-10} = 0;
  1677. let Inst{11-15} = 0;
  1678. let Inst{16-20} = VB;
  1679. let Inst{21-31} = xo;
  1680. }
  1681. // e.g. [PO VRT EO VRB XO]
  1682. class VXForm_RD5_XO5_RS5<bits<11> xo, bits<5> eo, dag OOL, dag IOL,
  1683. string asmstr, InstrItinClass itin, list<dag> pattern>
  1684. : I<4, OOL, IOL, asmstr, itin> {
  1685. bits<5> RD;
  1686. bits<5> VB;
  1687. let Pattern = pattern;
  1688. let Inst{6-10} = RD;
  1689. let Inst{11-15} = eo;
  1690. let Inst{16-20} = VB;
  1691. let Inst{21-31} = xo;
  1692. }
  1693. /// VXForm_CR - VX crypto instructions with "VRT, VRA, ST, SIX"
  1694. class VXForm_CR<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1695. InstrItinClass itin, list<dag> pattern>
  1696. : I<4, OOL, IOL, asmstr, itin> {
  1697. bits<5> VD;
  1698. bits<5> VA;
  1699. bits<1> ST;
  1700. bits<4> SIX;
  1701. let Pattern = pattern;
  1702. let Inst{6-10} = VD;
  1703. let Inst{11-15} = VA;
  1704. let Inst{16} = ST;
  1705. let Inst{17-20} = SIX;
  1706. let Inst{21-31} = xo;
  1707. }
  1708. /// VXForm_BX - VX crypto instructions with "VRT, VRA, 0 - like vsbox"
  1709. class VXForm_BX<bits<11> xo, dag OOL, dag IOL, string asmstr,
  1710. InstrItinClass itin, list<dag> pattern>
  1711. : I<4, OOL, IOL, asmstr, itin> {
  1712. bits<5> VD;
  1713. bits<5> VA;
  1714. let Pattern = pattern;
  1715. let Inst{6-10} = VD;
  1716. let Inst{11-15} = VA;
  1717. let Inst{16-20} = 0;
  1718. let Inst{21-31} = xo;
  1719. }
  1720. // E-4 VXR-Form
  1721. class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
  1722. InstrItinClass itin, list<dag> pattern>
  1723. : I<4, OOL, IOL, asmstr, itin> {
  1724. bits<5> VD;
  1725. bits<5> VA;
  1726. bits<5> VB;
  1727. bit RC = 0;
  1728. let Pattern = pattern;
  1729. let Inst{6-10} = VD;
  1730. let Inst{11-15} = VA;
  1731. let Inst{16-20} = VB;
  1732. let Inst{21} = RC;
  1733. let Inst{22-31} = xo;
  1734. }
  1735. // VX-Form: [PO VRT EO VRB 1 PS XO]
  1736. class VX_RD5_EO5_RS5_PS1_XO9<bits<5> eo, bits<9> xo,
  1737. dag OOL, dag IOL, string asmstr,
  1738. InstrItinClass itin, list<dag> pattern>
  1739. : I<4, OOL, IOL, asmstr, itin> {
  1740. bits<5> VD;
  1741. bits<5> VB;
  1742. bit PS;
  1743. let Pattern = pattern;
  1744. let Inst{6-10} = VD;
  1745. let Inst{11-15} = eo;
  1746. let Inst{16-20} = VB;
  1747. let Inst{21} = 1;
  1748. let Inst{22} = PS;
  1749. let Inst{23-31} = xo;
  1750. }
  1751. // VX-Form: [PO VRT VRA VRB 1 PS XO] or [PO VRT VRA VRB 1 / XO]
  1752. class VX_RD5_RSp5_PS1_XO9<bits<9> xo, dag OOL, dag IOL, string asmstr,
  1753. InstrItinClass itin, list<dag> pattern>
  1754. : I<4, OOL, IOL, asmstr, itin> {
  1755. bits<5> VD;
  1756. bits<5> VA;
  1757. bits<5> VB;
  1758. bit PS;
  1759. let Pattern = pattern;
  1760. let Inst{6-10} = VD;
  1761. let Inst{11-15} = VA;
  1762. let Inst{16-20} = VB;
  1763. let Inst{21} = 1;
  1764. let Inst{22} = PS;
  1765. let Inst{23-31} = xo;
  1766. }
  1767. class Z23Form_8<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
  1768. InstrItinClass itin, list<dag> pattern>
  1769. : I<opcode, OOL, IOL, asmstr, itin> {
  1770. bits<5> VRT;
  1771. bit R;
  1772. bits<5> VRB;
  1773. bits<2> idx;
  1774. let Pattern = pattern;
  1775. bit RC = 0; // set by isRecordForm
  1776. let Inst{6-10} = VRT;
  1777. let Inst{11-14} = 0;
  1778. let Inst{15} = R;
  1779. let Inst{16-20} = VRB;
  1780. let Inst{21-22} = idx;
  1781. let Inst{23-30} = xo;
  1782. let Inst{31} = RC;
  1783. }
  1784. class Z23Form_RTAB5_CY2<bits<6> opcode, bits<8> xo, dag OOL, dag IOL,
  1785. string asmstr, InstrItinClass itin, list<dag> pattern>
  1786. : I<opcode, OOL, IOL, asmstr, itin> {
  1787. bits<5> RT;
  1788. bits<5> RA;
  1789. bits<5> RB;
  1790. bits<2> CY;
  1791. let Pattern = pattern;
  1792. let Inst{6-10} = RT;
  1793. let Inst{11-15} = RA;
  1794. let Inst{16-20} = RB;
  1795. let Inst{21-22} = CY;
  1796. let Inst{23-30} = xo;
  1797. let Inst{31} = 0;
  1798. }
  1799. //===----------------------------------------------------------------------===//
  1800. // EmitTimePseudo won't have encoding information for the [MC]CodeEmitter
  1801. // stuff
  1802. class PPCEmitTimePseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
  1803. : I<0, OOL, IOL, asmstr, NoItinerary> {
  1804. let isCodeGenOnly = 1;
  1805. let PPC64 = 0;
  1806. let Pattern = pattern;
  1807. let Inst{31-0} = 0;
  1808. let hasNoSchedulingInfo = 1;
  1809. }
  1810. // Instruction that require custom insertion support
  1811. // a.k.a. ISelPseudos, however, these won't have isPseudo set
  1812. class PPCCustomInserterPseudo<dag OOL, dag IOL, string asmstr,
  1813. list<dag> pattern>
  1814. : PPCEmitTimePseudo<OOL, IOL, asmstr, pattern> {
  1815. let usesCustomInserter = 1;
  1816. }
  1817. // PostRAPseudo will be expanded in expandPostRAPseudo, isPseudo flag in td
  1818. // files is set only for PostRAPseudo
  1819. class PPCPostRAExpPseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
  1820. : PPCEmitTimePseudo<OOL, IOL, asmstr, pattern> {
  1821. let isPseudo = 1;
  1822. }
  1823. class PseudoXFormMemOp<dag OOL, dag IOL, string asmstr, list<dag> pattern>
  1824. : PPCPostRAExpPseudo<OOL, IOL, asmstr, pattern>, XFormMemOp;