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