Skip to content

Commit a6f9a0d

Browse files
[libc][math] Qualify floor functions to constexpr (#192791)
Signed-off-by: udaykiriti <udaykiriti624@gmail.com> Co-authored-by: Muhammad Bassiouni <60100307+bassiounix@users.noreply.github.com>
1 parent 2780875 commit a6f9a0d

8 files changed

Lines changed: 34 additions & 10 deletions

File tree

libc/src/__support/math/floor.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
namespace LIBC_NAMESPACE_DECL {
1616
namespace math {
1717

18-
LIBC_INLINE double floor(double x) {
19-
#ifdef __LIBC_USE_BUILTIN_CEIL_FLOOR_RINT_TRUNC
18+
LIBC_INLINE LIBC_CONSTEXPR double floor(double x) {
19+
#if defined(__LIBC_USE_BUILTIN_CEIL_FLOOR_RINT_TRUNC) && \
20+
!defined(LIBC_HAS_CONSTANT_EVALUATION)
2021
return __builtin_floor(x);
2122
#else
2223
return fputil::floor(x);

libc/src/__support/math/floorbf16.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
namespace LIBC_NAMESPACE_DECL {
1717
namespace math {
1818

19-
LIBC_INLINE bfloat16 floorbf16(bfloat16 x) { return fputil::floor(x); }
19+
LIBC_INLINE constexpr bfloat16 floorbf16(bfloat16 x) {
20+
return fputil::floor(x);
21+
}
2022

2123
} // namespace math
2224
} // namespace LIBC_NAMESPACE_DECL

libc/src/__support/math/floorf.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
namespace LIBC_NAMESPACE_DECL {
1616
namespace math {
1717

18-
LIBC_INLINE float floorf(float x) {
19-
#ifdef __LIBC_USE_BUILTIN_CEIL_FLOOR_RINT_TRUNC
18+
LIBC_INLINE LIBC_CONSTEXPR float floorf(float x) {
19+
#if defined(__LIBC_USE_BUILTIN_CEIL_FLOOR_RINT_TRUNC) && \
20+
!defined(LIBC_HAS_CONSTANT_EVALUATION)
2021
return __builtin_floorf(x);
2122
#else
2223
return fputil::floor(x);

libc/src/__support/math/floorf128.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
namespace LIBC_NAMESPACE_DECL {
2020
namespace math {
2121

22-
LIBC_INLINE float128 floorf128(float128 x) { return fputil::floor(x); }
22+
LIBC_INLINE constexpr float128 floorf128(float128 x) {
23+
return fputil::floor(x);
24+
}
2325

2426
} // namespace math
2527
} // namespace LIBC_NAMESPACE_DECL

libc/src/__support/math/floorf16.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
namespace LIBC_NAMESPACE_DECL {
2222
namespace math {
2323

24-
LIBC_INLINE float16 floorf16(float16 x) {
24+
LIBC_INLINE LIBC_CONSTEXPR float16 floorf16(float16 x) {
2525
#if defined(__LIBC_USE_BUILTIN_CEIL_FLOOR_RINT_TRUNC) && \
26-
defined(LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS)
26+
defined(LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS) && \
27+
!defined(LIBC_HAS_CONSTANT_EVALUATION)
2728
return fputil::cast<float16>(__builtin_floorf(x));
2829
#else
2930
return fputil::floor(x);

libc/src/__support/math/floorl.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
namespace LIBC_NAMESPACE_DECL {
1616
namespace math {
1717

18-
LIBC_INLINE long double floorl(long double x) { return fputil::floor(x); }
18+
LIBC_INLINE constexpr long double floorl(long double x) {
19+
return fputil::floor(x);
20+
}
1921

2022
} // namespace math
2123
} // namespace LIBC_NAMESPACE_DECL

libc/test/shared/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,12 @@ add_fp_unittest(
290290
libc.src.__support.math.copysignf128
291291
libc.src.__support.math.copysignf16
292292
libc.src.__support.math.copysignl
293+
libc.src.__support.math.floor
294+
libc.src.__support.math.floorbf16
295+
libc.src.__support.math.floorf
296+
libc.src.__support.math.floorf128
297+
libc.src.__support.math.floorf16
298+
libc.src.__support.math.floorl
293299
libc.src.__support.math.log
294300
libc.src.__support.math.logbbf16
295301
)

libc/test/shared/shared_math_constexpr_test.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
static_assert(0.0 == LIBC_NAMESPACE::shared::ceil(0.0));
19-
static_assert(0.0 == LIBC_NAMESPACE::shared::log(1.0));
2019
static_assert(0.0 == LIBC_NAMESPACE::shared::copysign(0.0, 0.0));
20+
static_assert(1.0 == LIBC_NAMESPACE::shared::floor(1.2));
21+
static_assert(0.0 == LIBC_NAMESPACE::shared::log(1.0));
2122

2223
//===----------------------------------------------------------------------===//
2324
// Float Tests
2425
//===----------------------------------------------------------------------===//
2526

2627
static_assert(0.0f == LIBC_NAMESPACE::shared::ceilf(0.0f));
2728
static_assert(0.0f == LIBC_NAMESPACE::shared::copysignf(0.0f, 0.0f));
29+
static_assert(0.0f == LIBC_NAMESPACE::shared::floorf(0.0f));
2830

2931
//===----------------------------------------------------------------------===//
3032
// Float16 Tests
@@ -34,6 +36,7 @@ static_assert(0.0f == LIBC_NAMESPACE::shared::copysignf(0.0f, 0.0f));
3436

3537
static_assert(0.0f16 == LIBC_NAMESPACE::shared::ceilf16(0.0f16));
3638
static_assert(0.0f16 == LIBC_NAMESPACE::shared::copysignf16(0.0f16, 0.0f16));
39+
static_assert(3.0f16 == LIBC_NAMESPACE::shared::floorf16(3.7f16));
3740

3841
#endif // LIBC_TYPES_HAS_FLOAT16
3942

@@ -46,6 +49,7 @@ static_assert(0.0f16 == LIBC_NAMESPACE::shared::copysignf16(0.0f16, 0.0f16));
4649

4750
static_assert(0.0L == LIBC_NAMESPACE::shared::ceill(0.0L));
4851
static_assert(0.0L == LIBC_NAMESPACE::shared::copysignl(0.0L, 0.0L));
52+
static_assert(0.0L == LIBC_NAMESPACE::shared::floorl(0.0L));
4953

5054
#endif
5155

@@ -60,6 +64,9 @@ static_assert(float128(0.0) ==
6064
LIBC_NAMESPACE::shared::copysignf128(float128(0.0),
6165
float128(0.0)));
6266

67+
static_assert(float128(0.0) ==
68+
LIBC_NAMESPACE::shared::floorf128(float128(0.0)));
69+
6370
#endif // LIBC_TYPES_HAS_FLOAT128
6471

6572
//===----------------------------------------------------------------------===//
@@ -71,6 +78,8 @@ static_assert(bfloat16(0.0) == LIBC_NAMESPACE::shared::ceilbf16(bfloat16(0.0)));
7178
static_assert(bfloat16(0.0) ==
7279
LIBC_NAMESPACE::shared::copysignbf16(bfloat16(0.0),
7380
bfloat16(0.0)));
81+
static_assert(bfloat16(0.0) ==
82+
LIBC_NAMESPACE::shared::floorbf16(bfloat16(0.0f)));
7483
static_assert(bfloat16(0.0) ==
7584
LIBC_NAMESPACE::shared::logbbf16(bfloat16(1.0f)));
7685

0 commit comments

Comments
 (0)