mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[libc][math][c23] Add nextup{,f,f128} and nextdown{,f,f128} functions (#85431)
See https://github.com/llvm/llvm-project/issues/85283. I had a test for `nextdownl` that was failing and I thought I should add `nextupl` and `nextdownl` later and first make a PR for the other functions. cc @lntue
This commit is contained in:
@@ -429,6 +429,10 @@ set(TARGET_LIBM_ENTRYPOINTS
|
||||
libc.src.math.nexttoward
|
||||
libc.src.math.nexttowardf
|
||||
libc.src.math.nexttowardl
|
||||
libc.src.math.nextdown
|
||||
libc.src.math.nextdownf
|
||||
libc.src.math.nextup
|
||||
libc.src.math.nextupf
|
||||
libc.src.math.powf
|
||||
libc.src.math.remainderf
|
||||
libc.src.math.remainder
|
||||
@@ -483,6 +487,8 @@ if(LIBC_TYPES_HAS_FLOAT128)
|
||||
libc.src.math.modff128
|
||||
libc.src.math.nanf128
|
||||
libc.src.math.nextafterf128
|
||||
libc.src.math.nextdownf128
|
||||
libc.src.math.nextupf128
|
||||
libc.src.math.rintf128
|
||||
libc.src.math.roundf128
|
||||
libc.src.math.sqrtf128
|
||||
|
||||
@@ -536,6 +536,14 @@ def StdC : StandardSpec<"stdc"> {
|
||||
FunctionSpec<"nexttoward", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<LongDoubleType>]>,
|
||||
FunctionSpec<"nexttowardl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
|
||||
|
||||
FunctionSpec<"nextdown", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
|
||||
FunctionSpec<"nextdownf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
|
||||
GuardedFunctionSpec<"nextdownf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
|
||||
|
||||
FunctionSpec<"nextup", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
|
||||
FunctionSpec<"nextupf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
|
||||
GuardedFunctionSpec<"nextupf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
|
||||
|
||||
FunctionSpec<"powf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
|
||||
FunctionSpec<"pow", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
|
||||
|
||||
|
||||
@@ -230,6 +230,30 @@ LIBC_INLINE T nextafter(T from, U to) {
|
||||
return from_bits.get_val();
|
||||
}
|
||||
|
||||
template <bool IsDown, typename T,
|
||||
cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
|
||||
LIBC_INLINE constexpr T nextupdown(T x) {
|
||||
constexpr Sign sign = IsDown ? Sign::NEG : Sign::POS;
|
||||
|
||||
FPBits<T> xbits(x);
|
||||
if (xbits.is_nan() || xbits == FPBits<T>::max_normal(sign) ||
|
||||
xbits == FPBits<T>::inf(sign))
|
||||
return x;
|
||||
|
||||
using StorageType = typename FPBits<T>::StorageType;
|
||||
if (x != T(0)) {
|
||||
if (xbits.sign() == sign) {
|
||||
xbits = FPBits<T>(StorageType(xbits.uintval() + 1));
|
||||
} else {
|
||||
xbits = FPBits<T>(StorageType(xbits.uintval() - 1));
|
||||
}
|
||||
} else {
|
||||
xbits = FPBits<T>::min_subnormal(sign);
|
||||
}
|
||||
|
||||
return xbits.get_val();
|
||||
}
|
||||
|
||||
} // namespace fputil
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
|
||||
@@ -205,6 +205,14 @@ add_math_entrypoint_object(nexttoward)
|
||||
add_math_entrypoint_object(nexttowardf)
|
||||
add_math_entrypoint_object(nexttowardl)
|
||||
|
||||
add_math_entrypoint_object(nextdown)
|
||||
add_math_entrypoint_object(nextdownf)
|
||||
add_math_entrypoint_object(nextdownf128)
|
||||
|
||||
add_math_entrypoint_object(nextup)
|
||||
add_math_entrypoint_object(nextupf)
|
||||
add_math_entrypoint_object(nextupf128)
|
||||
|
||||
add_math_entrypoint_object(pow)
|
||||
add_math_entrypoint_object(powf)
|
||||
|
||||
|
||||
@@ -1878,6 +1878,80 @@ add_entrypoint_object(
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextdown
|
||||
SRCS
|
||||
nextdown.cpp
|
||||
HDRS
|
||||
../nextdown.h
|
||||
DEPENDS
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextdownf
|
||||
SRCS
|
||||
nextdownf.cpp
|
||||
HDRS
|
||||
../nextdownf.h
|
||||
DEPENDS
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextdownf128
|
||||
SRCS
|
||||
nextdownf128.cpp
|
||||
HDRS
|
||||
../nextdownf128.h
|
||||
DEPENDS
|
||||
libc.src.__support.macros.properties.types
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextup
|
||||
SRCS
|
||||
nextup.cpp
|
||||
HDRS
|
||||
../nextup.h
|
||||
DEPENDS
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextupf
|
||||
SRCS
|
||||
nextupf.cpp
|
||||
HDRS
|
||||
../nextupf.h
|
||||
DEPENDS
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
nextupf128
|
||||
SRCS
|
||||
nextupf128.cpp
|
||||
HDRS
|
||||
../nextupf128.h
|
||||
DEPENDS
|
||||
libc.src.__support.macros.properties.types
|
||||
libc.src.__support.FPUtil.manipulation_functions
|
||||
COMPILE_OPTIONS
|
||||
-O3
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
fmod
|
||||
SRCS
|
||||
|
||||
19
libc/src/math/generic/nextdown.cpp
Normal file
19
libc/src/math/generic/nextdown.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextdown function -------------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextdown.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(double, nextdown, (double x)) {
|
||||
return fputil::nextupdown</*IsDown=*/true>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
19
libc/src/math/generic/nextdownf.cpp
Normal file
19
libc/src/math/generic/nextdownf.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextdownf function ------------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextdownf.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(float, nextdownf, (float x)) {
|
||||
return fputil::nextupdown</*IsDown=*/true>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
19
libc/src/math/generic/nextdownf128.cpp
Normal file
19
libc/src/math/generic/nextdownf128.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextdownf128 function ---------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextdownf128.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(float128, nextdownf128, (float128 x)) {
|
||||
return fputil::nextupdown</*IsDown=*/true>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
19
libc/src/math/generic/nextup.cpp
Normal file
19
libc/src/math/generic/nextup.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextup function ---------------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextup.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(double, nextup, (double x)) {
|
||||
return fputil::nextupdown</*IsDown=*/false>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
19
libc/src/math/generic/nextupf.cpp
Normal file
19
libc/src/math/generic/nextupf.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextupf function --------------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextupf.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(float, nextupf, (float x)) {
|
||||
return fputil::nextupdown</*IsDown=*/false>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
19
libc/src/math/generic/nextupf128.cpp
Normal file
19
libc/src/math/generic/nextupf128.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
//===-- Implementation of nextupf128 function -----------------------------===//
|
||||
//
|
||||
// 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 "src/math/nextupf128.h"
|
||||
#include "src/__support/FPUtil/ManipulationFunctions.h"
|
||||
#include "src/__support/common.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
LLVM_LIBC_FUNCTION(float128, nextupf128, (float128 x)) {
|
||||
return fputil::nextupdown</*IsDown=*/false>(x);
|
||||
}
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
18
libc/src/math/nextdown.h
Normal file
18
libc/src/math/nextdown.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//===-- Implementation header for 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_SRC_MATH_NEXTDOWN_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTDOWN_H
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
double nextdown(double x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTDOWN_H
|
||||
18
libc/src/math/nextdownf.h
Normal file
18
libc/src/math/nextdownf.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//===-- Implementation header for nextdownf ---------------------*- 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_SRC_MATH_NEXTDOWNF_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTDOWNF_H
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
float nextdownf(float x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTDOWNF_H
|
||||
20
libc/src/math/nextdownf128.h
Normal file
20
libc/src/math/nextdownf128.h
Normal file
@@ -0,0 +1,20 @@
|
||||
//===-- Implementation header for nextdownf128 ------------------*- 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_SRC_MATH_NEXTDOWNF128_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTDOWNF128_H
|
||||
|
||||
#include "src/__support/macros/properties/types.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
float128 nextdownf128(float128 x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTDOWNF128_H
|
||||
18
libc/src/math/nextup.h
Normal file
18
libc/src/math/nextup.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//===-- Implementation header for 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_SRC_MATH_NEXTUP_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTUP_H
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
double nextup(double x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTUP_H
|
||||
18
libc/src/math/nextupf.h
Normal file
18
libc/src/math/nextupf.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//===-- Implementation header for nextupf -----------------------*- 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_SRC_MATH_NEXTUPF_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTUPF_H
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
float nextupf(float x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTUPF_H
|
||||
20
libc/src/math/nextupf128.h
Normal file
20
libc/src/math/nextupf128.h
Normal file
@@ -0,0 +1,20 @@
|
||||
//===-- Implementation header for nextupf128 --------------------*- 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_SRC_MATH_NEXTUPF128_H
|
||||
#define LLVM_LIBC_SRC_MATH_NEXTUPF128_H
|
||||
|
||||
#include "src/__support/macros/properties/types.h"
|
||||
|
||||
namespace LIBC_NAMESPACE {
|
||||
|
||||
float128 nextupf128(float128 x);
|
||||
|
||||
} // namespace LIBC_NAMESPACE
|
||||
|
||||
#endif // LLVM_LIBC_SRC_MATH_NEXTUPF128_H
|
||||
@@ -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) \
|
||||
|
||||
@@ -1630,6 +1630,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(
|
||||
|
||||
43
libc/test/src/math/smoke/NextDownTest.h
Normal file
43
libc/test/src/math/smoke/NextDownTest.h
Normal file
@@ -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
libc/test/src/math/smoke/NextUpTest.h
Normal file
43
libc/test/src/math/smoke/NextUpTest.h
Normal file
@@ -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
libc/test/src/math/smoke/nextdown_test.cpp
Normal file
13
libc/test/src/math/smoke/nextdown_test.cpp
Normal file
@@ -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
libc/test/src/math/smoke/nextdownf128_test.cpp
Normal file
13
libc/test/src/math/smoke/nextdownf128_test.cpp
Normal file
@@ -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
libc/test/src/math/smoke/nextdownf_test.cpp
Normal file
13
libc/test/src/math/smoke/nextdownf_test.cpp
Normal file
@@ -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
libc/test/src/math/smoke/nextup_test.cpp
Normal file
13
libc/test/src/math/smoke/nextup_test.cpp
Normal file
@@ -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
libc/test/src/math/smoke/nextupf128_test.cpp
Normal file
13
libc/test/src/math/smoke/nextupf128_test.cpp
Normal file
@@ -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
libc/test/src/math/smoke/nextupf_test.cpp
Normal file
13
libc/test/src/math/smoke/nextupf_test.cpp
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user