MBlazeAsmParser.cpp revision b7f689bab98777236a2bf600f299d232d246bb61
10a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck//===-- MBlazeAsmParser.cpp - Parse MBlaze asm to MCInst instructions -----===//
24da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck//
34da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck//                     The LLVM Compiler Infrastructure
44da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck//
54da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck// This file is distributed under the University of Illinois Open Source
64da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck// License. See LICENSE.TXT for details.
74da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck//
84da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck//===----------------------------------------------------------------------===//
94da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
104da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlaze.h"
114da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeSubtarget.h"
1241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck#include "MBlazeRegisterInfo.h"
134da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeISelLowering.h"
144da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCParser/MCAsmLexer.h"
154da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCParser/MCAsmParser.h"
164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
174da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCStreamer.h"
184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCExpr.h"
194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/MC/MCInst.h"
204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/Target/TargetRegistry.h"
214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/Target/TargetAsmParser.h"
224da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/Support/SourceMgr.h"
234da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/Support/raw_ostream.h"
244da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/ADT/OwningPtr.h"
254da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/ADT/SmallVector.h"
264da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/ADT/StringSwitch.h"
274da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "llvm/ADT/Twine.h"
284da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckusing namespace llvm;
294da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
304da992aebada7445ef68a7b6b94676dd26e9d537Wesley Pecknamespace {
314da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckstruct MBlazeOperand;
324da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
334da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckclass MBlazeAsmParser : public TargetAsmParser {
344da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MCAsmParser &Parser;
354da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MCAsmParser &getParser() const { return Parser; }
374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MCAsmLexer &getLexer() const { return Parser.getLexer(); }
384da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
394da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
404da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
414da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
43bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  MBlazeOperand *ParseRegister(unsigned &RegNo);
440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseImmediate();
450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseFsl();
460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand* ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
474da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
48bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
49bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky
5041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  bool ParseDirectiveWord(unsigned Size, SMLoc L);
5141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  bool MatchAndEmitInstruction(SMLoc IDLoc,
534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck                               SmallVectorImpl<MCParsedAsmOperand*> &Operands,
540a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                               MCStreamer &Out);
554da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
564da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// @name Auto-generated Match Functions
574da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// {
584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_ASSEMBLER_HEADER
604da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeGenAsmMatcher.inc"
614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
624da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// }
634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
644da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
654da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckpublic:
66ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng  MBlazeAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
67480cee5d4396a380ada6ffd03551b5700d041fe0Evan Cheng    : TargetAsmParser(), Parser(_Parser) {}
684da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
694da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  virtual bool ParseInstruction(StringRef Name, SMLoc NameLoc,
704da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck                                SmallVectorImpl<MCParsedAsmOperand*> &Operands);
714da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
724da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  virtual bool ParseDirective(AsmToken DirectiveID);
734da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck};
740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
754da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// MBlazeOperand - Instances of this class represent a parsed MBlaze machine
764da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// instruction.
774da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckstruct MBlazeOperand : public MCParsedAsmOperand {
784da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  enum KindTy {
790a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Token,
804da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Immediate,
814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Register,
820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Memory,
830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Fsl
844da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  } Kind;
854da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc StartLoc, EndLoc;
874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  union {
894da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
904da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      const char *Data;
914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      unsigned Length;
924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Tok;
934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
944da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
954da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      unsigned RegNum;
964da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Reg;
974da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
984da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
994da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      const MCExpr *Val;
1004da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Imm;
1010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1024da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
1030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      unsigned Base;
1040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      unsigned OffReg;
1050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      const MCExpr *Off;
1064da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Mem;
1074da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    struct {
1090a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      const MCExpr *Val;
1100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    } FslImm;
1114da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  };
1120a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
1140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckpublic:
1154da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MBlazeOperand(const MBlazeOperand &o) : MCParsedAsmOperand() {
1164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Kind = o.Kind;
1174da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    StartLoc = o.StartLoc;
1184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    EndLoc = o.EndLoc;
1194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    switch (Kind) {
1204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Register:
1214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Reg = o.Reg;
1224da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1234da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Immediate:
1244da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Imm = o.Imm;
1254da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    case Token:
1270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Tok = o.Tok;
1280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      break;
1294da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Memory:
1304da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Mem = o.Mem;
1314da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1320a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    case Fsl:
1330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      FslImm = o.FslImm;
1340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      break;
1354da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    }
1364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1370a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1384da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// getStartLoc - Get the location of the first token of this operand.
1394da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc getStartLoc() const { return StartLoc; }
1400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1414da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// getEndLoc - Get the location of the last token of this operand.
1424da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc getEndLoc() const { return EndLoc; }
1434da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1444da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  unsigned getReg() const {
1454da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(Kind == Register && "Invalid access!");
1464da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    return Reg.RegNum;
1474da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1494da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  const MCExpr *getImm() const {
1504da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(Kind == Immediate && "Invalid access!");
1514da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    return Imm.Val;
1524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1540a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr *getFslImm() const {
1550a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Fsl && "Invalid access!");
1560a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return FslImm.Val;
1570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1590a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned getMemBase() const {
1600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.Base;
1620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr* getMemOff() const {
1650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.Off;
1670a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned getMemOffReg() const {
1700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.OffReg;
1720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1734da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isToken() const { return Kind == Token; }
1750a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isImm() const { return Kind == Immediate; }
1760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isMem() const { return Kind == Memory; }
1770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isFsl() const { return Kind == Fsl; }
1780a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isReg() const { return Kind == Register; }
1794da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1804da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addExpr(MCInst &Inst, const MCExpr *Expr) const {
1810a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Add as immediates when possible.  Null MCExpr = 0.
1820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (Expr == 0)
1830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Inst.addOperand(MCOperand::CreateImm(0));
1840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
1854da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
1864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    else
1874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Inst.addOperand(MCOperand::CreateExpr(Expr));
1884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1894da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1904da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addRegOperands(MCInst &Inst, unsigned N) const {
1914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(N == 1 && "Invalid number of operands!");
1924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Inst.addOperand(MCOperand::CreateReg(getReg()));
1934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1944da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1954da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addImmOperands(MCInst &Inst, unsigned N) const {
1964da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(N == 1 && "Invalid number of operands!");
1974da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    addExpr(Inst, getImm());
1984da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1994da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2000a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  void addFslOperands(MCInst &Inst, unsigned N) const {
2010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(N == 1 && "Invalid number of operands!");
2020a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    addExpr(Inst, getFslImm());
2030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2044da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  void addMemOperands(MCInst &Inst, unsigned N) const {
2060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(N == 2 && "Invalid number of operands!");
2070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
20841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    Inst.addOperand(MCOperand::CreateReg(getMemBase()));
20941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
2100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    unsigned RegOff = getMemOffReg();
2110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (RegOff)
2120a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Inst.addOperand(MCOperand::CreateReg(RegOff));
2130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    else
2140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      addExpr(Inst, getMemOff());
2150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2160a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2170a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  StringRef getToken() const {
2180a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Token && "Invalid access!");
2190a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return StringRef(Tok.Data, Tok.Length);
2204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
222b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach  virtual void print(raw_ostream &OS) const;
2230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateToken(StringRef Str, SMLoc S) {
2250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Token);
2264da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Tok.Data = Str.data();
2274da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Tok.Length = Str.size();
2284da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2294da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = S;
2300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2314da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2324da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
2340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Register);
2354da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Reg.RegNum = RegNum;
2364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2380a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
2420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Immediate);
2430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Imm.Val = Val;
2440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->StartLoc = S;
2450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->EndLoc = E;
2460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2474da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2490a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateFslImm(const MCExpr *Val, SMLoc S, SMLoc E) {
2500a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Fsl);
2514da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Imm.Val = Val;
2524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2540a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2550a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2560a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateMem(unsigned Base, const MCExpr *Off, SMLoc S,
2580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                                  SMLoc E) {
2590a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Memory);
2600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Base = Base;
2610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Off = Off;
2620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.OffReg = 0;
2630a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->StartLoc = S;
2640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->EndLoc = E;
2650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2664da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2674da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateMem(unsigned Base, unsigned Off, SMLoc S,
2690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                                  SMLoc E) {
2700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Memory);
2710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Base = Base;
2720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.OffReg = Off;
2730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Off = 0;
2744da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2754da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2774da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2784da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck};
2794da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2804da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck} // end anonymous namespace.
2814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
282b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbachvoid MBlazeOperand::print(raw_ostream &OS) const {
2834da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  switch (Kind) {
2844da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Immediate:
2854da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    getImm()->print(OS);
2864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
2874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Register:
28841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << "<register R";
28941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << MBlazeRegisterInfo::getRegisterNumbering(getReg()) << ">";
2904da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
2914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Token:
2924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    OS << "'" << getToken() << "'";
2934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
29441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  case Memory: {
29541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << "<memory R";
29641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << MBlazeRegisterInfo::getRegisterNumbering(getMemBase());
29741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << ", ";
29841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
29941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    unsigned RegOff = getMemOffReg();
30041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    if (RegOff)
30141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      OS << "R" << MBlazeRegisterInfo::getRegisterNumbering(RegOff);
30241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    else
30341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      OS << getMemOff();
30441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << ">";
30541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    }
3060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    break;
3070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Fsl:
3080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    getFslImm()->print(OS);
3090a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    break;
3104da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3114da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3124da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3134da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// @name Auto-generated Match Functions
3144da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// {
3154da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckstatic unsigned MatchRegisterName(StringRef Name);
3174da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// }
3190a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck//
3200a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::
3210a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMatchAndEmitInstruction(SMLoc IDLoc,
3220a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                        SmallVectorImpl<MCParsedAsmOperand*> &Operands,
3230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                        MCStreamer &Out) {
3240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MCInst Inst;
3250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc ErrorLoc;
3260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned ErrorInfo;
3270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (MatchInstructionImpl(Operands, Inst, ErrorInfo)) {
3290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_Success:
3300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Out.EmitInstruction(Inst);
3310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return false;
3320a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_MissingFeature:
3330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Error(IDLoc, "instruction use requires an option to be enabled");
3340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_MnemonicFail:
3350a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return Error(IDLoc, "unrecognized instruction mnemonic");
336b412915ff6229b3e2dffedcfb0f3fb7e85259841Daniel Dunbar  case Match_ConversionFail:
337b412915ff6229b3e2dffedcfb0f3fb7e85259841Daniel Dunbar    return Error(IDLoc, "unable to convert operands to instruction");
3380a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_InvalidOperand:
3390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    ErrorLoc = IDLoc;
3400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (ErrorInfo != ~0U) {
3410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      if (ErrorInfo >= Operands.size())
3420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck        return Error(IDLoc, "too few operands for instruction");
3430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      ErrorLoc = ((MBlazeOperand*)Operands[ErrorInfo])->getStartLoc();
3450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
3464da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    }
3474da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3480a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Error(ErrorLoc, "invalid operand for instruction");
3490a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
3504da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3510a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  llvm_unreachable("Implement any new match types added!");
3520a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return true;
3534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3544da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3550a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::
3560a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Operands.size() != 4)
3580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand &Base = *(MBlazeOperand*)Operands[2];
3610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand &Offset = *(MBlazeOperand*)Operands[3];
3624da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3630a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Base.getStartLoc();
3640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc O = Offset.getStartLoc();
3650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = Offset.getEndLoc();
3660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3670a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Base.isReg()) {
3680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(S, "base address must be a register");
3690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3704da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3714da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Offset.isReg() && !Offset.isImm()) {
3730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(O, "offset must be a register or immediate");
3740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3754da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3764da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *Op;
3780a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Offset.isReg())
3790a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = MBlazeOperand::CreateMem(Base.getReg(), Offset.getReg(), S, E);
3800a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  else
3810a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = MBlazeOperand::CreateMem(Base.getReg(), Offset.getImm(), S, E);
3820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  delete Operands.pop_back_val();
3840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  delete Operands.pop_back_val();
3850a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  Operands.push_back(Op);
3860a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3870a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return Op;
3884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3894da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
39069df72367f45c0414541196efaf7c13b1ccd3f08Bob Wilsonbool MBlazeAsmParser::ParseRegister(unsigned &RegNo,
39169df72367f45c0414541196efaf7c13b1ccd3f08Bob Wilson                                    SMLoc &StartLoc, SMLoc &EndLoc) {
392bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  return (ParseRegister(RegNo) == 0);
393bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky}
394bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky
395bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman DivackyMBlazeOperand *MBlazeAsmParser::ParseRegister(unsigned &RegNo) {
3960a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
3970a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
3980a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3990a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (getLexer().getKind()) {
4000a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
4010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Identifier:
402bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky    RegNo = MatchRegisterName(getLexer().getTok().getIdentifier());
4030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (RegNo == 0)
4040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
40641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    getLexer().Lex();
4070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateReg(RegNo, S, E);
4084da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4094da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4104da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
411d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerstatic unsigned MatchFslRegister(StringRef String) {
4120a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!String.startswith("rfsl"))
4130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return -1;
4144da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned regNum;
4160a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (String.substr(4).getAsInteger(10,regNum))
4170a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return -1;
4184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4190a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return regNum;
4200a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck}
4214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4220a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::ParseFsl() {
4230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
4240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4254da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (getLexer().getKind()) {
4270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
4280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Identifier:
4290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    unsigned reg = MatchFslRegister(getLexer().getTok().getIdentifier());
4300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (reg >= 16)
4310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4320a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
43341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    getLexer().Lex();
4340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    const MCExpr *EVal = MCConstantExpr::Create(reg,getContext());
4350a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateFslImm(EVal,S,E);
4360a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
4374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4384da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4390a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::ParseImmediate() {
4400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
4410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr *EVal;
4444da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  switch (getLexer().getKind()) {
4450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
4460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::LParen:
4470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Plus:
4480a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Minus:
4490a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Integer:
4504da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case AsmToken::Identifier:
4510a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (getParser().ParseExpression(EVal))
4520a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4530a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4540a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateImm(EVal, S, E);
4554da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4564da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4574da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4580a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::
4590a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *Op;
4614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as a register name
463bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  unsigned RegNo;
464bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  Op = ParseRegister(RegNo);
4654da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as an FSL immediate
4670a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op)
4680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = ParseFsl();
4694da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as an immediate
4710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op)
4720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = ParseImmediate();
4734da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If the token could not be parsed then fail
4750a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op) {
4760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(Parser.getTok().getLoc(), "unknown operand");
4770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
4784da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4794da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4800a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Push the parsed operand into the list of operands
4810a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  Operands.push_back(Op);
4820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return Op;
4834da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4844da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4850a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck/// Parse an mblaze instruction mnemonic followed by its operands.
4860a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::
4870a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseInstruction(StringRef Name, SMLoc NameLoc,
4880a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                 SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
48941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  // The first operands is the token for the instruction name
49041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  size_t dotLoc = Name.find('.');
49141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  Operands.push_back(MBlazeOperand::CreateToken(Name.substr(0,dotLoc),NameLoc));
49241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (dotLoc < Name.size())
49341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    Operands.push_back(MBlazeOperand::CreateToken(Name.substr(dotLoc),NameLoc));
4940a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4950a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If there are no more operands then finish
4960a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (getLexer().is(AsmToken::EndOfStatement))
4970a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return false;
4984da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4990a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Parse the first operand
50060f923c5e2d752ce5c6e042db8279122eff798ddWesley Peck  if (!ParseOperand(Operands))
5010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return true;
5024da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  while (getLexer().isNot(AsmToken::EndOfStatement) &&
5040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck         getLexer().is(AsmToken::Comma)) {
5050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Consume the comma token
5060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    getLexer().Lex();
5070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
5080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Parse the next operand
50960f923c5e2d752ce5c6e042db8279122eff798ddWesley Peck    if (!ParseOperand(Operands))
5100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return true;
5110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
5124da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If the instruction requires a memory operand then we need to
5140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // replace the last two operands (base+offset) with a single
5150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // memory operand.
5160a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Name.startswith("lw") || Name.startswith("sw") ||
5170a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Name.startswith("lh") || Name.startswith("sh") ||
5180a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Name.startswith("lb") || Name.startswith("sb"))
51941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    return (ParseMemory(Operands) == NULL);
5204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  return false;
5224da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
5234da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck/// ParseDirective parses the arm specific directives
5250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::ParseDirective(AsmToken DirectiveID) {
52641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  StringRef IDVal = DirectiveID.getIdentifier();
52741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (IDVal == ".word")
52841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    return ParseDirectiveWord(2, DirectiveID.getLoc());
5290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return true;
5300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck}
5310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
53241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck/// ParseDirectiveWord
53341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck///  ::= .word [ expression (, expression)* ]
53441400da31ead2f61d171381c0945dceddd8fc786Wesley Peckbool MBlazeAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
53541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (getLexer().isNot(AsmToken::EndOfStatement)) {
53641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    for (;;) {
53741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      const MCExpr *Value;
53841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getParser().ParseExpression(Value))
53941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        return true;
54041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
54141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      getParser().getStreamer().EmitValue(Value, Size, 0 /*addrspace*/);
54241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
54341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getLexer().is(AsmToken::EndOfStatement))
54441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        break;
54541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
54641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      // FIXME: Improve diagnostic.
54741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getLexer().isNot(AsmToken::Comma))
54841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        return Error(L, "unexpected token in directive");
54941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      Parser.Lex();
55041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    }
55141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  }
55241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
55341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  Parser.Lex();
55441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  return false;
55541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck}
55641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
5574da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckextern "C" void LLVMInitializeMBlazeAsmLexer();
5584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// Force static initialization.
5604da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckextern "C" void LLVMInitializeMBlazeAsmParser() {
5614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  RegisterAsmParser<MBlazeAsmParser> X(TheMBlazeTarget);
5624da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  LLVMInitializeMBlazeAsmLexer();
5634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
5644da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5654da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_REGISTER_MATCHER
5664da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_MATCHER_IMPLEMENTATION
5674da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeGenAsmMatcher.inc"
568