PPCAsmParser.cpp 57 KB

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