diff options
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp')
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVImmediateMaterialization.cpp | 27 |
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); |
