MBlazeAsmParser.cpp revision bf7553210ae44f05e7460edeae1ee499d8a22dcb
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  TargetMachine &TM;
364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MCAsmParser &getParser() const { return Parser; }
384da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MCAsmLexer &getLexer() const { return Parser.getLexer(); }
394da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
404da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
414da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
424da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
44bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  MBlazeOperand *ParseRegister(unsigned &RegNo);
450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseImmediate();
460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *ParseFsl();
470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand* ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
49bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
50bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky
5141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  bool ParseDirectiveWord(unsigned Size, SMLoc L);
5241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  bool MatchAndEmitInstruction(SMLoc IDLoc,
544da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck                               SmallVectorImpl<MCParsedAsmOperand*> &Operands,
550a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                               MCStreamer &Out);
564da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
574da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// @name Auto-generated Match Functions
584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// {
594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
604da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_ASSEMBLER_HEADER
614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeGenAsmMatcher.inc"
624da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// }
644da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
654da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
664da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckpublic:
674da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MBlazeAsmParser(const Target &T, MCAsmParser &_Parser, TargetMachine &_TM)
684da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    : TargetAsmParser(T), Parser(_Parser), TM(_TM) {}
694da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
704da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  virtual bool ParseInstruction(StringRef Name, SMLoc NameLoc,
714da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck                                SmallVectorImpl<MCParsedAsmOperand*> &Operands);
724da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
734da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  virtual bool ParseDirective(AsmToken DirectiveID);
744da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck};
750a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
764da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// MBlazeOperand - Instances of this class represent a parsed MBlaze machine
774da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// instruction.
784da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckstruct MBlazeOperand : public MCParsedAsmOperand {
794da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  enum KindTy {
800a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Token,
814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Immediate,
824da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Register,
830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Memory,
840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Fsl
854da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  } Kind;
864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc StartLoc, EndLoc;
884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
894da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  union {
904da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      const char *Data;
924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      unsigned Length;
934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Tok;
944da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
954da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
964da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      unsigned RegNum;
974da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Reg;
984da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
994da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
1004da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      const MCExpr *Val;
1014da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Imm;
1020a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1034da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    struct {
1040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      unsigned Base;
1050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      unsigned OffReg;
1060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      const MCExpr *Off;
1074da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    } Mem;
1084da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1090a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    struct {
1100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      const MCExpr *Val;
1110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    } FslImm;
1124da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  };
1130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
1150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckpublic:
1164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  MBlazeOperand(const MBlazeOperand &o) : MCParsedAsmOperand() {
1174da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Kind = o.Kind;
1184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    StartLoc = o.StartLoc;
1194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    EndLoc = o.EndLoc;
1204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    switch (Kind) {
1214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Register:
1224da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Reg = o.Reg;
1234da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1244da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Immediate:
1254da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Imm = o.Imm;
1264da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    case Token:
1280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Tok = o.Tok;
1290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      break;
1304da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    case Memory:
1314da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Mem = o.Mem;
1324da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      break;
1330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    case Fsl:
1340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      FslImm = o.FslImm;
1350a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      break;
1364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    }
1374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1380a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1394da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// getStartLoc - Get the location of the first token of this operand.
1404da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc getStartLoc() const { return StartLoc; }
1410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1424da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  /// getEndLoc - Get the location of the last token of this operand.
1434da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  SMLoc getEndLoc() const { return EndLoc; }
1444da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1454da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  unsigned getReg() const {
1464da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(Kind == Register && "Invalid access!");
1474da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    return Reg.RegNum;
1484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1494da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1504da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  const MCExpr *getImm() const {
1514da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(Kind == Immediate && "Invalid access!");
1524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    return Imm.Val;
1534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1544da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1550a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr *getFslImm() const {
1560a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Fsl && "Invalid access!");
1570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return FslImm.Val;
1580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned getMemBase() const {
1610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.Base;
1630a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1644da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr* getMemOff() const {
1660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1670a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.Off;
1680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
1700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned getMemOffReg() const {
1710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Memory && "Invalid access!");
1720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Mem.OffReg;
1730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
1744da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1750a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isToken() const { return Kind == Token; }
1760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isImm() const { return Kind == Immediate; }
1770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isMem() const { return Kind == Memory; }
1780a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isFsl() const { return Kind == Fsl; }
1790a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  bool isReg() const { return Kind == Register; }
1804da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addExpr(MCInst &Inst, const MCExpr *Expr) const {
1820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Add as immediates when possible.  Null MCExpr = 0.
1830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (Expr == 0)
1840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Inst.addOperand(MCOperand::CreateImm(0));
1850a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
1864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
1874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    else
1884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck      Inst.addOperand(MCOperand::CreateExpr(Expr));
1894da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1904da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addRegOperands(MCInst &Inst, unsigned N) const {
1924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(N == 1 && "Invalid number of operands!");
1934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Inst.addOperand(MCOperand::CreateReg(getReg()));
1944da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
1954da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
1964da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  void addImmOperands(MCInst &Inst, unsigned N) const {
1974da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    assert(N == 1 && "Invalid number of operands!");
1984da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    addExpr(Inst, getImm());
1994da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2004da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  void addFslOperands(MCInst &Inst, unsigned N) const {
2020a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(N == 1 && "Invalid number of operands!");
2030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    addExpr(Inst, getFslImm());
2040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2054da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  void addMemOperands(MCInst &Inst, unsigned N) const {
2070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(N == 2 && "Invalid number of operands!");
2080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
20941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    Inst.addOperand(MCOperand::CreateReg(getMemBase()));
21041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
2110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    unsigned RegOff = getMemOffReg();
2120a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (RegOff)
2130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Inst.addOperand(MCOperand::CreateReg(RegOff));
2140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    else
2150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      addExpr(Inst, getMemOff());
2160a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2170a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2180a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  StringRef getToken() const {
2190a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    assert(Kind == Token && "Invalid access!");
2200a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return StringRef(Tok.Data, Tok.Length);
2214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2224da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  virtual void dump(raw_ostream &OS) const;
2240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateToken(StringRef Str, SMLoc S) {
2260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Token);
2274da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Tok.Data = Str.data();
2284da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Tok.Length = Str.size();
2294da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2304da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = S;
2310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2324da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2334da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
2350a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Register);
2364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Reg.RegNum = RegNum;
2374da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2384da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
2430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Immediate);
2440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Imm.Val = Val;
2450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->StartLoc = S;
2460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->EndLoc = E;
2470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2494da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2500a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateFslImm(const MCExpr *Val, SMLoc S, SMLoc E) {
2510a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Fsl);
2524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->Imm.Val = Val;
2534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2544da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2550a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2560a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
2570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
2580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateMem(unsigned Base, const MCExpr *Off, SMLoc S,
2590a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                                  SMLoc E) {
2600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Memory);
2610a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Base = Base;
2620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Off = Off;
2630a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.OffReg = 0;
2640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->StartLoc = S;
2650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->EndLoc = E;
2660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2674da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2684da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  static MBlazeOperand *CreateMem(unsigned Base, unsigned Off, SMLoc S,
2700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                                  SMLoc E) {
2710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    MBlazeOperand *Op = new MBlazeOperand(Memory);
2720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Base = Base;
2730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.OffReg = Off;
2740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op->Mem.Off = 0;
2754da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->StartLoc = S;
2764da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    Op->EndLoc = E;
2770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Op;
2784da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
2794da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck};
2804da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck} // end anonymous namespace.
2824da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
2834da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckvoid MBlazeOperand::dump(raw_ostream &OS) const {
2844da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  switch (Kind) {
2854da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Immediate:
2864da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    getImm()->print(OS);
2874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
2884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Register:
28941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << "<register R";
29041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << MBlazeRegisterInfo::getRegisterNumbering(getReg()) << ">";
2914da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
2924da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case Token:
2934da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    OS << "'" << getToken() << "'";
2944da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    break;
29541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  case Memory: {
29641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << "<memory R";
29741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << MBlazeRegisterInfo::getRegisterNumbering(getMemBase());
29841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << ", ";
29941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
30041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    unsigned RegOff = getMemOffReg();
30141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    if (RegOff)
30241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      OS << "R" << MBlazeRegisterInfo::getRegisterNumbering(RegOff);
30341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    else
30441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      OS << getMemOff();
30541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    OS << ">";
30641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    }
3070a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    break;
3080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Fsl:
3090a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    getFslImm()->print(OS);
3100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    break;
3114da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3124da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3134da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3144da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// @name Auto-generated Match Functions
3154da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// {
3164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3174da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckstatic unsigned MatchRegisterName(StringRef Name);
3184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// }
3200a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck//
3210a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::
3220a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMatchAndEmitInstruction(SMLoc IDLoc,
3230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                        SmallVectorImpl<MCParsedAsmOperand*> &Operands,
3240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                        MCStreamer &Out) {
3250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MCInst Inst;
3260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc ErrorLoc;
3270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned ErrorInfo;
3280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (MatchInstructionImpl(Operands, Inst, ErrorInfo)) {
3300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_Success:
3310a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Out.EmitInstruction(Inst);
3320a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return false;
3330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_MissingFeature:
3340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Error(IDLoc, "instruction use requires an option to be enabled");
3350a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_MnemonicFail:
3360a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return Error(IDLoc, "unrecognized instruction mnemonic");
3370a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case Match_InvalidOperand:
3380a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    ErrorLoc = IDLoc;
3390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (ErrorInfo != ~0U) {
3400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      if (ErrorInfo >= Operands.size())
3410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck        return Error(IDLoc, "too few operands for instruction");
3420a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      ErrorLoc = ((MBlazeOperand*)Operands[ErrorInfo])->getStartLoc();
3440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
3454da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck    }
3464da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return Error(ErrorLoc, "invalid operand for instruction");
3480a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
3494da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3500a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  llvm_unreachable("Implement any new match types added!");
3510a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return true;
3524da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3540a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::
3550a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
3560a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Operands.size() != 4)
3570a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3590a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand &Base = *(MBlazeOperand*)Operands[2];
3600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand &Offset = *(MBlazeOperand*)Operands[3];
3614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3620a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Base.getStartLoc();
3630a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc O = Offset.getStartLoc();
3640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = Offset.getEndLoc();
3650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Base.isReg()) {
3670a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(S, "base address must be a register");
3680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3694da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3704da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3710a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Offset.isReg() && !Offset.isImm()) {
3720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(O, "offset must be a register or immediate");
3730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
3744da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
3754da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
3760a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *Op;
3770a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Offset.isReg())
3780a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = MBlazeOperand::CreateMem(Base.getReg(), Offset.getReg(), S, E);
3790a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  else
3800a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = MBlazeOperand::CreateMem(Base.getReg(), Offset.getImm(), S, E);
3810a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3820a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  delete Operands.pop_back_val();
3830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  delete Operands.pop_back_val();
3840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  Operands.push_back(Op);
3850a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3860a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return Op;
3874da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
3884da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
389bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divackybool MBlazeAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) {
390bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  return (ParseRegister(RegNo) == 0);
391bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky}
392bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky
393bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman DivackyMBlazeOperand *MBlazeAsmParser::ParseRegister(unsigned &RegNo) {
3940a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
3950a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
3960a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
3970a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (getLexer().getKind()) {
3980a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
3990a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Identifier:
400bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky    RegNo = MatchRegisterName(getLexer().getTok().getIdentifier());
4010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (RegNo == 0)
4020a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
40441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    getLexer().Lex();
4050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateReg(RegNo, S, E);
4064da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4074da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4084da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
409d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerstatic unsigned MatchFslRegister(StringRef String) {
4100a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!String.startswith("rfsl"))
4110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return -1;
4124da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  unsigned regNum;
4140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (String.substr(4).getAsInteger(10,regNum))
4150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return -1;
4164da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4170a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return regNum;
4180a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck}
4194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4200a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::ParseFsl() {
4210a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
4220a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4234da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4240a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  switch (getLexer().getKind()) {
4250a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
4260a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Identifier:
4270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    unsigned reg = MatchFslRegister(getLexer().getTok().getIdentifier());
4280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (reg >= 16)
4290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4300a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
43141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    getLexer().Lex();
4320a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    const MCExpr *EVal = MCConstantExpr::Create(reg,getContext());
4330a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateFslImm(EVal,S,E);
4340a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
4354da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4364da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4370a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::ParseImmediate() {
4380a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc S = Parser.getTok().getLoc();
4390a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4400a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4410a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  const MCExpr *EVal;
4424da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  switch (getLexer().getKind()) {
4430a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  default: return 0;
4440a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::LParen:
4450a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Plus:
4460a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Minus:
4470a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  case AsmToken::Integer:
4484da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  case AsmToken::Identifier:
4490a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    if (getParser().ParseExpression(EVal))
4500a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return 0;
4510a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4520a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return MBlazeOperand::CreateImm(EVal, S, E);
4534da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4544da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4554da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4560a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckMBlazeOperand *MBlazeAsmParser::
4570a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
4580a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  MBlazeOperand *Op;
4594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4600a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as a register name
461bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  unsigned RegNo;
462bf7553210ae44f05e7460edeae1ee499d8a22dcbRoman Divacky  Op = ParseRegister(RegNo);
4634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4640a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as an FSL immediate
4650a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op)
4660a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = ParseFsl();
4674da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4680a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Attempt to parse the next token as an immediate
4690a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op)
4700a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Op = ParseImmediate();
4714da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4720a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If the token could not be parsed then fail
4730a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (!Op) {
4740a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    Error(Parser.getTok().getLoc(), "unknown operand");
4750a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return 0;
4764da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  }
4774da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4780a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Push the parsed operand into the list of operands
4790a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  Operands.push_back(Op);
4800a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return Op;
4814da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
4824da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4830a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck/// Parse an mblaze instruction mnemonic followed by its operands.
4840a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::
4850a67d92938d77b6a8cde6e1676750264b274cebcWesley PeckParseInstruction(StringRef Name, SMLoc NameLoc,
4860a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck                 SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
48741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  // The first operands is the token for the instruction name
48841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  size_t dotLoc = Name.find('.');
48941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  Operands.push_back(MBlazeOperand::CreateToken(Name.substr(0,dotLoc),NameLoc));
49041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (dotLoc < Name.size())
49141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    Operands.push_back(MBlazeOperand::CreateToken(Name.substr(dotLoc),NameLoc));
4920a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
4930a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If there are no more operands then finish
4940a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (getLexer().is(AsmToken::EndOfStatement))
4950a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return false;
4964da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
4970a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // Parse the first operand
49860f923c5e2d752ce5c6e042db8279122eff798ddWesley Peck  if (!ParseOperand(Operands))
4990a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    return true;
5004da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5010a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  while (getLexer().isNot(AsmToken::EndOfStatement) &&
5020a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck         getLexer().is(AsmToken::Comma)) {
5030a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Consume the comma token
5040a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    getLexer().Lex();
5050a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
5060a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck    // Parse the next operand
50760f923c5e2d752ce5c6e042db8279122eff798ddWesley Peck    if (!ParseOperand(Operands))
5080a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      return true;
5090a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  }
5104da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5110a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // If the instruction requires a memory operand then we need to
5120a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // replace the last two operands (base+offset) with a single
5130a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  // memory operand.
5140a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  if (Name.startswith("lw") || Name.startswith("sw") ||
5150a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Name.startswith("lh") || Name.startswith("sh") ||
5160a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck      Name.startswith("lb") || Name.startswith("sb"))
51741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    return (ParseMemory(Operands) == NULL);
5184da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5194da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  return false;
5204da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
5214da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5220a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck/// ParseDirective parses the arm specific directives
5230a67d92938d77b6a8cde6e1676750264b274cebcWesley Peckbool MBlazeAsmParser::ParseDirective(AsmToken DirectiveID) {
52441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  StringRef IDVal = DirectiveID.getIdentifier();
52541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (IDVal == ".word")
52641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    return ParseDirectiveWord(2, DirectiveID.getLoc());
5270a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck  return true;
5280a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck}
5290a67d92938d77b6a8cde6e1676750264b274cebcWesley Peck
53041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck/// ParseDirectiveWord
53141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck///  ::= .word [ expression (, expression)* ]
53241400da31ead2f61d171381c0945dceddd8fc786Wesley Peckbool MBlazeAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
53341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  if (getLexer().isNot(AsmToken::EndOfStatement)) {
53441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    for (;;) {
53541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      const MCExpr *Value;
53641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getParser().ParseExpression(Value))
53741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        return true;
53841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
53941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      getParser().getStreamer().EmitValue(Value, Size, 0 /*addrspace*/);
54041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
54141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getLexer().is(AsmToken::EndOfStatement))
54241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        break;
54341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
54441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      // FIXME: Improve diagnostic.
54541400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      if (getLexer().isNot(AsmToken::Comma))
54641400da31ead2f61d171381c0945dceddd8fc786Wesley Peck        return Error(L, "unexpected token in directive");
54741400da31ead2f61d171381c0945dceddd8fc786Wesley Peck      Parser.Lex();
54841400da31ead2f61d171381c0945dceddd8fc786Wesley Peck    }
54941400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  }
55041400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
55141400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  Parser.Lex();
55241400da31ead2f61d171381c0945dceddd8fc786Wesley Peck  return false;
55341400da31ead2f61d171381c0945dceddd8fc786Wesley Peck}
55441400da31ead2f61d171381c0945dceddd8fc786Wesley Peck
5554da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckextern "C" void LLVMInitializeMBlazeAsmLexer();
5564da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5574da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck/// Force static initialization.
5584da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peckextern "C" void LLVMInitializeMBlazeAsmParser() {
5594da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  RegisterAsmParser<MBlazeAsmParser> X(TheMBlazeTarget);
5604da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck  LLVMInitializeMBlazeAsmLexer();
5614da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck}
5624da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck
5634da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_REGISTER_MATCHER
5644da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#define GET_MATCHER_IMPLEMENTATION
5654da992aebada7445ef68a7b6b94676dd26e9d537Wesley Peck#include "MBlazeGenAsmMatcher.inc"
566