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