#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/Test.h"
#include "hdr/math_macros.h"
using FPBits = LIBC_NAMESPACE::fputil::FPBits<long double>;
TEST(LlvmLibcX86LongDoubleTest, is_nan) {
constexpr uint32_t COUNT = 100'000;
FPBits bits(0.0l);
bits.set_biased_exponent(FPBits::MAX_BIASED_EXPONENT);
for (unsigned int i = 0; i < COUNT; ++i) {
bits.set_mantissa(i);
long double nan = bits.get_val();
ASSERT_NE(static_cast<int>(isnan(nan)), 0);
ASSERT_TRUE(bits.is_nan());
}
bits.set_implicit_bit(1);
for (unsigned int i = 1; i < COUNT; ++i) {
bits.set_mantissa(i);
long double nan = bits.get_val();
ASSERT_NE(static_cast<int>(isnan(nan)), 0);
ASSERT_TRUE(bits.is_nan());
}
bits.set_biased_exponent(1);
bits.set_implicit_bit(0);
for (unsigned int i = 0; i < COUNT; ++i) {
bits.set_mantissa(i);
long double nan = bits.get_val();
ASSERT_NE(static_cast<int>(isnan(nan)), 0);
ASSERT_TRUE(bits.is_nan());
}
bits.set_biased_exponent(1);
bits.set_implicit_bit(1);
for (unsigned int i = 0; i < COUNT; ++i) {
bits.set_mantissa(i);
long double valid = bits.get_val();
ASSERT_EQ(static_cast<int>(isnan(valid)), 0);
ASSERT_FALSE(bits.is_nan());
}
bits.set_biased_exponent(0);
bits.set_implicit_bit(1);
for (unsigned int i = 0; i < COUNT; ++i) {
bits.set_mantissa(i);
long double valid = bits.get_val();
ASSERT_EQ(static_cast<int>(isnan(valid)), 0);
ASSERT_FALSE(bits.is_nan());
}
bits.set_biased_exponent(0);
bits.set_implicit_bit(0);
for (unsigned int i = 0; i < COUNT; ++i) {
bits.set_mantissa(i);
long double valid = bits.get_val();
ASSERT_EQ(static_cast<int>(isnan(valid)), 0);
ASSERT_FALSE(bits.is_nan());
}
}