Skip to content

Commit

Permalink
Merge branch 'libc-math-rintf16-mpfr-tests' into libc-math-nearbyintf…
Browse files Browse the repository at this point in the history
…16-mpfr-tests
  • Loading branch information
overmighty committed Jun 5, 2024
2 parents a0cdd32 + 8492b25 commit ea477a6
Show file tree
Hide file tree
Showing 9 changed files with 263 additions and 39 deletions.
133 changes: 115 additions & 18 deletions libc/test/src/math/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -350,11 +350,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.lround
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -368,11 +368,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.lroundf
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -386,11 +386,29 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.lroundl
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
lroundf16_test
NEED_MPFR
SUITE
libc-math-unittests
SRCS
lroundf16_test.cpp
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.math.lroundf16
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -404,11 +422,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.llround
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -422,11 +440,11 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.llroundf
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -440,11 +458,29 @@ add_fp_unittest(
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.fenv.feclearexcept
libc.src.fenv.feraiseexcept
libc.src.fenv.fetestexcept
libc.src.math.llroundl
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
llroundf16_test
NEED_MPFR
SUITE
libc-math-unittests
SRCS
llroundf16_test.cpp
HDRS
RoundToIntegerTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.errno.errno
libc.src.math.llroundf16
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -458,7 +494,9 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.math.rint
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -473,7 +511,9 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.math.rintf
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -488,7 +528,26 @@ add_fp_unittest(
HDRS
RIntTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.math.rintl
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
rintf16_test
NEED_MPFR
SUITE
libc-math-unittests
SRCS
rintf16_test.cpp
HDRS
RIntTest.h
DEPENDS
libc.hdr.fenv_macros
libc.src.math.rintf16
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -504,6 +563,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrint
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -519,6 +579,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrintf
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -534,6 +595,23 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrintl
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
lrintf16_test
NEED_MPFR
SUITE
libc-math-unittests
SRCS
lrintf16_test.cpp
HDRS
RoundToIntegerTest.h
DEPENDS
libc.src.math.lrintf16
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -549,6 +627,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrint
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -564,6 +643,7 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrintf
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand All @@ -579,6 +659,23 @@ add_fp_unittest(
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrintl
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
llrintf16_test
NEED_MPFR
SUITE
libc-math-unittests
SRCS
llrintf16_test.cpp
HDRS
RoundToIntegerTest.h
DEPENDS
libc.src.math.llrintf16
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)
Expand Down
20 changes: 12 additions & 8 deletions libc/test/src/math/RIntTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_TEST_SRC_MATH_RINTTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_RINTTEST_H

#include "src/__support/CPP/algorithm.h"
#include "src/__support/FPUtil/FEnvImpl.h"
#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/FEnvSafeTest.h"
Expand All @@ -18,7 +19,6 @@

#include "hdr/fenv_macros.h"
#include "hdr/math_macros.h"
#include <stdio.h>

namespace mpfr = LIBC_NAMESPACE::testing::mpfr;

Expand Down Expand Up @@ -101,8 +101,10 @@ class RIntTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
}

void testSubnormalRange(RIntFunc func) {
constexpr StorageType COUNT = 100'001;
constexpr StorageType STEP = (MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT;
constexpr int COUNT = 100'001;
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
static_cast<StorageType>((MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT),
StorageType(1));
for (StorageType i = MIN_SUBNORMAL; i <= MAX_SUBNORMAL; i += STEP) {
T x = FPBits(i).get_val();
for (int mode : ROUNDING_MODES) {
Expand All @@ -114,15 +116,17 @@ class RIntTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
}

void testNormalRange(RIntFunc func) {
constexpr StorageType COUNT = 100'001;
constexpr StorageType STEP = (MAX_NORMAL - MIN_NORMAL) / COUNT;
constexpr int COUNT = 100'001;
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
static_cast<StorageType>((MAX_NORMAL - MIN_NORMAL) / COUNT),
StorageType(1));
for (StorageType i = MIN_NORMAL; i <= MAX_NORMAL; i += STEP) {
T x = FPBits(i).get_val();
FPBits xbits(i);
T x = xbits.get_val();
// In normal range on x86 platforms, the long double implicit 1 bit can be
// zero making the numbers NaN. We will skip them.
if (isnan(x)) {
if (xbits.is_nan())
continue;
}

for (int mode : ROUNDING_MODES) {
LIBC_NAMESPACE::fputil::set_round(mode);
Expand Down
29 changes: 20 additions & 9 deletions libc/test/src/math/RoundToIntegerTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_ROUNDTOINTEGERTEST_H

#include "src/__support/CPP/algorithm.h"
#include "src/__support/FPUtil/FEnvImpl.h"
#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/FEnvSafeTest.h"
Expand Down Expand Up @@ -136,10 +137,13 @@ class RoundToIntegerTestTemplate
return;

constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
constexpr int BIASED_EXPONENT_LIMIT = EXPONENT_LIMIT + FPBits::EXP_BIAS;
if (BIASED_EXPONENT_LIMIT > FPBits::MAX_BIASED_EXPONENT)
return;
// We start with 1.0 so that the implicit bit for x86 long doubles
// is set.
FPBits bits(F(1.0));
bits.set_biased_exponent(EXPONENT_LIMIT + FPBits::EXP_BIAS);
bits.set_biased_exponent(BIASED_EXPONENT_LIMIT);
bits.set_sign(Sign::NEG);
bits.set_mantissa(0);

Expand Down Expand Up @@ -200,10 +204,13 @@ class RoundToIntegerTestTemplate
return;

constexpr int EXPONENT_LIMIT = sizeof(I) * 8 - 1;
constexpr int BIASED_EXPONENT_LIMIT = EXPONENT_LIMIT + FPBits::EXP_BIAS;
if (BIASED_EXPONENT_LIMIT > FPBits::MAX_BIASED_EXPONENT)
return;
// We start with 1.0 so that the implicit bit for x86 long doubles
// is set.
FPBits bits(F(1.0));
bits.set_biased_exponent(EXPONENT_LIMIT + FPBits::EXP_BIAS);
bits.set_biased_exponent(BIASED_EXPONENT_LIMIT);
bits.set_sign(Sign::NEG);
bits.set_mantissa(FPBits::FRACTION_MASK);

Expand All @@ -226,8 +233,10 @@ class RoundToIntegerTestTemplate
}

void testSubnormalRange(RoundToIntegerFunc func) {
constexpr StorageType COUNT = 1'000'001;
constexpr StorageType STEP = (MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT;
constexpr int COUNT = 1'000'001;
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
static_cast<StorageType>((MAX_SUBNORMAL - MIN_SUBNORMAL) / COUNT),
StorageType(1));
for (StorageType i = MIN_SUBNORMAL; i <= MAX_SUBNORMAL; i += STEP) {
F x = FPBits(i).get_val();
if (x == F(0.0))
Expand Down Expand Up @@ -268,15 +277,17 @@ class RoundToIntegerTestTemplate
if (sizeof(I) > sizeof(long))
return;

constexpr StorageType COUNT = 1'000'001;
constexpr StorageType STEP = (MAX_NORMAL - MIN_NORMAL) / COUNT;
constexpr int COUNT = 1'000'001;
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
static_cast<StorageType>((MAX_NORMAL - MIN_NORMAL) / COUNT),
StorageType(1));
for (StorageType i = MIN_NORMAL; i <= MAX_NORMAL; i += STEP) {
F x = FPBits(i).get_val();
FPBits xbits(i);
F x = xbits.get_val();
// In normal range on x86 platforms, the long double implicit 1 bit can be
// zero making the numbers NaN. We will skip them.
if (isnan(x)) {
if (xbits.is_nan())
continue;
}

if (TestModes) {
for (int m : ROUNDING_MODES) {
Expand Down
14 changes: 14 additions & 0 deletions libc/test/src/math/llrintf16_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//===-- Unittests for llrintf16 -------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "RoundToIntegerTest.h"

#include "src/math/llrintf16.h"

LIST_ROUND_TO_INTEGER_TESTS_WITH_MODES(float16, long long,
LIBC_NAMESPACE::llrintf16)
Loading

0 comments on commit ea477a6

Please sign in to comment.