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