Skip to content

[libc][math][c23] Add MPFR unit tests for {rint,lrint,llrint,lround,llround}f16 #94473

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 115 additions & 18 deletions libc/test/src/math/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -440,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.lround
libc.src.__support.CPP.algorithm
libc.src.__support.FPUtil.fenv_impl
libc.src.__support.FPUtil.fp_bits
)

Expand All @@ -458,11 +458,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 @@ -476,11 +476,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 @@ -494,11 +512,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 @@ -512,11 +530,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 @@ -530,11 +548,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 @@ -548,7 +584,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 @@ -563,7 +601,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 @@ -578,7 +618,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 @@ -594,6 +653,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 @@ -609,6 +669,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 @@ -624,6 +685,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 @@ -639,6 +717,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 @@ -654,6 +733,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 @@ -669,6 +749,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
Loading