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