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