brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 8d16869 Raw
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