diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 23:22:46 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 23:22:46 +0800 |
| commit | 03859a465585d5e9dd256c7a0a2855219dc79ed3 (patch) | |
| tree | 247de963fe9e7bd9fa2ce579e1eeaea686d25918 /backend/lib/Target/RISCV/RISCVImmediateMaterialization.h | |
| parent | 5690d6d01ce6f1ced0f02a3be3562bf163ae5f78 (diff) | |
| download | rcc-project-03859a465585d5e9dd256c7a0a2855219dc79ed3.tar.gz rcc-project-03859a465585d5e9dd256c7a0a2855219dc79ed3.tar.xz | |
[RISCV][GlobalISel] Match LLVM constant materialization
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVImmediateMaterialization.h')
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVImmediateMaterialization.h | 29 |
1 files changed, 26 insertions, 3 deletions
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 <cstddef> #include <cstdint> +#include <vector> 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<ImmediateMaterializationInstruction>; + 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 |
