76 lines · cpp
1//===-- Unittests for x86 long double -------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/FPUtil/FPBits.h"10#include "test/UnitTest/Test.h"11 12#include "hdr/math_macros.h"13 14using FPBits = LIBC_NAMESPACE::fputil::FPBits<long double>;15 16TEST(LlvmLibcX86LongDoubleTest, is_nan) {17 // In the nan checks below, we use the macro isnan from math.h to ensure that18 // a number is actually a NaN. The isnan macro resolves to the compiler19 // builtin function. Hence, matching LLVM-libc's notion of NaN with the20 // isnan result ensures that LLVM-libc's behavior matches the compiler's21 // behavior.22 constexpr uint32_t COUNT = 100'000;23 24 FPBits bits(0.0l);25 bits.set_biased_exponent(FPBits::MAX_BIASED_EXPONENT);26 for (unsigned int i = 0; i < COUNT; ++i) {27 // If exponent has the max value and the implicit bit is 0,28 // then the number is a NaN for all values of mantissa.29 bits.set_mantissa(i);30 ASSERT_TRUE(bits.is_nan());31 }32 33 bits.set_implicit_bit(1);34 for (unsigned int i = 1; i < COUNT; ++i) {35 // If exponent has the max value and the implicit bit is 1,36 // then the number is a NaN for all non-zero values of mantissa.37 // Note the initial value of |i| of 1 to avoid a zero mantissa.38 bits.set_mantissa(i);39 ASSERT_TRUE(bits.is_nan());40 }41 42 bits.set_biased_exponent(1);43 bits.set_implicit_bit(0);44 for (unsigned int i = 0; i < COUNT; ++i) {45 // If exponent is non-zero and also not max, and the implicit bit is 0,46 // then the number is a NaN for all values of mantissa.47 bits.set_mantissa(i);48 ASSERT_TRUE(bits.is_nan());49 }50 51 bits.set_biased_exponent(1);52 bits.set_implicit_bit(1);53 for (unsigned int i = 0; i < COUNT; ++i) {54 // If exponent is non-zero and also not max, and the implicit bit is 1,55 // then the number is normal value for all values of mantissa.56 bits.set_mantissa(i);57 ASSERT_FALSE(bits.is_nan());58 }59 60 bits.set_biased_exponent(0);61 bits.set_implicit_bit(1);62 for (unsigned int i = 0; i < COUNT; ++i) {63 // If exponent is zero, then the number is a valid but denormal value.64 bits.set_mantissa(i);65 ASSERT_FALSE(bits.is_nan());66 }67 68 bits.set_biased_exponent(0);69 bits.set_implicit_bit(0);70 for (unsigned int i = 0; i < COUNT; ++i) {71 // If exponent is zero, then the number is a valid but denormal value.72 bits.set_mantissa(i);73 ASSERT_FALSE(bits.is_nan());74 }75}76