aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-13 06:52:15 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-13 06:52:15 +0800
commitaa7c85ca71859aab15bdf1e6dc1ea3a5aa5d1e28 (patch)
tree20d94c4debfe4900e362c6c7f8443bcfbd58ec28 /backend/lib/CodeGen
parentd62f022c92fcc3ebe2269273628943a0089683fd (diff)
downloadrcc-project-aa7c85ca71859aab15bdf1e6dc1ea3a5aa5d1e28.tar.gz
rcc-project-aa7c85ca71859aab15bdf1e6dc1ea3a5aa5d1e28.tar.xz
[Support] Split APInt and APFloat ownership
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/GenericConstant.cpp15
-rw-r--r--backend/lib/CodeGen/GlobalObject.cpp8
-rw-r--r--backend/lib/CodeGen/LowLevelType.cpp62
-rw-r--r--backend/lib/CodeGen/MIRParser/MIParser.cpp10
-rw-r--r--backend/lib/CodeGen/MIRPrinter.cpp4
-rw-r--r--backend/lib/CodeGen/MachineIRBuilder.cpp6
-rw-r--r--backend/lib/CodeGen/MachineOperand.cpp213
7 files changed, 22 insertions, 296 deletions
diff --git a/backend/lib/CodeGen/GenericConstant.cpp b/backend/lib/CodeGen/GenericConstant.cpp
index d9d9233..afcdd44 100644
--- a/backend/lib/CodeGen/GenericConstant.cpp
+++ b/backend/lib/CodeGen/GenericConstant.cpp
@@ -203,8 +203,7 @@ nonPointerFixedBitWidth(const GenericConstantType &Type) noexcept {
return false;
}
-[[nodiscard]] bool signedIntegerLess(const IntegerImmediate &Left,
- const IntegerImmediate &Right) noexcept {
+[[nodiscard]] bool signedIntegerLess(const APInt &Left, const APInt &Right) noexcept {
if (Left.bitWidth() != Right.bitWidth())
return false;
if (Left.isNegative() != Right.isNegative())
@@ -249,7 +248,7 @@ nonPointerFixedBitWidth(const GenericConstantType &Type) noexcept {
case GenericConstantTypeKind::Metadata:
return RequireNoElements();
case GenericConstantTypeKind::Integer:
- if (Type.BitWidth == 0 || Type.BitWidth > IntegerImmediate::MaxBitWidth) {
+ if (Type.BitWidth == 0 || Type.BitWidth > APInt::MaxBitWidth) {
return makeUnexpected(ErrorCode::VerificationError,
"generic integer type has an invalid bit width");
}
@@ -257,7 +256,7 @@ nonPointerFixedBitWidth(const GenericConstantType &Type) noexcept {
case GenericConstantTypeKind::Byte:
return RequireNoElements();
case GenericConstantTypeKind::Floating:
- if (!isKnownFloatSemantics(Type.Semantics)) {
+ if (!getFloatSemanticsBitWidth(Type.Semantics)) {
return makeUnexpected(ErrorCode::VerificationError,
"generic floating type has unknown semantics");
}
@@ -702,7 +701,7 @@ nonPointerFixedBitWidth(const GenericConstantType &Type) noexcept {
} // namespace
Expected<GenericConstantType> GenericConstantType::integer(std::uint32_t Width) {
- if (Width == 0 || Width > IntegerImmediate::MaxBitWidth)
+ if (Width == 0 || Width > APInt::MaxBitWidth)
return makeUnexpected(ErrorCode::InvalidArgument, "generic integer type width is invalid");
GenericConstantType Type;
Type.Kind = GenericConstantTypeKind::Integer;
@@ -724,7 +723,7 @@ GenericConstantType GenericConstantType::byte() noexcept {
}
Expected<GenericConstantType> GenericConstantType::floating(FloatSemantics ValueSemantics) {
- if (!isKnownFloatSemantics(ValueSemantics))
+ if (!getFloatSemanticsBitWidth(ValueSemantics))
return makeUnexpected(ErrorCode::InvalidArgument, "generic floating semantics is unknown");
GenericConstantType Type;
Type.Kind = GenericConstantTypeKind::Floating;
@@ -810,7 +809,7 @@ Expected<void> GenericConstantType::verify() const {
return verifyType(*this, 0, Nodes);
}
-Expected<GenericConstantData> GenericConstantData::integer(IntegerImmediate Value) {
+Expected<GenericConstantData> GenericConstantData::integer(APInt Value) {
auto Type = GenericConstantType::integer(Value.bitWidth());
if (!Type)
return std::unexpected(Type.error());
@@ -821,7 +820,7 @@ Expected<GenericConstantData> GenericConstantData::integer(IntegerImmediate Valu
return Result;
}
-Expected<GenericConstantData> GenericConstantData::floating(FloatingPointBits Value) {
+Expected<GenericConstantData> GenericConstantData::floating(APFloat Value) {
auto Type = GenericConstantType::floating(Value.semantics());
if (!Type)
return std::unexpected(Type.error());
diff --git a/backend/lib/CodeGen/GlobalObject.cpp b/backend/lib/CodeGen/GlobalObject.cpp
index cda28bd..aa8fd15 100644
--- a/backend/lib/CodeGen/GlobalObject.cpp
+++ b/backend/lib/CodeGen/GlobalObject.cpp
@@ -45,7 +45,7 @@ namespace {
case GlobalInitializer::Kind::Invalid:
return makeUnexpected(ErrorCode::VerificationError, "global initializer is invalid");
case GlobalInitializer::Kind::Integer: {
- const auto *Value = Initializer.getIf<IntegerImmediate>();
+ const auto *Value = Initializer.getIf<APInt>();
if (Value == nullptr)
return makeUnexpected(ErrorCode::InternalError, "integer initializer storage is invalid");
auto Verified = Value->verify();
@@ -54,7 +54,7 @@ namespace {
return (static_cast<std::uint64_t>(Value->bitWidth()) + 7U) / 8U;
}
case GlobalInitializer::Kind::Floating: {
- const auto *Value = Initializer.getIf<FloatingPointBits>();
+ const auto *Value = Initializer.getIf<APFloat>();
if (Value == nullptr)
return makeUnexpected(ErrorCode::InternalError, "floating initializer storage is invalid");
return (static_cast<std::uint64_t>(Value->bitWidth()) + 7U) / 8U;
@@ -141,11 +141,11 @@ namespace {
} // namespace
-GlobalInitializer GlobalInitializer::integer(IntegerImmediate Value) {
+GlobalInitializer GlobalInitializer::integer(APInt Value) {
return GlobalInitializer(std::move(Value));
}
-GlobalInitializer GlobalInitializer::floating(FloatingPointBits Value) {
+GlobalInitializer GlobalInitializer::floating(APFloat Value) {
return GlobalInitializer(Value);
}
diff --git a/backend/lib/CodeGen/LowLevelType.cpp b/backend/lib/CodeGen/LowLevelType.cpp
index b124765..b50ea6b 100644
--- a/backend/lib/CodeGen/LowLevelType.cpp
+++ b/backend/lib/CodeGen/LowLevelType.cpp
@@ -8,43 +8,6 @@
namespace rcc {
namespace {
-struct FloatSemanticsInfo final {
- std::uint32_t BitWidth;
- std::string_view Name;
- std::string_view Spelling;
-};
-
-constexpr std::array FloatSemanticsTable{
- FloatSemanticsInfo{16, "IEEE half", "f16"},
- FloatSemanticsInfo{16, "bfloat", "bf16"},
- FloatSemanticsInfo{32, "IEEE single", "f32"},
- FloatSemanticsInfo{64, "IEEE double", "f64"},
- FloatSemanticsInfo{128, "IEEE quad", "f128"},
- FloatSemanticsInfo{128, "PPC double-double", "ppcf128"},
- FloatSemanticsInfo{8, "float8 E5M2", "f8e5m2"},
- FloatSemanticsInfo{8, "float8 E5M2 FNUZ", "f8e5m2fnuz"},
- FloatSemanticsInfo{8, "float8 E4M3", "f8e4m3"},
- FloatSemanticsInfo{8, "float8 E4M3 FN", "f8e4m3fn"},
- FloatSemanticsInfo{8, "float8 E4M3 FNUZ", "f8e4m3fnuz"},
- FloatSemanticsInfo{8, "float8 E4M3 B11 FNUZ", "f8e4m3b11fnuz"},
- FloatSemanticsInfo{8, "float8 E3M4", "f8e3m4"},
- FloatSemanticsInfo{19, "TensorFloat-32", "tf32"},
- FloatSemanticsInfo{8, "float8 E8M0 FNU", "f8e8m0fnu"},
- FloatSemanticsInfo{6, "float6 E3M2 FN", "f6e3m2fn"},
- FloatSemanticsInfo{6, "float6 E2M3 FN", "f6e2m3fn"},
- FloatSemanticsInfo{4, "float4 E2M1 FN", "f4e2m1fn"},
- FloatSemanticsInfo{80, "x87 double-extended", "x86fp80"},
-};
-
-static_assert(FloatSemanticsTable.size() == static_cast<std::size_t>(FloatSemantics::Count));
-
-[[nodiscard]] const FloatSemanticsInfo *getFloatSemanticsInfo(FloatSemantics Semantics) noexcept {
- const auto Index = static_cast<std::size_t>(Semantics);
- if (Index >= FloatSemanticsTable.size())
- return nullptr;
- return &FloatSemanticsTable[Index];
-}
-
[[nodiscard]] LLT::Kind getVectorKind(LLT ElementType) noexcept {
switch (ElementType.kind()) {
case LLT::Kind::AnyScalar:
@@ -69,31 +32,6 @@ static_assert(FloatSemanticsTable.size() == static_cast<std::size_t>(FloatSemant
} // namespace
-bool isKnownFloatSemantics(FloatSemantics Semantics) noexcept {
- return getFloatSemanticsInfo(Semantics) != nullptr;
-}
-
-std::optional<std::uint32_t> getFloatSemanticsBitWidth(FloatSemantics Semantics) noexcept {
- const auto *Info = getFloatSemanticsInfo(Semantics);
- if (Info == nullptr)
- return std::nullopt;
- return Info->BitWidth;
-}
-
-std::string_view getFloatSemanticsName(FloatSemantics Semantics) noexcept {
- const auto *Info = getFloatSemanticsInfo(Semantics);
- if (Info == nullptr)
- return "unknown";
- return Info->Name;
-}
-
-std::string_view getFloatSemanticsSpelling(FloatSemantics Semantics) noexcept {
- const auto *Info = getFloatSemanticsInfo(Semantics);
- if (Info == nullptr)
- return "invalid-float";
- return Info->Spelling;
-}
-
Expected<LLT> LLT::makeScalar(Kind TypeKind, std::uint64_t BitWidth) {
if (BitWidth == 0 || BitWidth > MaxBitWidth) {
return makeUnexpected(ErrorCode::InvalidArgument,
diff --git a/backend/lib/CodeGen/MIRParser/MIParser.cpp b/backend/lib/CodeGen/MIRParser/MIParser.cpp
index e38b9f1..183e6b3 100644
--- a/backend/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/backend/lib/CodeGen/MIRParser/MIParser.cpp
@@ -116,9 +116,9 @@ namespace {
Token.isKeyword("llvm_vector_register_mask");
}
-[[nodiscard]] Expected<IntegerImmediate> parseIntegerImmediateValue(std::uint32_t BitWidth,
- std::string_view Spelling) {
- if (BitWidth == 0 || BitWidth > IntegerImmediate::MaxBitWidth)
+[[nodiscard]] Expected<APInt> parseIntegerImmediateValue(std::uint32_t BitWidth,
+ std::string_view Spelling) {
+ if (BitWidth == 0 || BitWidth > APInt::MaxBitWidth)
return makeUnexpected(ErrorCode::ParseError, "typed integer width is out of range");
const bool Negative = Spelling.starts_with('-');
@@ -155,7 +155,7 @@ namespace {
if (BitWidth % 64U != 0)
Words.back() &= (std::uint64_t{1} << (BitWidth % 64U)) - 1U;
}
- return IntegerImmediate::create(BitWidth, Words);
+ return APInt::create(BitWidth, Words);
}
[[nodiscard]] std::optional<std::uint64_t> minimumTypeSizeInBits(LLT Type) noexcept {
@@ -1244,7 +1244,7 @@ bool MIParser::Impl::parseTypedIntegerOperand(ParsedOperand &Result) {
return fail(Begin, "typed integer operand must use an 'iN' type");
std::uint64_t WideBitWidth = 0;
if (!parseUnsignedDigits(TypeSpelling.substr(1), WideBitWidth) ||
- WideBitWidth > IntegerImmediate::MaxBitWidth) {
+ WideBitWidth > APInt::MaxBitWidth) {
return fail(Begin, "typed integer operand has an invalid bit width");
}
const auto BitWidth = static_cast<std::uint32_t>(WideBitWidth);
diff --git a/backend/lib/CodeGen/MIRPrinter.cpp b/backend/lib/CodeGen/MIRPrinter.cpp
index d510c83..ea201b9 100644
--- a/backend/lib/CodeGen/MIRPrinter.cpp
+++ b/backend/lib/CodeGen/MIRPrinter.cpp
@@ -2249,7 +2249,7 @@ Expected<void> BodyPrinter::printOperand(const MachineOperand &Operand, bool IsE
Output.append(std::to_string(*Operand.getIf<std::int64_t>()));
return {};
case MachineOperand::Kind::IntegerImmediate: {
- const IntegerImmediate &Value = Operand.getIf<IntegerImmediateOperand>()->Value;
+ const APInt &Value = Operand.getIf<IntegerImmediateOperand>()->Value;
Output.push_back('i');
Output.append(std::to_string(Value.bitWidth()));
Output.push_back(' ');
@@ -2260,7 +2260,7 @@ Expected<void> BodyPrinter::printOperand(const MachineOperand &Operand, bool IsE
return {};
}
case MachineOperand::Kind::FloatingImmediate: {
- const FloatingPointBits &Bits = Operand.getIf<FloatingImmediateOperand>()->Bits;
+ const APFloat &Bits = Operand.getIf<FloatingImmediateOperand>()->Bits;
auto Constant = GenericConstantData::floating(Bits);
if (!Constant)
return std::unexpected(Constant.error());
diff --git a/backend/lib/CodeGen/MachineIRBuilder.cpp b/backend/lib/CodeGen/MachineIRBuilder.cpp
index 6887804..e59f613 100644
--- a/backend/lib/CodeGen/MachineIRBuilder.cpp
+++ b/backend/lib/CodeGen/MachineIRBuilder.cpp
@@ -162,13 +162,11 @@ Expected<void> MachineInstrBuilder::addImmediate(std::int64_t Value, std::uint32
return addOperand(MachineOperand::immediate(Value, TargetFlags));
}
-Expected<void> MachineInstrBuilder::addIntegerImmediate(IntegerImmediate Value,
- std::uint32_t TargetFlags) {
+Expected<void> MachineInstrBuilder::addIntegerImmediate(APInt Value, std::uint32_t TargetFlags) {
return addOperand(MachineOperand::integerImmediate(std::move(Value), TargetFlags));
}
-Expected<void> MachineInstrBuilder::addFloatingImmediate(FloatingPointBits Bits,
- std::uint32_t TargetFlags) {
+Expected<void> MachineInstrBuilder::addFloatingImmediate(APFloat Bits, std::uint32_t TargetFlags) {
return addOperand(MachineOperand::floatingImmediate(Bits, TargetFlags));
}
diff --git a/backend/lib/CodeGen/MachineOperand.cpp b/backend/lib/CodeGen/MachineOperand.cpp
index c81a7c3..44ad8b6 100644
--- a/backend/lib/CodeGen/MachineOperand.cpp
+++ b/backend/lib/CodeGen/MachineOperand.cpp
@@ -8,222 +8,14 @@
#include "rcc/CodeGen/MachineRegisterInfo.h"
#include <algorithm>
-#include <array>
#include <cstdint>
#include <limits>
#include <memory>
-#include <span>
#include <string>
-#include <string_view>
#include <utility>
#include <vector>
namespace rcc {
-namespace {
-
-[[nodiscard]] constexpr std::size_t integerWordCount(std::uint32_t BitWidth) noexcept {
- return (static_cast<std::size_t>(BitWidth) + 63U) / 64U;
-}
-
-[[nodiscard]] constexpr std::uint64_t integerHighWordMask(std::uint32_t BitWidth) noexcept {
- const std::uint32_t UsedBits = BitWidth % 64U;
- if (UsedBits == 0)
- return std::numeric_limits<std::uint64_t>::max();
- return (std::uint64_t{1} << UsedBits) - 1U;
-}
-
-[[nodiscard]] Expected<void> verifyIntegerImmediate(std::uint32_t BitWidth,
- std::span<const std::uint64_t> Words,
- ErrorCode Code) {
- if (BitWidth == 0 || BitWidth > IntegerImmediate::MaxBitWidth) {
- return makeUnexpected(Code, "integer immediate bit width is outside the supported range");
- }
- if (Words.size() != integerWordCount(BitWidth)) {
- return makeUnexpected(Code, "integer immediate bit pattern has the wrong word count");
- }
- if ((Words.back() & ~integerHighWordMask(BitWidth)) != 0) {
- return makeUnexpected(Code, "integer immediate has nonzero bits above its declared width");
- }
- return {};
-}
-
-} // namespace
-
-Expected<IntegerImmediate> IntegerImmediate::create(std::uint32_t BitWidth,
- std::span<const std::uint64_t> Words) {
- auto Verification = verifyIntegerImmediate(BitWidth, Words, ErrorCode::InvalidArgument);
- if (!Verification)
- return std::unexpected(Verification.error());
- return IntegerImmediate(BitWidth, std::vector<std::uint64_t>(Words.begin(), Words.end()));
-}
-
-Expected<IntegerImmediate> IntegerImmediate::fromUnsigned(std::uint32_t BitWidth,
- std::uint64_t Value) {
- if (BitWidth == 0 || BitWidth > MaxBitWidth) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "integer immediate bit width is outside the supported range");
- }
- if (BitWidth < 64U && (Value >> BitWidth) != 0) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "unsigned value does not fit the integer immediate bit width");
- }
-
- std::vector<std::uint64_t> Words(integerWordCount(BitWidth), 0);
- Words.front() = Value;
- return create(BitWidth, Words);
-}
-
-Expected<IntegerImmediate> IntegerImmediate::fromSigned(std::uint32_t BitWidth,
- std::int64_t Value) {
- if (BitWidth == 0 || BitWidth > MaxBitWidth) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "integer immediate bit width is outside the supported range");
- }
- if (BitWidth < 64U) {
- const std::uint32_t MagnitudeBits = BitWidth - 1U;
- const std::int64_t Minimum = -(std::int64_t{1} << MagnitudeBits);
- const std::int64_t Maximum = (std::int64_t{1} << MagnitudeBits) - 1;
- if (Value < Minimum || Value > Maximum) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "signed value does not fit the integer immediate bit width");
- }
- }
-
- const std::uint64_t Fill =
- Value < 0 ? std::numeric_limits<std::uint64_t>::max() : std::uint64_t{0};
- std::vector<std::uint64_t> Words(integerWordCount(BitWidth), Fill);
- Words.front() = static_cast<std::uint64_t>(Value);
- Words.back() &= integerHighWordMask(BitWidth);
- return create(BitWidth, Words);
-}
-
-Expected<IntegerImmediate> IntegerImmediate::parseDecimal(std::uint32_t BitWidth,
- std::string_view Text) {
- if (BitWidth == 0 || BitWidth > MaxBitWidth) {
- return makeUnexpected(ErrorCode::ParseError,
- "integer immediate bit width is outside the supported range");
- }
- const bool Negative = Text.starts_with('-');
- if (Negative)
- Text.remove_prefix(1);
- if (Text.empty())
- return makeUnexpected(ErrorCode::ParseError, "integer immediate has no decimal digits");
-
- std::vector<std::uint64_t> Words(integerWordCount(BitWidth), 0);
- for (const char Character : Text) {
- if (Character < '0' || Character > '9') {
- return makeUnexpected(ErrorCode::ParseError,
- "integer immediate contains a non-decimal digit");
- }
- std::uint64_t Carry = static_cast<unsigned>(Character - '0');
- for (std::uint64_t &Word : Words) {
- const unsigned __int128 Product = static_cast<unsigned __int128>(Word) * 10U + Carry;
- Word = static_cast<std::uint64_t>(Product);
- Carry = static_cast<std::uint64_t>(Product >> 64U);
- }
- }
-
- // LLVM integer literals are arbitrary precision and are extended or
- // truncated to the declared bit width before becoming a constant.
- Words.back() &= integerHighWordMask(BitWidth);
- if (Negative) {
- for (std::uint64_t &Word : Words)
- Word = ~Word;
- std::uint64_t Carry = 1;
- for (std::uint64_t &Word : Words) {
- const std::uint64_t Previous = Word;
- Word += Carry;
- Carry = Carry != 0 && Word < Previous ? 1 : 0;
- }
- Words.back() &= integerHighWordMask(BitWidth);
- }
- return create(BitWidth, Words);
-}
-
-bool IntegerImmediate::isZero() const noexcept {
- return std::ranges::all_of(Words, [](std::uint64_t Word) { return Word == 0; });
-}
-
-bool IntegerImmediate::isNegative() const noexcept {
- const std::uint32_t SignBit = BitWidth - 1U;
- return (Words[SignBit / 64U] & (std::uint64_t{1} << (SignBit % 64U))) != 0;
-}
-
-std::string IntegerImmediate::toUnsignedDecimal() const {
- if (isZero())
- return "0";
- std::vector<std::uint64_t> Remaining = Words;
- std::string Digits;
- while (!std::ranges::all_of(Remaining, [](std::uint64_t Word) { return Word == 0; })) {
- unsigned __int128 Remainder = 0;
- for (auto Iterator = Remaining.rbegin(); Iterator != Remaining.rend(); ++Iterator) {
- const unsigned __int128 Dividend = (Remainder << 64U) | *Iterator;
- *Iterator = static_cast<std::uint64_t>(Dividend / 10U);
- Remainder = Dividend % 10U;
- }
- Digits.push_back(static_cast<char>('0' + static_cast<unsigned>(Remainder)));
- }
- std::ranges::reverse(Digits);
- return Digits;
-}
-
-std::string IntegerImmediate::toSignedDecimal() const {
- if (!isNegative())
- return toUnsignedDecimal();
-
- std::vector<std::uint64_t> Magnitude = Words;
- for (std::uint64_t &Word : Magnitude)
- Word = ~Word;
- std::uint64_t Carry = 1;
- for (std::uint64_t &Word : Magnitude) {
- const std::uint64_t Previous = Word;
- Word += Carry;
- Carry = Carry != 0 && Word < Previous ? 1 : 0;
- }
- Magnitude.back() &= integerHighWordMask(BitWidth);
-
- std::string Digits;
- while (!std::ranges::all_of(Magnitude, [](std::uint64_t Word) { return Word == 0; })) {
- unsigned __int128 Remainder = 0;
- for (auto Iterator = Magnitude.rbegin(); Iterator != Magnitude.rend(); ++Iterator) {
- const unsigned __int128 Dividend = (Remainder << 64U) | *Iterator;
- *Iterator = static_cast<std::uint64_t>(Dividend / 10U);
- Remainder = Dividend % 10U;
- }
- Digits.push_back(static_cast<char>('0' + static_cast<unsigned>(Remainder)));
- }
- std::ranges::reverse(Digits);
- Digits.insert(Digits.begin(), '-');
- return Digits;
-}
-
-Expected<void> IntegerImmediate::verify() const {
- return verifyIntegerImmediate(BitWidth, Words, ErrorCode::VerificationError);
-}
-
-Expected<FloatingPointBits> FloatingPointBits::create(FloatSemantics Semantics,
- std::span<const std::uint64_t> Words) {
- const auto BitWidth = getFloatSemanticsBitWidth(Semantics);
- if (!BitWidth) {
- return makeUnexpected(ErrorCode::InvalidArgument, "floating immediate has unknown semantics");
- }
-
- const std::size_t RequiredWords = (*BitWidth + 63U) / 64U;
- if (RequiredWords > 2 || Words.size() != RequiredWords) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "floating immediate bit pattern has the wrong word count");
- }
-
- const std::uint32_t UsedBitsInLastWord = *BitWidth % 64U;
- if (UsedBitsInLastWord != 0 && (Words.back() >> UsedBitsInLastWord) != 0) {
- return makeUnexpected(ErrorCode::InvalidArgument,
- "floating immediate has nonzero bits above its semantics width");
- }
-
- std::array<std::uint64_t, 2> StoredWords{};
- std::ranges::copy(Words, StoredWords.begin());
- return FloatingPointBits(Semantics, StoredWords, static_cast<std::uint8_t>(RequiredWords));
-}
RegisterOperandFlags::RegisterOperandFlags(
std::initializer_list<RegisterOperandFlag> Flags) noexcept {
@@ -296,13 +88,12 @@ MachineOperand MachineOperand::immediate(std::int64_t Value, std::uint32_t Targe
return MachineOperand(Kind::Immediate, Value, TargetFlags);
}
-MachineOperand MachineOperand::integerImmediate(IntegerImmediate Value, std::uint32_t TargetFlags) {
+MachineOperand MachineOperand::integerImmediate(APInt Value, std::uint32_t TargetFlags) {
return MachineOperand(Kind::IntegerImmediate, IntegerImmediateOperand{std::move(Value)},
TargetFlags);
}
-MachineOperand MachineOperand::floatingImmediate(FloatingPointBits Bits,
- std::uint32_t TargetFlags) {
+MachineOperand MachineOperand::floatingImmediate(APFloat Bits, std::uint32_t TargetFlags) {
return MachineOperand(Kind::FloatingImmediate, FloatingImmediateOperand{Bits}, TargetFlags);
}