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