[libc] [llvm] [libc][math][c23] Add fmaf16 C23 math function. (PR #130757)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 11 19:05:00 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
@llvm/pr-subscribers-libc
Author: Harrison Hao (harrisonGPU)
<details>
<summary>Changes</summary>
Implementation of fmaf16 function for 16-bit inputs.
---
Full diff: https://github.com/llvm/llvm-project/pull/130757.diff
17 Files Affected:
- (modified) libc/config/gpu/amdgpu/entrypoints.txt (+1)
- (modified) libc/config/gpu/nvptx/entrypoints.txt (+1)
- (modified) libc/config/linux/aarch64/entrypoints.txt (+1)
- (modified) libc/config/linux/x86_64/entrypoints.txt (+1)
- (modified) libc/docs/headers/math/index.rst (+1-1)
- (modified) libc/include/math.yaml (+9)
- (modified) libc/src/math/CMakeLists.txt (+1)
- (added) libc/src/math/fmaf16.h (+21)
- (modified) libc/src/math/generic/CMakeLists.txt (+10)
- (added) libc/src/math/generic/fmaf16.cpp (+20)
- (modified) libc/test/src/math/CMakeLists.txt (+15)
- (added) libc/test/src/math/fmaf16_test.cpp (+13)
- (modified) libc/test/src/math/smoke/CMakeLists.txt (+12)
- (added) libc/test/src/math/smoke/fmaf16_test.cpp (+13)
- (modified) libc/utils/MPFRWrapper/MPFRUtils.cpp (+5)
- (modified) utils/bazel/llvm-project-overlay/libc/BUILD.bazel (+2)
- (modified) utils/bazel/llvm-project-overlay/libc/test/src/math/smoke/BUILD.bazel (+5)
``````````diff
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index 291d86b4dd587..a5d32c8eda39f 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -548,6 +548,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.fabsf16
libc.src.math.fdimf16
libc.src.math.floorf16
+ libc.src.math.fmaf16
libc.src.math.fmaxf16
libc.src.math.fmaximum_mag_numf16
libc.src.math.fmaximum_magf16
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index 1ea0d9b03b37e..f553f7cc2b210 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -550,6 +550,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.fabsf16
libc.src.math.fdimf16
libc.src.math.floorf16
+ libc.src.math.fmaf16
libc.src.math.fmaxf16
libc.src.math.fmaximum_mag_numf16
libc.src.math.fmaximum_magf16
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index c7beb3ef3fdfc..f32e03ff2524f 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -676,6 +676,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.ffma
libc.src.math.ffmal
libc.src.math.floorf16
+ libc.src.math.fmaf16
libc.src.math.fmaxf16
libc.src.math.fmaximum_mag_numf16
libc.src.math.fmaximum_magf16
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 12dc87bf945fd..c73690b7864b4 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -686,6 +686,7 @@ if(LIBC_TYPES_HAS_FLOAT16)
libc.src.math.fabsf16
libc.src.math.fdimf16
libc.src.math.floorf16
+ libc.src.math.fmaf16
libc.src.math.fmaxf16
libc.src.math.fmaximum_mag_numf16
libc.src.math.fmaximum_magf16
diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index 5b855ce4881c3..dda8855df1a5a 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -299,7 +299,7 @@ Higher Math Functions
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| expm1 | |check| | |check| | | |check| | | 7.12.6.6 | F.10.3.6 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
-| fma | |check| | |check| | | | | 7.12.13.1 | F.10.10.1 |
+| fma | |check| | |check| | | |check| | | 7.12.13.1 | F.10.10.1 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
| f16sqrt | |check|\* | |check|\* | |check|\* | N/A | |check| | 7.12.14.6 | F.10.11 |
+-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/include/math.yaml b/libc/include/math.yaml
index a66f981030864..08a28263a186d 100644
--- a/libc/include/math.yaml
+++ b/libc/include/math.yaml
@@ -736,6 +736,15 @@ functions:
- type: float
- type: float
- type: float
+ - name: fmaf16
+ standards:
+ - stdc
+ return_type: _Float16
+ arguments:
+ - type: _Float16
+ - type: _Float16
+ - type: _Float16
+ guard: LIBC_TYPES_HAS_FLOAT16
- name: fmax
standards:
- stdc
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index f18a73d46f9aa..a42421614661a 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -209,6 +209,7 @@ add_math_entrypoint_object(floorf128)
add_math_entrypoint_object(fma)
add_math_entrypoint_object(fmaf)
+add_math_entrypoint_object(fmaf16)
add_math_entrypoint_object(fmax)
add_math_entrypoint_object(fmaxf)
diff --git a/libc/src/math/fmaf16.h b/libc/src/math/fmaf16.h
new file mode 100644
index 0000000000000..1c4d468e67a7a
--- /dev/null
+++ b/libc/src/math/fmaf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for fmaf16 ------------------------*- 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_FMAF16_H
+#define LLVM_LIBC_SRC_MATH_FMAF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+float16 fmaf16(float16 x, float16 y, float16 z);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_FMAF16_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 3114289bad486..781e6e7e04906 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4241,6 +4241,16 @@ add_entrypoint_object(
libc.src.__support.FPUtil.fma
)
+add_entrypoint_object(
+ fmaf16
+ SRCS
+ fmaf16.cpp
+ HDRS
+ ../fmaf16.h
+ DEPENDS
+ libc.src.__support.FPUtil.fma
+)
+
add_entrypoint_object(
fma
SRCS
diff --git a/libc/src/math/generic/fmaf16.cpp b/libc/src/math/generic/fmaf16.cpp
new file mode 100644
index 0000000000000..4f712f5de764f
--- /dev/null
+++ b/libc/src/math/generic/fmaf16.cpp
@@ -0,0 +1,20 @@
+//===-- Implementation of fmaf16 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/fmaf16.h"
+#include "src/__support/FPUtil/FMA.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(float16, fmaf16, (float16 x, float16 y, float16 z)) {
+ return fputil::fma<float16>(x, y, z);
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index 53ddd301900c0..44e499b6297f4 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -1776,6 +1776,21 @@ add_fp_unittest(
FMA_OPT__ONLY
)
+add_fp_unittest(
+ fmaf16_test
+ NEED_MPFR
+ SUITE
+ libc-math-unittests
+ SRCS
+ fmaf16_test.cpp
+ HDRS
+ FmaTest.h
+ DEPENDS
+ libc.src.math.fmaf16
+ libc.src.stdlib.rand
+ libc.src.stdlib.srand
+)
+
add_fp_unittest(
fma_test
NEED_MPFR
diff --git a/libc/test/src/math/fmaf16_test.cpp b/libc/test/src/math/fmaf16_test.cpp
new file mode 100644
index 0000000000000..233d3a7c54cf4
--- /dev/null
+++ b/libc/test/src/math/fmaf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for fmaf16 ----------------------------------------------===//
+//
+// 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 "FmaTest.h"
+
+#include "src/math/fmaf16.h"
+
+LIST_FMA_TESTS(float16, LIBC_NAMESPACE::fmaf16)
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index 6f94440d826d9..e515633ad6720 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -3562,6 +3562,18 @@ add_fp_unittest(
libc.src.__support.macros.properties.types
)
+add_fp_unittest(
+ fmaf16_test
+ SUITE
+ libc-math-smoke-tests
+ SRCS
+ fmaf16_test.cpp
+ HDRS
+ FmaTest.h
+ DEPENDS
+ libc.src.math.fmaf16
+)
+
add_fp_unittest(
fma_test
SUITE
diff --git a/libc/test/src/math/smoke/fmaf16_test.cpp b/libc/test/src/math/smoke/fmaf16_test.cpp
new file mode 100644
index 0000000000000..cc1f01e2f9541
--- /dev/null
+++ b/libc/test/src/math/smoke/fmaf16_test.cpp
@@ -0,0 +1,13 @@
+//===-- Unittests for fmaxf16 --------------------------------------------===//
+//
+// 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 "FmaTest.h"
+
+#include "src/math/fmaf16.h"
+
+LIST_FMA_TESTS(float16, LIBC_NAMESPACE::fmaf16)
diff --git a/libc/utils/MPFRWrapper/MPFRUtils.cpp b/libc/utils/MPFRWrapper/MPFRUtils.cpp
index 775a3d1a31964..f29fe43ad8c88 100644
--- a/libc/utils/MPFRWrapper/MPFRUtils.cpp
+++ b/libc/utils/MPFRWrapper/MPFRUtils.cpp
@@ -449,6 +449,8 @@ explain_ternary_operation_one_output_error(Operation,
long double, double, RoundingMode);
#ifdef LIBC_TYPES_HAS_FLOAT16
+template void explain_ternary_operation_one_output_error(
+ Operation, const TernaryInput<float16> &, float16, double, RoundingMode);
template void explain_ternary_operation_one_output_error(
Operation, const TernaryInput<float> &, float16, double, RoundingMode);
template void explain_ternary_operation_one_output_error(
@@ -660,6 +662,9 @@ compare_ternary_operation_one_output(Operation,
long double, double, RoundingMode);
#ifdef LIBC_TYPES_HAS_FLOAT16
+template bool
+compare_ternary_operation_one_output(Operation, const TernaryInput<float16> &,
+ float16, double, RoundingMode);
template bool compare_ternary_operation_one_output(Operation,
const TernaryInput<float> &,
float16, double,
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 757db65ca8a77..849f4b728898a 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -2826,6 +2826,8 @@ libc_math_function(name = "floorf16")
# TODO: Add fma, fmaf, fmal, fmaf128 functions.
+libc_math_function(name = "fmaf16")
+
libc_math_function(name = "fmax")
libc_math_function(name = "fmaxf")
diff --git a/utils/bazel/llvm-project-overlay/libc/test/src/math/smoke/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/test/src/math/smoke/BUILD.bazel
index 803548178b0e3..6b959fe559e45 100644
--- a/utils/bazel/llvm-project-overlay/libc/test/src/math/smoke/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/test/src/math/smoke/BUILD.bazel
@@ -474,6 +474,11 @@ math_test(
# TODO: Add fma, fmaf, fmal, fmaf128 tests.
+math_test(
+ name = "fmaf16",
+ hdrs = ["FMaxTest.h"],
+)
+
math_test(
name = "fmax",
hdrs = ["FMaxTest.h"],
``````````
</details>
https://github.com/llvm/llvm-project/pull/130757
More information about the llvm-commits
mailing list