endif()
option(LLVM_LIBC_FULL_BUILD "Build and test LLVM libc as if it is the full libc" OFF)
-
+option(LLVM_LIBC_IMPLEMENTATION_DEFINED_TEST_BEHAVIOR "Build LLVM libc tests assuming our implementation-defined behavior" ON)
option(LLVM_LIBC_ENABLE_LINTING "Enables linting of libc source files" OFF)
if(LLVM_LIBC_CLANG_TIDY)
if (ybits.is_nan())
return y;
if (xbits.is_inf() || ybits.is_zero())
- return FPBits<T>::build_nan(1);
+ return FPBits<T>::build_quiet_nan(1);
if (xbits.is_zero()) {
q = 0;
return T(bits);
}
+ static constexpr T build_quiet_nan(UIntType v) {
+ return build_nan(FloatProp::QUIET_NAN_MASK | v);
+ }
+
// The function convert integer number and unbiased exponent to proper float
// T type:
// Result = number * 2^(ep+1 - exponent_bias)
static bool PreCheck(T x, T y, T &out) {
using FPB = fputil::FPBits<T>;
- const T quiet_NaN = FPB::build_nan(FPB::FloatProp::QUIET_NAN_MASK);
+ const T quiet_NaN = FPB::build_quiet_nan(0);
FPB sx(x), sy(y);
if (likely(!sy.is_zero() && !sy.is_inf_or_nan() && !sx.is_inf_or_nan())) {
return false;
if (bits.is_inf_or_nan()) {
if (bits.get_sign() && (bits.get_mantissa() == 0)) {
// sqrt(-Inf) = NaN
- return FPBits<T>::build_nan(ONE >> 1);
+ return FPBits<T>::build_quiet_nan(ONE >> 1);
} else {
// sqrt(NaN) = NaN
// sqrt(+Inf) = +Inf
return x;
} else if (bits.get_sign()) {
// sqrt( negative numbers ) = NaN
- return FPBits<T>::build_nan(ONE >> 1);
+ return FPBits<T>::build_quiet_nan(ONE >> 1);
} else {
int x_exp = bits.get_exponent();
UIntType x_mant = bits.get_mantissa();
if (bits.is_inf_or_nan()) {
if (bits.get_sign() && (bits.get_mantissa() == 0)) {
// sqrt(-Inf) = NaN
- return FPBits<long double>::build_nan(ONE >> 1);
+ return FPBits<long double>::build_quiet_nan(ONE >> 1);
} else {
// sqrt(NaN) = NaN
// sqrt(+Inf) = +Inf
return x;
} else if (bits.get_sign()) {
// sqrt( negative numbers ) = NaN
- return FPBits<long double>::build_nan(ONE >> 1);
+ return FPBits<long double>::build_quiet_nan(ONE >> 1);
} else {
int x_exp = bits.get_exponent();
UIntType x_mant = bits.get_mantissa();
return bits;
}
+ static long double build_quiet_nan(UIntType v) {
+ return build_nan(FloatProp::QUIET_NAN_MASK | v);
+ }
+
inline static FPBits<long double>
create_value(bool sign, UIntType unbiased_exp, UIntType mantissa) {
FPBits<long double> result;
}
nan_mantissa |= fputil::FloatProperties<T>::QUIET_NAN_MASK;
if (result.get_sign()) {
- result = fputil::FPBits<T>(result.build_nan(nan_mantissa));
+ result = fputil::FPBits<T>(result.build_quiet_nan(nan_mantissa));
result.set_sign(true);
} else {
result.set_sign(false);
- result = fputil::FPBits<T>(result.build_nan(nan_mantissa));
+ result = fputil::FPBits<T>(result.build_quiet_nan(nan_mantissa));
}
}
} else if ((*src | 32) == 'i') { // INF
private:
// constexpr does not work on FPBits yet, so we cannot have these constants as
// static.
- const T nan = T(__llvm_libc::fputil::FPBits<T>::build_nan(1));
+ const T nan = T(__llvm_libc::fputil::FPBits<T>::build_quiet_nan(1));
const T inf = T(__llvm_libc::fputil::FPBits<T>::inf());
const T neg_inf = T(__llvm_libc::fputil::FPBits<T>::neg_inf());
const T zero = T(__llvm_libc::fputil::FPBits<T>::zero());
using Func = T (*)(T, T, T);
using FPBits = __llvm_libc::fputil::FPBits<T>;
using UIntType = typename FPBits::UIntType;
- const T nan = T(__llvm_libc::fputil::FPBits<T>::build_nan(1));
+ const T nan = T(__llvm_libc::fputil::FPBits<T>::build_quiet_nan(1));
const T inf = T(__llvm_libc::fputil::FPBits<T>::inf());
const T neg_inf = T(__llvm_libc::fputil::FPBits<T>::neg_inf());
const T zero = T(__llvm_libc::fputil::FPBits<T>::zero());
using Func = T (*)(T, T);
using FPBits = __llvm_libc::fputil::FPBits<T>;
using UIntType = typename FPBits::UIntType;
- const T nan = T(FPBits::build_nan(1));
+ const T nan = T(FPBits::build_quiet_nan(1));
const T inf = T(FPBits::inf());
const T neg_inf = T(FPBits::neg_inf());
const T zero = T(FPBits::zero());
EXPECT_EQ(FP_ILOGB0, func(T(__llvm_libc::fputil::FPBits<T>::neg_zero())));
EXPECT_EQ(FP_ILOGBNAN,
- func(T(__llvm_libc::fputil::FPBits<T>::build_nan(1))));
+ func(T(__llvm_libc::fputil::FPBits<T>::build_quiet_nan(1))));
EXPECT_EQ(INT_MAX, func(T(__llvm_libc::fputil::FPBits<T>::inf())));
EXPECT_EQ(INT_MAX, func(T(__llvm_libc::fputil::FPBits<T>::neg_inf())));
const T neg_zero = T(__llvm_libc::fputil::FPBits<T>::neg_zero());
const T inf = T(__llvm_libc::fputil::FPBits<T>::inf());
const T neg_inf = T(__llvm_libc::fputil::FPBits<T>::neg_inf());
- const T nan = T(__llvm_libc::fputil::FPBits<T>::build_nan(1));
+ const T nan = T(__llvm_libc::fputil::FPBits<T>::build_quiet_nan(1));
public:
typedef T (*LdExpFunc)(T, int);
const T neg_zero = T(FPBits::neg_zero());
const T inf = T(FPBits::inf());
const T neg_inf = T(FPBits::neg_inf());
- const T nan = T(FPBits::build_nan(1));
+ const T nan = T(FPBits::build_quiet_nan(1));
const UIntType min_subnormal = FPBits::MIN_SUBNORMAL;
const UIntType max_subnormal = FPBits::MAX_SUBNORMAL;
const UIntType min_normal = FPBits::MIN_NORMAL;
const T neg_zero = T(FPBits::neg_zero());
const T inf = T(FPBits::inf());
const T neg_inf = T(FPBits::neg_inf());
- const T nan = T(FPBits::build_nan(1));
+ const T nan = T(FPBits::build_quiet_nan(1));
static inline mpfr::RoundingMode to_mpfr_rounding_mode(int mode) {
switch (mode) {
const T neg_zero = T(__llvm_libc::fputil::FPBits<T>::neg_zero());
const T inf = T(__llvm_libc::fputil::FPBits<T>::inf());
const T neg_inf = T(__llvm_libc::fputil::FPBits<T>::neg_inf());
- const T nan = T(__llvm_libc::fputil::FPBits<T>::build_nan(1));
+ const T nan = T(__llvm_libc::fputil::FPBits<T>::build_quiet_nan(1));
public:
typedef T (*RemQuoFunc)(T, T, int *);
const F neg_zero = F(__llvm_libc::fputil::FPBits<F>::neg_zero());
const F inf = F(__llvm_libc::fputil::FPBits<F>::inf());
const F neg_inf = F(__llvm_libc::fputil::FPBits<F>::neg_inf());
- const F nan = F(__llvm_libc::fputil::FPBits<F>::build_nan(1));
+ const F nan = F(__llvm_libc::fputil::FPBits<F>::build_quiet_nan(1));
static constexpr I INTEGER_MIN = I(1) << (sizeof(I) * 8 - 1);
static constexpr I INTEGER_MAX = -(INTEGER_MIN + 1);
void do_infinity_and_na_n_test(RoundToIntegerFunc func) {
test_one_input(func, inf, INTEGER_MAX, true);
test_one_input(func, neg_inf, INTEGER_MIN, true);
+#if LLVM_LIBC_IMPLEMENTATION_DEFINED_TEST_BEHAVIOR
+ // Result is not well-defined, we always returns INTEGER_MAX
test_one_input(func, nan, INTEGER_MAX, true);
+#endif
}
void testInfinityAndNaN(RoundToIntegerFunc func) {
using UIntType = typename FPBits::UIntType; \
const T zero = T(FPBits::zero()); \
const T neg_zero = T(FPBits::neg_zero()); \
- const T aNaN = T(FPBits::build_nan(1)); \
+ const T aNaN = T(FPBits::build_quiet_nan(1)); \
const T inf = T(FPBits::inf()); \
const T neg_inf = T(FPBits::neg_inf());