PPCAsmParser.cpp 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872
  1. //===-- PPCAsmParser.cpp - Parse PowerPC asm to MCInst instructions -------===//
  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. #include "MCTargetDesc/PPCMCExpr.h"
  9. #include "MCTargetDesc/PPCMCTargetDesc.h"
  10. #include "PPCTargetStreamer.h"
  11. #include "TargetInfo/PowerPCTargetInfo.h"
  12. #include "llvm/ADT/STLExtras.h"
  13. #include "llvm/ADT/Twine.h"
  14. #include "llvm/MC/MCContext.h"
  15. #include "llvm/MC/MCExpr.h"
  16. #include "llvm/MC/MCInst.h"
  17. #include "llvm/MC/MCInstrInfo.h"
  18. #include "llvm/MC/MCParser/MCAsmLexer.h"
  19. #include "llvm/MC/MCParser/MCAsmParser.h"
  20. #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
  21. #include "llvm/MC/MCParser/MCTargetAsmParser.h"
  22. #include "llvm/MC/MCStreamer.h"
  23. #include "llvm/MC/MCSubtargetInfo.h"
  24. #include "llvm/MC/MCSymbolELF.h"
  25. #include "llvm/MC/TargetRegistry.h"
  26. #include "llvm/Support/SourceMgr.h"
  27. #include "llvm/Support/raw_ostream.h"
  28. using namespace llvm;
  29. DEFINE_PPC_REGCLASSES
  30. // Evaluate an expression containing condition register
  31. // or condition register field symbols. Returns positive
  32. // value on success, or -1 on error.
  33. static int64_t
  34. EvaluateCRExpr(const MCExpr *E) {
  35. switch (E->getKind()) {
  36. case MCExpr::Target:
  37. return -1;
  38. case MCExpr::Constant: {
  39. int64_t Res = cast<MCConstantExpr>(E)->getValue();
  40. return Res < 0 ? -1 : Res;
  41. }
  42. case MCExpr::SymbolRef: {
  43. const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
  44. StringRef Name = SRE->getSymbol().getName();
  45. if (Name == "lt") return 0;
  46. if (Name == "gt") return 1;
  47. if (Name == "eq") return 2;
  48. if (Name == "so") return 3;
  49. if (Name == "un") return 3;
  50. if (Name == "cr0") return 0;
  51. if (Name == "cr1") return 1;
  52. if (Name == "cr2") return 2;
  53. if (Name == "cr3") return 3;
  54. if (Name == "cr4") return 4;
  55. if (Name == "cr5") return 5;
  56. if (Name == "cr6") return 6;
  57. if (Name == "cr7") return 7;
  58. return -1;
  59. }
  60. case MCExpr::Unary:
  61. return -1;
  62. case MCExpr::Binary: {
  63. const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
  64. int64_t LHSVal = EvaluateCRExpr(BE->getLHS());
  65. int64_t RHSVal = EvaluateCRExpr(BE->getRHS());
  66. int64_t Res;
  67. if (LHSVal < 0 || RHSVal < 0)
  68. return -1;
  69. switch (BE->getOpcode()) {
  70. default: return -1;
  71. case MCBinaryExpr::Add: Res = LHSVal + RHSVal; break;
  72. case MCBinaryExpr::Mul: Res = LHSVal * RHSVal; break;
  73. }
  74. return Res < 0 ? -1 : Res;
  75. }
  76. }
  77. llvm_unreachable("Invalid expression kind!");
  78. }
  79. namespace {
  80. struct PPCOperand;
  81. class PPCAsmParser : public MCTargetAsmParser {
  82. bool IsPPC64;
  83. void Warning(SMLoc L, const Twine &Msg) { getParser().Warning(L, Msg); }
  84. bool isPPC64() const { return IsPPC64; }
  85. bool MatchRegisterName(MCRegister &RegNo, int64_t &IntVal);
  86. bool parseRegister(MCRegister &RegNo, SMLoc &StartLoc,
  87. SMLoc &EndLoc) override;
  88. OperandMatchResultTy tryParseRegister(MCRegister &RegNo, SMLoc &StartLoc,
  89. SMLoc &EndLoc) override;
  90. const MCExpr *ExtractModifierFromExpr(const MCExpr *E,
  91. PPCMCExpr::VariantKind &Variant);
  92. const MCExpr *FixupVariantKind(const MCExpr *E);
  93. bool ParseExpression(const MCExpr *&EVal);
  94. bool ParseOperand(OperandVector &Operands);
  95. bool ParseDirectiveWord(unsigned Size, AsmToken ID);
  96. bool ParseDirectiveTC(unsigned Size, AsmToken ID);
  97. bool ParseDirectiveMachine(SMLoc L);
  98. bool ParseDirectiveAbiVersion(SMLoc L);
  99. bool ParseDirectiveLocalEntry(SMLoc L);
  100. bool ParseGNUAttribute(SMLoc L);
  101. bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
  102. OperandVector &Operands, MCStreamer &Out,
  103. uint64_t &ErrorInfo,
  104. bool MatchingInlineAsm) override;
  105. void ProcessInstruction(MCInst &Inst, const OperandVector &Ops);
  106. /// @name Auto-generated Match Functions
  107. /// {
  108. #define GET_ASSEMBLER_HEADER
  109. #include "PPCGenAsmMatcher.inc"
  110. /// }
  111. public:
  112. PPCAsmParser(const MCSubtargetInfo &STI, MCAsmParser &,
  113. const MCInstrInfo &MII, const MCTargetOptions &Options)
  114. : MCTargetAsmParser(Options, STI, MII) {
  115. // Check for 64-bit vs. 32-bit pointer mode.
  116. const Triple &TheTriple = STI.getTargetTriple();
  117. IsPPC64 = TheTriple.isPPC64();
  118. // Initialize the set of available features.
  119. setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
  120. }
  121. bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
  122. SMLoc NameLoc, OperandVector &Operands) override;
  123. bool ParseDirective(AsmToken DirectiveID) override;
  124. unsigned validateTargetOperandClass(MCParsedAsmOperand &Op,
  125. unsigned Kind) override;
  126. const MCExpr *applyModifierToExpr(const MCExpr *E,
  127. MCSymbolRefExpr::VariantKind,
  128. MCContext &Ctx) override;
  129. };
  130. /// PPCOperand - Instances of this class represent a parsed PowerPC machine
  131. /// instruction.
  132. struct PPCOperand : public MCParsedAsmOperand {
  133. enum KindTy {
  134. Token,
  135. Immediate,
  136. ContextImmediate,
  137. Expression,
  138. TLSRegister
  139. } Kind;
  140. SMLoc StartLoc, EndLoc;
  141. bool IsPPC64;
  142. struct TokOp {
  143. const char *Data;
  144. unsigned Length;
  145. };
  146. struct ImmOp {
  147. int64_t Val;
  148. };
  149. struct ExprOp {
  150. const MCExpr *Val;
  151. int64_t CRVal; // Cached result of EvaluateCRExpr(Val)
  152. };
  153. struct TLSRegOp {
  154. const MCSymbolRefExpr *Sym;
  155. };
  156. union {
  157. struct TokOp Tok;
  158. struct ImmOp Imm;
  159. struct ExprOp Expr;
  160. struct TLSRegOp TLSReg;
  161. };
  162. PPCOperand(KindTy K) : Kind(K) {}
  163. public:
  164. PPCOperand(const PPCOperand &o) : MCParsedAsmOperand() {
  165. Kind = o.Kind;
  166. StartLoc = o.StartLoc;
  167. EndLoc = o.EndLoc;
  168. IsPPC64 = o.IsPPC64;
  169. switch (Kind) {
  170. case Token:
  171. Tok = o.Tok;
  172. break;
  173. case Immediate:
  174. case ContextImmediate:
  175. Imm = o.Imm;
  176. break;
  177. case Expression:
  178. Expr = o.Expr;
  179. break;
  180. case TLSRegister:
  181. TLSReg = o.TLSReg;
  182. break;
  183. }
  184. }
  185. // Disable use of sized deallocation due to overallocation of PPCOperand
  186. // objects in CreateTokenWithStringCopy.
  187. void operator delete(void *p) { ::operator delete(p); }
  188. /// getStartLoc - Get the location of the first token of this operand.
  189. SMLoc getStartLoc() const override { return StartLoc; }
  190. /// getEndLoc - Get the location of the last token of this operand.
  191. SMLoc getEndLoc() const override { return EndLoc; }
  192. /// getLocRange - Get the range between the first and last token of this
  193. /// operand.
  194. SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); }
  195. /// isPPC64 - True if this operand is for an instruction in 64-bit mode.
  196. bool isPPC64() const { return IsPPC64; }
  197. int64_t getImm() const {
  198. assert(Kind == Immediate && "Invalid access!");
  199. return Imm.Val;
  200. }
  201. int64_t getImmS16Context() const {
  202. assert((Kind == Immediate || Kind == ContextImmediate) &&
  203. "Invalid access!");
  204. if (Kind == Immediate)
  205. return Imm.Val;
  206. return static_cast<int16_t>(Imm.Val);
  207. }
  208. int64_t getImmU16Context() const {
  209. assert((Kind == Immediate || Kind == ContextImmediate) &&
  210. "Invalid access!");
  211. return Imm.Val;
  212. }
  213. const MCExpr *getExpr() const {
  214. assert(Kind == Expression && "Invalid access!");
  215. return Expr.Val;
  216. }
  217. int64_t getExprCRVal() const {
  218. assert(Kind == Expression && "Invalid access!");
  219. return Expr.CRVal;
  220. }
  221. const MCExpr *getTLSReg() const {
  222. assert(Kind == TLSRegister && "Invalid access!");
  223. return TLSReg.Sym;
  224. }
  225. unsigned getReg() const override {
  226. assert(isRegNumber() && "Invalid access!");
  227. return (unsigned) Imm.Val;
  228. }
  229. unsigned getVSReg() const {
  230. assert(isVSRegNumber() && "Invalid access!");
  231. return (unsigned) Imm.Val;
  232. }
  233. unsigned getACCReg() const {
  234. assert(isACCRegNumber() && "Invalid access!");
  235. return (unsigned) Imm.Val;
  236. }
  237. unsigned getDMRROWReg() const {
  238. assert(isDMRROWRegNumber() && "Invalid access!");
  239. return (unsigned)Imm.Val;
  240. }
  241. unsigned getDMRROWpReg() const {
  242. assert(isDMRROWpRegNumber() && "Invalid access!");
  243. return (unsigned)Imm.Val;
  244. }
  245. unsigned getDMRReg() const {
  246. assert(isDMRRegNumber() && "Invalid access!");
  247. return (unsigned)Imm.Val;
  248. }
  249. unsigned getDMRpReg() const {
  250. assert(isDMRpRegNumber() && "Invalid access!");
  251. return (unsigned)Imm.Val;
  252. }
  253. unsigned getVSRpEvenReg() const {
  254. assert(isVSRpEvenRegNumber() && "Invalid access!");
  255. return (unsigned) Imm.Val >> 1;
  256. }
  257. unsigned getG8pReg() const {
  258. assert(isEvenRegNumber() && "Invalid access!");
  259. return (unsigned)Imm.Val;
  260. }
  261. unsigned getCCReg() const {
  262. assert(isCCRegNumber() && "Invalid access!");
  263. return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal);
  264. }
  265. unsigned getCRBit() const {
  266. assert(isCRBitNumber() && "Invalid access!");
  267. return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal);
  268. }
  269. unsigned getCRBitMask() const {
  270. assert(isCRBitMask() && "Invalid access!");
  271. return 7 - countTrailingZeros<uint64_t>(Imm.Val);
  272. }
  273. bool isToken() const override { return Kind == Token; }
  274. bool isImm() const override {
  275. return Kind == Immediate || Kind == Expression;
  276. }
  277. bool isU1Imm() const { return Kind == Immediate && isUInt<1>(getImm()); }
  278. bool isU2Imm() const { return Kind == Immediate && isUInt<2>(getImm()); }
  279. bool isU3Imm() const { return Kind == Immediate && isUInt<3>(getImm()); }
  280. bool isU4Imm() const { return Kind == Immediate && isUInt<4>(getImm()); }
  281. bool isU5Imm() const { return Kind == Immediate && isUInt<5>(getImm()); }
  282. bool isS5Imm() const { return Kind == Immediate && isInt<5>(getImm()); }
  283. bool isU6Imm() const { return Kind == Immediate && isUInt<6>(getImm()); }
  284. bool isU6ImmX2() const { return Kind == Immediate &&
  285. isUInt<6>(getImm()) &&
  286. (getImm() & 1) == 0; }
  287. bool isU7Imm() const { return Kind == Immediate && isUInt<7>(getImm()); }
  288. bool isU7ImmX4() const { return Kind == Immediate &&
  289. isUInt<7>(getImm()) &&
  290. (getImm() & 3) == 0; }
  291. bool isU8Imm() const { return Kind == Immediate && isUInt<8>(getImm()); }
  292. bool isU8ImmX8() const { return Kind == Immediate &&
  293. isUInt<8>(getImm()) &&
  294. (getImm() & 7) == 0; }
  295. bool isU10Imm() const { return Kind == Immediate && isUInt<10>(getImm()); }
  296. bool isU12Imm() const { return Kind == Immediate && isUInt<12>(getImm()); }
  297. bool isU16Imm() const { return isExtImm<16>(/*Signed*/ false, 1); }
  298. bool isS16Imm() const { return isExtImm<16>(/*Signed*/ true, 1); }
  299. bool isS16ImmX4() const { return isExtImm<16>(/*Signed*/ true, 4); }
  300. bool isS16ImmX16() const { return isExtImm<16>(/*Signed*/ true, 16); }
  301. bool isS17Imm() const { return isExtImm<17>(/*Signed*/ true, 1); }
  302. bool isHashImmX8() const {
  303. // The Hash Imm form is used for instructions that check or store a hash.
  304. // These instructions have a small immediate range that spans between
  305. // -8 and -512.
  306. return (Kind == Immediate && getImm() <= -8 && getImm() >= -512 &&
  307. (getImm() & 7) == 0);
  308. }
  309. bool isS34ImmX16() const {
  310. return Kind == Expression ||
  311. (Kind == Immediate && isInt<34>(getImm()) && (getImm() & 15) == 0);
  312. }
  313. bool isS34Imm() const {
  314. // Once the PC-Rel ABI is finalized, evaluate whether a 34-bit
  315. // ContextImmediate is needed.
  316. return Kind == Expression || (Kind == Immediate && isInt<34>(getImm()));
  317. }
  318. bool isTLSReg() const { return Kind == TLSRegister; }
  319. bool isDirectBr() const {
  320. if (Kind == Expression)
  321. return true;
  322. if (Kind != Immediate)
  323. return false;
  324. // Operand must be 64-bit aligned, signed 27-bit immediate.
  325. if ((getImm() & 3) != 0)
  326. return false;
  327. if (isInt<26>(getImm()))
  328. return true;
  329. if (!IsPPC64) {
  330. // In 32-bit mode, large 32-bit quantities wrap around.
  331. if (isUInt<32>(getImm()) && isInt<26>(static_cast<int32_t>(getImm())))
  332. return true;
  333. }
  334. return false;
  335. }
  336. bool isCondBr() const { return Kind == Expression ||
  337. (Kind == Immediate && isInt<16>(getImm()) &&
  338. (getImm() & 3) == 0); }
  339. bool isImmZero() const { return Kind == Immediate && getImm() == 0; }
  340. bool isRegNumber() const { return Kind == Immediate && isUInt<5>(getImm()); }
  341. bool isACCRegNumber() const {
  342. return Kind == Immediate && isUInt<3>(getImm());
  343. }
  344. bool isDMRROWRegNumber() const {
  345. return Kind == Immediate && isUInt<6>(getImm());
  346. }
  347. bool isDMRROWpRegNumber() const {
  348. return Kind == Immediate && isUInt<5>(getImm());
  349. }
  350. bool isDMRRegNumber() const {
  351. return Kind == Immediate && isUInt<3>(getImm());
  352. }
  353. bool isDMRpRegNumber() const {
  354. return Kind == Immediate && isUInt<2>(getImm());
  355. }
  356. bool isVSRpEvenRegNumber() const {
  357. return Kind == Immediate && isUInt<6>(getImm()) && ((getImm() & 1) == 0);
  358. }
  359. bool isVSRegNumber() const {
  360. return Kind == Immediate && isUInt<6>(getImm());
  361. }
  362. bool isCCRegNumber() const { return (Kind == Expression
  363. && isUInt<3>(getExprCRVal())) ||
  364. (Kind == Immediate
  365. && isUInt<3>(getImm())); }
  366. bool isCRBitNumber() const { return (Kind == Expression
  367. && isUInt<5>(getExprCRVal())) ||
  368. (Kind == Immediate
  369. && isUInt<5>(getImm())); }
  370. bool isEvenRegNumber() const { return isRegNumber() && (getImm() & 1) == 0; }
  371. bool isCRBitMask() const { return Kind == Immediate && isUInt<8>(getImm()) &&
  372. isPowerOf2_32(getImm()); }
  373. bool isATBitsAsHint() const { return false; }
  374. bool isMem() const override { return false; }
  375. bool isReg() const override { return false; }
  376. void addRegOperands(MCInst &Inst, unsigned N) const {
  377. llvm_unreachable("addRegOperands");
  378. }
  379. void addRegGPRCOperands(MCInst &Inst, unsigned N) const {
  380. assert(N == 1 && "Invalid number of operands!");
  381. Inst.addOperand(MCOperand::createReg(RRegs[getReg()]));
  382. }
  383. void addRegGPRCNoR0Operands(MCInst &Inst, unsigned N) const {
  384. assert(N == 1 && "Invalid number of operands!");
  385. Inst.addOperand(MCOperand::createReg(RRegsNoR0[getReg()]));
  386. }
  387. void addRegG8RCOperands(MCInst &Inst, unsigned N) const {
  388. assert(N == 1 && "Invalid number of operands!");
  389. Inst.addOperand(MCOperand::createReg(XRegs[getReg()]));
  390. }
  391. void addRegG8RCNoX0Operands(MCInst &Inst, unsigned N) const {
  392. assert(N == 1 && "Invalid number of operands!");
  393. Inst.addOperand(MCOperand::createReg(XRegsNoX0[getReg()]));
  394. }
  395. void addRegG8pRCOperands(MCInst &Inst, unsigned N) const {
  396. assert(N == 1 && "Invalid number of operands!");
  397. Inst.addOperand(MCOperand::createReg(XRegs[getG8pReg()]));
  398. }
  399. void addRegGxRCOperands(MCInst &Inst, unsigned N) const {
  400. if (isPPC64())
  401. addRegG8RCOperands(Inst, N);
  402. else
  403. addRegGPRCOperands(Inst, N);
  404. }
  405. void addRegGxRCNoR0Operands(MCInst &Inst, unsigned N) const {
  406. if (isPPC64())
  407. addRegG8RCNoX0Operands(Inst, N);
  408. else
  409. addRegGPRCNoR0Operands(Inst, N);
  410. }
  411. void addRegF4RCOperands(MCInst &Inst, unsigned N) const {
  412. assert(N == 1 && "Invalid number of operands!");
  413. Inst.addOperand(MCOperand::createReg(FRegs[getReg()]));
  414. }
  415. void addRegF8RCOperands(MCInst &Inst, unsigned N) const {
  416. assert(N == 1 && "Invalid number of operands!");
  417. Inst.addOperand(MCOperand::createReg(FRegs[getReg()]));
  418. }
  419. void addRegVFRCOperands(MCInst &Inst, unsigned N) const {
  420. assert(N == 1 && "Invalid number of operands!");
  421. Inst.addOperand(MCOperand::createReg(VFRegs[getReg()]));
  422. }
  423. void addRegVRRCOperands(MCInst &Inst, unsigned N) const {
  424. assert(N == 1 && "Invalid number of operands!");
  425. Inst.addOperand(MCOperand::createReg(VRegs[getReg()]));
  426. }
  427. void addRegVSRCOperands(MCInst &Inst, unsigned N) const {
  428. assert(N == 1 && "Invalid number of operands!");
  429. Inst.addOperand(MCOperand::createReg(VSRegs[getVSReg()]));
  430. }
  431. void addRegVSFRCOperands(MCInst &Inst, unsigned N) const {
  432. assert(N == 1 && "Invalid number of operands!");
  433. Inst.addOperand(MCOperand::createReg(VSFRegs[getVSReg()]));
  434. }
  435. void addRegVSSRCOperands(MCInst &Inst, unsigned N) const {
  436. assert(N == 1 && "Invalid number of operands!");
  437. Inst.addOperand(MCOperand::createReg(VSSRegs[getVSReg()]));
  438. }
  439. void addRegSPE4RCOperands(MCInst &Inst, unsigned N) const {
  440. assert(N == 1 && "Invalid number of operands!");
  441. Inst.addOperand(MCOperand::createReg(RRegs[getReg()]));
  442. }
  443. void addRegSPERCOperands(MCInst &Inst, unsigned N) const {
  444. assert(N == 1 && "Invalid number of operands!");
  445. Inst.addOperand(MCOperand::createReg(SPERegs[getReg()]));
  446. }
  447. void addRegACCRCOperands(MCInst &Inst, unsigned N) const {
  448. assert(N == 1 && "Invalid number of operands!");
  449. Inst.addOperand(MCOperand::createReg(ACCRegs[getACCReg()]));
  450. }
  451. void addRegDMRROWRCOperands(MCInst &Inst, unsigned N) const {
  452. assert(N == 1 && "Invalid number of operands!");
  453. Inst.addOperand(MCOperand::createReg(DMRROWRegs[getDMRROWReg()]));
  454. }
  455. void addRegDMRROWpRCOperands(MCInst &Inst, unsigned N) const {
  456. assert(N == 1 && "Invalid number of operands!");
  457. Inst.addOperand(MCOperand::createReg(DMRROWpRegs[getDMRROWpReg()]));
  458. }
  459. void addRegDMRRCOperands(MCInst &Inst, unsigned N) const {
  460. assert(N == 1 && "Invalid number of operands!");
  461. Inst.addOperand(MCOperand::createReg(DMRRegs[getDMRReg()]));
  462. }
  463. void addRegDMRpRCOperands(MCInst &Inst, unsigned N) const {
  464. assert(N == 1 && "Invalid number of operands!");
  465. Inst.addOperand(MCOperand::createReg(DMRpRegs[getDMRpReg()]));
  466. }
  467. void addRegWACCRCOperands(MCInst &Inst, unsigned N) const {
  468. assert(N == 1 && "Invalid number of operands!");
  469. Inst.addOperand(MCOperand::createReg(WACCRegs[getACCReg()]));
  470. }
  471. void addRegWACC_HIRCOperands(MCInst &Inst, unsigned N) const {
  472. assert(N == 1 && "Invalid number of operands!");
  473. Inst.addOperand(MCOperand::createReg(WACC_HIRegs[getACCReg()]));
  474. }
  475. void addRegVSRpRCOperands(MCInst &Inst, unsigned N) const {
  476. assert(N == 1 && "Invalid number of operands!");
  477. Inst.addOperand(MCOperand::createReg(VSRpRegs[getVSRpEvenReg()]));
  478. }
  479. void addRegVSRpEvenRCOperands(MCInst &Inst, unsigned N) const {
  480. assert(N == 1 && "Invalid number of operands!");
  481. Inst.addOperand(MCOperand::createReg(VSRpRegs[getVSRpEvenReg()]));
  482. }
  483. void addRegCRBITRCOperands(MCInst &Inst, unsigned N) const {
  484. assert(N == 1 && "Invalid number of operands!");
  485. Inst.addOperand(MCOperand::createReg(CRBITRegs[getCRBit()]));
  486. }
  487. void addRegCRRCOperands(MCInst &Inst, unsigned N) const {
  488. assert(N == 1 && "Invalid number of operands!");
  489. Inst.addOperand(MCOperand::createReg(CRRegs[getCCReg()]));
  490. }
  491. void addCRBitMaskOperands(MCInst &Inst, unsigned N) const {
  492. assert(N == 1 && "Invalid number of operands!");
  493. Inst.addOperand(MCOperand::createReg(CRRegs[getCRBitMask()]));
  494. }
  495. void addImmOperands(MCInst &Inst, unsigned N) const {
  496. assert(N == 1 && "Invalid number of operands!");
  497. if (Kind == Immediate)
  498. Inst.addOperand(MCOperand::createImm(getImm()));
  499. else
  500. Inst.addOperand(MCOperand::createExpr(getExpr()));
  501. }
  502. void addS16ImmOperands(MCInst &Inst, unsigned N) const {
  503. assert(N == 1 && "Invalid number of operands!");
  504. switch (Kind) {
  505. case Immediate:
  506. Inst.addOperand(MCOperand::createImm(getImm()));
  507. break;
  508. case ContextImmediate:
  509. Inst.addOperand(MCOperand::createImm(getImmS16Context()));
  510. break;
  511. default:
  512. Inst.addOperand(MCOperand::createExpr(getExpr()));
  513. break;
  514. }
  515. }
  516. void addU16ImmOperands(MCInst &Inst, unsigned N) const {
  517. assert(N == 1 && "Invalid number of operands!");
  518. switch (Kind) {
  519. case Immediate:
  520. Inst.addOperand(MCOperand::createImm(getImm()));
  521. break;
  522. case ContextImmediate:
  523. Inst.addOperand(MCOperand::createImm(getImmU16Context()));
  524. break;
  525. default:
  526. Inst.addOperand(MCOperand::createExpr(getExpr()));
  527. break;
  528. }
  529. }
  530. void addBranchTargetOperands(MCInst &Inst, unsigned N) const {
  531. assert(N == 1 && "Invalid number of operands!");
  532. if (Kind == Immediate)
  533. Inst.addOperand(MCOperand::createImm(getImm() / 4));
  534. else
  535. Inst.addOperand(MCOperand::createExpr(getExpr()));
  536. }
  537. void addTLSRegOperands(MCInst &Inst, unsigned N) const {
  538. assert(N == 1 && "Invalid number of operands!");
  539. Inst.addOperand(MCOperand::createExpr(getTLSReg()));
  540. }
  541. StringRef getToken() const {
  542. assert(Kind == Token && "Invalid access!");
  543. return StringRef(Tok.Data, Tok.Length);
  544. }
  545. void print(raw_ostream &OS) const override;
  546. static std::unique_ptr<PPCOperand> CreateToken(StringRef Str, SMLoc S,
  547. bool IsPPC64) {
  548. auto Op = std::make_unique<PPCOperand>(Token);
  549. Op->Tok.Data = Str.data();
  550. Op->Tok.Length = Str.size();
  551. Op->StartLoc = S;
  552. Op->EndLoc = S;
  553. Op->IsPPC64 = IsPPC64;
  554. return Op;
  555. }
  556. static std::unique_ptr<PPCOperand>
  557. CreateTokenWithStringCopy(StringRef Str, SMLoc S, bool IsPPC64) {
  558. // Allocate extra memory for the string and copy it.
  559. // FIXME: This is incorrect, Operands are owned by unique_ptr with a default
  560. // deleter which will destroy them by simply using "delete", not correctly
  561. // calling operator delete on this extra memory after calling the dtor
  562. // explicitly.
  563. void *Mem = ::operator new(sizeof(PPCOperand) + Str.size());
  564. std::unique_ptr<PPCOperand> Op(new (Mem) PPCOperand(Token));
  565. Op->Tok.Data = reinterpret_cast<const char *>(Op.get() + 1);
  566. Op->Tok.Length = Str.size();
  567. std::memcpy(const_cast<char *>(Op->Tok.Data), Str.data(), Str.size());
  568. Op->StartLoc = S;
  569. Op->EndLoc = S;
  570. Op->IsPPC64 = IsPPC64;
  571. return Op;
  572. }
  573. static std::unique_ptr<PPCOperand> CreateImm(int64_t Val, SMLoc S, SMLoc E,
  574. bool IsPPC64) {
  575. auto Op = std::make_unique<PPCOperand>(Immediate);
  576. Op->Imm.Val = Val;
  577. Op->StartLoc = S;
  578. Op->EndLoc = E;
  579. Op->IsPPC64 = IsPPC64;
  580. return Op;
  581. }
  582. static std::unique_ptr<PPCOperand> CreateExpr(const MCExpr *Val, SMLoc S,
  583. SMLoc E, bool IsPPC64) {
  584. auto Op = std::make_unique<PPCOperand>(Expression);
  585. Op->Expr.Val = Val;
  586. Op->Expr.CRVal = EvaluateCRExpr(Val);
  587. Op->StartLoc = S;
  588. Op->EndLoc = E;
  589. Op->IsPPC64 = IsPPC64;
  590. return Op;
  591. }
  592. static std::unique_ptr<PPCOperand>
  593. CreateTLSReg(const MCSymbolRefExpr *Sym, SMLoc S, SMLoc E, bool IsPPC64) {
  594. auto Op = std::make_unique<PPCOperand>(TLSRegister);
  595. Op->TLSReg.Sym = Sym;
  596. Op->StartLoc = S;
  597. Op->EndLoc = E;
  598. Op->IsPPC64 = IsPPC64;
  599. return Op;
  600. }
  601. static std::unique_ptr<PPCOperand>
  602. CreateContextImm(int64_t Val, SMLoc S, SMLoc E, bool IsPPC64) {
  603. auto Op = std::make_unique<PPCOperand>(ContextImmediate);
  604. Op->Imm.Val = Val;
  605. Op->StartLoc = S;
  606. Op->EndLoc = E;
  607. Op->IsPPC64 = IsPPC64;
  608. return Op;
  609. }
  610. static std::unique_ptr<PPCOperand>
  611. CreateFromMCExpr(const MCExpr *Val, SMLoc S, SMLoc E, bool IsPPC64) {
  612. if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Val))
  613. return CreateImm(CE->getValue(), S, E, IsPPC64);
  614. if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Val))
  615. if (SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS ||
  616. SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS_PCREL)
  617. return CreateTLSReg(SRE, S, E, IsPPC64);
  618. if (const PPCMCExpr *TE = dyn_cast<PPCMCExpr>(Val)) {
  619. int64_t Res;
  620. if (TE->evaluateAsConstant(Res))
  621. return CreateContextImm(Res, S, E, IsPPC64);
  622. }
  623. return CreateExpr(Val, S, E, IsPPC64);
  624. }
  625. private:
  626. template <unsigned Width>
  627. bool isExtImm(bool Signed, unsigned Multiple) const {
  628. switch (Kind) {
  629. default:
  630. return false;
  631. case Expression:
  632. return true;
  633. case Immediate:
  634. case ContextImmediate:
  635. if (Signed)
  636. return isInt<Width>(getImmS16Context()) &&
  637. (getImmS16Context() & (Multiple - 1)) == 0;
  638. else
  639. return isUInt<Width>(getImmU16Context()) &&
  640. (getImmU16Context() & (Multiple - 1)) == 0;
  641. }
  642. }
  643. };
  644. } // end anonymous namespace.
  645. void PPCOperand::print(raw_ostream &OS) const {
  646. switch (Kind) {
  647. case Token:
  648. OS << "'" << getToken() << "'";
  649. break;
  650. case Immediate:
  651. case ContextImmediate:
  652. OS << getImm();
  653. break;
  654. case Expression:
  655. OS << *getExpr();
  656. break;
  657. case TLSRegister:
  658. OS << *getTLSReg();
  659. break;
  660. }
  661. }
  662. static void
  663. addNegOperand(MCInst &Inst, MCOperand &Op, MCContext &Ctx) {
  664. if (Op.isImm()) {
  665. Inst.addOperand(MCOperand::createImm(-Op.getImm()));
  666. return;
  667. }
  668. const MCExpr *Expr = Op.getExpr();
  669. if (const MCUnaryExpr *UnExpr = dyn_cast<MCUnaryExpr>(Expr)) {
  670. if (UnExpr->getOpcode() == MCUnaryExpr::Minus) {
  671. Inst.addOperand(MCOperand::createExpr(UnExpr->getSubExpr()));
  672. return;
  673. }
  674. } else if (const MCBinaryExpr *BinExpr = dyn_cast<MCBinaryExpr>(Expr)) {
  675. if (BinExpr->getOpcode() == MCBinaryExpr::Sub) {
  676. const MCExpr *NE = MCBinaryExpr::createSub(BinExpr->getRHS(),
  677. BinExpr->getLHS(), Ctx);
  678. Inst.addOperand(MCOperand::createExpr(NE));
  679. return;
  680. }
  681. }
  682. Inst.addOperand(MCOperand::createExpr(MCUnaryExpr::createMinus(Expr, Ctx)));
  683. }
  684. void PPCAsmParser::ProcessInstruction(MCInst &Inst,
  685. const OperandVector &Operands) {
  686. int Opcode = Inst.getOpcode();
  687. switch (Opcode) {
  688. case PPC::DCBTx:
  689. case PPC::DCBTT:
  690. case PPC::DCBTSTx:
  691. case PPC::DCBTSTT: {
  692. MCInst TmpInst;
  693. TmpInst.setOpcode((Opcode == PPC::DCBTx || Opcode == PPC::DCBTT) ?
  694. PPC::DCBT : PPC::DCBTST);
  695. TmpInst.addOperand(MCOperand::createImm(
  696. (Opcode == PPC::DCBTx || Opcode == PPC::DCBTSTx) ? 0 : 16));
  697. TmpInst.addOperand(Inst.getOperand(0));
  698. TmpInst.addOperand(Inst.getOperand(1));
  699. Inst = TmpInst;
  700. break;
  701. }
  702. case PPC::DCBTCT:
  703. case PPC::DCBTDS: {
  704. MCInst TmpInst;
  705. TmpInst.setOpcode(PPC::DCBT);
  706. TmpInst.addOperand(Inst.getOperand(2));
  707. TmpInst.addOperand(Inst.getOperand(0));
  708. TmpInst.addOperand(Inst.getOperand(1));
  709. Inst = TmpInst;
  710. break;
  711. }
  712. case PPC::DCBTSTCT:
  713. case PPC::DCBTSTDS: {
  714. MCInst TmpInst;
  715. TmpInst.setOpcode(PPC::DCBTST);
  716. TmpInst.addOperand(Inst.getOperand(2));
  717. TmpInst.addOperand(Inst.getOperand(0));
  718. TmpInst.addOperand(Inst.getOperand(1));
  719. Inst = TmpInst;
  720. break;
  721. }
  722. case PPC::DCBFx:
  723. case PPC::DCBFL:
  724. case PPC::DCBFLP:
  725. case PPC::DCBFPS:
  726. case PPC::DCBSTPS: {
  727. int L = 0;
  728. if (Opcode == PPC::DCBFL)
  729. L = 1;
  730. else if (Opcode == PPC::DCBFLP)
  731. L = 3;
  732. else if (Opcode == PPC::DCBFPS)
  733. L = 4;
  734. else if (Opcode == PPC::DCBSTPS)
  735. L = 6;
  736. MCInst TmpInst;
  737. TmpInst.setOpcode(PPC::DCBF);
  738. TmpInst.addOperand(MCOperand::createImm(L));
  739. TmpInst.addOperand(Inst.getOperand(0));
  740. TmpInst.addOperand(Inst.getOperand(1));
  741. Inst = TmpInst;
  742. break;
  743. }
  744. case PPC::LAx: {
  745. MCInst TmpInst;
  746. TmpInst.setOpcode(PPC::LA);
  747. TmpInst.addOperand(Inst.getOperand(0));
  748. TmpInst.addOperand(Inst.getOperand(2));
  749. TmpInst.addOperand(Inst.getOperand(1));
  750. Inst = TmpInst;
  751. break;
  752. }
  753. case PPC::SUBI: {
  754. MCInst TmpInst;
  755. TmpInst.setOpcode(PPC::ADDI);
  756. TmpInst.addOperand(Inst.getOperand(0));
  757. TmpInst.addOperand(Inst.getOperand(1));
  758. addNegOperand(TmpInst, Inst.getOperand(2), getContext());
  759. Inst = TmpInst;
  760. break;
  761. }
  762. case PPC::SUBIS: {
  763. MCInst TmpInst;
  764. TmpInst.setOpcode(PPC::ADDIS);
  765. TmpInst.addOperand(Inst.getOperand(0));
  766. TmpInst.addOperand(Inst.getOperand(1));
  767. addNegOperand(TmpInst, Inst.getOperand(2), getContext());
  768. Inst = TmpInst;
  769. break;
  770. }
  771. case PPC::SUBIC: {
  772. MCInst TmpInst;
  773. TmpInst.setOpcode(PPC::ADDIC);
  774. TmpInst.addOperand(Inst.getOperand(0));
  775. TmpInst.addOperand(Inst.getOperand(1));
  776. addNegOperand(TmpInst, Inst.getOperand(2), getContext());
  777. Inst = TmpInst;
  778. break;
  779. }
  780. case PPC::SUBIC_rec: {
  781. MCInst TmpInst;
  782. TmpInst.setOpcode(PPC::ADDIC_rec);
  783. TmpInst.addOperand(Inst.getOperand(0));
  784. TmpInst.addOperand(Inst.getOperand(1));
  785. addNegOperand(TmpInst, Inst.getOperand(2), getContext());
  786. Inst = TmpInst;
  787. break;
  788. }
  789. case PPC::EXTLWI:
  790. case PPC::EXTLWI_rec: {
  791. MCInst TmpInst;
  792. int64_t N = Inst.getOperand(2).getImm();
  793. int64_t B = Inst.getOperand(3).getImm();
  794. TmpInst.setOpcode(Opcode == PPC::EXTLWI ? PPC::RLWINM : PPC::RLWINM_rec);
  795. TmpInst.addOperand(Inst.getOperand(0));
  796. TmpInst.addOperand(Inst.getOperand(1));
  797. TmpInst.addOperand(MCOperand::createImm(B));
  798. TmpInst.addOperand(MCOperand::createImm(0));
  799. TmpInst.addOperand(MCOperand::createImm(N - 1));
  800. Inst = TmpInst;
  801. break;
  802. }
  803. case PPC::EXTRWI:
  804. case PPC::EXTRWI_rec: {
  805. MCInst TmpInst;
  806. int64_t N = Inst.getOperand(2).getImm();
  807. int64_t B = Inst.getOperand(3).getImm();
  808. TmpInst.setOpcode(Opcode == PPC::EXTRWI ? PPC::RLWINM : PPC::RLWINM_rec);
  809. TmpInst.addOperand(Inst.getOperand(0));
  810. TmpInst.addOperand(Inst.getOperand(1));
  811. TmpInst.addOperand(MCOperand::createImm(B + N));
  812. TmpInst.addOperand(MCOperand::createImm(32 - N));
  813. TmpInst.addOperand(MCOperand::createImm(31));
  814. Inst = TmpInst;
  815. break;
  816. }
  817. case PPC::INSLWI:
  818. case PPC::INSLWI_rec: {
  819. MCInst TmpInst;
  820. int64_t N = Inst.getOperand(2).getImm();
  821. int64_t B = Inst.getOperand(3).getImm();
  822. TmpInst.setOpcode(Opcode == PPC::INSLWI ? PPC::RLWIMI : PPC::RLWIMI_rec);
  823. TmpInst.addOperand(Inst.getOperand(0));
  824. TmpInst.addOperand(Inst.getOperand(0));
  825. TmpInst.addOperand(Inst.getOperand(1));
  826. TmpInst.addOperand(MCOperand::createImm(32 - B));
  827. TmpInst.addOperand(MCOperand::createImm(B));
  828. TmpInst.addOperand(MCOperand::createImm((B + N) - 1));
  829. Inst = TmpInst;
  830. break;
  831. }
  832. case PPC::INSRWI:
  833. case PPC::INSRWI_rec: {
  834. MCInst TmpInst;
  835. int64_t N = Inst.getOperand(2).getImm();
  836. int64_t B = Inst.getOperand(3).getImm();
  837. TmpInst.setOpcode(Opcode == PPC::INSRWI ? PPC::RLWIMI : PPC::RLWIMI_rec);
  838. TmpInst.addOperand(Inst.getOperand(0));
  839. TmpInst.addOperand(Inst.getOperand(0));
  840. TmpInst.addOperand(Inst.getOperand(1));
  841. TmpInst.addOperand(MCOperand::createImm(32 - (B + N)));
  842. TmpInst.addOperand(MCOperand::createImm(B));
  843. TmpInst.addOperand(MCOperand::createImm((B + N) - 1));
  844. Inst = TmpInst;
  845. break;
  846. }
  847. case PPC::ROTRWI:
  848. case PPC::ROTRWI_rec: {
  849. MCInst TmpInst;
  850. int64_t N = Inst.getOperand(2).getImm();
  851. TmpInst.setOpcode(Opcode == PPC::ROTRWI ? PPC::RLWINM : PPC::RLWINM_rec);
  852. TmpInst.addOperand(Inst.getOperand(0));
  853. TmpInst.addOperand(Inst.getOperand(1));
  854. TmpInst.addOperand(MCOperand::createImm(32 - N));
  855. TmpInst.addOperand(MCOperand::createImm(0));
  856. TmpInst.addOperand(MCOperand::createImm(31));
  857. Inst = TmpInst;
  858. break;
  859. }
  860. case PPC::SLWI:
  861. case PPC::SLWI_rec: {
  862. MCInst TmpInst;
  863. int64_t N = Inst.getOperand(2).getImm();
  864. TmpInst.setOpcode(Opcode == PPC::SLWI ? PPC::RLWINM : PPC::RLWINM_rec);
  865. TmpInst.addOperand(Inst.getOperand(0));
  866. TmpInst.addOperand(Inst.getOperand(1));
  867. TmpInst.addOperand(MCOperand::createImm(N));
  868. TmpInst.addOperand(MCOperand::createImm(0));
  869. TmpInst.addOperand(MCOperand::createImm(31 - N));
  870. Inst = TmpInst;
  871. break;
  872. }
  873. case PPC::SRWI:
  874. case PPC::SRWI_rec: {
  875. MCInst TmpInst;
  876. int64_t N = Inst.getOperand(2).getImm();
  877. TmpInst.setOpcode(Opcode == PPC::SRWI ? PPC::RLWINM : PPC::RLWINM_rec);
  878. TmpInst.addOperand(Inst.getOperand(0));
  879. TmpInst.addOperand(Inst.getOperand(1));
  880. TmpInst.addOperand(MCOperand::createImm(32 - N));
  881. TmpInst.addOperand(MCOperand::createImm(N));
  882. TmpInst.addOperand(MCOperand::createImm(31));
  883. Inst = TmpInst;
  884. break;
  885. }
  886. case PPC::CLRRWI:
  887. case PPC::CLRRWI_rec: {
  888. MCInst TmpInst;
  889. int64_t N = Inst.getOperand(2).getImm();
  890. TmpInst.setOpcode(Opcode == PPC::CLRRWI ? PPC::RLWINM : PPC::RLWINM_rec);
  891. TmpInst.addOperand(Inst.getOperand(0));
  892. TmpInst.addOperand(Inst.getOperand(1));
  893. TmpInst.addOperand(MCOperand::createImm(0));
  894. TmpInst.addOperand(MCOperand::createImm(0));
  895. TmpInst.addOperand(MCOperand::createImm(31 - N));
  896. Inst = TmpInst;
  897. break;
  898. }
  899. case PPC::CLRLSLWI:
  900. case PPC::CLRLSLWI_rec: {
  901. MCInst TmpInst;
  902. int64_t B = Inst.getOperand(2).getImm();
  903. int64_t N = Inst.getOperand(3).getImm();
  904. TmpInst.setOpcode(Opcode == PPC::CLRLSLWI ? PPC::RLWINM : PPC::RLWINM_rec);
  905. TmpInst.addOperand(Inst.getOperand(0));
  906. TmpInst.addOperand(Inst.getOperand(1));
  907. TmpInst.addOperand(MCOperand::createImm(N));
  908. TmpInst.addOperand(MCOperand::createImm(B - N));
  909. TmpInst.addOperand(MCOperand::createImm(31 - N));
  910. Inst = TmpInst;
  911. break;
  912. }
  913. case PPC::EXTLDI:
  914. case PPC::EXTLDI_rec: {
  915. MCInst TmpInst;
  916. int64_t N = Inst.getOperand(2).getImm();
  917. int64_t B = Inst.getOperand(3).getImm();
  918. TmpInst.setOpcode(Opcode == PPC::EXTLDI ? PPC::RLDICR : PPC::RLDICR_rec);
  919. TmpInst.addOperand(Inst.getOperand(0));
  920. TmpInst.addOperand(Inst.getOperand(1));
  921. TmpInst.addOperand(MCOperand::createImm(B));
  922. TmpInst.addOperand(MCOperand::createImm(N - 1));
  923. Inst = TmpInst;
  924. break;
  925. }
  926. case PPC::EXTRDI:
  927. case PPC::EXTRDI_rec: {
  928. MCInst TmpInst;
  929. int64_t N = Inst.getOperand(2).getImm();
  930. int64_t B = Inst.getOperand(3).getImm();
  931. TmpInst.setOpcode(Opcode == PPC::EXTRDI ? PPC::RLDICL : PPC::RLDICL_rec);
  932. TmpInst.addOperand(Inst.getOperand(0));
  933. TmpInst.addOperand(Inst.getOperand(1));
  934. TmpInst.addOperand(MCOperand::createImm(B + N));
  935. TmpInst.addOperand(MCOperand::createImm(64 - N));
  936. Inst = TmpInst;
  937. break;
  938. }
  939. case PPC::INSRDI:
  940. case PPC::INSRDI_rec: {
  941. MCInst TmpInst;
  942. int64_t N = Inst.getOperand(2).getImm();
  943. int64_t B = Inst.getOperand(3).getImm();
  944. TmpInst.setOpcode(Opcode == PPC::INSRDI ? PPC::RLDIMI : PPC::RLDIMI_rec);
  945. TmpInst.addOperand(Inst.getOperand(0));
  946. TmpInst.addOperand(Inst.getOperand(0));
  947. TmpInst.addOperand(Inst.getOperand(1));
  948. TmpInst.addOperand(MCOperand::createImm(64 - (B + N)));
  949. TmpInst.addOperand(MCOperand::createImm(B));
  950. Inst = TmpInst;
  951. break;
  952. }
  953. case PPC::ROTRDI:
  954. case PPC::ROTRDI_rec: {
  955. MCInst TmpInst;
  956. int64_t N = Inst.getOperand(2).getImm();
  957. TmpInst.setOpcode(Opcode == PPC::ROTRDI ? PPC::RLDICL : PPC::RLDICL_rec);
  958. TmpInst.addOperand(Inst.getOperand(0));
  959. TmpInst.addOperand(Inst.getOperand(1));
  960. TmpInst.addOperand(MCOperand::createImm(64 - N));
  961. TmpInst.addOperand(MCOperand::createImm(0));
  962. Inst = TmpInst;
  963. break;
  964. }
  965. case PPC::SLDI:
  966. case PPC::SLDI_rec: {
  967. MCInst TmpInst;
  968. int64_t N = Inst.getOperand(2).getImm();
  969. TmpInst.setOpcode(Opcode == PPC::SLDI ? PPC::RLDICR : PPC::RLDICR_rec);
  970. TmpInst.addOperand(Inst.getOperand(0));
  971. TmpInst.addOperand(Inst.getOperand(1));
  972. TmpInst.addOperand(MCOperand::createImm(N));
  973. TmpInst.addOperand(MCOperand::createImm(63 - N));
  974. Inst = TmpInst;
  975. break;
  976. }
  977. case PPC::SUBPCIS: {
  978. MCInst TmpInst;
  979. int64_t N = Inst.getOperand(1).getImm();
  980. TmpInst.setOpcode(PPC::ADDPCIS);
  981. TmpInst.addOperand(Inst.getOperand(0));
  982. TmpInst.addOperand(MCOperand::createImm(-N));
  983. Inst = TmpInst;
  984. break;
  985. }
  986. case PPC::SRDI:
  987. case PPC::SRDI_rec: {
  988. MCInst TmpInst;
  989. int64_t N = Inst.getOperand(2).getImm();
  990. TmpInst.setOpcode(Opcode == PPC::SRDI ? PPC::RLDICL : PPC::RLDICL_rec);
  991. TmpInst.addOperand(Inst.getOperand(0));
  992. TmpInst.addOperand(Inst.getOperand(1));
  993. TmpInst.addOperand(MCOperand::createImm(64 - N));
  994. TmpInst.addOperand(MCOperand::createImm(N));
  995. Inst = TmpInst;
  996. break;
  997. }
  998. case PPC::CLRRDI:
  999. case PPC::CLRRDI_rec: {
  1000. MCInst TmpInst;
  1001. int64_t N = Inst.getOperand(2).getImm();
  1002. TmpInst.setOpcode(Opcode == PPC::CLRRDI ? PPC::RLDICR : PPC::RLDICR_rec);
  1003. TmpInst.addOperand(Inst.getOperand(0));
  1004. TmpInst.addOperand(Inst.getOperand(1));
  1005. TmpInst.addOperand(MCOperand::createImm(0));
  1006. TmpInst.addOperand(MCOperand::createImm(63 - N));
  1007. Inst = TmpInst;
  1008. break;
  1009. }
  1010. case PPC::CLRLSLDI:
  1011. case PPC::CLRLSLDI_rec: {
  1012. MCInst TmpInst;
  1013. int64_t B = Inst.getOperand(2).getImm();
  1014. int64_t N = Inst.getOperand(3).getImm();
  1015. TmpInst.setOpcode(Opcode == PPC::CLRLSLDI ? PPC::RLDIC : PPC::RLDIC_rec);
  1016. TmpInst.addOperand(Inst.getOperand(0));
  1017. TmpInst.addOperand(Inst.getOperand(1));
  1018. TmpInst.addOperand(MCOperand::createImm(N));
  1019. TmpInst.addOperand(MCOperand::createImm(B - N));
  1020. Inst = TmpInst;
  1021. break;
  1022. }
  1023. case PPC::RLWINMbm:
  1024. case PPC::RLWINMbm_rec: {
  1025. unsigned MB, ME;
  1026. int64_t BM = Inst.getOperand(3).getImm();
  1027. if (!isRunOfOnes(BM, MB, ME))
  1028. break;
  1029. MCInst TmpInst;
  1030. TmpInst.setOpcode(Opcode == PPC::RLWINMbm ? PPC::RLWINM : PPC::RLWINM_rec);
  1031. TmpInst.addOperand(Inst.getOperand(0));
  1032. TmpInst.addOperand(Inst.getOperand(1));
  1033. TmpInst.addOperand(Inst.getOperand(2));
  1034. TmpInst.addOperand(MCOperand::createImm(MB));
  1035. TmpInst.addOperand(MCOperand::createImm(ME));
  1036. Inst = TmpInst;
  1037. break;
  1038. }
  1039. case PPC::RLWIMIbm:
  1040. case PPC::RLWIMIbm_rec: {
  1041. unsigned MB, ME;
  1042. int64_t BM = Inst.getOperand(3).getImm();
  1043. if (!isRunOfOnes(BM, MB, ME))
  1044. break;
  1045. MCInst TmpInst;
  1046. TmpInst.setOpcode(Opcode == PPC::RLWIMIbm ? PPC::RLWIMI : PPC::RLWIMI_rec);
  1047. TmpInst.addOperand(Inst.getOperand(0));
  1048. TmpInst.addOperand(Inst.getOperand(0)); // The tied operand.
  1049. TmpInst.addOperand(Inst.getOperand(1));
  1050. TmpInst.addOperand(Inst.getOperand(2));
  1051. TmpInst.addOperand(MCOperand::createImm(MB));
  1052. TmpInst.addOperand(MCOperand::createImm(ME));
  1053. Inst = TmpInst;
  1054. break;
  1055. }
  1056. case PPC::RLWNMbm:
  1057. case PPC::RLWNMbm_rec: {
  1058. unsigned MB, ME;
  1059. int64_t BM = Inst.getOperand(3).getImm();
  1060. if (!isRunOfOnes(BM, MB, ME))
  1061. break;
  1062. MCInst TmpInst;
  1063. TmpInst.setOpcode(Opcode == PPC::RLWNMbm ? PPC::RLWNM : PPC::RLWNM_rec);
  1064. TmpInst.addOperand(Inst.getOperand(0));
  1065. TmpInst.addOperand(Inst.getOperand(1));
  1066. TmpInst.addOperand(Inst.getOperand(2));
  1067. TmpInst.addOperand(MCOperand::createImm(MB));
  1068. TmpInst.addOperand(MCOperand::createImm(ME));
  1069. Inst = TmpInst;
  1070. break;
  1071. }
  1072. case PPC::MFTB: {
  1073. if (getSTI().getFeatureBits()[PPC::FeatureMFTB]) {
  1074. assert(Inst.getNumOperands() == 2 && "Expecting two operands");
  1075. Inst.setOpcode(PPC::MFSPR);
  1076. }
  1077. break;
  1078. }
  1079. }
  1080. }
  1081. static std::string PPCMnemonicSpellCheck(StringRef S, const FeatureBitset &FBS,
  1082. unsigned VariantID = 0);
  1083. bool PPCAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
  1084. OperandVector &Operands,
  1085. MCStreamer &Out, uint64_t &ErrorInfo,
  1086. bool MatchingInlineAsm) {
  1087. MCInst Inst;
  1088. switch (MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm)) {
  1089. case Match_Success:
  1090. // Post-process instructions (typically extended mnemonics)
  1091. ProcessInstruction(Inst, Operands);
  1092. Inst.setLoc(IDLoc);
  1093. Out.emitInstruction(Inst, getSTI());
  1094. return false;
  1095. case Match_MissingFeature:
  1096. return Error(IDLoc, "instruction use requires an option to be enabled");
  1097. case Match_MnemonicFail: {
  1098. FeatureBitset FBS = ComputeAvailableFeatures(getSTI().getFeatureBits());
  1099. std::string Suggestion = PPCMnemonicSpellCheck(
  1100. ((PPCOperand &)*Operands[0]).getToken(), FBS);
  1101. return Error(IDLoc, "invalid instruction" + Suggestion,
  1102. ((PPCOperand &)*Operands[0]).getLocRange());
  1103. }
  1104. case Match_InvalidOperand: {
  1105. SMLoc ErrorLoc = IDLoc;
  1106. if (ErrorInfo != ~0ULL) {
  1107. if (ErrorInfo >= Operands.size())
  1108. return Error(IDLoc, "too few operands for instruction");
  1109. ErrorLoc = ((PPCOperand &)*Operands[ErrorInfo]).getStartLoc();
  1110. if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
  1111. }
  1112. return Error(ErrorLoc, "invalid operand for instruction");
  1113. }
  1114. }
  1115. llvm_unreachable("Implement any new match types added!");
  1116. }
  1117. bool PPCAsmParser::MatchRegisterName(MCRegister &RegNo, int64_t &IntVal) {
  1118. if (getParser().getTok().is(AsmToken::Percent))
  1119. getParser().Lex(); // Eat the '%'.
  1120. if (!getParser().getTok().is(AsmToken::Identifier))
  1121. return true;
  1122. StringRef Name = getParser().getTok().getString();
  1123. if (Name.equals_insensitive("lr")) {
  1124. RegNo = isPPC64() ? PPC::LR8 : PPC::LR;
  1125. IntVal = 8;
  1126. } else if (Name.equals_insensitive("ctr")) {
  1127. RegNo = isPPC64() ? PPC::CTR8 : PPC::CTR;
  1128. IntVal = 9;
  1129. } else if (Name.equals_insensitive("vrsave")) {
  1130. RegNo = PPC::VRSAVE;
  1131. IntVal = 256;
  1132. } else if (Name.startswith_insensitive("r") &&
  1133. !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) {
  1134. RegNo = isPPC64() ? XRegs[IntVal] : RRegs[IntVal];
  1135. } else if (Name.startswith_insensitive("f") &&
  1136. !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) {
  1137. RegNo = FRegs[IntVal];
  1138. } else if (Name.startswith_insensitive("vs") &&
  1139. !Name.substr(2).getAsInteger(10, IntVal) && IntVal < 64) {
  1140. RegNo = VSRegs[IntVal];
  1141. } else if (Name.startswith_insensitive("v") &&
  1142. !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) {
  1143. RegNo = VRegs[IntVal];
  1144. } else if (Name.startswith_insensitive("cr") &&
  1145. !Name.substr(2).getAsInteger(10, IntVal) && IntVal < 8) {
  1146. RegNo = CRRegs[IntVal];
  1147. } else if (Name.startswith_insensitive("acc") &&
  1148. !Name.substr(3).getAsInteger(10, IntVal) && IntVal < 8) {
  1149. RegNo = ACCRegs[IntVal];
  1150. } else if (Name.startswith_insensitive("wacc_hi") &&
  1151. !Name.substr(7).getAsInteger(10, IntVal) && IntVal < 8) {
  1152. RegNo = ACCRegs[IntVal];
  1153. } else if (Name.startswith_insensitive("wacc") &&
  1154. !Name.substr(4).getAsInteger(10, IntVal) && IntVal < 8) {
  1155. RegNo = WACCRegs[IntVal];
  1156. } else if (Name.startswith_insensitive("dmrrowp") &&
  1157. !Name.substr(7).getAsInteger(10, IntVal) && IntVal < 32) {
  1158. RegNo = DMRROWpRegs[IntVal];
  1159. } else if (Name.startswith_insensitive("dmrrow") &&
  1160. !Name.substr(6).getAsInteger(10, IntVal) && IntVal < 64) {
  1161. RegNo = DMRROWRegs[IntVal];
  1162. } else if (Name.startswith_insensitive("dmrp") &&
  1163. !Name.substr(4).getAsInteger(10, IntVal) && IntVal < 4) {
  1164. RegNo = DMRROWpRegs[IntVal];
  1165. } else if (Name.startswith_insensitive("dmr") &&
  1166. !Name.substr(3).getAsInteger(10, IntVal) && IntVal < 8) {
  1167. RegNo = DMRRegs[IntVal];
  1168. } else
  1169. return true;
  1170. getParser().Lex();
  1171. return false;
  1172. }
  1173. bool PPCAsmParser::parseRegister(MCRegister &RegNo, SMLoc &StartLoc,
  1174. SMLoc &EndLoc) {
  1175. if (tryParseRegister(RegNo, StartLoc, EndLoc) != MatchOperand_Success)
  1176. return TokError("invalid register name");
  1177. return false;
  1178. }
  1179. OperandMatchResultTy PPCAsmParser::tryParseRegister(MCRegister &RegNo,
  1180. SMLoc &StartLoc,
  1181. SMLoc &EndLoc) {
  1182. const AsmToken &Tok = getParser().getTok();
  1183. StartLoc = Tok.getLoc();
  1184. EndLoc = Tok.getEndLoc();
  1185. RegNo = 0;
  1186. int64_t IntVal;
  1187. if (MatchRegisterName(RegNo, IntVal))
  1188. return MatchOperand_NoMatch;
  1189. return MatchOperand_Success;
  1190. }
  1191. /// Extract \code @l/@ha \endcode modifier from expression. Recursively scan
  1192. /// the expression and check for VK_PPC_LO/HI/HA
  1193. /// symbol variants. If all symbols with modifier use the same
  1194. /// variant, return the corresponding PPCMCExpr::VariantKind,
  1195. /// and a modified expression using the default symbol variant.
  1196. /// Otherwise, return NULL.
  1197. const MCExpr *PPCAsmParser::
  1198. ExtractModifierFromExpr(const MCExpr *E,
  1199. PPCMCExpr::VariantKind &Variant) {
  1200. MCContext &Context = getParser().getContext();
  1201. Variant = PPCMCExpr::VK_PPC_None;
  1202. switch (E->getKind()) {
  1203. case MCExpr::Target:
  1204. case MCExpr::Constant:
  1205. return nullptr;
  1206. case MCExpr::SymbolRef: {
  1207. const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
  1208. switch (SRE->getKind()) {
  1209. case MCSymbolRefExpr::VK_PPC_LO:
  1210. Variant = PPCMCExpr::VK_PPC_LO;
  1211. break;
  1212. case MCSymbolRefExpr::VK_PPC_HI:
  1213. Variant = PPCMCExpr::VK_PPC_HI;
  1214. break;
  1215. case MCSymbolRefExpr::VK_PPC_HA:
  1216. Variant = PPCMCExpr::VK_PPC_HA;
  1217. break;
  1218. case MCSymbolRefExpr::VK_PPC_HIGH:
  1219. Variant = PPCMCExpr::VK_PPC_HIGH;
  1220. break;
  1221. case MCSymbolRefExpr::VK_PPC_HIGHA:
  1222. Variant = PPCMCExpr::VK_PPC_HIGHA;
  1223. break;
  1224. case MCSymbolRefExpr::VK_PPC_HIGHER:
  1225. Variant = PPCMCExpr::VK_PPC_HIGHER;
  1226. break;
  1227. case MCSymbolRefExpr::VK_PPC_HIGHERA:
  1228. Variant = PPCMCExpr::VK_PPC_HIGHERA;
  1229. break;
  1230. case MCSymbolRefExpr::VK_PPC_HIGHEST:
  1231. Variant = PPCMCExpr::VK_PPC_HIGHEST;
  1232. break;
  1233. case MCSymbolRefExpr::VK_PPC_HIGHESTA:
  1234. Variant = PPCMCExpr::VK_PPC_HIGHESTA;
  1235. break;
  1236. default:
  1237. return nullptr;
  1238. }
  1239. return MCSymbolRefExpr::create(&SRE->getSymbol(), Context);
  1240. }
  1241. case MCExpr::Unary: {
  1242. const MCUnaryExpr *UE = cast<MCUnaryExpr>(E);
  1243. const MCExpr *Sub = ExtractModifierFromExpr(UE->getSubExpr(), Variant);
  1244. if (!Sub)
  1245. return nullptr;
  1246. return MCUnaryExpr::create(UE->getOpcode(), Sub, Context);
  1247. }
  1248. case MCExpr::Binary: {
  1249. const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
  1250. PPCMCExpr::VariantKind LHSVariant, RHSVariant;
  1251. const MCExpr *LHS = ExtractModifierFromExpr(BE->getLHS(), LHSVariant);
  1252. const MCExpr *RHS = ExtractModifierFromExpr(BE->getRHS(), RHSVariant);
  1253. if (!LHS && !RHS)
  1254. return nullptr;
  1255. if (!LHS) LHS = BE->getLHS();
  1256. if (!RHS) RHS = BE->getRHS();
  1257. if (LHSVariant == PPCMCExpr::VK_PPC_None)
  1258. Variant = RHSVariant;
  1259. else if (RHSVariant == PPCMCExpr::VK_PPC_None)
  1260. Variant = LHSVariant;
  1261. else if (LHSVariant == RHSVariant)
  1262. Variant = LHSVariant;
  1263. else
  1264. return nullptr;
  1265. return MCBinaryExpr::create(BE->getOpcode(), LHS, RHS, Context);
  1266. }
  1267. }
  1268. llvm_unreachable("Invalid expression kind!");
  1269. }
  1270. /// Find all VK_TLSGD/VK_TLSLD symbol references in expression and replace
  1271. /// them by VK_PPC_TLSGD/VK_PPC_TLSLD. This is necessary to avoid having
  1272. /// _GLOBAL_OFFSET_TABLE_ created via ELFObjectWriter::RelocNeedsGOT.
  1273. /// FIXME: This is a hack.
  1274. const MCExpr *PPCAsmParser::
  1275. FixupVariantKind(const MCExpr *E) {
  1276. MCContext &Context = getParser().getContext();
  1277. switch (E->getKind()) {
  1278. case MCExpr::Target:
  1279. case MCExpr::Constant:
  1280. return E;
  1281. case MCExpr::SymbolRef: {
  1282. const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
  1283. MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
  1284. switch (SRE->getKind()) {
  1285. case MCSymbolRefExpr::VK_TLSGD:
  1286. Variant = MCSymbolRefExpr::VK_PPC_TLSGD;
  1287. break;
  1288. case MCSymbolRefExpr::VK_TLSLD:
  1289. Variant = MCSymbolRefExpr::VK_PPC_TLSLD;
  1290. break;
  1291. default:
  1292. return E;
  1293. }
  1294. return MCSymbolRefExpr::create(&SRE->getSymbol(), Variant, Context);
  1295. }
  1296. case MCExpr::Unary: {
  1297. const MCUnaryExpr *UE = cast<MCUnaryExpr>(E);
  1298. const MCExpr *Sub = FixupVariantKind(UE->getSubExpr());
  1299. if (Sub == UE->getSubExpr())
  1300. return E;
  1301. return MCUnaryExpr::create(UE->getOpcode(), Sub, Context);
  1302. }
  1303. case MCExpr::Binary: {
  1304. const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
  1305. const MCExpr *LHS = FixupVariantKind(BE->getLHS());
  1306. const MCExpr *RHS = FixupVariantKind(BE->getRHS());
  1307. if (LHS == BE->getLHS() && RHS == BE->getRHS())
  1308. return E;
  1309. return MCBinaryExpr::create(BE->getOpcode(), LHS, RHS, Context);
  1310. }
  1311. }
  1312. llvm_unreachable("Invalid expression kind!");
  1313. }
  1314. /// ParseExpression. This differs from the default "parseExpression" in that
  1315. /// it handles modifiers.
  1316. bool PPCAsmParser::
  1317. ParseExpression(const MCExpr *&EVal) {
  1318. // (ELF Platforms)
  1319. // Handle \code @l/@ha \endcode
  1320. if (getParser().parseExpression(EVal))
  1321. return true;
  1322. EVal = FixupVariantKind(EVal);
  1323. PPCMCExpr::VariantKind Variant;
  1324. const MCExpr *E = ExtractModifierFromExpr(EVal, Variant);
  1325. if (E)
  1326. EVal = PPCMCExpr::create(Variant, E, getParser().getContext());
  1327. return false;
  1328. }
  1329. /// ParseOperand
  1330. /// This handles registers in the form 'NN', '%rNN' for ELF platforms and
  1331. /// rNN for MachO.
  1332. bool PPCAsmParser::ParseOperand(OperandVector &Operands) {
  1333. MCAsmParser &Parser = getParser();
  1334. SMLoc S = Parser.getTok().getLoc();
  1335. SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
  1336. const MCExpr *EVal;
  1337. // Attempt to parse the next token as an immediate
  1338. switch (getLexer().getKind()) {
  1339. // Special handling for register names. These are interpreted
  1340. // as immediates corresponding to the register number.
  1341. case AsmToken::Percent: {
  1342. MCRegister RegNo;
  1343. int64_t IntVal;
  1344. if (MatchRegisterName(RegNo, IntVal))
  1345. return Error(S, "invalid register name");
  1346. Operands.push_back(PPCOperand::CreateImm(IntVal, S, E, isPPC64()));
  1347. return false;
  1348. }
  1349. case AsmToken::Identifier:
  1350. case AsmToken::LParen:
  1351. case AsmToken::Plus:
  1352. case AsmToken::Minus:
  1353. case AsmToken::Integer:
  1354. case AsmToken::Dot:
  1355. case AsmToken::Dollar:
  1356. case AsmToken::Exclaim:
  1357. case AsmToken::Tilde:
  1358. if (!ParseExpression(EVal))
  1359. break;
  1360. // Fall-through
  1361. [[fallthrough]];
  1362. default:
  1363. return Error(S, "unknown operand");
  1364. }
  1365. // Push the parsed operand into the list of operands
  1366. Operands.push_back(PPCOperand::CreateFromMCExpr(EVal, S, E, isPPC64()));
  1367. // Check whether this is a TLS call expression
  1368. bool TLSCall = false;
  1369. if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(EVal))
  1370. TLSCall = Ref->getSymbol().getName() == "__tls_get_addr";
  1371. if (TLSCall && getLexer().is(AsmToken::LParen)) {
  1372. const MCExpr *TLSSym;
  1373. Parser.Lex(); // Eat the '('.
  1374. S = Parser.getTok().getLoc();
  1375. if (ParseExpression(TLSSym))
  1376. return Error(S, "invalid TLS call expression");
  1377. if (getLexer().isNot(AsmToken::RParen))
  1378. return Error(Parser.getTok().getLoc(), "missing ')'");
  1379. E = Parser.getTok().getLoc();
  1380. Parser.Lex(); // Eat the ')'.
  1381. Operands.push_back(PPCOperand::CreateFromMCExpr(TLSSym, S, E, isPPC64()));
  1382. }
  1383. // Otherwise, check for D-form memory operands
  1384. if (!TLSCall && getLexer().is(AsmToken::LParen)) {
  1385. Parser.Lex(); // Eat the '('.
  1386. S = Parser.getTok().getLoc();
  1387. int64_t IntVal;
  1388. switch (getLexer().getKind()) {
  1389. case AsmToken::Percent: {
  1390. MCRegister RegNo;
  1391. if (MatchRegisterName(RegNo, IntVal))
  1392. return Error(S, "invalid register name");
  1393. break;
  1394. }
  1395. case AsmToken::Integer:
  1396. if (getParser().parseAbsoluteExpression(IntVal) || IntVal < 0 ||
  1397. IntVal > 31)
  1398. return Error(S, "invalid register number");
  1399. break;
  1400. case AsmToken::Identifier:
  1401. default:
  1402. return Error(S, "invalid memory operand");
  1403. }
  1404. E = Parser.getTok().getLoc();
  1405. if (parseToken(AsmToken::RParen, "missing ')'"))
  1406. return true;
  1407. Operands.push_back(PPCOperand::CreateImm(IntVal, S, E, isPPC64()));
  1408. }
  1409. return false;
  1410. }
  1411. /// Parse an instruction mnemonic followed by its operands.
  1412. bool PPCAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
  1413. SMLoc NameLoc, OperandVector &Operands) {
  1414. // The first operand is the token for the instruction name.
  1415. // If the next character is a '+' or '-', we need to add it to the
  1416. // instruction name, to match what TableGen is doing.
  1417. std::string NewOpcode;
  1418. if (parseOptionalToken(AsmToken::Plus)) {
  1419. NewOpcode = std::string(Name);
  1420. NewOpcode += '+';
  1421. Name = NewOpcode;
  1422. }
  1423. if (parseOptionalToken(AsmToken::Minus)) {
  1424. NewOpcode = std::string(Name);
  1425. NewOpcode += '-';
  1426. Name = NewOpcode;
  1427. }
  1428. // If the instruction ends in a '.', we need to create a separate
  1429. // token for it, to match what TableGen is doing.
  1430. size_t Dot = Name.find('.');
  1431. StringRef Mnemonic = Name.slice(0, Dot);
  1432. if (!NewOpcode.empty()) // Underlying memory for Name is volatile.
  1433. Operands.push_back(
  1434. PPCOperand::CreateTokenWithStringCopy(Mnemonic, NameLoc, isPPC64()));
  1435. else
  1436. Operands.push_back(PPCOperand::CreateToken(Mnemonic, NameLoc, isPPC64()));
  1437. if (Dot != StringRef::npos) {
  1438. SMLoc DotLoc = SMLoc::getFromPointer(NameLoc.getPointer() + Dot);
  1439. StringRef DotStr = Name.slice(Dot, StringRef::npos);
  1440. if (!NewOpcode.empty()) // Underlying memory for Name is volatile.
  1441. Operands.push_back(
  1442. PPCOperand::CreateTokenWithStringCopy(DotStr, DotLoc, isPPC64()));
  1443. else
  1444. Operands.push_back(PPCOperand::CreateToken(DotStr, DotLoc, isPPC64()));
  1445. }
  1446. // If there are no more operands then finish
  1447. if (parseOptionalToken(AsmToken::EndOfStatement))
  1448. return false;
  1449. // Parse the first operand
  1450. if (ParseOperand(Operands))
  1451. return true;
  1452. while (!parseOptionalToken(AsmToken::EndOfStatement)) {
  1453. if (parseToken(AsmToken::Comma) || ParseOperand(Operands))
  1454. return true;
  1455. }
  1456. // We'll now deal with an unfortunate special case: the syntax for the dcbt
  1457. // and dcbtst instructions differs for server vs. embedded cores.
  1458. // The syntax for dcbt is:
  1459. // dcbt ra, rb, th [server]
  1460. // dcbt th, ra, rb [embedded]
  1461. // where th can be omitted when it is 0. dcbtst is the same. We take the
  1462. // server form to be the default, so swap the operands if we're parsing for
  1463. // an embedded core (they'll be swapped again upon printing).
  1464. if (getSTI().getFeatureBits()[PPC::FeatureBookE] &&
  1465. Operands.size() == 4 &&
  1466. (Name == "dcbt" || Name == "dcbtst")) {
  1467. std::swap(Operands[1], Operands[3]);
  1468. std::swap(Operands[2], Operands[1]);
  1469. }
  1470. // Handle base mnemonic for atomic loads where the EH bit is zero.
  1471. if (Name == "lqarx" || Name == "ldarx" || Name == "lwarx" ||
  1472. Name == "lharx" || Name == "lbarx") {
  1473. if (Operands.size() != 5)
  1474. return false;
  1475. PPCOperand &EHOp = (PPCOperand &)*Operands[4];
  1476. if (EHOp.isU1Imm() && EHOp.getImm() == 0)
  1477. Operands.pop_back();
  1478. }
  1479. return false;
  1480. }
  1481. /// ParseDirective parses the PPC specific directives
  1482. bool PPCAsmParser::ParseDirective(AsmToken DirectiveID) {
  1483. StringRef IDVal = DirectiveID.getIdentifier();
  1484. if (IDVal == ".word")
  1485. ParseDirectiveWord(2, DirectiveID);
  1486. else if (IDVal == ".llong")
  1487. ParseDirectiveWord(8, DirectiveID);
  1488. else if (IDVal == ".tc")
  1489. ParseDirectiveTC(isPPC64() ? 8 : 4, DirectiveID);
  1490. else if (IDVal == ".machine")
  1491. ParseDirectiveMachine(DirectiveID.getLoc());
  1492. else if (IDVal == ".abiversion")
  1493. ParseDirectiveAbiVersion(DirectiveID.getLoc());
  1494. else if (IDVal == ".localentry")
  1495. ParseDirectiveLocalEntry(DirectiveID.getLoc());
  1496. else if (IDVal.startswith(".gnu_attribute"))
  1497. ParseGNUAttribute(DirectiveID.getLoc());
  1498. else
  1499. return true;
  1500. return false;
  1501. }
  1502. /// ParseDirectiveWord
  1503. /// ::= .word [ expression (, expression)* ]
  1504. bool PPCAsmParser::ParseDirectiveWord(unsigned Size, AsmToken ID) {
  1505. auto parseOp = [&]() -> bool {
  1506. const MCExpr *Value;
  1507. SMLoc ExprLoc = getParser().getTok().getLoc();
  1508. if (getParser().parseExpression(Value))
  1509. return true;
  1510. if (const auto *MCE = dyn_cast<MCConstantExpr>(Value)) {
  1511. assert(Size <= 8 && "Invalid size");
  1512. uint64_t IntValue = MCE->getValue();
  1513. if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue))
  1514. return Error(ExprLoc, "literal value out of range for '" +
  1515. ID.getIdentifier() + "' directive");
  1516. getStreamer().emitIntValue(IntValue, Size);
  1517. } else
  1518. getStreamer().emitValue(Value, Size, ExprLoc);
  1519. return false;
  1520. };
  1521. if (parseMany(parseOp))
  1522. return addErrorSuffix(" in '" + ID.getIdentifier() + "' directive");
  1523. return false;
  1524. }
  1525. /// ParseDirectiveTC
  1526. /// ::= .tc [ symbol (, expression)* ]
  1527. bool PPCAsmParser::ParseDirectiveTC(unsigned Size, AsmToken ID) {
  1528. MCAsmParser &Parser = getParser();
  1529. // Skip TC symbol, which is only used with XCOFF.
  1530. while (getLexer().isNot(AsmToken::EndOfStatement)
  1531. && getLexer().isNot(AsmToken::Comma))
  1532. Parser.Lex();
  1533. if (parseToken(AsmToken::Comma))
  1534. return addErrorSuffix(" in '.tc' directive");
  1535. // Align to word size.
  1536. getParser().getStreamer().emitValueToAlignment(Align(Size));
  1537. // Emit expressions.
  1538. return ParseDirectiveWord(Size, ID);
  1539. }
  1540. /// ParseDirectiveMachine (ELF platforms)
  1541. /// ::= .machine [ cpu | "push" | "pop" ]
  1542. bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) {
  1543. MCAsmParser &Parser = getParser();
  1544. if (Parser.getTok().isNot(AsmToken::Identifier) &&
  1545. Parser.getTok().isNot(AsmToken::String))
  1546. return Error(L, "unexpected token in '.machine' directive");
  1547. StringRef CPU = Parser.getTok().getIdentifier();
  1548. // FIXME: Right now, the parser always allows any available
  1549. // instruction, so the .machine directive is not useful.
  1550. // In the wild, any/push/pop/ppc64/altivec/power[4-9] are seen.
  1551. Parser.Lex();
  1552. if (parseToken(AsmToken::EndOfStatement))
  1553. return addErrorSuffix(" in '.machine' directive");
  1554. PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
  1555. getParser().getStreamer().getTargetStreamer());
  1556. if (TStreamer != nullptr)
  1557. TStreamer->emitMachine(CPU);
  1558. return false;
  1559. }
  1560. /// ParseDirectiveAbiVersion
  1561. /// ::= .abiversion constant-expression
  1562. bool PPCAsmParser::ParseDirectiveAbiVersion(SMLoc L) {
  1563. int64_t AbiVersion;
  1564. if (check(getParser().parseAbsoluteExpression(AbiVersion), L,
  1565. "expected constant expression") ||
  1566. parseToken(AsmToken::EndOfStatement))
  1567. return addErrorSuffix(" in '.abiversion' directive");
  1568. PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
  1569. getParser().getStreamer().getTargetStreamer());
  1570. if (TStreamer != nullptr)
  1571. TStreamer->emitAbiVersion(AbiVersion);
  1572. return false;
  1573. }
  1574. /// ParseDirectiveLocalEntry
  1575. /// ::= .localentry symbol, expression
  1576. bool PPCAsmParser::ParseDirectiveLocalEntry(SMLoc L) {
  1577. StringRef Name;
  1578. if (getParser().parseIdentifier(Name))
  1579. return Error(L, "expected identifier in '.localentry' directive");
  1580. MCSymbolELF *Sym = cast<MCSymbolELF>(getContext().getOrCreateSymbol(Name));
  1581. const MCExpr *Expr;
  1582. if (parseToken(AsmToken::Comma) ||
  1583. check(getParser().parseExpression(Expr), L, "expected expression") ||
  1584. parseToken(AsmToken::EndOfStatement))
  1585. return addErrorSuffix(" in '.localentry' directive");
  1586. PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
  1587. getParser().getStreamer().getTargetStreamer());
  1588. if (TStreamer != nullptr)
  1589. TStreamer->emitLocalEntry(Sym, Expr);
  1590. return false;
  1591. }
  1592. bool PPCAsmParser::ParseGNUAttribute(SMLoc L) {
  1593. int64_t Tag;
  1594. int64_t IntegerValue;
  1595. if (!getParser().parseGNUAttribute(L, Tag, IntegerValue))
  1596. return false;
  1597. getParser().getStreamer().emitGNUAttribute(Tag, IntegerValue);
  1598. return true;
  1599. }
  1600. /// Force static initialization.
  1601. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCAsmParser() {
  1602. RegisterMCAsmParser<PPCAsmParser> A(getThePPC32Target());
  1603. RegisterMCAsmParser<PPCAsmParser> B(getThePPC32LETarget());
  1604. RegisterMCAsmParser<PPCAsmParser> C(getThePPC64Target());
  1605. RegisterMCAsmParser<PPCAsmParser> D(getThePPC64LETarget());
  1606. }
  1607. #define GET_REGISTER_MATCHER
  1608. #define GET_MATCHER_IMPLEMENTATION
  1609. #define GET_MNEMONIC_SPELL_CHECKER
  1610. #include "PPCGenAsmMatcher.inc"
  1611. // Define this matcher function after the auto-generated include so we
  1612. // have the match class enum definitions.
  1613. unsigned PPCAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp,
  1614. unsigned Kind) {
  1615. // If the kind is a token for a literal immediate, check if our asm
  1616. // operand matches. This is for InstAliases which have a fixed-value
  1617. // immediate in the syntax.
  1618. int64_t ImmVal;
  1619. switch (Kind) {
  1620. case MCK_0: ImmVal = 0; break;
  1621. case MCK_1: ImmVal = 1; break;
  1622. case MCK_2: ImmVal = 2; break;
  1623. case MCK_3: ImmVal = 3; break;
  1624. case MCK_4: ImmVal = 4; break;
  1625. case MCK_5: ImmVal = 5; break;
  1626. case MCK_6: ImmVal = 6; break;
  1627. case MCK_7: ImmVal = 7; break;
  1628. default: return Match_InvalidOperand;
  1629. }
  1630. PPCOperand &Op = static_cast<PPCOperand &>(AsmOp);
  1631. if (Op.isU3Imm() && Op.getImm() == ImmVal)
  1632. return Match_Success;
  1633. return Match_InvalidOperand;
  1634. }
  1635. const MCExpr *
  1636. PPCAsmParser::applyModifierToExpr(const MCExpr *E,
  1637. MCSymbolRefExpr::VariantKind Variant,
  1638. MCContext &Ctx) {
  1639. switch (Variant) {
  1640. case MCSymbolRefExpr::VK_PPC_LO:
  1641. return PPCMCExpr::create(PPCMCExpr::VK_PPC_LO, E, Ctx);
  1642. case MCSymbolRefExpr::VK_PPC_HI:
  1643. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HI, E, Ctx);
  1644. case MCSymbolRefExpr::VK_PPC_HA:
  1645. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HA, E, Ctx);
  1646. case MCSymbolRefExpr::VK_PPC_HIGH:
  1647. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGH, E, Ctx);
  1648. case MCSymbolRefExpr::VK_PPC_HIGHA:
  1649. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHA, E, Ctx);
  1650. case MCSymbolRefExpr::VK_PPC_HIGHER:
  1651. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHER, E, Ctx);
  1652. case MCSymbolRefExpr::VK_PPC_HIGHERA:
  1653. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHERA, E, Ctx);
  1654. case MCSymbolRefExpr::VK_PPC_HIGHEST:
  1655. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHEST, E, Ctx);
  1656. case MCSymbolRefExpr::VK_PPC_HIGHESTA:
  1657. return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHESTA, E, Ctx);
  1658. default:
  1659. return nullptr;
  1660. }
  1661. }