aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-12 22:37:49 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-12 22:37:49 +0800
commit3341938bb644e6fc39afa6a8fcb1306604999e42 (patch)
treea7586c0a8a9d3e7e9dbc8709daf4dd76ca51be5f /backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp
parent0bb35fa2306a66f1f0baf118619b5c1640ed9c01 (diff)
downloadrcc-project-3341938bb644e6fc39afa6a8fcb1306604999e42.tar.gz
rcc-project-3341938bb644e6fc39afa6a8fcb1306604999e42.tar.xz
[RISCV] Split the GlobalISel target components
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp27
1 files changed, 9 insertions, 18 deletions
diff --git a/backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp b/backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp
index 56bce25..d25a609 100644
--- a/backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp
+++ b/backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp
@@ -18,8 +18,7 @@ namespace {
return Value >= Minimum && Value <= Maximum;
}
-[[nodiscard]] constexpr std::int64_t signExtend(std::uint64_t Value,
- std::uint32_t Bits) noexcept {
+[[nodiscard]] constexpr std::int64_t signExtend(std::uint64_t Value, std::uint32_t Bits) noexcept {
const std::uint64_t Mask = (std::uint64_t{1} << Bits) - 1U;
const std::uint64_t Sign = std::uint64_t{1} << (Bits - 1U);
Value &= Mask;
@@ -59,13 +58,11 @@ namespace {
static_cast<std::size_t>(Low12 != 0);
}
-[[nodiscard]] std::optional<std::size_t>
-leadingZeroBuildCost(std::uint64_t Value) noexcept {
+[[nodiscard]] std::optional<std::size_t> leadingZeroBuildCost(std::uint64_t Value) noexcept {
if (Value == 0 || (Value & (std::uint64_t{1} << 63U)) != 0)
return std::nullopt;
- const std::uint32_t LeadingZeros =
- static_cast<std::uint32_t>(std::countl_zero(Value));
+ const std::uint32_t LeadingZeros = static_cast<std::uint32_t>(std::countl_zero(Value));
const std::uint64_t Shifted = Value << LeadingZeros;
const std::uint64_t LowMask = (std::uint64_t{1} << LeadingZeros) - 1U;
std::optional<std::size_t> Best;
@@ -79,8 +76,7 @@ leadingZeroBuildCost(std::uint64_t Value) noexcept {
return Best;
}
-[[nodiscard]] std::optional<std::size_t>
-twoRegisterBuildCost(std::int64_t Value) noexcept {
+[[nodiscard]] std::optional<std::size_t> twoRegisterBuildCost(std::int64_t Value) noexcept {
const std::uint64_t Bits = static_cast<std::uint64_t>(Value);
const std::int64_t Low = signExtend(Bits, 32);
if (Low == 0)
@@ -91,8 +87,7 @@ twoRegisterBuildCost(std::int64_t Value) noexcept {
return std::nullopt;
const std::uint32_t LowZeros =
static_cast<std::uint32_t>(std::countr_zero(static_cast<std::uint64_t>(Low)));
- const std::uint32_t HighZeros =
- static_cast<std::uint32_t>(std::countr_zero(HighContribution));
+ const std::uint32_t HighZeros = static_cast<std::uint32_t>(std::countr_zero(HighContribution));
if (LowZeros >= 32 || HighZeros < 32 || HighZeros < LowZeros)
return std::nullopt;
const std::uint32_t Shift = HighZeros - LowZeros;
@@ -108,8 +103,7 @@ std::size_t estimateRV64IntegerBuildCost(std::int64_t Value) noexcept {
std::size_t Best = baseBuildCost(Value);
if ((Bits & 0xFFFU) != 0 && (Bits & 1U) == 0 && Best >= 2) {
- const std::uint32_t TrailingZeros =
- static_cast<std::uint32_t>(std::countr_zero(Bits));
+ const std::uint32_t TrailingZeros = static_cast<std::uint32_t>(std::countr_zero(Bits));
const std::int64_t Shifted = Value >> TrailingZeros;
const std::size_t Candidate = baseBuildCost(Shifted) + 1U;
if (Candidate < Best || fitsSigned(Shifted, 6))
@@ -119,8 +113,7 @@ std::size_t estimateRV64IntegerBuildCost(std::int64_t Value) noexcept {
return Best;
if ((Bits & 0xFFFU) != 0 && (Bits & 0x1800U) == 0x1000U) {
- const std::int64_t LastAdd =
- -static_cast<std::int64_t>(0x800U - (Bits & 0xFFFU));
+ const std::int64_t LastAdd = -static_cast<std::int64_t>(0x800U - (Bits & 0xFFFU));
const std::uint64_t AdjustedBits = Bits - static_cast<std::uint64_t>(LastAdd);
Best = std::min(Best, baseBuildCost(std::bit_cast<std::int64_t>(AdjustedBits)) + 1U);
}
@@ -129,16 +122,14 @@ std::size_t estimateRV64IntegerBuildCost(std::int64_t Value) noexcept {
if (const auto Candidate = leadingZeroBuildCost(Bits); Candidate && *Candidate < Best)
Best = *Candidate;
} else if (Value < 0 && Best > 3) {
- if (const auto Candidate = leadingZeroBuildCost(~Bits);
- Candidate && *Candidate + 1U < Best) {
+ if (const auto Candidate = leadingZeroBuildCost(~Bits); Candidate && *Candidate + 1U < Best) {
Best = *Candidate + 1U;
}
}
return Best;
}
-bool shouldUseRV64IntegerConstantPool(std::int64_t Value,
- std::size_t MaximumBuildCost) noexcept {
+bool shouldUseRV64IntegerConstantPool(std::int64_t Value, std::size_t MaximumBuildCost) noexcept {
if (fitsSigned(Value, 32) || estimateRV64IntegerBuildCost(Value) <= MaximumBuildCost)
return false;
const auto TwoRegisterCost = twoRegisterBuildCost(Value);