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