aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-22 19:16:18 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-22 19:16:18 +0800
commit75f1223070749b0df3002226ebbb474c68c71f90 (patch)
treee3b386180f6ea394381862d5ff9b5394ac0a6481 /backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp
parent36b0be1ec1558f88d4f031a1817c3a4c2cba07a6 (diff)
downloadrcc-project-75f1223070749b0df3002226ebbb474c68c71f90.tar.gz
rcc-project-75f1223070749b0df3002226ebbb474c68c71f90.tar.xz
[RISCV] Generate MC pseudo lowering
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp b/backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp
index 61cb587..85c06ad 100644
--- a/backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp
+++ b/backend/lib/Target/RISCV/RISCVMCTargetLowering.cpp
@@ -240,6 +240,10 @@ constexpr std::uint32_t KnownTargetFlags = CallTargetFlag | PCRelativeHighTarget
"RISC-V MC lowering encountered a non-encoding operand");
}
+#define GET_MC_PSEUDO_LOWERING
+#include "RISCVGenMCPseudoLowering.inc"
+#undef GET_MC_PSEUDO_LOWERING
+
[[nodiscard]] const AssemblyFormatInfo *assemblyFormat(AssemblyFormatID ID) noexcept {
const auto Formats = assemblyFormats();
const auto Position = std::ranges::find(Formats, ID, &AssemblyFormatInfo::ID);
@@ -866,6 +870,11 @@ Expected<mc::MCInst> RISCVMCTargetLowering::lowerInstruction(const MachineInstr
Expected<void> RISCVMCTargetLowering::emitTerminalInstruction(const MachineInstr &Instruction,
MachineMCContext &Context,
mc::MCStreamer &Streamer) const {
+ auto Pseudo = lowerGeneratedMCPseudo(Instruction, Context);
+ if (!Pseudo)
+ return std::unexpected(Pseudo.error());
+ if (*Pseudo)
+ return Streamer.emitInstruction(**Pseudo);
if (Instruction.opcode() != opcode(GenericOpcode::INLINEASM) &&
Instruction.opcode() != opcode(GenericOpcode::INLINEASM_BR)) {
return TargetMCInstLowering::emitTerminalInstruction(Instruction, Context, Streamer);