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