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