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