[llvm] [APFloat] Generalize bitcast to also cover x87 semantics (PR #209781)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 07:47:53 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
Author: janr-bay
<details>
<summary>Changes</summary>
This removes the special case code for bitcasting APInt to a float with x87 semantics in convertF80LongDoubleAPFloatToAPInt. This makes it consistent with previous removal of special cases and will remove one more small obstacle to making APFloat extensible.
---
Full diff: https://github.com/llvm/llvm-project/pull/209781.diff
1 Files Affected:
- (modified) llvm/lib/Support/APFloat.cpp (+12-32)
``````````diff
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 74f7803c43e67..25e8afd9f9537 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -3363,34 +3363,8 @@ hash_code hash_value(const IEEEFloat &Arg) {
// the actual IEEE respresentations. We compensate for that here.
APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt() const {
- assert(semantics ==
- (const llvm::fltSemantics *)&APFloatBase::semX87DoubleExtended);
- assert(partCount()==2);
-
- uint64_t myexponent, mysignificand;
-
- if (isFiniteNonZero()) {
- myexponent = exponent+16383; //bias
- mysignificand = significandParts()[0];
- if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
- myexponent = 0; // denormal
- } else if (category==fcZero) {
- myexponent = 0;
- mysignificand = 0;
- } else if (category==fcInfinity) {
- myexponent = 0x7fff;
- mysignificand = 0x8000000000000000ULL;
- } else {
- assert(category == fcNaN && "Unknown category");
- myexponent = 0x7fff;
- mysignificand = significandParts()[0];
- }
-
- uint64_t words[2];
- words[0] = mysignificand;
- words[1] = ((uint64_t)(sign & 1) << 15) |
- (myexponent & 0x7fffLL);
- return APInt(80, words);
+ assert(partCount() == 2);
+ return convertIEEEFloatToAPInt<APFloatBase::semX87DoubleExtended>();
}
APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt() const {
@@ -3442,7 +3416,8 @@ APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt() const {
template <const fltSemantics &S>
APInt IEEEFloat::convertIEEEFloatToAPInt() const {
assert(semantics == &S);
- constexpr unsigned int trailing_significand_bits = S.precision - 1;
+ constexpr unsigned int trailing_significand_bits =
+ S.precision - 1 + S.hasExplicitIntegerBit;
constexpr int integer_bit_part = trailing_significand_bits / integerPartWidth;
constexpr integerPart integer_bit =
integerPart{1} << (trailing_significand_bits % integerPartWidth);
@@ -3476,6 +3451,9 @@ APInt IEEEFloat::convertIEEEFloatToAPInt() const {
llvm_unreachable("semantics don't support inf!");
myexponent = ::exponentInf(S) + bias;
mysignificand.fill(0);
+ if constexpr (S.hasExplicitIntegerBit) {
+ mysignificand[0] = integerPart{1} << (trailing_significand_bits - 1);
+ }
} else {
assert(category == fcNaN && "Unknown category!");
if (S.nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)
@@ -3487,9 +3465,11 @@ APInt IEEEFloat::convertIEEEFloatToAPInt() const {
std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
auto words_iter =
std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
- if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
- // Clear the integer bit.
- words[mysignificand.size() - 1] &= significand_mask;
+ if constexpr (!S.hasExplicitIntegerBit) {
+ if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
+ // Clear the integer bit.
+ words[mysignificand.size() - 1] &= significand_mask;
+ }
}
std::fill(words_iter, words.end(), uint64_t{0});
constexpr size_t last_word = words.size() - 1;
``````````
</details>
https://github.com/llvm/llvm-project/pull/209781
More information about the llvm-commits
mailing list