Skip to content

Commit 22a307c

Browse files
committed
[libc][math][c23] Add fminimum_magf16 C23 math function
1 parent 711fc15 commit 22a307c

File tree

12 files changed

+97
-11
lines changed

12 files changed

+97
-11
lines changed

libc/config/linux/aarch64/entrypoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
512512
libc.src.math.fmaximum_numf16
513513
libc.src.math.fminf16
514514
libc.src.math.fminimumf16
515+
libc.src.math.fminimum_magf16
515516
libc.src.math.fromfpf16
516517
libc.src.math.fromfpxf16
517518
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
@@ -545,6 +545,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
545545
libc.src.math.fmaximum_numf16
546546
libc.src.math.fminf16
547547
libc.src.math.fminimumf16
548+
libc.src.math.fminimum_magf16
548549
libc.src.math.fromfpf16
549550
libc.src.math.fromfpxf16
550551
libc.src.math.llrintf16

libc/docs/c23.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Additions:
6565
* fmaximum* |check|
6666
* fminimum* |check|
6767
* fmaximum_mag* |check|
68-
* fminimum_mag*
68+
* fminimum_mag* |check|
6969
* fmaximum_num* |check|
7070
* fmaximum_mag_num* |check|
7171
* fminimum_mag_num*

libc/docs/math/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ Basic Operations
150150
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
151151
| fminimum | |check| | |check| | |check| | |check| | |check| | 7.12.12.5 | F.10.9.4 |
152152
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
153-
| fminimum_mag | |check| | |check| | |check| | | |check| | 7.12.12.7 | F.10.9.4 |
153+
| fminimum_mag | |check| | |check| | |check| | |check| | |check| | 7.12.12.7 | F.10.9.4 |
154154
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
155155
| fminimum_mag_num | |check| | |check| | |check| | | |check| | 7.12.12.11 | F.10.9.5 |
156156
+------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+

libc/spec/stdc.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ def StdC : StandardSpec<"stdc"> {
462462
FunctionSpec<"fminimum_mag", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
463463
FunctionSpec<"fminimum_magf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
464464
FunctionSpec<"fminimum_magl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
465+
GuardedFunctionSpec<"fminimum_magf16", RetValSpec<Float16Type>, [ArgSpec<Float16Type>, ArgSpec<Float16Type>], "LIBC_TYPES_HAS_FLOAT16">,
465466
GuardedFunctionSpec<"fminimum_magf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
466467

467468
FunctionSpec<"fminimum_mag_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,

libc/src/math/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ add_math_entrypoint_object(fminimum_numf128)
170170
add_math_entrypoint_object(fminimum_mag)
171171
add_math_entrypoint_object(fminimum_magf)
172172
add_math_entrypoint_object(fminimum_magl)
173+
add_math_entrypoint_object(fminimum_magf16)
173174
add_math_entrypoint_object(fminimum_magf128)
174175

175176
add_math_entrypoint_object(fminimum_mag_num)

libc/src/math/fminimum_magf16.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//===-- Implementation header for fminimum_magf16 ---------------*- 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_MAGF16_H
10+
#define LLVM_LIBC_SRC_MATH_FMINIMUM_MAGF16_H
11+
12+
#include "src/__support/macros/properties/types.h"
13+
14+
namespace LIBC_NAMESPACE {
15+
16+
float16 fminimum_magf16(float16 x, float16 y);
17+
18+
} // namespace LIBC_NAMESPACE
19+
20+
#endif // LLVM_LIBC_SRC_MATH_FMINIMUM_MAGF16_H

libc/src/math/generic/CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2253,6 +2253,19 @@ add_entrypoint_object(
22532253
-O2
22542254
)
22552255

2256+
add_entrypoint_object(
2257+
fminimum_magf16
2258+
SRCS
2259+
fminimum_magf16.cpp
2260+
HDRS
2261+
../fminimum_magf16.h
2262+
DEPENDS
2263+
libc.src.__support.macros.properties.types
2264+
libc.src.__support.FPUtil.basic_operations
2265+
COMPILE_OPTIONS
2266+
-O3
2267+
)
2268+
22562269
add_entrypoint_object(
22572270
fminimum_magf128
22582271
SRCS
@@ -2266,7 +2279,6 @@ add_entrypoint_object(
22662279
-O3
22672280
)
22682281

2269-
22702282
add_entrypoint_object(
22712283
fminimum_mag_num
22722284
SRCS
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//===-- Implementation of fminimum_magf16 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_magf16.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_magf16, (float16 x, float16 y)) {
16+
return fputil::fminimum_mag(x, y);
17+
}
18+
19+
} // namespace LIBC_NAMESPACE

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2242,6 +2242,7 @@ add_fp_unittest(
22422242
FMinimumMagTest.h
22432243
DEPENDS
22442244
libc.src.math.fminimum_magf
2245+
libc.src.__support.CPP.algorithm
22452246
libc.src.__support.FPUtil.fp_bits
22462247
)
22472248

@@ -2255,6 +2256,7 @@ add_fp_unittest(
22552256
FMinimumMagTest.h
22562257
DEPENDS
22572258
libc.src.math.fminimum_mag
2259+
libc.src.__support.CPP.algorithm
22582260
libc.src.__support.FPUtil.fp_bits
22592261
)
22602262

@@ -2268,6 +2270,21 @@ add_fp_unittest(
22682270
FMinimumMagTest.h
22692271
DEPENDS
22702272
libc.src.math.fminimum_magl
2273+
libc.src.__support.CPP.algorithm
2274+
libc.src.__support.FPUtil.fp_bits
2275+
)
2276+
2277+
add_fp_unittest(
2278+
fminimum_magf16_test
2279+
SUITE
2280+
libc-math-smoke-tests
2281+
SRCS
2282+
fminimum_magf16_test.cpp
2283+
HDRS
2284+
FMinimumMagTest.h
2285+
DEPENDS
2286+
libc.src.math.fminimum_magf16
2287+
libc.src.__support.CPP.algorithm
22712288
libc.src.__support.FPUtil.fp_bits
22722289
)
22732290

@@ -2281,10 +2298,10 @@ add_fp_unittest(
22812298
FMinimumMagTest.h
22822299
DEPENDS
22832300
libc.src.math.fminimum_magf128
2301+
libc.src.__support.CPP.algorithm
22842302
libc.src.__support.FPUtil.fp_bits
22852303
)
22862304

2287-
22882305
add_fp_unittest(
22892306
fminimum_mag_numf_test
22902307
SUITE

libc/test/src/math/smoke/FMinimumMagTest.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_FMINIMUM_MAGTEST_H
1010
#define LLVM_LIBC_TEST_SRC_MATH_SMOKE_FMINIMUM_MAGTEST_H
1111

12+
#include "src/__support/CPP/algorithm.h"
1213
#include "src/__support/FPUtil/BasicOperations.h"
1314
#include "test/UnitTest/FEnvSafeTest.h"
1415
#include "test/UnitTest/FPMatcher.h"
@@ -56,10 +57,11 @@ class FMinimumMagTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
5657
}
5758

5859
void testRange(FMinimumMagFunc func) {
59-
constexpr StorageType COUNT = 100'001;
60-
constexpr StorageType STEP = STORAGE_MAX / COUNT;
61-
for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
62-
++i, v += STEP, w -= STEP) {
60+
constexpr int COUNT = 100'001;
61+
constexpr StorageType STEP = LIBC_NAMESPACE::cpp::max(
62+
static_cast<StorageType>(STORAGE_MAX / COUNT), StorageType(1));
63+
StorageType v = 0, w = STORAGE_MAX;
64+
for (int i = 0; i <= COUNT; ++i, v += STEP, w -= STEP) {
6365
FPBits xbits(v), ybits(w);
6466
if (xbits.is_inf_or_nan())
6567
continue;
@@ -70,11 +72,10 @@ class FMinimumMagTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
7072
if ((x == 0) && (y == 0))
7173
continue;
7274

73-
if (LIBC_NAMESPACE::fputil::abs(x) < LIBC_NAMESPACE::fputil::abs(y)) {
75+
if (LIBC_NAMESPACE::fputil::abs(x) < LIBC_NAMESPACE::fputil::abs(y))
7476
EXPECT_FP_EQ(x, func(x, y));
75-
} else {
77+
else
7678
EXPECT_FP_EQ(y, func(x, y));
77-
}
7879
}
7980
}
8081
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//===-- Unittests for fminimum_magf16 -------------------------------------===//
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 "FMinimumMagTest.h"
10+
11+
#include "src/math/fminimum_magf16.h"
12+
13+
LIST_FMINIMUM_MAG_TESTS(float16, LIBC_NAMESPACE::fminimum_magf16)

0 commit comments

Comments
 (0)