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