PPCInstr64Bit.td 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  1. //===-- PPCInstr64Bit.td - The PowerPC 64-bit Support ------*- 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 describes the PowerPC 64-bit instructions. These patterns are used
  10. // both when in ppc64 mode and when in "use 64-bit extensions in 32-bit" mode.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //===----------------------------------------------------------------------===//
  14. // 64-bit operands.
  15. //
  16. def s16imm64 : Operand<i64> {
  17. let PrintMethod = "printS16ImmOperand";
  18. let EncoderMethod = "getImm16Encoding";
  19. let ParserMatchClass = PPCS16ImmAsmOperand;
  20. let DecoderMethod = "decodeSImmOperand<16>";
  21. let OperandType = "OPERAND_IMMEDIATE";
  22. }
  23. def u16imm64 : Operand<i64> {
  24. let PrintMethod = "printU16ImmOperand";
  25. let EncoderMethod = "getImm16Encoding";
  26. let ParserMatchClass = PPCU16ImmAsmOperand;
  27. let DecoderMethod = "decodeUImmOperand<16>";
  28. let OperandType = "OPERAND_IMMEDIATE";
  29. }
  30. def s17imm64 : Operand<i64> {
  31. // This operand type is used for addis/lis to allow the assembler parser
  32. // to accept immediates in the range -65536..65535 for compatibility with
  33. // the GNU assembler. The operand is treated as 16-bit otherwise.
  34. let PrintMethod = "printS16ImmOperand";
  35. let EncoderMethod = "getImm16Encoding";
  36. let ParserMatchClass = PPCS17ImmAsmOperand;
  37. let DecoderMethod = "decodeSImmOperand<16>";
  38. let OperandType = "OPERAND_IMMEDIATE";
  39. }
  40. def tocentry : Operand<iPTR> {
  41. let MIOperandInfo = (ops i64imm:$imm);
  42. }
  43. def tlsreg : Operand<i64> {
  44. let EncoderMethod = "getTLSRegEncoding";
  45. let ParserMatchClass = PPCTLSRegOperand;
  46. }
  47. def tlsgd : Operand<i64> {}
  48. def tlscall : Operand<i64> {
  49. let PrintMethod = "printTLSCall";
  50. let MIOperandInfo = (ops calltarget:$func, tlsgd:$sym);
  51. let EncoderMethod = "getTLSCallEncoding";
  52. }
  53. //===----------------------------------------------------------------------===//
  54. // 64-bit transformation functions.
  55. //
  56. def SHL64 : SDNodeXForm<imm, [{
  57. // Transformation function: 63 - imm
  58. return getI32Imm(63 - N->getZExtValue(), SDLoc(N));
  59. }]>;
  60. def SRL64 : SDNodeXForm<imm, [{
  61. // Transformation function: 64 - imm
  62. return N->getZExtValue() ? getI32Imm(64 - N->getZExtValue(), SDLoc(N))
  63. : getI32Imm(0, SDLoc(N));
  64. }]>;
  65. //===----------------------------------------------------------------------===//
  66. // Calls.
  67. //
  68. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  69. let isTerminator = 1, isBarrier = 1, PPC970_Unit = 7 in {
  70. let isReturn = 1, isPredicable = 1, Uses = [LR8, RM] in
  71. def BLR8 : XLForm_2_ext<19, 16, 20, 0, 0, (outs), (ins), "blr", IIC_BrB,
  72. [(retflag)]>, Requires<[In64BitMode]>;
  73. let isBranch = 1, isIndirectBranch = 1, Uses = [CTR8] in {
  74. let isPredicable = 1 in
  75. def BCTR8 : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
  76. []>,
  77. Requires<[In64BitMode]>;
  78. def BCCCTR8 : XLForm_2_br<19, 528, 0, (outs), (ins pred:$cond),
  79. "b${cond:cc}ctr${cond:pm} ${cond:reg}", IIC_BrB,
  80. []>,
  81. Requires<[In64BitMode]>;
  82. def BCCTR8 : XLForm_2_br2<19, 528, 12, 0, (outs), (ins crbitrc:$bi),
  83. "bcctr 12, $bi, 0", IIC_BrB, []>,
  84. Requires<[In64BitMode]>;
  85. def BCCTR8n : XLForm_2_br2<19, 528, 4, 0, (outs), (ins crbitrc:$bi),
  86. "bcctr 4, $bi, 0", IIC_BrB, []>,
  87. Requires<[In64BitMode]>;
  88. }
  89. }
  90. let Defs = [LR8] in
  91. def MovePCtoLR8 : PPCEmitTimePseudo<(outs), (ins), "#MovePCtoLR8", []>,
  92. PPC970_Unit_BRU;
  93. let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7 in {
  94. let Defs = [CTR8], Uses = [CTR8] in {
  95. def BDZ8 : BForm_1<16, 18, 0, 0, (outs), (ins condbrtarget:$dst),
  96. "bdz $dst">;
  97. def BDNZ8 : BForm_1<16, 16, 0, 0, (outs), (ins condbrtarget:$dst),
  98. "bdnz $dst">;
  99. }
  100. let isReturn = 1, Defs = [CTR8], Uses = [CTR8, LR8, RM] in {
  101. def BDZLR8 : XLForm_2_ext<19, 16, 18, 0, 0, (outs), (ins),
  102. "bdzlr", IIC_BrB, []>;
  103. def BDNZLR8 : XLForm_2_ext<19, 16, 16, 0, 0, (outs), (ins),
  104. "bdnzlr", IIC_BrB, []>;
  105. }
  106. }
  107. let isCall = 1, PPC970_Unit = 7, Defs = [LR8] in {
  108. // Convenient aliases for call instructions
  109. let Uses = [RM] in {
  110. def BL8 : IForm<18, 0, 1, (outs), (ins calltarget:$func),
  111. "bl $func", IIC_BrB, []>; // See Pat patterns below.
  112. def BL8_TLS : IForm<18, 0, 1, (outs), (ins tlscall:$func),
  113. "bl $func", IIC_BrB, []>;
  114. def BLA8 : IForm<18, 1, 1, (outs), (ins abscalltarget:$func),
  115. "bla $func", IIC_BrB, [(PPCcall (i64 imm:$func))]>;
  116. }
  117. let Uses = [RM], isCodeGenOnly = 1 in {
  118. def BL8_NOP : IForm_and_DForm_4_zero<18, 0, 1, 24,
  119. (outs), (ins calltarget:$func),
  120. "bl $func\n\tnop", IIC_BrB, []>;
  121. def BL8_NOP_TLS : IForm_and_DForm_4_zero<18, 0, 1, 24,
  122. (outs), (ins tlscall:$func),
  123. "bl $func\n\tnop", IIC_BrB, []>;
  124. def BLA8_NOP : IForm_and_DForm_4_zero<18, 1, 1, 24,
  125. (outs), (ins abscalltarget:$func),
  126. "bla $func\n\tnop", IIC_BrB,
  127. [(PPCcall_nop (i64 imm:$func))]>;
  128. let Predicates = [PCRelativeMemops] in {
  129. // BL8_NOTOC means that the caller does not use the TOC pointer and if
  130. // it does use R2 then it is just a caller saved register. Therefore it is
  131. // safe to emit only the bl and not the nop for this instruction. The
  132. // linker will not try to restore R2 after the call.
  133. def BL8_NOTOC : IForm<18, 0, 1, (outs),
  134. (ins calltarget:$func),
  135. "bl $func", IIC_BrB, []>;
  136. def BL8_NOTOC_TLS : IForm<18, 0, 1, (outs),
  137. (ins tlscall:$func),
  138. "bl $func", IIC_BrB, []>;
  139. }
  140. }
  141. let Uses = [CTR8, RM] in {
  142. let isPredicable = 1 in
  143. def BCTRL8 : XLForm_2_ext<19, 528, 20, 0, 1, (outs), (ins),
  144. "bctrl", IIC_BrB, [(PPCbctrl)]>,
  145. Requires<[In64BitMode]>;
  146. let isCodeGenOnly = 1 in {
  147. def BCCCTRL8 : XLForm_2_br<19, 528, 1, (outs), (ins pred:$cond),
  148. "b${cond:cc}ctrl${cond:pm} ${cond:reg}", IIC_BrB,
  149. []>,
  150. Requires<[In64BitMode]>;
  151. def BCCTRL8 : XLForm_2_br2<19, 528, 12, 1, (outs), (ins crbitrc:$bi),
  152. "bcctrl 12, $bi, 0", IIC_BrB, []>,
  153. Requires<[In64BitMode]>;
  154. def BCCTRL8n : XLForm_2_br2<19, 528, 4, 1, (outs), (ins crbitrc:$bi),
  155. "bcctrl 4, $bi, 0", IIC_BrB, []>,
  156. Requires<[In64BitMode]>;
  157. }
  158. }
  159. }
  160. let isCall = 1, PPC970_Unit = 7, isCodeGenOnly = 1,
  161. Defs = [LR8, X2], Uses = [CTR8, RM], RST = 2 in {
  162. def BCTRL8_LDinto_toc :
  163. XLForm_2_ext_and_DSForm_1<19, 528, 20, 0, 1, 58, 0, (outs),
  164. (ins memrix:$src),
  165. "bctrl\n\tld 2, $src", IIC_BrB,
  166. [(PPCbctrl_load_toc iaddrX4:$src)]>,
  167. Requires<[In64BitMode]>;
  168. }
  169. } // Interpretation64Bit
  170. // FIXME: Duplicating this for the asm parser should be unnecessary, but the
  171. // previous definition must be marked as CodeGen only to prevent decoding
  172. // conflicts.
  173. let Interpretation64Bit = 1, isAsmParserOnly = 1 in
  174. let isCall = 1, PPC970_Unit = 7, Defs = [LR8], Uses = [RM] in
  175. def BL8_TLS_ : IForm<18, 0, 1, (outs), (ins tlscall:$func),
  176. "bl $func", IIC_BrB, []>;
  177. // Calls
  178. def : Pat<(PPCcall (i64 tglobaladdr:$dst)),
  179. (BL8 tglobaladdr:$dst)>;
  180. def : Pat<(PPCcall_nop (i64 tglobaladdr:$dst)),
  181. (BL8_NOP tglobaladdr:$dst)>;
  182. def : Pat<(PPCcall (i64 texternalsym:$dst)),
  183. (BL8 texternalsym:$dst)>;
  184. def : Pat<(PPCcall_nop (i64 texternalsym:$dst)),
  185. (BL8_NOP texternalsym:$dst)>;
  186. def : Pat<(PPCcall_notoc (i64 tglobaladdr:$dst)),
  187. (BL8_NOTOC tglobaladdr:$dst)>;
  188. def : Pat<(PPCcall_notoc (i64 texternalsym:$dst)),
  189. (BL8_NOTOC texternalsym:$dst)>;
  190. // Calls for AIX
  191. def : Pat<(PPCcall (i64 mcsym:$dst)),
  192. (BL8 mcsym:$dst)>;
  193. def : Pat<(PPCcall_nop (i64 mcsym:$dst)),
  194. (BL8_NOP mcsym:$dst)>;
  195. // Atomic operations
  196. // FIXME: some of these might be used with constant operands. This will result
  197. // in constant materialization instructions that may be redundant. We currently
  198. // clean this up in PPCMIPeephole with calls to
  199. // PPCInstrInfo::convertToImmediateForm() but we should probably not emit them
  200. // in the first place.
  201. let Defs = [CR0] in {
  202. def ATOMIC_LOAD_ADD_I64 : PPCCustomInserterPseudo<
  203. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_ADD_I64",
  204. [(set i64:$dst, (atomic_load_add_64 xoaddr:$ptr, i64:$incr))]>;
  205. def ATOMIC_LOAD_SUB_I64 : PPCCustomInserterPseudo<
  206. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_SUB_I64",
  207. [(set i64:$dst, (atomic_load_sub_64 xoaddr:$ptr, i64:$incr))]>;
  208. def ATOMIC_LOAD_OR_I64 : PPCCustomInserterPseudo<
  209. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_OR_I64",
  210. [(set i64:$dst, (atomic_load_or_64 xoaddr:$ptr, i64:$incr))]>;
  211. def ATOMIC_LOAD_XOR_I64 : PPCCustomInserterPseudo<
  212. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_XOR_I64",
  213. [(set i64:$dst, (atomic_load_xor_64 xoaddr:$ptr, i64:$incr))]>;
  214. def ATOMIC_LOAD_AND_I64 : PPCCustomInserterPseudo<
  215. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_AND_i64",
  216. [(set i64:$dst, (atomic_load_and_64 xoaddr:$ptr, i64:$incr))]>;
  217. def ATOMIC_LOAD_NAND_I64 : PPCCustomInserterPseudo<
  218. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_NAND_I64",
  219. [(set i64:$dst, (atomic_load_nand_64 xoaddr:$ptr, i64:$incr))]>;
  220. def ATOMIC_LOAD_MIN_I64 : PPCCustomInserterPseudo<
  221. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_MIN_I64",
  222. [(set i64:$dst, (atomic_load_min_64 xoaddr:$ptr, i64:$incr))]>;
  223. def ATOMIC_LOAD_MAX_I64 : PPCCustomInserterPseudo<
  224. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_MAX_I64",
  225. [(set i64:$dst, (atomic_load_max_64 xoaddr:$ptr, i64:$incr))]>;
  226. def ATOMIC_LOAD_UMIN_I64 : PPCCustomInserterPseudo<
  227. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_UMIN_I64",
  228. [(set i64:$dst, (atomic_load_umin_64 xoaddr:$ptr, i64:$incr))]>;
  229. def ATOMIC_LOAD_UMAX_I64 : PPCCustomInserterPseudo<
  230. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$incr), "#ATOMIC_LOAD_UMAX_I64",
  231. [(set i64:$dst, (atomic_load_umax_64 xoaddr:$ptr, i64:$incr))]>;
  232. def ATOMIC_CMP_SWAP_I64 : PPCCustomInserterPseudo<
  233. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$old, g8rc:$new), "#ATOMIC_CMP_SWAP_I64",
  234. [(set i64:$dst, (atomic_cmp_swap_64 xoaddr:$ptr, i64:$old, i64:$new))]>;
  235. def ATOMIC_SWAP_I64 : PPCCustomInserterPseudo<
  236. (outs g8rc:$dst), (ins memrr:$ptr, g8rc:$new), "#ATOMIC_SWAP_I64",
  237. [(set i64:$dst, (atomic_swap_64 xoaddr:$ptr, i64:$new))]>;
  238. }
  239. // Instructions to support atomic operations
  240. let mayLoad = 1, hasSideEffects = 0 in {
  241. def LDARX : XForm_1_memOp<31, 84, (outs g8rc:$rD), (ins memrr:$ptr),
  242. "ldarx $rD, $ptr", IIC_LdStLDARX, []>;
  243. // Instruction to support lock versions of atomics
  244. // (EH=1 - see Power ISA 2.07 Book II 4.4.2)
  245. def LDARXL : XForm_1<31, 84, (outs g8rc:$rD), (ins memrr:$ptr),
  246. "ldarx $rD, $ptr, 1", IIC_LdStLDARX, []>, isRecordForm;
  247. let hasExtraDefRegAllocReq = 1 in
  248. def LDAT : X_RD5_RS5_IM5<31, 614, (outs g8rc:$rD), (ins g8rc:$rA, u5imm:$FC),
  249. "ldat $rD, $rA, $FC", IIC_LdStLoad>, isPPC64,
  250. Requires<[IsISA3_0]>;
  251. }
  252. let Defs = [CR0], mayStore = 1, mayLoad = 0, hasSideEffects = 0 in
  253. def STDCX : XForm_1_memOp<31, 214, (outs), (ins g8rc:$rS, memrr:$dst),
  254. "stdcx. $rS, $dst", IIC_LdStSTDCX, []>, isRecordForm;
  255. let mayStore = 1, mayLoad = 0, hasSideEffects = 0 in
  256. def STDAT : X_RD5_RS5_IM5<31, 742, (outs), (ins g8rc:$rS, g8rc:$rA, u5imm:$FC),
  257. "stdat $rS, $rA, $FC", IIC_LdStStore>, isPPC64,
  258. Requires<[IsISA3_0]>;
  259. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  260. let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
  261. def TCRETURNdi8 :PPCEmitTimePseudo< (outs),
  262. (ins calltarget:$dst, i32imm:$offset),
  263. "#TC_RETURNd8 $dst $offset",
  264. []>;
  265. let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
  266. def TCRETURNai8 :PPCEmitTimePseudo<(outs), (ins abscalltarget:$func, i32imm:$offset),
  267. "#TC_RETURNa8 $func $offset",
  268. [(PPCtc_return (i64 imm:$func), imm:$offset)]>;
  269. let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
  270. def TCRETURNri8 : PPCEmitTimePseudo<(outs), (ins CTRRC8:$dst, i32imm:$offset),
  271. "#TC_RETURNr8 $dst $offset",
  272. []>;
  273. let isTerminator = 1, isBarrier = 1, PPC970_Unit = 7, isBranch = 1,
  274. isIndirectBranch = 1, isCall = 1, isReturn = 1, Uses = [CTR8, RM] in
  275. def TAILBCTR8 : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
  276. []>,
  277. Requires<[In64BitMode]>;
  278. let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
  279. isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
  280. def TAILB8 : IForm<18, 0, 0, (outs), (ins calltarget:$dst),
  281. "b $dst", IIC_BrB,
  282. []>;
  283. let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
  284. isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
  285. def TAILBA8 : IForm<18, 0, 0, (outs), (ins abscalltarget:$dst),
  286. "ba $dst", IIC_BrB,
  287. []>;
  288. } // Interpretation64Bit
  289. def : Pat<(PPCtc_return (i64 tglobaladdr:$dst), imm:$imm),
  290. (TCRETURNdi8 tglobaladdr:$dst, imm:$imm)>;
  291. def : Pat<(PPCtc_return (i64 texternalsym:$dst), imm:$imm),
  292. (TCRETURNdi8 texternalsym:$dst, imm:$imm)>;
  293. def : Pat<(PPCtc_return CTRRC8:$dst, imm:$imm),
  294. (TCRETURNri8 CTRRC8:$dst, imm:$imm)>;
  295. // 64-bit CR instructions
  296. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  297. let hasSideEffects = 0 in {
  298. // mtocrf's input needs to be prepared by shifting by an amount dependent
  299. // on the cr register selected. Thus, post-ra anti-dep breaking must not
  300. // later change that register assignment.
  301. let hasExtraDefRegAllocReq = 1 in {
  302. def MTOCRF8: XFXForm_5a<31, 144, (outs crbitm:$FXM), (ins g8rc:$ST),
  303. "mtocrf $FXM, $ST", IIC_BrMCRX>,
  304. PPC970_DGroup_First, PPC970_Unit_CRU;
  305. // Similarly to mtocrf, the mask for mtcrf must be prepared in a way that
  306. // is dependent on the cr fields being set.
  307. def MTCRF8 : XFXForm_5<31, 144, (outs), (ins i32imm:$FXM, g8rc:$rS),
  308. "mtcrf $FXM, $rS", IIC_BrMCRX>,
  309. PPC970_MicroCode, PPC970_Unit_CRU;
  310. } // hasExtraDefRegAllocReq = 1
  311. // mfocrf's input needs to be prepared by shifting by an amount dependent
  312. // on the cr register selected. Thus, post-ra anti-dep breaking must not
  313. // later change that register assignment.
  314. let hasExtraSrcRegAllocReq = 1 in {
  315. def MFOCRF8: XFXForm_5a<31, 19, (outs g8rc:$rT), (ins crbitm:$FXM),
  316. "mfocrf $rT, $FXM", IIC_SprMFCRF>,
  317. PPC970_DGroup_First, PPC970_Unit_CRU;
  318. // Similarly to mfocrf, the mask for mfcrf must be prepared in a way that
  319. // is dependent on the cr fields being copied.
  320. def MFCR8 : XFXForm_3<31, 19, (outs g8rc:$rT), (ins),
  321. "mfcr $rT", IIC_SprMFCR>,
  322. PPC970_MicroCode, PPC970_Unit_CRU;
  323. } // hasExtraSrcRegAllocReq = 1
  324. } // hasSideEffects = 0
  325. // While longjmp is a control-flow barrier (fallthrough isn't allowed), setjmp
  326. // is not.
  327. let hasSideEffects = 1 in {
  328. let Defs = [CTR8] in
  329. def EH_SjLj_SetJmp64 : PPCCustomInserterPseudo<(outs gprc:$dst), (ins memr:$buf),
  330. "#EH_SJLJ_SETJMP64",
  331. [(set i32:$dst, (PPCeh_sjlj_setjmp addr:$buf))]>,
  332. Requires<[In64BitMode]>;
  333. }
  334. let hasSideEffects = 1, isBarrier = 1 in {
  335. let isTerminator = 1 in
  336. def EH_SjLj_LongJmp64 : PPCCustomInserterPseudo<(outs), (ins memr:$buf),
  337. "#EH_SJLJ_LONGJMP64",
  338. [(PPCeh_sjlj_longjmp addr:$buf)]>,
  339. Requires<[In64BitMode]>;
  340. }
  341. def MFSPR8 : XFXForm_1<31, 339, (outs g8rc:$RT), (ins i32imm:$SPR),
  342. "mfspr $RT, $SPR", IIC_SprMFSPR>;
  343. def MTSPR8 : XFXForm_1<31, 467, (outs), (ins i32imm:$SPR, g8rc:$RT),
  344. "mtspr $SPR, $RT", IIC_SprMTSPR>;
  345. //===----------------------------------------------------------------------===//
  346. // 64-bit SPR manipulation instrs.
  347. let Uses = [CTR8] in {
  348. def MFCTR8 : XFXForm_1_ext<31, 339, 9, (outs g8rc:$rT), (ins),
  349. "mfctr $rT", IIC_SprMFSPR>,
  350. PPC970_DGroup_First, PPC970_Unit_FXU;
  351. }
  352. let Pattern = [(PPCmtctr i64:$rS)], Defs = [CTR8] in {
  353. def MTCTR8 : XFXForm_7_ext<31, 467, 9, (outs), (ins g8rc:$rS),
  354. "mtctr $rS", IIC_SprMTSPR>,
  355. PPC970_DGroup_First, PPC970_Unit_FXU;
  356. }
  357. let hasSideEffects = 1, Defs = [CTR8] in {
  358. let Pattern = [(int_set_loop_iterations i64:$rS)] in
  359. def MTCTR8loop : XFXForm_7_ext<31, 467, 9, (outs), (ins g8rc:$rS),
  360. "mtctr $rS", IIC_SprMTSPR>,
  361. PPC970_DGroup_First, PPC970_Unit_FXU;
  362. }
  363. let Pattern = [(set i64:$rT, readcyclecounter)] in
  364. def MFTB8 : XFXForm_1_ext<31, 339, 268, (outs g8rc:$rT), (ins),
  365. "mfspr $rT, 268", IIC_SprMFTB>,
  366. PPC970_DGroup_First, PPC970_Unit_FXU;
  367. // Note that encoding mftb using mfspr is now the preferred form,
  368. // and has been since at least ISA v2.03. The mftb instruction has
  369. // now been phased out. Using mfspr, however, is known not to work on
  370. // the POWER3.
  371. let Defs = [X1], Uses = [X1] in
  372. def DYNALLOC8 : PPCEmitTimePseudo<(outs g8rc:$result), (ins g8rc:$negsize, memri:$fpsi),"#DYNALLOC8",
  373. [(set i64:$result,
  374. (PPCdynalloc i64:$negsize, iaddr:$fpsi))]>;
  375. def DYNAREAOFFSET8 : PPCEmitTimePseudo<(outs i64imm:$result), (ins memri:$fpsi), "#DYNAREAOFFSET8",
  376. [(set i64:$result, (PPCdynareaoffset iaddr:$fpsi))]>;
  377. // Probed alloca to support stack clash protection.
  378. let Defs = [X1], Uses = [X1], hasNoSchedulingInfo = 1 in {
  379. def PROBED_ALLOCA_64 : PPCCustomInserterPseudo<(outs g8rc:$result),
  380. (ins g8rc:$negsize, memri:$fpsi), "#PROBED_ALLOCA_64",
  381. [(set i64:$result,
  382. (PPCprobedalloca i64:$negsize, iaddr:$fpsi))]>;
  383. def PREPARE_PROBED_ALLOCA_64 : PPCEmitTimePseudo<(outs
  384. g8rc:$fp, g8rc:$actual_negsize),
  385. (ins g8rc:$negsize, memri:$fpsi), "#PREPARE_PROBED_ALLOCA_64", []>;
  386. def PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_64 : PPCEmitTimePseudo<(outs
  387. g8rc:$fp, g8rc:$actual_negsize),
  388. (ins g8rc:$negsize, memri:$fpsi),
  389. "#PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_64", []>,
  390. RegConstraint<"$actual_negsize = $negsize">;
  391. def PROBED_STACKALLOC_64 : PPCEmitTimePseudo<(outs g8rc:$scratch, g8rc:$temp),
  392. (ins i64imm:$stacksize),
  393. "#PROBED_STACKALLOC_64", []>;
  394. }
  395. let hasSideEffects = 0 in {
  396. let Defs = [LR8] in {
  397. def MTLR8 : XFXForm_7_ext<31, 467, 8, (outs), (ins g8rc:$rS),
  398. "mtlr $rS", IIC_SprMTSPR>,
  399. PPC970_DGroup_First, PPC970_Unit_FXU;
  400. }
  401. let Uses = [LR8] in {
  402. def MFLR8 : XFXForm_1_ext<31, 339, 8, (outs g8rc:$rT), (ins),
  403. "mflr $rT", IIC_SprMFSPR>,
  404. PPC970_DGroup_First, PPC970_Unit_FXU;
  405. }
  406. } // Interpretation64Bit
  407. }
  408. //===----------------------------------------------------------------------===//
  409. // Fixed point instructions.
  410. //
  411. let PPC970_Unit = 1 in { // FXU Operations.
  412. let Interpretation64Bit = 1 in {
  413. let hasSideEffects = 0 in {
  414. let isCodeGenOnly = 1 in {
  415. let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
  416. def LI8 : DForm_2_r0<14, (outs g8rc:$rD), (ins s16imm64:$imm),
  417. "li $rD, $imm", IIC_IntSimple,
  418. [(set i64:$rD, imm64SExt16:$imm)]>;
  419. def LIS8 : DForm_2_r0<15, (outs g8rc:$rD), (ins s17imm64:$imm),
  420. "lis $rD, $imm", IIC_IntSimple,
  421. [(set i64:$rD, imm16ShiftedSExt:$imm)]>;
  422. }
  423. // Logical ops.
  424. let isCommutable = 1 in {
  425. defm NAND8: XForm_6r<31, 476, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  426. "nand", "$rA, $rS, $rB", IIC_IntSimple,
  427. [(set i64:$rA, (not (and i64:$rS, i64:$rB)))]>;
  428. defm AND8 : XForm_6r<31, 28, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  429. "and", "$rA, $rS, $rB", IIC_IntSimple,
  430. [(set i64:$rA, (and i64:$rS, i64:$rB))]>;
  431. } // isCommutable
  432. defm ANDC8: XForm_6r<31, 60, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  433. "andc", "$rA, $rS, $rB", IIC_IntSimple,
  434. [(set i64:$rA, (and i64:$rS, (not i64:$rB)))]>;
  435. let isCommutable = 1 in {
  436. defm OR8 : XForm_6r<31, 444, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  437. "or", "$rA, $rS, $rB", IIC_IntSimple,
  438. [(set i64:$rA, (or i64:$rS, i64:$rB))]>;
  439. defm NOR8 : XForm_6r<31, 124, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  440. "nor", "$rA, $rS, $rB", IIC_IntSimple,
  441. [(set i64:$rA, (not (or i64:$rS, i64:$rB)))]>;
  442. } // isCommutable
  443. defm ORC8 : XForm_6r<31, 412, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  444. "orc", "$rA, $rS, $rB", IIC_IntSimple,
  445. [(set i64:$rA, (or i64:$rS, (not i64:$rB)))]>;
  446. let isCommutable = 1 in {
  447. defm EQV8 : XForm_6r<31, 284, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  448. "eqv", "$rA, $rS, $rB", IIC_IntSimple,
  449. [(set i64:$rA, (not (xor i64:$rS, i64:$rB)))]>;
  450. defm XOR8 : XForm_6r<31, 316, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  451. "xor", "$rA, $rS, $rB", IIC_IntSimple,
  452. [(set i64:$rA, (xor i64:$rS, i64:$rB))]>;
  453. } // let isCommutable = 1
  454. // Logical ops with immediate.
  455. let Defs = [CR0] in {
  456. def ANDI8_rec : DForm_4<28, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  457. "andi. $dst, $src1, $src2", IIC_IntGeneral,
  458. [(set i64:$dst, (and i64:$src1, immZExt16:$src2))]>,
  459. isRecordForm;
  460. def ANDIS8_rec : DForm_4<29, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  461. "andis. $dst, $src1, $src2", IIC_IntGeneral,
  462. [(set i64:$dst, (and i64:$src1, imm16ShiftedZExt:$src2))]>,
  463. isRecordForm;
  464. }
  465. def ORI8 : DForm_4<24, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  466. "ori $dst, $src1, $src2", IIC_IntSimple,
  467. [(set i64:$dst, (or i64:$src1, immZExt16:$src2))]>;
  468. def ORIS8 : DForm_4<25, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  469. "oris $dst, $src1, $src2", IIC_IntSimple,
  470. [(set i64:$dst, (or i64:$src1, imm16ShiftedZExt:$src2))]>;
  471. def XORI8 : DForm_4<26, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  472. "xori $dst, $src1, $src2", IIC_IntSimple,
  473. [(set i64:$dst, (xor i64:$src1, immZExt16:$src2))]>;
  474. def XORIS8 : DForm_4<27, (outs g8rc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  475. "xoris $dst, $src1, $src2", IIC_IntSimple,
  476. [(set i64:$dst, (xor i64:$src1, imm16ShiftedZExt:$src2))]>;
  477. let isCommutable = 1 in
  478. defm ADD8 : XOForm_1rx<31, 266, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  479. "add", "$rT, $rA, $rB", IIC_IntSimple,
  480. [(set i64:$rT, (add i64:$rA, i64:$rB))]>;
  481. // ADD8 has a special form: reg = ADD8(reg, sym@tls) for use by the
  482. // initial-exec thread-local storage model. We need to forbid r0 here -
  483. // while it works for add just fine, the linker can relax this to local-exec
  484. // addi, which won't work for r0.
  485. def ADD8TLS : XOForm_1<31, 266, 0, (outs g8rc:$rT), (ins g8rc_nox0:$rA, tlsreg:$rB),
  486. "add $rT, $rA, $rB", IIC_IntSimple,
  487. [(set i64:$rT, (add i64:$rA, tglobaltlsaddr:$rB))]>;
  488. let mayLoad = 1 in {
  489. def LBZXTLS : XForm_1<31, 87, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  490. "lbzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  491. def LHZXTLS : XForm_1<31, 279, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  492. "lhzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  493. def LWZXTLS : XForm_1<31, 23, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  494. "lwzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  495. def LDXTLS : XForm_1<31, 21, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  496. "ldx $rD, $rA, $rB", IIC_LdStLD, []>, isPPC64;
  497. def LBZXTLS_32 : XForm_1<31, 87, (outs gprc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  498. "lbzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  499. def LHZXTLS_32 : XForm_1<31, 279, (outs gprc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  500. "lhzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  501. def LWZXTLS_32 : XForm_1<31, 23, (outs gprc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  502. "lwzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  503. }
  504. let mayStore = 1 in {
  505. def STBXTLS : XForm_8<31, 215, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  506. "stbx $rS, $rA, $rB", IIC_LdStStore, []>,
  507. PPC970_DGroup_Cracked;
  508. def STHXTLS : XForm_8<31, 407, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  509. "sthx $rS, $rA, $rB", IIC_LdStStore, []>,
  510. PPC970_DGroup_Cracked;
  511. def STWXTLS : XForm_8<31, 151, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  512. "stwx $rS, $rA, $rB", IIC_LdStStore, []>,
  513. PPC970_DGroup_Cracked;
  514. def STDXTLS : XForm_8<31, 149, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  515. "stdx $rS, $rA, $rB", IIC_LdStSTD, []>, isPPC64,
  516. PPC970_DGroup_Cracked;
  517. def STBXTLS_32 : XForm_8<31, 215, (outs), (ins gprc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  518. "stbx $rS, $rA, $rB", IIC_LdStStore, []>,
  519. PPC970_DGroup_Cracked;
  520. def STHXTLS_32 : XForm_8<31, 407, (outs), (ins gprc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  521. "sthx $rS, $rA, $rB", IIC_LdStStore, []>,
  522. PPC970_DGroup_Cracked;
  523. def STWXTLS_32 : XForm_8<31, 151, (outs), (ins gprc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  524. "stwx $rS, $rA, $rB", IIC_LdStStore, []>,
  525. PPC970_DGroup_Cracked;
  526. }
  527. let isCommutable = 1 in
  528. defm ADDC8 : XOForm_1rc<31, 10, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  529. "addc", "$rT, $rA, $rB", IIC_IntGeneral,
  530. [(set i64:$rT, (addc i64:$rA, i64:$rB))]>,
  531. PPC970_DGroup_Cracked;
  532. let Defs = [CARRY] in
  533. def ADDIC8 : DForm_2<12, (outs g8rc:$rD), (ins g8rc:$rA, s16imm64:$imm),
  534. "addic $rD, $rA, $imm", IIC_IntGeneral,
  535. [(set i64:$rD, (addc i64:$rA, imm64SExt16:$imm))]>;
  536. def ADDI8 : DForm_2<14, (outs g8rc:$rD), (ins g8rc_nox0:$rA, s16imm64:$imm),
  537. "addi $rD, $rA, $imm", IIC_IntSimple,
  538. [(set i64:$rD, (add i64:$rA, imm64SExt16:$imm))]>;
  539. def ADDIS8 : DForm_2<15, (outs g8rc:$rD), (ins g8rc_nox0:$rA, s17imm64:$imm),
  540. "addis $rD, $rA, $imm", IIC_IntSimple,
  541. [(set i64:$rD, (add i64:$rA, imm16ShiftedSExt:$imm))]>;
  542. let Defs = [CARRY] in {
  543. def SUBFIC8: DForm_2< 8, (outs g8rc:$rD), (ins g8rc:$rA, s16imm64:$imm),
  544. "subfic $rD, $rA, $imm", IIC_IntGeneral,
  545. [(set i64:$rD, (subc imm64SExt16:$imm, i64:$rA))]>;
  546. }
  547. defm SUBFC8 : XOForm_1rc<31, 8, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  548. "subfc", "$rT, $rA, $rB", IIC_IntGeneral,
  549. [(set i64:$rT, (subc i64:$rB, i64:$rA))]>,
  550. PPC970_DGroup_Cracked;
  551. defm SUBF8 : XOForm_1rx<31, 40, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  552. "subf", "$rT, $rA, $rB", IIC_IntGeneral,
  553. [(set i64:$rT, (sub i64:$rB, i64:$rA))]>;
  554. defm NEG8 : XOForm_3r<31, 104, 0, (outs g8rc:$rT), (ins g8rc:$rA),
  555. "neg", "$rT, $rA", IIC_IntSimple,
  556. [(set i64:$rT, (ineg i64:$rA))]>;
  557. let Uses = [CARRY] in {
  558. let isCommutable = 1 in
  559. defm ADDE8 : XOForm_1rc<31, 138, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  560. "adde", "$rT, $rA, $rB", IIC_IntGeneral,
  561. [(set i64:$rT, (adde i64:$rA, i64:$rB))]>;
  562. defm ADDME8 : XOForm_3rc<31, 234, 0, (outs g8rc:$rT), (ins g8rc:$rA),
  563. "addme", "$rT, $rA", IIC_IntGeneral,
  564. [(set i64:$rT, (adde i64:$rA, -1))]>;
  565. defm ADDZE8 : XOForm_3rc<31, 202, 0, (outs g8rc:$rT), (ins g8rc:$rA),
  566. "addze", "$rT, $rA", IIC_IntGeneral,
  567. [(set i64:$rT, (adde i64:$rA, 0))]>;
  568. defm SUBFE8 : XOForm_1rc<31, 136, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  569. "subfe", "$rT, $rA, $rB", IIC_IntGeneral,
  570. [(set i64:$rT, (sube i64:$rB, i64:$rA))]>;
  571. defm SUBFME8 : XOForm_3rc<31, 232, 0, (outs g8rc:$rT), (ins g8rc:$rA),
  572. "subfme", "$rT, $rA", IIC_IntGeneral,
  573. [(set i64:$rT, (sube -1, i64:$rA))]>;
  574. defm SUBFZE8 : XOForm_3rc<31, 200, 0, (outs g8rc:$rT), (ins g8rc:$rA),
  575. "subfze", "$rT, $rA", IIC_IntGeneral,
  576. [(set i64:$rT, (sube 0, i64:$rA))]>;
  577. }
  578. } // isCodeGenOnly
  579. // FIXME: Duplicating this for the asm parser should be unnecessary, but the
  580. // previous definition must be marked as CodeGen only to prevent decoding
  581. // conflicts.
  582. let isAsmParserOnly = 1 in {
  583. def ADD8TLS_ : XOForm_1<31, 266, 0, (outs g8rc:$rT), (ins g8rc:$rA, tlsreg:$rB),
  584. "add $rT, $rA, $rB", IIC_IntSimple, []>;
  585. let mayLoad = 1 in {
  586. def LBZXTLS_ : XForm_1<31, 87, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  587. "lbzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  588. def LHZXTLS_ : XForm_1<31, 279, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  589. "lhzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  590. def LWZXTLS_ : XForm_1<31, 23, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  591. "lwzx $rD, $rA, $rB", IIC_LdStLoad, []>;
  592. def LDXTLS_ : XForm_1<31, 21, (outs g8rc:$rD), (ins ptr_rc_nor0:$rA, tlsreg:$rB),
  593. "ldx $rD, $rA, $rB", IIC_LdStLD, []>, isPPC64;
  594. }
  595. let mayStore = 1 in {
  596. def STBXTLS_ : XForm_8<31, 215, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  597. "stbx $rS, $rA, $rB", IIC_LdStStore, []>,
  598. PPC970_DGroup_Cracked;
  599. def STHXTLS_ : XForm_8<31, 407, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  600. "sthx $rS, $rA, $rB", IIC_LdStStore, []>,
  601. PPC970_DGroup_Cracked;
  602. def STWXTLS_ : XForm_8<31, 151, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  603. "stwx $rS, $rA, $rB", IIC_LdStStore, []>,
  604. PPC970_DGroup_Cracked;
  605. def STDXTLS_ : XForm_8<31, 149, (outs), (ins g8rc:$rS, ptr_rc_nor0:$rA, tlsreg:$rB),
  606. "stdx $rS, $rA, $rB", IIC_LdStSTD, []>, isPPC64,
  607. PPC970_DGroup_Cracked;
  608. }
  609. }
  610. let isCommutable = 1 in {
  611. defm MULHD : XOForm_1r<31, 73, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  612. "mulhd", "$rT, $rA, $rB", IIC_IntMulHW,
  613. [(set i64:$rT, (mulhs i64:$rA, i64:$rB))]>;
  614. defm MULHDU : XOForm_1r<31, 9, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  615. "mulhdu", "$rT, $rA, $rB", IIC_IntMulHWU,
  616. [(set i64:$rT, (mulhu i64:$rA, i64:$rB))]>;
  617. } // isCommutable
  618. }
  619. } // Interpretation64Bit
  620. let isCompare = 1, hasSideEffects = 0 in {
  621. def CMPD : XForm_16_ext<31, 0, (outs crrc:$crD), (ins g8rc:$rA, g8rc:$rB),
  622. "cmpd $crD, $rA, $rB", IIC_IntCompare>, isPPC64;
  623. def CMPLD : XForm_16_ext<31, 32, (outs crrc:$crD), (ins g8rc:$rA, g8rc:$rB),
  624. "cmpld $crD, $rA, $rB", IIC_IntCompare>, isPPC64;
  625. def CMPDI : DForm_5_ext<11, (outs crrc:$crD), (ins g8rc:$rA, s16imm64:$imm),
  626. "cmpdi $crD, $rA, $imm", IIC_IntCompare>, isPPC64;
  627. def CMPLDI : DForm_6_ext<10, (outs crrc:$dst), (ins g8rc:$src1, u16imm64:$src2),
  628. "cmpldi $dst, $src1, $src2",
  629. IIC_IntCompare>, isPPC64;
  630. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  631. def CMPRB8 : X_BF3_L1_RS5_RS5<31, 192, (outs crbitrc:$BF),
  632. (ins u1imm:$L, g8rc:$rA, g8rc:$rB),
  633. "cmprb $BF, $L, $rA, $rB", IIC_IntCompare, []>,
  634. Requires<[IsISA3_0]>;
  635. def CMPEQB : X_BF3_RS5_RS5<31, 224, (outs crbitrc:$BF),
  636. (ins g8rc:$rA, g8rc:$rB), "cmpeqb $BF, $rA, $rB",
  637. IIC_IntCompare, []>, Requires<[IsISA3_0]>;
  638. }
  639. let hasSideEffects = 0 in {
  640. defm SLD : XForm_6r<31, 27, (outs g8rc:$rA), (ins g8rc:$rS, gprc:$rB),
  641. "sld", "$rA, $rS, $rB", IIC_IntRotateD,
  642. [(set i64:$rA, (PPCshl i64:$rS, i32:$rB))]>, isPPC64;
  643. defm SRD : XForm_6r<31, 539, (outs g8rc:$rA), (ins g8rc:$rS, gprc:$rB),
  644. "srd", "$rA, $rS, $rB", IIC_IntRotateD,
  645. [(set i64:$rA, (PPCsrl i64:$rS, i32:$rB))]>, isPPC64;
  646. defm SRAD : XForm_6rc<31, 794, (outs g8rc:$rA), (ins g8rc:$rS, gprc:$rB),
  647. "srad", "$rA, $rS, $rB", IIC_IntRotateD,
  648. [(set i64:$rA, (PPCsra i64:$rS, i32:$rB))]>, isPPC64;
  649. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  650. defm CNTLZW8 : XForm_11r<31, 26, (outs g8rc:$rA), (ins g8rc:$rS),
  651. "cntlzw", "$rA, $rS", IIC_IntGeneral, []>;
  652. defm CNTTZW8 : XForm_11r<31, 538, (outs g8rc:$rA), (ins g8rc:$rS),
  653. "cnttzw", "$rA, $rS", IIC_IntGeneral, []>,
  654. Requires<[IsISA3_0]>;
  655. defm EXTSB8 : XForm_11r<31, 954, (outs g8rc:$rA), (ins g8rc:$rS),
  656. "extsb", "$rA, $rS", IIC_IntSimple,
  657. [(set i64:$rA, (sext_inreg i64:$rS, i8))]>;
  658. defm EXTSH8 : XForm_11r<31, 922, (outs g8rc:$rA), (ins g8rc:$rS),
  659. "extsh", "$rA, $rS", IIC_IntSimple,
  660. [(set i64:$rA, (sext_inreg i64:$rS, i16))]>;
  661. defm SLW8 : XForm_6r<31, 24, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  662. "slw", "$rA, $rS, $rB", IIC_IntGeneral, []>;
  663. defm SRW8 : XForm_6r<31, 536, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  664. "srw", "$rA, $rS, $rB", IIC_IntGeneral, []>;
  665. } // Interpretation64Bit
  666. // For fast-isel:
  667. let isCodeGenOnly = 1 in {
  668. def EXTSB8_32_64 : XForm_11<31, 954, (outs g8rc:$rA), (ins gprc:$rS),
  669. "extsb $rA, $rS", IIC_IntSimple, []>, isPPC64;
  670. def EXTSH8_32_64 : XForm_11<31, 922, (outs g8rc:$rA), (ins gprc:$rS),
  671. "extsh $rA, $rS", IIC_IntSimple, []>, isPPC64;
  672. } // isCodeGenOnly for fast-isel
  673. defm EXTSW : XForm_11r<31, 986, (outs g8rc:$rA), (ins g8rc:$rS),
  674. "extsw", "$rA, $rS", IIC_IntSimple,
  675. [(set i64:$rA, (sext_inreg i64:$rS, i32))]>, isPPC64;
  676. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  677. defm EXTSW_32_64 : XForm_11r<31, 986, (outs g8rc:$rA), (ins gprc:$rS),
  678. "extsw", "$rA, $rS", IIC_IntSimple,
  679. [(set i64:$rA, (sext i32:$rS))]>, isPPC64;
  680. let isCodeGenOnly = 1 in
  681. def EXTSW_32 : XForm_11<31, 986, (outs gprc:$rA), (ins gprc:$rS),
  682. "extsw $rA, $rS", IIC_IntSimple,
  683. []>, isPPC64;
  684. defm SRADI : XSForm_1rc<31, 413, (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH),
  685. "sradi", "$rA, $rS, $SH", IIC_IntRotateDI,
  686. [(set i64:$rA, (sra i64:$rS, (i32 imm:$SH)))]>, isPPC64;
  687. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  688. defm EXTSWSLI_32_64 : XSForm_1r<31, 445, (outs g8rc:$rA),
  689. (ins gprc:$rS, u6imm:$SH),
  690. "extswsli", "$rA, $rS, $SH", IIC_IntRotateDI,
  691. [(set i64:$rA,
  692. (PPCextswsli i32:$rS, (i32 imm:$SH)))]>,
  693. isPPC64, Requires<[IsISA3_0]>;
  694. defm EXTSWSLI : XSForm_1rc<31, 445, (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH),
  695. "extswsli", "$rA, $rS, $SH", IIC_IntRotateDI,
  696. []>, isPPC64, Requires<[IsISA3_0]>;
  697. // For fast-isel:
  698. let isCodeGenOnly = 1, Defs = [CARRY] in
  699. def SRADI_32 : XSForm_1<31, 413, (outs gprc:$rA), (ins gprc:$rS, u6imm:$SH),
  700. "sradi $rA, $rS, $SH", IIC_IntRotateDI, []>, isPPC64;
  701. defm CNTLZD : XForm_11r<31, 58, (outs g8rc:$rA), (ins g8rc:$rS),
  702. "cntlzd", "$rA, $rS", IIC_IntGeneral,
  703. [(set i64:$rA, (ctlz i64:$rS))]>;
  704. defm CNTTZD : XForm_11r<31, 570, (outs g8rc:$rA), (ins g8rc:$rS),
  705. "cnttzd", "$rA, $rS", IIC_IntGeneral,
  706. [(set i64:$rA, (cttz i64:$rS))]>, Requires<[IsISA3_0]>;
  707. def POPCNTD : XForm_11<31, 506, (outs g8rc:$rA), (ins g8rc:$rS),
  708. "popcntd $rA, $rS", IIC_IntGeneral,
  709. [(set i64:$rA, (ctpop i64:$rS))]>;
  710. def BPERMD : XForm_6<31, 252, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  711. "bpermd $rA, $rS, $rB", IIC_IntGeneral,
  712. [(set i64:$rA, (int_ppc_bpermd g8rc:$rS, g8rc:$rB))]>,
  713. isPPC64, Requires<[HasBPERMD]>;
  714. let isCodeGenOnly = 1, isCommutable = 1 in
  715. def CMPB8 : XForm_6<31, 508, (outs g8rc:$rA), (ins g8rc:$rS, g8rc:$rB),
  716. "cmpb $rA, $rS, $rB", IIC_IntGeneral,
  717. [(set i64:$rA, (PPCcmpb i64:$rS, i64:$rB))]>;
  718. // popcntw also does a population count on the high 32 bits (storing the
  719. // results in the high 32-bits of the output). We'll ignore that here (which is
  720. // safe because we never separately use the high part of the 64-bit registers).
  721. def POPCNTW : XForm_11<31, 378, (outs gprc:$rA), (ins gprc:$rS),
  722. "popcntw $rA, $rS", IIC_IntGeneral,
  723. [(set i32:$rA, (ctpop i32:$rS))]>;
  724. def POPCNTB : XForm_11<31, 122, (outs g8rc:$rA), (ins g8rc:$rS),
  725. "popcntb $rA, $rS", IIC_IntGeneral,
  726. [(set i64:$rA, (int_ppc_popcntb i64:$rS))]>;
  727. defm DIVD : XOForm_1rcr<31, 489, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  728. "divd", "$rT, $rA, $rB", IIC_IntDivD,
  729. [(set i64:$rT, (sdiv i64:$rA, i64:$rB))]>, isPPC64;
  730. defm DIVDU : XOForm_1rcr<31, 457, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  731. "divdu", "$rT, $rA, $rB", IIC_IntDivD,
  732. [(set i64:$rT, (udiv i64:$rA, i64:$rB))]>, isPPC64;
  733. defm DIVDE : XOForm_1rcr<31, 425, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  734. "divde", "$rT, $rA, $rB", IIC_IntDivD,
  735. [(set i64:$rT, (int_ppc_divde g8rc:$rA, g8rc:$rB))]>,
  736. isPPC64, Requires<[HasExtDiv]>;
  737. let Predicates = [IsISA3_0] in {
  738. def MADDHD : VAForm_1a<48, (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC),
  739. "maddhd $RT, $RA, $RB, $RC", IIC_IntMulHD, []>, isPPC64;
  740. def MADDHDU : VAForm_1a<49,
  741. (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC),
  742. "maddhdu $RT, $RA, $RB, $RC", IIC_IntMulHD, []>, isPPC64;
  743. def MADDLD : VAForm_1a<51, (outs gprc :$RT), (ins gprc:$RA, gprc:$RB, gprc:$RC),
  744. "maddld $RT, $RA, $RB, $RC", IIC_IntMulHD,
  745. [(set i32:$RT, (add_without_simm16 (mul_without_simm16 i32:$RA, i32:$RB), i32:$RC))]>,
  746. isPPC64;
  747. def SETB : XForm_44<31, 128, (outs gprc:$RT), (ins crrc:$BFA),
  748. "setb $RT, $BFA", IIC_IntGeneral>, isPPC64;
  749. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  750. def MADDLD8 : VAForm_1a<51,
  751. (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC),
  752. "maddld $RT, $RA, $RB, $RC", IIC_IntMulHD,
  753. [(set i64:$RT, (add_without_simm16 (mul_without_simm16 i64:$RA, i64:$RB), i64:$RC))]>,
  754. isPPC64;
  755. def SETB8 : XForm_44<31, 128, (outs g8rc:$RT), (ins crrc:$BFA),
  756. "setb $RT, $BFA", IIC_IntGeneral>, isPPC64;
  757. }
  758. def DARN : XForm_45<31, 755, (outs g8rc:$RT), (ins u2imm:$L),
  759. "darn $RT, $L", IIC_LdStLD>, isPPC64;
  760. def ADDPCIS : DXForm<19, 2, (outs g8rc:$RT), (ins i32imm:$D),
  761. "addpcis $RT, $D", IIC_BrB, []>, isPPC64;
  762. def MODSD : XForm_8<31, 777, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  763. "modsd $rT, $rA, $rB", IIC_IntDivW,
  764. [(set i64:$rT, (srem i64:$rA, i64:$rB))]>;
  765. def MODUD : XForm_8<31, 265, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  766. "modud $rT, $rA, $rB", IIC_IntDivW,
  767. [(set i64:$rT, (urem i64:$rA, i64:$rB))]>;
  768. }
  769. defm DIVDEU : XOForm_1rcr<31, 393, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  770. "divdeu", "$rT, $rA, $rB", IIC_IntDivD,
  771. [(set i64:$rT, (int_ppc_divdeu g8rc:$rA, g8rc:$rB))]>,
  772. isPPC64, Requires<[HasExtDiv]>;
  773. let isCommutable = 1 in
  774. defm MULLD : XOForm_1rx<31, 233, 0, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB),
  775. "mulld", "$rT, $rA, $rB", IIC_IntMulHD,
  776. [(set i64:$rT, (mul i64:$rA, i64:$rB))]>, isPPC64;
  777. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  778. def MULLI8 : DForm_2<7, (outs g8rc:$rD), (ins g8rc:$rA, s16imm64:$imm),
  779. "mulli $rD, $rA, $imm", IIC_IntMulLI,
  780. [(set i64:$rD, (mul i64:$rA, imm64SExt16:$imm))]>;
  781. }
  782. let hasSideEffects = 0 in {
  783. defm RLDIMI : MDForm_1r<30, 3, (outs g8rc:$rA),
  784. (ins g8rc:$rSi, g8rc:$rS, u6imm:$SH, u6imm:$MBE),
  785. "rldimi", "$rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  786. []>, isPPC64, RegConstraint<"$rSi = $rA">,
  787. NoEncode<"$rSi">;
  788. // Rotate instructions.
  789. defm RLDCL : MDSForm_1r<30, 8,
  790. (outs g8rc:$rA), (ins g8rc:$rS, gprc:$rB, u6imm:$MBE),
  791. "rldcl", "$rA, $rS, $rB, $MBE", IIC_IntRotateD,
  792. []>, isPPC64;
  793. defm RLDCR : MDSForm_1r<30, 9,
  794. (outs g8rc:$rA), (ins g8rc:$rS, gprc:$rB, u6imm:$MBE),
  795. "rldcr", "$rA, $rS, $rB, $MBE", IIC_IntRotateD,
  796. []>, isPPC64;
  797. defm RLDICL : MDForm_1r<30, 0,
  798. (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH, u6imm:$MBE),
  799. "rldicl", "$rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  800. []>, isPPC64;
  801. // For fast-isel:
  802. let isCodeGenOnly = 1 in
  803. def RLDICL_32_64 : MDForm_1<30, 0,
  804. (outs g8rc:$rA),
  805. (ins gprc:$rS, u6imm:$SH, u6imm:$MBE),
  806. "rldicl $rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  807. []>, isPPC64;
  808. // End fast-isel.
  809. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  810. defm RLDICL_32 : MDForm_1r<30, 0,
  811. (outs gprc:$rA),
  812. (ins gprc:$rS, u6imm:$SH, u6imm:$MBE),
  813. "rldicl", "$rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  814. []>, isPPC64;
  815. defm RLDICR : MDForm_1r<30, 1,
  816. (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH, u6imm:$MBE),
  817. "rldicr", "$rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  818. []>, isPPC64;
  819. let isCodeGenOnly = 1 in
  820. def RLDICR_32 : MDForm_1<30, 1,
  821. (outs gprc:$rA), (ins gprc:$rS, u6imm:$SH, u6imm:$MBE),
  822. "rldicr $rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  823. []>, isPPC64;
  824. defm RLDIC : MDForm_1r<30, 2,
  825. (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH, u6imm:$MBE),
  826. "rldic", "$rA, $rS, $SH, $MBE", IIC_IntRotateDI,
  827. []>, isPPC64;
  828. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  829. defm RLWINM8 : MForm_2r<21, (outs g8rc:$rA),
  830. (ins g8rc:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME),
  831. "rlwinm", "$rA, $rS, $SH, $MB, $ME", IIC_IntGeneral,
  832. []>;
  833. defm RLWNM8 : MForm_2r<23, (outs g8rc:$rA),
  834. (ins g8rc:$rS, g8rc:$rB, u5imm:$MB, u5imm:$ME),
  835. "rlwnm", "$rA, $rS, $rB, $MB, $ME", IIC_IntGeneral,
  836. []>;
  837. // RLWIMI can be commuted if the rotate amount is zero.
  838. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  839. defm RLWIMI8 : MForm_2r<20, (outs g8rc:$rA),
  840. (ins g8rc:$rSi, g8rc:$rS, u5imm:$SH, u5imm:$MB,
  841. u5imm:$ME), "rlwimi", "$rA, $rS, $SH, $MB, $ME",
  842. IIC_IntRotate, []>, PPC970_DGroup_Cracked,
  843. RegConstraint<"$rSi = $rA">, NoEncode<"$rSi">;
  844. let isSelect = 1 in
  845. def ISEL8 : AForm_4<31, 15,
  846. (outs g8rc:$rT), (ins g8rc_nox0:$rA, g8rc:$rB, crbitrc:$cond),
  847. "isel $rT, $rA, $rB, $cond", IIC_IntISEL,
  848. []>;
  849. } // Interpretation64Bit
  850. } // hasSideEffects = 0
  851. } // End FXU Operations.
  852. def : InstAlias<"li $rD, $imm", (ADDI8 g8rc:$rD, ZERO8, s16imm64:$imm)>;
  853. def : InstAlias<"lis $rD, $imm", (ADDIS8 g8rc:$rD, ZERO8, s17imm64:$imm)>;
  854. def : InstAlias<"mr $rA, $rB", (OR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
  855. def : InstAlias<"mr. $rA, $rB", (OR8_rec g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
  856. def : InstAlias<"not $rA, $rB", (NOR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
  857. def : InstAlias<"not. $rA, $rB", (NOR8_rec g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
  858. def : InstAlias<"mtcr $rA", (MTCRF8 255, g8rc:$rA)>;
  859. def : InstAlias<"sub $rA, $rB, $rC", (SUBF8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
  860. def : InstAlias<"sub. $rA, $rB, $rC", (SUBF8_rec g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
  861. def : InstAlias<"subc $rA, $rB, $rC", (SUBFC8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
  862. def : InstAlias<"subc. $rA, $rB, $rC", (SUBFC8_rec g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
  863. def : InstAlias<"rotlwi $rA, $rS, $n", (RLWINM8 g8rc:$rA, g8rc:$rS, u5imm:$n, 0, 31)>;
  864. def : InstAlias<"rotlwi. $rA, $rS, $n", (RLWINM8_rec g8rc:$rA, g8rc:$rS, u5imm:$n, 0, 31)>;
  865. def : InstAlias<"rotlw $rA, $rS, $rB", (RLWNM8 g8rc:$rA, g8rc:$rS, g8rc:$rB, 0, 31)>;
  866. def : InstAlias<"rotlw. $rA, $rS, $rB", (RLWNM8_rec g8rc:$rA, g8rc:$rS, g8rc:$rB, 0, 31)>;
  867. def : InstAlias<"clrlwi $rA, $rS, $n", (RLWINM8 g8rc:$rA, g8rc:$rS, 0, u5imm:$n, 31)>;
  868. def : InstAlias<"clrlwi. $rA, $rS, $n", (RLWINM8_rec g8rc:$rA, g8rc:$rS, 0, u5imm:$n, 31)>;
  869. def : InstAlias<"isellt $rT, $rA, $rB",
  870. (ISEL8 g8rc:$rT, g8rc_nox0:$rA, g8rc:$rB, CR0LT)>;
  871. def : InstAlias<"iselgt $rT, $rA, $rB",
  872. (ISEL8 g8rc:$rT, g8rc_nox0:$rA, g8rc:$rB, CR0GT)>;
  873. def : InstAlias<"iseleq $rT, $rA, $rB",
  874. (ISEL8 g8rc:$rT, g8rc_nox0:$rA, g8rc:$rB, CR0EQ)>;
  875. def : InstAlias<"nop", (ORI8 X0, X0, 0)>;
  876. def : InstAlias<"xnop", (XORI8 X0, X0, 0)>;
  877. def : InstAlias<"cntlzw $rA, $rS", (CNTLZW8 g8rc:$rA, g8rc:$rS)>;
  878. def : InstAlias<"cntlzw. $rA, $rS", (CNTLZW8_rec g8rc:$rA, g8rc:$rS)>;
  879. def : InstAlias<"mtxer $Rx", (MTSPR8 1, g8rc:$Rx)>;
  880. def : InstAlias<"mfxer $Rx", (MFSPR8 g8rc:$Rx, 1)>;
  881. //Disable this alias on AIX for now because as does not support them.
  882. let Predicates = [ModernAs] in {
  883. def : InstAlias<"mtudscr $Rx", (MTSPR8 3, g8rc:$Rx)>;
  884. def : InstAlias<"mfudscr $Rx", (MFSPR8 g8rc:$Rx, 3)>;
  885. }
  886. def : InstAlias<"mfrtcu $Rx", (MFSPR8 g8rc:$Rx, 4)>;
  887. def : InstAlias<"mfrtcl $Rx", (MFSPR8 g8rc:$Rx, 5)>;
  888. def : InstAlias<"mtlr $Rx", (MTSPR8 8, g8rc:$Rx)>;
  889. def : InstAlias<"mflr $Rx", (MFSPR8 g8rc:$Rx, 8)>;
  890. def : InstAlias<"mtctr $Rx", (MTSPR8 9, g8rc:$Rx)>;
  891. def : InstAlias<"mfctr $Rx", (MFSPR8 g8rc:$Rx, 9)>;
  892. def : InstAlias<"mtuamr $Rx", (MTSPR8 13, g8rc:$Rx)>;
  893. def : InstAlias<"mfuamr $Rx", (MFSPR8 g8rc:$Rx, 13)>;
  894. def : InstAlias<"mtdscr $Rx", (MTSPR8 17, g8rc:$Rx)>;
  895. def : InstAlias<"mfdscr $Rx", (MFSPR8 g8rc:$Rx, 17)>;
  896. def : InstAlias<"mtdsisr $Rx", (MTSPR8 18, g8rc:$Rx)>;
  897. def : InstAlias<"mfdsisr $Rx", (MFSPR8 g8rc:$Rx, 18)>;
  898. def : InstAlias<"mtdar $Rx", (MTSPR8 19, g8rc:$Rx)>;
  899. def : InstAlias<"mfdar $Rx", (MFSPR8 g8rc:$Rx, 19)>;
  900. def : InstAlias<"mtdec $Rx", (MTSPR8 22, g8rc:$Rx)>;
  901. def : InstAlias<"mfdec $Rx", (MFSPR8 g8rc:$Rx, 22)>;
  902. def : InstAlias<"mtsdr1 $Rx", (MTSPR8 25, g8rc:$Rx)>;
  903. def : InstAlias<"mfsdr1 $Rx", (MFSPR8 g8rc:$Rx, 25)>;
  904. def : InstAlias<"mtsrr0 $Rx", (MTSPR8 26, g8rc:$Rx)>;
  905. def : InstAlias<"mfsrr0 $Rx", (MFSPR8 g8rc:$Rx, 26)>;
  906. def : InstAlias<"mtsrr1 $Rx", (MTSPR8 27, g8rc:$Rx)>;
  907. def : InstAlias<"mfsrr1 $Rx", (MFSPR8 g8rc:$Rx, 27)>;
  908. def : InstAlias<"mtcfar $Rx", (MTSPR8 28, g8rc:$Rx)>;
  909. def : InstAlias<"mfcfar $Rx", (MFSPR8 g8rc:$Rx, 28)>;
  910. def : InstAlias<"mtamr $Rx", (MTSPR8 29, g8rc:$Rx)>;
  911. def : InstAlias<"mfamr $Rx", (MFSPR8 g8rc:$Rx, 29)>;
  912. foreach SPRG = 0-3 in {
  913. def : InstAlias<"mfsprg $RT, "#SPRG, (MFSPR8 g8rc:$RT, !add(SPRG, 272))>;
  914. def : InstAlias<"mfsprg"#SPRG#" $RT", (MFSPR8 g8rc:$RT, !add(SPRG, 272))>;
  915. def : InstAlias<"mtsprg "#SPRG#", $RT", (MTSPR8 !add(SPRG, 272), g8rc:$RT)>;
  916. def : InstAlias<"mtsprg"#SPRG#" $RT", (MTSPR8 !add(SPRG, 272), g8rc:$RT)>;
  917. }
  918. def : InstAlias<"mfasr $RT", (MFSPR8 g8rc:$RT, 280)>;
  919. def : InstAlias<"mtasr $RT", (MTSPR8 280, g8rc:$RT)>;
  920. def : InstAlias<"mttbl $Rx", (MTSPR8 284, g8rc:$Rx)>;
  921. def : InstAlias<"mttbu $Rx", (MTSPR8 285, g8rc:$Rx)>;
  922. def : InstAlias<"mfpvr $RT", (MFSPR8 g8rc:$RT, 287)>;
  923. def : InstAlias<"mfspefscr $Rx", (MFSPR8 g8rc:$Rx, 512)>;
  924. def : InstAlias<"mtspefscr $Rx", (MTSPR8 512, g8rc:$Rx)>;
  925. //===----------------------------------------------------------------------===//
  926. // Load/Store instructions.
  927. //
  928. // Sign extending loads.
  929. let PPC970_Unit = 2 in {
  930. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  931. def LHA8: DForm_1<42, (outs g8rc:$rD), (ins memri:$src),
  932. "lha $rD, $src", IIC_LdStLHA,
  933. [(set i64:$rD, (sextloadi16 iaddr:$src))]>,
  934. PPC970_DGroup_Cracked;
  935. def LWA : DSForm_1<58, 2, (outs g8rc:$rD), (ins memrix:$src),
  936. "lwa $rD, $src", IIC_LdStLWA,
  937. [(set i64:$rD,
  938. (DSFormSextLoadi32 iaddrX4:$src))]>, isPPC64,
  939. PPC970_DGroup_Cracked;
  940. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  941. def LHAX8: XForm_1_memOp<31, 343, (outs g8rc:$rD), (ins memrr:$src),
  942. "lhax $rD, $src", IIC_LdStLHA,
  943. [(set i64:$rD, (sextloadi16 xaddr:$src))]>,
  944. PPC970_DGroup_Cracked;
  945. def LWAX : XForm_1_memOp<31, 341, (outs g8rc:$rD), (ins memrr:$src),
  946. "lwax $rD, $src", IIC_LdStLHA,
  947. [(set i64:$rD, (sextloadi32 xaddrX4:$src))]>, isPPC64,
  948. PPC970_DGroup_Cracked;
  949. // For fast-isel:
  950. let isCodeGenOnly = 1, mayLoad = 1, hasSideEffects = 0 in {
  951. def LWA_32 : DSForm_1<58, 2, (outs gprc:$rD), (ins memrix:$src),
  952. "lwa $rD, $src", IIC_LdStLWA, []>, isPPC64,
  953. PPC970_DGroup_Cracked;
  954. def LWAX_32 : XForm_1_memOp<31, 341, (outs gprc:$rD), (ins memrr:$src),
  955. "lwax $rD, $src", IIC_LdStLHA, []>, isPPC64,
  956. PPC970_DGroup_Cracked;
  957. } // end fast-isel isCodeGenOnly
  958. // Update forms.
  959. let mayLoad = 1, hasSideEffects = 0 in {
  960. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  961. def LHAU8 : DForm_1<43, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  962. (ins memri:$addr),
  963. "lhau $rD, $addr", IIC_LdStLHAU,
  964. []>, RegConstraint<"$addr.reg = $ea_result">,
  965. NoEncode<"$ea_result">;
  966. // NO LWAU!
  967. let Interpretation64Bit = 1, isCodeGenOnly = 1 in
  968. def LHAUX8 : XForm_1_memOp<31, 375, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  969. (ins memrr:$addr),
  970. "lhaux $rD, $addr", IIC_LdStLHAUX,
  971. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  972. NoEncode<"$ea_result">;
  973. def LWAUX : XForm_1_memOp<31, 373, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  974. (ins memrr:$addr),
  975. "lwaux $rD, $addr", IIC_LdStLHAUX,
  976. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  977. NoEncode<"$ea_result">, isPPC64;
  978. }
  979. }
  980. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  981. // Zero extending loads.
  982. let PPC970_Unit = 2 in {
  983. def LBZ8 : DForm_1<34, (outs g8rc:$rD), (ins memri:$src),
  984. "lbz $rD, $src", IIC_LdStLoad,
  985. [(set i64:$rD, (zextloadi8 iaddr:$src))]>;
  986. def LHZ8 : DForm_1<40, (outs g8rc:$rD), (ins memri:$src),
  987. "lhz $rD, $src", IIC_LdStLoad,
  988. [(set i64:$rD, (zextloadi16 iaddr:$src))]>;
  989. def LWZ8 : DForm_1<32, (outs g8rc:$rD), (ins memri:$src),
  990. "lwz $rD, $src", IIC_LdStLoad,
  991. [(set i64:$rD, (zextloadi32 iaddr:$src))]>, isPPC64;
  992. def LBZX8 : XForm_1_memOp<31, 87, (outs g8rc:$rD), (ins memrr:$src),
  993. "lbzx $rD, $src", IIC_LdStLoad,
  994. [(set i64:$rD, (zextloadi8 xaddr:$src))]>;
  995. def LHZX8 : XForm_1_memOp<31, 279, (outs g8rc:$rD), (ins memrr:$src),
  996. "lhzx $rD, $src", IIC_LdStLoad,
  997. [(set i64:$rD, (zextloadi16 xaddr:$src))]>;
  998. def LWZX8 : XForm_1_memOp<31, 23, (outs g8rc:$rD), (ins memrr:$src),
  999. "lwzx $rD, $src", IIC_LdStLoad,
  1000. [(set i64:$rD, (zextloadi32 xaddr:$src))]>;
  1001. // Update forms.
  1002. let mayLoad = 1, hasSideEffects = 0 in {
  1003. def LBZU8 : DForm_1<35, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1004. (ins memri:$addr),
  1005. "lbzu $rD, $addr", IIC_LdStLoadUpd,
  1006. []>, RegConstraint<"$addr.reg = $ea_result">,
  1007. NoEncode<"$ea_result">;
  1008. def LHZU8 : DForm_1<41, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1009. (ins memri:$addr),
  1010. "lhzu $rD, $addr", IIC_LdStLoadUpd,
  1011. []>, RegConstraint<"$addr.reg = $ea_result">,
  1012. NoEncode<"$ea_result">;
  1013. def LWZU8 : DForm_1<33, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1014. (ins memri:$addr),
  1015. "lwzu $rD, $addr", IIC_LdStLoadUpd,
  1016. []>, RegConstraint<"$addr.reg = $ea_result">,
  1017. NoEncode<"$ea_result">;
  1018. def LBZUX8 : XForm_1_memOp<31, 119, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1019. (ins memrr:$addr),
  1020. "lbzux $rD, $addr", IIC_LdStLoadUpdX,
  1021. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  1022. NoEncode<"$ea_result">;
  1023. def LHZUX8 : XForm_1_memOp<31, 311, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1024. (ins memrr:$addr),
  1025. "lhzux $rD, $addr", IIC_LdStLoadUpdX,
  1026. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  1027. NoEncode<"$ea_result">;
  1028. def LWZUX8 : XForm_1_memOp<31, 55, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1029. (ins memrr:$addr),
  1030. "lwzux $rD, $addr", IIC_LdStLoadUpdX,
  1031. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  1032. NoEncode<"$ea_result">;
  1033. }
  1034. }
  1035. } // Interpretation64Bit
  1036. // Full 8-byte loads.
  1037. let PPC970_Unit = 2 in {
  1038. def LD : DSForm_1<58, 0, (outs g8rc:$rD), (ins memrix:$src),
  1039. "ld $rD, $src", IIC_LdStLD,
  1040. [(set i64:$rD, (DSFormLoad iaddrX4:$src))]>, isPPC64;
  1041. // The following four definitions are selected for small code model only.
  1042. // Otherwise, we need to create two instructions to form a 32-bit offset,
  1043. // so we have a custom matcher for TOC_ENTRY in PPCDAGToDAGIsel::Select().
  1044. def LDtoc: PPCEmitTimePseudo<(outs g8rc:$rD), (ins tocentry:$disp, g8rc:$reg),
  1045. "#LDtoc",
  1046. [(set i64:$rD,
  1047. (PPCtoc_entry tglobaladdr:$disp, i64:$reg))]>, isPPC64;
  1048. def LDtocJTI: PPCEmitTimePseudo<(outs g8rc:$rD), (ins tocentry:$disp, g8rc:$reg),
  1049. "#LDtocJTI",
  1050. [(set i64:$rD,
  1051. (PPCtoc_entry tjumptable:$disp, i64:$reg))]>, isPPC64;
  1052. def LDtocCPT: PPCEmitTimePseudo<(outs g8rc:$rD), (ins tocentry:$disp, g8rc:$reg),
  1053. "#LDtocCPT",
  1054. [(set i64:$rD,
  1055. (PPCtoc_entry tconstpool:$disp, i64:$reg))]>, isPPC64;
  1056. def LDtocBA: PPCEmitTimePseudo<(outs g8rc:$rD), (ins tocentry:$disp, g8rc:$reg),
  1057. "#LDtocCPT",
  1058. [(set i64:$rD,
  1059. (PPCtoc_entry tblockaddress:$disp, i64:$reg))]>, isPPC64;
  1060. def LDX : XForm_1_memOp<31, 21, (outs g8rc:$rD), (ins memrr:$src),
  1061. "ldx $rD, $src", IIC_LdStLD,
  1062. [(set i64:$rD, (load xaddrX4:$src))]>, isPPC64;
  1063. def LDBRX : XForm_1_memOp<31, 532, (outs g8rc:$rD), (ins memrr:$src),
  1064. "ldbrx $rD, $src", IIC_LdStLoad,
  1065. [(set i64:$rD, (PPClbrx xoaddr:$src, i64))]>, isPPC64;
  1066. let mayLoad = 1, hasSideEffects = 0, isCodeGenOnly = 1 in {
  1067. def LHBRX8 : XForm_1_memOp<31, 790, (outs g8rc:$rD), (ins memrr:$src),
  1068. "lhbrx $rD, $src", IIC_LdStLoad, []>;
  1069. def LWBRX8 : XForm_1_memOp<31, 534, (outs g8rc:$rD), (ins memrr:$src),
  1070. "lwbrx $rD, $src", IIC_LdStLoad, []>;
  1071. }
  1072. let mayLoad = 1, hasSideEffects = 0 in {
  1073. def LDU : DSForm_1<58, 1, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1074. (ins memrix:$addr),
  1075. "ldu $rD, $addr", IIC_LdStLDU,
  1076. []>, RegConstraint<"$addr.reg = $ea_result">, isPPC64,
  1077. NoEncode<"$ea_result">;
  1078. def LDUX : XForm_1_memOp<31, 53, (outs g8rc:$rD, ptr_rc_nor0:$ea_result),
  1079. (ins memrr:$addr),
  1080. "ldux $rD, $addr", IIC_LdStLDUX,
  1081. []>, RegConstraint<"$addr.ptrreg = $ea_result">,
  1082. NoEncode<"$ea_result">, isPPC64;
  1083. def LDMX : XForm_1<31, 309, (outs g8rc:$rD), (ins memrr:$src),
  1084. "ldmx $rD, $src", IIC_LdStLD, []>, isPPC64,
  1085. Requires<[IsISA3_0]>;
  1086. }
  1087. }
  1088. // Support for medium and large code model.
  1089. let hasSideEffects = 0 in {
  1090. let isReMaterializable = 1 in {
  1091. def ADDIStocHA8: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, tocentry:$disp),
  1092. "#ADDIStocHA8", []>, isPPC64;
  1093. def ADDItocL: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, tocentry:$disp),
  1094. "#ADDItocL", []>, isPPC64;
  1095. }
  1096. let mayLoad = 1 in
  1097. def LDtocL: PPCEmitTimePseudo<(outs g8rc:$rD), (ins tocentry:$disp, g8rc_nox0:$reg),
  1098. "#LDtocL", []>, isPPC64;
  1099. }
  1100. // Support for thread-local storage.
  1101. def ADDISgotTprelHA: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1102. "#ADDISgotTprelHA",
  1103. [(set i64:$rD,
  1104. (PPCaddisGotTprelHA i64:$reg,
  1105. tglobaltlsaddr:$disp))]>,
  1106. isPPC64;
  1107. def LDgotTprelL: PPCEmitTimePseudo<(outs g8rc_nox0:$rD), (ins s16imm64:$disp, g8rc_nox0:$reg),
  1108. "#LDgotTprelL",
  1109. [(set i64:$rD,
  1110. (PPCldGotTprelL tglobaltlsaddr:$disp, i64:$reg))]>,
  1111. isPPC64;
  1112. let Defs = [CR7], Itinerary = IIC_LdStSync in
  1113. def CFENCE8 : PPCPostRAExpPseudo<(outs), (ins g8rc:$cr), "#CFENCE8", []>;
  1114. def : Pat<(PPCaddTls i64:$in, tglobaltlsaddr:$g),
  1115. (ADD8TLS $in, tglobaltlsaddr:$g)>;
  1116. def ADDIStlsgdHA: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1117. "#ADDIStlsgdHA",
  1118. [(set i64:$rD,
  1119. (PPCaddisTlsgdHA i64:$reg, tglobaltlsaddr:$disp))]>,
  1120. isPPC64;
  1121. def ADDItlsgdL : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1122. "#ADDItlsgdL",
  1123. [(set i64:$rD,
  1124. (PPCaddiTlsgdL i64:$reg, tglobaltlsaddr:$disp))]>,
  1125. isPPC64;
  1126. class GETtlsADDRPseudo <string asmstr> : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc:$reg, tlsgd:$sym),
  1127. asmstr,
  1128. [(set i64:$rD,
  1129. (PPCgetTlsAddr i64:$reg, tglobaltlsaddr:$sym))]>,
  1130. isPPC64;
  1131. class GETtlsldADDRPseudo <string asmstr> : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc:$reg, tlsgd:$sym),
  1132. asmstr,
  1133. [(set i64:$rD,
  1134. (PPCgetTlsldAddr i64:$reg, tglobaltlsaddr:$sym))]>,
  1135. isPPC64;
  1136. let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1 in {
  1137. // LR8 is a true define, while the rest of the Defs are clobbers. X3 is
  1138. // explicitly defined when this op is created, so not mentioned here.
  1139. // This is lowered to BL8_NOP_TLS by the assembly printer, so the size must be
  1140. // correct because the branch select pass is relying on it.
  1141. let Defs = [X0,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7], Size = 8 in
  1142. def GETtlsADDR : GETtlsADDRPseudo <"#GETtlsADDR">;
  1143. let Defs = [X0,X2,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7], Size = 8 in
  1144. def GETtlsADDRPCREL : GETtlsADDRPseudo <"#GETtlsADDRPCREL">;
  1145. // LR8 is a true define, while the rest of the Defs are clobbers. X3 is
  1146. // explicitly defined when this op is created, so not mentioned here.
  1147. let Defs = [X0,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7] in
  1148. def GETtlsldADDR : GETtlsldADDRPseudo <"#GETtlsldADDR">;
  1149. let Defs = [X0,X2,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7] in
  1150. def GETtlsldADDRPCREL : GETtlsldADDRPseudo <"#GETtlsldADDRPCREL">;
  1151. }
  1152. // Combined op for ADDItlsgdL and GETtlsADDR, late expanded. X3 and LR8
  1153. // are true defines while the rest of the Defs are clobbers.
  1154. let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
  1155. Defs = [X0,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7]
  1156. in
  1157. def ADDItlsgdLADDR : PPCEmitTimePseudo<(outs g8rc:$rD),
  1158. (ins g8rc_nox0:$reg, s16imm64:$disp, tlsgd:$sym),
  1159. "#ADDItlsgdLADDR",
  1160. [(set i64:$rD,
  1161. (PPCaddiTlsgdLAddr i64:$reg,
  1162. tglobaltlsaddr:$disp,
  1163. tglobaltlsaddr:$sym))]>,
  1164. isPPC64;
  1165. def ADDIStlsldHA: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1166. "#ADDIStlsldHA",
  1167. [(set i64:$rD,
  1168. (PPCaddisTlsldHA i64:$reg, tglobaltlsaddr:$disp))]>,
  1169. isPPC64;
  1170. def ADDItlsldL : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1171. "#ADDItlsldL",
  1172. [(set i64:$rD,
  1173. (PPCaddiTlsldL i64:$reg, tglobaltlsaddr:$disp))]>,
  1174. isPPC64;
  1175. // Combined op for ADDItlsldL and GETtlsADDR, late expanded. X3 and LR8
  1176. // are true defines, while the rest of the Defs are clobbers.
  1177. let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
  1178. Defs = [X0,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,LR8,CTR8,CR0,CR1,CR5,CR6,CR7]
  1179. in
  1180. def ADDItlsldLADDR : PPCEmitTimePseudo<(outs g8rc:$rD),
  1181. (ins g8rc_nox0:$reg, s16imm64:$disp, tlsgd:$sym),
  1182. "#ADDItlsldLADDR",
  1183. [(set i64:$rD,
  1184. (PPCaddiTlsldLAddr i64:$reg,
  1185. tglobaltlsaddr:$disp,
  1186. tglobaltlsaddr:$sym))]>,
  1187. isPPC64;
  1188. def ADDISdtprelHA: PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1189. "#ADDISdtprelHA",
  1190. [(set i64:$rD,
  1191. (PPCaddisDtprelHA i64:$reg,
  1192. tglobaltlsaddr:$disp))]>,
  1193. isPPC64;
  1194. def ADDIdtprelL : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1195. "#ADDIdtprelL",
  1196. [(set i64:$rD,
  1197. (PPCaddiDtprelL i64:$reg, tglobaltlsaddr:$disp))]>,
  1198. isPPC64;
  1199. def PADDIdtprel : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
  1200. "#PADDIdtprel",
  1201. [(set i64:$rD,
  1202. (PPCpaddiDtprel i64:$reg, tglobaltlsaddr:$disp))]>,
  1203. isPPC64;
  1204. let PPC970_Unit = 2 in {
  1205. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  1206. // Truncating stores.
  1207. def STB8 : DForm_1<38, (outs), (ins g8rc:$rS, memri:$src),
  1208. "stb $rS, $src", IIC_LdStStore,
  1209. [(truncstorei8 i64:$rS, iaddr:$src)]>;
  1210. def STH8 : DForm_1<44, (outs), (ins g8rc:$rS, memri:$src),
  1211. "sth $rS, $src", IIC_LdStStore,
  1212. [(truncstorei16 i64:$rS, iaddr:$src)]>;
  1213. def STW8 : DForm_1<36, (outs), (ins g8rc:$rS, memri:$src),
  1214. "stw $rS, $src", IIC_LdStStore,
  1215. [(truncstorei32 i64:$rS, iaddr:$src)]>;
  1216. def STBX8 : XForm_8_memOp<31, 215, (outs), (ins g8rc:$rS, memrr:$dst),
  1217. "stbx $rS, $dst", IIC_LdStStore,
  1218. [(truncstorei8 i64:$rS, xaddr:$dst)]>,
  1219. PPC970_DGroup_Cracked;
  1220. def STHX8 : XForm_8_memOp<31, 407, (outs), (ins g8rc:$rS, memrr:$dst),
  1221. "sthx $rS, $dst", IIC_LdStStore,
  1222. [(truncstorei16 i64:$rS, xaddr:$dst)]>,
  1223. PPC970_DGroup_Cracked;
  1224. def STWX8 : XForm_8_memOp<31, 151, (outs), (ins g8rc:$rS, memrr:$dst),
  1225. "stwx $rS, $dst", IIC_LdStStore,
  1226. [(truncstorei32 i64:$rS, xaddr:$dst)]>,
  1227. PPC970_DGroup_Cracked;
  1228. } // Interpretation64Bit
  1229. // Normal 8-byte stores.
  1230. def STD : DSForm_1<62, 0, (outs), (ins g8rc:$rS, memrix:$dst),
  1231. "std $rS, $dst", IIC_LdStSTD,
  1232. [(DSFormStore i64:$rS, iaddrX4:$dst)]>, isPPC64;
  1233. def STDX : XForm_8_memOp<31, 149, (outs), (ins g8rc:$rS, memrr:$dst),
  1234. "stdx $rS, $dst", IIC_LdStSTD,
  1235. [(store i64:$rS, xaddrX4:$dst)]>, isPPC64,
  1236. PPC970_DGroup_Cracked;
  1237. def STDBRX: XForm_8_memOp<31, 660, (outs), (ins g8rc:$rS, memrr:$dst),
  1238. "stdbrx $rS, $dst", IIC_LdStStore,
  1239. [(PPCstbrx i64:$rS, xoaddr:$dst, i64)]>, isPPC64,
  1240. PPC970_DGroup_Cracked;
  1241. }
  1242. // Stores with Update (pre-inc).
  1243. let PPC970_Unit = 2, mayStore = 1, mayLoad = 0 in {
  1244. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  1245. def STBU8 : DForm_1<39, (outs ptr_rc_nor0:$ea_res), (ins g8rc:$rS, memri:$dst),
  1246. "stbu $rS, $dst", IIC_LdStSTU, []>,
  1247. RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
  1248. def STHU8 : DForm_1<45, (outs ptr_rc_nor0:$ea_res), (ins g8rc:$rS, memri:$dst),
  1249. "sthu $rS, $dst", IIC_LdStSTU, []>,
  1250. RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
  1251. def STWU8 : DForm_1<37, (outs ptr_rc_nor0:$ea_res), (ins g8rc:$rS, memri:$dst),
  1252. "stwu $rS, $dst", IIC_LdStSTU, []>,
  1253. RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
  1254. def STBUX8: XForm_8_memOp<31, 247, (outs ptr_rc_nor0:$ea_res),
  1255. (ins g8rc:$rS, memrr:$dst),
  1256. "stbux $rS, $dst", IIC_LdStSTUX, []>,
  1257. RegConstraint<"$dst.ptrreg = $ea_res">,
  1258. NoEncode<"$ea_res">,
  1259. PPC970_DGroup_Cracked;
  1260. def STHUX8: XForm_8_memOp<31, 439, (outs ptr_rc_nor0:$ea_res),
  1261. (ins g8rc:$rS, memrr:$dst),
  1262. "sthux $rS, $dst", IIC_LdStSTUX, []>,
  1263. RegConstraint<"$dst.ptrreg = $ea_res">,
  1264. NoEncode<"$ea_res">,
  1265. PPC970_DGroup_Cracked;
  1266. def STWUX8: XForm_8_memOp<31, 183, (outs ptr_rc_nor0:$ea_res),
  1267. (ins g8rc:$rS, memrr:$dst),
  1268. "stwux $rS, $dst", IIC_LdStSTUX, []>,
  1269. RegConstraint<"$dst.ptrreg = $ea_res">,
  1270. NoEncode<"$ea_res">,
  1271. PPC970_DGroup_Cracked;
  1272. } // Interpretation64Bit
  1273. def STDU : DSForm_1<62, 1, (outs ptr_rc_nor0:$ea_res),
  1274. (ins g8rc:$rS, memrix:$dst),
  1275. "stdu $rS, $dst", IIC_LdStSTU, []>,
  1276. RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">,
  1277. isPPC64;
  1278. def STDUX : XForm_8_memOp<31, 181, (outs ptr_rc_nor0:$ea_res),
  1279. (ins g8rc:$rS, memrr:$dst),
  1280. "stdux $rS, $dst", IIC_LdStSTUX, []>,
  1281. RegConstraint<"$dst.ptrreg = $ea_res">,
  1282. NoEncode<"$ea_res">,
  1283. PPC970_DGroup_Cracked, isPPC64;
  1284. }
  1285. // Patterns to match the pre-inc stores. We can't put the patterns on
  1286. // the instruction definitions directly as ISel wants the address base
  1287. // and offset to be separate operands, not a single complex operand.
  1288. def : Pat<(pre_truncsti8 i64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
  1289. (STBU8 $rS, iaddroff:$ptroff, $ptrreg)>;
  1290. def : Pat<(pre_truncsti16 i64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
  1291. (STHU8 $rS, iaddroff:$ptroff, $ptrreg)>;
  1292. def : Pat<(pre_truncsti32 i64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
  1293. (STWU8 $rS, iaddroff:$ptroff, $ptrreg)>;
  1294. def : Pat<(DSFormPreStore i64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
  1295. (STDU $rS, iaddroff:$ptroff, $ptrreg)>;
  1296. def : Pat<(pre_truncsti8 i64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
  1297. (STBUX8 $rS, $ptrreg, $ptroff)>;
  1298. def : Pat<(pre_truncsti16 i64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
  1299. (STHUX8 $rS, $ptrreg, $ptroff)>;
  1300. def : Pat<(pre_truncsti32 i64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
  1301. (STWUX8 $rS, $ptrreg, $ptroff)>;
  1302. def : Pat<(pre_store i64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
  1303. (STDUX $rS, $ptrreg, $ptroff)>;
  1304. //===----------------------------------------------------------------------===//
  1305. // Floating point instructions.
  1306. //
  1307. let PPC970_Unit = 3, hasSideEffects = 0, mayRaiseFPException = 1,
  1308. Uses = [RM] in { // FPU Operations.
  1309. defm FCFID : XForm_26r<63, 846, (outs f8rc:$frD), (ins f8rc:$frB),
  1310. "fcfid", "$frD, $frB", IIC_FPGeneral,
  1311. [(set f64:$frD, (PPCany_fcfid f64:$frB))]>, isPPC64;
  1312. defm FCTID : XForm_26r<63, 814, (outs f8rc:$frD), (ins f8rc:$frB),
  1313. "fctid", "$frD, $frB", IIC_FPGeneral,
  1314. []>, isPPC64;
  1315. defm FCTIDU : XForm_26r<63, 942, (outs f8rc:$frD), (ins f8rc:$frB),
  1316. "fctidu", "$frD, $frB", IIC_FPGeneral,
  1317. []>, isPPC64;
  1318. defm FCTIDZ : XForm_26r<63, 815, (outs f8rc:$frD), (ins f8rc:$frB),
  1319. "fctidz", "$frD, $frB", IIC_FPGeneral,
  1320. [(set f64:$frD, (PPCany_fctidz f64:$frB))]>, isPPC64;
  1321. defm FCFIDU : XForm_26r<63, 974, (outs f8rc:$frD), (ins f8rc:$frB),
  1322. "fcfidu", "$frD, $frB", IIC_FPGeneral,
  1323. [(set f64:$frD, (PPCany_fcfidu f64:$frB))]>, isPPC64;
  1324. defm FCFIDS : XForm_26r<59, 846, (outs f4rc:$frD), (ins f8rc:$frB),
  1325. "fcfids", "$frD, $frB", IIC_FPGeneral,
  1326. [(set f32:$frD, (PPCany_fcfids f64:$frB))]>, isPPC64;
  1327. defm FCFIDUS : XForm_26r<59, 974, (outs f4rc:$frD), (ins f8rc:$frB),
  1328. "fcfidus", "$frD, $frB", IIC_FPGeneral,
  1329. [(set f32:$frD, (PPCany_fcfidus f64:$frB))]>, isPPC64;
  1330. defm FCTIDUZ : XForm_26r<63, 943, (outs f8rc:$frD), (ins f8rc:$frB),
  1331. "fctiduz", "$frD, $frB", IIC_FPGeneral,
  1332. [(set f64:$frD, (PPCany_fctiduz f64:$frB))]>, isPPC64;
  1333. defm FCTIWUZ : XForm_26r<63, 143, (outs f8rc:$frD), (ins f8rc:$frB),
  1334. "fctiwuz", "$frD, $frB", IIC_FPGeneral,
  1335. [(set f64:$frD, (PPCany_fctiwuz f64:$frB))]>, isPPC64;
  1336. }
  1337. //===----------------------------------------------------------------------===//
  1338. // Instruction Patterns
  1339. //
  1340. // Extensions and truncates to/from 32-bit regs.
  1341. def : Pat<(i64 (zext i32:$in)),
  1342. (RLDICL (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $in, sub_32),
  1343. 0, 32)>;
  1344. def : Pat<(i64 (anyext i32:$in)),
  1345. (INSERT_SUBREG (i64 (IMPLICIT_DEF)), $in, sub_32)>;
  1346. def : Pat<(i32 (trunc i64:$in)),
  1347. (EXTRACT_SUBREG $in, sub_32)>;
  1348. // Implement the 'not' operation with the NOR instruction.
  1349. // (we could use the default xori pattern, but nor has lower latency on some
  1350. // cores (such as the A2)).
  1351. def i64not : OutPatFrag<(ops node:$in),
  1352. (NOR8 $in, $in)>;
  1353. def : Pat<(not i64:$in),
  1354. (i64not $in)>;
  1355. // Extending loads with i64 targets.
  1356. def : Pat<(zextloadi1 iaddr:$src),
  1357. (LBZ8 iaddr:$src)>;
  1358. def : Pat<(zextloadi1 xaddr:$src),
  1359. (LBZX8 xaddr:$src)>;
  1360. def : Pat<(extloadi1 iaddr:$src),
  1361. (LBZ8 iaddr:$src)>;
  1362. def : Pat<(extloadi1 xaddr:$src),
  1363. (LBZX8 xaddr:$src)>;
  1364. def : Pat<(extloadi8 iaddr:$src),
  1365. (LBZ8 iaddr:$src)>;
  1366. def : Pat<(extloadi8 xaddr:$src),
  1367. (LBZX8 xaddr:$src)>;
  1368. def : Pat<(extloadi16 iaddr:$src),
  1369. (LHZ8 iaddr:$src)>;
  1370. def : Pat<(extloadi16 xaddr:$src),
  1371. (LHZX8 xaddr:$src)>;
  1372. def : Pat<(extloadi32 iaddr:$src),
  1373. (LWZ8 iaddr:$src)>;
  1374. def : Pat<(extloadi32 xaddr:$src),
  1375. (LWZX8 xaddr:$src)>;
  1376. // Standard shifts. These are represented separately from the real shifts above
  1377. // so that we can distinguish between shifts that allow 6-bit and 7-bit shift
  1378. // amounts.
  1379. def : Pat<(sra i64:$rS, i32:$rB),
  1380. (SRAD $rS, $rB)>;
  1381. def : Pat<(srl i64:$rS, i32:$rB),
  1382. (SRD $rS, $rB)>;
  1383. def : Pat<(shl i64:$rS, i32:$rB),
  1384. (SLD $rS, $rB)>;
  1385. // SUBFIC
  1386. def : Pat<(sub imm64SExt16:$imm, i64:$in),
  1387. (SUBFIC8 $in, imm:$imm)>;
  1388. // SHL/SRL
  1389. def : Pat<(shl i64:$in, (i32 imm:$imm)),
  1390. (RLDICR $in, imm:$imm, (SHL64 imm:$imm))>;
  1391. def : Pat<(srl i64:$in, (i32 imm:$imm)),
  1392. (RLDICL $in, (SRL64 imm:$imm), imm:$imm)>;
  1393. // ROTL
  1394. def : Pat<(rotl i64:$in, i32:$sh),
  1395. (RLDCL $in, $sh, 0)>;
  1396. def : Pat<(rotl i64:$in, (i32 imm:$imm)),
  1397. (RLDICL $in, imm:$imm, 0)>;
  1398. // Hi and Lo for Darwin Global Addresses.
  1399. def : Pat<(PPChi tglobaladdr:$in, 0), (LIS8 tglobaladdr:$in)>;
  1400. def : Pat<(PPClo tglobaladdr:$in, 0), (LI8 tglobaladdr:$in)>;
  1401. def : Pat<(PPChi tconstpool:$in , 0), (LIS8 tconstpool:$in)>;
  1402. def : Pat<(PPClo tconstpool:$in , 0), (LI8 tconstpool:$in)>;
  1403. def : Pat<(PPChi tjumptable:$in , 0), (LIS8 tjumptable:$in)>;
  1404. def : Pat<(PPClo tjumptable:$in , 0), (LI8 tjumptable:$in)>;
  1405. def : Pat<(PPChi tblockaddress:$in, 0), (LIS8 tblockaddress:$in)>;
  1406. def : Pat<(PPClo tblockaddress:$in, 0), (LI8 tblockaddress:$in)>;
  1407. def : Pat<(PPChi tglobaltlsaddr:$g, i64:$in),
  1408. (ADDIS8 $in, tglobaltlsaddr:$g)>;
  1409. def : Pat<(PPClo tglobaltlsaddr:$g, i64:$in),
  1410. (ADDI8 $in, tglobaltlsaddr:$g)>;
  1411. def : Pat<(add i64:$in, (PPChi tglobaladdr:$g, 0)),
  1412. (ADDIS8 $in, tglobaladdr:$g)>;
  1413. def : Pat<(add i64:$in, (PPChi tconstpool:$g, 0)),
  1414. (ADDIS8 $in, tconstpool:$g)>;
  1415. def : Pat<(add i64:$in, (PPChi tjumptable:$g, 0)),
  1416. (ADDIS8 $in, tjumptable:$g)>;
  1417. def : Pat<(add i64:$in, (PPChi tblockaddress:$g, 0)),
  1418. (ADDIS8 $in, tblockaddress:$g)>;
  1419. // Patterns to match r+r indexed loads and stores for
  1420. // addresses without at least 4-byte alignment.
  1421. def : Pat<(i64 (NonDSFormSextLoadi32 xoaddr:$src)),
  1422. (LWAX xoaddr:$src)>;
  1423. def : Pat<(i64 (NonDSFormLoad xoaddr:$src)),
  1424. (LDX xoaddr:$src)>;
  1425. def : Pat<(NonDSFormStore i64:$rS, xoaddr:$dst),
  1426. (STDX $rS, xoaddr:$dst)>;
  1427. // 64-bits atomic loads and stores
  1428. def : Pat<(atomic_load_64 iaddrX4:$src), (LD memrix:$src)>;
  1429. def : Pat<(atomic_load_64 xaddrX4:$src), (LDX memrr:$src)>;
  1430. def : Pat<(atomic_store_64 iaddrX4:$ptr, i64:$val), (STD g8rc:$val, memrix:$ptr)>;
  1431. def : Pat<(atomic_store_64 xaddrX4:$ptr, i64:$val), (STDX g8rc:$val, memrr:$ptr)>;
  1432. let Predicates = [IsISA3_0] in {
  1433. // DARN (deliver random number)
  1434. // L=0 for 32-bit, L=1 for conditioned random, L=2 for raw random
  1435. def : Pat<(int_ppc_darn32), (EXTRACT_SUBREG (DARN 0), sub_32)>;
  1436. def : Pat<(int_ppc_darn), (DARN 1)>;
  1437. def : Pat<(int_ppc_darnraw), (DARN 2)>;
  1438. class X_L1_RA5_RB5<bits<6> opcode, bits<10> xo, string opc, RegisterOperand ty,
  1439. InstrItinClass itin, list<dag> pattern>
  1440. : X_L1_RS5_RS5<opcode, xo, (outs), (ins ty:$rA, ty:$rB, u1imm:$L),
  1441. !strconcat(opc, " $rA, $rB, $L"), itin, pattern>;
  1442. let Interpretation64Bit = 1, isCodeGenOnly = 1 in {
  1443. def CP_COPY8 : X_L1_RA5_RB5<31, 774, "copy" , g8rc, IIC_LdStCOPY, []>;
  1444. def CP_PASTE8 : X_L1_RA5_RB5<31, 902, "paste" , g8rc, IIC_LdStPASTE, []>;
  1445. def CP_PASTE8_rec : X_L1_RA5_RB5<31, 902, "paste.", g8rc, IIC_LdStPASTE, []>,isRecordForm;
  1446. }
  1447. // SLB Invalidate Entry Global
  1448. def SLBIEG : XForm_26<31, 466, (outs), (ins gprc:$RS, gprc:$RB),
  1449. "slbieg $RS, $RB", IIC_SprSLBIEG, []>;
  1450. // SLB Synchronize
  1451. def SLBSYNC : XForm_0<31, 338, (outs), (ins), "slbsync", IIC_SprSLBSYNC, []>;
  1452. } // IsISA3_0