diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 69fb9d2844d3..9752e398bd99 100644 --- a/contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -45,10 +45,6 @@ using namespace llvm; #define DEBUG_TYPE "riscv-asm-parser" -// Include the auto-generated portion of the compress emitter. -#define GEN_COMPRESS_INSTR -#include "RISCVGenCompressInstEmitter.inc" - STATISTIC(RISCVNumInstrsCompressed, "Number of RISC-V Compressed instructions emitted"); @@ -74,6 +70,8 @@ class RISCVAsmParser : public MCTargetAsmParser { bool isRV32E() const { return getSTI().hasFeature(RISCV::FeatureRV32E); } RISCVTargetStreamer &getTargetStreamer() { + assert(getParser().getStreamer().getTargetStreamer() && + "do not have a target streamer"); MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer(); return static_cast<RISCVTargetStreamer &>(TS); } @@ -89,8 +87,9 @@ class RISCVAsmParser : public MCTargetAsmParser { uint64_t &ErrorInfo, bool MatchingInlineAsm) override; - bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; - OperandMatchResultTy tryParseRegister(unsigned &RegNo, SMLoc &StartLoc, + bool parseRegister(MCRegister &RegNo, SMLoc &StartLoc, + SMLoc &EndLoc) override; + OperandMatchResultTy tryParseRegister(MCRegister &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name, @@ -178,6 +177,7 @@ class RISCVAsmParser : public MCTargetAsmParser { bool parseDirectiveOption(); bool parseDirectiveAttribute(); bool parseDirectiveInsn(SMLoc L); + bool parseDirectiveVariantCC(); void setFeatureBits(uint64_t Feature, StringRef FeatureString) { if (!(getSTI().getFeatureBits()[Feature])) { @@ -805,7 +805,7 @@ public: } void print(raw_ostream &OS) const override { - auto RegName = [](unsigned Reg) { + auto RegName = [](MCRegister Reg) { if (Reg) return RISCVInstPrinter::getRegisterName(Reg); else @@ -1308,14 +1308,14 @@ static bool matchRegisterNameHelper(bool IsRV32E, MCRegister &RegNo, return RegNo == RISCV::NoRegister; } -bool RISCVAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, +bool RISCVAsmParser::parseRegister(MCRegister &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) { if (tryParseRegister(RegNo, StartLoc, EndLoc) != MatchOperand_Success) return Error(StartLoc, "invalid register name"); return false; } -OperandMatchResultTy RISCVAsmParser::tryParseRegister(unsigned &RegNo, +OperandMatchResultTy RISCVAsmParser::tryParseRegister(MCRegister &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) { const AsmToken &Tok = getParser().getTok(); @@ -2033,6 +2033,8 @@ bool RISCVAsmParser::ParseDirective(AsmToken DirectiveID) { return parseDirectiveAttribute(); if (IDVal == ".insn") return parseDirectiveInsn(DirectiveID.getLoc()); + if (IDVal == ".variant_cc") + return parseDirectiveVariantCC(); return true; } @@ -2096,6 +2098,7 @@ bool RISCVAsmParser::parseDirectiveOption() { "unexpected token, expected end of statement"); clearFeatureBits(RISCV::FeatureStdExtC, "c"); + clearFeatureBits(RISCV::FeatureExtZca, "+experimental-zca"); return false; } @@ -2165,7 +2168,7 @@ bool RISCVAsmParser::parseDirectiveAttribute() { TagLoc = Parser.getTok().getLoc(); if (Parser.getTok().is(AsmToken::Identifier)) { StringRef Name = Parser.getTok().getIdentifier(); - Optional<unsigned> Ret = + std::optional<unsigned> Ret = ELFAttrs::attrTypeFromString(Name, RISCVAttrs::getRISCVAttributeTags()); if (!Ret) { Error(TagLoc, "attribute name not recognised: " + Name); @@ -2294,9 +2297,22 @@ bool RISCVAsmParser::parseDirectiveInsn(SMLoc L) { /*MatchingInlineAsm=*/false); } +/// parseDirectiveVariantCC +/// ::= .variant_cc symbol +bool RISCVAsmParser::parseDirectiveVariantCC() { + StringRef Name; + if (getParser().parseIdentifier(Name)) + return TokError("expected symbol name"); + if (parseEOL()) + return false; + getTargetStreamer().emitDirectiveVariantCC( + *getContext().getOrCreateSymbol(Name)); + return false; +} + void RISCVAsmParser::emitToStreamer(MCStreamer &S, const MCInst &Inst) { MCInst CInst; - bool Res = compressInst(CInst, Inst, getSTI(), S.getContext()); + bool Res = RISCVRVC::compress(CInst, Inst, getSTI()); if (Res) ++RISCVNumInstrsCompressed; S.emitInstruction((Res ? CInst : Inst), getSTI()); @@ -2312,22 +2328,22 @@ void RISCVAsmParser::emitLoadImm(MCRegister DestReg, int64_t Value, switch (Inst.getOpndKind()) { case RISCVMatInt::Imm: emitToStreamer(Out, - MCInstBuilder(Inst.Opc).addReg(DestReg).addImm(Inst.Imm)); + MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addImm(Inst.getImm())); break; case RISCVMatInt::RegX0: emitToStreamer( - Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addReg( + Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addReg( RISCV::X0)); break; case RISCVMatInt::RegReg: emitToStreamer( - Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addReg( + Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addReg( SrcReg)); break; case RISCVMatInt::RegImm: emitToStreamer( - Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addImm( - Inst.Imm)); + Out, MCInstBuilder(Inst.getOpcode()).addReg(DestReg).addReg(SrcReg).addImm( + Inst.getImm())); break; } |