ARMAsmParser.cpp revision 89df996ab20609676ecc8823f58414d598b09b46
1//===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "MCTargetDesc/ARMBaseInfo.h"
11#include "MCTargetDesc/ARMAddressingModes.h"
12#include "MCTargetDesc/ARMMCExpr.h"
13#include "llvm/MC/MCParser/MCAsmLexer.h"
14#include "llvm/MC/MCParser/MCAsmParser.h"
15#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
16#include "llvm/MC/MCAsmInfo.h"
17#include "llvm/MC/MCContext.h"
18#include "llvm/MC/MCStreamer.h"
19#include "llvm/MC/MCExpr.h"
20#include "llvm/MC/MCInst.h"
21#include "llvm/MC/MCInstrDesc.h"
22#include "llvm/MC/MCRegisterInfo.h"
23#include "llvm/MC/MCSubtargetInfo.h"
24#include "llvm/MC/MCTargetAsmParser.h"
25#include "llvm/Support/MathExtras.h"
26#include "llvm/Support/SourceMgr.h"
27#include "llvm/Support/TargetRegistry.h"
28#include "llvm/Support/raw_ostream.h"
29#include "llvm/ADT/BitVector.h"
30#include "llvm/ADT/OwningPtr.h"
31#include "llvm/ADT/STLExtras.h"
32#include "llvm/ADT/SmallVector.h"
33#include "llvm/ADT/StringExtras.h"
34#include "llvm/ADT/StringSwitch.h"
35#include "llvm/ADT/Twine.h"
36
37using namespace llvm;
38
39namespace {
40
41class ARMOperand;
42
43class ARMAsmParser : public MCTargetAsmParser {
44  MCSubtargetInfo &STI;
45  MCAsmParser &Parser;
46
47  MCAsmParser &getParser() const { return Parser; }
48  MCAsmLexer &getLexer() const { return Parser.getLexer(); }
49
50  void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
51  bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
52
53  int tryParseRegister();
54  bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &);
55  int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &);
56  bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &);
57  bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &);
58  bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic);
59  bool parsePrefix(ARMMCExpr::VariantKind &RefKind);
60  const MCExpr *applyPrefixToExpr(const MCExpr *E,
61                                  MCSymbolRefExpr::VariantKind Variant);
62
63
64  bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType,
65                              unsigned &ShiftAmount);
66  bool parseDirectiveWord(unsigned Size, SMLoc L);
67  bool parseDirectiveThumb(SMLoc L);
68  bool parseDirectiveThumbFunc(SMLoc L);
69  bool parseDirectiveCode(SMLoc L);
70  bool parseDirectiveSyntax(SMLoc L);
71
72  StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
73                          bool &CarrySetting, unsigned &ProcessorIMod,
74                          StringRef &ITMask);
75  void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
76                             bool &CanAcceptPredicationCode);
77
78  bool isThumb() const {
79    // FIXME: Can tablegen auto-generate this?
80    return (STI.getFeatureBits() & ARM::ModeThumb) != 0;
81  }
82  bool isThumbOne() const {
83    return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0;
84  }
85  bool isThumbTwo() const {
86    return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2);
87  }
88  bool hasV6Ops() const {
89    return STI.getFeatureBits() & ARM::HasV6Ops;
90  }
91  void SwitchMode() {
92    unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb));
93    setAvailableFeatures(FB);
94  }
95
96  /// @name Auto-generated Match Functions
97  /// {
98
99#define GET_ASSEMBLER_HEADER
100#include "ARMGenAsmMatcher.inc"
101
102  /// }
103
104  OperandMatchResultTy parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*>&);
105  OperandMatchResultTy parseCoprocNumOperand(
106    SmallVectorImpl<MCParsedAsmOperand*>&);
107  OperandMatchResultTy parseCoprocRegOperand(
108    SmallVectorImpl<MCParsedAsmOperand*>&);
109  OperandMatchResultTy parseMemBarrierOptOperand(
110    SmallVectorImpl<MCParsedAsmOperand*>&);
111  OperandMatchResultTy parseProcIFlagsOperand(
112    SmallVectorImpl<MCParsedAsmOperand*>&);
113  OperandMatchResultTy parseMSRMaskOperand(
114    SmallVectorImpl<MCParsedAsmOperand*>&);
115  OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O,
116                                   StringRef Op, int Low, int High);
117  OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
118    return parsePKHImm(O, "lsl", 0, 31);
119  }
120  OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
121    return parsePKHImm(O, "asr", 1, 32);
122  }
123  OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&);
124  OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&);
125  OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&);
126  OperandMatchResultTy parseBitfield(SmallVectorImpl<MCParsedAsmOperand*>&);
127  OperandMatchResultTy parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*>&);
128  OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&);
129
130  // Asm Match Converter Methods
131  bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
132                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
133  bool cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
134                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
135  bool cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
136                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
137  bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
138                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
139  bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
140                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
141  bool cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
142                             const SmallVectorImpl<MCParsedAsmOperand*> &);
143  bool cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
144                             const SmallVectorImpl<MCParsedAsmOperand*> &);
145  bool cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
146                             const SmallVectorImpl<MCParsedAsmOperand*> &);
147  bool cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
148                             const SmallVectorImpl<MCParsedAsmOperand*> &);
149  bool cvtLdrdPre(MCInst &Inst, unsigned Opcode,
150                  const SmallVectorImpl<MCParsedAsmOperand*> &);
151  bool cvtStrdPre(MCInst &Inst, unsigned Opcode,
152                  const SmallVectorImpl<MCParsedAsmOperand*> &);
153  bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
154                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
155  bool cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
156                        const SmallVectorImpl<MCParsedAsmOperand*> &);
157
158  bool validateInstruction(MCInst &Inst,
159                           const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
160  void processInstruction(MCInst &Inst,
161                          const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
162  bool shouldOmitCCOutOperand(StringRef Mnemonic,
163                              SmallVectorImpl<MCParsedAsmOperand*> &Operands);
164
165public:
166  enum ARMMatchResultTy {
167    Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY,
168    Match_RequiresV6,
169    Match_RequiresThumb2
170  };
171
172  ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
173    : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
174    MCAsmParserExtension::Initialize(_Parser);
175
176    // Initialize the set of available features.
177    setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
178  }
179
180  // Implementation of the MCTargetAsmParser interface:
181  bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
182  bool ParseInstruction(StringRef Name, SMLoc NameLoc,
183                        SmallVectorImpl<MCParsedAsmOperand*> &Operands);
184  bool ParseDirective(AsmToken DirectiveID);
185
186  unsigned checkTargetMatchPredicate(MCInst &Inst);
187
188  bool MatchAndEmitInstruction(SMLoc IDLoc,
189                               SmallVectorImpl<MCParsedAsmOperand*> &Operands,
190                               MCStreamer &Out);
191};
192} // end anonymous namespace
193
194namespace {
195
196/// ARMOperand - Instances of this class represent a parsed ARM machine
197/// instruction.
198class ARMOperand : public MCParsedAsmOperand {
199  enum KindTy {
200    CondCode,
201    CCOut,
202    ITCondMask,
203    CoprocNum,
204    CoprocReg,
205    Immediate,
206    MemBarrierOpt,
207    Memory,
208    PostIndexRegister,
209    MSRMask,
210    ProcIFlags,
211    Register,
212    RegisterList,
213    DPRRegisterList,
214    SPRRegisterList,
215    ShiftedRegister,
216    ShiftedImmediate,
217    ShifterImmediate,
218    RotateImmediate,
219    BitfieldDescriptor,
220    Token
221  } Kind;
222
223  SMLoc StartLoc, EndLoc;
224  SmallVector<unsigned, 8> Registers;
225
226  union {
227    struct {
228      ARMCC::CondCodes Val;
229    } CC;
230
231    struct {
232      unsigned Val;
233    } Cop;
234
235    struct {
236      unsigned Mask:4;
237    } ITMask;
238
239    struct {
240      ARM_MB::MemBOpt Val;
241    } MBOpt;
242
243    struct {
244      ARM_PROC::IFlags Val;
245    } IFlags;
246
247    struct {
248      unsigned Val;
249    } MMask;
250
251    struct {
252      const char *Data;
253      unsigned Length;
254    } Tok;
255
256    struct {
257      unsigned RegNum;
258    } Reg;
259
260    struct {
261      const MCExpr *Val;
262    } Imm;
263
264    /// Combined record for all forms of ARM address expressions.
265    struct {
266      unsigned BaseRegNum;
267      // Offset is in OffsetReg or OffsetImm. If both are zero, no offset
268      // was specified.
269      const MCConstantExpr *OffsetImm;  // Offset immediate value
270      unsigned OffsetRegNum;    // Offset register num, when OffsetImm == NULL
271      ARM_AM::ShiftOpc ShiftType; // Shift type for OffsetReg
272      unsigned ShiftImm;      // shift for OffsetReg.
273      unsigned isNegative : 1;  // Negated OffsetReg? (~'U' bit)
274    } Mem;
275
276    struct {
277      unsigned RegNum;
278      bool isAdd;
279      ARM_AM::ShiftOpc ShiftTy;
280      unsigned ShiftImm;
281    } PostIdxReg;
282
283    struct {
284      bool isASR;
285      unsigned Imm;
286    } ShifterImm;
287    struct {
288      ARM_AM::ShiftOpc ShiftTy;
289      unsigned SrcReg;
290      unsigned ShiftReg;
291      unsigned ShiftImm;
292    } RegShiftedReg;
293    struct {
294      ARM_AM::ShiftOpc ShiftTy;
295      unsigned SrcReg;
296      unsigned ShiftImm;
297    } RegShiftedImm;
298    struct {
299      unsigned Imm;
300    } RotImm;
301    struct {
302      unsigned LSB;
303      unsigned Width;
304    } Bitfield;
305  };
306
307  ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
308public:
309  ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() {
310    Kind = o.Kind;
311    StartLoc = o.StartLoc;
312    EndLoc = o.EndLoc;
313    switch (Kind) {
314    case CondCode:
315      CC = o.CC;
316      break;
317    case ITCondMask:
318      ITMask = o.ITMask;
319      break;
320    case Token:
321      Tok = o.Tok;
322      break;
323    case CCOut:
324    case Register:
325      Reg = o.Reg;
326      break;
327    case RegisterList:
328    case DPRRegisterList:
329    case SPRRegisterList:
330      Registers = o.Registers;
331      break;
332    case CoprocNum:
333    case CoprocReg:
334      Cop = o.Cop;
335      break;
336    case Immediate:
337      Imm = o.Imm;
338      break;
339    case MemBarrierOpt:
340      MBOpt = o.MBOpt;
341      break;
342    case Memory:
343      Mem = o.Mem;
344      break;
345    case PostIndexRegister:
346      PostIdxReg = o.PostIdxReg;
347      break;
348    case MSRMask:
349      MMask = o.MMask;
350      break;
351    case ProcIFlags:
352      IFlags = o.IFlags;
353      break;
354    case ShifterImmediate:
355      ShifterImm = o.ShifterImm;
356      break;
357    case ShiftedRegister:
358      RegShiftedReg = o.RegShiftedReg;
359      break;
360    case ShiftedImmediate:
361      RegShiftedImm = o.RegShiftedImm;
362      break;
363    case RotateImmediate:
364      RotImm = o.RotImm;
365      break;
366    case BitfieldDescriptor:
367      Bitfield = o.Bitfield;
368      break;
369    }
370  }
371
372  /// getStartLoc - Get the location of the first token of this operand.
373  SMLoc getStartLoc() const { return StartLoc; }
374  /// getEndLoc - Get the location of the last token of this operand.
375  SMLoc getEndLoc() const { return EndLoc; }
376
377  ARMCC::CondCodes getCondCode() const {
378    assert(Kind == CondCode && "Invalid access!");
379    return CC.Val;
380  }
381
382  unsigned getCoproc() const {
383    assert((Kind == CoprocNum || Kind == CoprocReg) && "Invalid access!");
384    return Cop.Val;
385  }
386
387  StringRef getToken() const {
388    assert(Kind == Token && "Invalid access!");
389    return StringRef(Tok.Data, Tok.Length);
390  }
391
392  unsigned getReg() const {
393    assert((Kind == Register || Kind == CCOut) && "Invalid access!");
394    return Reg.RegNum;
395  }
396
397  const SmallVectorImpl<unsigned> &getRegList() const {
398    assert((Kind == RegisterList || Kind == DPRRegisterList ||
399            Kind == SPRRegisterList) && "Invalid access!");
400    return Registers;
401  }
402
403  const MCExpr *getImm() const {
404    assert(Kind == Immediate && "Invalid access!");
405    return Imm.Val;
406  }
407
408  ARM_MB::MemBOpt getMemBarrierOpt() const {
409    assert(Kind == MemBarrierOpt && "Invalid access!");
410    return MBOpt.Val;
411  }
412
413  ARM_PROC::IFlags getProcIFlags() const {
414    assert(Kind == ProcIFlags && "Invalid access!");
415    return IFlags.Val;
416  }
417
418  unsigned getMSRMask() const {
419    assert(Kind == MSRMask && "Invalid access!");
420    return MMask.Val;
421  }
422
423  bool isCoprocNum() const { return Kind == CoprocNum; }
424  bool isCoprocReg() const { return Kind == CoprocReg; }
425  bool isCondCode() const { return Kind == CondCode; }
426  bool isCCOut() const { return Kind == CCOut; }
427  bool isITMask() const { return Kind == ITCondMask; }
428  bool isITCondCode() const { return Kind == CondCode; }
429  bool isImm() const { return Kind == Immediate; }
430  bool isImm0_1020s4() const {
431    if (Kind != Immediate)
432      return false;
433    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
434    if (!CE) return false;
435    int64_t Value = CE->getValue();
436    return ((Value & 3) == 0) && Value >= 0 && Value <= 1020;
437  }
438  bool isImm0_508s4() const {
439    if (Kind != Immediate)
440      return false;
441    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
442    if (!CE) return false;
443    int64_t Value = CE->getValue();
444    return ((Value & 3) == 0) && Value >= 0 && Value <= 508;
445  }
446  bool isImm0_255() const {
447    if (Kind != Immediate)
448      return false;
449    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
450    if (!CE) return false;
451    int64_t Value = CE->getValue();
452    return Value >= 0 && Value < 256;
453  }
454  bool isImm0_7() const {
455    if (Kind != Immediate)
456      return false;
457    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
458    if (!CE) return false;
459    int64_t Value = CE->getValue();
460    return Value >= 0 && Value < 8;
461  }
462  bool isImm0_15() const {
463    if (Kind != Immediate)
464      return false;
465    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
466    if (!CE) return false;
467    int64_t Value = CE->getValue();
468    return Value >= 0 && Value < 16;
469  }
470  bool isImm0_31() const {
471    if (Kind != Immediate)
472      return false;
473    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
474    if (!CE) return false;
475    int64_t Value = CE->getValue();
476    return Value >= 0 && Value < 32;
477  }
478  bool isImm1_16() const {
479    if (Kind != Immediate)
480      return false;
481    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
482    if (!CE) return false;
483    int64_t Value = CE->getValue();
484    return Value > 0 && Value < 17;
485  }
486  bool isImm1_32() const {
487    if (Kind != Immediate)
488      return false;
489    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
490    if (!CE) return false;
491    int64_t Value = CE->getValue();
492    return Value > 0 && Value < 33;
493  }
494  bool isImm0_65535() const {
495    if (Kind != Immediate)
496      return false;
497    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
498    if (!CE) return false;
499    int64_t Value = CE->getValue();
500    return Value >= 0 && Value < 65536;
501  }
502  bool isImm0_65535Expr() const {
503    if (Kind != Immediate)
504      return false;
505    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
506    // If it's not a constant expression, it'll generate a fixup and be
507    // handled later.
508    if (!CE) return true;
509    int64_t Value = CE->getValue();
510    return Value >= 0 && Value < 65536;
511  }
512  bool isImm24bit() const {
513    if (Kind != Immediate)
514      return false;
515    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
516    if (!CE) return false;
517    int64_t Value = CE->getValue();
518    return Value >= 0 && Value <= 0xffffff;
519  }
520  bool isImmThumbSR() const {
521    if (Kind != Immediate)
522      return false;
523    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
524    if (!CE) return false;
525    int64_t Value = CE->getValue();
526    return Value > 0 && Value < 33;
527  }
528  bool isPKHLSLImm() const {
529    if (Kind != Immediate)
530      return false;
531    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
532    if (!CE) return false;
533    int64_t Value = CE->getValue();
534    return Value >= 0 && Value < 32;
535  }
536  bool isPKHASRImm() const {
537    if (Kind != Immediate)
538      return false;
539    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
540    if (!CE) return false;
541    int64_t Value = CE->getValue();
542    return Value > 0 && Value <= 32;
543  }
544  bool isARMSOImm() const {
545    if (Kind != Immediate)
546      return false;
547    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
548    if (!CE) return false;
549    int64_t Value = CE->getValue();
550    return ARM_AM::getSOImmVal(Value) != -1;
551  }
552  bool isT2SOImm() const {
553    if (Kind != Immediate)
554      return false;
555    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
556    if (!CE) return false;
557    int64_t Value = CE->getValue();
558    return ARM_AM::getT2SOImmVal(Value) != -1;
559  }
560  bool isSetEndImm() const {
561    if (Kind != Immediate)
562      return false;
563    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
564    if (!CE) return false;
565    int64_t Value = CE->getValue();
566    return Value == 1 || Value == 0;
567  }
568  bool isReg() const { return Kind == Register; }
569  bool isRegList() const { return Kind == RegisterList; }
570  bool isDPRRegList() const { return Kind == DPRRegisterList; }
571  bool isSPRRegList() const { return Kind == SPRRegisterList; }
572  bool isToken() const { return Kind == Token; }
573  bool isMemBarrierOpt() const { return Kind == MemBarrierOpt; }
574  bool isMemory() const { return Kind == Memory; }
575  bool isShifterImm() const { return Kind == ShifterImmediate; }
576  bool isRegShiftedReg() const { return Kind == ShiftedRegister; }
577  bool isRegShiftedImm() const { return Kind == ShiftedImmediate; }
578  bool isRotImm() const { return Kind == RotateImmediate; }
579  bool isBitfield() const { return Kind == BitfieldDescriptor; }
580  bool isPostIdxRegShifted() const { return Kind == PostIndexRegister; }
581  bool isPostIdxReg() const {
582    return Kind == PostIndexRegister && PostIdxReg.ShiftTy == ARM_AM::no_shift;
583  }
584  bool isMemNoOffset() const {
585    if (Kind != Memory)
586      return false;
587    // No offset of any kind.
588    return Mem.OffsetRegNum == 0 && Mem.OffsetImm == 0;
589  }
590  bool isAddrMode2() const {
591    if (Kind != Memory)
592      return false;
593    // Check for register offset.
594    if (Mem.OffsetRegNum) return true;
595    // Immediate offset in range [-4095, 4095].
596    if (!Mem.OffsetImm) return true;
597    int64_t Val = Mem.OffsetImm->getValue();
598    return Val > -4096 && Val < 4096;
599  }
600  bool isAM2OffsetImm() const {
601    if (Kind != Immediate)
602      return false;
603    // Immediate offset in range [-4095, 4095].
604    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
605    if (!CE) return false;
606    int64_t Val = CE->getValue();
607    return Val > -4096 && Val < 4096;
608  }
609  bool isAddrMode3() const {
610    if (Kind != Memory)
611      return false;
612    // No shifts are legal for AM3.
613    if (Mem.ShiftType != ARM_AM::no_shift) return false;
614    // Check for register offset.
615    if (Mem.OffsetRegNum) return true;
616    // Immediate offset in range [-255, 255].
617    if (!Mem.OffsetImm) return true;
618    int64_t Val = Mem.OffsetImm->getValue();
619    return Val > -256 && Val < 256;
620  }
621  bool isAM3Offset() const {
622    if (Kind != Immediate && Kind != PostIndexRegister)
623      return false;
624    if (Kind == PostIndexRegister)
625      return PostIdxReg.ShiftTy == ARM_AM::no_shift;
626    // Immediate offset in range [-255, 255].
627    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
628    if (!CE) return false;
629    int64_t Val = CE->getValue();
630    // Special case, #-0 is INT32_MIN.
631    return (Val > -256 && Val < 256) || Val == INT32_MIN;
632  }
633  bool isAddrMode5() const {
634    if (Kind != Memory)
635      return false;
636    // Check for register offset.
637    if (Mem.OffsetRegNum) return false;
638    // Immediate offset in range [-1020, 1020] and a multiple of 4.
639    if (!Mem.OffsetImm) return true;
640    int64_t Val = Mem.OffsetImm->getValue();
641    return Val >= -1020 && Val <= 1020 && ((Val & 3) == 0);
642  }
643  bool isMemRegOffset() const {
644    if (Kind != Memory || !Mem.OffsetRegNum)
645      return false;
646    return true;
647  }
648  bool isMemThumbRR() const {
649    // Thumb reg+reg addressing is simple. Just two registers, a base and
650    // an offset. No shifts, negations or any other complicating factors.
651    if (Kind != Memory || !Mem.OffsetRegNum || Mem.isNegative ||
652        Mem.ShiftType != ARM_AM::no_shift)
653      return false;
654    return isARMLowRegister(Mem.BaseRegNum) &&
655      (!Mem.OffsetRegNum || isARMLowRegister(Mem.OffsetRegNum));
656  }
657  bool isMemThumbRIs4() const {
658    if (Kind != Memory || Mem.OffsetRegNum != 0 ||
659        !isARMLowRegister(Mem.BaseRegNum))
660      return false;
661    // Immediate offset, multiple of 4 in range [0, 124].
662    if (!Mem.OffsetImm) return true;
663    int64_t Val = Mem.OffsetImm->getValue();
664    return Val >= 0 && Val <= 124 && (Val % 4) == 0;
665  }
666  bool isMemThumbRIs2() const {
667    if (Kind != Memory || Mem.OffsetRegNum != 0 ||
668        !isARMLowRegister(Mem.BaseRegNum))
669      return false;
670    // Immediate offset, multiple of 4 in range [0, 62].
671    if (!Mem.OffsetImm) return true;
672    int64_t Val = Mem.OffsetImm->getValue();
673    return Val >= 0 && Val <= 62 && (Val % 2) == 0;
674  }
675  bool isMemThumbRIs1() const {
676    if (Kind != Memory || Mem.OffsetRegNum != 0 ||
677        !isARMLowRegister(Mem.BaseRegNum))
678      return false;
679    // Immediate offset in range [0, 31].
680    if (!Mem.OffsetImm) return true;
681    int64_t Val = Mem.OffsetImm->getValue();
682    return Val >= 0 && Val <= 31;
683  }
684  bool isMemThumbSPI() const {
685    if (Kind != Memory || Mem.OffsetRegNum != 0 || Mem.BaseRegNum != ARM::SP)
686      return false;
687    // Immediate offset, multiple of 4 in range [0, 1020].
688    if (!Mem.OffsetImm) return true;
689    int64_t Val = Mem.OffsetImm->getValue();
690    return Val >= 0 && Val <= 1020 && (Val % 4) == 0;
691  }
692  bool isMemImm8Offset() const {
693    if (Kind != Memory || Mem.OffsetRegNum != 0)
694      return false;
695    // Immediate offset in range [-255, 255].
696    if (!Mem.OffsetImm) return true;
697    int64_t Val = Mem.OffsetImm->getValue();
698    return Val > -256 && Val < 256;
699  }
700  bool isMemImm12Offset() const {
701    // If we have an immediate that's not a constant, treat it as a label
702    // reference needing a fixup. If it is a constant, it's something else
703    // and we reject it.
704    if (Kind == Immediate && !isa<MCConstantExpr>(getImm()))
705      return true;
706
707    if (Kind != Memory || Mem.OffsetRegNum != 0)
708      return false;
709    // Immediate offset in range [-4095, 4095].
710    if (!Mem.OffsetImm) return true;
711    int64_t Val = Mem.OffsetImm->getValue();
712    return Val > -4096 && Val < 4096;
713  }
714  bool isPostIdxImm8() const {
715    if (Kind != Immediate)
716      return false;
717    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
718    if (!CE) return false;
719    int64_t Val = CE->getValue();
720    return Val > -256 && Val < 256;
721  }
722
723  bool isMSRMask() const { return Kind == MSRMask; }
724  bool isProcIFlags() const { return Kind == ProcIFlags; }
725
726  void addExpr(MCInst &Inst, const MCExpr *Expr) const {
727    // Add as immediates when possible.  Null MCExpr = 0.
728    if (Expr == 0)
729      Inst.addOperand(MCOperand::CreateImm(0));
730    else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
731      Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
732    else
733      Inst.addOperand(MCOperand::CreateExpr(Expr));
734  }
735
736  void addCondCodeOperands(MCInst &Inst, unsigned N) const {
737    assert(N == 2 && "Invalid number of operands!");
738    Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
739    unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR;
740    Inst.addOperand(MCOperand::CreateReg(RegNum));
741  }
742
743  void addCoprocNumOperands(MCInst &Inst, unsigned N) const {
744    assert(N == 1 && "Invalid number of operands!");
745    Inst.addOperand(MCOperand::CreateImm(getCoproc()));
746  }
747
748  void addITMaskOperands(MCInst &Inst, unsigned N) const {
749    assert(N == 1 && "Invalid number of operands!");
750    Inst.addOperand(MCOperand::CreateImm(ITMask.Mask));
751  }
752
753  void addITCondCodeOperands(MCInst &Inst, unsigned N) const {
754    assert(N == 1 && "Invalid number of operands!");
755    Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
756  }
757
758  void addCoprocRegOperands(MCInst &Inst, unsigned N) const {
759    assert(N == 1 && "Invalid number of operands!");
760    Inst.addOperand(MCOperand::CreateImm(getCoproc()));
761  }
762
763  void addCCOutOperands(MCInst &Inst, unsigned N) const {
764    assert(N == 1 && "Invalid number of operands!");
765    Inst.addOperand(MCOperand::CreateReg(getReg()));
766  }
767
768  void addRegOperands(MCInst &Inst, unsigned N) const {
769    assert(N == 1 && "Invalid number of operands!");
770    Inst.addOperand(MCOperand::CreateReg(getReg()));
771  }
772
773  void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const {
774    assert(N == 3 && "Invalid number of operands!");
775    assert(isRegShiftedReg() && "addRegShiftedRegOperands() on non RegShiftedReg!");
776    Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg));
777    Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg));
778    Inst.addOperand(MCOperand::CreateImm(
779      ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm)));
780  }
781
782  void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const {
783    assert(N == 2 && "Invalid number of operands!");
784    assert(isRegShiftedImm() && "addRegShiftedImmOperands() on non RegShiftedImm!");
785    Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg));
786    Inst.addOperand(MCOperand::CreateImm(
787      ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm)));
788  }
789
790
791  void addShifterImmOperands(MCInst &Inst, unsigned N) const {
792    assert(N == 1 && "Invalid number of operands!");
793    Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) |
794                                         ShifterImm.Imm));
795  }
796
797  void addRegListOperands(MCInst &Inst, unsigned N) const {
798    assert(N == 1 && "Invalid number of operands!");
799    const SmallVectorImpl<unsigned> &RegList = getRegList();
800    for (SmallVectorImpl<unsigned>::const_iterator
801           I = RegList.begin(), E = RegList.end(); I != E; ++I)
802      Inst.addOperand(MCOperand::CreateReg(*I));
803  }
804
805  void addDPRRegListOperands(MCInst &Inst, unsigned N) const {
806    addRegListOperands(Inst, N);
807  }
808
809  void addSPRRegListOperands(MCInst &Inst, unsigned N) const {
810    addRegListOperands(Inst, N);
811  }
812
813  void addRotImmOperands(MCInst &Inst, unsigned N) const {
814    assert(N == 1 && "Invalid number of operands!");
815    // Encoded as val>>3. The printer handles display as 8, 16, 24.
816    Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3));
817  }
818
819  void addBitfieldOperands(MCInst &Inst, unsigned N) const {
820    assert(N == 1 && "Invalid number of operands!");
821    // Munge the lsb/width into a bitfield mask.
822    unsigned lsb = Bitfield.LSB;
823    unsigned width = Bitfield.Width;
824    // Make a 32-bit mask w/ the referenced bits clear and all other bits set.
825    uint32_t Mask = ~(((uint32_t)0xffffffff >> lsb) << (32 - width) >>
826                      (32 - (lsb + width)));
827    Inst.addOperand(MCOperand::CreateImm(Mask));
828  }
829
830  void addImmOperands(MCInst &Inst, unsigned N) const {
831    assert(N == 1 && "Invalid number of operands!");
832    addExpr(Inst, getImm());
833  }
834
835  void addImm0_1020s4Operands(MCInst &Inst, unsigned N) const {
836    assert(N == 1 && "Invalid number of operands!");
837    // The immediate is scaled by four in the encoding and is stored
838    // in the MCInst as such. Lop off the low two bits here.
839    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
840    Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
841  }
842
843  void addImm0_508s4Operands(MCInst &Inst, unsigned N) const {
844    assert(N == 1 && "Invalid number of operands!");
845    // The immediate is scaled by four in the encoding and is stored
846    // in the MCInst as such. Lop off the low two bits here.
847    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
848    Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
849  }
850
851  void addImm0_255Operands(MCInst &Inst, unsigned N) const {
852    assert(N == 1 && "Invalid number of operands!");
853    addExpr(Inst, getImm());
854  }
855
856  void addImm0_7Operands(MCInst &Inst, unsigned N) const {
857    assert(N == 1 && "Invalid number of operands!");
858    addExpr(Inst, getImm());
859  }
860
861  void addImm0_15Operands(MCInst &Inst, unsigned N) const {
862    assert(N == 1 && "Invalid number of operands!");
863    addExpr(Inst, getImm());
864  }
865
866  void addImm0_31Operands(MCInst &Inst, unsigned N) const {
867    assert(N == 1 && "Invalid number of operands!");
868    addExpr(Inst, getImm());
869  }
870
871  void addImm1_16Operands(MCInst &Inst, unsigned N) const {
872    assert(N == 1 && "Invalid number of operands!");
873    // The constant encodes as the immediate-1, and we store in the instruction
874    // the bits as encoded, so subtract off one here.
875    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
876    Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
877  }
878
879  void addImm1_32Operands(MCInst &Inst, unsigned N) const {
880    assert(N == 1 && "Invalid number of operands!");
881    // The constant encodes as the immediate-1, and we store in the instruction
882    // the bits as encoded, so subtract off one here.
883    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
884    Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
885  }
886
887  void addImm0_65535Operands(MCInst &Inst, unsigned N) const {
888    assert(N == 1 && "Invalid number of operands!");
889    addExpr(Inst, getImm());
890  }
891
892  void addImm0_65535ExprOperands(MCInst &Inst, unsigned N) const {
893    assert(N == 1 && "Invalid number of operands!");
894    addExpr(Inst, getImm());
895  }
896
897  void addImm24bitOperands(MCInst &Inst, unsigned N) const {
898    assert(N == 1 && "Invalid number of operands!");
899    addExpr(Inst, getImm());
900  }
901
902  void addImmThumbSROperands(MCInst &Inst, unsigned N) const {
903    assert(N == 1 && "Invalid number of operands!");
904    // The constant encodes as the immediate, except for 32, which encodes as
905    // zero.
906    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
907    unsigned Imm = CE->getValue();
908    Inst.addOperand(MCOperand::CreateImm((Imm == 32 ? 0 : Imm)));
909  }
910
911  void addPKHLSLImmOperands(MCInst &Inst, unsigned N) const {
912    assert(N == 1 && "Invalid number of operands!");
913    addExpr(Inst, getImm());
914  }
915
916  void addPKHASRImmOperands(MCInst &Inst, unsigned N) const {
917    assert(N == 1 && "Invalid number of operands!");
918    // An ASR value of 32 encodes as 0, so that's how we want to add it to
919    // the instruction as well.
920    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
921    int Val = CE->getValue();
922    Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val));
923  }
924
925  void addARMSOImmOperands(MCInst &Inst, unsigned N) const {
926    assert(N == 1 && "Invalid number of operands!");
927    addExpr(Inst, getImm());
928  }
929
930  void addT2SOImmOperands(MCInst &Inst, unsigned N) const {
931    assert(N == 1 && "Invalid number of operands!");
932    addExpr(Inst, getImm());
933  }
934
935  void addSetEndImmOperands(MCInst &Inst, unsigned N) const {
936    assert(N == 1 && "Invalid number of operands!");
937    addExpr(Inst, getImm());
938  }
939
940  void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const {
941    assert(N == 1 && "Invalid number of operands!");
942    Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt())));
943  }
944
945  void addMemNoOffsetOperands(MCInst &Inst, unsigned N) const {
946    assert(N == 1 && "Invalid number of operands!");
947    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
948  }
949
950  void addAddrMode2Operands(MCInst &Inst, unsigned N) const {
951    assert(N == 3 && "Invalid number of operands!");
952    int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0;
953    if (!Mem.OffsetRegNum) {
954      ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
955      // Special case for #-0
956      if (Val == INT32_MIN) Val = 0;
957      if (Val < 0) Val = -Val;
958      Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
959    } else {
960      // For register offset, we encode the shift type and negation flag
961      // here.
962      Val = ARM_AM::getAM2Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add,
963                              Mem.ShiftImm, Mem.ShiftType);
964    }
965    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
966    Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
967    Inst.addOperand(MCOperand::CreateImm(Val));
968  }
969
970  void addAM2OffsetImmOperands(MCInst &Inst, unsigned N) const {
971    assert(N == 2 && "Invalid number of operands!");
972    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
973    assert(CE && "non-constant AM2OffsetImm operand!");
974    int32_t Val = CE->getValue();
975    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
976    // Special case for #-0
977    if (Val == INT32_MIN) Val = 0;
978    if (Val < 0) Val = -Val;
979    Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
980    Inst.addOperand(MCOperand::CreateReg(0));
981    Inst.addOperand(MCOperand::CreateImm(Val));
982  }
983
984  void addAddrMode3Operands(MCInst &Inst, unsigned N) const {
985    assert(N == 3 && "Invalid number of operands!");
986    int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0;
987    if (!Mem.OffsetRegNum) {
988      ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
989      // Special case for #-0
990      if (Val == INT32_MIN) Val = 0;
991      if (Val < 0) Val = -Val;
992      Val = ARM_AM::getAM3Opc(AddSub, Val);
993    } else {
994      // For register offset, we encode the shift type and negation flag
995      // here.
996      Val = ARM_AM::getAM3Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add, 0);
997    }
998    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
999    Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
1000    Inst.addOperand(MCOperand::CreateImm(Val));
1001  }
1002
1003  void addAM3OffsetOperands(MCInst &Inst, unsigned N) const {
1004    assert(N == 2 && "Invalid number of operands!");
1005    if (Kind == PostIndexRegister) {
1006      int32_t Val =
1007        ARM_AM::getAM3Opc(PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub, 0);
1008      Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1009      Inst.addOperand(MCOperand::CreateImm(Val));
1010      return;
1011    }
1012
1013    // Constant offset.
1014    const MCConstantExpr *CE = static_cast<const MCConstantExpr*>(getImm());
1015    int32_t Val = CE->getValue();
1016    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1017    // Special case for #-0
1018    if (Val == INT32_MIN) Val = 0;
1019    if (Val < 0) Val = -Val;
1020    Val = ARM_AM::getAM3Opc(AddSub, Val);
1021    Inst.addOperand(MCOperand::CreateReg(0));
1022    Inst.addOperand(MCOperand::CreateImm(Val));
1023  }
1024
1025  void addAddrMode5Operands(MCInst &Inst, unsigned N) const {
1026    assert(N == 2 && "Invalid number of operands!");
1027    // The lower two bits are always zero and as such are not encoded.
1028    int32_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() / 4 : 0;
1029    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1030    // Special case for #-0
1031    if (Val == INT32_MIN) Val = 0;
1032    if (Val < 0) Val = -Val;
1033    Val = ARM_AM::getAM5Opc(AddSub, Val);
1034    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1035    Inst.addOperand(MCOperand::CreateImm(Val));
1036  }
1037
1038  void addMemImm8OffsetOperands(MCInst &Inst, unsigned N) const {
1039    assert(N == 2 && "Invalid number of operands!");
1040    int64_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0;
1041    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1042    Inst.addOperand(MCOperand::CreateImm(Val));
1043  }
1044
1045  void addMemImm12OffsetOperands(MCInst &Inst, unsigned N) const {
1046    assert(N == 2 && "Invalid number of operands!");
1047    // If this is an immediate, it's a label reference.
1048    if (Kind == Immediate) {
1049      addExpr(Inst, getImm());
1050      Inst.addOperand(MCOperand::CreateImm(0));
1051      return;
1052    }
1053
1054    // Otherwise, it's a normal memory reg+offset.
1055    int64_t Val = Mem.OffsetImm ? Mem.OffsetImm->getValue() : 0;
1056    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1057    Inst.addOperand(MCOperand::CreateImm(Val));
1058  }
1059
1060  void addMemRegOffsetOperands(MCInst &Inst, unsigned N) const {
1061    assert(N == 3 && "Invalid number of operands!");
1062    unsigned Val = ARM_AM::getAM2Opc(Mem.isNegative ? ARM_AM::sub : ARM_AM::add,
1063                                     Mem.ShiftImm, Mem.ShiftType);
1064    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1065    Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
1066    Inst.addOperand(MCOperand::CreateImm(Val));
1067  }
1068
1069  void addMemThumbRROperands(MCInst &Inst, unsigned N) const {
1070    assert(N == 2 && "Invalid number of operands!");
1071    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1072    Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
1073  }
1074
1075  void addMemThumbRIs4Operands(MCInst &Inst, unsigned N) const {
1076    assert(N == 2 && "Invalid number of operands!");
1077    int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 4) : 0;
1078    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1079    Inst.addOperand(MCOperand::CreateImm(Val));
1080  }
1081
1082  void addMemThumbRIs2Operands(MCInst &Inst, unsigned N) const {
1083    assert(N == 2 && "Invalid number of operands!");
1084    int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 2) : 0;
1085    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1086    Inst.addOperand(MCOperand::CreateImm(Val));
1087  }
1088
1089  void addMemThumbRIs1Operands(MCInst &Inst, unsigned N) const {
1090    assert(N == 2 && "Invalid number of operands!");
1091    int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue()) : 0;
1092    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1093    Inst.addOperand(MCOperand::CreateImm(Val));
1094  }
1095
1096  void addMemThumbSPIOperands(MCInst &Inst, unsigned N) const {
1097    assert(N == 2 && "Invalid number of operands!");
1098    int64_t Val = Mem.OffsetImm ? (Mem.OffsetImm->getValue() / 4) : 0;
1099    Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
1100    Inst.addOperand(MCOperand::CreateImm(Val));
1101  }
1102
1103  void addPostIdxImm8Operands(MCInst &Inst, unsigned N) const {
1104    assert(N == 1 && "Invalid number of operands!");
1105    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1106    assert(CE && "non-constant post-idx-imm8 operand!");
1107    int Imm = CE->getValue();
1108    bool isAdd = Imm >= 0;
1109    Imm = (Imm < 0 ? -Imm : Imm) | (int)isAdd << 8;
1110    Inst.addOperand(MCOperand::CreateImm(Imm));
1111  }
1112
1113  void addPostIdxRegOperands(MCInst &Inst, unsigned N) const {
1114    assert(N == 2 && "Invalid number of operands!");
1115    Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1116    Inst.addOperand(MCOperand::CreateImm(PostIdxReg.isAdd));
1117  }
1118
1119  void addPostIdxRegShiftedOperands(MCInst &Inst, unsigned N) const {
1120    assert(N == 2 && "Invalid number of operands!");
1121    Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1122    // The sign, shift type, and shift amount are encoded in a single operand
1123    // using the AM2 encoding helpers.
1124    ARM_AM::AddrOpc opc = PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub;
1125    unsigned Imm = ARM_AM::getAM2Opc(opc, PostIdxReg.ShiftImm,
1126                                     PostIdxReg.ShiftTy);
1127    Inst.addOperand(MCOperand::CreateImm(Imm));
1128  }
1129
1130  void addMSRMaskOperands(MCInst &Inst, unsigned N) const {
1131    assert(N == 1 && "Invalid number of operands!");
1132    Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask())));
1133  }
1134
1135  void addProcIFlagsOperands(MCInst &Inst, unsigned N) const {
1136    assert(N == 1 && "Invalid number of operands!");
1137    Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags())));
1138  }
1139
1140  virtual void print(raw_ostream &OS) const;
1141
1142  static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) {
1143    ARMOperand *Op = new ARMOperand(ITCondMask);
1144    Op->ITMask.Mask = Mask;
1145    Op->StartLoc = S;
1146    Op->EndLoc = S;
1147    return Op;
1148  }
1149
1150  static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) {
1151    ARMOperand *Op = new ARMOperand(CondCode);
1152    Op->CC.Val = CC;
1153    Op->StartLoc = S;
1154    Op->EndLoc = S;
1155    return Op;
1156  }
1157
1158  static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) {
1159    ARMOperand *Op = new ARMOperand(CoprocNum);
1160    Op->Cop.Val = CopVal;
1161    Op->StartLoc = S;
1162    Op->EndLoc = S;
1163    return Op;
1164  }
1165
1166  static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) {
1167    ARMOperand *Op = new ARMOperand(CoprocReg);
1168    Op->Cop.Val = CopVal;
1169    Op->StartLoc = S;
1170    Op->EndLoc = S;
1171    return Op;
1172  }
1173
1174  static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) {
1175    ARMOperand *Op = new ARMOperand(CCOut);
1176    Op->Reg.RegNum = RegNum;
1177    Op->StartLoc = S;
1178    Op->EndLoc = S;
1179    return Op;
1180  }
1181
1182  static ARMOperand *CreateToken(StringRef Str, SMLoc S) {
1183    ARMOperand *Op = new ARMOperand(Token);
1184    Op->Tok.Data = Str.data();
1185    Op->Tok.Length = Str.size();
1186    Op->StartLoc = S;
1187    Op->EndLoc = S;
1188    return Op;
1189  }
1190
1191  static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
1192    ARMOperand *Op = new ARMOperand(Register);
1193    Op->Reg.RegNum = RegNum;
1194    Op->StartLoc = S;
1195    Op->EndLoc = E;
1196    return Op;
1197  }
1198
1199  static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy,
1200                                           unsigned SrcReg,
1201                                           unsigned ShiftReg,
1202                                           unsigned ShiftImm,
1203                                           SMLoc S, SMLoc E) {
1204    ARMOperand *Op = new ARMOperand(ShiftedRegister);
1205    Op->RegShiftedReg.ShiftTy = ShTy;
1206    Op->RegShiftedReg.SrcReg = SrcReg;
1207    Op->RegShiftedReg.ShiftReg = ShiftReg;
1208    Op->RegShiftedReg.ShiftImm = ShiftImm;
1209    Op->StartLoc = S;
1210    Op->EndLoc = E;
1211    return Op;
1212  }
1213
1214  static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy,
1215                                            unsigned SrcReg,
1216                                            unsigned ShiftImm,
1217                                            SMLoc S, SMLoc E) {
1218    ARMOperand *Op = new ARMOperand(ShiftedImmediate);
1219    Op->RegShiftedImm.ShiftTy = ShTy;
1220    Op->RegShiftedImm.SrcReg = SrcReg;
1221    Op->RegShiftedImm.ShiftImm = ShiftImm;
1222    Op->StartLoc = S;
1223    Op->EndLoc = E;
1224    return Op;
1225  }
1226
1227  static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm,
1228                                   SMLoc S, SMLoc E) {
1229    ARMOperand *Op = new ARMOperand(ShifterImmediate);
1230    Op->ShifterImm.isASR = isASR;
1231    Op->ShifterImm.Imm = Imm;
1232    Op->StartLoc = S;
1233    Op->EndLoc = E;
1234    return Op;
1235  }
1236
1237  static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) {
1238    ARMOperand *Op = new ARMOperand(RotateImmediate);
1239    Op->RotImm.Imm = Imm;
1240    Op->StartLoc = S;
1241    Op->EndLoc = E;
1242    return Op;
1243  }
1244
1245  static ARMOperand *CreateBitfield(unsigned LSB, unsigned Width,
1246                                    SMLoc S, SMLoc E) {
1247    ARMOperand *Op = new ARMOperand(BitfieldDescriptor);
1248    Op->Bitfield.LSB = LSB;
1249    Op->Bitfield.Width = Width;
1250    Op->StartLoc = S;
1251    Op->EndLoc = E;
1252    return Op;
1253  }
1254
1255  static ARMOperand *
1256  CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs,
1257                SMLoc StartLoc, SMLoc EndLoc) {
1258    KindTy Kind = RegisterList;
1259
1260    if (llvm::ARMMCRegisterClasses[ARM::DPRRegClassID].
1261        contains(Regs.front().first))
1262      Kind = DPRRegisterList;
1263    else if (llvm::ARMMCRegisterClasses[ARM::SPRRegClassID].
1264             contains(Regs.front().first))
1265      Kind = SPRRegisterList;
1266
1267    ARMOperand *Op = new ARMOperand(Kind);
1268    for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator
1269           I = Regs.begin(), E = Regs.end(); I != E; ++I)
1270      Op->Registers.push_back(I->first);
1271    array_pod_sort(Op->Registers.begin(), Op->Registers.end());
1272    Op->StartLoc = StartLoc;
1273    Op->EndLoc = EndLoc;
1274    return Op;
1275  }
1276
1277  static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
1278    ARMOperand *Op = new ARMOperand(Immediate);
1279    Op->Imm.Val = Val;
1280    Op->StartLoc = S;
1281    Op->EndLoc = E;
1282    return Op;
1283  }
1284
1285  static ARMOperand *CreateMem(unsigned BaseRegNum,
1286                               const MCConstantExpr *OffsetImm,
1287                               unsigned OffsetRegNum,
1288                               ARM_AM::ShiftOpc ShiftType,
1289                               unsigned ShiftImm,
1290                               bool isNegative,
1291                               SMLoc S, SMLoc E) {
1292    ARMOperand *Op = new ARMOperand(Memory);
1293    Op->Mem.BaseRegNum = BaseRegNum;
1294    Op->Mem.OffsetImm = OffsetImm;
1295    Op->Mem.OffsetRegNum = OffsetRegNum;
1296    Op->Mem.ShiftType = ShiftType;
1297    Op->Mem.ShiftImm = ShiftImm;
1298    Op->Mem.isNegative = isNegative;
1299    Op->StartLoc = S;
1300    Op->EndLoc = E;
1301    return Op;
1302  }
1303
1304  static ARMOperand *CreatePostIdxReg(unsigned RegNum, bool isAdd,
1305                                      ARM_AM::ShiftOpc ShiftTy,
1306                                      unsigned ShiftImm,
1307                                      SMLoc S, SMLoc E) {
1308    ARMOperand *Op = new ARMOperand(PostIndexRegister);
1309    Op->PostIdxReg.RegNum = RegNum;
1310    Op->PostIdxReg.isAdd = isAdd;
1311    Op->PostIdxReg.ShiftTy = ShiftTy;
1312    Op->PostIdxReg.ShiftImm = ShiftImm;
1313    Op->StartLoc = S;
1314    Op->EndLoc = E;
1315    return Op;
1316  }
1317
1318  static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) {
1319    ARMOperand *Op = new ARMOperand(MemBarrierOpt);
1320    Op->MBOpt.Val = Opt;
1321    Op->StartLoc = S;
1322    Op->EndLoc = S;
1323    return Op;
1324  }
1325
1326  static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) {
1327    ARMOperand *Op = new ARMOperand(ProcIFlags);
1328    Op->IFlags.Val = IFlags;
1329    Op->StartLoc = S;
1330    Op->EndLoc = S;
1331    return Op;
1332  }
1333
1334  static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) {
1335    ARMOperand *Op = new ARMOperand(MSRMask);
1336    Op->MMask.Val = MMask;
1337    Op->StartLoc = S;
1338    Op->EndLoc = S;
1339    return Op;
1340  }
1341};
1342
1343} // end anonymous namespace.
1344
1345void ARMOperand::print(raw_ostream &OS) const {
1346  switch (Kind) {
1347  case CondCode:
1348    OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">";
1349    break;
1350  case CCOut:
1351    OS << "<ccout " << getReg() << ">";
1352    break;
1353  case ITCondMask: {
1354    static char MaskStr[][6] = { "()", "(t)", "(e)", "(tt)", "(et)", "(te)",
1355      "(ee)", "(ttt)", "(ett)", "(tet)", "(eet)", "(tte)", "(ete)",
1356      "(tee)", "(eee)" };
1357    assert((ITMask.Mask & 0xf) == ITMask.Mask);
1358    OS << "<it-mask " << MaskStr[ITMask.Mask] << ">";
1359    break;
1360  }
1361  case CoprocNum:
1362    OS << "<coprocessor number: " << getCoproc() << ">";
1363    break;
1364  case CoprocReg:
1365    OS << "<coprocessor register: " << getCoproc() << ">";
1366    break;
1367  case MSRMask:
1368    OS << "<mask: " << getMSRMask() << ">";
1369    break;
1370  case Immediate:
1371    getImm()->print(OS);
1372    break;
1373  case MemBarrierOpt:
1374    OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">";
1375    break;
1376  case Memory:
1377    OS << "<memory "
1378       << " base:" << Mem.BaseRegNum;
1379    OS << ">";
1380    break;
1381  case PostIndexRegister:
1382    OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-")
1383       << PostIdxReg.RegNum;
1384    if (PostIdxReg.ShiftTy != ARM_AM::no_shift)
1385      OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " "
1386         << PostIdxReg.ShiftImm;
1387    OS << ">";
1388    break;
1389  case ProcIFlags: {
1390    OS << "<ARM_PROC::";
1391    unsigned IFlags = getProcIFlags();
1392    for (int i=2; i >= 0; --i)
1393      if (IFlags & (1 << i))
1394        OS << ARM_PROC::IFlagsToString(1 << i);
1395    OS << ">";
1396    break;
1397  }
1398  case Register:
1399    OS << "<register " << getReg() << ">";
1400    break;
1401  case ShifterImmediate:
1402    OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl")
1403       << " #" << ShifterImm.Imm << ">";
1404    break;
1405  case ShiftedRegister:
1406    OS << "<so_reg_reg "
1407       << RegShiftedReg.SrcReg
1408       << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedReg.ShiftImm))
1409       << ", " << RegShiftedReg.ShiftReg << ", "
1410       << ARM_AM::getSORegOffset(RegShiftedReg.ShiftImm)
1411       << ">";
1412    break;
1413  case ShiftedImmediate:
1414    OS << "<so_reg_imm "
1415       << RegShiftedImm.SrcReg
1416       << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedImm.ShiftImm))
1417       << ", " << ARM_AM::getSORegOffset(RegShiftedImm.ShiftImm)
1418       << ">";
1419    break;
1420  case RotateImmediate:
1421    OS << "<ror " << " #" << (RotImm.Imm * 8) << ">";
1422    break;
1423  case BitfieldDescriptor:
1424    OS << "<bitfield " << "lsb: " << Bitfield.LSB
1425       << ", width: " << Bitfield.Width << ">";
1426    break;
1427  case RegisterList:
1428  case DPRRegisterList:
1429  case SPRRegisterList: {
1430    OS << "<register_list ";
1431
1432    const SmallVectorImpl<unsigned> &RegList = getRegList();
1433    for (SmallVectorImpl<unsigned>::const_iterator
1434           I = RegList.begin(), E = RegList.end(); I != E; ) {
1435      OS << *I;
1436      if (++I < E) OS << ", ";
1437    }
1438
1439    OS << ">";
1440    break;
1441  }
1442  case Token:
1443    OS << "'" << getToken() << "'";
1444    break;
1445  }
1446}
1447
1448/// @name Auto-generated Match Functions
1449/// {
1450
1451static unsigned MatchRegisterName(StringRef Name);
1452
1453/// }
1454
1455bool ARMAsmParser::ParseRegister(unsigned &RegNo,
1456                                 SMLoc &StartLoc, SMLoc &EndLoc) {
1457  RegNo = tryParseRegister();
1458
1459  return (RegNo == (unsigned)-1);
1460}
1461
1462/// Try to parse a register name.  The token must be an Identifier when called,
1463/// and if it is a register name the token is eaten and the register number is
1464/// returned.  Otherwise return -1.
1465///
1466int ARMAsmParser::tryParseRegister() {
1467  const AsmToken &Tok = Parser.getTok();
1468  if (Tok.isNot(AsmToken::Identifier)) return -1;
1469
1470  // FIXME: Validate register for the current architecture; we have to do
1471  // validation later, so maybe there is no need for this here.
1472  std::string upperCase = Tok.getString().str();
1473  std::string lowerCase = LowercaseString(upperCase);
1474  unsigned RegNum = MatchRegisterName(lowerCase);
1475  if (!RegNum) {
1476    RegNum = StringSwitch<unsigned>(lowerCase)
1477      .Case("r13", ARM::SP)
1478      .Case("r14", ARM::LR)
1479      .Case("r15", ARM::PC)
1480      .Case("ip", ARM::R12)
1481      .Default(0);
1482  }
1483  if (!RegNum) return -1;
1484
1485  Parser.Lex(); // Eat identifier token.
1486  return RegNum;
1487}
1488
1489// Try to parse a shifter  (e.g., "lsl <amt>"). On success, return 0.
1490// If a recoverable error occurs, return 1. If an irrecoverable error
1491// occurs, return -1. An irrecoverable error is one where tokens have been
1492// consumed in the process of trying to parse the shifter (i.e., when it is
1493// indeed a shifter operand, but malformed).
1494int ARMAsmParser::tryParseShiftRegister(
1495                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1496  SMLoc S = Parser.getTok().getLoc();
1497  const AsmToken &Tok = Parser.getTok();
1498  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1499
1500  std::string upperCase = Tok.getString().str();
1501  std::string lowerCase = LowercaseString(upperCase);
1502  ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase)
1503      .Case("lsl", ARM_AM::lsl)
1504      .Case("lsr", ARM_AM::lsr)
1505      .Case("asr", ARM_AM::asr)
1506      .Case("ror", ARM_AM::ror)
1507      .Case("rrx", ARM_AM::rrx)
1508      .Default(ARM_AM::no_shift);
1509
1510  if (ShiftTy == ARM_AM::no_shift)
1511    return 1;
1512
1513  Parser.Lex(); // Eat the operator.
1514
1515  // The source register for the shift has already been added to the
1516  // operand list, so we need to pop it off and combine it into the shifted
1517  // register operand instead.
1518  OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val());
1519  if (!PrevOp->isReg())
1520    return Error(PrevOp->getStartLoc(), "shift must be of a register");
1521  int SrcReg = PrevOp->getReg();
1522  int64_t Imm = 0;
1523  int ShiftReg = 0;
1524  if (ShiftTy == ARM_AM::rrx) {
1525    // RRX Doesn't have an explicit shift amount. The encoder expects
1526    // the shift register to be the same as the source register. Seems odd,
1527    // but OK.
1528    ShiftReg = SrcReg;
1529  } else {
1530    // Figure out if this is shifted by a constant or a register (for non-RRX).
1531    if (Parser.getTok().is(AsmToken::Hash)) {
1532      Parser.Lex(); // Eat hash.
1533      SMLoc ImmLoc = Parser.getTok().getLoc();
1534      const MCExpr *ShiftExpr = 0;
1535      if (getParser().ParseExpression(ShiftExpr)) {
1536        Error(ImmLoc, "invalid immediate shift value");
1537        return -1;
1538      }
1539      // The expression must be evaluatable as an immediate.
1540      const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr);
1541      if (!CE) {
1542        Error(ImmLoc, "invalid immediate shift value");
1543        return -1;
1544      }
1545      // Range check the immediate.
1546      // lsl, ror: 0 <= imm <= 31
1547      // lsr, asr: 0 <= imm <= 32
1548      Imm = CE->getValue();
1549      if (Imm < 0 ||
1550          ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) ||
1551          ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) {
1552        Error(ImmLoc, "immediate shift value out of range");
1553        return -1;
1554      }
1555    } else if (Parser.getTok().is(AsmToken::Identifier)) {
1556      ShiftReg = tryParseRegister();
1557      SMLoc L = Parser.getTok().getLoc();
1558      if (ShiftReg == -1) {
1559        Error (L, "expected immediate or register in shift operand");
1560        return -1;
1561      }
1562    } else {
1563      Error (Parser.getTok().getLoc(),
1564                    "expected immediate or register in shift operand");
1565      return -1;
1566    }
1567  }
1568
1569  if (ShiftReg && ShiftTy != ARM_AM::rrx)
1570    Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg,
1571                                                         ShiftReg, Imm,
1572                                               S, Parser.getTok().getLoc()));
1573  else
1574    Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm,
1575                                               S, Parser.getTok().getLoc()));
1576
1577  return 0;
1578}
1579
1580
1581/// Try to parse a register name.  The token must be an Identifier when called.
1582/// If it's a register, an AsmOperand is created. Another AsmOperand is created
1583/// if there is a "writeback". 'true' if it's not a register.
1584///
1585/// TODO this is likely to change to allow different register types and or to
1586/// parse for a specific register type.
1587bool ARMAsmParser::
1588tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1589  SMLoc S = Parser.getTok().getLoc();
1590  int RegNo = tryParseRegister();
1591  if (RegNo == -1)
1592    return true;
1593
1594  Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc()));
1595
1596  const AsmToken &ExclaimTok = Parser.getTok();
1597  if (ExclaimTok.is(AsmToken::Exclaim)) {
1598    Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(),
1599                                               ExclaimTok.getLoc()));
1600    Parser.Lex(); // Eat exclaim token
1601  }
1602
1603  return false;
1604}
1605
1606/// MatchCoprocessorOperandName - Try to parse an coprocessor related
1607/// instruction with a symbolic operand name. Example: "p1", "p7", "c3",
1608/// "c5", ...
1609static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
1610  // Use the same layout as the tablegen'erated register name matcher. Ugly,
1611  // but efficient.
1612  switch (Name.size()) {
1613  default: break;
1614  case 2:
1615    if (Name[0] != CoprocOp)
1616      return -1;
1617    switch (Name[1]) {
1618    default:  return -1;
1619    case '0': return 0;
1620    case '1': return 1;
1621    case '2': return 2;
1622    case '3': return 3;
1623    case '4': return 4;
1624    case '5': return 5;
1625    case '6': return 6;
1626    case '7': return 7;
1627    case '8': return 8;
1628    case '9': return 9;
1629    }
1630    break;
1631  case 3:
1632    if (Name[0] != CoprocOp || Name[1] != '1')
1633      return -1;
1634    switch (Name[2]) {
1635    default:  return -1;
1636    case '0': return 10;
1637    case '1': return 11;
1638    case '2': return 12;
1639    case '3': return 13;
1640    case '4': return 14;
1641    case '5': return 15;
1642    }
1643    break;
1644  }
1645
1646  return -1;
1647}
1648
1649/// parseITCondCode - Try to parse a condition code for an IT instruction.
1650ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1651parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1652  SMLoc S = Parser.getTok().getLoc();
1653  const AsmToken &Tok = Parser.getTok();
1654  if (!Tok.is(AsmToken::Identifier))
1655    return MatchOperand_NoMatch;
1656  unsigned CC = StringSwitch<unsigned>(Tok.getString())
1657    .Case("eq", ARMCC::EQ)
1658    .Case("ne", ARMCC::NE)
1659    .Case("hs", ARMCC::HS)
1660    .Case("cs", ARMCC::HS)
1661    .Case("lo", ARMCC::LO)
1662    .Case("cc", ARMCC::LO)
1663    .Case("mi", ARMCC::MI)
1664    .Case("pl", ARMCC::PL)
1665    .Case("vs", ARMCC::VS)
1666    .Case("vc", ARMCC::VC)
1667    .Case("hi", ARMCC::HI)
1668    .Case("ls", ARMCC::LS)
1669    .Case("ge", ARMCC::GE)
1670    .Case("lt", ARMCC::LT)
1671    .Case("gt", ARMCC::GT)
1672    .Case("le", ARMCC::LE)
1673    .Case("al", ARMCC::AL)
1674    .Default(~0U);
1675  if (CC == ~0U)
1676    return MatchOperand_NoMatch;
1677  Parser.Lex(); // Eat the token.
1678
1679  Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC), S));
1680
1681  return MatchOperand_Success;
1682}
1683
1684/// parseCoprocNumOperand - Try to parse an coprocessor number operand. The
1685/// token must be an Identifier when called, and if it is a coprocessor
1686/// number, the token is eaten and the operand is added to the operand list.
1687ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1688parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1689  SMLoc S = Parser.getTok().getLoc();
1690  const AsmToken &Tok = Parser.getTok();
1691  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1692
1693  int Num = MatchCoprocessorOperandName(Tok.getString(), 'p');
1694  if (Num == -1)
1695    return MatchOperand_NoMatch;
1696
1697  Parser.Lex(); // Eat identifier token.
1698  Operands.push_back(ARMOperand::CreateCoprocNum(Num, S));
1699  return MatchOperand_Success;
1700}
1701
1702/// parseCoprocRegOperand - Try to parse an coprocessor register operand. The
1703/// token must be an Identifier when called, and if it is a coprocessor
1704/// number, the token is eaten and the operand is added to the operand list.
1705ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1706parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1707  SMLoc S = Parser.getTok().getLoc();
1708  const AsmToken &Tok = Parser.getTok();
1709  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1710
1711  int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c');
1712  if (Reg == -1)
1713    return MatchOperand_NoMatch;
1714
1715  Parser.Lex(); // Eat identifier token.
1716  Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S));
1717  return MatchOperand_Success;
1718}
1719
1720/// Parse a register list, return it if successful else return null.  The first
1721/// token must be a '{' when called.
1722bool ARMAsmParser::
1723parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1724  assert(Parser.getTok().is(AsmToken::LCurly) &&
1725         "Token is not a Left Curly Brace");
1726  SMLoc S = Parser.getTok().getLoc();
1727
1728  // Read the rest of the registers in the list.
1729  unsigned PrevRegNum = 0;
1730  SmallVector<std::pair<unsigned, SMLoc>, 32> Registers;
1731
1732  do {
1733    bool IsRange = Parser.getTok().is(AsmToken::Minus);
1734    Parser.Lex(); // Eat non-identifier token.
1735
1736    const AsmToken &RegTok = Parser.getTok();
1737    SMLoc RegLoc = RegTok.getLoc();
1738    if (RegTok.isNot(AsmToken::Identifier)) {
1739      Error(RegLoc, "register expected");
1740      return true;
1741    }
1742
1743    int RegNum = tryParseRegister();
1744    if (RegNum == -1) {
1745      Error(RegLoc, "register expected");
1746      return true;
1747    }
1748
1749    if (IsRange) {
1750      int Reg = PrevRegNum;
1751      do {
1752        ++Reg;
1753        Registers.push_back(std::make_pair(Reg, RegLoc));
1754      } while (Reg != RegNum);
1755    } else {
1756      Registers.push_back(std::make_pair(RegNum, RegLoc));
1757    }
1758
1759    PrevRegNum = RegNum;
1760  } while (Parser.getTok().is(AsmToken::Comma) ||
1761           Parser.getTok().is(AsmToken::Minus));
1762
1763  // Process the right curly brace of the list.
1764  const AsmToken &RCurlyTok = Parser.getTok();
1765  if (RCurlyTok.isNot(AsmToken::RCurly)) {
1766    Error(RCurlyTok.getLoc(), "'}' expected");
1767    return true;
1768  }
1769
1770  SMLoc E = RCurlyTok.getLoc();
1771  Parser.Lex(); // Eat right curly brace token.
1772
1773  // Verify the register list.
1774  bool EmittedWarning = false;
1775  unsigned HighRegNum = 0;
1776  BitVector RegMap(32);
1777  for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
1778    const std::pair<unsigned, SMLoc> &RegInfo = Registers[i];
1779    unsigned Reg = getARMRegisterNumbering(RegInfo.first);
1780
1781    if (RegMap[Reg]) {
1782      Error(RegInfo.second, "register duplicated in register list");
1783      return true;
1784    }
1785
1786    if (!EmittedWarning && Reg < HighRegNum)
1787      Warning(RegInfo.second,
1788              "register not in ascending order in register list");
1789
1790    RegMap.set(Reg);
1791    HighRegNum = std::max(Reg, HighRegNum);
1792  }
1793
1794  Operands.push_back(ARMOperand::CreateRegList(Registers, S, E));
1795  return false;
1796}
1797
1798/// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options.
1799ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1800parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1801  SMLoc S = Parser.getTok().getLoc();
1802  const AsmToken &Tok = Parser.getTok();
1803  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1804  StringRef OptStr = Tok.getString();
1805
1806  unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size()))
1807    .Case("sy",    ARM_MB::SY)
1808    .Case("st",    ARM_MB::ST)
1809    .Case("sh",    ARM_MB::ISH)
1810    .Case("ish",   ARM_MB::ISH)
1811    .Case("shst",  ARM_MB::ISHST)
1812    .Case("ishst", ARM_MB::ISHST)
1813    .Case("nsh",   ARM_MB::NSH)
1814    .Case("un",    ARM_MB::NSH)
1815    .Case("nshst", ARM_MB::NSHST)
1816    .Case("unst",  ARM_MB::NSHST)
1817    .Case("osh",   ARM_MB::OSH)
1818    .Case("oshst", ARM_MB::OSHST)
1819    .Default(~0U);
1820
1821  if (Opt == ~0U)
1822    return MatchOperand_NoMatch;
1823
1824  Parser.Lex(); // Eat identifier token.
1825  Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S));
1826  return MatchOperand_Success;
1827}
1828
1829/// parseProcIFlagsOperand - Try to parse iflags from CPS instruction.
1830ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1831parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1832  SMLoc S = Parser.getTok().getLoc();
1833  const AsmToken &Tok = Parser.getTok();
1834  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1835  StringRef IFlagsStr = Tok.getString();
1836
1837  unsigned IFlags = 0;
1838  for (int i = 0, e = IFlagsStr.size(); i != e; ++i) {
1839    unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1))
1840    .Case("a", ARM_PROC::A)
1841    .Case("i", ARM_PROC::I)
1842    .Case("f", ARM_PROC::F)
1843    .Default(~0U);
1844
1845    // If some specific iflag is already set, it means that some letter is
1846    // present more than once, this is not acceptable.
1847    if (Flag == ~0U || (IFlags & Flag))
1848      return MatchOperand_NoMatch;
1849
1850    IFlags |= Flag;
1851  }
1852
1853  Parser.Lex(); // Eat identifier token.
1854  Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S));
1855  return MatchOperand_Success;
1856}
1857
1858/// parseMSRMaskOperand - Try to parse mask flags from MSR instruction.
1859ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1860parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1861  SMLoc S = Parser.getTok().getLoc();
1862  const AsmToken &Tok = Parser.getTok();
1863  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
1864  StringRef Mask = Tok.getString();
1865
1866  // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf"
1867  size_t Start = 0, Next = Mask.find('_');
1868  StringRef Flags = "";
1869  std::string SpecReg = LowercaseString(Mask.slice(Start, Next));
1870  if (Next != StringRef::npos)
1871    Flags = Mask.slice(Next+1, Mask.size());
1872
1873  // FlagsVal contains the complete mask:
1874  // 3-0: Mask
1875  // 4: Special Reg (cpsr, apsr => 0; spsr => 1)
1876  unsigned FlagsVal = 0;
1877
1878  if (SpecReg == "apsr") {
1879    FlagsVal = StringSwitch<unsigned>(Flags)
1880    .Case("nzcvq",  0x8) // same as CPSR_f
1881    .Case("g",      0x4) // same as CPSR_s
1882    .Case("nzcvqg", 0xc) // same as CPSR_fs
1883    .Default(~0U);
1884
1885    if (FlagsVal == ~0U) {
1886      if (!Flags.empty())
1887        return MatchOperand_NoMatch;
1888      else
1889        FlagsVal = 0; // No flag
1890    }
1891  } else if (SpecReg == "cpsr" || SpecReg == "spsr") {
1892    if (Flags == "all") // cpsr_all is an alias for cpsr_fc
1893      Flags = "fc";
1894    for (int i = 0, e = Flags.size(); i != e; ++i) {
1895      unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1))
1896      .Case("c", 1)
1897      .Case("x", 2)
1898      .Case("s", 4)
1899      .Case("f", 8)
1900      .Default(~0U);
1901
1902      // If some specific flag is already set, it means that some letter is
1903      // present more than once, this is not acceptable.
1904      if (FlagsVal == ~0U || (FlagsVal & Flag))
1905        return MatchOperand_NoMatch;
1906      FlagsVal |= Flag;
1907    }
1908  } else // No match for special register.
1909    return MatchOperand_NoMatch;
1910
1911  // Special register without flags are equivalent to "fc" flags.
1912  if (!FlagsVal)
1913    FlagsVal = 0x9;
1914
1915  // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1)
1916  if (SpecReg == "spsr")
1917    FlagsVal |= 16;
1918
1919  Parser.Lex(); // Eat identifier token.
1920  Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S));
1921  return MatchOperand_Success;
1922}
1923
1924ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1925parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op,
1926            int Low, int High) {
1927  const AsmToken &Tok = Parser.getTok();
1928  if (Tok.isNot(AsmToken::Identifier)) {
1929    Error(Parser.getTok().getLoc(), Op + " operand expected.");
1930    return MatchOperand_ParseFail;
1931  }
1932  StringRef ShiftName = Tok.getString();
1933  std::string LowerOp = LowercaseString(Op);
1934  std::string UpperOp = UppercaseString(Op);
1935  if (ShiftName != LowerOp && ShiftName != UpperOp) {
1936    Error(Parser.getTok().getLoc(), Op + " operand expected.");
1937    return MatchOperand_ParseFail;
1938  }
1939  Parser.Lex(); // Eat shift type token.
1940
1941  // There must be a '#' and a shift amount.
1942  if (Parser.getTok().isNot(AsmToken::Hash)) {
1943    Error(Parser.getTok().getLoc(), "'#' expected");
1944    return MatchOperand_ParseFail;
1945  }
1946  Parser.Lex(); // Eat hash token.
1947
1948  const MCExpr *ShiftAmount;
1949  SMLoc Loc = Parser.getTok().getLoc();
1950  if (getParser().ParseExpression(ShiftAmount)) {
1951    Error(Loc, "illegal expression");
1952    return MatchOperand_ParseFail;
1953  }
1954  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
1955  if (!CE) {
1956    Error(Loc, "constant expression expected");
1957    return MatchOperand_ParseFail;
1958  }
1959  int Val = CE->getValue();
1960  if (Val < Low || Val > High) {
1961    Error(Loc, "immediate value out of range");
1962    return MatchOperand_ParseFail;
1963  }
1964
1965  Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc()));
1966
1967  return MatchOperand_Success;
1968}
1969
1970ARMAsmParser::OperandMatchResultTy ARMAsmParser::
1971parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1972  const AsmToken &Tok = Parser.getTok();
1973  SMLoc S = Tok.getLoc();
1974  if (Tok.isNot(AsmToken::Identifier)) {
1975    Error(Tok.getLoc(), "'be' or 'le' operand expected");
1976    return MatchOperand_ParseFail;
1977  }
1978  int Val = StringSwitch<int>(Tok.getString())
1979    .Case("be", 1)
1980    .Case("le", 0)
1981    .Default(-1);
1982  Parser.Lex(); // Eat the token.
1983
1984  if (Val == -1) {
1985    Error(Tok.getLoc(), "'be' or 'le' operand expected");
1986    return MatchOperand_ParseFail;
1987  }
1988  Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val,
1989                                                                  getContext()),
1990                                           S, Parser.getTok().getLoc()));
1991  return MatchOperand_Success;
1992}
1993
1994/// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT
1995/// instructions. Legal values are:
1996///     lsl #n  'n' in [0,31]
1997///     asr #n  'n' in [1,32]
1998///             n == 32 encoded as n == 0.
1999ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2000parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2001  const AsmToken &Tok = Parser.getTok();
2002  SMLoc S = Tok.getLoc();
2003  if (Tok.isNot(AsmToken::Identifier)) {
2004    Error(S, "shift operator 'asr' or 'lsl' expected");
2005    return MatchOperand_ParseFail;
2006  }
2007  StringRef ShiftName = Tok.getString();
2008  bool isASR;
2009  if (ShiftName == "lsl" || ShiftName == "LSL")
2010    isASR = false;
2011  else if (ShiftName == "asr" || ShiftName == "ASR")
2012    isASR = true;
2013  else {
2014    Error(S, "shift operator 'asr' or 'lsl' expected");
2015    return MatchOperand_ParseFail;
2016  }
2017  Parser.Lex(); // Eat the operator.
2018
2019  // A '#' and a shift amount.
2020  if (Parser.getTok().isNot(AsmToken::Hash)) {
2021    Error(Parser.getTok().getLoc(), "'#' expected");
2022    return MatchOperand_ParseFail;
2023  }
2024  Parser.Lex(); // Eat hash token.
2025
2026  const MCExpr *ShiftAmount;
2027  SMLoc E = Parser.getTok().getLoc();
2028  if (getParser().ParseExpression(ShiftAmount)) {
2029    Error(E, "malformed shift expression");
2030    return MatchOperand_ParseFail;
2031  }
2032  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
2033  if (!CE) {
2034    Error(E, "shift amount must be an immediate");
2035    return MatchOperand_ParseFail;
2036  }
2037
2038  int64_t Val = CE->getValue();
2039  if (isASR) {
2040    // Shift amount must be in [1,32]
2041    if (Val < 1 || Val > 32) {
2042      Error(E, "'asr' shift amount must be in range [1,32]");
2043      return MatchOperand_ParseFail;
2044    }
2045    // asr #32 encoded as asr #0.
2046    if (Val == 32) Val = 0;
2047  } else {
2048    // Shift amount must be in [1,32]
2049    if (Val < 0 || Val > 31) {
2050      Error(E, "'lsr' shift amount must be in range [0,31]");
2051      return MatchOperand_ParseFail;
2052    }
2053  }
2054
2055  E = Parser.getTok().getLoc();
2056  Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E));
2057
2058  return MatchOperand_Success;
2059}
2060
2061/// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family
2062/// of instructions. Legal values are:
2063///     ror #n  'n' in {0, 8, 16, 24}
2064ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2065parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2066  const AsmToken &Tok = Parser.getTok();
2067  SMLoc S = Tok.getLoc();
2068  if (Tok.isNot(AsmToken::Identifier)) {
2069    Error(S, "rotate operator 'ror' expected");
2070    return MatchOperand_ParseFail;
2071  }
2072  StringRef ShiftName = Tok.getString();
2073  if (ShiftName != "ror" && ShiftName != "ROR") {
2074    Error(S, "rotate operator 'ror' expected");
2075    return MatchOperand_ParseFail;
2076  }
2077  Parser.Lex(); // Eat the operator.
2078
2079  // A '#' and a rotate amount.
2080  if (Parser.getTok().isNot(AsmToken::Hash)) {
2081    Error(Parser.getTok().getLoc(), "'#' expected");
2082    return MatchOperand_ParseFail;
2083  }
2084  Parser.Lex(); // Eat hash token.
2085
2086  const MCExpr *ShiftAmount;
2087  SMLoc E = Parser.getTok().getLoc();
2088  if (getParser().ParseExpression(ShiftAmount)) {
2089    Error(E, "malformed rotate expression");
2090    return MatchOperand_ParseFail;
2091  }
2092  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
2093  if (!CE) {
2094    Error(E, "rotate amount must be an immediate");
2095    return MatchOperand_ParseFail;
2096  }
2097
2098  int64_t Val = CE->getValue();
2099  // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension)
2100  // normally, zero is represented in asm by omitting the rotate operand
2101  // entirely.
2102  if (Val != 8 && Val != 16 && Val != 24 && Val != 0) {
2103    Error(E, "'ror' rotate amount must be 8, 16, or 24");
2104    return MatchOperand_ParseFail;
2105  }
2106
2107  E = Parser.getTok().getLoc();
2108  Operands.push_back(ARMOperand::CreateRotImm(Val, S, E));
2109
2110  return MatchOperand_Success;
2111}
2112
2113ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2114parseBitfield(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2115  SMLoc S = Parser.getTok().getLoc();
2116  // The bitfield descriptor is really two operands, the LSB and the width.
2117  if (Parser.getTok().isNot(AsmToken::Hash)) {
2118    Error(Parser.getTok().getLoc(), "'#' expected");
2119    return MatchOperand_ParseFail;
2120  }
2121  Parser.Lex(); // Eat hash token.
2122
2123  const MCExpr *LSBExpr;
2124  SMLoc E = Parser.getTok().getLoc();
2125  if (getParser().ParseExpression(LSBExpr)) {
2126    Error(E, "malformed immediate expression");
2127    return MatchOperand_ParseFail;
2128  }
2129  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(LSBExpr);
2130  if (!CE) {
2131    Error(E, "'lsb' operand must be an immediate");
2132    return MatchOperand_ParseFail;
2133  }
2134
2135  int64_t LSB = CE->getValue();
2136  // The LSB must be in the range [0,31]
2137  if (LSB < 0 || LSB > 31) {
2138    Error(E, "'lsb' operand must be in the range [0,31]");
2139    return MatchOperand_ParseFail;
2140  }
2141  E = Parser.getTok().getLoc();
2142
2143  // Expect another immediate operand.
2144  if (Parser.getTok().isNot(AsmToken::Comma)) {
2145    Error(Parser.getTok().getLoc(), "too few operands");
2146    return MatchOperand_ParseFail;
2147  }
2148  Parser.Lex(); // Eat hash token.
2149  if (Parser.getTok().isNot(AsmToken::Hash)) {
2150    Error(Parser.getTok().getLoc(), "'#' expected");
2151    return MatchOperand_ParseFail;
2152  }
2153  Parser.Lex(); // Eat hash token.
2154
2155  const MCExpr *WidthExpr;
2156  if (getParser().ParseExpression(WidthExpr)) {
2157    Error(E, "malformed immediate expression");
2158    return MatchOperand_ParseFail;
2159  }
2160  CE = dyn_cast<MCConstantExpr>(WidthExpr);
2161  if (!CE) {
2162    Error(E, "'width' operand must be an immediate");
2163    return MatchOperand_ParseFail;
2164  }
2165
2166  int64_t Width = CE->getValue();
2167  // The LSB must be in the range [1,32-lsb]
2168  if (Width < 1 || Width > 32 - LSB) {
2169    Error(E, "'width' operand must be in the range [1,32-lsb]");
2170    return MatchOperand_ParseFail;
2171  }
2172  E = Parser.getTok().getLoc();
2173
2174  Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E));
2175
2176  return MatchOperand_Success;
2177}
2178
2179ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2180parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2181  // Check for a post-index addressing register operand. Specifically:
2182  // postidx_reg := '+' register {, shift}
2183  //              | '-' register {, shift}
2184  //              | register {, shift}
2185
2186  // This method must return MatchOperand_NoMatch without consuming any tokens
2187  // in the case where there is no match, as other alternatives take other
2188  // parse methods.
2189  AsmToken Tok = Parser.getTok();
2190  SMLoc S = Tok.getLoc();
2191  bool haveEaten = false;
2192  bool isAdd = true;
2193  int Reg = -1;
2194  if (Tok.is(AsmToken::Plus)) {
2195    Parser.Lex(); // Eat the '+' token.
2196    haveEaten = true;
2197  } else if (Tok.is(AsmToken::Minus)) {
2198    Parser.Lex(); // Eat the '-' token.
2199    isAdd = false;
2200    haveEaten = true;
2201  }
2202  if (Parser.getTok().is(AsmToken::Identifier))
2203    Reg = tryParseRegister();
2204  if (Reg == -1) {
2205    if (!haveEaten)
2206      return MatchOperand_NoMatch;
2207    Error(Parser.getTok().getLoc(), "register expected");
2208    return MatchOperand_ParseFail;
2209  }
2210  SMLoc E = Parser.getTok().getLoc();
2211
2212  ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift;
2213  unsigned ShiftImm = 0;
2214  if (Parser.getTok().is(AsmToken::Comma)) {
2215    Parser.Lex(); // Eat the ','.
2216    if (parseMemRegOffsetShift(ShiftTy, ShiftImm))
2217      return MatchOperand_ParseFail;
2218  }
2219
2220  Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy,
2221                                                  ShiftImm, S, E));
2222
2223  return MatchOperand_Success;
2224}
2225
2226ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2227parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2228  // Check for a post-index addressing register operand. Specifically:
2229  // am3offset := '+' register
2230  //              | '-' register
2231  //              | register
2232  //              | # imm
2233  //              | # + imm
2234  //              | # - imm
2235
2236  // This method must return MatchOperand_NoMatch without consuming any tokens
2237  // in the case where there is no match, as other alternatives take other
2238  // parse methods.
2239  AsmToken Tok = Parser.getTok();
2240  SMLoc S = Tok.getLoc();
2241
2242  // Do immediates first, as we always parse those if we have a '#'.
2243  if (Parser.getTok().is(AsmToken::Hash)) {
2244    Parser.Lex(); // Eat the '#'.
2245    // Explicitly look for a '-', as we need to encode negative zero
2246    // differently.
2247    bool isNegative = Parser.getTok().is(AsmToken::Minus);
2248    const MCExpr *Offset;
2249    if (getParser().ParseExpression(Offset))
2250      return MatchOperand_ParseFail;
2251    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
2252    if (!CE) {
2253      Error(S, "constant expression expected");
2254      return MatchOperand_ParseFail;
2255    }
2256    SMLoc E = Tok.getLoc();
2257    // Negative zero is encoded as the flag value INT32_MIN.
2258    int32_t Val = CE->getValue();
2259    if (isNegative && Val == 0)
2260      Val = INT32_MIN;
2261
2262    Operands.push_back(
2263      ARMOperand::CreateImm(MCConstantExpr::Create(Val, getContext()), S, E));
2264
2265    return MatchOperand_Success;
2266  }
2267
2268
2269  bool haveEaten = false;
2270  bool isAdd = true;
2271  int Reg = -1;
2272  if (Tok.is(AsmToken::Plus)) {
2273    Parser.Lex(); // Eat the '+' token.
2274    haveEaten = true;
2275  } else if (Tok.is(AsmToken::Minus)) {
2276    Parser.Lex(); // Eat the '-' token.
2277    isAdd = false;
2278    haveEaten = true;
2279  }
2280  if (Parser.getTok().is(AsmToken::Identifier))
2281    Reg = tryParseRegister();
2282  if (Reg == -1) {
2283    if (!haveEaten)
2284      return MatchOperand_NoMatch;
2285    Error(Parser.getTok().getLoc(), "register expected");
2286    return MatchOperand_ParseFail;
2287  }
2288  SMLoc E = Parser.getTok().getLoc();
2289
2290  Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift,
2291                                                  0, S, E));
2292
2293  return MatchOperand_Success;
2294}
2295
2296/// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
2297/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2298/// when they refer multiple MIOperands inside a single one.
2299bool ARMAsmParser::
2300cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
2301                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2302  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2303
2304  // Create a writeback register dummy placeholder.
2305  Inst.addOperand(MCOperand::CreateImm(0));
2306
2307  ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
2308  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2309  return true;
2310}
2311
2312/// cvtLdWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
2313/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2314/// when they refer multiple MIOperands inside a single one.
2315bool ARMAsmParser::
2316cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
2317                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2318  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2319
2320  // Create a writeback register dummy placeholder.
2321  Inst.addOperand(MCOperand::CreateImm(0));
2322
2323  ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
2324  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2325  return true;
2326}
2327
2328
2329/// cvtStWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
2330/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2331/// when they refer multiple MIOperands inside a single one.
2332bool ARMAsmParser::
2333cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
2334                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2335  // Create a writeback register dummy placeholder.
2336  Inst.addOperand(MCOperand::CreateImm(0));
2337  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2338  ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
2339  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2340  return true;
2341}
2342
2343/// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
2344/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2345/// when they refer multiple MIOperands inside a single one.
2346bool ARMAsmParser::
2347cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
2348                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2349  // Create a writeback register dummy placeholder.
2350  Inst.addOperand(MCOperand::CreateImm(0));
2351  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2352  ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
2353  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2354  return true;
2355}
2356
2357/// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
2358/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2359/// when they refer multiple MIOperands inside a single one.
2360bool ARMAsmParser::
2361cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
2362                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2363  // Create a writeback register dummy placeholder.
2364  Inst.addOperand(MCOperand::CreateImm(0));
2365  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2366  ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
2367  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2368  return true;
2369}
2370
2371/// cvtLdExtTWriteBackImm - Convert parsed operands to MCInst.
2372/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2373/// when they refer multiple MIOperands inside a single one.
2374bool ARMAsmParser::
2375cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
2376                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2377  // Rt
2378  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2379  // Create a writeback register dummy placeholder.
2380  Inst.addOperand(MCOperand::CreateImm(0));
2381  // addr
2382  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
2383  // offset
2384  ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
2385  // pred
2386  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2387  return true;
2388}
2389
2390/// cvtLdExtTWriteBackReg - Convert parsed operands to MCInst.
2391/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2392/// when they refer multiple MIOperands inside a single one.
2393bool ARMAsmParser::
2394cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
2395                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2396  // Rt
2397  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2398  // Create a writeback register dummy placeholder.
2399  Inst.addOperand(MCOperand::CreateImm(0));
2400  // addr
2401  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
2402  // offset
2403  ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
2404  // pred
2405  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2406  return true;
2407}
2408
2409/// cvtStExtTWriteBackImm - Convert parsed operands to MCInst.
2410/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2411/// when they refer multiple MIOperands inside a single one.
2412bool ARMAsmParser::
2413cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
2414                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2415  // Create a writeback register dummy placeholder.
2416  Inst.addOperand(MCOperand::CreateImm(0));
2417  // Rt
2418  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2419  // addr
2420  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
2421  // offset
2422  ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
2423  // pred
2424  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2425  return true;
2426}
2427
2428/// cvtStExtTWriteBackReg - Convert parsed operands to MCInst.
2429/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2430/// when they refer multiple MIOperands inside a single one.
2431bool ARMAsmParser::
2432cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
2433                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2434  // Create a writeback register dummy placeholder.
2435  Inst.addOperand(MCOperand::CreateImm(0));
2436  // Rt
2437  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2438  // addr
2439  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
2440  // offset
2441  ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
2442  // pred
2443  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2444  return true;
2445}
2446
2447/// cvtLdrdPre - Convert parsed operands to MCInst.
2448/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2449/// when they refer multiple MIOperands inside a single one.
2450bool ARMAsmParser::
2451cvtLdrdPre(MCInst &Inst, unsigned Opcode,
2452           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2453  // Rt, Rt2
2454  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2455  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
2456  // Create a writeback register dummy placeholder.
2457  Inst.addOperand(MCOperand::CreateImm(0));
2458  // addr
2459  ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
2460  // pred
2461  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2462  return true;
2463}
2464
2465/// cvtStrdPre - Convert parsed operands to MCInst.
2466/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2467/// when they refer multiple MIOperands inside a single one.
2468bool ARMAsmParser::
2469cvtStrdPre(MCInst &Inst, unsigned Opcode,
2470           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2471  // Create a writeback register dummy placeholder.
2472  Inst.addOperand(MCOperand::CreateImm(0));
2473  // Rt, Rt2
2474  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2475  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
2476  // addr
2477  ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
2478  // pred
2479  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2480  return true;
2481}
2482
2483/// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
2484/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2485/// when they refer multiple MIOperands inside a single one.
2486bool ARMAsmParser::
2487cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
2488                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2489  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
2490  // Create a writeback register dummy placeholder.
2491  Inst.addOperand(MCOperand::CreateImm(0));
2492  ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
2493  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
2494  return true;
2495}
2496
2497/// cvtThumbMultiple- Convert parsed operands to MCInst.
2498/// Needed here because the Asm Gen Matcher can't handle properly tied operands
2499/// when they refer multiple MIOperands inside a single one.
2500bool ARMAsmParser::
2501cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
2502           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2503  // The second source operand must be the same register as the destination
2504  // operand.
2505  if (Operands.size() == 6 &&
2506      (((ARMOperand*)Operands[3])->getReg() !=
2507       ((ARMOperand*)Operands[5])->getReg()) &&
2508      (((ARMOperand*)Operands[3])->getReg() !=
2509       ((ARMOperand*)Operands[4])->getReg())) {
2510    Error(Operands[3]->getStartLoc(),
2511          "destination register must match source register");
2512    return false;
2513  }
2514  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
2515  ((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1);
2516  ((ARMOperand*)Operands[4])->addRegOperands(Inst, 1);
2517  // If we have a three-operand form, use that, else the second source operand
2518  // is just the destination operand again.
2519  if (Operands.size() == 6)
2520    ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1);
2521  else
2522    Inst.addOperand(Inst.getOperand(0));
2523  ((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2);
2524
2525  return true;
2526}
2527
2528/// Parse an ARM memory expression, return false if successful else return true
2529/// or an error.  The first token must be a '[' when called.
2530bool ARMAsmParser::
2531parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2532  SMLoc S, E;
2533  assert(Parser.getTok().is(AsmToken::LBrac) &&
2534         "Token is not a Left Bracket");
2535  S = Parser.getTok().getLoc();
2536  Parser.Lex(); // Eat left bracket token.
2537
2538  const AsmToken &BaseRegTok = Parser.getTok();
2539  int BaseRegNum = tryParseRegister();
2540  if (BaseRegNum == -1)
2541    return Error(BaseRegTok.getLoc(), "register expected");
2542
2543  // The next token must either be a comma or a closing bracket.
2544  const AsmToken &Tok = Parser.getTok();
2545  if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac))
2546    return Error(Tok.getLoc(), "malformed memory operand");
2547
2548  if (Tok.is(AsmToken::RBrac)) {
2549    E = Tok.getLoc();
2550    Parser.Lex(); // Eat right bracket token.
2551
2552    Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift,
2553                                             0, false, S, E));
2554
2555    return false;
2556  }
2557
2558  assert(Tok.is(AsmToken::Comma) && "Lost comma in memory operand?!");
2559  Parser.Lex(); // Eat the comma.
2560
2561  // If we have a '#' it's an immediate offset, else assume it's a register
2562  // offset.
2563  if (Parser.getTok().is(AsmToken::Hash)) {
2564    Parser.Lex(); // Eat the '#'.
2565    E = Parser.getTok().getLoc();
2566
2567    // FIXME: Special case #-0 so we can correctly set the U bit.
2568
2569    const MCExpr *Offset;
2570    if (getParser().ParseExpression(Offset))
2571     return true;
2572
2573    // The expression has to be a constant. Memory references with relocations
2574    // don't come through here, as they use the <label> forms of the relevant
2575    // instructions.
2576    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
2577    if (!CE)
2578      return Error (E, "constant expression expected");
2579
2580    // Now we should have the closing ']'
2581    E = Parser.getTok().getLoc();
2582    if (Parser.getTok().isNot(AsmToken::RBrac))
2583      return Error(E, "']' expected");
2584    Parser.Lex(); // Eat right bracket token.
2585
2586    // Don't worry about range checking the value here. That's handled by
2587    // the is*() predicates.
2588    Operands.push_back(ARMOperand::CreateMem(BaseRegNum, CE, 0,
2589                                             ARM_AM::no_shift, 0, false, S,E));
2590
2591    // If there's a pre-indexing writeback marker, '!', just add it as a token
2592    // operand.
2593    if (Parser.getTok().is(AsmToken::Exclaim)) {
2594      Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
2595      Parser.Lex(); // Eat the '!'.
2596    }
2597
2598    return false;
2599  }
2600
2601  // The register offset is optionally preceded by a '+' or '-'
2602  bool isNegative = false;
2603  if (Parser.getTok().is(AsmToken::Minus)) {
2604    isNegative = true;
2605    Parser.Lex(); // Eat the '-'.
2606  } else if (Parser.getTok().is(AsmToken::Plus)) {
2607    // Nothing to do.
2608    Parser.Lex(); // Eat the '+'.
2609  }
2610
2611  E = Parser.getTok().getLoc();
2612  int OffsetRegNum = tryParseRegister();
2613  if (OffsetRegNum == -1)
2614    return Error(E, "register expected");
2615
2616  // If there's a shift operator, handle it.
2617  ARM_AM::ShiftOpc ShiftType = ARM_AM::no_shift;
2618  unsigned ShiftImm = 0;
2619  if (Parser.getTok().is(AsmToken::Comma)) {
2620    Parser.Lex(); // Eat the ','.
2621    if (parseMemRegOffsetShift(ShiftType, ShiftImm))
2622      return true;
2623  }
2624
2625  // Now we should have the closing ']'
2626  E = Parser.getTok().getLoc();
2627  if (Parser.getTok().isNot(AsmToken::RBrac))
2628    return Error(E, "']' expected");
2629  Parser.Lex(); // Eat right bracket token.
2630
2631  Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum,
2632                                           ShiftType, ShiftImm, isNegative,
2633                                           S, E));
2634
2635  // If there's a pre-indexing writeback marker, '!', just add it as a token
2636  // operand.
2637  if (Parser.getTok().is(AsmToken::Exclaim)) {
2638    Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
2639    Parser.Lex(); // Eat the '!'.
2640  }
2641
2642  return false;
2643}
2644
2645/// parseMemRegOffsetShift - one of these two:
2646///   ( lsl | lsr | asr | ror ) , # shift_amount
2647///   rrx
2648/// return true if it parses a shift otherwise it returns false.
2649bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St,
2650                                          unsigned &Amount) {
2651  SMLoc Loc = Parser.getTok().getLoc();
2652  const AsmToken &Tok = Parser.getTok();
2653  if (Tok.isNot(AsmToken::Identifier))
2654    return true;
2655  StringRef ShiftName = Tok.getString();
2656  if (ShiftName == "lsl" || ShiftName == "LSL")
2657    St = ARM_AM::lsl;
2658  else if (ShiftName == "lsr" || ShiftName == "LSR")
2659    St = ARM_AM::lsr;
2660  else if (ShiftName == "asr" || ShiftName == "ASR")
2661    St = ARM_AM::asr;
2662  else if (ShiftName == "ror" || ShiftName == "ROR")
2663    St = ARM_AM::ror;
2664  else if (ShiftName == "rrx" || ShiftName == "RRX")
2665    St = ARM_AM::rrx;
2666  else
2667    return Error(Loc, "illegal shift operator");
2668  Parser.Lex(); // Eat shift type token.
2669
2670  // rrx stands alone.
2671  Amount = 0;
2672  if (St != ARM_AM::rrx) {
2673    Loc = Parser.getTok().getLoc();
2674    // A '#' and a shift amount.
2675    const AsmToken &HashTok = Parser.getTok();
2676    if (HashTok.isNot(AsmToken::Hash))
2677      return Error(HashTok.getLoc(), "'#' expected");
2678    Parser.Lex(); // Eat hash token.
2679
2680    const MCExpr *Expr;
2681    if (getParser().ParseExpression(Expr))
2682      return true;
2683    // Range check the immediate.
2684    // lsl, ror: 0 <= imm <= 31
2685    // lsr, asr: 0 <= imm <= 32
2686    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
2687    if (!CE)
2688      return Error(Loc, "shift amount must be an immediate");
2689    int64_t Imm = CE->getValue();
2690    if (Imm < 0 ||
2691        ((St == ARM_AM::lsl || St == ARM_AM::ror) && Imm > 31) ||
2692        ((St == ARM_AM::lsr || St == ARM_AM::asr) && Imm > 32))
2693      return Error(Loc, "immediate shift value out of range");
2694    Amount = Imm;
2695  }
2696
2697  return false;
2698}
2699
2700/// Parse a arm instruction operand.  For now this parses the operand regardless
2701/// of the mnemonic.
2702bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
2703                                StringRef Mnemonic) {
2704  SMLoc S, E;
2705
2706  // Check if the current operand has a custom associated parser, if so, try to
2707  // custom parse the operand, or fallback to the general approach.
2708  OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
2709  if (ResTy == MatchOperand_Success)
2710    return false;
2711  // If there wasn't a custom match, try the generic matcher below. Otherwise,
2712  // there was a match, but an error occurred, in which case, just return that
2713  // the operand parsing failed.
2714  if (ResTy == MatchOperand_ParseFail)
2715    return true;
2716
2717  switch (getLexer().getKind()) {
2718  default:
2719    Error(Parser.getTok().getLoc(), "unexpected token in operand");
2720    return true;
2721  case AsmToken::Identifier: {
2722    if (!tryParseRegisterWithWriteBack(Operands))
2723      return false;
2724    int Res = tryParseShiftRegister(Operands);
2725    if (Res == 0) // success
2726      return false;
2727    else if (Res == -1) // irrecoverable error
2728      return true;
2729
2730    // Fall though for the Identifier case that is not a register or a
2731    // special name.
2732  }
2733  case AsmToken::Integer: // things like 1f and 2b as a branch targets
2734  case AsmToken::Dot: {   // . as a branch target
2735    // This was not a register so parse other operands that start with an
2736    // identifier (like labels) as expressions and create them as immediates.
2737    const MCExpr *IdVal;
2738    S = Parser.getTok().getLoc();
2739    if (getParser().ParseExpression(IdVal))
2740      return true;
2741    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
2742    Operands.push_back(ARMOperand::CreateImm(IdVal, S, E));
2743    return false;
2744  }
2745  case AsmToken::LBrac:
2746    return parseMemory(Operands);
2747  case AsmToken::LCurly:
2748    return parseRegisterList(Operands);
2749  case AsmToken::Hash:
2750    // #42 -> immediate.
2751    // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate
2752    S = Parser.getTok().getLoc();
2753    Parser.Lex();
2754    const MCExpr *ImmVal;
2755    if (getParser().ParseExpression(ImmVal))
2756      return true;
2757    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
2758    Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E));
2759    return false;
2760  case AsmToken::Colon: {
2761    // ":lower16:" and ":upper16:" expression prefixes
2762    // FIXME: Check it's an expression prefix,
2763    // e.g. (FOO - :lower16:BAR) isn't legal.
2764    ARMMCExpr::VariantKind RefKind;
2765    if (parsePrefix(RefKind))
2766      return true;
2767
2768    const MCExpr *SubExprVal;
2769    if (getParser().ParseExpression(SubExprVal))
2770      return true;
2771
2772    const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal,
2773                                                   getContext());
2774    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
2775    Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E));
2776    return false;
2777  }
2778  }
2779}
2780
2781// parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e.
2782//  :lower16: and :upper16:.
2783bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
2784  RefKind = ARMMCExpr::VK_ARM_None;
2785
2786  // :lower16: and :upper16: modifiers
2787  assert(getLexer().is(AsmToken::Colon) && "expected a :");
2788  Parser.Lex(); // Eat ':'
2789
2790  if (getLexer().isNot(AsmToken::Identifier)) {
2791    Error(Parser.getTok().getLoc(), "expected prefix identifier in operand");
2792    return true;
2793  }
2794
2795  StringRef IDVal = Parser.getTok().getIdentifier();
2796  if (IDVal == "lower16") {
2797    RefKind = ARMMCExpr::VK_ARM_LO16;
2798  } else if (IDVal == "upper16") {
2799    RefKind = ARMMCExpr::VK_ARM_HI16;
2800  } else {
2801    Error(Parser.getTok().getLoc(), "unexpected prefix in operand");
2802    return true;
2803  }
2804  Parser.Lex();
2805
2806  if (getLexer().isNot(AsmToken::Colon)) {
2807    Error(Parser.getTok().getLoc(), "unexpected token after prefix");
2808    return true;
2809  }
2810  Parser.Lex(); // Eat the last ':'
2811  return false;
2812}
2813
2814const MCExpr *
2815ARMAsmParser::applyPrefixToExpr(const MCExpr *E,
2816                                MCSymbolRefExpr::VariantKind Variant) {
2817  // Recurse over the given expression, rebuilding it to apply the given variant
2818  // to the leftmost symbol.
2819  if (Variant == MCSymbolRefExpr::VK_None)
2820    return E;
2821
2822  switch (E->getKind()) {
2823  case MCExpr::Target:
2824    llvm_unreachable("Can't handle target expr yet");
2825  case MCExpr::Constant:
2826    llvm_unreachable("Can't handle lower16/upper16 of constant yet");
2827
2828  case MCExpr::SymbolRef: {
2829    const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
2830
2831    if (SRE->getKind() != MCSymbolRefExpr::VK_None)
2832      return 0;
2833
2834    return MCSymbolRefExpr::Create(&SRE->getSymbol(), Variant, getContext());
2835  }
2836
2837  case MCExpr::Unary:
2838    llvm_unreachable("Can't handle unary expressions yet");
2839
2840  case MCExpr::Binary: {
2841    const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
2842    const MCExpr *LHS = applyPrefixToExpr(BE->getLHS(), Variant);
2843    const MCExpr *RHS = BE->getRHS();
2844    if (!LHS)
2845      return 0;
2846
2847    return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, getContext());
2848  }
2849  }
2850
2851  assert(0 && "Invalid expression kind!");
2852  return 0;
2853}
2854
2855/// \brief Given a mnemonic, split out possible predication code and carry
2856/// setting letters to form a canonical mnemonic and flags.
2857//
2858// FIXME: Would be nice to autogen this.
2859// FIXME: This is a bit of a maze of special cases.
2860StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic,
2861                                      unsigned &PredicationCode,
2862                                      bool &CarrySetting,
2863                                      unsigned &ProcessorIMod,
2864                                      StringRef &ITMask) {
2865  PredicationCode = ARMCC::AL;
2866  CarrySetting = false;
2867  ProcessorIMod = 0;
2868
2869  // Ignore some mnemonics we know aren't predicated forms.
2870  //
2871  // FIXME: Would be nice to autogen this.
2872  if ((Mnemonic == "movs" && isThumb()) ||
2873      Mnemonic == "teq"   || Mnemonic == "vceq"   || Mnemonic == "svc"   ||
2874      Mnemonic == "mls"   || Mnemonic == "smmls"  || Mnemonic == "vcls"  ||
2875      Mnemonic == "vmls"  || Mnemonic == "vnmls"  || Mnemonic == "vacge" ||
2876      Mnemonic == "vcge"  || Mnemonic == "vclt"   || Mnemonic == "vacgt" ||
2877      Mnemonic == "vcgt"  || Mnemonic == "vcle"   || Mnemonic == "smlal" ||
2878      Mnemonic == "umaal" || Mnemonic == "umlal"  || Mnemonic == "vabal" ||
2879      Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal")
2880    return Mnemonic;
2881
2882  // First, split out any predication code. Ignore mnemonics we know aren't
2883  // predicated but do have a carry-set and so weren't caught above.
2884  if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" &&
2885      Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" &&
2886      Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" &&
2887      Mnemonic != "sbcs") {
2888    unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
2889      .Case("eq", ARMCC::EQ)
2890      .Case("ne", ARMCC::NE)
2891      .Case("hs", ARMCC::HS)
2892      .Case("cs", ARMCC::HS)
2893      .Case("lo", ARMCC::LO)
2894      .Case("cc", ARMCC::LO)
2895      .Case("mi", ARMCC::MI)
2896      .Case("pl", ARMCC::PL)
2897      .Case("vs", ARMCC::VS)
2898      .Case("vc", ARMCC::VC)
2899      .Case("hi", ARMCC::HI)
2900      .Case("ls", ARMCC::LS)
2901      .Case("ge", ARMCC::GE)
2902      .Case("lt", ARMCC::LT)
2903      .Case("gt", ARMCC::GT)
2904      .Case("le", ARMCC::LE)
2905      .Case("al", ARMCC::AL)
2906      .Default(~0U);
2907    if (CC != ~0U) {
2908      Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
2909      PredicationCode = CC;
2910    }
2911  }
2912
2913  // Next, determine if we have a carry setting bit. We explicitly ignore all
2914  // the instructions we know end in 's'.
2915  if (Mnemonic.endswith("s") &&
2916      !(Mnemonic == "cps" || Mnemonic == "mls" ||
2917        Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" ||
2918        Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" ||
2919        Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" ||
2920        Mnemonic == "vrsqrts" || Mnemonic == "srs" ||
2921        (Mnemonic == "movs" && isThumb()))) {
2922    Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1);
2923    CarrySetting = true;
2924  }
2925
2926  // The "cps" instruction can have a interrupt mode operand which is glued into
2927  // the mnemonic. Check if this is the case, split it and parse the imod op
2928  if (Mnemonic.startswith("cps")) {
2929    // Split out any imod code.
2930    unsigned IMod =
2931      StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2))
2932      .Case("ie", ARM_PROC::IE)
2933      .Case("id", ARM_PROC::ID)
2934      .Default(~0U);
2935    if (IMod != ~0U) {
2936      Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2);
2937      ProcessorIMod = IMod;
2938    }
2939  }
2940
2941  // The "it" instruction has the condition mask on the end of the mnemonic.
2942  if (Mnemonic.startswith("it")) {
2943    ITMask = Mnemonic.slice(2, Mnemonic.size());
2944    Mnemonic = Mnemonic.slice(0, 2);
2945  }
2946
2947  return Mnemonic;
2948}
2949
2950/// \brief Given a canonical mnemonic, determine if the instruction ever allows
2951/// inclusion of carry set or predication code operands.
2952//
2953// FIXME: It would be nice to autogen this.
2954void ARMAsmParser::
2955getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
2956                      bool &CanAcceptPredicationCode) {
2957  if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
2958      Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
2959      Mnemonic == "smull" || Mnemonic == "add" || Mnemonic == "adc" ||
2960      Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" ||
2961      Mnemonic == "umlal" || Mnemonic == "orr" || Mnemonic == "mvn" ||
2962      Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" ||
2963      Mnemonic == "sbc" || Mnemonic == "mla" || Mnemonic == "umull" ||
2964      Mnemonic == "eor" || Mnemonic == "smlal" || Mnemonic == "neg" ||
2965      // FIXME: We need a better way. This really confused Thumb2
2966      // parsing for 'mov'.
2967      (Mnemonic == "mov" && !isThumbOne())) {
2968    CanAcceptCarrySet = true;
2969  } else {
2970    CanAcceptCarrySet = false;
2971  }
2972
2973  if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" ||
2974      Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" ||
2975      Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" ||
2976      Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" ||
2977      Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "clrex" ||
2978      Mnemonic == "setend" ||
2979      (Mnemonic == "nop" && isThumbOne()) ||
2980      ((Mnemonic == "pld" || Mnemonic == "pli") && !isThumb()) ||
2981      ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs"))
2982        && !isThumb()) ||
2983      Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumb())) {
2984    CanAcceptPredicationCode = false;
2985  } else {
2986    CanAcceptPredicationCode = true;
2987  }
2988
2989  if (isThumb())
2990    if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" ||
2991        Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp")
2992      CanAcceptPredicationCode = false;
2993}
2994
2995bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic,
2996                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2997
2998  // The 'mov' mnemonic is special. One variant has a cc_out operand, while
2999  // another does not. Specifically, the MOVW instruction does not. So we
3000  // special case it here and remove the defaulted (non-setting) cc_out
3001  // operand if that's the instruction we're trying to match.
3002  //
3003  // We do this as post-processing of the explicit operands rather than just
3004  // conditionally adding the cc_out in the first place because we need
3005  // to check the type of the parsed immediate operand.
3006  if (Mnemonic == "mov" && Operands.size() > 4 &&
3007      !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() &&
3008      static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() &&
3009      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
3010    return true;
3011
3012  // Register-register 'add' for thumb does not have a cc_out operand
3013  // when there are only two register operands.
3014  if (isThumb() && Mnemonic == "add" && Operands.size() == 5 &&
3015      static_cast<ARMOperand*>(Operands[3])->isReg() &&
3016      static_cast<ARMOperand*>(Operands[4])->isReg() &&
3017      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
3018    return true;
3019  // Register-register 'add' for thumb does not have a cc_out operand
3020  // when it's an ADD Rdm, SP, {Rdm|#imm} instruction.
3021  if (isThumb() && Mnemonic == "add" && Operands.size() == 6 &&
3022      static_cast<ARMOperand*>(Operands[3])->isReg() &&
3023      static_cast<ARMOperand*>(Operands[4])->isReg() &&
3024      static_cast<ARMOperand*>(Operands[4])->getReg() == ARM::SP &&
3025      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
3026    return true;
3027  // Register-register 'add/sub' for thumb does not have a cc_out operand
3028  // when it's an ADD/SUB SP, #imm. Be lenient on count since there's also
3029  // the "add/sub SP, SP, #imm" version. If the follow-up operands aren't
3030  // right, this will result in better diagnostics (which operand is off)
3031  // anyway.
3032  if (isThumb() && (Mnemonic == "add" || Mnemonic == "sub") &&
3033      (Operands.size() == 5 || Operands.size() == 6) &&
3034      static_cast<ARMOperand*>(Operands[3])->isReg() &&
3035      static_cast<ARMOperand*>(Operands[3])->getReg() == ARM::SP &&
3036      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
3037    return true;
3038
3039  return false;
3040}
3041
3042/// Parse an arm instruction mnemonic followed by its operands.
3043bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
3044                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3045  // Create the leading tokens for the mnemonic, split by '.' characters.
3046  size_t Start = 0, Next = Name.find('.');
3047  StringRef Mnemonic = Name.slice(Start, Next);
3048
3049  // Split out the predication code and carry setting flag from the mnemonic.
3050  unsigned PredicationCode;
3051  unsigned ProcessorIMod;
3052  bool CarrySetting;
3053  StringRef ITMask;
3054  Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting,
3055                           ProcessorIMod, ITMask);
3056
3057  // In Thumb1, only the branch (B) instruction can be predicated.
3058  if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {
3059    Parser.EatToEndOfStatement();
3060    return Error(NameLoc, "conditional execution not supported in Thumb1");
3061  }
3062
3063  Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc));
3064
3065  // Handle the IT instruction ITMask. Convert it to a bitmask. This
3066  // is the mask as it will be for the IT encoding if the conditional
3067  // encoding has a '1' as it's bit0 (i.e. 't' ==> '1'). In the case
3068  // where the conditional bit0 is zero, the instruction post-processing
3069  // will adjust the mask accordingly.
3070  if (Mnemonic == "it") {
3071    unsigned Mask = 8;
3072    for (unsigned i = ITMask.size(); i != 0; --i) {
3073      char pos = ITMask[i - 1];
3074      if (pos != 't' && pos != 'e') {
3075        Parser.EatToEndOfStatement();
3076        return Error(NameLoc, "illegal IT instruction mask '" + ITMask + "'");
3077      }
3078      Mask >>= 1;
3079      if (ITMask[i - 1] == 't')
3080        Mask |= 8;
3081    }
3082    Operands.push_back(ARMOperand::CreateITMask(Mask, NameLoc));
3083  }
3084
3085  // FIXME: This is all a pretty gross hack. We should automatically handle
3086  // optional operands like this via tblgen.
3087
3088  // Next, add the CCOut and ConditionCode operands, if needed.
3089  //
3090  // For mnemonics which can ever incorporate a carry setting bit or predication
3091  // code, our matching model involves us always generating CCOut and
3092  // ConditionCode operands to match the mnemonic "as written" and then we let
3093  // the matcher deal with finding the right instruction or generating an
3094  // appropriate error.
3095  bool CanAcceptCarrySet, CanAcceptPredicationCode;
3096  getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode);
3097
3098  // If we had a carry-set on an instruction that can't do that, issue an
3099  // error.
3100  if (!CanAcceptCarrySet && CarrySetting) {
3101    Parser.EatToEndOfStatement();
3102    return Error(NameLoc, "instruction '" + Mnemonic +
3103                 "' can not set flags, but 's' suffix specified");
3104  }
3105  // If we had a predication code on an instruction that can't do that, issue an
3106  // error.
3107  if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) {
3108    Parser.EatToEndOfStatement();
3109    return Error(NameLoc, "instruction '" + Mnemonic +
3110                 "' is not predicable, but condition code specified");
3111  }
3112
3113  // Add the carry setting operand, if necessary.
3114  //
3115  // FIXME: It would be awesome if we could somehow invent a location such that
3116  // match errors on this operand would print a nice diagnostic about how the
3117  // 's' character in the mnemonic resulted in a CCOut operand.
3118  if (CanAcceptCarrySet)
3119    Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
3120                                               NameLoc));
3121
3122  // Add the predication code operand, if necessary.
3123  if (CanAcceptPredicationCode) {
3124    Operands.push_back(ARMOperand::CreateCondCode(
3125                         ARMCC::CondCodes(PredicationCode), NameLoc));
3126  }
3127
3128  // Add the processor imod operand, if necessary.
3129  if (ProcessorIMod) {
3130    Operands.push_back(ARMOperand::CreateImm(
3131          MCConstantExpr::Create(ProcessorIMod, getContext()),
3132                                 NameLoc, NameLoc));
3133  }
3134
3135  // Add the remaining tokens in the mnemonic.
3136  while (Next != StringRef::npos) {
3137    Start = Next;
3138    Next = Name.find('.', Start + 1);
3139    StringRef ExtraToken = Name.slice(Start, Next);
3140
3141    // For now, we're only parsing Thumb1 (for the most part), so
3142    // just ignore ".n" qualifiers. We'll use them to restrict
3143    // matching when we do Thumb2.
3144    if (ExtraToken != ".n")
3145      Operands.push_back(ARMOperand::CreateToken(ExtraToken, NameLoc));
3146  }
3147
3148  // Read the remaining operands.
3149  if (getLexer().isNot(AsmToken::EndOfStatement)) {
3150    // Read the first operand.
3151    if (parseOperand(Operands, Mnemonic)) {
3152      Parser.EatToEndOfStatement();
3153      return true;
3154    }
3155
3156    while (getLexer().is(AsmToken::Comma)) {
3157      Parser.Lex();  // Eat the comma.
3158
3159      // Parse and remember the operand.
3160      if (parseOperand(Operands, Mnemonic)) {
3161        Parser.EatToEndOfStatement();
3162        return true;
3163      }
3164    }
3165  }
3166
3167  if (getLexer().isNot(AsmToken::EndOfStatement)) {
3168    Parser.EatToEndOfStatement();
3169    return TokError("unexpected token in argument list");
3170  }
3171
3172  Parser.Lex(); // Consume the EndOfStatement
3173
3174  // Some instructions, mostly Thumb, have forms for the same mnemonic that
3175  // do and don't have a cc_out optional-def operand. With some spot-checks
3176  // of the operand list, we can figure out which variant we're trying to
3177  // parse and adjust accordingly before actually matching. Reason number
3178  // #317 the table driven matcher doesn't fit well with the ARM instruction
3179  // set.
3180  if (shouldOmitCCOutOperand(Mnemonic, Operands)) {
3181    ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
3182    Operands.erase(Operands.begin() + 1);
3183    delete Op;
3184  }
3185
3186  // ARM mode 'blx' need special handling, as the register operand version
3187  // is predicable, but the label operand version is not. So, we can't rely
3188  // on the Mnemonic based checking to correctly figure out when to put
3189  // a CondCode operand in the list. If we're trying to match the label
3190  // version, remove the CondCode operand here.
3191  if (!isThumb() && Mnemonic == "blx" && Operands.size() == 3 &&
3192      static_cast<ARMOperand*>(Operands[2])->isImm()) {
3193    ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
3194    Operands.erase(Operands.begin() + 1);
3195    delete Op;
3196  }
3197
3198  // The vector-compare-to-zero instructions have a literal token "#0" at
3199  // the end that comes to here as an immediate operand. Convert it to a
3200  // token to play nicely with the matcher.
3201  if ((Mnemonic == "vceq" || Mnemonic == "vcge" || Mnemonic == "vcgt" ||
3202      Mnemonic == "vcle" || Mnemonic == "vclt") && Operands.size() == 6 &&
3203      static_cast<ARMOperand*>(Operands[5])->isImm()) {
3204    ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
3205    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
3206    if (CE && CE->getValue() == 0) {
3207      Operands.erase(Operands.begin() + 5);
3208      Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
3209      delete Op;
3210    }
3211  }
3212  // Similarly, the Thumb1 "RSB" instruction has a literal "#0" on the
3213  // end. Convert it to a token here.
3214  if (Mnemonic == "rsb" && isThumb() && Operands.size() == 6 &&
3215      static_cast<ARMOperand*>(Operands[5])->isImm()) {
3216    ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
3217    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
3218    if (CE && CE->getValue() == 0) {
3219      Operands.erase(Operands.begin() + 5);
3220      Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
3221      delete Op;
3222    }
3223  }
3224
3225  return false;
3226}
3227
3228// Validate context-sensitive operand constraints.
3229
3230// return 'true' if register list contains non-low GPR registers,
3231// 'false' otherwise. If Reg is in the register list or is HiReg, set
3232// 'containsReg' to true.
3233static bool checkLowRegisterList(MCInst Inst, unsigned OpNo, unsigned Reg,
3234                                 unsigned HiReg, bool &containsReg) {
3235  containsReg = false;
3236  for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) {
3237    unsigned OpReg = Inst.getOperand(i).getReg();
3238    if (OpReg == Reg)
3239      containsReg = true;
3240    // Anything other than a low register isn't legal here.
3241    if (!isARMLowRegister(OpReg) && (!HiReg || OpReg != HiReg))
3242      return true;
3243  }
3244  return false;
3245}
3246
3247// FIXME: We would really like to be able to tablegen'erate this.
3248bool ARMAsmParser::
3249validateInstruction(MCInst &Inst,
3250                    const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3251  switch (Inst.getOpcode()) {
3252  case ARM::LDRD:
3253  case ARM::LDRD_PRE:
3254  case ARM::LDRD_POST:
3255  case ARM::LDREXD: {
3256    // Rt2 must be Rt + 1.
3257    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
3258    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
3259    if (Rt2 != Rt + 1)
3260      return Error(Operands[3]->getStartLoc(),
3261                   "destination operands must be sequential");
3262    return false;
3263  }
3264  case ARM::STRD: {
3265    // Rt2 must be Rt + 1.
3266    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
3267    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
3268    if (Rt2 != Rt + 1)
3269      return Error(Operands[3]->getStartLoc(),
3270                   "source operands must be sequential");
3271    return false;
3272  }
3273  case ARM::STRD_PRE:
3274  case ARM::STRD_POST:
3275  case ARM::STREXD: {
3276    // Rt2 must be Rt + 1.
3277    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg());
3278    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg());
3279    if (Rt2 != Rt + 1)
3280      return Error(Operands[3]->getStartLoc(),
3281                   "source operands must be sequential");
3282    return false;
3283  }
3284  case ARM::SBFX:
3285  case ARM::UBFX: {
3286    // width must be in range [1, 32-lsb]
3287    unsigned lsb = Inst.getOperand(2).getImm();
3288    unsigned widthm1 = Inst.getOperand(3).getImm();
3289    if (widthm1 >= 32 - lsb)
3290      return Error(Operands[5]->getStartLoc(),
3291                   "bitfield width must be in range [1,32-lsb]");
3292    return false;
3293  }
3294  case ARM::tLDMIA: {
3295    // Thumb LDM instructions are writeback iff the base register is not
3296    // in the register list.
3297    unsigned Rn = Inst.getOperand(0).getReg();
3298    bool hasWritebackToken =
3299      (static_cast<ARMOperand*>(Operands[3])->isToken() &&
3300       static_cast<ARMOperand*>(Operands[3])->getToken() == "!");
3301    bool listContainsBase;
3302    if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase))
3303      return Error(Operands[3 + hasWritebackToken]->getStartLoc(),
3304                   "registers must be in range r0-r7");
3305    // If we should have writeback, then there should be a '!' token.
3306    if (!listContainsBase && !hasWritebackToken)
3307      return Error(Operands[2]->getStartLoc(),
3308                   "writeback operator '!' expected");
3309    // Likewise, if we should not have writeback, there must not be a '!'
3310    if (listContainsBase && hasWritebackToken)
3311      return Error(Operands[3]->getStartLoc(),
3312                   "writeback operator '!' not allowed when base register "
3313                   "in register list");
3314
3315    break;
3316  }
3317  case ARM::tPOP: {
3318    bool listContainsBase;
3319    if (checkLowRegisterList(Inst, 3, 0, ARM::PC, listContainsBase))
3320      return Error(Operands[2]->getStartLoc(),
3321                   "registers must be in range r0-r7 or pc");
3322    break;
3323  }
3324  case ARM::tPUSH: {
3325    bool listContainsBase;
3326    if (checkLowRegisterList(Inst, 3, 0, ARM::LR, listContainsBase))
3327      return Error(Operands[2]->getStartLoc(),
3328                   "registers must be in range r0-r7 or lr");
3329    break;
3330  }
3331  case ARM::tSTMIA_UPD: {
3332    bool listContainsBase;
3333    if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase))
3334      return Error(Operands[4]->getStartLoc(),
3335                   "registers must be in range r0-r7");
3336    break;
3337  }
3338  }
3339
3340  return false;
3341}
3342
3343void ARMAsmParser::
3344processInstruction(MCInst &Inst,
3345                   const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3346  switch (Inst.getOpcode()) {
3347  case ARM::LDMIA_UPD:
3348    // If this is a load of a single register via a 'pop', then we should use
3349    // a post-indexed LDR instruction instead, per the ARM ARM.
3350    if (static_cast<ARMOperand*>(Operands[0])->getToken() == "pop" &&
3351        Inst.getNumOperands() == 5) {
3352      MCInst TmpInst;
3353      TmpInst.setOpcode(ARM::LDR_POST_IMM);
3354      TmpInst.addOperand(Inst.getOperand(4)); // Rt
3355      TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
3356      TmpInst.addOperand(Inst.getOperand(1)); // Rn
3357      TmpInst.addOperand(MCOperand::CreateReg(0));  // am2offset
3358      TmpInst.addOperand(MCOperand::CreateImm(4));
3359      TmpInst.addOperand(Inst.getOperand(2)); // CondCode
3360      TmpInst.addOperand(Inst.getOperand(3));
3361      Inst = TmpInst;
3362    }
3363    break;
3364  case ARM::STMDB_UPD:
3365    // If this is a store of a single register via a 'push', then we should use
3366    // a pre-indexed STR instruction instead, per the ARM ARM.
3367    if (static_cast<ARMOperand*>(Operands[0])->getToken() == "push" &&
3368        Inst.getNumOperands() == 5) {
3369      MCInst TmpInst;
3370      TmpInst.setOpcode(ARM::STR_PRE_IMM);
3371      TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
3372      TmpInst.addOperand(Inst.getOperand(4)); // Rt
3373      TmpInst.addOperand(Inst.getOperand(1)); // addrmode_imm12
3374      TmpInst.addOperand(MCOperand::CreateImm(-4));
3375      TmpInst.addOperand(Inst.getOperand(2)); // CondCode
3376      TmpInst.addOperand(Inst.getOperand(3));
3377      Inst = TmpInst;
3378    }
3379    break;
3380  case ARM::tADDi8:
3381    // If the immediate is in the range 0-7, we really wanted tADDi3.
3382    if (Inst.getOperand(3).getImm() < 8)
3383      Inst.setOpcode(ARM::tADDi3);
3384    break;
3385  case ARM::tBcc:
3386    // If the conditional is AL, we really want tB.
3387    if (Inst.getOperand(1).getImm() == ARMCC::AL)
3388      Inst.setOpcode(ARM::tB);
3389    break;
3390  case ARM::t2IT: {
3391    // The mask bits for all but the first condition are represented as
3392    // the low bit of the condition code value implies 't'. We currently
3393    // always have 1 implies 't', so XOR toggle the bits if the low bit
3394    // of the condition code is zero. The encoding also expects the low
3395    // bit of the condition to be encoded as bit 4 of the mask operand,
3396    // so mask that in if needed
3397    MCOperand &MO = Inst.getOperand(1);
3398    unsigned Mask = MO.getImm();
3399    if ((Inst.getOperand(0).getImm() & 1) == 0) {
3400      unsigned TZ = CountTrailingZeros_32(Mask);
3401      assert(Mask && TZ <= 3 && "illegal IT mask value!");
3402      for (unsigned i = 3; i != TZ; --i)
3403        Mask ^= 1 << i;
3404    } else
3405      Mask |= 0x10;
3406    MO.setImm(Mask);
3407    break;
3408  }
3409  }
3410}
3411
3412// FIXME: We would really prefer to have MCInstrInfo (the wrapper around
3413// the ARMInsts array) instead. Getting that here requires awkward
3414// API changes, though. Better way?
3415namespace llvm {
3416extern MCInstrDesc ARMInsts[];
3417}
3418static MCInstrDesc &getInstDesc(unsigned Opcode) {
3419  return ARMInsts[Opcode];
3420}
3421
3422unsigned ARMAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
3423  // 16-bit thumb arithmetic instructions either require or preclude the 'S'
3424  // suffix depending on whether they're in an IT block or not.
3425  unsigned Opc = Inst.getOpcode();
3426  MCInstrDesc &MCID = getInstDesc(Opc);
3427  if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) {
3428    assert(MCID.hasOptionalDef() &&
3429           "optionally flag setting instruction missing optional def operand");
3430    assert(MCID.NumOperands == Inst.getNumOperands() &&
3431           "operand count mismatch!");
3432    // Find the optional-def operand (cc_out).
3433    unsigned OpNo;
3434    for (OpNo = 0;
3435         !MCID.OpInfo[OpNo].isOptionalDef() && OpNo < MCID.NumOperands;
3436         ++OpNo)
3437      ;
3438    // If we're parsing Thumb1, reject it completely.
3439    if (isThumbOne() && Inst.getOperand(OpNo).getReg() != ARM::CPSR)
3440      return Match_MnemonicFail;
3441    // If we're parsing Thumb2, which form is legal depends on whether we're
3442    // in an IT block.
3443    // FIXME: We don't yet do IT blocks, so just always consider it to be
3444    // that we aren't in one until we do.
3445    if (isThumbTwo() && Inst.getOperand(OpNo).getReg() != ARM::CPSR)
3446      return Match_RequiresITBlock;
3447  }
3448  // Some high-register supporting Thumb1 encodings only allow both registers
3449  // to be from r0-r7 when in Thumb2.
3450  else if (Opc == ARM::tADDhirr && isThumbOne() &&
3451           isARMLowRegister(Inst.getOperand(1).getReg()) &&
3452           isARMLowRegister(Inst.getOperand(2).getReg()))
3453    return Match_RequiresThumb2;
3454  // Others only require ARMv6 or later.
3455  else if (Opc == ARM::tMOVr && isThumbOne() && !hasV6Ops() &&
3456           isARMLowRegister(Inst.getOperand(0).getReg()) &&
3457           isARMLowRegister(Inst.getOperand(1).getReg()))
3458    return Match_RequiresV6;
3459  return Match_Success;
3460}
3461
3462bool ARMAsmParser::
3463MatchAndEmitInstruction(SMLoc IDLoc,
3464                        SmallVectorImpl<MCParsedAsmOperand*> &Operands,
3465                        MCStreamer &Out) {
3466  MCInst Inst;
3467  unsigned ErrorInfo;
3468  unsigned MatchResult;
3469  MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo);
3470  switch (MatchResult) {
3471  default: break;
3472  case Match_Success:
3473    // Context sensitive operand constraints aren't handled by the matcher,
3474    // so check them here.
3475    if (validateInstruction(Inst, Operands))
3476      return true;
3477
3478    // Some instructions need post-processing to, for example, tweak which
3479    // encoding is selected.
3480    processInstruction(Inst, Operands);
3481
3482    Out.EmitInstruction(Inst);
3483    return false;
3484  case Match_MissingFeature:
3485    Error(IDLoc, "instruction requires a CPU feature not currently enabled");
3486    return true;
3487  case Match_InvalidOperand: {
3488    SMLoc ErrorLoc = IDLoc;
3489    if (ErrorInfo != ~0U) {
3490      if (ErrorInfo >= Operands.size())
3491        return Error(IDLoc, "too few operands for instruction");
3492
3493      ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc();
3494      if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
3495    }
3496
3497    return Error(ErrorLoc, "invalid operand for instruction");
3498  }
3499  case Match_MnemonicFail:
3500    return Error(IDLoc, "invalid instruction");
3501  case Match_ConversionFail:
3502    // The converter function will have already emited a diagnostic.
3503    return true;
3504  case Match_RequiresITBlock:
3505    return Error(IDLoc, "instruction only valid inside IT block");
3506  case Match_RequiresV6:
3507    return Error(IDLoc, "instruction variant requires ARMv6 or later");
3508  case Match_RequiresThumb2:
3509    return Error(IDLoc, "instruction variant requires Thumb2");
3510  }
3511
3512  llvm_unreachable("Implement any new match types added!");
3513  return true;
3514}
3515
3516/// parseDirective parses the arm specific directives
3517bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
3518  StringRef IDVal = DirectiveID.getIdentifier();
3519  if (IDVal == ".word")
3520    return parseDirectiveWord(4, DirectiveID.getLoc());
3521  else if (IDVal == ".thumb")
3522    return parseDirectiveThumb(DirectiveID.getLoc());
3523  else if (IDVal == ".thumb_func")
3524    return parseDirectiveThumbFunc(DirectiveID.getLoc());
3525  else if (IDVal == ".code")
3526    return parseDirectiveCode(DirectiveID.getLoc());
3527  else if (IDVal == ".syntax")
3528    return parseDirectiveSyntax(DirectiveID.getLoc());
3529  return true;
3530}
3531
3532/// parseDirectiveWord
3533///  ::= .word [ expression (, expression)* ]
3534bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
3535  if (getLexer().isNot(AsmToken::EndOfStatement)) {
3536    for (;;) {
3537      const MCExpr *Value;
3538      if (getParser().ParseExpression(Value))
3539        return true;
3540
3541      getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/);
3542
3543      if (getLexer().is(AsmToken::EndOfStatement))
3544        break;
3545
3546      // FIXME: Improve diagnostic.
3547      if (getLexer().isNot(AsmToken::Comma))
3548        return Error(L, "unexpected token in directive");
3549      Parser.Lex();
3550    }
3551  }
3552
3553  Parser.Lex();
3554  return false;
3555}
3556
3557/// parseDirectiveThumb
3558///  ::= .thumb
3559bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
3560  if (getLexer().isNot(AsmToken::EndOfStatement))
3561    return Error(L, "unexpected token in directive");
3562  Parser.Lex();
3563
3564  // TODO: set thumb mode
3565  // TODO: tell the MC streamer the mode
3566  // getParser().getStreamer().Emit???();
3567  return false;
3568}
3569
3570/// parseDirectiveThumbFunc
3571///  ::= .thumbfunc symbol_name
3572bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
3573  const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo();
3574  bool isMachO = MAI.hasSubsectionsViaSymbols();
3575  StringRef Name;
3576
3577  // Darwin asm has function name after .thumb_func direction
3578  // ELF doesn't
3579  if (isMachO) {
3580    const AsmToken &Tok = Parser.getTok();
3581    if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String))
3582      return Error(L, "unexpected token in .thumb_func directive");
3583    Name = Tok.getString();
3584    Parser.Lex(); // Consume the identifier token.
3585  }
3586
3587  if (getLexer().isNot(AsmToken::EndOfStatement))
3588    return Error(L, "unexpected token in directive");
3589  Parser.Lex();
3590
3591  // FIXME: assuming function name will be the line following .thumb_func
3592  if (!isMachO) {
3593    Name = Parser.getTok().getString();
3594  }
3595
3596  // Mark symbol as a thumb symbol.
3597  MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name);
3598  getParser().getStreamer().EmitThumbFunc(Func);
3599  return false;
3600}
3601
3602/// parseDirectiveSyntax
3603///  ::= .syntax unified | divided
3604bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) {
3605  const AsmToken &Tok = Parser.getTok();
3606  if (Tok.isNot(AsmToken::Identifier))
3607    return Error(L, "unexpected token in .syntax directive");
3608  StringRef Mode = Tok.getString();
3609  if (Mode == "unified" || Mode == "UNIFIED")
3610    Parser.Lex();
3611  else if (Mode == "divided" || Mode == "DIVIDED")
3612    return Error(L, "'.syntax divided' arm asssembly not supported");
3613  else
3614    return Error(L, "unrecognized syntax mode in .syntax directive");
3615
3616  if (getLexer().isNot(AsmToken::EndOfStatement))
3617    return Error(Parser.getTok().getLoc(), "unexpected token in directive");
3618  Parser.Lex();
3619
3620  // TODO tell the MC streamer the mode
3621  // getParser().getStreamer().Emit???();
3622  return false;
3623}
3624
3625/// parseDirectiveCode
3626///  ::= .code 16 | 32
3627bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
3628  const AsmToken &Tok = Parser.getTok();
3629  if (Tok.isNot(AsmToken::Integer))
3630    return Error(L, "unexpected token in .code directive");
3631  int64_t Val = Parser.getTok().getIntVal();
3632  if (Val == 16)
3633    Parser.Lex();
3634  else if (Val == 32)
3635    Parser.Lex();
3636  else
3637    return Error(L, "invalid operand to .code directive");
3638
3639  if (getLexer().isNot(AsmToken::EndOfStatement))
3640    return Error(Parser.getTok().getLoc(), "unexpected token in directive");
3641  Parser.Lex();
3642
3643  if (Val == 16) {
3644    if (!isThumb()) {
3645      SwitchMode();
3646      getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
3647    }
3648  } else {
3649    if (isThumb()) {
3650      SwitchMode();
3651      getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
3652    }
3653  }
3654
3655  return false;
3656}
3657
3658extern "C" void LLVMInitializeARMAsmLexer();
3659
3660/// Force static initialization.
3661extern "C" void LLVMInitializeARMAsmParser() {
3662  RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
3663  RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget);
3664  LLVMInitializeARMAsmLexer();
3665}
3666
3667#define GET_REGISTER_MATCHER
3668#define GET_MATCHER_IMPLEMENTATION
3669#include "ARMGenAsmMatcher.inc"
3670