6 changes: 4 additions & 2 deletions libc/test/UnitTest/FPMatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,10 @@ template <typename T> struct FPTest : public Test {
const T inf = FPBits::inf(Sign::POS).get_val(); \
const T neg_inf = FPBits::inf(Sign::NEG).get_val(); \
const T min_normal = FPBits::min_normal().get_val(); \
const T max_normal = FPBits::max_normal().get_val(); \
const T min_denormal = FPBits::min_subnormal().get_val(); \
const T max_normal = FPBits::max_normal(Sign::POS).get_val(); \
const T neg_max_normal = FPBits::max_normal(Sign::NEG).get_val(); \
const T min_denormal = FPBits::min_subnormal(Sign::POS).get_val(); \
const T neg_min_denormal = FPBits::min_subnormal(Sign::NEG).get_val(); \
const T max_denormal = FPBits::max_subnormal().get_val();

#define EXPECT_FP_EQ(expected, actual) \
Expand Down
84 changes: 84 additions & 0 deletions libc/test/src/math/smoke/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1614,6 +1614,90 @@ add_fp_unittest(
libc.src.__support.FPUtil.fp_bits
)

add_fp_unittest(
nextdown_test
SUITE
libc-math-smoke-tests
SRCS
nextdown_test.cpp
HDRS
NextDownTest.h
DEPENDS
libc.include.math
libc.src.math.nextdown
libc.src.__support.FPUtil.manipulation_functions
)

add_fp_unittest(
nextdownf_test
SUITE
libc-math-smoke-tests
SRCS
nextdownf_test.cpp
HDRS
NextDownTest.h
DEPENDS
libc.include.math
libc.src.math.nextdownf
libc.src.__support.FPUtil.manipulation_functions
)

add_fp_unittest(
nextdownf128_test
SUITE
libc-math-smoke-tests
SRCS
nextdownf128_test.cpp
HDRS
NextDownTest.h
DEPENDS
libc.include.math
libc.src.math.nextdownf128
libc.src.__support.FPUtil.manipulation_functions
)

add_fp_unittest(
nextup_test
SUITE
libc-math-smoke-tests
SRCS
nextup_test.cpp
HDRS
NextUpTest.h
DEPENDS
libc.include.math
libc.src.math.nextup
libc.src.__support.FPUtil.manipulation_functions
)

add_fp_unittest(
nextupf_test
SUITE
libc-math-smoke-tests
SRCS
nextupf_test.cpp
HDRS
NextUpTest.h
DEPENDS
libc.include.math
libc.src.math.nextupf
libc.src.__support.FPUtil.manipulation_functions
)

add_fp_unittest(
nextupf128_test
SUITE
libc-math-smoke-tests
SRCS
nextupf128_test.cpp
HDRS
NextUpTest.h
DEPENDS
libc.include.math
libc.src.math.nextupf128
libc.src.__support.FPUtil.manipulation_functions
)

# TODO(lntue): The current implementation of fputil::general::fma<float> is only
# correctly rounded for the default rounding mode round-to-nearest tie-to-even.
add_fp_unittest(
Expand Down
43 changes: 43 additions & 0 deletions libc/test/src/math/smoke/NextDownTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//===-- Utility class to test different flavors of nextdown -----*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_TEST_SRC_MATH_NEXTDOWNTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_NEXTDOWNTEST_H

#include "test/UnitTest/FPMatcher.h"
#include "test/UnitTest/Test.h"

template <typename T>
class NextDownTestTemplate : public LIBC_NAMESPACE::testing::Test {

DECLARE_SPECIAL_CONSTANTS(T)

public:
typedef T (*NextDownFunc)(T);

void testNaN(NextDownFunc func) { ASSERT_FP_EQ(func(aNaN), aNaN); }

void testBoundaries(NextDownFunc func) {
ASSERT_FP_EQ(zero, func(min_denormal));

ASSERT_FP_EQ(neg_min_denormal, func(zero));
ASSERT_FP_EQ(neg_min_denormal, func(neg_zero));

ASSERT_FP_EQ(neg_max_normal, func(neg_max_normal));
ASSERT_FP_EQ(neg_inf, func(neg_inf));

ASSERT_FP_EQ(max_normal, func(inf));
}
};

#define LIST_NEXTDOWN_TESTS(T, func) \
using LlvmLibcNextDownTest = NextDownTestTemplate<T>; \
TEST_F(LlvmLibcNextDownTest, TestNaN) { testNaN(&func); } \
TEST_F(LlvmLibcNextDownTest, TestBoundaries) { testBoundaries(&func); }

#endif // LLVM_LIBC_TEST_SRC_MATH_NEXTDOWNTEST_H
43 changes: 43 additions & 0 deletions libc/test/src/math/smoke/NextUpTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//===-- Utility class to test different flavors of nextup -------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_TEST_SRC_MATH_NEXTUPTEST_H
#define LLVM_LIBC_TEST_SRC_MATH_NEXTUPTEST_H

#include "test/UnitTest/FPMatcher.h"
#include "test/UnitTest/Test.h"

template <typename T>
class NextUpTestTemplate : public LIBC_NAMESPACE::testing::Test {

DECLARE_SPECIAL_CONSTANTS(T)

public:
typedef T (*NextUpFunc)(T);

void testNaN(NextUpFunc func) { ASSERT_FP_EQ(func(aNaN), aNaN); }

void testBoundaries(NextUpFunc func) {
ASSERT_FP_EQ(neg_zero, func(neg_min_denormal));

ASSERT_FP_EQ(min_denormal, func(zero));
ASSERT_FP_EQ(min_denormal, func(neg_zero));

ASSERT_FP_EQ(max_normal, func(max_normal));
ASSERT_FP_EQ(inf, func(inf));

ASSERT_FP_EQ(neg_max_normal, func(neg_inf));
}
};

#define LIST_NEXTUP_TESTS(T, func) \
using LlvmLibcNextUpTest = NextUpTestTemplate<T>; \
TEST_F(LlvmLibcNextUpTest, TestNaN) { testNaN(&func); } \
TEST_F(LlvmLibcNextUpTest, TestBoundaries) { testBoundaries(&func); }

#endif // LLVM_LIBC_TEST_SRC_MATH_NEXTUPTEST_H
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextdown_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextdown --------------------------------------------===//
//
// 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 "NextDownTest.h"

#include "src/math/nextdown.h"

LIST_NEXTDOWN_TESTS(double, LIBC_NAMESPACE::nextdown)
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextdownf128_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextdownf128 ----------------------------------------===//
//
// 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 "NextDownTest.h"

#include "src/math/nextdownf128.h"

LIST_NEXTDOWN_TESTS(float128, LIBC_NAMESPACE::nextdownf128)
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextdownf_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextdownf -------------------------------------------===//
//
// 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 "NextDownTest.h"

#include "src/math/nextdownf.h"

LIST_NEXTDOWN_TESTS(float, LIBC_NAMESPACE::nextdownf)
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextup_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextup ----------------------------------------------===//
//
// 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 "NextUpTest.h"

#include "src/math/nextup.h"

LIST_NEXTUP_TESTS(double, LIBC_NAMESPACE::nextup)
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextupf128_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextupf128 ------------------------------------------===//
//
// 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 "NextUpTest.h"

#include "src/math/nextupf128.h"

LIST_NEXTUP_TESTS(float128, LIBC_NAMESPACE::nextupf128)
13 changes: 13 additions & 0 deletions libc/test/src/math/smoke/nextupf_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//===-- Unittests for nextupf ---------------------------------------------===//
//
// 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 "NextUpTest.h"

#include "src/math/nextupf.h"

LIST_NEXTUP_TESTS(float, LIBC_NAMESPACE::nextupf)