aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-04-14 21:41:27 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-06-22 18:20:56 +0000
commitbdd1243df58e60e85101c09001d9812a789b6bc4 (patch)
treea1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
parent781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff)
parente3b557809604d036af6e00c60f012c2025b59a5e (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.cpp48
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;
}