mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
Add stub methods for mips assembly matcher.
Patch by Vladimir Medic. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162124 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -753,6 +753,10 @@ class AsmParser {
|
|||||||
// function of the AsmParser class to call on every matched instruction.
|
// function of the AsmParser class to call on every matched instruction.
|
||||||
// This can be used to perform target specific instruction post-processing.
|
// This can be used to perform target specific instruction post-processing.
|
||||||
string AsmParserInstCleanup = "";
|
string AsmParserInstCleanup = "";
|
||||||
|
|
||||||
|
//ShouldEmitMatchRegisterName - Set to false if the target needs a hand
|
||||||
|
//written register name matcher
|
||||||
|
bit ShouldEmitMatchRegisterName = 1;
|
||||||
}
|
}
|
||||||
def DefaultAsmParser : AsmParser;
|
def DefaultAsmParser : AsmParser;
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
|
||||||
add_llvm_library(LLVMMipsAsmParser
|
add_llvm_library(LLVMMipsAsmParser
|
||||||
MipsAsmParser.cpp
|
MipsAsmParser.cpp
|
||||||
)
|
)
|
||||||
|
@@ -11,11 +11,20 @@
|
|||||||
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
||||||
#include "llvm/MC/MCTargetAsmParser.h"
|
#include "llvm/MC/MCTargetAsmParser.h"
|
||||||
#include "llvm/Support/TargetRegistry.h"
|
#include "llvm/Support/TargetRegistry.h"
|
||||||
|
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
||||||
|
#include "llvm/MC/MCTargetAsmParser.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
|
#include "llvm/MC/MCExpr.h"
|
||||||
|
#include "llvm/Support/MathExtras.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
class MipsAsmParser : public MCTargetAsmParser {
|
class MipsAsmParser : public MCTargetAsmParser {
|
||||||
|
|
||||||
|
#define GET_ASSEMBLER_HEADER
|
||||||
|
#include "MipsGenAsmMatcher.inc"
|
||||||
|
|
||||||
bool MatchAndEmitInstruction(SMLoc IDLoc,
|
bool MatchAndEmitInstruction(SMLoc IDLoc,
|
||||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||||
MCStreamer &Out);
|
MCStreamer &Out);
|
||||||
@@ -23,10 +32,11 @@ class MipsAsmParser : public MCTargetAsmParser {
|
|||||||
bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
|
bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
|
||||||
|
|
||||||
bool ParseInstruction(StringRef Name, SMLoc NameLoc,
|
bool ParseInstruction(StringRef Name, SMLoc NameLoc,
|
||||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands);
|
SmallVectorImpl<MCParsedAsmOperand*> &Operands);
|
||||||
|
|
||||||
bool ParseDirective(AsmToken DirectiveID);
|
bool ParseDirective(AsmToken DirectiveID);
|
||||||
|
|
||||||
|
OperandMatchResultTy parseMemOperand(SmallVectorImpl<MCParsedAsmOperand*>&);
|
||||||
public:
|
public:
|
||||||
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
|
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
|
||||||
: MCTargetAsmParser() {
|
: MCTargetAsmParser() {
|
||||||
@@ -35,6 +45,57 @@ public:
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
/// MipsOperand - Instances of this class represent a parsed Mips machine
|
||||||
|
/// instruction.
|
||||||
|
class MipsOperand : public MCParsedAsmOperand {
|
||||||
|
enum KindTy {
|
||||||
|
k_CondCode,
|
||||||
|
k_CoprocNum,
|
||||||
|
k_Immediate,
|
||||||
|
k_Memory,
|
||||||
|
k_PostIndexRegister,
|
||||||
|
k_Register,
|
||||||
|
k_Token
|
||||||
|
} Kind;
|
||||||
|
|
||||||
|
MipsOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
|
||||||
|
public:
|
||||||
|
void addRegOperands(MCInst &Inst, unsigned N) const {
|
||||||
|
llvm_unreachable("unimplemented!");
|
||||||
|
}
|
||||||
|
void addExpr(MCInst &Inst, const MCExpr *Expr) const{
|
||||||
|
llvm_unreachable("unimplemented!");
|
||||||
|
}
|
||||||
|
void addImmOperands(MCInst &Inst, unsigned N) const {
|
||||||
|
llvm_unreachable("unimplemented!");
|
||||||
|
}
|
||||||
|
void addMemOperands(MCInst &Inst, unsigned N) const {
|
||||||
|
llvm_unreachable("unimplemented!");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isReg() const { return Kind == k_Register; }
|
||||||
|
bool isImm() const { return Kind == k_Immediate; }
|
||||||
|
bool isToken() const { return Kind == k_Token; }
|
||||||
|
bool isMem() const { return Kind == k_Memory; }
|
||||||
|
|
||||||
|
StringRef getToken() const {
|
||||||
|
assert(Kind == k_Token && "Invalid access!");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned getReg() const {
|
||||||
|
assert((Kind == k_Register) && "Invalid access!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void print(raw_ostream &OS) const {
|
||||||
|
llvm_unreachable("unimplemented!");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
bool MipsAsmParser::
|
bool MipsAsmParser::
|
||||||
MatchAndEmitInstruction(SMLoc IDLoc,
|
MatchAndEmitInstruction(SMLoc IDLoc,
|
||||||
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
SmallVectorImpl<MCParsedAsmOperand*> &Operands,
|
||||||
@@ -58,6 +119,11 @@ ParseDirective(AsmToken DirectiveID) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MipsAsmParser::OperandMatchResultTy MipsAsmParser::
|
||||||
|
parseMemOperand(SmallVectorImpl<MCParsedAsmOperand*>&) {
|
||||||
|
return MatchOperand_ParseFail;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void LLVMInitializeMipsAsmParser() {
|
extern "C" void LLVMInitializeMipsAsmParser() {
|
||||||
RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget);
|
RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget);
|
||||||
RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget);
|
RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget);
|
||||||
|
@@ -10,6 +10,7 @@ tablegen(LLVM MipsGenDAGISel.inc -gen-dag-isel)
|
|||||||
tablegen(LLVM MipsGenCallingConv.inc -gen-callingconv)
|
tablegen(LLVM MipsGenCallingConv.inc -gen-callingconv)
|
||||||
tablegen(LLVM MipsGenSubtargetInfo.inc -gen-subtarget)
|
tablegen(LLVM MipsGenSubtargetInfo.inc -gen-subtarget)
|
||||||
tablegen(LLVM MipsGenEDInfo.inc -gen-enhanced-disassembly-info)
|
tablegen(LLVM MipsGenEDInfo.inc -gen-enhanced-disassembly-info)
|
||||||
|
tablegen(LLVM MipsGenAsmMatcher.inc -gen-asm-matcher)
|
||||||
add_public_tablegen_target(MipsCommonTableGen)
|
add_public_tablegen_target(MipsCommonTableGen)
|
||||||
|
|
||||||
add_llvm_target(MipsCodeGen
|
add_llvm_target(MipsCodeGen
|
||||||
|
@@ -16,7 +16,9 @@ BUILT_SOURCES = MipsGenRegisterInfo.inc MipsGenInstrInfo.inc \
|
|||||||
MipsGenAsmWriter.inc MipsGenCodeEmitter.inc \
|
MipsGenAsmWriter.inc MipsGenCodeEmitter.inc \
|
||||||
MipsGenDAGISel.inc MipsGenCallingConv.inc \
|
MipsGenDAGISel.inc MipsGenCallingConv.inc \
|
||||||
MipsGenSubtargetInfo.inc MipsGenMCCodeEmitter.inc \
|
MipsGenSubtargetInfo.inc MipsGenMCCodeEmitter.inc \
|
||||||
MipsGenEDInfo.inc MipsGenDisassemblerTables.inc
|
MipsGenEDInfo.inc MipsGenDisassemblerTables.inc \
|
||||||
|
MipsGenAsmMatcher.inc
|
||||||
|
|
||||||
DIRS = InstPrinter Disassembler AsmParser TargetInfo MCTargetDesc
|
DIRS = InstPrinter Disassembler AsmParser TargetInfo MCTargetDesc
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.common
|
include $(LEVEL)/Makefile.common
|
||||||
|
@@ -95,9 +95,20 @@ def MipsAsmWriter : AsmWriter {
|
|||||||
bit isMCAsmWriter = 1;
|
bit isMCAsmWriter = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
def Mips : Target {
|
def MipsAsmParser : AsmParser {
|
||||||
let InstructionSet = MipsInstrInfo;
|
let ShouldEmitMatchRegisterName = 0;
|
||||||
|
|
||||||
let AssemblyWriters = [MipsAsmWriter];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def MipsAsmParserVariant : AsmParserVariant {
|
||||||
|
int Variant = 0;
|
||||||
|
|
||||||
|
// Recognize hard coded registers.
|
||||||
|
string RegisterPrefix = "$";
|
||||||
|
}
|
||||||
|
|
||||||
|
def Mips : Target {
|
||||||
|
let InstructionSet = MipsInstrInfo;
|
||||||
|
let AssemblyParsers = [MipsAsmParser];
|
||||||
|
let AssemblyWriters = [MipsAsmWriter];
|
||||||
|
let AssemblyParserVariants = [MipsAsmParserVariant];
|
||||||
|
}
|
||||||
|
@@ -103,7 +103,7 @@ class FPStore<bits<6> op, string opstr, RegisterClass RC, Operand MemOpnd>:
|
|||||||
class FPIdxLoad<bits<6> funct, string opstr, RegisterClass DRC,
|
class FPIdxLoad<bits<6> funct, string opstr, RegisterClass DRC,
|
||||||
RegisterClass PRC, SDPatternOperator FOp = null_frag>:
|
RegisterClass PRC, SDPatternOperator FOp = null_frag>:
|
||||||
FFMemIdx<funct, (outs DRC:$fd), (ins PRC:$base, PRC:$index),
|
FFMemIdx<funct, (outs DRC:$fd), (ins PRC:$base, PRC:$index),
|
||||||
!strconcat(opstr, "\t$fd, $index($base)"),
|
!strconcat(opstr, "\t$fd, ${index}(${base})"),
|
||||||
[(set DRC:$fd, (FOp (add PRC:$base, PRC:$index)))]> {
|
[(set DRC:$fd, (FOp (add PRC:$base, PRC:$index)))]> {
|
||||||
let fs = 0;
|
let fs = 0;
|
||||||
}
|
}
|
||||||
@@ -112,7 +112,7 @@ class FPIdxLoad<bits<6> funct, string opstr, RegisterClass DRC,
|
|||||||
class FPIdxStore<bits<6> funct, string opstr, RegisterClass DRC,
|
class FPIdxStore<bits<6> funct, string opstr, RegisterClass DRC,
|
||||||
RegisterClass PRC, SDPatternOperator FOp= null_frag>:
|
RegisterClass PRC, SDPatternOperator FOp= null_frag>:
|
||||||
FFMemIdx<funct, (outs), (ins DRC:$fs, PRC:$base, PRC:$index),
|
FFMemIdx<funct, (outs), (ins DRC:$fs, PRC:$base, PRC:$index),
|
||||||
!strconcat(opstr, "\t$fs, $index($base)"),
|
!strconcat(opstr, "\t$fs, ${index}(${base})"),
|
||||||
[(FOp DRC:$fs, (add PRC:$base, PRC:$index))]> {
|
[(FOp DRC:$fs, (add PRC:$base, PRC:$index))]> {
|
||||||
let fd = 0;
|
let fd = 0;
|
||||||
}
|
}
|
||||||
|
@@ -208,17 +208,24 @@ def uimm16 : Operand<i32> {
|
|||||||
let PrintMethod = "printUnsignedImm";
|
let PrintMethod = "printUnsignedImm";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def MipsMemAsmOperand : AsmOperandClass {
|
||||||
|
let Name = "Mem";
|
||||||
|
let ParserMethod = "parseMemOperand";
|
||||||
|
}
|
||||||
|
|
||||||
// Address operand
|
// Address operand
|
||||||
def mem : Operand<i32> {
|
def mem : Operand<i32> {
|
||||||
let PrintMethod = "printMemOperand";
|
let PrintMethod = "printMemOperand";
|
||||||
let MIOperandInfo = (ops CPURegs, simm16);
|
let MIOperandInfo = (ops CPURegs, simm16);
|
||||||
let EncoderMethod = "getMemEncoding";
|
let EncoderMethod = "getMemEncoding";
|
||||||
|
let ParserMatchClass = MipsMemAsmOperand;
|
||||||
}
|
}
|
||||||
|
|
||||||
def mem64 : Operand<i64> {
|
def mem64 : Operand<i64> {
|
||||||
let PrintMethod = "printMemOperand";
|
let PrintMethod = "printMemOperand";
|
||||||
let MIOperandInfo = (ops CPU64Regs, simm16_64);
|
let MIOperandInfo = (ops CPU64Regs, simm16_64);
|
||||||
let EncoderMethod = "getMemEncoding";
|
let EncoderMethod = "getMemEncoding";
|
||||||
|
let ParserMatchClass = MipsMemAsmOperand;
|
||||||
}
|
}
|
||||||
|
|
||||||
def mem_ea : Operand<i32> {
|
def mem_ea : Operand<i32> {
|
||||||
|
@@ -239,6 +239,9 @@ let Namespace = "Mips" in {
|
|||||||
// fcc0 register
|
// fcc0 register
|
||||||
def FCC0 : Register<"fcc0">;
|
def FCC0 : Register<"fcc0">;
|
||||||
|
|
||||||
|
// PC register
|
||||||
|
def PC : Register<"pc">;
|
||||||
|
|
||||||
// Hardware register $29
|
// Hardware register $29
|
||||||
def HWR29 : Register<"29">;
|
def HWR29 : Register<"29">;
|
||||||
def HWR29_64 : Register<"29">;
|
def HWR29_64 : Register<"29">;
|
||||||
|
@@ -2447,7 +2447,9 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
|
|||||||
emitSubtargetFeatureFlagEnumeration(Info, OS);
|
emitSubtargetFeatureFlagEnumeration(Info, OS);
|
||||||
|
|
||||||
// Emit the function to match a register name to number.
|
// Emit the function to match a register name to number.
|
||||||
emitMatchRegisterName(Target, AsmParser, OS);
|
// This should be omitted for Mips target
|
||||||
|
if (AsmParser->getValueAsBit("ShouldEmitMatchRegisterName"))
|
||||||
|
emitMatchRegisterName(Target, AsmParser, OS);
|
||||||
|
|
||||||
OS << "#endif // GET_REGISTER_MATCHER\n\n";
|
OS << "#endif // GET_REGISTER_MATCHER\n\n";
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user