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