ARMAsmParser.cpp revision 7aef99b677452724100145c81f76f32e494cc5a7
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/StringSwitch.h"
34#include "llvm/ADT/Twine.h"
35
36using namespace llvm;
37
38namespace {
39
40class ARMOperand;
41
42class ARMAsmParser : public MCTargetAsmParser {
43  MCSubtargetInfo &STI;
44  MCAsmParser &Parser;
45
46  struct {
47    ARMCC::CondCodes Cond;    // Condition for IT block.
48    unsigned Mask:4;          // Condition mask for instructions.
49                              // Starting at first 1 (from lsb).
50                              //   '1'  condition as indicated in IT.
51                              //   '0'  inverse of condition (else).
52                              // Count of instructions in IT block is
53                              // 4 - trailingzeroes(mask)
54
55    bool FirstCond;           // Explicit flag for when we're parsing the
56                              // First instruction in the IT block. It's
57                              // implied in the mask, so needs special
58                              // handling.
59
60    unsigned CurPosition;     // Current position in parsing of IT
61                              // block. In range [0,3]. Initialized
62                              // according to count of instructions in block.
63                              // ~0U if no active IT block.
64  } ITState;
65  bool inITBlock() { return ITState.CurPosition != ~0U;}
66  void forwardITPosition() {
67    if (!inITBlock()) return;
68    // Move to the next instruction in the IT block, if there is one. If not,
69    // mark the block as done.
70    unsigned TZ = CountTrailingZeros_32(ITState.Mask);
71    if (++ITState.CurPosition == 5 - TZ)
72      ITState.CurPosition = ~0U; // Done with the IT block after this.
73  }
74
75
76  MCAsmParser &getParser() const { return Parser; }
77  MCAsmLexer &getLexer() const { return Parser.getLexer(); }
78
79  void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
80  bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
81
82  int tryParseRegister();
83  bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &);
84  int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &);
85  bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &);
86  bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &);
87  bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic);
88  bool parsePrefix(ARMMCExpr::VariantKind &RefKind);
89  bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType,
90                              unsigned &ShiftAmount);
91  bool parseDirectiveWord(unsigned Size, SMLoc L);
92  bool parseDirectiveThumb(SMLoc L);
93  bool parseDirectiveThumbFunc(SMLoc L);
94  bool parseDirectiveCode(SMLoc L);
95  bool parseDirectiveSyntax(SMLoc L);
96
97  StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
98                          bool &CarrySetting, unsigned &ProcessorIMod,
99                          StringRef &ITMask);
100  void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
101                             bool &CanAcceptPredicationCode);
102
103  bool isThumb() const {
104    // FIXME: Can tablegen auto-generate this?
105    return (STI.getFeatureBits() & ARM::ModeThumb) != 0;
106  }
107  bool isThumbOne() const {
108    return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0;
109  }
110  bool isThumbTwo() const {
111    return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2);
112  }
113  bool hasV6Ops() const {
114    return STI.getFeatureBits() & ARM::HasV6Ops;
115  }
116  bool hasV7Ops() const {
117    return STI.getFeatureBits() & ARM::HasV7Ops;
118  }
119  void SwitchMode() {
120    unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb));
121    setAvailableFeatures(FB);
122  }
123  bool isMClass() const {
124    return STI.getFeatureBits() & ARM::FeatureMClass;
125  }
126
127  /// @name Auto-generated Match Functions
128  /// {
129
130#define GET_ASSEMBLER_HEADER
131#include "ARMGenAsmMatcher.inc"
132
133  /// }
134
135  OperandMatchResultTy parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*>&);
136  OperandMatchResultTy parseCoprocNumOperand(
137    SmallVectorImpl<MCParsedAsmOperand*>&);
138  OperandMatchResultTy parseCoprocRegOperand(
139    SmallVectorImpl<MCParsedAsmOperand*>&);
140  OperandMatchResultTy parseCoprocOptionOperand(
141    SmallVectorImpl<MCParsedAsmOperand*>&);
142  OperandMatchResultTy parseMemBarrierOptOperand(
143    SmallVectorImpl<MCParsedAsmOperand*>&);
144  OperandMatchResultTy parseProcIFlagsOperand(
145    SmallVectorImpl<MCParsedAsmOperand*>&);
146  OperandMatchResultTy parseMSRMaskOperand(
147    SmallVectorImpl<MCParsedAsmOperand*>&);
148  OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O,
149                                   StringRef Op, int Low, int High);
150  OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
151    return parsePKHImm(O, "lsl", 0, 31);
152  }
153  OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
154    return parsePKHImm(O, "asr", 1, 32);
155  }
156  OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&);
157  OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&);
158  OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&);
159  OperandMatchResultTy parseBitfield(SmallVectorImpl<MCParsedAsmOperand*>&);
160  OperandMatchResultTy parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*>&);
161  OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&);
162  OperandMatchResultTy parseFPImm(SmallVectorImpl<MCParsedAsmOperand*>&);
163  OperandMatchResultTy parseVectorList(SmallVectorImpl<MCParsedAsmOperand*>&);
164
165  // Asm Match Converter Methods
166  bool cvtT2LdrdPre(MCInst &Inst, unsigned Opcode,
167                    const SmallVectorImpl<MCParsedAsmOperand*> &);
168  bool cvtT2StrdPre(MCInst &Inst, unsigned Opcode,
169                    const SmallVectorImpl<MCParsedAsmOperand*> &);
170  bool cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
171                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
172  bool cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
173                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
174  bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
175                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
176  bool cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
177                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
178  bool cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
179                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
180  bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
181                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
182  bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
183                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
184  bool cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
185                             const SmallVectorImpl<MCParsedAsmOperand*> &);
186  bool cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
187                             const SmallVectorImpl<MCParsedAsmOperand*> &);
188  bool cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
189                             const SmallVectorImpl<MCParsedAsmOperand*> &);
190  bool cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
191                             const SmallVectorImpl<MCParsedAsmOperand*> &);
192  bool cvtLdrdPre(MCInst &Inst, unsigned Opcode,
193                  const SmallVectorImpl<MCParsedAsmOperand*> &);
194  bool cvtStrdPre(MCInst &Inst, unsigned Opcode,
195                  const SmallVectorImpl<MCParsedAsmOperand*> &);
196  bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
197                                  const SmallVectorImpl<MCParsedAsmOperand*> &);
198  bool cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
199                        const SmallVectorImpl<MCParsedAsmOperand*> &);
200  bool cvtVLDwbFixed(MCInst &Inst, unsigned Opcode,
201                     const SmallVectorImpl<MCParsedAsmOperand*> &);
202  bool cvtVLDwbRegister(MCInst &Inst, unsigned Opcode,
203                        const SmallVectorImpl<MCParsedAsmOperand*> &);
204  bool cvtVSTwbFixed(MCInst &Inst, unsigned Opcode,
205                     const SmallVectorImpl<MCParsedAsmOperand*> &);
206  bool cvtVSTwbRegister(MCInst &Inst, unsigned Opcode,
207                        const SmallVectorImpl<MCParsedAsmOperand*> &);
208
209  bool validateInstruction(MCInst &Inst,
210                           const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
211  bool processInstruction(MCInst &Inst,
212                          const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
213  bool shouldOmitCCOutOperand(StringRef Mnemonic,
214                              SmallVectorImpl<MCParsedAsmOperand*> &Operands);
215
216public:
217  enum ARMMatchResultTy {
218    Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY,
219    Match_RequiresNotITBlock,
220    Match_RequiresV6,
221    Match_RequiresThumb2
222  };
223
224  ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
225    : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
226    MCAsmParserExtension::Initialize(_Parser);
227
228    // Initialize the set of available features.
229    setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
230
231    // Not in an ITBlock to start with.
232    ITState.CurPosition = ~0U;
233  }
234
235  // Implementation of the MCTargetAsmParser interface:
236  bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
237  bool ParseInstruction(StringRef Name, SMLoc NameLoc,
238                        SmallVectorImpl<MCParsedAsmOperand*> &Operands);
239  bool ParseDirective(AsmToken DirectiveID);
240
241  unsigned checkTargetMatchPredicate(MCInst &Inst);
242
243  bool MatchAndEmitInstruction(SMLoc IDLoc,
244                               SmallVectorImpl<MCParsedAsmOperand*> &Operands,
245                               MCStreamer &Out);
246};
247} // end anonymous namespace
248
249namespace {
250
251/// ARMOperand - Instances of this class represent a parsed ARM machine
252/// instruction.
253class ARMOperand : public MCParsedAsmOperand {
254  enum KindTy {
255    k_CondCode,
256    k_CCOut,
257    k_ITCondMask,
258    k_CoprocNum,
259    k_CoprocReg,
260    k_CoprocOption,
261    k_Immediate,
262    k_FPImmediate,
263    k_MemBarrierOpt,
264    k_Memory,
265    k_PostIndexRegister,
266    k_MSRMask,
267    k_ProcIFlags,
268    k_VectorIndex,
269    k_Register,
270    k_RegisterList,
271    k_DPRRegisterList,
272    k_SPRRegisterList,
273    k_VectorList,
274    k_ShiftedRegister,
275    k_ShiftedImmediate,
276    k_ShifterImmediate,
277    k_RotateImmediate,
278    k_BitfieldDescriptor,
279    k_Token
280  } Kind;
281
282  SMLoc StartLoc, EndLoc;
283  SmallVector<unsigned, 8> Registers;
284
285  union {
286    struct {
287      ARMCC::CondCodes Val;
288    } CC;
289
290    struct {
291      unsigned Val;
292    } Cop;
293
294    struct {
295      unsigned Val;
296    } CoprocOption;
297
298    struct {
299      unsigned Mask:4;
300    } ITMask;
301
302    struct {
303      ARM_MB::MemBOpt Val;
304    } MBOpt;
305
306    struct {
307      ARM_PROC::IFlags Val;
308    } IFlags;
309
310    struct {
311      unsigned Val;
312    } MMask;
313
314    struct {
315      const char *Data;
316      unsigned Length;
317    } Tok;
318
319    struct {
320      unsigned RegNum;
321    } Reg;
322
323    // A vector register list is a sequential list of 1 to 4 registers.
324    struct {
325      unsigned RegNum;
326      unsigned Count;
327    } VectorList;
328
329    struct {
330      unsigned Val;
331    } VectorIndex;
332
333    struct {
334      const MCExpr *Val;
335    } Imm;
336
337    struct {
338      unsigned Val;       // encoded 8-bit representation
339    } FPImm;
340
341    /// Combined record for all forms of ARM address expressions.
342    struct {
343      unsigned BaseRegNum;
344      // Offset is in OffsetReg or OffsetImm. If both are zero, no offset
345      // was specified.
346      const MCConstantExpr *OffsetImm;  // Offset immediate value
347      unsigned OffsetRegNum;    // Offset register num, when OffsetImm == NULL
348      ARM_AM::ShiftOpc ShiftType; // Shift type for OffsetReg
349      unsigned ShiftImm;        // shift for OffsetReg.
350      unsigned Alignment;       // 0 = no alignment specified
351                                // n = alignment in bytes (8, 16, or 32)
352      unsigned isNegative : 1;  // Negated OffsetReg? (~'U' bit)
353    } Memory;
354
355    struct {
356      unsigned RegNum;
357      bool isAdd;
358      ARM_AM::ShiftOpc ShiftTy;
359      unsigned ShiftImm;
360    } PostIdxReg;
361
362    struct {
363      bool isASR;
364      unsigned Imm;
365    } ShifterImm;
366    struct {
367      ARM_AM::ShiftOpc ShiftTy;
368      unsigned SrcReg;
369      unsigned ShiftReg;
370      unsigned ShiftImm;
371    } RegShiftedReg;
372    struct {
373      ARM_AM::ShiftOpc ShiftTy;
374      unsigned SrcReg;
375      unsigned ShiftImm;
376    } RegShiftedImm;
377    struct {
378      unsigned Imm;
379    } RotImm;
380    struct {
381      unsigned LSB;
382      unsigned Width;
383    } Bitfield;
384  };
385
386  ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
387public:
388  ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() {
389    Kind = o.Kind;
390    StartLoc = o.StartLoc;
391    EndLoc = o.EndLoc;
392    switch (Kind) {
393    case k_CondCode:
394      CC = o.CC;
395      break;
396    case k_ITCondMask:
397      ITMask = o.ITMask;
398      break;
399    case k_Token:
400      Tok = o.Tok;
401      break;
402    case k_CCOut:
403    case k_Register:
404      Reg = o.Reg;
405      break;
406    case k_RegisterList:
407    case k_DPRRegisterList:
408    case k_SPRRegisterList:
409      Registers = o.Registers;
410      break;
411    case k_VectorList:
412      VectorList = o.VectorList;
413      break;
414    case k_CoprocNum:
415    case k_CoprocReg:
416      Cop = o.Cop;
417      break;
418    case k_CoprocOption:
419      CoprocOption = o.CoprocOption;
420      break;
421    case k_Immediate:
422      Imm = o.Imm;
423      break;
424    case k_FPImmediate:
425      FPImm = o.FPImm;
426      break;
427    case k_MemBarrierOpt:
428      MBOpt = o.MBOpt;
429      break;
430    case k_Memory:
431      Memory = o.Memory;
432      break;
433    case k_PostIndexRegister:
434      PostIdxReg = o.PostIdxReg;
435      break;
436    case k_MSRMask:
437      MMask = o.MMask;
438      break;
439    case k_ProcIFlags:
440      IFlags = o.IFlags;
441      break;
442    case k_ShifterImmediate:
443      ShifterImm = o.ShifterImm;
444      break;
445    case k_ShiftedRegister:
446      RegShiftedReg = o.RegShiftedReg;
447      break;
448    case k_ShiftedImmediate:
449      RegShiftedImm = o.RegShiftedImm;
450      break;
451    case k_RotateImmediate:
452      RotImm = o.RotImm;
453      break;
454    case k_BitfieldDescriptor:
455      Bitfield = o.Bitfield;
456      break;
457    case k_VectorIndex:
458      VectorIndex = o.VectorIndex;
459      break;
460    }
461  }
462
463  /// getStartLoc - Get the location of the first token of this operand.
464  SMLoc getStartLoc() const { return StartLoc; }
465  /// getEndLoc - Get the location of the last token of this operand.
466  SMLoc getEndLoc() const { return EndLoc; }
467
468  ARMCC::CondCodes getCondCode() const {
469    assert(Kind == k_CondCode && "Invalid access!");
470    return CC.Val;
471  }
472
473  unsigned getCoproc() const {
474    assert((Kind == k_CoprocNum || Kind == k_CoprocReg) && "Invalid access!");
475    return Cop.Val;
476  }
477
478  StringRef getToken() const {
479    assert(Kind == k_Token && "Invalid access!");
480    return StringRef(Tok.Data, Tok.Length);
481  }
482
483  unsigned getReg() const {
484    assert((Kind == k_Register || Kind == k_CCOut) && "Invalid access!");
485    return Reg.RegNum;
486  }
487
488  const SmallVectorImpl<unsigned> &getRegList() const {
489    assert((Kind == k_RegisterList || Kind == k_DPRRegisterList ||
490            Kind == k_SPRRegisterList) && "Invalid access!");
491    return Registers;
492  }
493
494  const MCExpr *getImm() const {
495    assert(Kind == k_Immediate && "Invalid access!");
496    return Imm.Val;
497  }
498
499  unsigned getFPImm() const {
500    assert(Kind == k_FPImmediate && "Invalid access!");
501    return FPImm.Val;
502  }
503
504  unsigned getVectorIndex() const {
505    assert(Kind == k_VectorIndex && "Invalid access!");
506    return VectorIndex.Val;
507  }
508
509  ARM_MB::MemBOpt getMemBarrierOpt() const {
510    assert(Kind == k_MemBarrierOpt && "Invalid access!");
511    return MBOpt.Val;
512  }
513
514  ARM_PROC::IFlags getProcIFlags() const {
515    assert(Kind == k_ProcIFlags && "Invalid access!");
516    return IFlags.Val;
517  }
518
519  unsigned getMSRMask() const {
520    assert(Kind == k_MSRMask && "Invalid access!");
521    return MMask.Val;
522  }
523
524  bool isCoprocNum() const { return Kind == k_CoprocNum; }
525  bool isCoprocReg() const { return Kind == k_CoprocReg; }
526  bool isCoprocOption() const { return Kind == k_CoprocOption; }
527  bool isCondCode() const { return Kind == k_CondCode; }
528  bool isCCOut() const { return Kind == k_CCOut; }
529  bool isITMask() const { return Kind == k_ITCondMask; }
530  bool isITCondCode() const { return Kind == k_CondCode; }
531  bool isImm() const { return Kind == k_Immediate; }
532  bool isFPImm() const { return Kind == k_FPImmediate; }
533  bool isImm8s4() const {
534    if (Kind != k_Immediate)
535      return false;
536    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
537    if (!CE) return false;
538    int64_t Value = CE->getValue();
539    return ((Value & 3) == 0) && Value >= -1020 && Value <= 1020;
540  }
541  bool isImm0_1020s4() const {
542    if (Kind != k_Immediate)
543      return false;
544    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
545    if (!CE) return false;
546    int64_t Value = CE->getValue();
547    return ((Value & 3) == 0) && Value >= 0 && Value <= 1020;
548  }
549  bool isImm0_508s4() const {
550    if (Kind != k_Immediate)
551      return false;
552    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
553    if (!CE) return false;
554    int64_t Value = CE->getValue();
555    return ((Value & 3) == 0) && Value >= 0 && Value <= 508;
556  }
557  bool isImm0_255() const {
558    if (Kind != k_Immediate)
559      return false;
560    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
561    if (!CE) return false;
562    int64_t Value = CE->getValue();
563    return Value >= 0 && Value < 256;
564  }
565  bool isImm0_7() const {
566    if (Kind != k_Immediate)
567      return false;
568    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
569    if (!CE) return false;
570    int64_t Value = CE->getValue();
571    return Value >= 0 && Value < 8;
572  }
573  bool isImm0_15() const {
574    if (Kind != k_Immediate)
575      return false;
576    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
577    if (!CE) return false;
578    int64_t Value = CE->getValue();
579    return Value >= 0 && Value < 16;
580  }
581  bool isImm0_31() const {
582    if (Kind != k_Immediate)
583      return false;
584    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
585    if (!CE) return false;
586    int64_t Value = CE->getValue();
587    return Value >= 0 && Value < 32;
588  }
589  bool isImm1_16() const {
590    if (Kind != k_Immediate)
591      return false;
592    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
593    if (!CE) return false;
594    int64_t Value = CE->getValue();
595    return Value > 0 && Value < 17;
596  }
597  bool isImm1_32() const {
598    if (Kind != k_Immediate)
599      return false;
600    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
601    if (!CE) return false;
602    int64_t Value = CE->getValue();
603    return Value > 0 && Value < 33;
604  }
605  bool isImm0_32() const {
606    if (Kind != k_Immediate)
607      return false;
608    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
609    if (!CE) return false;
610    int64_t Value = CE->getValue();
611    return Value >= 0 && Value < 33;
612  }
613  bool isImm0_65535() const {
614    if (Kind != k_Immediate)
615      return false;
616    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
617    if (!CE) return false;
618    int64_t Value = CE->getValue();
619    return Value >= 0 && Value < 65536;
620  }
621  bool isImm0_65535Expr() const {
622    if (Kind != k_Immediate)
623      return false;
624    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
625    // If it's not a constant expression, it'll generate a fixup and be
626    // handled later.
627    if (!CE) return true;
628    int64_t Value = CE->getValue();
629    return Value >= 0 && Value < 65536;
630  }
631  bool isImm24bit() const {
632    if (Kind != k_Immediate)
633      return false;
634    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
635    if (!CE) return false;
636    int64_t Value = CE->getValue();
637    return Value >= 0 && Value <= 0xffffff;
638  }
639  bool isImmThumbSR() const {
640    if (Kind != k_Immediate)
641      return false;
642    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
643    if (!CE) return false;
644    int64_t Value = CE->getValue();
645    return Value > 0 && Value < 33;
646  }
647  bool isPKHLSLImm() const {
648    if (Kind != k_Immediate)
649      return false;
650    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
651    if (!CE) return false;
652    int64_t Value = CE->getValue();
653    return Value >= 0 && Value < 32;
654  }
655  bool isPKHASRImm() const {
656    if (Kind != k_Immediate)
657      return false;
658    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
659    if (!CE) return false;
660    int64_t Value = CE->getValue();
661    return Value > 0 && Value <= 32;
662  }
663  bool isARMSOImm() const {
664    if (Kind != k_Immediate)
665      return false;
666    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
667    if (!CE) return false;
668    int64_t Value = CE->getValue();
669    return ARM_AM::getSOImmVal(Value) != -1;
670  }
671  bool isARMSOImmNot() const {
672    if (Kind != k_Immediate)
673      return false;
674    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
675    if (!CE) return false;
676    int64_t Value = CE->getValue();
677    return ARM_AM::getSOImmVal(~Value) != -1;
678  }
679  bool isT2SOImm() const {
680    if (Kind != k_Immediate)
681      return false;
682    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
683    if (!CE) return false;
684    int64_t Value = CE->getValue();
685    return ARM_AM::getT2SOImmVal(Value) != -1;
686  }
687  bool isT2SOImmNot() const {
688    if (Kind != k_Immediate)
689      return false;
690    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
691    if (!CE) return false;
692    int64_t Value = CE->getValue();
693    return ARM_AM::getT2SOImmVal(~Value) != -1;
694  }
695  bool isSetEndImm() const {
696    if (Kind != k_Immediate)
697      return false;
698    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
699    if (!CE) return false;
700    int64_t Value = CE->getValue();
701    return Value == 1 || Value == 0;
702  }
703  bool isReg() const { return Kind == k_Register; }
704  bool isRegList() const { return Kind == k_RegisterList; }
705  bool isDPRRegList() const { return Kind == k_DPRRegisterList; }
706  bool isSPRRegList() const { return Kind == k_SPRRegisterList; }
707  bool isToken() const { return Kind == k_Token; }
708  bool isMemBarrierOpt() const { return Kind == k_MemBarrierOpt; }
709  bool isMemory() const { return Kind == k_Memory; }
710  bool isShifterImm() const { return Kind == k_ShifterImmediate; }
711  bool isRegShiftedReg() const { return Kind == k_ShiftedRegister; }
712  bool isRegShiftedImm() const { return Kind == k_ShiftedImmediate; }
713  bool isRotImm() const { return Kind == k_RotateImmediate; }
714  bool isBitfield() const { return Kind == k_BitfieldDescriptor; }
715  bool isPostIdxRegShifted() const { return Kind == k_PostIndexRegister; }
716  bool isPostIdxReg() const {
717    return Kind == k_PostIndexRegister && PostIdxReg.ShiftTy == ARM_AM::no_shift;
718  }
719  bool isMemNoOffset(bool alignOK = false) const {
720    if (!isMemory())
721      return false;
722    // No offset of any kind.
723    return Memory.OffsetRegNum == 0 && Memory.OffsetImm == 0 &&
724     (alignOK || Memory.Alignment == 0);
725  }
726  bool isAlignedMemory() const {
727    return isMemNoOffset(true);
728  }
729  bool isAddrMode2() const {
730    if (!isMemory() || Memory.Alignment != 0) return false;
731    // Check for register offset.
732    if (Memory.OffsetRegNum) return true;
733    // Immediate offset in range [-4095, 4095].
734    if (!Memory.OffsetImm) return true;
735    int64_t Val = Memory.OffsetImm->getValue();
736    return Val > -4096 && Val < 4096;
737  }
738  bool isAM2OffsetImm() const {
739    if (Kind != k_Immediate)
740      return false;
741    // Immediate offset in range [-4095, 4095].
742    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
743    if (!CE) return false;
744    int64_t Val = CE->getValue();
745    return Val > -4096 && Val < 4096;
746  }
747  bool isAddrMode3() const {
748    if (!isMemory() || Memory.Alignment != 0) return false;
749    // No shifts are legal for AM3.
750    if (Memory.ShiftType != ARM_AM::no_shift) return false;
751    // Check for register offset.
752    if (Memory.OffsetRegNum) return true;
753    // Immediate offset in range [-255, 255].
754    if (!Memory.OffsetImm) return true;
755    int64_t Val = Memory.OffsetImm->getValue();
756    return Val > -256 && Val < 256;
757  }
758  bool isAM3Offset() const {
759    if (Kind != k_Immediate && Kind != k_PostIndexRegister)
760      return false;
761    if (Kind == k_PostIndexRegister)
762      return PostIdxReg.ShiftTy == ARM_AM::no_shift;
763    // Immediate offset in range [-255, 255].
764    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
765    if (!CE) return false;
766    int64_t Val = CE->getValue();
767    // Special case, #-0 is INT32_MIN.
768    return (Val > -256 && Val < 256) || Val == INT32_MIN;
769  }
770  bool isAddrMode5() const {
771    // If we have an immediate that's not a constant, treat it as a label
772    // reference needing a fixup. If it is a constant, it's something else
773    // and we reject it.
774    if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm()))
775      return true;
776    if (!isMemory() || Memory.Alignment != 0) return false;
777    // Check for register offset.
778    if (Memory.OffsetRegNum) return false;
779    // Immediate offset in range [-1020, 1020] and a multiple of 4.
780    if (!Memory.OffsetImm) return true;
781    int64_t Val = Memory.OffsetImm->getValue();
782    return (Val >= -1020 && Val <= 1020 && ((Val & 3) == 0)) ||
783      Val == INT32_MIN;
784  }
785  bool isMemTBB() const {
786    if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
787        Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0)
788      return false;
789    return true;
790  }
791  bool isMemTBH() const {
792    if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
793        Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm != 1 ||
794        Memory.Alignment != 0 )
795      return false;
796    return true;
797  }
798  bool isMemRegOffset() const {
799    if (!isMemory() || !Memory.OffsetRegNum || Memory.Alignment != 0)
800      return false;
801    return true;
802  }
803  bool isT2MemRegOffset() const {
804    if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
805        Memory.Alignment != 0)
806      return false;
807    // Only lsl #{0, 1, 2, 3} allowed.
808    if (Memory.ShiftType == ARM_AM::no_shift)
809      return true;
810    if (Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm > 3)
811      return false;
812    return true;
813  }
814  bool isMemThumbRR() const {
815    // Thumb reg+reg addressing is simple. Just two registers, a base and
816    // an offset. No shifts, negations or any other complicating factors.
817    if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
818        Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0)
819      return false;
820    return isARMLowRegister(Memory.BaseRegNum) &&
821      (!Memory.OffsetRegNum || isARMLowRegister(Memory.OffsetRegNum));
822  }
823  bool isMemThumbRIs4() const {
824    if (!isMemory() || Memory.OffsetRegNum != 0 ||
825        !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
826      return false;
827    // Immediate offset, multiple of 4 in range [0, 124].
828    if (!Memory.OffsetImm) return true;
829    int64_t Val = Memory.OffsetImm->getValue();
830    return Val >= 0 && Val <= 124 && (Val % 4) == 0;
831  }
832  bool isMemThumbRIs2() const {
833    if (!isMemory() || Memory.OffsetRegNum != 0 ||
834        !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
835      return false;
836    // Immediate offset, multiple of 4 in range [0, 62].
837    if (!Memory.OffsetImm) return true;
838    int64_t Val = Memory.OffsetImm->getValue();
839    return Val >= 0 && Val <= 62 && (Val % 2) == 0;
840  }
841  bool isMemThumbRIs1() const {
842    if (!isMemory() || Memory.OffsetRegNum != 0 ||
843        !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
844      return false;
845    // Immediate offset in range [0, 31].
846    if (!Memory.OffsetImm) return true;
847    int64_t Val = Memory.OffsetImm->getValue();
848    return Val >= 0 && Val <= 31;
849  }
850  bool isMemThumbSPI() const {
851    if (!isMemory() || Memory.OffsetRegNum != 0 ||
852        Memory.BaseRegNum != ARM::SP || Memory.Alignment != 0)
853      return false;
854    // Immediate offset, multiple of 4 in range [0, 1020].
855    if (!Memory.OffsetImm) return true;
856    int64_t Val = Memory.OffsetImm->getValue();
857    return Val >= 0 && Val <= 1020 && (Val % 4) == 0;
858  }
859  bool isMemImm8s4Offset() const {
860    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
861      return false;
862    // Immediate offset a multiple of 4 in range [-1020, 1020].
863    if (!Memory.OffsetImm) return true;
864    int64_t Val = Memory.OffsetImm->getValue();
865    return Val >= -1020 && Val <= 1020 && (Val & 3) == 0;
866  }
867  bool isMemImm0_1020s4Offset() const {
868    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
869      return false;
870    // Immediate offset a multiple of 4 in range [0, 1020].
871    if (!Memory.OffsetImm) return true;
872    int64_t Val = Memory.OffsetImm->getValue();
873    return Val >= 0 && Val <= 1020 && (Val & 3) == 0;
874  }
875  bool isMemImm8Offset() const {
876    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
877      return false;
878    // Immediate offset in range [-255, 255].
879    if (!Memory.OffsetImm) return true;
880    int64_t Val = Memory.OffsetImm->getValue();
881    return (Val == INT32_MIN) || (Val > -256 && Val < 256);
882  }
883  bool isMemPosImm8Offset() const {
884    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
885      return false;
886    // Immediate offset in range [0, 255].
887    if (!Memory.OffsetImm) return true;
888    int64_t Val = Memory.OffsetImm->getValue();
889    return Val >= 0 && Val < 256;
890  }
891  bool isMemNegImm8Offset() const {
892    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
893      return false;
894    // Immediate offset in range [-255, -1].
895    if (!Memory.OffsetImm) return true;
896    int64_t Val = Memory.OffsetImm->getValue();
897    return Val > -256 && Val < 0;
898  }
899  bool isMemUImm12Offset() const {
900    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
901      return false;
902    // Immediate offset in range [0, 4095].
903    if (!Memory.OffsetImm) return true;
904    int64_t Val = Memory.OffsetImm->getValue();
905    return (Val >= 0 && Val < 4096);
906  }
907  bool isMemImm12Offset() const {
908    // If we have an immediate that's not a constant, treat it as a label
909    // reference needing a fixup. If it is a constant, it's something else
910    // and we reject it.
911    if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm()))
912      return true;
913
914    if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
915      return false;
916    // Immediate offset in range [-4095, 4095].
917    if (!Memory.OffsetImm) return true;
918    int64_t Val = Memory.OffsetImm->getValue();
919    return (Val > -4096 && Val < 4096) || (Val == INT32_MIN);
920  }
921  bool isPostIdxImm8() const {
922    if (Kind != k_Immediate)
923      return false;
924    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
925    if (!CE) return false;
926    int64_t Val = CE->getValue();
927    return (Val > -256 && Val < 256) || (Val == INT32_MIN);
928  }
929  bool isPostIdxImm8s4() const {
930    if (Kind != k_Immediate)
931      return false;
932    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
933    if (!CE) return false;
934    int64_t Val = CE->getValue();
935    return ((Val & 3) == 0 && Val >= -1020 && Val <= 1020) ||
936      (Val == INT32_MIN);
937  }
938
939  bool isMSRMask() const { return Kind == k_MSRMask; }
940  bool isProcIFlags() const { return Kind == k_ProcIFlags; }
941
942  // NEON operands.
943  bool isVecListOneD() const {
944    if (Kind != k_VectorList) return false;
945    return VectorList.Count == 1;
946  }
947
948  bool isVecListTwoD() const {
949    if (Kind != k_VectorList) return false;
950    return VectorList.Count == 2;
951  }
952
953  bool isVecListThreeD() const {
954    if (Kind != k_VectorList) return false;
955    return VectorList.Count == 3;
956  }
957
958  bool isVecListFourD() const {
959    if (Kind != k_VectorList) return false;
960    return VectorList.Count == 4;
961  }
962
963  bool isVecListTwoQ() const {
964    if (Kind != k_VectorList) return false;
965    //FIXME: We haven't taught the parser to handle by-two register lists
966    // yet, so don't pretend to know one.
967    return VectorList.Count == 2 && false;
968  }
969
970  bool isVectorIndex8() const {
971    if (Kind != k_VectorIndex) return false;
972    return VectorIndex.Val < 8;
973  }
974  bool isVectorIndex16() const {
975    if (Kind != k_VectorIndex) return false;
976    return VectorIndex.Val < 4;
977  }
978  bool isVectorIndex32() const {
979    if (Kind != k_VectorIndex) return false;
980    return VectorIndex.Val < 2;
981  }
982
983  bool isNEONi8splat() const {
984    if (Kind != k_Immediate)
985      return false;
986    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
987    // Must be a constant.
988    if (!CE) return false;
989    int64_t Value = CE->getValue();
990    // i8 value splatted across 8 bytes. The immediate is just the 8 byte
991    // value.
992    return Value >= 0 && Value < 256;
993  }
994
995  bool isNEONi16splat() const {
996    if (Kind != k_Immediate)
997      return false;
998    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
999    // Must be a constant.
1000    if (!CE) return false;
1001    int64_t Value = CE->getValue();
1002    // i16 value in the range [0,255] or [0x0100, 0xff00]
1003    return (Value >= 0 && Value < 256) || (Value >= 0x0100 && Value <= 0xff00);
1004  }
1005
1006  bool isNEONi32splat() const {
1007    if (Kind != k_Immediate)
1008      return false;
1009    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1010    // Must be a constant.
1011    if (!CE) return false;
1012    int64_t Value = CE->getValue();
1013    // i32 value with set bits only in one byte X000, 0X00, 00X0, or 000X.
1014    return (Value >= 0 && Value < 256) ||
1015      (Value >= 0x0100 && Value <= 0xff00) ||
1016      (Value >= 0x010000 && Value <= 0xff0000) ||
1017      (Value >= 0x01000000 && Value <= 0xff000000);
1018  }
1019
1020  bool isNEONi32vmov() const {
1021    if (Kind != k_Immediate)
1022      return false;
1023    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1024    // Must be a constant.
1025    if (!CE) return false;
1026    int64_t Value = CE->getValue();
1027    // i32 value with set bits only in one byte X000, 0X00, 00X0, or 000X,
1028    // for VMOV/VMVN only, 00Xf or 0Xff are also accepted.
1029    return (Value >= 0 && Value < 256) ||
1030      (Value >= 0x0100 && Value <= 0xff00) ||
1031      (Value >= 0x010000 && Value <= 0xff0000) ||
1032      (Value >= 0x01000000 && Value <= 0xff000000) ||
1033      (Value >= 0x01ff && Value <= 0xffff && (Value & 0xff) == 0xff) ||
1034      (Value >= 0x01ffff && Value <= 0xffffff && (Value & 0xffff) == 0xffff);
1035  }
1036
1037  bool isNEONi64splat() const {
1038    if (Kind != k_Immediate)
1039      return false;
1040    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1041    // Must be a constant.
1042    if (!CE) return false;
1043    uint64_t Value = CE->getValue();
1044    // i64 value with each byte being either 0 or 0xff.
1045    for (unsigned i = 0; i < 8; ++i)
1046      if ((Value & 0xff) != 0 && (Value & 0xff) != 0xff) return false;
1047    return true;
1048  }
1049
1050  void addExpr(MCInst &Inst, const MCExpr *Expr) const {
1051    // Add as immediates when possible.  Null MCExpr = 0.
1052    if (Expr == 0)
1053      Inst.addOperand(MCOperand::CreateImm(0));
1054    else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
1055      Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
1056    else
1057      Inst.addOperand(MCOperand::CreateExpr(Expr));
1058  }
1059
1060  void addCondCodeOperands(MCInst &Inst, unsigned N) const {
1061    assert(N == 2 && "Invalid number of operands!");
1062    Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
1063    unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR;
1064    Inst.addOperand(MCOperand::CreateReg(RegNum));
1065  }
1066
1067  void addCoprocNumOperands(MCInst &Inst, unsigned N) const {
1068    assert(N == 1 && "Invalid number of operands!");
1069    Inst.addOperand(MCOperand::CreateImm(getCoproc()));
1070  }
1071
1072  void addCoprocRegOperands(MCInst &Inst, unsigned N) const {
1073    assert(N == 1 && "Invalid number of operands!");
1074    Inst.addOperand(MCOperand::CreateImm(getCoproc()));
1075  }
1076
1077  void addCoprocOptionOperands(MCInst &Inst, unsigned N) const {
1078    assert(N == 1 && "Invalid number of operands!");
1079    Inst.addOperand(MCOperand::CreateImm(CoprocOption.Val));
1080  }
1081
1082  void addITMaskOperands(MCInst &Inst, unsigned N) const {
1083    assert(N == 1 && "Invalid number of operands!");
1084    Inst.addOperand(MCOperand::CreateImm(ITMask.Mask));
1085  }
1086
1087  void addITCondCodeOperands(MCInst &Inst, unsigned N) const {
1088    assert(N == 1 && "Invalid number of operands!");
1089    Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
1090  }
1091
1092  void addCCOutOperands(MCInst &Inst, unsigned N) const {
1093    assert(N == 1 && "Invalid number of operands!");
1094    Inst.addOperand(MCOperand::CreateReg(getReg()));
1095  }
1096
1097  void addRegOperands(MCInst &Inst, unsigned N) const {
1098    assert(N == 1 && "Invalid number of operands!");
1099    Inst.addOperand(MCOperand::CreateReg(getReg()));
1100  }
1101
1102  void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const {
1103    assert(N == 3 && "Invalid number of operands!");
1104    assert(isRegShiftedReg() && "addRegShiftedRegOperands() on non RegShiftedReg!");
1105    Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg));
1106    Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg));
1107    Inst.addOperand(MCOperand::CreateImm(
1108      ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm)));
1109  }
1110
1111  void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const {
1112    assert(N == 2 && "Invalid number of operands!");
1113    assert(isRegShiftedImm() && "addRegShiftedImmOperands() on non RegShiftedImm!");
1114    Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg));
1115    Inst.addOperand(MCOperand::CreateImm(
1116      ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm)));
1117  }
1118
1119  void addShifterImmOperands(MCInst &Inst, unsigned N) const {
1120    assert(N == 1 && "Invalid number of operands!");
1121    Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) |
1122                                         ShifterImm.Imm));
1123  }
1124
1125  void addRegListOperands(MCInst &Inst, unsigned N) const {
1126    assert(N == 1 && "Invalid number of operands!");
1127    const SmallVectorImpl<unsigned> &RegList = getRegList();
1128    for (SmallVectorImpl<unsigned>::const_iterator
1129           I = RegList.begin(), E = RegList.end(); I != E; ++I)
1130      Inst.addOperand(MCOperand::CreateReg(*I));
1131  }
1132
1133  void addDPRRegListOperands(MCInst &Inst, unsigned N) const {
1134    addRegListOperands(Inst, N);
1135  }
1136
1137  void addSPRRegListOperands(MCInst &Inst, unsigned N) const {
1138    addRegListOperands(Inst, N);
1139  }
1140
1141  void addRotImmOperands(MCInst &Inst, unsigned N) const {
1142    assert(N == 1 && "Invalid number of operands!");
1143    // Encoded as val>>3. The printer handles display as 8, 16, 24.
1144    Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3));
1145  }
1146
1147  void addBitfieldOperands(MCInst &Inst, unsigned N) const {
1148    assert(N == 1 && "Invalid number of operands!");
1149    // Munge the lsb/width into a bitfield mask.
1150    unsigned lsb = Bitfield.LSB;
1151    unsigned width = Bitfield.Width;
1152    // Make a 32-bit mask w/ the referenced bits clear and all other bits set.
1153    uint32_t Mask = ~(((uint32_t)0xffffffff >> lsb) << (32 - width) >>
1154                      (32 - (lsb + width)));
1155    Inst.addOperand(MCOperand::CreateImm(Mask));
1156  }
1157
1158  void addImmOperands(MCInst &Inst, unsigned N) const {
1159    assert(N == 1 && "Invalid number of operands!");
1160    addExpr(Inst, getImm());
1161  }
1162
1163  void addFPImmOperands(MCInst &Inst, unsigned N) const {
1164    assert(N == 1 && "Invalid number of operands!");
1165    Inst.addOperand(MCOperand::CreateImm(getFPImm()));
1166  }
1167
1168  void addImm8s4Operands(MCInst &Inst, unsigned N) const {
1169    assert(N == 1 && "Invalid number of operands!");
1170    // FIXME: We really want to scale the value here, but the LDRD/STRD
1171    // instruction don't encode operands that way yet.
1172    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1173    Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
1174  }
1175
1176  void addImm0_1020s4Operands(MCInst &Inst, unsigned N) const {
1177    assert(N == 1 && "Invalid number of operands!");
1178    // The immediate is scaled by four in the encoding and is stored
1179    // in the MCInst as such. Lop off the low two bits here.
1180    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1181    Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
1182  }
1183
1184  void addImm0_508s4Operands(MCInst &Inst, unsigned N) const {
1185    assert(N == 1 && "Invalid number of operands!");
1186    // The immediate is scaled by four in the encoding and is stored
1187    // in the MCInst as such. Lop off the low two bits here.
1188    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1189    Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
1190  }
1191
1192  void addImm0_255Operands(MCInst &Inst, unsigned N) const {
1193    assert(N == 1 && "Invalid number of operands!");
1194    addExpr(Inst, getImm());
1195  }
1196
1197  void addImm0_7Operands(MCInst &Inst, unsigned N) const {
1198    assert(N == 1 && "Invalid number of operands!");
1199    addExpr(Inst, getImm());
1200  }
1201
1202  void addImm0_15Operands(MCInst &Inst, unsigned N) const {
1203    assert(N == 1 && "Invalid number of operands!");
1204    addExpr(Inst, getImm());
1205  }
1206
1207  void addImm0_31Operands(MCInst &Inst, unsigned N) const {
1208    assert(N == 1 && "Invalid number of operands!");
1209    addExpr(Inst, getImm());
1210  }
1211
1212  void addImm1_16Operands(MCInst &Inst, unsigned N) const {
1213    assert(N == 1 && "Invalid number of operands!");
1214    // The constant encodes as the immediate-1, and we store in the instruction
1215    // the bits as encoded, so subtract off one here.
1216    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1217    Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
1218  }
1219
1220  void addImm1_32Operands(MCInst &Inst, unsigned N) const {
1221    assert(N == 1 && "Invalid number of operands!");
1222    // The constant encodes as the immediate-1, and we store in the instruction
1223    // the bits as encoded, so subtract off one here.
1224    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1225    Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
1226  }
1227
1228  void addImm0_32Operands(MCInst &Inst, unsigned N) const {
1229    assert(N == 1 && "Invalid number of operands!");
1230    addExpr(Inst, getImm());
1231  }
1232
1233  void addImm0_65535Operands(MCInst &Inst, unsigned N) const {
1234    assert(N == 1 && "Invalid number of operands!");
1235    addExpr(Inst, getImm());
1236  }
1237
1238  void addImm0_65535ExprOperands(MCInst &Inst, unsigned N) const {
1239    assert(N == 1 && "Invalid number of operands!");
1240    addExpr(Inst, getImm());
1241  }
1242
1243  void addImm24bitOperands(MCInst &Inst, unsigned N) const {
1244    assert(N == 1 && "Invalid number of operands!");
1245    addExpr(Inst, getImm());
1246  }
1247
1248  void addImmThumbSROperands(MCInst &Inst, unsigned N) const {
1249    assert(N == 1 && "Invalid number of operands!");
1250    // The constant encodes as the immediate, except for 32, which encodes as
1251    // zero.
1252    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1253    unsigned Imm = CE->getValue();
1254    Inst.addOperand(MCOperand::CreateImm((Imm == 32 ? 0 : Imm)));
1255  }
1256
1257  void addPKHLSLImmOperands(MCInst &Inst, unsigned N) const {
1258    assert(N == 1 && "Invalid number of operands!");
1259    addExpr(Inst, getImm());
1260  }
1261
1262  void addPKHASRImmOperands(MCInst &Inst, unsigned N) const {
1263    assert(N == 1 && "Invalid number of operands!");
1264    // An ASR value of 32 encodes as 0, so that's how we want to add it to
1265    // the instruction as well.
1266    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1267    int Val = CE->getValue();
1268    Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val));
1269  }
1270
1271  void addARMSOImmOperands(MCInst &Inst, unsigned N) const {
1272    assert(N == 1 && "Invalid number of operands!");
1273    addExpr(Inst, getImm());
1274  }
1275
1276  void addT2SOImmOperands(MCInst &Inst, unsigned N) const {
1277    assert(N == 1 && "Invalid number of operands!");
1278    addExpr(Inst, getImm());
1279  }
1280
1281  void addT2SOImmNotOperands(MCInst &Inst, unsigned N) const {
1282    assert(N == 1 && "Invalid number of operands!");
1283    // The operand is actually a t2_so_imm, but we have its bitwise
1284    // negation in the assembly source, so twiddle it here.
1285    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1286    Inst.addOperand(MCOperand::CreateImm(~CE->getValue()));
1287  }
1288
1289  void addARMSOImmNotOperands(MCInst &Inst, unsigned N) const {
1290    assert(N == 1 && "Invalid number of operands!");
1291    // The operand is actually a so_imm, but we have its bitwise
1292    // negation in the assembly source, so twiddle it here.
1293    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1294    Inst.addOperand(MCOperand::CreateImm(~CE->getValue()));
1295  }
1296
1297  void addSetEndImmOperands(MCInst &Inst, unsigned N) const {
1298    assert(N == 1 && "Invalid number of operands!");
1299    addExpr(Inst, getImm());
1300  }
1301
1302  void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const {
1303    assert(N == 1 && "Invalid number of operands!");
1304    Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt())));
1305  }
1306
1307  void addMemNoOffsetOperands(MCInst &Inst, unsigned N) const {
1308    assert(N == 1 && "Invalid number of operands!");
1309    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1310  }
1311
1312  void addAlignedMemoryOperands(MCInst &Inst, unsigned N) const {
1313    assert(N == 2 && "Invalid number of operands!");
1314    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1315    Inst.addOperand(MCOperand::CreateImm(Memory.Alignment));
1316  }
1317
1318  void addAddrMode2Operands(MCInst &Inst, unsigned N) const {
1319    assert(N == 3 && "Invalid number of operands!");
1320    int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1321    if (!Memory.OffsetRegNum) {
1322      ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1323      // Special case for #-0
1324      if (Val == INT32_MIN) Val = 0;
1325      if (Val < 0) Val = -Val;
1326      Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
1327    } else {
1328      // For register offset, we encode the shift type and negation flag
1329      // here.
1330      Val = ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add,
1331                              Memory.ShiftImm, Memory.ShiftType);
1332    }
1333    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1334    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1335    Inst.addOperand(MCOperand::CreateImm(Val));
1336  }
1337
1338  void addAM2OffsetImmOperands(MCInst &Inst, unsigned N) const {
1339    assert(N == 2 && "Invalid number of operands!");
1340    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1341    assert(CE && "non-constant AM2OffsetImm operand!");
1342    int32_t Val = CE->getValue();
1343    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1344    // Special case for #-0
1345    if (Val == INT32_MIN) Val = 0;
1346    if (Val < 0) Val = -Val;
1347    Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
1348    Inst.addOperand(MCOperand::CreateReg(0));
1349    Inst.addOperand(MCOperand::CreateImm(Val));
1350  }
1351
1352  void addAddrMode3Operands(MCInst &Inst, unsigned N) const {
1353    assert(N == 3 && "Invalid number of operands!");
1354    int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1355    if (!Memory.OffsetRegNum) {
1356      ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1357      // Special case for #-0
1358      if (Val == INT32_MIN) Val = 0;
1359      if (Val < 0) Val = -Val;
1360      Val = ARM_AM::getAM3Opc(AddSub, Val);
1361    } else {
1362      // For register offset, we encode the shift type and negation flag
1363      // here.
1364      Val = ARM_AM::getAM3Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add, 0);
1365    }
1366    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1367    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1368    Inst.addOperand(MCOperand::CreateImm(Val));
1369  }
1370
1371  void addAM3OffsetOperands(MCInst &Inst, unsigned N) const {
1372    assert(N == 2 && "Invalid number of operands!");
1373    if (Kind == k_PostIndexRegister) {
1374      int32_t Val =
1375        ARM_AM::getAM3Opc(PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub, 0);
1376      Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1377      Inst.addOperand(MCOperand::CreateImm(Val));
1378      return;
1379    }
1380
1381    // Constant offset.
1382    const MCConstantExpr *CE = static_cast<const MCConstantExpr*>(getImm());
1383    int32_t Val = CE->getValue();
1384    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1385    // Special case for #-0
1386    if (Val == INT32_MIN) Val = 0;
1387    if (Val < 0) Val = -Val;
1388    Val = ARM_AM::getAM3Opc(AddSub, Val);
1389    Inst.addOperand(MCOperand::CreateReg(0));
1390    Inst.addOperand(MCOperand::CreateImm(Val));
1391  }
1392
1393  void addAddrMode5Operands(MCInst &Inst, unsigned N) const {
1394    assert(N == 2 && "Invalid number of operands!");
1395    // If we have an immediate that's not a constant, treat it as a label
1396    // reference needing a fixup. If it is a constant, it's something else
1397    // and we reject it.
1398    if (isImm()) {
1399      Inst.addOperand(MCOperand::CreateExpr(getImm()));
1400      Inst.addOperand(MCOperand::CreateImm(0));
1401      return;
1402    }
1403
1404    // The lower two bits are always zero and as such are not encoded.
1405    int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0;
1406    ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
1407    // Special case for #-0
1408    if (Val == INT32_MIN) Val = 0;
1409    if (Val < 0) Val = -Val;
1410    Val = ARM_AM::getAM5Opc(AddSub, Val);
1411    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1412    Inst.addOperand(MCOperand::CreateImm(Val));
1413  }
1414
1415  void addMemImm8s4OffsetOperands(MCInst &Inst, unsigned N) const {
1416    assert(N == 2 && "Invalid number of operands!");
1417    int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1418    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1419    Inst.addOperand(MCOperand::CreateImm(Val));
1420  }
1421
1422  void addMemImm0_1020s4OffsetOperands(MCInst &Inst, unsigned N) const {
1423    assert(N == 2 && "Invalid number of operands!");
1424    // The lower two bits are always zero and as such are not encoded.
1425    int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0;
1426    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1427    Inst.addOperand(MCOperand::CreateImm(Val));
1428  }
1429
1430  void addMemImm8OffsetOperands(MCInst &Inst, unsigned N) const {
1431    assert(N == 2 && "Invalid number of operands!");
1432    int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1433    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1434    Inst.addOperand(MCOperand::CreateImm(Val));
1435  }
1436
1437  void addMemPosImm8OffsetOperands(MCInst &Inst, unsigned N) const {
1438    addMemImm8OffsetOperands(Inst, N);
1439  }
1440
1441  void addMemNegImm8OffsetOperands(MCInst &Inst, unsigned N) const {
1442    addMemImm8OffsetOperands(Inst, N);
1443  }
1444
1445  void addMemUImm12OffsetOperands(MCInst &Inst, unsigned N) const {
1446    assert(N == 2 && "Invalid number of operands!");
1447    // If this is an immediate, it's a label reference.
1448    if (Kind == k_Immediate) {
1449      addExpr(Inst, getImm());
1450      Inst.addOperand(MCOperand::CreateImm(0));
1451      return;
1452    }
1453
1454    // Otherwise, it's a normal memory reg+offset.
1455    int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1456    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1457    Inst.addOperand(MCOperand::CreateImm(Val));
1458  }
1459
1460  void addMemImm12OffsetOperands(MCInst &Inst, unsigned N) const {
1461    assert(N == 2 && "Invalid number of operands!");
1462    // If this is an immediate, it's a label reference.
1463    if (Kind == k_Immediate) {
1464      addExpr(Inst, getImm());
1465      Inst.addOperand(MCOperand::CreateImm(0));
1466      return;
1467    }
1468
1469    // Otherwise, it's a normal memory reg+offset.
1470    int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
1471    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1472    Inst.addOperand(MCOperand::CreateImm(Val));
1473  }
1474
1475  void addMemTBBOperands(MCInst &Inst, unsigned N) const {
1476    assert(N == 2 && "Invalid number of operands!");
1477    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1478    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1479  }
1480
1481  void addMemTBHOperands(MCInst &Inst, unsigned N) const {
1482    assert(N == 2 && "Invalid number of operands!");
1483    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1484    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1485  }
1486
1487  void addMemRegOffsetOperands(MCInst &Inst, unsigned N) const {
1488    assert(N == 3 && "Invalid number of operands!");
1489    unsigned Val = ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add,
1490                                     Memory.ShiftImm, Memory.ShiftType);
1491    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1492    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1493    Inst.addOperand(MCOperand::CreateImm(Val));
1494  }
1495
1496  void addT2MemRegOffsetOperands(MCInst &Inst, unsigned N) const {
1497    assert(N == 3 && "Invalid number of operands!");
1498    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1499    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1500    Inst.addOperand(MCOperand::CreateImm(Memory.ShiftImm));
1501  }
1502
1503  void addMemThumbRROperands(MCInst &Inst, unsigned N) const {
1504    assert(N == 2 && "Invalid number of operands!");
1505    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1506    Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
1507  }
1508
1509  void addMemThumbRIs4Operands(MCInst &Inst, unsigned N) const {
1510    assert(N == 2 && "Invalid number of operands!");
1511    int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0;
1512    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1513    Inst.addOperand(MCOperand::CreateImm(Val));
1514  }
1515
1516  void addMemThumbRIs2Operands(MCInst &Inst, unsigned N) const {
1517    assert(N == 2 && "Invalid number of operands!");
1518    int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 2) : 0;
1519    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1520    Inst.addOperand(MCOperand::CreateImm(Val));
1521  }
1522
1523  void addMemThumbRIs1Operands(MCInst &Inst, unsigned N) const {
1524    assert(N == 2 && "Invalid number of operands!");
1525    int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue()) : 0;
1526    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1527    Inst.addOperand(MCOperand::CreateImm(Val));
1528  }
1529
1530  void addMemThumbSPIOperands(MCInst &Inst, unsigned N) const {
1531    assert(N == 2 && "Invalid number of operands!");
1532    int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0;
1533    Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
1534    Inst.addOperand(MCOperand::CreateImm(Val));
1535  }
1536
1537  void addPostIdxImm8Operands(MCInst &Inst, unsigned N) const {
1538    assert(N == 1 && "Invalid number of operands!");
1539    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1540    assert(CE && "non-constant post-idx-imm8 operand!");
1541    int Imm = CE->getValue();
1542    bool isAdd = Imm >= 0;
1543    if (Imm == INT32_MIN) Imm = 0;
1544    Imm = (Imm < 0 ? -Imm : Imm) | (int)isAdd << 8;
1545    Inst.addOperand(MCOperand::CreateImm(Imm));
1546  }
1547
1548  void addPostIdxImm8s4Operands(MCInst &Inst, unsigned N) const {
1549    assert(N == 1 && "Invalid number of operands!");
1550    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1551    assert(CE && "non-constant post-idx-imm8s4 operand!");
1552    int Imm = CE->getValue();
1553    bool isAdd = Imm >= 0;
1554    if (Imm == INT32_MIN) Imm = 0;
1555    // Immediate is scaled by 4.
1556    Imm = ((Imm < 0 ? -Imm : Imm) / 4) | (int)isAdd << 8;
1557    Inst.addOperand(MCOperand::CreateImm(Imm));
1558  }
1559
1560  void addPostIdxRegOperands(MCInst &Inst, unsigned N) const {
1561    assert(N == 2 && "Invalid number of operands!");
1562    Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1563    Inst.addOperand(MCOperand::CreateImm(PostIdxReg.isAdd));
1564  }
1565
1566  void addPostIdxRegShiftedOperands(MCInst &Inst, unsigned N) const {
1567    assert(N == 2 && "Invalid number of operands!");
1568    Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
1569    // The sign, shift type, and shift amount are encoded in a single operand
1570    // using the AM2 encoding helpers.
1571    ARM_AM::AddrOpc opc = PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub;
1572    unsigned Imm = ARM_AM::getAM2Opc(opc, PostIdxReg.ShiftImm,
1573                                     PostIdxReg.ShiftTy);
1574    Inst.addOperand(MCOperand::CreateImm(Imm));
1575  }
1576
1577  void addMSRMaskOperands(MCInst &Inst, unsigned N) const {
1578    assert(N == 1 && "Invalid number of operands!");
1579    Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask())));
1580  }
1581
1582  void addProcIFlagsOperands(MCInst &Inst, unsigned N) const {
1583    assert(N == 1 && "Invalid number of operands!");
1584    Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags())));
1585  }
1586
1587  void addVecListOneDOperands(MCInst &Inst, unsigned N) const {
1588    assert(N == 1 && "Invalid number of operands!");
1589    Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum));
1590  }
1591
1592  void addVecListTwoDOperands(MCInst &Inst, unsigned N) const {
1593    assert(N == 1 && "Invalid number of operands!");
1594    // Only the first register actually goes on the instruction. The rest
1595    // are implied by the opcode.
1596    Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum));
1597  }
1598
1599  void addVecListThreeDOperands(MCInst &Inst, unsigned N) const {
1600    assert(N == 1 && "Invalid number of operands!");
1601    // Only the first register actually goes on the instruction. The rest
1602    // are implied by the opcode.
1603    Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum));
1604  }
1605
1606  void addVecListFourDOperands(MCInst &Inst, unsigned N) const {
1607    assert(N == 1 && "Invalid number of operands!");
1608    // Only the first register actually goes on the instruction. The rest
1609    // are implied by the opcode.
1610    Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum));
1611  }
1612
1613  void addVecListTwoQOperands(MCInst &Inst, unsigned N) const {
1614    assert(N == 1 && "Invalid number of operands!");
1615    // Only the first register actually goes on the instruction. The rest
1616    // are implied by the opcode.
1617    Inst.addOperand(MCOperand::CreateReg(VectorList.RegNum));
1618  }
1619
1620  void addVectorIndex8Operands(MCInst &Inst, unsigned N) const {
1621    assert(N == 1 && "Invalid number of operands!");
1622    Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
1623  }
1624
1625  void addVectorIndex16Operands(MCInst &Inst, unsigned N) const {
1626    assert(N == 1 && "Invalid number of operands!");
1627    Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
1628  }
1629
1630  void addVectorIndex32Operands(MCInst &Inst, unsigned N) const {
1631    assert(N == 1 && "Invalid number of operands!");
1632    Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
1633  }
1634
1635  void addNEONi8splatOperands(MCInst &Inst, unsigned N) const {
1636    assert(N == 1 && "Invalid number of operands!");
1637    // The immediate encodes the type of constant as well as the value.
1638    // Mask in that this is an i8 splat.
1639    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1640    Inst.addOperand(MCOperand::CreateImm(CE->getValue() | 0xe00));
1641  }
1642
1643  void addNEONi16splatOperands(MCInst &Inst, unsigned N) const {
1644    assert(N == 1 && "Invalid number of operands!");
1645    // The immediate encodes the type of constant as well as the value.
1646    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1647    unsigned Value = CE->getValue();
1648    if (Value >= 256)
1649      Value = (Value >> 8) | 0xa00;
1650    else
1651      Value |= 0x800;
1652    Inst.addOperand(MCOperand::CreateImm(Value));
1653  }
1654
1655  void addNEONi32splatOperands(MCInst &Inst, unsigned N) const {
1656    assert(N == 1 && "Invalid number of operands!");
1657    // The immediate encodes the type of constant as well as the value.
1658    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1659    unsigned Value = CE->getValue();
1660    if (Value >= 256 && Value <= 0xff00)
1661      Value = (Value >> 8) | 0x200;
1662    else if (Value > 0xffff && Value <= 0xff0000)
1663      Value = (Value >> 16) | 0x400;
1664    else if (Value > 0xffffff)
1665      Value = (Value >> 24) | 0x600;
1666    Inst.addOperand(MCOperand::CreateImm(Value));
1667  }
1668
1669  void addNEONi32vmovOperands(MCInst &Inst, unsigned N) const {
1670    assert(N == 1 && "Invalid number of operands!");
1671    // The immediate encodes the type of constant as well as the value.
1672    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1673    unsigned Value = CE->getValue();
1674    if (Value >= 256 && Value <= 0xffff)
1675      Value = (Value >> 8) | ((Value & 0xff) ? 0xc00 : 0x200);
1676    else if (Value > 0xffff && Value <= 0xffffff)
1677      Value = (Value >> 16) | ((Value & 0xff) ? 0xd00 : 0x400);
1678    else if (Value > 0xffffff)
1679      Value = (Value >> 24) | 0x600;
1680    Inst.addOperand(MCOperand::CreateImm(Value));
1681  }
1682
1683  void addNEONi64splatOperands(MCInst &Inst, unsigned N) const {
1684    assert(N == 1 && "Invalid number of operands!");
1685    // The immediate encodes the type of constant as well as the value.
1686    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
1687    uint64_t Value = CE->getValue();
1688    unsigned Imm = 0;
1689    for (unsigned i = 0; i < 8; ++i, Value >>= 8) {
1690      Imm |= (Value & 1) << i;
1691    }
1692    Inst.addOperand(MCOperand::CreateImm(Imm | 0x1e00));
1693  }
1694
1695  virtual void print(raw_ostream &OS) const;
1696
1697  static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) {
1698    ARMOperand *Op = new ARMOperand(k_ITCondMask);
1699    Op->ITMask.Mask = Mask;
1700    Op->StartLoc = S;
1701    Op->EndLoc = S;
1702    return Op;
1703  }
1704
1705  static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) {
1706    ARMOperand *Op = new ARMOperand(k_CondCode);
1707    Op->CC.Val = CC;
1708    Op->StartLoc = S;
1709    Op->EndLoc = S;
1710    return Op;
1711  }
1712
1713  static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) {
1714    ARMOperand *Op = new ARMOperand(k_CoprocNum);
1715    Op->Cop.Val = CopVal;
1716    Op->StartLoc = S;
1717    Op->EndLoc = S;
1718    return Op;
1719  }
1720
1721  static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) {
1722    ARMOperand *Op = new ARMOperand(k_CoprocReg);
1723    Op->Cop.Val = CopVal;
1724    Op->StartLoc = S;
1725    Op->EndLoc = S;
1726    return Op;
1727  }
1728
1729  static ARMOperand *CreateCoprocOption(unsigned Val, SMLoc S, SMLoc E) {
1730    ARMOperand *Op = new ARMOperand(k_CoprocOption);
1731    Op->Cop.Val = Val;
1732    Op->StartLoc = S;
1733    Op->EndLoc = E;
1734    return Op;
1735  }
1736
1737  static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) {
1738    ARMOperand *Op = new ARMOperand(k_CCOut);
1739    Op->Reg.RegNum = RegNum;
1740    Op->StartLoc = S;
1741    Op->EndLoc = S;
1742    return Op;
1743  }
1744
1745  static ARMOperand *CreateToken(StringRef Str, SMLoc S) {
1746    ARMOperand *Op = new ARMOperand(k_Token);
1747    Op->Tok.Data = Str.data();
1748    Op->Tok.Length = Str.size();
1749    Op->StartLoc = S;
1750    Op->EndLoc = S;
1751    return Op;
1752  }
1753
1754  static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
1755    ARMOperand *Op = new ARMOperand(k_Register);
1756    Op->Reg.RegNum = RegNum;
1757    Op->StartLoc = S;
1758    Op->EndLoc = E;
1759    return Op;
1760  }
1761
1762  static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy,
1763                                           unsigned SrcReg,
1764                                           unsigned ShiftReg,
1765                                           unsigned ShiftImm,
1766                                           SMLoc S, SMLoc E) {
1767    ARMOperand *Op = new ARMOperand(k_ShiftedRegister);
1768    Op->RegShiftedReg.ShiftTy = ShTy;
1769    Op->RegShiftedReg.SrcReg = SrcReg;
1770    Op->RegShiftedReg.ShiftReg = ShiftReg;
1771    Op->RegShiftedReg.ShiftImm = ShiftImm;
1772    Op->StartLoc = S;
1773    Op->EndLoc = E;
1774    return Op;
1775  }
1776
1777  static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy,
1778                                            unsigned SrcReg,
1779                                            unsigned ShiftImm,
1780                                            SMLoc S, SMLoc E) {
1781    ARMOperand *Op = new ARMOperand(k_ShiftedImmediate);
1782    Op->RegShiftedImm.ShiftTy = ShTy;
1783    Op->RegShiftedImm.SrcReg = SrcReg;
1784    Op->RegShiftedImm.ShiftImm = ShiftImm;
1785    Op->StartLoc = S;
1786    Op->EndLoc = E;
1787    return Op;
1788  }
1789
1790  static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm,
1791                                   SMLoc S, SMLoc E) {
1792    ARMOperand *Op = new ARMOperand(k_ShifterImmediate);
1793    Op->ShifterImm.isASR = isASR;
1794    Op->ShifterImm.Imm = Imm;
1795    Op->StartLoc = S;
1796    Op->EndLoc = E;
1797    return Op;
1798  }
1799
1800  static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) {
1801    ARMOperand *Op = new ARMOperand(k_RotateImmediate);
1802    Op->RotImm.Imm = Imm;
1803    Op->StartLoc = S;
1804    Op->EndLoc = E;
1805    return Op;
1806  }
1807
1808  static ARMOperand *CreateBitfield(unsigned LSB, unsigned Width,
1809                                    SMLoc S, SMLoc E) {
1810    ARMOperand *Op = new ARMOperand(k_BitfieldDescriptor);
1811    Op->Bitfield.LSB = LSB;
1812    Op->Bitfield.Width = Width;
1813    Op->StartLoc = S;
1814    Op->EndLoc = E;
1815    return Op;
1816  }
1817
1818  static ARMOperand *
1819  CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs,
1820                SMLoc StartLoc, SMLoc EndLoc) {
1821    KindTy Kind = k_RegisterList;
1822
1823    if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Regs.front().first))
1824      Kind = k_DPRRegisterList;
1825    else if (ARMMCRegisterClasses[ARM::SPRRegClassID].
1826             contains(Regs.front().first))
1827      Kind = k_SPRRegisterList;
1828
1829    ARMOperand *Op = new ARMOperand(Kind);
1830    for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator
1831           I = Regs.begin(), E = Regs.end(); I != E; ++I)
1832      Op->Registers.push_back(I->first);
1833    array_pod_sort(Op->Registers.begin(), Op->Registers.end());
1834    Op->StartLoc = StartLoc;
1835    Op->EndLoc = EndLoc;
1836    return Op;
1837  }
1838
1839  static ARMOperand *CreateVectorList(unsigned RegNum, unsigned Count,
1840                                      SMLoc S, SMLoc E) {
1841    ARMOperand *Op = new ARMOperand(k_VectorList);
1842    Op->VectorList.RegNum = RegNum;
1843    Op->VectorList.Count = Count;
1844    Op->StartLoc = S;
1845    Op->EndLoc = E;
1846    return Op;
1847  }
1848
1849  static ARMOperand *CreateVectorIndex(unsigned Idx, SMLoc S, SMLoc E,
1850                                       MCContext &Ctx) {
1851    ARMOperand *Op = new ARMOperand(k_VectorIndex);
1852    Op->VectorIndex.Val = Idx;
1853    Op->StartLoc = S;
1854    Op->EndLoc = E;
1855    return Op;
1856  }
1857
1858  static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
1859    ARMOperand *Op = new ARMOperand(k_Immediate);
1860    Op->Imm.Val = Val;
1861    Op->StartLoc = S;
1862    Op->EndLoc = E;
1863    return Op;
1864  }
1865
1866  static ARMOperand *CreateFPImm(unsigned Val, SMLoc S, MCContext &Ctx) {
1867    ARMOperand *Op = new ARMOperand(k_FPImmediate);
1868    Op->FPImm.Val = Val;
1869    Op->StartLoc = S;
1870    Op->EndLoc = S;
1871    return Op;
1872  }
1873
1874  static ARMOperand *CreateMem(unsigned BaseRegNum,
1875                               const MCConstantExpr *OffsetImm,
1876                               unsigned OffsetRegNum,
1877                               ARM_AM::ShiftOpc ShiftType,
1878                               unsigned ShiftImm,
1879                               unsigned Alignment,
1880                               bool isNegative,
1881                               SMLoc S, SMLoc E) {
1882    ARMOperand *Op = new ARMOperand(k_Memory);
1883    Op->Memory.BaseRegNum = BaseRegNum;
1884    Op->Memory.OffsetImm = OffsetImm;
1885    Op->Memory.OffsetRegNum = OffsetRegNum;
1886    Op->Memory.ShiftType = ShiftType;
1887    Op->Memory.ShiftImm = ShiftImm;
1888    Op->Memory.Alignment = Alignment;
1889    Op->Memory.isNegative = isNegative;
1890    Op->StartLoc = S;
1891    Op->EndLoc = E;
1892    return Op;
1893  }
1894
1895  static ARMOperand *CreatePostIdxReg(unsigned RegNum, bool isAdd,
1896                                      ARM_AM::ShiftOpc ShiftTy,
1897                                      unsigned ShiftImm,
1898                                      SMLoc S, SMLoc E) {
1899    ARMOperand *Op = new ARMOperand(k_PostIndexRegister);
1900    Op->PostIdxReg.RegNum = RegNum;
1901    Op->PostIdxReg.isAdd = isAdd;
1902    Op->PostIdxReg.ShiftTy = ShiftTy;
1903    Op->PostIdxReg.ShiftImm = ShiftImm;
1904    Op->StartLoc = S;
1905    Op->EndLoc = E;
1906    return Op;
1907  }
1908
1909  static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) {
1910    ARMOperand *Op = new ARMOperand(k_MemBarrierOpt);
1911    Op->MBOpt.Val = Opt;
1912    Op->StartLoc = S;
1913    Op->EndLoc = S;
1914    return Op;
1915  }
1916
1917  static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) {
1918    ARMOperand *Op = new ARMOperand(k_ProcIFlags);
1919    Op->IFlags.Val = IFlags;
1920    Op->StartLoc = S;
1921    Op->EndLoc = S;
1922    return Op;
1923  }
1924
1925  static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) {
1926    ARMOperand *Op = new ARMOperand(k_MSRMask);
1927    Op->MMask.Val = MMask;
1928    Op->StartLoc = S;
1929    Op->EndLoc = S;
1930    return Op;
1931  }
1932};
1933
1934} // end anonymous namespace.
1935
1936void ARMOperand::print(raw_ostream &OS) const {
1937  switch (Kind) {
1938  case k_FPImmediate:
1939    OS << "<fpimm " << getFPImm() << "(" << ARM_AM::getFPImmFloat(getFPImm())
1940       << ") >";
1941    break;
1942  case k_CondCode:
1943    OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">";
1944    break;
1945  case k_CCOut:
1946    OS << "<ccout " << getReg() << ">";
1947    break;
1948  case k_ITCondMask: {
1949    static const char *MaskStr[] = {
1950      "()", "(t)", "(e)", "(tt)", "(et)", "(te)", "(ee)", "(ttt)", "(ett)",
1951      "(tet)", "(eet)", "(tte)", "(ete)", "(tee)", "(eee)"
1952    };
1953    assert((ITMask.Mask & 0xf) == ITMask.Mask);
1954    OS << "<it-mask " << MaskStr[ITMask.Mask] << ">";
1955    break;
1956  }
1957  case k_CoprocNum:
1958    OS << "<coprocessor number: " << getCoproc() << ">";
1959    break;
1960  case k_CoprocReg:
1961    OS << "<coprocessor register: " << getCoproc() << ">";
1962    break;
1963  case k_CoprocOption:
1964    OS << "<coprocessor option: " << CoprocOption.Val << ">";
1965    break;
1966  case k_MSRMask:
1967    OS << "<mask: " << getMSRMask() << ">";
1968    break;
1969  case k_Immediate:
1970    getImm()->print(OS);
1971    break;
1972  case k_MemBarrierOpt:
1973    OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">";
1974    break;
1975  case k_Memory:
1976    OS << "<memory "
1977       << " base:" << Memory.BaseRegNum;
1978    OS << ">";
1979    break;
1980  case k_PostIndexRegister:
1981    OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-")
1982       << PostIdxReg.RegNum;
1983    if (PostIdxReg.ShiftTy != ARM_AM::no_shift)
1984      OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " "
1985         << PostIdxReg.ShiftImm;
1986    OS << ">";
1987    break;
1988  case k_ProcIFlags: {
1989    OS << "<ARM_PROC::";
1990    unsigned IFlags = getProcIFlags();
1991    for (int i=2; i >= 0; --i)
1992      if (IFlags & (1 << i))
1993        OS << ARM_PROC::IFlagsToString(1 << i);
1994    OS << ">";
1995    break;
1996  }
1997  case k_Register:
1998    OS << "<register " << getReg() << ">";
1999    break;
2000  case k_ShifterImmediate:
2001    OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl")
2002       << " #" << ShifterImm.Imm << ">";
2003    break;
2004  case k_ShiftedRegister:
2005    OS << "<so_reg_reg "
2006       << RegShiftedReg.SrcReg
2007       << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedReg.ShiftImm))
2008       << ", " << RegShiftedReg.ShiftReg << ", "
2009       << ARM_AM::getSORegOffset(RegShiftedReg.ShiftImm)
2010       << ">";
2011    break;
2012  case k_ShiftedImmediate:
2013    OS << "<so_reg_imm "
2014       << RegShiftedImm.SrcReg
2015       << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedImm.ShiftImm))
2016       << ", " << ARM_AM::getSORegOffset(RegShiftedImm.ShiftImm)
2017       << ">";
2018    break;
2019  case k_RotateImmediate:
2020    OS << "<ror " << " #" << (RotImm.Imm * 8) << ">";
2021    break;
2022  case k_BitfieldDescriptor:
2023    OS << "<bitfield " << "lsb: " << Bitfield.LSB
2024       << ", width: " << Bitfield.Width << ">";
2025    break;
2026  case k_RegisterList:
2027  case k_DPRRegisterList:
2028  case k_SPRRegisterList: {
2029    OS << "<register_list ";
2030
2031    const SmallVectorImpl<unsigned> &RegList = getRegList();
2032    for (SmallVectorImpl<unsigned>::const_iterator
2033           I = RegList.begin(), E = RegList.end(); I != E; ) {
2034      OS << *I;
2035      if (++I < E) OS << ", ";
2036    }
2037
2038    OS << ">";
2039    break;
2040  }
2041  case k_VectorList:
2042    OS << "<vector_list " << VectorList.Count << " * "
2043       << VectorList.RegNum << ">";
2044    break;
2045  case k_Token:
2046    OS << "'" << getToken() << "'";
2047    break;
2048  case k_VectorIndex:
2049    OS << "<vectorindex " << getVectorIndex() << ">";
2050    break;
2051  }
2052}
2053
2054/// @name Auto-generated Match Functions
2055/// {
2056
2057static unsigned MatchRegisterName(StringRef Name);
2058
2059/// }
2060
2061bool ARMAsmParser::ParseRegister(unsigned &RegNo,
2062                                 SMLoc &StartLoc, SMLoc &EndLoc) {
2063  RegNo = tryParseRegister();
2064
2065  return (RegNo == (unsigned)-1);
2066}
2067
2068/// Try to parse a register name.  The token must be an Identifier when called,
2069/// and if it is a register name the token is eaten and the register number is
2070/// returned.  Otherwise return -1.
2071///
2072int ARMAsmParser::tryParseRegister() {
2073  const AsmToken &Tok = Parser.getTok();
2074  if (Tok.isNot(AsmToken::Identifier)) return -1;
2075
2076  // FIXME: Validate register for the current architecture; we have to do
2077  // validation later, so maybe there is no need for this here.
2078  std::string lowerCase = Tok.getString().lower();
2079  unsigned RegNum = MatchRegisterName(lowerCase);
2080  if (!RegNum) {
2081    RegNum = StringSwitch<unsigned>(lowerCase)
2082      .Case("r13", ARM::SP)
2083      .Case("r14", ARM::LR)
2084      .Case("r15", ARM::PC)
2085      .Case("ip", ARM::R12)
2086      .Default(0);
2087  }
2088  if (!RegNum) return -1;
2089
2090  Parser.Lex(); // Eat identifier token.
2091
2092  return RegNum;
2093}
2094
2095// Try to parse a shifter  (e.g., "lsl <amt>"). On success, return 0.
2096// If a recoverable error occurs, return 1. If an irrecoverable error
2097// occurs, return -1. An irrecoverable error is one where tokens have been
2098// consumed in the process of trying to parse the shifter (i.e., when it is
2099// indeed a shifter operand, but malformed).
2100int ARMAsmParser::tryParseShiftRegister(
2101                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2102  SMLoc S = Parser.getTok().getLoc();
2103  const AsmToken &Tok = Parser.getTok();
2104  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
2105
2106  std::string lowerCase = Tok.getString().lower();
2107  ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase)
2108      .Case("lsl", ARM_AM::lsl)
2109      .Case("lsr", ARM_AM::lsr)
2110      .Case("asr", ARM_AM::asr)
2111      .Case("ror", ARM_AM::ror)
2112      .Case("rrx", ARM_AM::rrx)
2113      .Default(ARM_AM::no_shift);
2114
2115  if (ShiftTy == ARM_AM::no_shift)
2116    return 1;
2117
2118  Parser.Lex(); // Eat the operator.
2119
2120  // The source register for the shift has already been added to the
2121  // operand list, so we need to pop it off and combine it into the shifted
2122  // register operand instead.
2123  OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val());
2124  if (!PrevOp->isReg())
2125    return Error(PrevOp->getStartLoc(), "shift must be of a register");
2126  int SrcReg = PrevOp->getReg();
2127  int64_t Imm = 0;
2128  int ShiftReg = 0;
2129  if (ShiftTy == ARM_AM::rrx) {
2130    // RRX Doesn't have an explicit shift amount. The encoder expects
2131    // the shift register to be the same as the source register. Seems odd,
2132    // but OK.
2133    ShiftReg = SrcReg;
2134  } else {
2135    // Figure out if this is shifted by a constant or a register (for non-RRX).
2136    if (Parser.getTok().is(AsmToken::Hash)) {
2137      Parser.Lex(); // Eat hash.
2138      SMLoc ImmLoc = Parser.getTok().getLoc();
2139      const MCExpr *ShiftExpr = 0;
2140      if (getParser().ParseExpression(ShiftExpr)) {
2141        Error(ImmLoc, "invalid immediate shift value");
2142        return -1;
2143      }
2144      // The expression must be evaluatable as an immediate.
2145      const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr);
2146      if (!CE) {
2147        Error(ImmLoc, "invalid immediate shift value");
2148        return -1;
2149      }
2150      // Range check the immediate.
2151      // lsl, ror: 0 <= imm <= 31
2152      // lsr, asr: 0 <= imm <= 32
2153      Imm = CE->getValue();
2154      if (Imm < 0 ||
2155          ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) ||
2156          ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) {
2157        Error(ImmLoc, "immediate shift value out of range");
2158        return -1;
2159      }
2160    } else if (Parser.getTok().is(AsmToken::Identifier)) {
2161      ShiftReg = tryParseRegister();
2162      SMLoc L = Parser.getTok().getLoc();
2163      if (ShiftReg == -1) {
2164        Error (L, "expected immediate or register in shift operand");
2165        return -1;
2166      }
2167    } else {
2168      Error (Parser.getTok().getLoc(),
2169                    "expected immediate or register in shift operand");
2170      return -1;
2171    }
2172  }
2173
2174  if (ShiftReg && ShiftTy != ARM_AM::rrx)
2175    Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg,
2176                                                         ShiftReg, Imm,
2177                                               S, Parser.getTok().getLoc()));
2178  else
2179    Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm,
2180                                               S, Parser.getTok().getLoc()));
2181
2182  return 0;
2183}
2184
2185
2186/// Try to parse a register name.  The token must be an Identifier when called.
2187/// If it's a register, an AsmOperand is created. Another AsmOperand is created
2188/// if there is a "writeback". 'true' if it's not a register.
2189///
2190/// TODO this is likely to change to allow different register types and or to
2191/// parse for a specific register type.
2192bool ARMAsmParser::
2193tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2194  SMLoc S = Parser.getTok().getLoc();
2195  int RegNo = tryParseRegister();
2196  if (RegNo == -1)
2197    return true;
2198
2199  Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc()));
2200
2201  const AsmToken &ExclaimTok = Parser.getTok();
2202  if (ExclaimTok.is(AsmToken::Exclaim)) {
2203    Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(),
2204                                               ExclaimTok.getLoc()));
2205    Parser.Lex(); // Eat exclaim token
2206    return false;
2207  }
2208
2209  // Also check for an index operand. This is only legal for vector registers,
2210  // but that'll get caught OK in operand matching, so we don't need to
2211  // explicitly filter everything else out here.
2212  if (Parser.getTok().is(AsmToken::LBrac)) {
2213    SMLoc SIdx = Parser.getTok().getLoc();
2214    Parser.Lex(); // Eat left bracket token.
2215
2216    const MCExpr *ImmVal;
2217    if (getParser().ParseExpression(ImmVal))
2218      return MatchOperand_ParseFail;
2219    const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(ImmVal);
2220    if (!MCE) {
2221      TokError("immediate value expected for vector index");
2222      return MatchOperand_ParseFail;
2223    }
2224
2225    SMLoc E = Parser.getTok().getLoc();
2226    if (Parser.getTok().isNot(AsmToken::RBrac)) {
2227      Error(E, "']' expected");
2228      return MatchOperand_ParseFail;
2229    }
2230
2231    Parser.Lex(); // Eat right bracket token.
2232
2233    Operands.push_back(ARMOperand::CreateVectorIndex(MCE->getValue(),
2234                                                     SIdx, E,
2235                                                     getContext()));
2236  }
2237
2238  return false;
2239}
2240
2241/// MatchCoprocessorOperandName - Try to parse an coprocessor related
2242/// instruction with a symbolic operand name. Example: "p1", "p7", "c3",
2243/// "c5", ...
2244static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
2245  // Use the same layout as the tablegen'erated register name matcher. Ugly,
2246  // but efficient.
2247  switch (Name.size()) {
2248  default: break;
2249  case 2:
2250    if (Name[0] != CoprocOp)
2251      return -1;
2252    switch (Name[1]) {
2253    default:  return -1;
2254    case '0': return 0;
2255    case '1': return 1;
2256    case '2': return 2;
2257    case '3': return 3;
2258    case '4': return 4;
2259    case '5': return 5;
2260    case '6': return 6;
2261    case '7': return 7;
2262    case '8': return 8;
2263    case '9': return 9;
2264    }
2265    break;
2266  case 3:
2267    if (Name[0] != CoprocOp || Name[1] != '1')
2268      return -1;
2269    switch (Name[2]) {
2270    default:  return -1;
2271    case '0': return 10;
2272    case '1': return 11;
2273    case '2': return 12;
2274    case '3': return 13;
2275    case '4': return 14;
2276    case '5': return 15;
2277    }
2278    break;
2279  }
2280
2281  return -1;
2282}
2283
2284/// parseITCondCode - Try to parse a condition code for an IT instruction.
2285ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2286parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2287  SMLoc S = Parser.getTok().getLoc();
2288  const AsmToken &Tok = Parser.getTok();
2289  if (!Tok.is(AsmToken::Identifier))
2290    return MatchOperand_NoMatch;
2291  unsigned CC = StringSwitch<unsigned>(Tok.getString())
2292    .Case("eq", ARMCC::EQ)
2293    .Case("ne", ARMCC::NE)
2294    .Case("hs", ARMCC::HS)
2295    .Case("cs", ARMCC::HS)
2296    .Case("lo", ARMCC::LO)
2297    .Case("cc", ARMCC::LO)
2298    .Case("mi", ARMCC::MI)
2299    .Case("pl", ARMCC::PL)
2300    .Case("vs", ARMCC::VS)
2301    .Case("vc", ARMCC::VC)
2302    .Case("hi", ARMCC::HI)
2303    .Case("ls", ARMCC::LS)
2304    .Case("ge", ARMCC::GE)
2305    .Case("lt", ARMCC::LT)
2306    .Case("gt", ARMCC::GT)
2307    .Case("le", ARMCC::LE)
2308    .Case("al", ARMCC::AL)
2309    .Default(~0U);
2310  if (CC == ~0U)
2311    return MatchOperand_NoMatch;
2312  Parser.Lex(); // Eat the token.
2313
2314  Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC), S));
2315
2316  return MatchOperand_Success;
2317}
2318
2319/// parseCoprocNumOperand - Try to parse an coprocessor number operand. The
2320/// token must be an Identifier when called, and if it is a coprocessor
2321/// number, the token is eaten and the operand is added to the operand list.
2322ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2323parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2324  SMLoc S = Parser.getTok().getLoc();
2325  const AsmToken &Tok = Parser.getTok();
2326  if (Tok.isNot(AsmToken::Identifier))
2327    return MatchOperand_NoMatch;
2328
2329  int Num = MatchCoprocessorOperandName(Tok.getString(), 'p');
2330  if (Num == -1)
2331    return MatchOperand_NoMatch;
2332
2333  Parser.Lex(); // Eat identifier token.
2334  Operands.push_back(ARMOperand::CreateCoprocNum(Num, S));
2335  return MatchOperand_Success;
2336}
2337
2338/// parseCoprocRegOperand - Try to parse an coprocessor register operand. The
2339/// token must be an Identifier when called, and if it is a coprocessor
2340/// number, the token is eaten and the operand is added to the operand list.
2341ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2342parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2343  SMLoc S = Parser.getTok().getLoc();
2344  const AsmToken &Tok = Parser.getTok();
2345  if (Tok.isNot(AsmToken::Identifier))
2346    return MatchOperand_NoMatch;
2347
2348  int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c');
2349  if (Reg == -1)
2350    return MatchOperand_NoMatch;
2351
2352  Parser.Lex(); // Eat identifier token.
2353  Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S));
2354  return MatchOperand_Success;
2355}
2356
2357/// parseCoprocOptionOperand - Try to parse an coprocessor option operand.
2358/// coproc_option : '{' imm0_255 '}'
2359ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2360parseCoprocOptionOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2361  SMLoc S = Parser.getTok().getLoc();
2362
2363  // If this isn't a '{', this isn't a coprocessor immediate operand.
2364  if (Parser.getTok().isNot(AsmToken::LCurly))
2365    return MatchOperand_NoMatch;
2366  Parser.Lex(); // Eat the '{'
2367
2368  const MCExpr *Expr;
2369  SMLoc Loc = Parser.getTok().getLoc();
2370  if (getParser().ParseExpression(Expr)) {
2371    Error(Loc, "illegal expression");
2372    return MatchOperand_ParseFail;
2373  }
2374  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
2375  if (!CE || CE->getValue() < 0 || CE->getValue() > 255) {
2376    Error(Loc, "coprocessor option must be an immediate in range [0, 255]");
2377    return MatchOperand_ParseFail;
2378  }
2379  int Val = CE->getValue();
2380
2381  // Check for and consume the closing '}'
2382  if (Parser.getTok().isNot(AsmToken::RCurly))
2383    return MatchOperand_ParseFail;
2384  SMLoc E = Parser.getTok().getLoc();
2385  Parser.Lex(); // Eat the '}'
2386
2387  Operands.push_back(ARMOperand::CreateCoprocOption(Val, S, E));
2388  return MatchOperand_Success;
2389}
2390
2391// For register list parsing, we need to map from raw GPR register numbering
2392// to the enumeration values. The enumeration values aren't sorted by
2393// register number due to our using "sp", "lr" and "pc" as canonical names.
2394static unsigned getNextRegister(unsigned Reg) {
2395  // If this is a GPR, we need to do it manually, otherwise we can rely
2396  // on the sort ordering of the enumeration since the other reg-classes
2397  // are sane.
2398  if (!ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg))
2399    return Reg + 1;
2400  switch(Reg) {
2401  default: assert(0 && "Invalid GPR number!");
2402  case ARM::R0:  return ARM::R1;  case ARM::R1:  return ARM::R2;
2403  case ARM::R2:  return ARM::R3;  case ARM::R3:  return ARM::R4;
2404  case ARM::R4:  return ARM::R5;  case ARM::R5:  return ARM::R6;
2405  case ARM::R6:  return ARM::R7;  case ARM::R7:  return ARM::R8;
2406  case ARM::R8:  return ARM::R9;  case ARM::R9:  return ARM::R10;
2407  case ARM::R10: return ARM::R11; case ARM::R11: return ARM::R12;
2408  case ARM::R12: return ARM::SP;  case ARM::SP:  return ARM::LR;
2409  case ARM::LR:  return ARM::PC;  case ARM::PC:  return ARM::R0;
2410  }
2411}
2412
2413// Return the low-subreg of a given Q register.
2414static unsigned getDRegFromQReg(unsigned QReg) {
2415  switch (QReg) {
2416  default: llvm_unreachable("expected a Q register!");
2417  case ARM::Q0:  return ARM::D0;
2418  case ARM::Q1:  return ARM::D2;
2419  case ARM::Q2:  return ARM::D4;
2420  case ARM::Q3:  return ARM::D6;
2421  case ARM::Q4:  return ARM::D8;
2422  case ARM::Q5:  return ARM::D10;
2423  case ARM::Q6:  return ARM::D12;
2424  case ARM::Q7:  return ARM::D14;
2425  case ARM::Q8:  return ARM::D16;
2426  case ARM::Q9:  return ARM::D19;
2427  case ARM::Q10: return ARM::D20;
2428  case ARM::Q11: return ARM::D22;
2429  case ARM::Q12: return ARM::D24;
2430  case ARM::Q13: return ARM::D26;
2431  case ARM::Q14: return ARM::D28;
2432  case ARM::Q15: return ARM::D30;
2433  }
2434}
2435
2436/// Parse a register list.
2437bool ARMAsmParser::
2438parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2439  assert(Parser.getTok().is(AsmToken::LCurly) &&
2440         "Token is not a Left Curly Brace");
2441  SMLoc S = Parser.getTok().getLoc();
2442  Parser.Lex(); // Eat '{' token.
2443  SMLoc RegLoc = Parser.getTok().getLoc();
2444
2445  // Check the first register in the list to see what register class
2446  // this is a list of.
2447  int Reg = tryParseRegister();
2448  if (Reg == -1)
2449    return Error(RegLoc, "register expected");
2450
2451  // The reglist instructions have at most 16 registers, so reserve
2452  // space for that many.
2453  SmallVector<std::pair<unsigned, SMLoc>, 16> Registers;
2454
2455  // Allow Q regs and just interpret them as the two D sub-registers.
2456  if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) {
2457    Reg = getDRegFromQReg(Reg);
2458    Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
2459    ++Reg;
2460  }
2461  const MCRegisterClass *RC;
2462  if (ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg))
2463    RC = &ARMMCRegisterClasses[ARM::GPRRegClassID];
2464  else if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg))
2465    RC = &ARMMCRegisterClasses[ARM::DPRRegClassID];
2466  else if (ARMMCRegisterClasses[ARM::SPRRegClassID].contains(Reg))
2467    RC = &ARMMCRegisterClasses[ARM::SPRRegClassID];
2468  else
2469    return Error(RegLoc, "invalid register in register list");
2470
2471  // Store the register.
2472  Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
2473
2474  // This starts immediately after the first register token in the list,
2475  // so we can see either a comma or a minus (range separator) as a legal
2476  // next token.
2477  while (Parser.getTok().is(AsmToken::Comma) ||
2478         Parser.getTok().is(AsmToken::Minus)) {
2479    if (Parser.getTok().is(AsmToken::Minus)) {
2480      Parser.Lex(); // Eat the comma.
2481      SMLoc EndLoc = Parser.getTok().getLoc();
2482      int EndReg = tryParseRegister();
2483      if (EndReg == -1)
2484        return Error(EndLoc, "register expected");
2485      // Allow Q regs and just interpret them as the two D sub-registers.
2486      if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(EndReg))
2487        EndReg = getDRegFromQReg(EndReg) + 1;
2488      // If the register is the same as the start reg, there's nothing
2489      // more to do.
2490      if (Reg == EndReg)
2491        continue;
2492      // The register must be in the same register class as the first.
2493      if (!RC->contains(EndReg))
2494        return Error(EndLoc, "invalid register in register list");
2495      // Ranges must go from low to high.
2496      if (getARMRegisterNumbering(Reg) > getARMRegisterNumbering(EndReg))
2497        return Error(EndLoc, "bad range in register list");
2498
2499      // Add all the registers in the range to the register list.
2500      while (Reg != EndReg) {
2501        Reg = getNextRegister(Reg);
2502        Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
2503      }
2504      continue;
2505    }
2506    Parser.Lex(); // Eat the comma.
2507    RegLoc = Parser.getTok().getLoc();
2508    int OldReg = Reg;
2509    Reg = tryParseRegister();
2510    if (Reg == -1)
2511      return Error(RegLoc, "register expected");
2512    // Allow Q regs and just interpret them as the two D sub-registers.
2513    bool isQReg = false;
2514    if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) {
2515      Reg = getDRegFromQReg(Reg);
2516      isQReg = true;
2517    }
2518    // The register must be in the same register class as the first.
2519    if (!RC->contains(Reg))
2520      return Error(RegLoc, "invalid register in register list");
2521    // List must be monotonically increasing.
2522    if (getARMRegisterNumbering(Reg) <= getARMRegisterNumbering(OldReg))
2523      return Error(RegLoc, "register list not in ascending order");
2524    // VFP register lists must also be contiguous.
2525    // It's OK to use the enumeration values directly here rather, as the
2526    // VFP register classes have the enum sorted properly.
2527    if (RC != &ARMMCRegisterClasses[ARM::GPRRegClassID] &&
2528        Reg != OldReg + 1)
2529      return Error(RegLoc, "non-contiguous register range");
2530    Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
2531    if (isQReg)
2532      Registers.push_back(std::pair<unsigned, SMLoc>(++Reg, RegLoc));
2533  }
2534
2535  SMLoc E = Parser.getTok().getLoc();
2536  if (Parser.getTok().isNot(AsmToken::RCurly))
2537    return Error(E, "'}' expected");
2538  Parser.Lex(); // Eat '}' token.
2539
2540  Operands.push_back(ARMOperand::CreateRegList(Registers, S, E));
2541  return false;
2542}
2543
2544// parse a vector register list
2545ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2546parseVectorList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2547  if(Parser.getTok().isNot(AsmToken::LCurly))
2548    return MatchOperand_NoMatch;
2549
2550  SMLoc S = Parser.getTok().getLoc();
2551  Parser.Lex(); // Eat '{' token.
2552  SMLoc RegLoc = Parser.getTok().getLoc();
2553
2554  int Reg = tryParseRegister();
2555  if (Reg == -1) {
2556    Error(RegLoc, "register expected");
2557    return MatchOperand_ParseFail;
2558  }
2559  unsigned Count = 1;
2560  unsigned FirstReg = Reg;
2561  // The list is of D registers, but we also allow Q regs and just interpret
2562  // them as the two D sub-registers.
2563  if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) {
2564    FirstReg = Reg = getDRegFromQReg(Reg);
2565    ++Reg;
2566    ++Count;
2567  }
2568
2569  while (Parser.getTok().is(AsmToken::Comma)) {
2570    Parser.Lex(); // Eat the comma.
2571    RegLoc = Parser.getTok().getLoc();
2572    int OldReg = Reg;
2573    Reg = tryParseRegister();
2574    if (Reg == -1) {
2575      Error(RegLoc, "register expected");
2576      return MatchOperand_ParseFail;
2577    }
2578    // vector register lists must be contiguous.
2579    // It's OK to use the enumeration values directly here rather, as the
2580    // VFP register classes have the enum sorted properly.
2581    //
2582    // The list is of D registers, but we also allow Q regs and just interpret
2583    // them as the two D sub-registers.
2584    if (ARMMCRegisterClasses[ARM::QPRRegClassID].contains(Reg)) {
2585      Reg = getDRegFromQReg(Reg);
2586      if (Reg != OldReg + 1) {
2587        Error(RegLoc, "non-contiguous register range");
2588        return MatchOperand_ParseFail;
2589      }
2590      ++Reg;
2591      Count += 2;
2592      continue;
2593    }
2594    // Normal D register. Just check that it's contiguous and keep going.
2595    if (Reg != OldReg + 1) {
2596      Error(RegLoc, "non-contiguous register range");
2597      return MatchOperand_ParseFail;
2598    }
2599    ++Count;
2600  }
2601
2602  SMLoc E = Parser.getTok().getLoc();
2603  if (Parser.getTok().isNot(AsmToken::RCurly)) {
2604    Error(E, "'}' expected");
2605    return MatchOperand_ParseFail;
2606  }
2607  Parser.Lex(); // Eat '}' token.
2608
2609  Operands.push_back(ARMOperand::CreateVectorList(FirstReg, Count, S, E));
2610  return MatchOperand_Success;
2611}
2612
2613/// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options.
2614ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2615parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2616  SMLoc S = Parser.getTok().getLoc();
2617  const AsmToken &Tok = Parser.getTok();
2618  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
2619  StringRef OptStr = Tok.getString();
2620
2621  unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size()))
2622    .Case("sy",    ARM_MB::SY)
2623    .Case("st",    ARM_MB::ST)
2624    .Case("sh",    ARM_MB::ISH)
2625    .Case("ish",   ARM_MB::ISH)
2626    .Case("shst",  ARM_MB::ISHST)
2627    .Case("ishst", ARM_MB::ISHST)
2628    .Case("nsh",   ARM_MB::NSH)
2629    .Case("un",    ARM_MB::NSH)
2630    .Case("nshst", ARM_MB::NSHST)
2631    .Case("unst",  ARM_MB::NSHST)
2632    .Case("osh",   ARM_MB::OSH)
2633    .Case("oshst", ARM_MB::OSHST)
2634    .Default(~0U);
2635
2636  if (Opt == ~0U)
2637    return MatchOperand_NoMatch;
2638
2639  Parser.Lex(); // Eat identifier token.
2640  Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S));
2641  return MatchOperand_Success;
2642}
2643
2644/// parseProcIFlagsOperand - Try to parse iflags from CPS instruction.
2645ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2646parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2647  SMLoc S = Parser.getTok().getLoc();
2648  const AsmToken &Tok = Parser.getTok();
2649  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
2650  StringRef IFlagsStr = Tok.getString();
2651
2652  // An iflags string of "none" is interpreted to mean that none of the AIF
2653  // bits are set.  Not a terribly useful instruction, but a valid encoding.
2654  unsigned IFlags = 0;
2655  if (IFlagsStr != "none") {
2656        for (int i = 0, e = IFlagsStr.size(); i != e; ++i) {
2657      unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1))
2658        .Case("a", ARM_PROC::A)
2659        .Case("i", ARM_PROC::I)
2660        .Case("f", ARM_PROC::F)
2661        .Default(~0U);
2662
2663      // If some specific iflag is already set, it means that some letter is
2664      // present more than once, this is not acceptable.
2665      if (Flag == ~0U || (IFlags & Flag))
2666        return MatchOperand_NoMatch;
2667
2668      IFlags |= Flag;
2669    }
2670  }
2671
2672  Parser.Lex(); // Eat identifier token.
2673  Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S));
2674  return MatchOperand_Success;
2675}
2676
2677/// parseMSRMaskOperand - Try to parse mask flags from MSR instruction.
2678ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2679parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2680  SMLoc S = Parser.getTok().getLoc();
2681  const AsmToken &Tok = Parser.getTok();
2682  assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
2683  StringRef Mask = Tok.getString();
2684
2685  if (isMClass()) {
2686    // See ARMv6-M 10.1.1
2687    unsigned FlagsVal = StringSwitch<unsigned>(Mask)
2688      .Case("apsr", 0)
2689      .Case("iapsr", 1)
2690      .Case("eapsr", 2)
2691      .Case("xpsr", 3)
2692      .Case("ipsr", 5)
2693      .Case("epsr", 6)
2694      .Case("iepsr", 7)
2695      .Case("msp", 8)
2696      .Case("psp", 9)
2697      .Case("primask", 16)
2698      .Case("basepri", 17)
2699      .Case("basepri_max", 18)
2700      .Case("faultmask", 19)
2701      .Case("control", 20)
2702      .Default(~0U);
2703
2704    if (FlagsVal == ~0U)
2705      return MatchOperand_NoMatch;
2706
2707    if (!hasV7Ops() && FlagsVal >= 17 && FlagsVal <= 19)
2708      // basepri, basepri_max and faultmask only valid for V7m.
2709      return MatchOperand_NoMatch;
2710
2711    Parser.Lex(); // Eat identifier token.
2712    Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S));
2713    return MatchOperand_Success;
2714  }
2715
2716  // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf"
2717  size_t Start = 0, Next = Mask.find('_');
2718  StringRef Flags = "";
2719  std::string SpecReg = Mask.slice(Start, Next).lower();
2720  if (Next != StringRef::npos)
2721    Flags = Mask.slice(Next+1, Mask.size());
2722
2723  // FlagsVal contains the complete mask:
2724  // 3-0: Mask
2725  // 4: Special Reg (cpsr, apsr => 0; spsr => 1)
2726  unsigned FlagsVal = 0;
2727
2728  if (SpecReg == "apsr") {
2729    FlagsVal = StringSwitch<unsigned>(Flags)
2730    .Case("nzcvq",  0x8) // same as CPSR_f
2731    .Case("g",      0x4) // same as CPSR_s
2732    .Case("nzcvqg", 0xc) // same as CPSR_fs
2733    .Default(~0U);
2734
2735    if (FlagsVal == ~0U) {
2736      if (!Flags.empty())
2737        return MatchOperand_NoMatch;
2738      else
2739        FlagsVal = 8; // No flag
2740    }
2741  } else if (SpecReg == "cpsr" || SpecReg == "spsr") {
2742    if (Flags == "all") // cpsr_all is an alias for cpsr_fc
2743      Flags = "fc";
2744    for (int i = 0, e = Flags.size(); i != e; ++i) {
2745      unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1))
2746      .Case("c", 1)
2747      .Case("x", 2)
2748      .Case("s", 4)
2749      .Case("f", 8)
2750      .Default(~0U);
2751
2752      // If some specific flag is already set, it means that some letter is
2753      // present more than once, this is not acceptable.
2754      if (FlagsVal == ~0U || (FlagsVal & Flag))
2755        return MatchOperand_NoMatch;
2756      FlagsVal |= Flag;
2757    }
2758  } else // No match for special register.
2759    return MatchOperand_NoMatch;
2760
2761  // Special register without flags is NOT equivalent to "fc" flags.
2762  // NOTE: This is a divergence from gas' behavior.  Uncommenting the following
2763  // two lines would enable gas compatibility at the expense of breaking
2764  // round-tripping.
2765  //
2766  // if (!FlagsVal)
2767  //  FlagsVal = 0x9;
2768
2769  // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1)
2770  if (SpecReg == "spsr")
2771    FlagsVal |= 16;
2772
2773  Parser.Lex(); // Eat identifier token.
2774  Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S));
2775  return MatchOperand_Success;
2776}
2777
2778ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2779parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op,
2780            int Low, int High) {
2781  const AsmToken &Tok = Parser.getTok();
2782  if (Tok.isNot(AsmToken::Identifier)) {
2783    Error(Parser.getTok().getLoc(), Op + " operand expected.");
2784    return MatchOperand_ParseFail;
2785  }
2786  StringRef ShiftName = Tok.getString();
2787  std::string LowerOp = Op.lower();
2788  std::string UpperOp = Op.upper();
2789  if (ShiftName != LowerOp && ShiftName != UpperOp) {
2790    Error(Parser.getTok().getLoc(), Op + " operand expected.");
2791    return MatchOperand_ParseFail;
2792  }
2793  Parser.Lex(); // Eat shift type token.
2794
2795  // There must be a '#' and a shift amount.
2796  if (Parser.getTok().isNot(AsmToken::Hash)) {
2797    Error(Parser.getTok().getLoc(), "'#' expected");
2798    return MatchOperand_ParseFail;
2799  }
2800  Parser.Lex(); // Eat hash token.
2801
2802  const MCExpr *ShiftAmount;
2803  SMLoc Loc = Parser.getTok().getLoc();
2804  if (getParser().ParseExpression(ShiftAmount)) {
2805    Error(Loc, "illegal expression");
2806    return MatchOperand_ParseFail;
2807  }
2808  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
2809  if (!CE) {
2810    Error(Loc, "constant expression expected");
2811    return MatchOperand_ParseFail;
2812  }
2813  int Val = CE->getValue();
2814  if (Val < Low || Val > High) {
2815    Error(Loc, "immediate value out of range");
2816    return MatchOperand_ParseFail;
2817  }
2818
2819  Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc()));
2820
2821  return MatchOperand_Success;
2822}
2823
2824ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2825parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2826  const AsmToken &Tok = Parser.getTok();
2827  SMLoc S = Tok.getLoc();
2828  if (Tok.isNot(AsmToken::Identifier)) {
2829    Error(Tok.getLoc(), "'be' or 'le' operand expected");
2830    return MatchOperand_ParseFail;
2831  }
2832  int Val = StringSwitch<int>(Tok.getString())
2833    .Case("be", 1)
2834    .Case("le", 0)
2835    .Default(-1);
2836  Parser.Lex(); // Eat the token.
2837
2838  if (Val == -1) {
2839    Error(Tok.getLoc(), "'be' or 'le' operand expected");
2840    return MatchOperand_ParseFail;
2841  }
2842  Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val,
2843                                                                  getContext()),
2844                                           S, Parser.getTok().getLoc()));
2845  return MatchOperand_Success;
2846}
2847
2848/// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT
2849/// instructions. Legal values are:
2850///     lsl #n  'n' in [0,31]
2851///     asr #n  'n' in [1,32]
2852///             n == 32 encoded as n == 0.
2853ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2854parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2855  const AsmToken &Tok = Parser.getTok();
2856  SMLoc S = Tok.getLoc();
2857  if (Tok.isNot(AsmToken::Identifier)) {
2858    Error(S, "shift operator 'asr' or 'lsl' expected");
2859    return MatchOperand_ParseFail;
2860  }
2861  StringRef ShiftName = Tok.getString();
2862  bool isASR;
2863  if (ShiftName == "lsl" || ShiftName == "LSL")
2864    isASR = false;
2865  else if (ShiftName == "asr" || ShiftName == "ASR")
2866    isASR = true;
2867  else {
2868    Error(S, "shift operator 'asr' or 'lsl' expected");
2869    return MatchOperand_ParseFail;
2870  }
2871  Parser.Lex(); // Eat the operator.
2872
2873  // A '#' and a shift amount.
2874  if (Parser.getTok().isNot(AsmToken::Hash)) {
2875    Error(Parser.getTok().getLoc(), "'#' expected");
2876    return MatchOperand_ParseFail;
2877  }
2878  Parser.Lex(); // Eat hash token.
2879
2880  const MCExpr *ShiftAmount;
2881  SMLoc E = Parser.getTok().getLoc();
2882  if (getParser().ParseExpression(ShiftAmount)) {
2883    Error(E, "malformed shift expression");
2884    return MatchOperand_ParseFail;
2885  }
2886  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
2887  if (!CE) {
2888    Error(E, "shift amount must be an immediate");
2889    return MatchOperand_ParseFail;
2890  }
2891
2892  int64_t Val = CE->getValue();
2893  if (isASR) {
2894    // Shift amount must be in [1,32]
2895    if (Val < 1 || Val > 32) {
2896      Error(E, "'asr' shift amount must be in range [1,32]");
2897      return MatchOperand_ParseFail;
2898    }
2899    // asr #32 encoded as asr #0, but is not allowed in Thumb2 mode.
2900    if (isThumb() && Val == 32) {
2901      Error(E, "'asr #32' shift amount not allowed in Thumb mode");
2902      return MatchOperand_ParseFail;
2903    }
2904    if (Val == 32) Val = 0;
2905  } else {
2906    // Shift amount must be in [1,32]
2907    if (Val < 0 || Val > 31) {
2908      Error(E, "'lsr' shift amount must be in range [0,31]");
2909      return MatchOperand_ParseFail;
2910    }
2911  }
2912
2913  E = Parser.getTok().getLoc();
2914  Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E));
2915
2916  return MatchOperand_Success;
2917}
2918
2919/// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family
2920/// of instructions. Legal values are:
2921///     ror #n  'n' in {0, 8, 16, 24}
2922ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2923parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2924  const AsmToken &Tok = Parser.getTok();
2925  SMLoc S = Tok.getLoc();
2926  if (Tok.isNot(AsmToken::Identifier))
2927    return MatchOperand_NoMatch;
2928  StringRef ShiftName = Tok.getString();
2929  if (ShiftName != "ror" && ShiftName != "ROR")
2930    return MatchOperand_NoMatch;
2931  Parser.Lex(); // Eat the operator.
2932
2933  // A '#' and a rotate amount.
2934  if (Parser.getTok().isNot(AsmToken::Hash)) {
2935    Error(Parser.getTok().getLoc(), "'#' expected");
2936    return MatchOperand_ParseFail;
2937  }
2938  Parser.Lex(); // Eat hash token.
2939
2940  const MCExpr *ShiftAmount;
2941  SMLoc E = Parser.getTok().getLoc();
2942  if (getParser().ParseExpression(ShiftAmount)) {
2943    Error(E, "malformed rotate expression");
2944    return MatchOperand_ParseFail;
2945  }
2946  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
2947  if (!CE) {
2948    Error(E, "rotate amount must be an immediate");
2949    return MatchOperand_ParseFail;
2950  }
2951
2952  int64_t Val = CE->getValue();
2953  // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension)
2954  // normally, zero is represented in asm by omitting the rotate operand
2955  // entirely.
2956  if (Val != 8 && Val != 16 && Val != 24 && Val != 0) {
2957    Error(E, "'ror' rotate amount must be 8, 16, or 24");
2958    return MatchOperand_ParseFail;
2959  }
2960
2961  E = Parser.getTok().getLoc();
2962  Operands.push_back(ARMOperand::CreateRotImm(Val, S, E));
2963
2964  return MatchOperand_Success;
2965}
2966
2967ARMAsmParser::OperandMatchResultTy ARMAsmParser::
2968parseBitfield(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
2969  SMLoc S = Parser.getTok().getLoc();
2970  // The bitfield descriptor is really two operands, the LSB and the width.
2971  if (Parser.getTok().isNot(AsmToken::Hash)) {
2972    Error(Parser.getTok().getLoc(), "'#' expected");
2973    return MatchOperand_ParseFail;
2974  }
2975  Parser.Lex(); // Eat hash token.
2976
2977  const MCExpr *LSBExpr;
2978  SMLoc E = Parser.getTok().getLoc();
2979  if (getParser().ParseExpression(LSBExpr)) {
2980    Error(E, "malformed immediate expression");
2981    return MatchOperand_ParseFail;
2982  }
2983  const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(LSBExpr);
2984  if (!CE) {
2985    Error(E, "'lsb' operand must be an immediate");
2986    return MatchOperand_ParseFail;
2987  }
2988
2989  int64_t LSB = CE->getValue();
2990  // The LSB must be in the range [0,31]
2991  if (LSB < 0 || LSB > 31) {
2992    Error(E, "'lsb' operand must be in the range [0,31]");
2993    return MatchOperand_ParseFail;
2994  }
2995  E = Parser.getTok().getLoc();
2996
2997  // Expect another immediate operand.
2998  if (Parser.getTok().isNot(AsmToken::Comma)) {
2999    Error(Parser.getTok().getLoc(), "too few operands");
3000    return MatchOperand_ParseFail;
3001  }
3002  Parser.Lex(); // Eat hash token.
3003  if (Parser.getTok().isNot(AsmToken::Hash)) {
3004    Error(Parser.getTok().getLoc(), "'#' expected");
3005    return MatchOperand_ParseFail;
3006  }
3007  Parser.Lex(); // Eat hash token.
3008
3009  const MCExpr *WidthExpr;
3010  if (getParser().ParseExpression(WidthExpr)) {
3011    Error(E, "malformed immediate expression");
3012    return MatchOperand_ParseFail;
3013  }
3014  CE = dyn_cast<MCConstantExpr>(WidthExpr);
3015  if (!CE) {
3016    Error(E, "'width' operand must be an immediate");
3017    return MatchOperand_ParseFail;
3018  }
3019
3020  int64_t Width = CE->getValue();
3021  // The LSB must be in the range [1,32-lsb]
3022  if (Width < 1 || Width > 32 - LSB) {
3023    Error(E, "'width' operand must be in the range [1,32-lsb]");
3024    return MatchOperand_ParseFail;
3025  }
3026  E = Parser.getTok().getLoc();
3027
3028  Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E));
3029
3030  return MatchOperand_Success;
3031}
3032
3033ARMAsmParser::OperandMatchResultTy ARMAsmParser::
3034parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3035  // Check for a post-index addressing register operand. Specifically:
3036  // postidx_reg := '+' register {, shift}
3037  //              | '-' register {, shift}
3038  //              | register {, shift}
3039
3040  // This method must return MatchOperand_NoMatch without consuming any tokens
3041  // in the case where there is no match, as other alternatives take other
3042  // parse methods.
3043  AsmToken Tok = Parser.getTok();
3044  SMLoc S = Tok.getLoc();
3045  bool haveEaten = false;
3046  bool isAdd = true;
3047  int Reg = -1;
3048  if (Tok.is(AsmToken::Plus)) {
3049    Parser.Lex(); // Eat the '+' token.
3050    haveEaten = true;
3051  } else if (Tok.is(AsmToken::Minus)) {
3052    Parser.Lex(); // Eat the '-' token.
3053    isAdd = false;
3054    haveEaten = true;
3055  }
3056  if (Parser.getTok().is(AsmToken::Identifier))
3057    Reg = tryParseRegister();
3058  if (Reg == -1) {
3059    if (!haveEaten)
3060      return MatchOperand_NoMatch;
3061    Error(Parser.getTok().getLoc(), "register expected");
3062    return MatchOperand_ParseFail;
3063  }
3064  SMLoc E = Parser.getTok().getLoc();
3065
3066  ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift;
3067  unsigned ShiftImm = 0;
3068  if (Parser.getTok().is(AsmToken::Comma)) {
3069    Parser.Lex(); // Eat the ','.
3070    if (parseMemRegOffsetShift(ShiftTy, ShiftImm))
3071      return MatchOperand_ParseFail;
3072  }
3073
3074  Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy,
3075                                                  ShiftImm, S, E));
3076
3077  return MatchOperand_Success;
3078}
3079
3080ARMAsmParser::OperandMatchResultTy ARMAsmParser::
3081parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3082  // Check for a post-index addressing register operand. Specifically:
3083  // am3offset := '+' register
3084  //              | '-' register
3085  //              | register
3086  //              | # imm
3087  //              | # + imm
3088  //              | # - imm
3089
3090  // This method must return MatchOperand_NoMatch without consuming any tokens
3091  // in the case where there is no match, as other alternatives take other
3092  // parse methods.
3093  AsmToken Tok = Parser.getTok();
3094  SMLoc S = Tok.getLoc();
3095
3096  // Do immediates first, as we always parse those if we have a '#'.
3097  if (Parser.getTok().is(AsmToken::Hash)) {
3098    Parser.Lex(); // Eat the '#'.
3099    // Explicitly look for a '-', as we need to encode negative zero
3100    // differently.
3101    bool isNegative = Parser.getTok().is(AsmToken::Minus);
3102    const MCExpr *Offset;
3103    if (getParser().ParseExpression(Offset))
3104      return MatchOperand_ParseFail;
3105    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
3106    if (!CE) {
3107      Error(S, "constant expression expected");
3108      return MatchOperand_ParseFail;
3109    }
3110    SMLoc E = Tok.getLoc();
3111    // Negative zero is encoded as the flag value INT32_MIN.
3112    int32_t Val = CE->getValue();
3113    if (isNegative && Val == 0)
3114      Val = INT32_MIN;
3115
3116    Operands.push_back(
3117      ARMOperand::CreateImm(MCConstantExpr::Create(Val, getContext()), S, E));
3118
3119    return MatchOperand_Success;
3120  }
3121
3122
3123  bool haveEaten = false;
3124  bool isAdd = true;
3125  int Reg = -1;
3126  if (Tok.is(AsmToken::Plus)) {
3127    Parser.Lex(); // Eat the '+' token.
3128    haveEaten = true;
3129  } else if (Tok.is(AsmToken::Minus)) {
3130    Parser.Lex(); // Eat the '-' token.
3131    isAdd = false;
3132    haveEaten = true;
3133  }
3134  if (Parser.getTok().is(AsmToken::Identifier))
3135    Reg = tryParseRegister();
3136  if (Reg == -1) {
3137    if (!haveEaten)
3138      return MatchOperand_NoMatch;
3139    Error(Parser.getTok().getLoc(), "register expected");
3140    return MatchOperand_ParseFail;
3141  }
3142  SMLoc E = Parser.getTok().getLoc();
3143
3144  Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift,
3145                                                  0, S, E));
3146
3147  return MatchOperand_Success;
3148}
3149
3150/// cvtT2LdrdPre - Convert parsed operands to MCInst.
3151/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3152/// when they refer multiple MIOperands inside a single one.
3153bool ARMAsmParser::
3154cvtT2LdrdPre(MCInst &Inst, unsigned Opcode,
3155             const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3156  // Rt, Rt2
3157  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3158  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
3159  // Create a writeback register dummy placeholder.
3160  Inst.addOperand(MCOperand::CreateReg(0));
3161  // addr
3162  ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2);
3163  // pred
3164  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3165  return true;
3166}
3167
3168/// cvtT2StrdPre - Convert parsed operands to MCInst.
3169/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3170/// when they refer multiple MIOperands inside a single one.
3171bool ARMAsmParser::
3172cvtT2StrdPre(MCInst &Inst, unsigned Opcode,
3173             const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3174  // Create a writeback register dummy placeholder.
3175  Inst.addOperand(MCOperand::CreateReg(0));
3176  // Rt, Rt2
3177  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3178  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
3179  // addr
3180  ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2);
3181  // pred
3182  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3183  return true;
3184}
3185
3186/// cvtLdWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst.
3187/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3188/// when they refer multiple MIOperands inside a single one.
3189bool ARMAsmParser::
3190cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
3191                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3192  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3193
3194  // Create a writeback register dummy placeholder.
3195  Inst.addOperand(MCOperand::CreateImm(0));
3196
3197  ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2);
3198  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3199  return true;
3200}
3201
3202/// cvtStWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst.
3203/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3204/// when they refer multiple MIOperands inside a single one.
3205bool ARMAsmParser::
3206cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
3207                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3208  // Create a writeback register dummy placeholder.
3209  Inst.addOperand(MCOperand::CreateImm(0));
3210  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3211  ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2);
3212  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3213  return true;
3214}
3215
3216/// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
3217/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3218/// when they refer multiple MIOperands inside a single one.
3219bool ARMAsmParser::
3220cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
3221                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3222  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3223
3224  // Create a writeback register dummy placeholder.
3225  Inst.addOperand(MCOperand::CreateImm(0));
3226
3227  ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
3228  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3229  return true;
3230}
3231
3232/// cvtLdWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
3233/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3234/// when they refer multiple MIOperands inside a single one.
3235bool ARMAsmParser::
3236cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
3237                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3238  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3239
3240  // Create a writeback register dummy placeholder.
3241  Inst.addOperand(MCOperand::CreateImm(0));
3242
3243  ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
3244  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3245  return true;
3246}
3247
3248
3249/// cvtStWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
3250/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3251/// when they refer multiple MIOperands inside a single one.
3252bool ARMAsmParser::
3253cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
3254                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3255  // Create a writeback register dummy placeholder.
3256  Inst.addOperand(MCOperand::CreateImm(0));
3257  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3258  ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
3259  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3260  return true;
3261}
3262
3263/// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
3264/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3265/// when they refer multiple MIOperands inside a single one.
3266bool ARMAsmParser::
3267cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
3268                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3269  // Create a writeback register dummy placeholder.
3270  Inst.addOperand(MCOperand::CreateImm(0));
3271  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3272  ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
3273  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3274  return true;
3275}
3276
3277/// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
3278/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3279/// when they refer multiple MIOperands inside a single one.
3280bool ARMAsmParser::
3281cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
3282                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3283  // Create a writeback register dummy placeholder.
3284  Inst.addOperand(MCOperand::CreateImm(0));
3285  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3286  ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
3287  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3288  return true;
3289}
3290
3291/// cvtLdExtTWriteBackImm - Convert parsed operands to MCInst.
3292/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3293/// when they refer multiple MIOperands inside a single one.
3294bool ARMAsmParser::
3295cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
3296                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3297  // Rt
3298  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3299  // Create a writeback register dummy placeholder.
3300  Inst.addOperand(MCOperand::CreateImm(0));
3301  // addr
3302  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
3303  // offset
3304  ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
3305  // pred
3306  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3307  return true;
3308}
3309
3310/// cvtLdExtTWriteBackReg - Convert parsed operands to MCInst.
3311/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3312/// when they refer multiple MIOperands inside a single one.
3313bool ARMAsmParser::
3314cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
3315                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3316  // Rt
3317  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3318  // Create a writeback register dummy placeholder.
3319  Inst.addOperand(MCOperand::CreateImm(0));
3320  // addr
3321  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
3322  // offset
3323  ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
3324  // pred
3325  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3326  return true;
3327}
3328
3329/// cvtStExtTWriteBackImm - Convert parsed operands to MCInst.
3330/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3331/// when they refer multiple MIOperands inside a single one.
3332bool ARMAsmParser::
3333cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
3334                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3335  // Create a writeback register dummy placeholder.
3336  Inst.addOperand(MCOperand::CreateImm(0));
3337  // Rt
3338  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3339  // addr
3340  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
3341  // offset
3342  ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
3343  // pred
3344  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3345  return true;
3346}
3347
3348/// cvtStExtTWriteBackReg - Convert parsed operands to MCInst.
3349/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3350/// when they refer multiple MIOperands inside a single one.
3351bool ARMAsmParser::
3352cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
3353                      const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3354  // Create a writeback register dummy placeholder.
3355  Inst.addOperand(MCOperand::CreateImm(0));
3356  // Rt
3357  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3358  // addr
3359  ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
3360  // offset
3361  ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
3362  // pred
3363  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3364  return true;
3365}
3366
3367/// cvtLdrdPre - Convert parsed operands to MCInst.
3368/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3369/// when they refer multiple MIOperands inside a single one.
3370bool ARMAsmParser::
3371cvtLdrdPre(MCInst &Inst, unsigned Opcode,
3372           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3373  // Rt, Rt2
3374  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3375  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
3376  // Create a writeback register dummy placeholder.
3377  Inst.addOperand(MCOperand::CreateImm(0));
3378  // addr
3379  ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
3380  // pred
3381  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3382  return true;
3383}
3384
3385/// cvtStrdPre - Convert parsed operands to MCInst.
3386/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3387/// when they refer multiple MIOperands inside a single one.
3388bool ARMAsmParser::
3389cvtStrdPre(MCInst &Inst, unsigned Opcode,
3390           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3391  // Create a writeback register dummy placeholder.
3392  Inst.addOperand(MCOperand::CreateImm(0));
3393  // Rt, Rt2
3394  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3395  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
3396  // addr
3397  ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
3398  // pred
3399  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3400  return true;
3401}
3402
3403/// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
3404/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3405/// when they refer multiple MIOperands inside a single one.
3406bool ARMAsmParser::
3407cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
3408                         const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3409  ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
3410  // Create a writeback register dummy placeholder.
3411  Inst.addOperand(MCOperand::CreateImm(0));
3412  ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
3413  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3414  return true;
3415}
3416
3417/// cvtThumbMultiple- Convert parsed operands to MCInst.
3418/// Needed here because the Asm Gen Matcher can't handle properly tied operands
3419/// when they refer multiple MIOperands inside a single one.
3420bool ARMAsmParser::
3421cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
3422           const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3423  // The second source operand must be the same register as the destination
3424  // operand.
3425  if (Operands.size() == 6 &&
3426      (((ARMOperand*)Operands[3])->getReg() !=
3427       ((ARMOperand*)Operands[5])->getReg()) &&
3428      (((ARMOperand*)Operands[3])->getReg() !=
3429       ((ARMOperand*)Operands[4])->getReg())) {
3430    Error(Operands[3]->getStartLoc(),
3431          "destination register must match source register");
3432    return false;
3433  }
3434  ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
3435  ((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1);
3436  // If we have a three-operand form, make sure to set Rn to be the operand
3437  // that isn't the same as Rd.
3438  unsigned RegOp = 4;
3439  if (Operands.size() == 6 &&
3440      ((ARMOperand*)Operands[4])->getReg() ==
3441        ((ARMOperand*)Operands[3])->getReg())
3442    RegOp = 5;
3443  ((ARMOperand*)Operands[RegOp])->addRegOperands(Inst, 1);
3444  Inst.addOperand(Inst.getOperand(0));
3445  ((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2);
3446
3447  return true;
3448}
3449
3450bool ARMAsmParser::
3451cvtVLDwbFixed(MCInst &Inst, unsigned Opcode,
3452              const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3453  // Vd
3454  ((ARMOperand*)Operands[3])->addVecListTwoDOperands(Inst, 1);
3455  // Create a writeback register dummy placeholder.
3456  Inst.addOperand(MCOperand::CreateImm(0));
3457  // Vn
3458  ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2);
3459  // pred
3460  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3461  return true;
3462}
3463
3464bool ARMAsmParser::
3465cvtVLDwbRegister(MCInst &Inst, unsigned Opcode,
3466                 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3467  // Vd
3468  ((ARMOperand*)Operands[3])->addVecListTwoDOperands(Inst, 1);
3469  // Create a writeback register dummy placeholder.
3470  Inst.addOperand(MCOperand::CreateImm(0));
3471  // Vn
3472  ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2);
3473  // Vm
3474  ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1);
3475  // pred
3476  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3477  return true;
3478}
3479
3480bool ARMAsmParser::
3481cvtVSTwbFixed(MCInst &Inst, unsigned Opcode,
3482              const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3483  // Create a writeback register dummy placeholder.
3484  Inst.addOperand(MCOperand::CreateImm(0));
3485  // Vn
3486  ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2);
3487  // Vt
3488  ((ARMOperand*)Operands[3])->addVecListTwoDOperands(Inst, 1);
3489  // pred
3490  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3491  return true;
3492}
3493
3494bool ARMAsmParser::
3495cvtVSTwbRegister(MCInst &Inst, unsigned Opcode,
3496                 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3497  // Create a writeback register dummy placeholder.
3498  Inst.addOperand(MCOperand::CreateImm(0));
3499  // Vn
3500  ((ARMOperand*)Operands[4])->addAlignedMemoryOperands(Inst, 2);
3501  // Vm
3502  ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1);
3503  // Vt
3504  ((ARMOperand*)Operands[3])->addVecListTwoDOperands(Inst, 1);
3505  // pred
3506  ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
3507  return true;
3508}
3509
3510/// Parse an ARM memory expression, return false if successful else return true
3511/// or an error.  The first token must be a '[' when called.
3512bool ARMAsmParser::
3513parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3514  SMLoc S, E;
3515  assert(Parser.getTok().is(AsmToken::LBrac) &&
3516         "Token is not a Left Bracket");
3517  S = Parser.getTok().getLoc();
3518  Parser.Lex(); // Eat left bracket token.
3519
3520  const AsmToken &BaseRegTok = Parser.getTok();
3521  int BaseRegNum = tryParseRegister();
3522  if (BaseRegNum == -1)
3523    return Error(BaseRegTok.getLoc(), "register expected");
3524
3525  // The next token must either be a comma or a closing bracket.
3526  const AsmToken &Tok = Parser.getTok();
3527  if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac))
3528    return Error(Tok.getLoc(), "malformed memory operand");
3529
3530  if (Tok.is(AsmToken::RBrac)) {
3531    E = Tok.getLoc();
3532    Parser.Lex(); // Eat right bracket token.
3533
3534    Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift,
3535                                             0, 0, false, S, E));
3536
3537    // If there's a pre-indexing writeback marker, '!', just add it as a token
3538    // operand. It's rather odd, but syntactically valid.
3539    if (Parser.getTok().is(AsmToken::Exclaim)) {
3540      Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
3541      Parser.Lex(); // Eat the '!'.
3542    }
3543
3544    return false;
3545  }
3546
3547  assert(Tok.is(AsmToken::Comma) && "Lost comma in memory operand?!");
3548  Parser.Lex(); // Eat the comma.
3549
3550  // If we have a ':', it's an alignment specifier.
3551  if (Parser.getTok().is(AsmToken::Colon)) {
3552    Parser.Lex(); // Eat the ':'.
3553    E = Parser.getTok().getLoc();
3554
3555    const MCExpr *Expr;
3556    if (getParser().ParseExpression(Expr))
3557     return true;
3558
3559    // The expression has to be a constant. Memory references with relocations
3560    // don't come through here, as they use the <label> forms of the relevant
3561    // instructions.
3562    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
3563    if (!CE)
3564      return Error (E, "constant expression expected");
3565
3566    unsigned Align = 0;
3567    switch (CE->getValue()) {
3568    default:
3569      return Error(E, "alignment specifier must be 64, 128, or 256 bits");
3570    case 64:  Align = 8; break;
3571    case 128: Align = 16; break;
3572    case 256: Align = 32; break;
3573    }
3574
3575    // Now we should have the closing ']'
3576    E = Parser.getTok().getLoc();
3577    if (Parser.getTok().isNot(AsmToken::RBrac))
3578      return Error(E, "']' expected");
3579    Parser.Lex(); // Eat right bracket token.
3580
3581    // Don't worry about range checking the value here. That's handled by
3582    // the is*() predicates.
3583    Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0,
3584                                             ARM_AM::no_shift, 0, Align,
3585                                             false, S, E));
3586
3587    // If there's a pre-indexing writeback marker, '!', just add it as a token
3588    // operand.
3589    if (Parser.getTok().is(AsmToken::Exclaim)) {
3590      Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
3591      Parser.Lex(); // Eat the '!'.
3592    }
3593
3594    return false;
3595  }
3596
3597  // If we have a '#', it's an immediate offset, else assume it's a register
3598  // offset.
3599  if (Parser.getTok().is(AsmToken::Hash)) {
3600    Parser.Lex(); // Eat the '#'.
3601    E = Parser.getTok().getLoc();
3602
3603    bool isNegative = getParser().getTok().is(AsmToken::Minus);
3604    const MCExpr *Offset;
3605    if (getParser().ParseExpression(Offset))
3606     return true;
3607
3608    // The expression has to be a constant. Memory references with relocations
3609    // don't come through here, as they use the <label> forms of the relevant
3610    // instructions.
3611    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
3612    if (!CE)
3613      return Error (E, "constant expression expected");
3614
3615    // If the constant was #-0, represent it as INT32_MIN.
3616    int32_t Val = CE->getValue();
3617    if (isNegative && Val == 0)
3618      CE = MCConstantExpr::Create(INT32_MIN, getContext());
3619
3620    // Now we should have the closing ']'
3621    E = Parser.getTok().getLoc();
3622    if (Parser.getTok().isNot(AsmToken::RBrac))
3623      return Error(E, "']' expected");
3624    Parser.Lex(); // Eat right bracket token.
3625
3626    // Don't worry about range checking the value here. That's handled by
3627    // the is*() predicates.
3628    Operands.push_back(ARMOperand::CreateMem(BaseRegNum, CE, 0,
3629                                             ARM_AM::no_shift, 0, 0,
3630                                             false, S, E));
3631
3632    // If there's a pre-indexing writeback marker, '!', just add it as a token
3633    // operand.
3634    if (Parser.getTok().is(AsmToken::Exclaim)) {
3635      Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
3636      Parser.Lex(); // Eat the '!'.
3637    }
3638
3639    return false;
3640  }
3641
3642  // The register offset is optionally preceded by a '+' or '-'
3643  bool isNegative = false;
3644  if (Parser.getTok().is(AsmToken::Minus)) {
3645    isNegative = true;
3646    Parser.Lex(); // Eat the '-'.
3647  } else if (Parser.getTok().is(AsmToken::Plus)) {
3648    // Nothing to do.
3649    Parser.Lex(); // Eat the '+'.
3650  }
3651
3652  E = Parser.getTok().getLoc();
3653  int OffsetRegNum = tryParseRegister();
3654  if (OffsetRegNum == -1)
3655    return Error(E, "register expected");
3656
3657  // If there's a shift operator, handle it.
3658  ARM_AM::ShiftOpc ShiftType = ARM_AM::no_shift;
3659  unsigned ShiftImm = 0;
3660  if (Parser.getTok().is(AsmToken::Comma)) {
3661    Parser.Lex(); // Eat the ','.
3662    if (parseMemRegOffsetShift(ShiftType, ShiftImm))
3663      return true;
3664  }
3665
3666  // Now we should have the closing ']'
3667  E = Parser.getTok().getLoc();
3668  if (Parser.getTok().isNot(AsmToken::RBrac))
3669    return Error(E, "']' expected");
3670  Parser.Lex(); // Eat right bracket token.
3671
3672  Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum,
3673                                           ShiftType, ShiftImm, 0, isNegative,
3674                                           S, E));
3675
3676  // If there's a pre-indexing writeback marker, '!', just add it as a token
3677  // operand.
3678  if (Parser.getTok().is(AsmToken::Exclaim)) {
3679    Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
3680    Parser.Lex(); // Eat the '!'.
3681  }
3682
3683  return false;
3684}
3685
3686/// parseMemRegOffsetShift - one of these two:
3687///   ( lsl | lsr | asr | ror ) , # shift_amount
3688///   rrx
3689/// return true if it parses a shift otherwise it returns false.
3690bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St,
3691                                          unsigned &Amount) {
3692  SMLoc Loc = Parser.getTok().getLoc();
3693  const AsmToken &Tok = Parser.getTok();
3694  if (Tok.isNot(AsmToken::Identifier))
3695    return true;
3696  StringRef ShiftName = Tok.getString();
3697  if (ShiftName == "lsl" || ShiftName == "LSL")
3698    St = ARM_AM::lsl;
3699  else if (ShiftName == "lsr" || ShiftName == "LSR")
3700    St = ARM_AM::lsr;
3701  else if (ShiftName == "asr" || ShiftName == "ASR")
3702    St = ARM_AM::asr;
3703  else if (ShiftName == "ror" || ShiftName == "ROR")
3704    St = ARM_AM::ror;
3705  else if (ShiftName == "rrx" || ShiftName == "RRX")
3706    St = ARM_AM::rrx;
3707  else
3708    return Error(Loc, "illegal shift operator");
3709  Parser.Lex(); // Eat shift type token.
3710
3711  // rrx stands alone.
3712  Amount = 0;
3713  if (St != ARM_AM::rrx) {
3714    Loc = Parser.getTok().getLoc();
3715    // A '#' and a shift amount.
3716    const AsmToken &HashTok = Parser.getTok();
3717    if (HashTok.isNot(AsmToken::Hash))
3718      return Error(HashTok.getLoc(), "'#' expected");
3719    Parser.Lex(); // Eat hash token.
3720
3721    const MCExpr *Expr;
3722    if (getParser().ParseExpression(Expr))
3723      return true;
3724    // Range check the immediate.
3725    // lsl, ror: 0 <= imm <= 31
3726    // lsr, asr: 0 <= imm <= 32
3727    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
3728    if (!CE)
3729      return Error(Loc, "shift amount must be an immediate");
3730    int64_t Imm = CE->getValue();
3731    if (Imm < 0 ||
3732        ((St == ARM_AM::lsl || St == ARM_AM::ror) && Imm > 31) ||
3733        ((St == ARM_AM::lsr || St == ARM_AM::asr) && Imm > 32))
3734      return Error(Loc, "immediate shift value out of range");
3735    Amount = Imm;
3736  }
3737
3738  return false;
3739}
3740
3741/// parseFPImm - A floating point immediate expression operand.
3742ARMAsmParser::OperandMatchResultTy ARMAsmParser::
3743parseFPImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3744  SMLoc S = Parser.getTok().getLoc();
3745
3746  if (Parser.getTok().isNot(AsmToken::Hash))
3747    return MatchOperand_NoMatch;
3748
3749  // Disambiguate the VMOV forms that can accept an FP immediate.
3750  // vmov.f32 <sreg>, #imm
3751  // vmov.f64 <dreg>, #imm
3752  // vmov.f32 <dreg>, #imm  @ vector f32x2
3753  // vmov.f32 <qreg>, #imm  @ vector f32x4
3754  //
3755  // There are also the NEON VMOV instructions which expect an
3756  // integer constant. Make sure we don't try to parse an FPImm
3757  // for these:
3758  // vmov.i{8|16|32|64} <dreg|qreg>, #imm
3759  ARMOperand *TyOp = static_cast<ARMOperand*>(Operands[2]);
3760  if (!TyOp->isToken() || (TyOp->getToken() != ".f32" &&
3761                           TyOp->getToken() != ".f64"))
3762    return MatchOperand_NoMatch;
3763
3764  Parser.Lex(); // Eat the '#'.
3765
3766  // Handle negation, as that still comes through as a separate token.
3767  bool isNegative = false;
3768  if (Parser.getTok().is(AsmToken::Minus)) {
3769    isNegative = true;
3770    Parser.Lex();
3771  }
3772  const AsmToken &Tok = Parser.getTok();
3773  if (Tok.is(AsmToken::Real)) {
3774    APFloat RealVal(APFloat::IEEEdouble, Tok.getString());
3775    uint64_t IntVal = RealVal.bitcastToAPInt().getZExtValue();
3776    // If we had a '-' in front, toggle the sign bit.
3777    IntVal ^= (uint64_t)isNegative << 63;
3778    int Val = ARM_AM::getFP64Imm(APInt(64, IntVal));
3779    Parser.Lex(); // Eat the token.
3780    if (Val == -1) {
3781      TokError("floating point value out of range");
3782      return MatchOperand_ParseFail;
3783    }
3784    Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext()));
3785    return MatchOperand_Success;
3786  }
3787  if (Tok.is(AsmToken::Integer)) {
3788    int64_t Val = Tok.getIntVal();
3789    Parser.Lex(); // Eat the token.
3790    if (Val > 255 || Val < 0) {
3791      TokError("encoded floating point value out of range");
3792      return MatchOperand_ParseFail;
3793    }
3794    Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext()));
3795    return MatchOperand_Success;
3796  }
3797
3798  TokError("invalid floating point immediate");
3799  return MatchOperand_ParseFail;
3800}
3801/// Parse a arm instruction operand.  For now this parses the operand regardless
3802/// of the mnemonic.
3803bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
3804                                StringRef Mnemonic) {
3805  SMLoc S, E;
3806
3807  // Check if the current operand has a custom associated parser, if so, try to
3808  // custom parse the operand, or fallback to the general approach.
3809  OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
3810  if (ResTy == MatchOperand_Success)
3811    return false;
3812  // If there wasn't a custom match, try the generic matcher below. Otherwise,
3813  // there was a match, but an error occurred, in which case, just return that
3814  // the operand parsing failed.
3815  if (ResTy == MatchOperand_ParseFail)
3816    return true;
3817
3818  switch (getLexer().getKind()) {
3819  default:
3820    Error(Parser.getTok().getLoc(), "unexpected token in operand");
3821    return true;
3822  case AsmToken::Identifier: {
3823    // If this is VMRS, check for the apsr_nzcv operand.
3824    if (!tryParseRegisterWithWriteBack(Operands))
3825      return false;
3826    int Res = tryParseShiftRegister(Operands);
3827    if (Res == 0) // success
3828      return false;
3829    else if (Res == -1) // irrecoverable error
3830      return true;
3831    if (Mnemonic == "vmrs" && Parser.getTok().getString() == "apsr_nzcv") {
3832      S = Parser.getTok().getLoc();
3833      Parser.Lex();
3834      Operands.push_back(ARMOperand::CreateToken("apsr_nzcv", S));
3835      return false;
3836    }
3837
3838    // Fall though for the Identifier case that is not a register or a
3839    // special name.
3840  }
3841  case AsmToken::LParen:  // parenthesized expressions like (_strcmp-4)
3842  case AsmToken::Integer: // things like 1f and 2b as a branch targets
3843  case AsmToken::String:  // quoted label names.
3844  case AsmToken::Dot: {   // . as a branch target
3845    // This was not a register so parse other operands that start with an
3846    // identifier (like labels) as expressions and create them as immediates.
3847    const MCExpr *IdVal;
3848    S = Parser.getTok().getLoc();
3849    if (getParser().ParseExpression(IdVal))
3850      return true;
3851    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
3852    Operands.push_back(ARMOperand::CreateImm(IdVal, S, E));
3853    return false;
3854  }
3855  case AsmToken::LBrac:
3856    return parseMemory(Operands);
3857  case AsmToken::LCurly:
3858    return parseRegisterList(Operands);
3859  case AsmToken::Hash: {
3860    // #42 -> immediate.
3861    // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate
3862    S = Parser.getTok().getLoc();
3863    Parser.Lex();
3864    bool isNegative = Parser.getTok().is(AsmToken::Minus);
3865    const MCExpr *ImmVal;
3866    if (getParser().ParseExpression(ImmVal))
3867      return true;
3868    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmVal);
3869    if (CE) {
3870      int32_t Val = CE->getValue();
3871      if (isNegative && Val == 0)
3872        ImmVal = MCConstantExpr::Create(INT32_MIN, getContext());
3873    }
3874    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
3875    Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E));
3876    return false;
3877  }
3878  case AsmToken::Colon: {
3879    // ":lower16:" and ":upper16:" expression prefixes
3880    // FIXME: Check it's an expression prefix,
3881    // e.g. (FOO - :lower16:BAR) isn't legal.
3882    ARMMCExpr::VariantKind RefKind;
3883    if (parsePrefix(RefKind))
3884      return true;
3885
3886    const MCExpr *SubExprVal;
3887    if (getParser().ParseExpression(SubExprVal))
3888      return true;
3889
3890    const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal,
3891                                                   getContext());
3892    E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
3893    Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E));
3894    return false;
3895  }
3896  }
3897}
3898
3899// parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e.
3900//  :lower16: and :upper16:.
3901bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
3902  RefKind = ARMMCExpr::VK_ARM_None;
3903
3904  // :lower16: and :upper16: modifiers
3905  assert(getLexer().is(AsmToken::Colon) && "expected a :");
3906  Parser.Lex(); // Eat ':'
3907
3908  if (getLexer().isNot(AsmToken::Identifier)) {
3909    Error(Parser.getTok().getLoc(), "expected prefix identifier in operand");
3910    return true;
3911  }
3912
3913  StringRef IDVal = Parser.getTok().getIdentifier();
3914  if (IDVal == "lower16") {
3915    RefKind = ARMMCExpr::VK_ARM_LO16;
3916  } else if (IDVal == "upper16") {
3917    RefKind = ARMMCExpr::VK_ARM_HI16;
3918  } else {
3919    Error(Parser.getTok().getLoc(), "unexpected prefix in operand");
3920    return true;
3921  }
3922  Parser.Lex();
3923
3924  if (getLexer().isNot(AsmToken::Colon)) {
3925    Error(Parser.getTok().getLoc(), "unexpected token after prefix");
3926    return true;
3927  }
3928  Parser.Lex(); // Eat the last ':'
3929  return false;
3930}
3931
3932/// \brief Given a mnemonic, split out possible predication code and carry
3933/// setting letters to form a canonical mnemonic and flags.
3934//
3935// FIXME: Would be nice to autogen this.
3936// FIXME: This is a bit of a maze of special cases.
3937StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic,
3938                                      unsigned &PredicationCode,
3939                                      bool &CarrySetting,
3940                                      unsigned &ProcessorIMod,
3941                                      StringRef &ITMask) {
3942  PredicationCode = ARMCC::AL;
3943  CarrySetting = false;
3944  ProcessorIMod = 0;
3945
3946  // Ignore some mnemonics we know aren't predicated forms.
3947  //
3948  // FIXME: Would be nice to autogen this.
3949  if ((Mnemonic == "movs" && isThumb()) ||
3950      Mnemonic == "teq"   || Mnemonic == "vceq"   || Mnemonic == "svc"   ||
3951      Mnemonic == "mls"   || Mnemonic == "smmls"  || Mnemonic == "vcls"  ||
3952      Mnemonic == "vmls"  || Mnemonic == "vnmls"  || Mnemonic == "vacge" ||
3953      Mnemonic == "vcge"  || Mnemonic == "vclt"   || Mnemonic == "vacgt" ||
3954      Mnemonic == "vcgt"  || Mnemonic == "vcle"   || Mnemonic == "smlal" ||
3955      Mnemonic == "umaal" || Mnemonic == "umlal"  || Mnemonic == "vabal" ||
3956      Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal")
3957    return Mnemonic;
3958
3959  // First, split out any predication code. Ignore mnemonics we know aren't
3960  // predicated but do have a carry-set and so weren't caught above.
3961  if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" &&
3962      Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" &&
3963      Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" &&
3964      Mnemonic != "sbcs" && Mnemonic != "rscs") {
3965    unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
3966      .Case("eq", ARMCC::EQ)
3967      .Case("ne", ARMCC::NE)
3968      .Case("hs", ARMCC::HS)
3969      .Case("cs", ARMCC::HS)
3970      .Case("lo", ARMCC::LO)
3971      .Case("cc", ARMCC::LO)
3972      .Case("mi", ARMCC::MI)
3973      .Case("pl", ARMCC::PL)
3974      .Case("vs", ARMCC::VS)
3975      .Case("vc", ARMCC::VC)
3976      .Case("hi", ARMCC::HI)
3977      .Case("ls", ARMCC::LS)
3978      .Case("ge", ARMCC::GE)
3979      .Case("lt", ARMCC::LT)
3980      .Case("gt", ARMCC::GT)
3981      .Case("le", ARMCC::LE)
3982      .Case("al", ARMCC::AL)
3983      .Default(~0U);
3984    if (CC != ~0U) {
3985      Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
3986      PredicationCode = CC;
3987    }
3988  }
3989
3990  // Next, determine if we have a carry setting bit. We explicitly ignore all
3991  // the instructions we know end in 's'.
3992  if (Mnemonic.endswith("s") &&
3993      !(Mnemonic == "cps" || Mnemonic == "mls" ||
3994        Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" ||
3995        Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" ||
3996        Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" ||
3997        Mnemonic == "vrsqrts" || Mnemonic == "srs" ||
3998        (Mnemonic == "movs" && isThumb()))) {
3999    Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1);
4000    CarrySetting = true;
4001  }
4002
4003  // The "cps" instruction can have a interrupt mode operand which is glued into
4004  // the mnemonic. Check if this is the case, split it and parse the imod op
4005  if (Mnemonic.startswith("cps")) {
4006    // Split out any imod code.
4007    unsigned IMod =
4008      StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2))
4009      .Case("ie", ARM_PROC::IE)
4010      .Case("id", ARM_PROC::ID)
4011      .Default(~0U);
4012    if (IMod != ~0U) {
4013      Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2);
4014      ProcessorIMod = IMod;
4015    }
4016  }
4017
4018  // The "it" instruction has the condition mask on the end of the mnemonic.
4019  if (Mnemonic.startswith("it")) {
4020    ITMask = Mnemonic.slice(2, Mnemonic.size());
4021    Mnemonic = Mnemonic.slice(0, 2);
4022  }
4023
4024  return Mnemonic;
4025}
4026
4027/// \brief Given a canonical mnemonic, determine if the instruction ever allows
4028/// inclusion of carry set or predication code operands.
4029//
4030// FIXME: It would be nice to autogen this.
4031void ARMAsmParser::
4032getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
4033                      bool &CanAcceptPredicationCode) {
4034  if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
4035      Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
4036      Mnemonic == "add" || Mnemonic == "adc" ||
4037      Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" ||
4038      Mnemonic == "orr" || Mnemonic == "mvn" ||
4039      Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" ||
4040      Mnemonic == "sbc" || Mnemonic == "eor" || Mnemonic == "neg" ||
4041      (!isThumb() && (Mnemonic == "smull" || Mnemonic == "mov" ||
4042                      Mnemonic == "mla" || Mnemonic == "smlal" ||
4043                      Mnemonic == "umlal" || Mnemonic == "umull"))) {
4044    CanAcceptCarrySet = true;
4045  } else
4046    CanAcceptCarrySet = false;
4047
4048  if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" ||
4049      Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" ||
4050      Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" ||
4051      Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" ||
4052      Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "setend" ||
4053      (Mnemonic == "clrex" && !isThumb()) ||
4054      (Mnemonic == "nop" && isThumbOne()) ||
4055      ((Mnemonic == "pld" || Mnemonic == "pli" || Mnemonic == "pldw" ||
4056        Mnemonic == "ldc2" || Mnemonic == "ldc2l" ||
4057        Mnemonic == "stc2" || Mnemonic == "stc2l") && !isThumb()) ||
4058      ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs")) &&
4059       !isThumb()) ||
4060      Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumbOne())) {
4061    CanAcceptPredicationCode = false;
4062  } else
4063    CanAcceptPredicationCode = true;
4064
4065  if (isThumb()) {
4066    if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" ||
4067        Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp")
4068      CanAcceptPredicationCode = false;
4069  }
4070}
4071
4072bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic,
4073                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4074  // FIXME: This is all horribly hacky. We really need a better way to deal
4075  // with optional operands like this in the matcher table.
4076
4077  // The 'mov' mnemonic is special. One variant has a cc_out operand, while
4078  // another does not. Specifically, the MOVW instruction does not. So we
4079  // special case it here and remove the defaulted (non-setting) cc_out
4080  // operand if that's the instruction we're trying to match.
4081  //
4082  // We do this as post-processing of the explicit operands rather than just
4083  // conditionally adding the cc_out in the first place because we need
4084  // to check the type of the parsed immediate operand.
4085  if (Mnemonic == "mov" && Operands.size() > 4 && !isThumb() &&
4086      !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() &&
4087      static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() &&
4088      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
4089    return true;
4090
4091  // Register-register 'add' for thumb does not have a cc_out operand
4092  // when there are only two register operands.
4093  if (isThumb() && Mnemonic == "add" && Operands.size() == 5 &&
4094      static_cast<ARMOperand*>(Operands[3])->isReg() &&
4095      static_cast<ARMOperand*>(Operands[4])->isReg() &&
4096      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
4097    return true;
4098  // Register-register 'add' for thumb does not have a cc_out operand
4099  // when it's an ADD Rdm, SP, {Rdm|#imm0_255} instruction. We do
4100  // have to check the immediate range here since Thumb2 has a variant
4101  // that can handle a different range and has a cc_out operand.
4102  if (((isThumb() && Mnemonic == "add") ||
4103       (isThumbTwo() && Mnemonic == "sub")) &&
4104      Operands.size() == 6 &&
4105      static_cast<ARMOperand*>(Operands[3])->isReg() &&
4106      static_cast<ARMOperand*>(Operands[4])->isReg() &&
4107      static_cast<ARMOperand*>(Operands[4])->getReg() == ARM::SP &&
4108      static_cast<ARMOperand*>(Operands[1])->getReg() == 0 &&
4109      (static_cast<ARMOperand*>(Operands[5])->isReg() ||
4110       static_cast<ARMOperand*>(Operands[5])->isImm0_1020s4()))
4111    return true;
4112  // For Thumb2, add/sub immediate does not have a cc_out operand for the
4113  // imm0_4095 variant. That's the least-preferred variant when
4114  // selecting via the generic "add" mnemonic, so to know that we
4115  // should remove the cc_out operand, we have to explicitly check that
4116  // it's not one of the other variants. Ugh.
4117  if (isThumbTwo() && (Mnemonic == "add" || Mnemonic == "sub") &&
4118      Operands.size() == 6 &&
4119      static_cast<ARMOperand*>(Operands[3])->isReg() &&
4120      static_cast<ARMOperand*>(Operands[4])->isReg() &&
4121      static_cast<ARMOperand*>(Operands[5])->isImm()) {
4122    // Nest conditions rather than one big 'if' statement for readability.
4123    //
4124    // If either register is a high reg, it's either one of the SP
4125    // variants (handled above) or a 32-bit encoding, so we just
4126    // check against T3.
4127    if ((!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) ||
4128         !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg())) &&
4129        static_cast<ARMOperand*>(Operands[5])->isT2SOImm())
4130      return false;
4131    // If both registers are low, we're in an IT block, and the immediate is
4132    // in range, we should use encoding T1 instead, which has a cc_out.
4133    if (inITBlock() &&
4134        isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) &&
4135        isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) &&
4136        static_cast<ARMOperand*>(Operands[5])->isImm0_7())
4137      return false;
4138
4139    // Otherwise, we use encoding T4, which does not have a cc_out
4140    // operand.
4141    return true;
4142  }
4143
4144  // The thumb2 multiply instruction doesn't have a CCOut register, so
4145  // if we have a "mul" mnemonic in Thumb mode, check if we'll be able to
4146  // use the 16-bit encoding or not.
4147  if (isThumbTwo() && Mnemonic == "mul" && Operands.size() == 6 &&
4148      static_cast<ARMOperand*>(Operands[1])->getReg() == 0 &&
4149      static_cast<ARMOperand*>(Operands[3])->isReg() &&
4150      static_cast<ARMOperand*>(Operands[4])->isReg() &&
4151      static_cast<ARMOperand*>(Operands[5])->isReg() &&
4152      // If the registers aren't low regs, the destination reg isn't the
4153      // same as one of the source regs, or the cc_out operand is zero
4154      // outside of an IT block, we have to use the 32-bit encoding, so
4155      // remove the cc_out operand.
4156      (!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) ||
4157       !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) ||
4158       !inITBlock() ||
4159       (static_cast<ARMOperand*>(Operands[3])->getReg() !=
4160        static_cast<ARMOperand*>(Operands[5])->getReg() &&
4161        static_cast<ARMOperand*>(Operands[3])->getReg() !=
4162        static_cast<ARMOperand*>(Operands[4])->getReg())))
4163    return true;
4164
4165
4166
4167  // Register-register 'add/sub' for thumb does not have a cc_out operand
4168  // when it's an ADD/SUB SP, #imm. Be lenient on count since there's also
4169  // the "add/sub SP, SP, #imm" version. If the follow-up operands aren't
4170  // right, this will result in better diagnostics (which operand is off)
4171  // anyway.
4172  if (isThumb() && (Mnemonic == "add" || Mnemonic == "sub") &&
4173      (Operands.size() == 5 || Operands.size() == 6) &&
4174      static_cast<ARMOperand*>(Operands[3])->isReg() &&
4175      static_cast<ARMOperand*>(Operands[3])->getReg() == ARM::SP &&
4176      static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
4177    return true;
4178
4179  return false;
4180}
4181
4182static bool isDataTypeToken(StringRef Tok) {
4183  return Tok == ".8" || Tok == ".16" || Tok == ".32" || Tok == ".64" ||
4184    Tok == ".i8" || Tok == ".i16" || Tok == ".i32" || Tok == ".i64" ||
4185    Tok == ".u8" || Tok == ".u16" || Tok == ".u32" || Tok == ".u64" ||
4186    Tok == ".s8" || Tok == ".s16" || Tok == ".s32" || Tok == ".s64" ||
4187    Tok == ".p8" || Tok == ".p16" || Tok == ".f32" || Tok == ".f64" ||
4188    Tok == ".f" || Tok == ".d";
4189}
4190
4191// FIXME: This bit should probably be handled via an explicit match class
4192// in the .td files that matches the suffix instead of having it be
4193// a literal string token the way it is now.
4194static bool doesIgnoreDataTypeSuffix(StringRef Mnemonic, StringRef DT) {
4195  return Mnemonic.startswith("vldm") || Mnemonic.startswith("vstm");
4196}
4197
4198/// Parse an arm instruction mnemonic followed by its operands.
4199bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
4200                               SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4201  // Create the leading tokens for the mnemonic, split by '.' characters.
4202  size_t Start = 0, Next = Name.find('.');
4203  StringRef Mnemonic = Name.slice(Start, Next);
4204
4205  // Split out the predication code and carry setting flag from the mnemonic.
4206  unsigned PredicationCode;
4207  unsigned ProcessorIMod;
4208  bool CarrySetting;
4209  StringRef ITMask;
4210  Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting,
4211                           ProcessorIMod, ITMask);
4212
4213  // In Thumb1, only the branch (B) instruction can be predicated.
4214  if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {
4215    Parser.EatToEndOfStatement();
4216    return Error(NameLoc, "conditional execution not supported in Thumb1");
4217  }
4218
4219  Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc));
4220
4221  // Handle the IT instruction ITMask. Convert it to a bitmask. This
4222  // is the mask as it will be for the IT encoding if the conditional
4223  // encoding has a '1' as it's bit0 (i.e. 't' ==> '1'). In the case
4224  // where the conditional bit0 is zero, the instruction post-processing
4225  // will adjust the mask accordingly.
4226  if (Mnemonic == "it") {
4227    SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + 2);
4228    if (ITMask.size() > 3) {
4229      Parser.EatToEndOfStatement();
4230      return Error(Loc, "too many conditions on IT instruction");
4231    }
4232    unsigned Mask = 8;
4233    for (unsigned i = ITMask.size(); i != 0; --i) {
4234      char pos = ITMask[i - 1];
4235      if (pos != 't' && pos != 'e') {
4236        Parser.EatToEndOfStatement();
4237        return Error(Loc, "illegal IT block condition mask '" + ITMask + "'");
4238      }
4239      Mask >>= 1;
4240      if (ITMask[i - 1] == 't')
4241        Mask |= 8;
4242    }
4243    Operands.push_back(ARMOperand::CreateITMask(Mask, Loc));
4244  }
4245
4246  // FIXME: This is all a pretty gross hack. We should automatically handle
4247  // optional operands like this via tblgen.
4248
4249  // Next, add the CCOut and ConditionCode operands, if needed.
4250  //
4251  // For mnemonics which can ever incorporate a carry setting bit or predication
4252  // code, our matching model involves us always generating CCOut and
4253  // ConditionCode operands to match the mnemonic "as written" and then we let
4254  // the matcher deal with finding the right instruction or generating an
4255  // appropriate error.
4256  bool CanAcceptCarrySet, CanAcceptPredicationCode;
4257  getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode);
4258
4259  // If we had a carry-set on an instruction that can't do that, issue an
4260  // error.
4261  if (!CanAcceptCarrySet && CarrySetting) {
4262    Parser.EatToEndOfStatement();
4263    return Error(NameLoc, "instruction '" + Mnemonic +
4264                 "' can not set flags, but 's' suffix specified");
4265  }
4266  // If we had a predication code on an instruction that can't do that, issue an
4267  // error.
4268  if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) {
4269    Parser.EatToEndOfStatement();
4270    return Error(NameLoc, "instruction '" + Mnemonic +
4271                 "' is not predicable, but condition code specified");
4272  }
4273
4274  // Add the carry setting operand, if necessary.
4275  if (CanAcceptCarrySet) {
4276    SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size());
4277    Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
4278                                               Loc));
4279  }
4280
4281  // Add the predication code operand, if necessary.
4282  if (CanAcceptPredicationCode) {
4283    SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
4284                                      CarrySetting);
4285    Operands.push_back(ARMOperand::CreateCondCode(
4286                         ARMCC::CondCodes(PredicationCode), Loc));
4287  }
4288
4289  // Add the processor imod operand, if necessary.
4290  if (ProcessorIMod) {
4291    Operands.push_back(ARMOperand::CreateImm(
4292          MCConstantExpr::Create(ProcessorIMod, getContext()),
4293                                 NameLoc, NameLoc));
4294  }
4295
4296  // Add the remaining tokens in the mnemonic.
4297  while (Next != StringRef::npos) {
4298    Start = Next;
4299    Next = Name.find('.', Start + 1);
4300    StringRef ExtraToken = Name.slice(Start, Next);
4301
4302    // Some NEON instructions have an optional datatype suffix that is
4303    // completely ignored. Check for that.
4304    if (isDataTypeToken(ExtraToken) &&
4305        doesIgnoreDataTypeSuffix(Mnemonic, ExtraToken))
4306      continue;
4307
4308    if (ExtraToken != ".n") {
4309      SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start);
4310      Operands.push_back(ARMOperand::CreateToken(ExtraToken, Loc));
4311    }
4312  }
4313
4314  // Read the remaining operands.
4315  if (getLexer().isNot(AsmToken::EndOfStatement)) {
4316    // Read the first operand.
4317    if (parseOperand(Operands, Mnemonic)) {
4318      Parser.EatToEndOfStatement();
4319      return true;
4320    }
4321
4322    while (getLexer().is(AsmToken::Comma)) {
4323      Parser.Lex();  // Eat the comma.
4324
4325      // Parse and remember the operand.
4326      if (parseOperand(Operands, Mnemonic)) {
4327        Parser.EatToEndOfStatement();
4328        return true;
4329      }
4330    }
4331  }
4332
4333  if (getLexer().isNot(AsmToken::EndOfStatement)) {
4334    SMLoc Loc = getLexer().getLoc();
4335    Parser.EatToEndOfStatement();
4336    return Error(Loc, "unexpected token in argument list");
4337  }
4338
4339  Parser.Lex(); // Consume the EndOfStatement
4340
4341  // Some instructions, mostly Thumb, have forms for the same mnemonic that
4342  // do and don't have a cc_out optional-def operand. With some spot-checks
4343  // of the operand list, we can figure out which variant we're trying to
4344  // parse and adjust accordingly before actually matching. We shouldn't ever
4345  // try to remove a cc_out operand that was explicitly set on the the
4346  // mnemonic, of course (CarrySetting == true). Reason number #317 the
4347  // table driven matcher doesn't fit well with the ARM instruction set.
4348  if (!CarrySetting && shouldOmitCCOutOperand(Mnemonic, Operands)) {
4349    ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
4350    Operands.erase(Operands.begin() + 1);
4351    delete Op;
4352  }
4353
4354  // ARM mode 'blx' need special handling, as the register operand version
4355  // is predicable, but the label operand version is not. So, we can't rely
4356  // on the Mnemonic based checking to correctly figure out when to put
4357  // a k_CondCode operand in the list. If we're trying to match the label
4358  // version, remove the k_CondCode operand here.
4359  if (!isThumb() && Mnemonic == "blx" && Operands.size() == 3 &&
4360      static_cast<ARMOperand*>(Operands[2])->isImm()) {
4361    ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
4362    Operands.erase(Operands.begin() + 1);
4363    delete Op;
4364  }
4365
4366  // The vector-compare-to-zero instructions have a literal token "#0" at
4367  // the end that comes to here as an immediate operand. Convert it to a
4368  // token to play nicely with the matcher.
4369  if ((Mnemonic == "vceq" || Mnemonic == "vcge" || Mnemonic == "vcgt" ||
4370      Mnemonic == "vcle" || Mnemonic == "vclt") && Operands.size() == 6 &&
4371      static_cast<ARMOperand*>(Operands[5])->isImm()) {
4372    ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
4373    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
4374    if (CE && CE->getValue() == 0) {
4375      Operands.erase(Operands.begin() + 5);
4376      Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
4377      delete Op;
4378    }
4379  }
4380  // VCMP{E} does the same thing, but with a different operand count.
4381  if ((Mnemonic == "vcmp" || Mnemonic == "vcmpe") && Operands.size() == 5 &&
4382      static_cast<ARMOperand*>(Operands[4])->isImm()) {
4383    ARMOperand *Op = static_cast<ARMOperand*>(Operands[4]);
4384    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
4385    if (CE && CE->getValue() == 0) {
4386      Operands.erase(Operands.begin() + 4);
4387      Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
4388      delete Op;
4389    }
4390  }
4391  // Similarly, the Thumb1 "RSB" instruction has a literal "#0" on the
4392  // end. Convert it to a token here.
4393  if (Mnemonic == "rsb" && isThumb() && Operands.size() == 6 &&
4394      static_cast<ARMOperand*>(Operands[5])->isImm()) {
4395    ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
4396    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
4397    if (CE && CE->getValue() == 0) {
4398      Operands.erase(Operands.begin() + 5);
4399      Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
4400      delete Op;
4401    }
4402  }
4403
4404  return false;
4405}
4406
4407// Validate context-sensitive operand constraints.
4408
4409// return 'true' if register list contains non-low GPR registers,
4410// 'false' otherwise. If Reg is in the register list or is HiReg, set
4411// 'containsReg' to true.
4412static bool checkLowRegisterList(MCInst Inst, unsigned OpNo, unsigned Reg,
4413                                 unsigned HiReg, bool &containsReg) {
4414  containsReg = false;
4415  for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) {
4416    unsigned OpReg = Inst.getOperand(i).getReg();
4417    if (OpReg == Reg)
4418      containsReg = true;
4419    // Anything other than a low register isn't legal here.
4420    if (!isARMLowRegister(OpReg) && (!HiReg || OpReg != HiReg))
4421      return true;
4422  }
4423  return false;
4424}
4425
4426// Check if the specified regisgter is in the register list of the inst,
4427// starting at the indicated operand number.
4428static bool listContainsReg(MCInst &Inst, unsigned OpNo, unsigned Reg) {
4429  for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) {
4430    unsigned OpReg = Inst.getOperand(i).getReg();
4431    if (OpReg == Reg)
4432      return true;
4433  }
4434  return false;
4435}
4436
4437// FIXME: We would really prefer to have MCInstrInfo (the wrapper around
4438// the ARMInsts array) instead. Getting that here requires awkward
4439// API changes, though. Better way?
4440namespace llvm {
4441extern const MCInstrDesc ARMInsts[];
4442}
4443static const MCInstrDesc &getInstDesc(unsigned Opcode) {
4444  return ARMInsts[Opcode];
4445}
4446
4447// FIXME: We would really like to be able to tablegen'erate this.
4448bool ARMAsmParser::
4449validateInstruction(MCInst &Inst,
4450                    const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4451  const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode());
4452  SMLoc Loc = Operands[0]->getStartLoc();
4453  // Check the IT block state first.
4454  // NOTE: In Thumb mode, the BKPT instruction has the interesting property of
4455  // being allowed in IT blocks, but not being predicable.  It just always
4456  // executes.
4457  if (inITBlock() && Inst.getOpcode() != ARM::tBKPT) {
4458    unsigned bit = 1;
4459    if (ITState.FirstCond)
4460      ITState.FirstCond = false;
4461    else
4462      bit = (ITState.Mask >> (5 - ITState.CurPosition)) & 1;
4463    // The instruction must be predicable.
4464    if (!MCID.isPredicable())
4465      return Error(Loc, "instructions in IT block must be predicable");
4466    unsigned Cond = Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm();
4467    unsigned ITCond = bit ? ITState.Cond :
4468      ARMCC::getOppositeCondition(ITState.Cond);
4469    if (Cond != ITCond) {
4470      // Find the condition code Operand to get its SMLoc information.
4471      SMLoc CondLoc;
4472      for (unsigned i = 1; i < Operands.size(); ++i)
4473        if (static_cast<ARMOperand*>(Operands[i])->isCondCode())
4474          CondLoc = Operands[i]->getStartLoc();
4475      return Error(CondLoc, "incorrect condition in IT block; got '" +
4476                   StringRef(ARMCondCodeToString(ARMCC::CondCodes(Cond))) +
4477                   "', but expected '" +
4478                   ARMCondCodeToString(ARMCC::CondCodes(ITCond)) + "'");
4479    }
4480  // Check for non-'al' condition codes outside of the IT block.
4481  } else if (isThumbTwo() && MCID.isPredicable() &&
4482             Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm() !=
4483             ARMCC::AL && Inst.getOpcode() != ARM::tB &&
4484             Inst.getOpcode() != ARM::t2B)
4485    return Error(Loc, "predicated instructions must be in IT block");
4486
4487  switch (Inst.getOpcode()) {
4488  case ARM::LDRD:
4489  case ARM::LDRD_PRE:
4490  case ARM::LDRD_POST:
4491  case ARM::LDREXD: {
4492    // Rt2 must be Rt + 1.
4493    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
4494    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
4495    if (Rt2 != Rt + 1)
4496      return Error(Operands[3]->getStartLoc(),
4497                   "destination operands must be sequential");
4498    return false;
4499  }
4500  case ARM::STRD: {
4501    // Rt2 must be Rt + 1.
4502    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
4503    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
4504    if (Rt2 != Rt + 1)
4505      return Error(Operands[3]->getStartLoc(),
4506                   "source operands must be sequential");
4507    return false;
4508  }
4509  case ARM::STRD_PRE:
4510  case ARM::STRD_POST:
4511  case ARM::STREXD: {
4512    // Rt2 must be Rt + 1.
4513    unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg());
4514    unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg());
4515    if (Rt2 != Rt + 1)
4516      return Error(Operands[3]->getStartLoc(),
4517                   "source operands must be sequential");
4518    return false;
4519  }
4520  case ARM::SBFX:
4521  case ARM::UBFX: {
4522    // width must be in range [1, 32-lsb]
4523    unsigned lsb = Inst.getOperand(2).getImm();
4524    unsigned widthm1 = Inst.getOperand(3).getImm();
4525    if (widthm1 >= 32 - lsb)
4526      return Error(Operands[5]->getStartLoc(),
4527                   "bitfield width must be in range [1,32-lsb]");
4528    return false;
4529  }
4530  case ARM::tLDMIA: {
4531    // If we're parsing Thumb2, the .w variant is available and handles
4532    // most cases that are normally illegal for a Thumb1 LDM
4533    // instruction. We'll make the transformation in processInstruction()
4534    // if necessary.
4535    //
4536    // Thumb LDM instructions are writeback iff the base register is not
4537    // in the register list.
4538    unsigned Rn = Inst.getOperand(0).getReg();
4539    bool hasWritebackToken =
4540      (static_cast<ARMOperand*>(Operands[3])->isToken() &&
4541       static_cast<ARMOperand*>(Operands[3])->getToken() == "!");
4542    bool listContainsBase;
4543    if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) && !isThumbTwo())
4544      return Error(Operands[3 + hasWritebackToken]->getStartLoc(),
4545                   "registers must be in range r0-r7");
4546    // If we should have writeback, then there should be a '!' token.
4547    if (!listContainsBase && !hasWritebackToken && !isThumbTwo())
4548      return Error(Operands[2]->getStartLoc(),
4549                   "writeback operator '!' expected");
4550    // If we should not have writeback, there must not be a '!'. This is
4551    // true even for the 32-bit wide encodings.
4552    if (listContainsBase && hasWritebackToken)
4553      return Error(Operands[3]->getStartLoc(),
4554                   "writeback operator '!' not allowed when base register "
4555                   "in register list");
4556
4557    break;
4558  }
4559  case ARM::t2LDMIA_UPD: {
4560    if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg()))
4561      return Error(Operands[4]->getStartLoc(),
4562                   "writeback operator '!' not allowed when base register "
4563                   "in register list");
4564    break;
4565  }
4566  // Like for ldm/stm, push and pop have hi-reg handling version in Thumb2,
4567  // so only issue a diagnostic for thumb1. The instructions will be
4568  // switched to the t2 encodings in processInstruction() if necessary.
4569  case ARM::tPOP: {
4570    bool listContainsBase;
4571    if (checkLowRegisterList(Inst, 2, 0, ARM::PC, listContainsBase) &&
4572        !isThumbTwo())
4573      return Error(Operands[2]->getStartLoc(),
4574                   "registers must be in range r0-r7 or pc");
4575    break;
4576  }
4577  case ARM::tPUSH: {
4578    bool listContainsBase;
4579    if (checkLowRegisterList(Inst, 2, 0, ARM::LR, listContainsBase) &&
4580        !isThumbTwo())
4581      return Error(Operands[2]->getStartLoc(),
4582                   "registers must be in range r0-r7 or lr");
4583    break;
4584  }
4585  case ARM::tSTMIA_UPD: {
4586    bool listContainsBase;
4587    if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase) && !isThumbTwo())
4588      return Error(Operands[4]->getStartLoc(),
4589                   "registers must be in range r0-r7");
4590    break;
4591  }
4592  }
4593
4594  return false;
4595}
4596
4597bool ARMAsmParser::
4598processInstruction(MCInst &Inst,
4599                   const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4600  switch (Inst.getOpcode()) {
4601  // Handle the MOV complex aliases.
4602  case ARM::ASRi:
4603  case ARM::LSRi:
4604  case ARM::LSLi:
4605  case ARM::RORi: {
4606    ARM_AM::ShiftOpc ShiftTy;
4607    unsigned Amt = Inst.getOperand(2).getImm();
4608    switch(Inst.getOpcode()) {
4609    default: llvm_unreachable("unexpected opcode!");
4610    case ARM::ASRi: ShiftTy = ARM_AM::asr; break;
4611    case ARM::LSRi: ShiftTy = ARM_AM::lsr; break;
4612    case ARM::LSLi: ShiftTy = ARM_AM::lsl; break;
4613    case ARM::RORi: ShiftTy = ARM_AM::ror; break;
4614    }
4615    // A shift by zero is a plain MOVr, not a MOVsi.
4616    unsigned Opc = Amt == 0 ? ARM::MOVr : ARM::MOVsi;
4617    unsigned Shifter = ARM_AM::getSORegOpc(ShiftTy, Amt);
4618    MCInst TmpInst;
4619    TmpInst.setOpcode(Opc);
4620    TmpInst.addOperand(Inst.getOperand(0)); // Rd
4621    TmpInst.addOperand(Inst.getOperand(1)); // Rn
4622    if (Opc == ARM::MOVsi)
4623      TmpInst.addOperand(MCOperand::CreateImm(Shifter)); // Shift value and ty
4624    TmpInst.addOperand(Inst.getOperand(3)); // CondCode
4625    TmpInst.addOperand(Inst.getOperand(4));
4626    TmpInst.addOperand(Inst.getOperand(5)); // cc_out
4627    Inst = TmpInst;
4628    return true;
4629  }
4630  case ARM::t2LDMIA_UPD: {
4631    // If this is a load of a single register, then we should use
4632    // a post-indexed LDR instruction instead, per the ARM ARM.
4633    if (Inst.getNumOperands() != 5)
4634      return false;
4635    MCInst TmpInst;
4636    TmpInst.setOpcode(ARM::t2LDR_POST);
4637    TmpInst.addOperand(Inst.getOperand(4)); // Rt
4638    TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
4639    TmpInst.addOperand(Inst.getOperand(1)); // Rn
4640    TmpInst.addOperand(MCOperand::CreateImm(4));
4641    TmpInst.addOperand(Inst.getOperand(2)); // CondCode
4642    TmpInst.addOperand(Inst.getOperand(3));
4643    Inst = TmpInst;
4644    return true;
4645  }
4646  case ARM::t2STMDB_UPD: {
4647    // If this is a store of a single register, then we should use
4648    // a pre-indexed STR instruction instead, per the ARM ARM.
4649    if (Inst.getNumOperands() != 5)
4650      return false;
4651    MCInst TmpInst;
4652    TmpInst.setOpcode(ARM::t2STR_PRE);
4653    TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
4654    TmpInst.addOperand(Inst.getOperand(4)); // Rt
4655    TmpInst.addOperand(Inst.getOperand(1)); // Rn
4656    TmpInst.addOperand(MCOperand::CreateImm(-4));
4657    TmpInst.addOperand(Inst.getOperand(2)); // CondCode
4658    TmpInst.addOperand(Inst.getOperand(3));
4659    Inst = TmpInst;
4660    return true;
4661  }
4662  case ARM::LDMIA_UPD:
4663    // If this is a load of a single register via a 'pop', then we should use
4664    // a post-indexed LDR instruction instead, per the ARM ARM.
4665    if (static_cast<ARMOperand*>(Operands[0])->getToken() == "pop" &&
4666        Inst.getNumOperands() == 5) {
4667      MCInst TmpInst;
4668      TmpInst.setOpcode(ARM::LDR_POST_IMM);
4669      TmpInst.addOperand(Inst.getOperand(4)); // Rt
4670      TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
4671      TmpInst.addOperand(Inst.getOperand(1)); // Rn
4672      TmpInst.addOperand(MCOperand::CreateReg(0));  // am2offset
4673      TmpInst.addOperand(MCOperand::CreateImm(4));
4674      TmpInst.addOperand(Inst.getOperand(2)); // CondCode
4675      TmpInst.addOperand(Inst.getOperand(3));
4676      Inst = TmpInst;
4677      return true;
4678    }
4679    break;
4680  case ARM::STMDB_UPD:
4681    // If this is a store of a single register via a 'push', then we should use
4682    // a pre-indexed STR instruction instead, per the ARM ARM.
4683    if (static_cast<ARMOperand*>(Operands[0])->getToken() == "push" &&
4684        Inst.getNumOperands() == 5) {
4685      MCInst TmpInst;
4686      TmpInst.setOpcode(ARM::STR_PRE_IMM);
4687      TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
4688      TmpInst.addOperand(Inst.getOperand(4)); // Rt
4689      TmpInst.addOperand(Inst.getOperand(1)); // addrmode_imm12
4690      TmpInst.addOperand(MCOperand::CreateImm(-4));
4691      TmpInst.addOperand(Inst.getOperand(2)); // CondCode
4692      TmpInst.addOperand(Inst.getOperand(3));
4693      Inst = TmpInst;
4694    }
4695    break;
4696  case ARM::tADDi8:
4697    // If the immediate is in the range 0-7, we want tADDi3 iff Rd was
4698    // explicitly specified. From the ARM ARM: "Encoding T1 is preferred
4699    // to encoding T2 if <Rd> is specified and encoding T2 is preferred
4700    // to encoding T1 if <Rd> is omitted."
4701    if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6) {
4702      Inst.setOpcode(ARM::tADDi3);
4703      return true;
4704    }
4705    break;
4706  case ARM::tSUBi8:
4707    // If the immediate is in the range 0-7, we want tADDi3 iff Rd was
4708    // explicitly specified. From the ARM ARM: "Encoding T1 is preferred
4709    // to encoding T2 if <Rd> is specified and encoding T2 is preferred
4710    // to encoding T1 if <Rd> is omitted."
4711    if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6) {
4712      Inst.setOpcode(ARM::tSUBi3);
4713      return true;
4714    }
4715    break;
4716  case ARM::tB:
4717    // A Thumb conditional branch outside of an IT block is a tBcc.
4718    if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock()) {
4719      Inst.setOpcode(ARM::tBcc);
4720      return true;
4721    }
4722    break;
4723  case ARM::t2B:
4724    // A Thumb2 conditional branch outside of an IT block is a t2Bcc.
4725    if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock()){
4726      Inst.setOpcode(ARM::t2Bcc);
4727      return true;
4728    }
4729    break;
4730  case ARM::t2Bcc:
4731    // If the conditional is AL or we're in an IT block, we really want t2B.
4732    if (Inst.getOperand(1).getImm() == ARMCC::AL || inITBlock()) {
4733      Inst.setOpcode(ARM::t2B);
4734      return true;
4735    }
4736    break;
4737  case ARM::tBcc:
4738    // If the conditional is AL, we really want tB.
4739    if (Inst.getOperand(1).getImm() == ARMCC::AL) {
4740      Inst.setOpcode(ARM::tB);
4741      return true;
4742    }
4743    break;
4744  case ARM::tLDMIA: {
4745    // If the register list contains any high registers, or if the writeback
4746    // doesn't match what tLDMIA can do, we need to use the 32-bit encoding
4747    // instead if we're in Thumb2. Otherwise, this should have generated
4748    // an error in validateInstruction().
4749    unsigned Rn = Inst.getOperand(0).getReg();
4750    bool hasWritebackToken =
4751      (static_cast<ARMOperand*>(Operands[3])->isToken() &&
4752       static_cast<ARMOperand*>(Operands[3])->getToken() == "!");
4753    bool listContainsBase;
4754    if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) ||
4755        (!listContainsBase && !hasWritebackToken) ||
4756        (listContainsBase && hasWritebackToken)) {
4757      // 16-bit encoding isn't sufficient. Switch to the 32-bit version.
4758      assert (isThumbTwo());
4759      Inst.setOpcode(hasWritebackToken ? ARM::t2LDMIA_UPD : ARM::t2LDMIA);
4760      // If we're switching to the updating version, we need to insert
4761      // the writeback tied operand.
4762      if (hasWritebackToken)
4763        Inst.insert(Inst.begin(),
4764                    MCOperand::CreateReg(Inst.getOperand(0).getReg()));
4765      return true;
4766    }
4767    break;
4768  }
4769  case ARM::tSTMIA_UPD: {
4770    // If the register list contains any high registers, we need to use
4771    // the 32-bit encoding instead if we're in Thumb2. Otherwise, this
4772    // should have generated an error in validateInstruction().
4773    unsigned Rn = Inst.getOperand(0).getReg();
4774    bool listContainsBase;
4775    if (checkLowRegisterList(Inst, 4, Rn, 0, listContainsBase)) {
4776      // 16-bit encoding isn't sufficient. Switch to the 32-bit version.
4777      assert (isThumbTwo());
4778      Inst.setOpcode(ARM::t2STMIA_UPD);
4779      return true;
4780    }
4781    break;
4782  }
4783  case ARM::tPOP: {
4784    bool listContainsBase;
4785    // If the register list contains any high registers, we need to use
4786    // the 32-bit encoding instead if we're in Thumb2. Otherwise, this
4787    // should have generated an error in validateInstruction().
4788    if (!checkLowRegisterList(Inst, 2, 0, ARM::PC, listContainsBase))
4789      return false;
4790    assert (isThumbTwo());
4791    Inst.setOpcode(ARM::t2LDMIA_UPD);
4792    // Add the base register and writeback operands.
4793    Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP));
4794    Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP));
4795    return true;
4796  }
4797  case ARM::tPUSH: {
4798    bool listContainsBase;
4799    if (!checkLowRegisterList(Inst, 2, 0, ARM::LR, listContainsBase))
4800      return false;
4801    assert (isThumbTwo());
4802    Inst.setOpcode(ARM::t2STMDB_UPD);
4803    // Add the base register and writeback operands.
4804    Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP));
4805    Inst.insert(Inst.begin(), MCOperand::CreateReg(ARM::SP));
4806    return true;
4807  }
4808  case ARM::t2MOVi: {
4809    // If we can use the 16-bit encoding and the user didn't explicitly
4810    // request the 32-bit variant, transform it here.
4811    if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
4812        Inst.getOperand(1).getImm() <= 255 &&
4813        ((!inITBlock() && Inst.getOperand(2).getImm() == ARMCC::AL &&
4814         Inst.getOperand(4).getReg() == ARM::CPSR) ||
4815        (inITBlock() && Inst.getOperand(4).getReg() == 0)) &&
4816        (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
4817         static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
4818      // The operands aren't in the same order for tMOVi8...
4819      MCInst TmpInst;
4820      TmpInst.setOpcode(ARM::tMOVi8);
4821      TmpInst.addOperand(Inst.getOperand(0));
4822      TmpInst.addOperand(Inst.getOperand(4));
4823      TmpInst.addOperand(Inst.getOperand(1));
4824      TmpInst.addOperand(Inst.getOperand(2));
4825      TmpInst.addOperand(Inst.getOperand(3));
4826      Inst = TmpInst;
4827      return true;
4828    }
4829    break;
4830  }
4831  case ARM::t2MOVr: {
4832    // If we can use the 16-bit encoding and the user didn't explicitly
4833    // request the 32-bit variant, transform it here.
4834    if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
4835        isARMLowRegister(Inst.getOperand(1).getReg()) &&
4836        Inst.getOperand(2).getImm() == ARMCC::AL &&
4837        Inst.getOperand(4).getReg() == ARM::CPSR &&
4838        (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
4839         static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
4840      // The operands aren't the same for tMOV[S]r... (no cc_out)
4841      MCInst TmpInst;
4842      TmpInst.setOpcode(Inst.getOperand(4).getReg() ? ARM::tMOVSr : ARM::tMOVr);
4843      TmpInst.addOperand(Inst.getOperand(0));
4844      TmpInst.addOperand(Inst.getOperand(1));
4845      TmpInst.addOperand(Inst.getOperand(2));
4846      TmpInst.addOperand(Inst.getOperand(3));
4847      Inst = TmpInst;
4848      return true;
4849    }
4850    break;
4851  }
4852  case ARM::t2SXTH:
4853  case ARM::t2SXTB:
4854  case ARM::t2UXTH:
4855  case ARM::t2UXTB: {
4856    // If we can use the 16-bit encoding and the user didn't explicitly
4857    // request the 32-bit variant, transform it here.
4858    if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
4859        isARMLowRegister(Inst.getOperand(1).getReg()) &&
4860        Inst.getOperand(2).getImm() == 0 &&
4861        (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
4862         static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
4863      unsigned NewOpc;
4864      switch (Inst.getOpcode()) {
4865      default: llvm_unreachable("Illegal opcode!");
4866      case ARM::t2SXTH: NewOpc = ARM::tSXTH; break;
4867      case ARM::t2SXTB: NewOpc = ARM::tSXTB; break;
4868      case ARM::t2UXTH: NewOpc = ARM::tUXTH; break;
4869      case ARM::t2UXTB: NewOpc = ARM::tUXTB; break;
4870      }
4871      // The operands aren't the same for thumb1 (no rotate operand).
4872      MCInst TmpInst;
4873      TmpInst.setOpcode(NewOpc);
4874      TmpInst.addOperand(Inst.getOperand(0));
4875      TmpInst.addOperand(Inst.getOperand(1));
4876      TmpInst.addOperand(Inst.getOperand(3));
4877      TmpInst.addOperand(Inst.getOperand(4));
4878      Inst = TmpInst;
4879      return true;
4880    }
4881    break;
4882  }
4883  case ARM::t2IT: {
4884    // The mask bits for all but the first condition are represented as
4885    // the low bit of the condition code value implies 't'. We currently
4886    // always have 1 implies 't', so XOR toggle the bits if the low bit
4887    // of the condition code is zero. The encoding also expects the low
4888    // bit of the condition to be encoded as bit 4 of the mask operand,
4889    // so mask that in if needed
4890    MCOperand &MO = Inst.getOperand(1);
4891    unsigned Mask = MO.getImm();
4892    unsigned OrigMask = Mask;
4893    unsigned TZ = CountTrailingZeros_32(Mask);
4894    if ((Inst.getOperand(0).getImm() & 1) == 0) {
4895      assert(Mask && TZ <= 3 && "illegal IT mask value!");
4896      for (unsigned i = 3; i != TZ; --i)
4897        Mask ^= 1 << i;
4898    } else
4899      Mask |= 0x10;
4900    MO.setImm(Mask);
4901
4902    // Set up the IT block state according to the IT instruction we just
4903    // matched.
4904    assert(!inITBlock() && "nested IT blocks?!");
4905    ITState.Cond = ARMCC::CondCodes(Inst.getOperand(0).getImm());
4906    ITState.Mask = OrigMask; // Use the original mask, not the updated one.
4907    ITState.CurPosition = 0;
4908    ITState.FirstCond = true;
4909    break;
4910  }
4911  }
4912  return false;
4913}
4914
4915unsigned ARMAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
4916  // 16-bit thumb arithmetic instructions either require or preclude the 'S'
4917  // suffix depending on whether they're in an IT block or not.
4918  unsigned Opc = Inst.getOpcode();
4919  const MCInstrDesc &MCID = getInstDesc(Opc);
4920  if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) {
4921    assert(MCID.hasOptionalDef() &&
4922           "optionally flag setting instruction missing optional def operand");
4923    assert(MCID.NumOperands == Inst.getNumOperands() &&
4924           "operand count mismatch!");
4925    // Find the optional-def operand (cc_out).
4926    unsigned OpNo;
4927    for (OpNo = 0;
4928         !MCID.OpInfo[OpNo].isOptionalDef() && OpNo < MCID.NumOperands;
4929         ++OpNo)
4930      ;
4931    // If we're parsing Thumb1, reject it completely.
4932    if (isThumbOne() && Inst.getOperand(OpNo).getReg() != ARM::CPSR)
4933      return Match_MnemonicFail;
4934    // If we're parsing Thumb2, which form is legal depends on whether we're
4935    // in an IT block.
4936    if (isThumbTwo() && Inst.getOperand(OpNo).getReg() != ARM::CPSR &&
4937        !inITBlock())
4938      return Match_RequiresITBlock;
4939    if (isThumbTwo() && Inst.getOperand(OpNo).getReg() == ARM::CPSR &&
4940        inITBlock())
4941      return Match_RequiresNotITBlock;
4942  }
4943  // Some high-register supporting Thumb1 encodings only allow both registers
4944  // to be from r0-r7 when in Thumb2.
4945  else if (Opc == ARM::tADDhirr && isThumbOne() &&
4946           isARMLowRegister(Inst.getOperand(1).getReg()) &&
4947           isARMLowRegister(Inst.getOperand(2).getReg()))
4948    return Match_RequiresThumb2;
4949  // Others only require ARMv6 or later.
4950  else if (Opc == ARM::tMOVr && isThumbOne() && !hasV6Ops() &&
4951           isARMLowRegister(Inst.getOperand(0).getReg()) &&
4952           isARMLowRegister(Inst.getOperand(1).getReg()))
4953    return Match_RequiresV6;
4954  return Match_Success;
4955}
4956
4957bool ARMAsmParser::
4958MatchAndEmitInstruction(SMLoc IDLoc,
4959                        SmallVectorImpl<MCParsedAsmOperand*> &Operands,
4960                        MCStreamer &Out) {
4961  MCInst Inst;
4962  unsigned ErrorInfo;
4963  unsigned MatchResult;
4964  MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo);
4965  switch (MatchResult) {
4966  default: break;
4967  case Match_Success:
4968    // Context sensitive operand constraints aren't handled by the matcher,
4969    // so check them here.
4970    if (validateInstruction(Inst, Operands)) {
4971      // Still progress the IT block, otherwise one wrong condition causes
4972      // nasty cascading errors.
4973      forwardITPosition();
4974      return true;
4975    }
4976
4977    // Some instructions need post-processing to, for example, tweak which
4978    // encoding is selected. Loop on it while changes happen so the
4979    // individual transformations can chain off each other. E.g.,
4980    // tPOP(r8)->t2LDMIA_UPD(sp,r8)->t2STR_POST(sp,r8)
4981    while (processInstruction(Inst, Operands))
4982      ;
4983
4984    // Only move forward at the very end so that everything in validate
4985    // and process gets a consistent answer about whether we're in an IT
4986    // block.
4987    forwardITPosition();
4988
4989    Out.EmitInstruction(Inst);
4990    return false;
4991  case Match_MissingFeature:
4992    Error(IDLoc, "instruction requires a CPU feature not currently enabled");
4993    return true;
4994  case Match_InvalidOperand: {
4995    SMLoc ErrorLoc = IDLoc;
4996    if (ErrorInfo != ~0U) {
4997      if (ErrorInfo >= Operands.size())
4998        return Error(IDLoc, "too few operands for instruction");
4999
5000      ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc();
5001      if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
5002    }
5003
5004    return Error(ErrorLoc, "invalid operand for instruction");
5005  }
5006  case Match_MnemonicFail:
5007    return Error(IDLoc, "invalid instruction");
5008  case Match_ConversionFail:
5009    // The converter function will have already emited a diagnostic.
5010    return true;
5011  case Match_RequiresNotITBlock:
5012    return Error(IDLoc, "flag setting instruction only valid outside IT block");
5013  case Match_RequiresITBlock:
5014    return Error(IDLoc, "instruction only valid inside IT block");
5015  case Match_RequiresV6:
5016    return Error(IDLoc, "instruction variant requires ARMv6 or later");
5017  case Match_RequiresThumb2:
5018    return Error(IDLoc, "instruction variant requires Thumb2");
5019  }
5020
5021  llvm_unreachable("Implement any new match types added!");
5022  return true;
5023}
5024
5025/// parseDirective parses the arm specific directives
5026bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
5027  StringRef IDVal = DirectiveID.getIdentifier();
5028  if (IDVal == ".word")
5029    return parseDirectiveWord(4, DirectiveID.getLoc());
5030  else if (IDVal == ".thumb")
5031    return parseDirectiveThumb(DirectiveID.getLoc());
5032  else if (IDVal == ".thumb_func")
5033    return parseDirectiveThumbFunc(DirectiveID.getLoc());
5034  else if (IDVal == ".code")
5035    return parseDirectiveCode(DirectiveID.getLoc());
5036  else if (IDVal == ".syntax")
5037    return parseDirectiveSyntax(DirectiveID.getLoc());
5038  return true;
5039}
5040
5041/// parseDirectiveWord
5042///  ::= .word [ expression (, expression)* ]
5043bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
5044  if (getLexer().isNot(AsmToken::EndOfStatement)) {
5045    for (;;) {
5046      const MCExpr *Value;
5047      if (getParser().ParseExpression(Value))
5048        return true;
5049
5050      getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/);
5051
5052      if (getLexer().is(AsmToken::EndOfStatement))
5053        break;
5054
5055      // FIXME: Improve diagnostic.
5056      if (getLexer().isNot(AsmToken::Comma))
5057        return Error(L, "unexpected token in directive");
5058      Parser.Lex();
5059    }
5060  }
5061
5062  Parser.Lex();
5063  return false;
5064}
5065
5066/// parseDirectiveThumb
5067///  ::= .thumb
5068bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
5069  if (getLexer().isNot(AsmToken::EndOfStatement))
5070    return Error(L, "unexpected token in directive");
5071  Parser.Lex();
5072
5073  // TODO: set thumb mode
5074  // TODO: tell the MC streamer the mode
5075  // getParser().getStreamer().Emit???();
5076  return false;
5077}
5078
5079/// parseDirectiveThumbFunc
5080///  ::= .thumbfunc symbol_name
5081bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
5082  const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo();
5083  bool isMachO = MAI.hasSubsectionsViaSymbols();
5084  StringRef Name;
5085
5086  // Darwin asm has function name after .thumb_func direction
5087  // ELF doesn't
5088  if (isMachO) {
5089    const AsmToken &Tok = Parser.getTok();
5090    if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String))
5091      return Error(L, "unexpected token in .thumb_func directive");
5092    Name = Tok.getIdentifier();
5093    Parser.Lex(); // Consume the identifier token.
5094  }
5095
5096 if (getLexer().isNot(AsmToken::EndOfStatement))
5097    return Error(L, "unexpected token in directive");
5098  Parser.Lex();
5099
5100  // FIXME: assuming function name will be the line following .thumb_func
5101  if (!isMachO) {
5102    Name = Parser.getTok().getIdentifier();
5103  }
5104
5105  // Mark symbol as a thumb symbol.
5106  MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name);
5107  getParser().getStreamer().EmitThumbFunc(Func);
5108  return false;
5109}
5110
5111/// parseDirectiveSyntax
5112///  ::= .syntax unified | divided
5113bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) {
5114  const AsmToken &Tok = Parser.getTok();
5115  if (Tok.isNot(AsmToken::Identifier))
5116    return Error(L, "unexpected token in .syntax directive");
5117  StringRef Mode = Tok.getString();
5118  if (Mode == "unified" || Mode == "UNIFIED")
5119    Parser.Lex();
5120  else if (Mode == "divided" || Mode == "DIVIDED")
5121    return Error(L, "'.syntax divided' arm asssembly not supported");
5122  else
5123    return Error(L, "unrecognized syntax mode in .syntax directive");
5124
5125  if (getLexer().isNot(AsmToken::EndOfStatement))
5126    return Error(Parser.getTok().getLoc(), "unexpected token in directive");
5127  Parser.Lex();
5128
5129  // TODO tell the MC streamer the mode
5130  // getParser().getStreamer().Emit???();
5131  return false;
5132}
5133
5134/// parseDirectiveCode
5135///  ::= .code 16 | 32
5136bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
5137  const AsmToken &Tok = Parser.getTok();
5138  if (Tok.isNot(AsmToken::Integer))
5139    return Error(L, "unexpected token in .code directive");
5140  int64_t Val = Parser.getTok().getIntVal();
5141  if (Val == 16)
5142    Parser.Lex();
5143  else if (Val == 32)
5144    Parser.Lex();
5145  else
5146    return Error(L, "invalid operand to .code directive");
5147
5148  if (getLexer().isNot(AsmToken::EndOfStatement))
5149    return Error(Parser.getTok().getLoc(), "unexpected token in directive");
5150  Parser.Lex();
5151
5152  if (Val == 16) {
5153    if (!isThumb())
5154      SwitchMode();
5155    getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
5156  } else {
5157    if (isThumb())
5158      SwitchMode();
5159    getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
5160  }
5161
5162  return false;
5163}
5164
5165extern "C" void LLVMInitializeARMAsmLexer();
5166
5167/// Force static initialization.
5168extern "C" void LLVMInitializeARMAsmParser() {
5169  RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
5170  RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget);
5171  LLVMInitializeARMAsmLexer();
5172}
5173
5174#define GET_REGISTER_MATCHER
5175#define GET_MATCHER_IMPLEMENTATION
5176#include "ARMGenAsmMatcher.inc"
5177