Skip to content

Commit 79a2e2b

Browse files
authored
[libc][math] Fix is_quiet_nan function in FPBits (#76931)
1 parent db9a16e commit 79a2e2b

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

libc/src/__support/FPUtil/FPBits.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ struct FPRepBase : public internal::FPLayout<fp_type> {
162162
? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 2) // 0b1100...
163163
: bit_at(SIG_LEN - 1); // 0b1000...
164164

165-
// If a number x is a NAN, then it is a signalling NAN if:
166-
// SIGNALING_NAN_MASK & bits(x) != 0
167-
LIBC_INLINE_VAR static constexpr StorageType SIGNALING_NAN_MASK =
165+
// Mask to generate a default signaling NAN. Any NAN that is not
166+
// a quiet NAN is considered a signaling NAN.
167+
LIBC_INLINE_VAR static constexpr StorageType DEFAULT_SIGNALING_NAN =
168168
fp_type == FPType::X86_Binary80
169169
? bit_at(SIG_LEN - 1) | bit_at(SIG_LEN - 3) // 0b1010...
170170
: bit_at(SIG_LEN - 2); // 0b0100...
@@ -356,7 +356,7 @@ template <typename T> struct FPBits : public internal::FPRep<get_fp_type<T>()> {
356356
}
357357

358358
LIBC_INLINE constexpr bool is_quiet_nan() const {
359-
return (bits & EXP_SIG_MASK) == (EXP_MASK | QUIET_NAN_MASK);
359+
return (bits & EXP_SIG_MASK) >= (EXP_MASK | QUIET_NAN_MASK);
360360
}
361361

362362
LIBC_INLINE constexpr bool is_inf_or_nan() const {

libc/src/__support/FPUtil/x86_64/LongDoubleBits.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ struct FPBits<long double> : public internal::FPRep<FPType::X86_Binary80> {
114114
(get_biased_exponent() != 0 && get_implicit_bit() == 0);
115115
}
116116

117+
LIBC_INLINE constexpr bool is_quiet_nan() const {
118+
return (bits & EXP_SIG_MASK) >= (EXP_MASK | QUIET_NAN_MASK);
119+
}
120+
117121
// Methods below this are used by tests.
118122

119123
LIBC_INLINE static constexpr long double zero(bool sign = false) {

libc/test/src/__support/FPUtil/fpbits_test.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ TEST(LlvmLibcFPBitsTest, FloatType) {
6969
EXPECT_EQ(negnum.uintval(), static_cast<uint32_t>(0xBF900000));
7070
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
7171
"0xBF900000 = (S: 1, E: 0x007F, M: 0x00100000)");
72+
73+
FloatBits quiet_nan = FloatBits(FloatBits::build_quiet_nan(1));
74+
EXPECT_EQ(quiet_nan.is_quiet_nan(), true);
7275
}
7376

7477
TEST(LlvmLibcFPBitsTest, DoubleType) {
@@ -129,6 +132,9 @@ TEST(LlvmLibcFPBitsTest, DoubleType) {
129132
EXPECT_EQ(negnum.uintval(), static_cast<uint64_t>(0xBFF2000000000000));
130133
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
131134
"0xBFF2000000000000 = (S: 1, E: 0x03FF, M: 0x0002000000000000)");
135+
136+
DoubleBits quiet_nan = DoubleBits(DoubleBits::build_quiet_nan(1));
137+
EXPECT_EQ(quiet_nan.is_quiet_nan(), true);
132138
}
133139

134140
#ifdef LIBC_TARGET_ARCH_IS_X86
@@ -210,6 +216,9 @@ TEST(LlvmLibcFPBitsTest, X86LongDoubleType) {
210216
LIBC_NAMESPACE::str(negnum).c_str(),
211217
"0x000000000000BFFF9000000000000000 = "
212218
"(S: 1, E: 0x3FFF, I: 1, M: 0x00000000000000001000000000000000)");
219+
220+
LongDoubleBits quiet_nan = LongDoubleBits(LongDoubleBits::build_quiet_nan(1));
221+
EXPECT_EQ(quiet_nan.is_quiet_nan(), true);
213222
}
214223
#else
215224
TEST(LlvmLibcFPBitsTest, LongDoubleType) {
@@ -284,6 +293,9 @@ TEST(LlvmLibcFPBitsTest, LongDoubleType) {
284293
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
285294
"0xBFFF2000000000000000000000000000 = "
286295
"(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");
296+
297+
LongDoubleBits quiet_nan = LongDoubleBits(LongDoubleBits::build_quiet_nan(1));
298+
EXPECT_EQ(quiet_nan.is_quiet_nan(), true);
287299
#endif
288300
}
289301
#endif
@@ -357,5 +369,8 @@ TEST(LlvmLibcFPBitsTest, Float128Type) {
357369
EXPECT_STREQ(LIBC_NAMESPACE::str(negnum).c_str(),
358370
"0xBFFF2000000000000000000000000000 = "
359371
"(S: 1, E: 0x3FFF, M: 0x00002000000000000000000000000000)");
372+
373+
Float128Bits quiet_nan = Float128Bits(Float128Bits::build_quiet_nan(1));
374+
EXPECT_EQ(quiet_nan.is_quiet_nan(), true);
360375
}
361376
#endif // LIBC_COMPILER_HAS_FLOAT128

0 commit comments

Comments
 (0)