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