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