From 03859a465585d5e9dd256c7a0a2855219dc79ed3 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sat, 15 Aug 2026 23:22:46 +0800 Subject: [RISCV][GlobalISel] Match LLVM constant materialization --- .../Target/RISCV/RISCVImmediateMaterialization.h | 29 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'backend/lib/Target/RISCV/RISCVImmediateMaterialization.h') diff --git a/backend/lib/Target/RISCV/RISCVImmediateMaterialization.h b/backend/lib/Target/RISCV/RISCVImmediateMaterialization.h index e38f752..4d58ec2 100644 --- a/backend/lib/Target/RISCV/RISCVImmediateMaterialization.h +++ b/backend/lib/Target/RISCV/RISCVImmediateMaterialization.h @@ -5,15 +5,38 @@ #include #include +#include namespace rcc::riscv { +enum class InstructionOpcode : std::uint32_t; +class RISCVSubtargetFeatures; + +enum class ImmediateMaterializationOperandKind : std::uint8_t { + Immediate, + RegisterImmediate, +}; + +struct ImmediateMaterializationInstruction final { + InstructionOpcode Opcode; + std::int64_t Immediate = 0; + ImmediateMaterializationOperandKind OperandKind = + ImmediateMaterializationOperandKind::RegisterImmediate; +}; + +using ImmediateMaterializationSequence = std::vector; + inline constexpr std::size_t DefaultRV64IntegerBuildCost = 5; -[[nodiscard]] std::size_t estimateRV64IntegerBuildCost(std::int64_t Value) noexcept; +[[nodiscard]] ImmediateMaterializationSequence +generateRV64IntegerMaterialization(std::int64_t Value, const RISCVSubtargetFeatures &Features); + +[[nodiscard]] std::size_t estimateRV64IntegerBuildCost(std::int64_t Value, + const RISCVSubtargetFeatures &Features); -[[nodiscard]] bool shouldUseRV64IntegerConstantPool( - std::int64_t Value, std::size_t MaximumBuildCost = DefaultRV64IntegerBuildCost) noexcept; +[[nodiscard]] bool +shouldUseRV64IntegerConstantPool(std::int64_t Value, const RISCVSubtargetFeatures &Features, + std::size_t MaximumBuildCost = DefaultRV64IntegerBuildCost); } // namespace rcc::riscv -- cgit v1.2.3