Skip to content

Commit 64653ca

Browse files
committed
[libc][math][c23] Add fminimum_mag_numf16 C23 math function
1 parent f62ae30 commit 64653ca

File tree

12 files changed

+97
-9
lines changed

12 files changed

+97
-9
lines changed

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
511511
libc.src.math.fmaximum_numf16
512512
libc.src.math.fminimumf16
513513
libc.src.math.fminimum_magf16
514+
libc.src.math.fminimum_mag_numf16
514515
libc.src.math.fromfpf16
515516
libc.src.math.fromfpxf16
516517
libc.src.math.llrintf16

libc/config/linux/x86_64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
544544
libc.src.math.fmaximum_numf16
545545
libc.src.math.fminimumf16
546546
libc.src.math.fminimum_magf16
547+
libc.src.math.fminimum_mag_numf16
547548
libc.src.math.fromfpf16
548549
libc.src.math.fromfpxf16
549550
libc.src.math.llrintf16

libc/docs/c23.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Additions:
6868
* fminimum_mag* |check|
6969
* fmaximum_num* |check|
7070
* fmaximum_mag_num* |check|
71-
* fminimum_mag_num*
71+
* fminimum_mag_num* |check|
7272
* fadd*
7373
* fsub*
7474
* fmul*

libc/docs/math/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ Basic Operations
152152
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
153153
| fminimum_mag | |check| | |check| | |check| | |check| | |check| | 7.12.12.7 | F.10.9.4 |
154154
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
155-
| fminimum_mag_num | |check| | |check| | |check| | | |check| | 7.12.12.11 | F.10.9.5 |
155+
| fminimum_mag_num | |check| | |check| | |check| | |check| | |check| | 7.12.12.11 | F.10.9.5 |
156156
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
157157
| fminimum_num | |check| | |check| | |check| | | |check| | 7.12.12.9 | F.10.9.5 |
158158
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+

libc/spec/stdc.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ def StdC : StandardSpec<"stdc"> {
466466
FunctionSpec<"fminimum_mag_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
467467
FunctionSpec<"fminimum_mag_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
468468
FunctionSpec<"fminimum_mag_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
469+
GuardedFunctionSpec<"fminimum_mag_numf16", RetValSpec<Float16Type>, [ArgSpec<Float16Type>, ArgSpec<Float16Type>], "LIBC_TYPES_HAS_FLOAT16">,
469470
GuardedFunctionSpec<"fminimum_mag_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
470471

471472
FunctionSpec<"fma", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,

libc/src/math/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ add_math_entrypoint_object(fminimum_magf128)
174174
add_math_entrypoint_object(fminimum_mag_num)
175175
add_math_entrypoint_object(fminimum_mag_numf)
176176
add_math_entrypoint_object(fminimum_mag_numl)
177+
add_math_entrypoint_object(fminimum_mag_numf16)
177178
add_math_entrypoint_object(fminimum_mag_numf128)
178179

179180
add_math_entrypoint_object(fmod)

libc/src/math/fminimum_mag_numf16.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//===-- Implementation header for fminimum_mag_numf16 -----------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_LIBC_SRC_MATH_FMINIMUM_MAG_NUMF16_H
10+
#define LLVM_LIBC_SRC_MATH_FMINIMUM_MAG_NUMF16_H
11+
12+
#include "src/__support/macros/properties/types.h"
13+
14+
namespace LIBC_NAMESPACE {
15+
16+
float16 fminimum_mag_numf16(float16 x, float16 y);
17+
18+
} // namespace LIBC_NAMESPACE
19+
20+
#endif // LLVM_LIBC_SRC_MATH_FMINIMUM_MAG_NUMF16_H

libc/src/math/generic/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,6 +2288,19 @@ add_entrypoint_object(
22882288
-O2
22892289
)
22902290

2291+
add_entrypoint_object(
2292+
fminimum_mag_numf16
2293+
SRCS
2294+
fminimum_mag_numf16.cpp
2295+
HDRS
2296+
../fminimum_mag_numf16.h
2297+
DEPENDS
2298+
libc.src.__support.macros.properties.types
2299+
libc.src.__support.FPUtil.basic_operations
2300+
COMPILE_OPTIONS
2301+
-O3
2302+
)
2303+
22912304
add_entrypoint_object(
22922305
fminimum_mag_numf128
22932306
SRCS
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//===-- Implementation of fminimum_mag_numf16 function --------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "src/math/fminimum_mag_numf16.h"
10+
#include "src/__support/FPUtil/BasicOperations.h"
11+
#include "src/__support/common.h"
12+
13+
namespace LIBC_NAMESPACE {
14+
15+
LLVM_LIBC_FUNCTION(float16, fminimum_mag_numf16, (float16 x, float16 y)) {
16+
return fputil::fminimum_mag_num(x, y);
17+
}
18+
19+
} // namespace LIBC_NAMESPACE

libc/test/src/math/smoke/CMakeLists.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2286,6 +2286,7 @@ add_fp_unittest(
22862286
FMinimumMagNumTest.h
22872287
DEPENDS
22882288
libc.src.math.fminimum_mag_numf
2289+
libc.src.__support.CPP.algorithm
22892290
libc.src.__support.FPUtil.fp_bits
22902291
)
22912292

@@ -2299,6 +2300,7 @@ add_fp_unittest(
22992300
FMinimumMagNumTest.h
23002301
DEPENDS
23012302
libc.src.math.fminimum_mag_num
2303+
libc.src.__support.CPP.algorithm
23022304
libc.src.__support.FPUtil.fp_bits
23032305
)
23042306

@@ -2312,6 +2314,21 @@ add_fp_unittest(
23122314
FMinimumMagNumTest.h
23132315
DEPENDS
23142316
libc.src.math.fminimum_mag_numl
2317+
libc.src.__support.CPP.algorithm
2318+
libc.src.__support.FPUtil.fp_bits
2319+
)
2320+
2321+
add_fp_unittest(
2322+
fminimum_mag_numf16_test
2323+
SUITE
2324+
libc-math-smoke-tests
2325+
SRCS
2326+
fminimum_mag_numf16_test.cpp
2327+
HDRS
2328+
FMinimumMagNumTest.h
2329+
DEPENDS
2330+
libc.src.math.fminimum_mag_numf16
2331+
libc.src.__support.CPP.algorithm
23152332
libc.src.__support.FPUtil.fp_bits
23162333
)
23172334

@@ -2325,6 +2342,7 @@ add_fp_unittest(
23252342
FMinimumMagNumTest.h
23262343
DEPENDS
23272344
libc.src.math.fminimum_mag_numf128
2345+
libc.src.__support.CPP.algorithm
23282346
libc.src.__support.FPUtil.fp_bits
23292347
)
23302348

libc/test/src/math/smoke/FMinimumMagNumTest.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_LIBC_TEST_SRC_MATH_SMOKE_FMINIMUMMAG_NUMTEST_H
1010
#define LLVM_LIBC_TEST_SRC_MATH_SMOKE_FMINIMUMMAG_NUMTEST_H
1111

12+
#include "src/__support/CPP/algorithm.h"
1213
#include "src/__support/FPUtil/BasicOperations.h"
1314
#include "src/__support/FPUtil/FPBits.h"
1415
#include "test/UnitTest/FEnvSafeTest.h"
@@ -68,10 +69,11 @@ class FMinimumMagNumTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
6869
}
6970

7071
void testRange(FMinimumMagNumFunc func) {
71-
constexpr StorageType COUNT = 100'001;
72-
constexpr StorageType STEP = STORAGE_MAX / COUNT;
73-
for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
74-
++i, v += STEP, w -= STEP) {
72+
constexpr int COUNT = 100'001;
73+
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
74+
static_cast<StorageType>(STORAGE_MAX / COUNT), StorageType(1));
75+
StorageType v = 0, w = STORAGE_MAX;
76+
for (int i = 0; i <= COUNT; ++i, v += STEP, w -= STEP) {
7577
FPBits xbits(v), ybits(w);
7678
if (xbits.is_inf_or_nan())
7779
continue;
@@ -82,11 +84,10 @@ class FMinimumMagNumTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
8284
if ((x == 0) && (y == 0))
8385
continue;
8486

85-
if (LIBC_NAMESPACE::fputil::abs(x) > LIBC_NAMESPACE::fputil::abs(y)) {
87+
if (LIBC_NAMESPACE::fputil::abs(x) > LIBC_NAMESPACE::fputil::abs(y))
8688
EXPECT_FP_EQ(y, func(x, y));
87-
} else {
89+
else
8890
EXPECT_FP_EQ(x, func(x, y));
89-
}
9091
}
9192
}
9293
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//===-- Unittests for fminimum_mag_numf16 ---------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "FMinimumMagNumTest.h"
10+
11+
#include "src/math/fminimum_mag_numf16.h"
12+
13+
LIST_FMINIMUM_MAG_NUM_TESTS(float16, LIBC_NAMESPACE::fminimum_mag_numf16)

0 commit comments

Comments
 (0)