Skip to content

Commit 4bcbdac

Browse files
committed
[libc][math][c23] Add fminimum_mag_numf16 C23 math function
1 parent 22a307c commit 4bcbdac

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
@@ -513,6 +513,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
513513
libc.src.math.fminf16
514514
libc.src.math.fminimumf16
515515
libc.src.math.fminimum_magf16
516+
libc.src.math.fminimum_mag_numf16
516517
libc.src.math.fromfpf16
517518
libc.src.math.fromfpxf16
518519
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
@@ -546,6 +546,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
546546
libc.src.math.fminf16
547547
libc.src.math.fminimumf16
548548
libc.src.math.fminimum_magf16
549+
libc.src.math.fminimum_mag_numf16
549550
libc.src.math.fromfpf16
550551
libc.src.math.fromfpxf16
551552
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
@@ -468,6 +468,7 @@ def StdC : StandardSpec<"stdc"> {
468468
FunctionSpec<"fminimum_mag_num", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
469469
FunctionSpec<"fminimum_mag_numf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
470470
FunctionSpec<"fminimum_mag_numl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,
471+
GuardedFunctionSpec<"fminimum_mag_numf16", RetValSpec<Float16Type>, [ArgSpec<Float16Type>, ArgSpec<Float16Type>], "LIBC_TYPES_HAS_FLOAT16">,
471472
GuardedFunctionSpec<"fminimum_mag_numf128", RetValSpec<Float128Type>, [ArgSpec<Float128Type>, ArgSpec<Float128Type>], "LIBC_TYPES_HAS_FLOAT128">,
472473

473474
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
@@ -176,6 +176,7 @@ add_math_entrypoint_object(fminimum_magf128)
176176
add_math_entrypoint_object(fminimum_mag_num)
177177
add_math_entrypoint_object(fminimum_mag_numf)
178178
add_math_entrypoint_object(fminimum_mag_numl)
179+
add_math_entrypoint_object(fminimum_mag_numf16)
179180
add_math_entrypoint_object(fminimum_mag_numf128)
180181

181182
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
@@ -2315,6 +2315,19 @@ add_entrypoint_object(
23152315
-O2
23162316
)
23172317

2318+
add_entrypoint_object(
2319+
fminimum_mag_numf16
2320+
SRCS
2321+
fminimum_mag_numf16.cpp
2322+
HDRS
2323+
../fminimum_mag_numf16.h
2324+
DEPENDS
2325+
libc.src.__support.macros.properties.types
2326+
libc.src.__support.FPUtil.basic_operations
2327+
COMPILE_OPTIONS
2328+
-O3
2329+
)
2330+
23182331
add_entrypoint_object(
23192332
fminimum_mag_numf128
23202333
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
@@ -2312,6 +2312,7 @@ add_fp_unittest(
23122312
FMinimumMagNumTest.h
23132313
DEPENDS
23142314
libc.src.math.fminimum_mag_numf
2315+
libc.src.__support.CPP.algorithm
23152316
libc.src.__support.FPUtil.fp_bits
23162317
)
23172318

@@ -2325,6 +2326,7 @@ add_fp_unittest(
23252326
FMinimumMagNumTest.h
23262327
DEPENDS
23272328
libc.src.math.fminimum_mag_num
2329+
libc.src.__support.CPP.algorithm
23282330
libc.src.__support.FPUtil.fp_bits
23292331
)
23302332

@@ -2338,6 +2340,21 @@ add_fp_unittest(
23382340
FMinimumMagNumTest.h
23392341
DEPENDS
23402342
libc.src.math.fminimum_mag_numl
2343+
libc.src.__support.CPP.algorithm
2344+
libc.src.__support.FPUtil.fp_bits
2345+
)
2346+
2347+
add_fp_unittest(
2348+
fminimum_mag_numf16_test
2349+
SUITE
2350+
libc-math-smoke-tests
2351+
SRCS
2352+
fminimum_mag_numf16_test.cpp
2353+
HDRS
2354+
FMinimumMagNumTest.h
2355+
DEPENDS
2356+
libc.src.math.fminimum_mag_numf16
2357+
libc.src.__support.CPP.algorithm
23412358
libc.src.__support.FPUtil.fp_bits
23422359
)
23432360

@@ -2351,6 +2368,7 @@ add_fp_unittest(
23512368
FMinimumMagNumTest.h
23522369
DEPENDS
23532370
libc.src.math.fminimum_mag_numf128
2371+
libc.src.__support.CPP.algorithm
23542372
libc.src.__support.FPUtil.fp_bits
23552373
)
23562374

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)