[libc-commits] [libc] [llvm] [libc][math][c23] Add asinpibf16 math function (PR #189351)

via libc-commits libc-commits at lists.llvm.org
Mon Mar 30 03:52:24 PDT 2026


https://github.com/Sukumarsawant updated https://github.com/llvm/llvm-project/pull/189351

>From f1d5d3fca6823f2dca18fbd1e31f0253ce57fc0f Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 30 Mar 2026 13:58:43 +0530
Subject: [PATCH 1/5] entrypoints added

---
 libc/config/baremetal/aarch64/entrypoints.txt | 1 +
 libc/config/baremetal/arm/entrypoints.txt     | 1 +
 libc/config/baremetal/riscv/entrypoints.txt   | 1 +
 libc/config/darwin/aarch64/entrypoints.txt    | 1 +
 libc/config/darwin/x86_64/entrypoints.txt     | 1 +
 libc/config/gpu/amdgpu/entrypoints.txt        | 1 +
 libc/config/gpu/nvptx/entrypoints.txt         | 1 +
 libc/config/linux/aarch64/entrypoints.txt     | 1 +
 libc/config/linux/arm/entrypoints.txt         | 1 +
 libc/config/linux/riscv/entrypoints.txt       | 1 +
 libc/config/linux/x86_64/entrypoints.txt      | 1 +
 libc/config/windows/entrypoints.txt           | 1 +
 12 files changed, 12 insertions(+)

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index ed84bdff8ce1e..0aaac9b83fb9f 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -792,6 +792,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 43ba426b8ca09..f7e97c7e7eebf 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -801,6 +801,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 79fbd1e4b0de2..5a478d24ebbad 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -798,6 +798,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 71881d23c7a06..0ff230f483b7f 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -611,6 +611,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt
index cad973f1ac069..74c4fd1c649b9 100644
--- a/libc/config/darwin/x86_64/entrypoints.txt
+++ b/libc/config/darwin/x86_64/entrypoints.txt
@@ -235,6 +235,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index e327d9ac6f3d3..8a08e8b208d8d 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -627,6 +627,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index efc784d23e301..3753daca6c0fc 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -629,6 +629,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 4311ba624e6d8..eb3026af05855 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -874,6 +874,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index a10dc0c82e36f..c6896322382e8 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -477,6 +477,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 17efa2e368ede..d07e5fcb590d9 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -895,6 +895,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index eeaccc863dbc3..9c8b408b10fd3 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -950,6 +950,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index e594f6bbb1fd5..69cdc5614fe18 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -323,6 +323,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
+  libc.src.math.asinpif16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl

>From 5daa313beda8ce330ced5d7031539c6e10360cfd Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 30 Mar 2026 14:27:33 +0530
Subject: [PATCH 2/5] Implementation and exhaustive for asinpibf16

Implementation and exhaustive for asinpibf16

nits

fixed
---
 libc/config/baremetal/aarch64/entrypoints.txt |  2 +-
 libc/config/baremetal/arm/entrypoints.txt     |  2 +-
 libc/config/baremetal/riscv/entrypoints.txt   |  2 +-
 libc/config/darwin/aarch64/entrypoints.txt    |  2 +-
 libc/config/darwin/x86_64/entrypoints.txt     |  2 +-
 libc/config/gpu/amdgpu/entrypoints.txt        |  2 +-
 libc/config/gpu/nvptx/entrypoints.txt         |  2 +-
 libc/config/linux/aarch64/entrypoints.txt     |  2 +-
 libc/config/linux/arm/entrypoints.txt         |  2 +-
 libc/config/linux/riscv/entrypoints.txt       |  2 +-
 libc/config/linux/x86_64/entrypoints.txt      |  2 +-
 libc/config/windows/entrypoints.txt           |  2 +-
 libc/shared/math.h                            |  1 +
 libc/shared/math/asinpibf16.h                 | 23 +++++
 libc/src/__support/math/CMakeLists.txt        | 15 +++
 libc/src/__support/math/asinpibf16.h          | 94 +++++++++++++++++++
 libc/src/math/CMakeLists.txt                  |  1 +
 libc/src/math/asinpibf16.h                    | 21 +++++
 libc/src/math/generic/CMakeLists.txt          | 10 ++
 libc/src/math/generic/asinpibf16.cpp          | 16 ++++
 libc/test/shared/CMakeLists.txt               |  1 +
 libc/test/shared/shared_math_test.cpp         |  1 +
 libc/test/src/math/CMakeLists.txt             | 13 +++
 libc/test/src/math/asinpibf16_test.cpp        | 43 +++++++++
 libc/test/src/math/smoke/CMakeLists.txt       | 13 +++
 libc/test/src/math/smoke/asinpibf16_test.cpp  | 40 ++++++++
 .../llvm-project-overlay/libc/BUILD.bazel     | 20 ++++
 27 files changed, 324 insertions(+), 12 deletions(-)
 create mode 100644 libc/shared/math/asinpibf16.h
 create mode 100644 libc/src/__support/math/asinpibf16.h
 create mode 100644 libc/src/math/asinpibf16.h
 create mode 100644 libc/src/math/generic/asinpibf16.cpp
 create mode 100644 libc/test/src/math/asinpibf16_test.cpp
 create mode 100644 libc/test/src/math/smoke/asinpibf16_test.cpp

diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index 0aaac9b83fb9f..846c05a7e1f0b 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -792,7 +792,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index f7e97c7e7eebf..4991bd4ec654f 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -801,7 +801,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 5a478d24ebbad..11aa9266692c9 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -798,7 +798,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 0ff230f483b7f..fe4ca09edebbf 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -611,7 +611,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt
index 74c4fd1c649b9..99443be8dea80 100644
--- a/libc/config/darwin/x86_64/entrypoints.txt
+++ b/libc/config/darwin/x86_64/entrypoints.txt
@@ -235,7 +235,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index 8a08e8b208d8d..3825503826106 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -627,7 +627,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index 3753daca6c0fc..8fbd6e2b71ada 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -629,7 +629,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index eb3026af05855..39693203e785c 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -874,7 +874,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index c6896322382e8..db0799db05c67 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -477,7 +477,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index d07e5fcb590d9..91c5e65c68587 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -895,7 +895,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 9c8b408b10fd3..b51f4f1b388f2 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -950,7 +950,7 @@ endif()
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index 69cdc5614fe18..06d45ae1103b8 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -323,7 +323,7 @@ set(TARGET_LIBM_ENTRYPOINTS
 list(APPEND TARGET_LIBM_ENTRYPOINTS
   # bfloat16 entrypoints
   libc.src.math.atanbf16
-  libc.src.math.asinpif16
+  libc.src.math.asinpibf16
   libc.src.math.bf16add
   libc.src.math.bf16addf
   libc.src.math.bf16addl
diff --git a/libc/shared/math.h b/libc/shared/math.h
index 08a4c994283c5..8e7817e86065e 100644
--- a/libc/shared/math.h
+++ b/libc/shared/math.h
@@ -25,6 +25,7 @@
 #include "math/asinhf16.h"
 #include "math/asinpi.h"
 #include "math/asinpif.h"
+#include "math/asinpibf16.h"
 #include "math/asinpif16.h"
 #include "math/atan.h"
 #include "math/atan2.h"
diff --git a/libc/shared/math/asinpibf16.h b/libc/shared/math/asinpibf16.h
new file mode 100644
index 0000000000000..7c0d2f691ddfa
--- /dev/null
+++ b/libc/shared/math/asinpibf16.h
@@ -0,0 +1,23 @@
+//===-- Shared asinpibf16 header --------------------------------*- 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_SHARED_MATH_ASINPIBF16_H
+#define LLVM_LIBC_SHARED_MATH_ASINPIBF16_H
+
+#include "shared/libc_common.h"
+#include "src/__support/math/asinpibf16.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace shared {
+
+using math::asinpibf16;
+
+} // namespace shared
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SHARED_MATH_ASINPIBF16_H
diff --git a/libc/src/__support/math/CMakeLists.txt b/libc/src/__support/math/CMakeLists.txt
index 10329830a004b..adc4301d440f8 100644
--- a/libc/src/__support/math/CMakeLists.txt
+++ b/libc/src/__support/math/CMakeLists.txt
@@ -206,6 +206,21 @@ add_header_library(
     libc.src.__support.macros.properties.cpu_features
 )
 
+add_header_library(
+  asinpibf16
+  HDRS
+    asinpibf16.h
+  DEPENDS
+    libc.src.__support.FPUtil.fenv_impl
+    libc.src.__support.FPUtil.fp_bits
+    libc.src.__support.FPUtil.cast
+    libc.src.__support.FPUtil.multiply_add
+    libc.src.__support.FPUtil.sqrt
+    libc.src.__support.macros.optimization
+    libc.src.__support.FPUtil.bfloat16
+    libc.src.__support.math.inv_trigf_utils
+)
+
 add_header_library(
   asinpif
   HDRS
diff --git a/libc/src/__support/math/asinpibf16.h b/libc/src/__support/math/asinpibf16.h
new file mode 100644
index 0000000000000..155a4ec7be0c9
--- /dev/null
+++ b/libc/src/__support/math/asinpibf16.h
@@ -0,0 +1,94 @@
+//===-- Implementation header for asinpibf16 --------------------*- 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___SUPPORT_MATH_ASINPIBF16_H
+#define LLVM_LIBC_SRC___SUPPORT_MATH_ASINPIBF16_H
+
+#include "src/__support/FPUtil/FEnvImpl.h"
+#include "src/__support/FPUtil/FPBits.h"
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/__support/FPUtil/cast.h"
+#include "src/__support/FPUtil/multiply_add.h"
+#include "src/__support/FPUtil/sqrt.h"
+#include "src/__support/macros/optimization.h"
+#include "src/__support/math/inv_trigf_utils.h"
+
+namespace LIBC_NAMESPACE_DECL {
+namespace math {
+
+LIBC_INLINE bfloat16 asinpibf16(bfloat16 x) {
+  // Generated by Sollya using the following command:
+  // > display = hexadecimal;
+  // > round(pi/2, SG, RN);
+  // constexpr float PI_2 = 0x1.921fb6p0f;
+
+  using FPBits = fputil::FPBits<bfloat16>;
+  FPBits xbits(x);
+
+  uint16_t x_u = xbits.uintval();
+  uint16_t x_abs = x_u & 0x7fff;
+  float x_sign = (x_u >> 15) ? -1 : 1;
+  float xf = x;
+
+  float xf_abs = (xf < 0 ? -xf : xf);
+  float x_sq = xf_abs * xf_abs;
+
+  // Case 1: |x| <= 0.5
+  if (x_abs <= 0x3F00) { // x_abs <= 0.5
+    // |x| = {0}
+    if (LIBC_UNLIKELY(x_abs == 0))
+      return x; // with sign
+
+    float xp = fputil::cast<float>(inv_trigf_utils_internal::asinpi_eval(x_sq));
+    float result =
+        xf *
+        (fputil::multiply_add<float>(
+            x_sq, xp,
+            fputil::cast<float>(inv_trigf_utils_internal::ASINPI_COEFFS[0])));
+    return fputil::cast<bfloat16>(result);
+  }
+
+  // Case 2: 0.5 <|x| <= 1
+  //  using reduction: asin(x) = pi/2 - 2*asin(sqrt((1-x)/2))
+  if (x_abs <= 0x3F80) { // x_abs <= 1
+    // |x| = {1}
+    if (LIBC_UNLIKELY(x_abs == 0x3F80)) {
+      return fputil::cast<bfloat16>(x_sign * 0.5f);
+    }
+
+    float t = fputil::multiply_add<float>(xf_abs, -0.5f, 0.5f);
+    float t_sqrt = fputil::sqrt<float>(t);
+    float tp = fputil::cast<float>(inv_trigf_utils_internal::asinpi_eval(t));
+    float asin_sqrt_t =
+        t_sqrt *
+        (fputil::multiply_add<float>(
+            t, tp,
+            fputil::cast<float>(inv_trigf_utils_internal::ASINPI_COEFFS[0])));
+    float result = fputil::multiply_add<float>(-2.0f, asin_sqrt_t, 0.5f);
+    return fputil::cast<bfloat16>(x_sign * result);
+  }
+
+  // Case 3: NaN and Inf
+  // NaN
+  if (xbits.is_nan()) {
+    if (xbits.is_signaling_nan()) {
+      fputil::raise_except_if_required(FE_INVALID);
+      return FPBits::quiet_nan().get_val();
+    }
+    return x; // quiet NaN
+  }
+  // |x|>1 & inf
+  fputil::raise_except_if_required(FE_INVALID);
+  fputil::set_errno_if_required(EDOM); // Domain is bounded
+  return FPBits::quiet_nan().get_val();
+}
+
+} // namespace math
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC___SUPPORT_MATH_ASINPIBF16_H
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index ebba3f04b8d56..bc5d5193f08a3 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -60,6 +60,7 @@ add_math_entrypoint_object(asinhf)
 add_math_entrypoint_object(asinhf16)
 
 add_math_entrypoint_object(asinpi)
+add_math_entrypoint_object(asinpibf16)
 add_math_entrypoint_object(asinpif)
 add_math_entrypoint_object(asinpif16)
 
diff --git a/libc/src/math/asinpibf16.h b/libc/src/math/asinpibf16.h
new file mode 100644
index 0000000000000..c6c949d601805
--- /dev/null
+++ b/libc/src/math/asinpibf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for asinpibf16 --------------------*- 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_ASINPIBF16_H
+#define LLVM_LIBC_SRC_MATH_ASINPIBF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+bfloat16 asinpibf16(bfloat16 x);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_ASINPIBF16_H
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 30f33749d165e..5e623853e4c71 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4047,6 +4047,16 @@ add_entrypoint_object(
     libc.src.__support.math.asinpi
 )
 
+add_entrypoint_object(
+  asinpibf16
+  SRCS
+    asinpibf16.cpp
+  HDRS
+    ../asinpibf16.h
+  DEPENDS
+    libc.src.__support.math.asinpibf16
+)
+
 add_entrypoint_object(
   asinpif
   SRCS
diff --git a/libc/src/math/generic/asinpibf16.cpp b/libc/src/math/generic/asinpibf16.cpp
new file mode 100644
index 0000000000000..28c988e8b483b
--- /dev/null
+++ b/libc/src/math/generic/asinpibf16.cpp
@@ -0,0 +1,16 @@
+//===-- Single-precision asinpibf16(x) 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/asinpibf16.h"
+#include "src/__support/math/asinpibf16.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(bfloat16, asinpibf16, (bfloat16 x)) { return math::asinpibf16(x); }
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index c3795d366a588..8e2697f5c8ea5 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -21,6 +21,7 @@ add_fp_unittest(
     libc.src.__support.math.asinhf
     libc.src.__support.math.asinhf16
     libc.src.__support.math.asinpi
+    libc.src.__support.math.asinpibf16
     libc.src.__support.math.asinpif
     libc.src.__support.math.asinpif16
     libc.src.__support.math.atan
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index b52abc6d8e990..b9046d89c6ac7 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -425,6 +425,7 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
 TEST(LlvmLibcSharedMathTest, AllBFloat16) {
   using FPBits = LIBC_NAMESPACE::fputil::FPBits<bfloat16>;
   EXPECT_FP_EQ(bfloat16(0.0), LIBC_NAMESPACE::shared::atanbf16(bfloat16(0.0)));
+  EXPECT_FP_EQ(bfloat16(0.0), LIBC_NAMESPACE::shared::asinpibf16(bfloat16(0.0)));
   EXPECT_FP_EQ(bfloat16(5.0), LIBC_NAMESPACE::shared::bf16add(2.0, 3.0));
   EXPECT_FP_EQ(bfloat16(2.0f), LIBC_NAMESPACE::shared::bf16divf(4.0f, 2.0f));
   EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16divl(6.0L, 3.0L));
diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt
index 2fd77f964e4d6..3615f1fd761b6 100644
--- a/libc/test/src/math/CMakeLists.txt
+++ b/libc/test/src/math/CMakeLists.txt
@@ -2534,6 +2534,19 @@ add_fp_unittest(
     libc.src.math.asinpi
 )
 
+add_fp_unittest(
+  asinpibf16_test
+  NEED_MPFR
+  SUITE
+    libc-math-unittests
+  SRCS
+    asinpibf16_test.cpp
+  DEPENDS
+    libc.src.math.asinpibf16
+    libc.src.__support.FPUtil.fp_bits
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   asinpif_test
   NEED_MPFR
diff --git a/libc/test/src/math/asinpibf16_test.cpp b/libc/test/src/math/asinpibf16_test.cpp
new file mode 100644
index 0000000000000..623e4db5a07c4
--- /dev/null
+++ b/libc/test/src/math/asinpibf16_test.cpp
@@ -0,0 +1,43 @@
+//===-- Unittests for asinpibf16 ------------------------------------------===//
+//
+// 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/__support/FPUtil/bfloat16.h"
+#include "src/math/asinpibf16.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+#include "utils/MPFRWrapper/MPFRUtils.h"
+
+using LlvmLibcAsinpiBf16Test = LIBC_NAMESPACE::testing::FPTest<bfloat16>;
+
+namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
+
+// Range: [0, Inf]
+static constexpr uint16_t POS_START = 0x0000U;
+static constexpr uint16_t POS_STOP = 0x7f80U;
+
+// Range: [-Inf, 0]
+static constexpr uint16_t NEG_START = 0x8000U;
+static constexpr uint16_t NEG_STOP = 0xff80U;
+
+TEST_F(LlvmLibcAsinpiBf16Test, PositiveRange) {
+  for (uint16_t v = POS_START; v <= POS_STOP; ++v) {
+    bfloat16 x = FPBits(v).get_val();
+
+    EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, x,
+                                   LIBC_NAMESPACE::asinpibf16(x), 0.5);
+  }
+}
+
+TEST_F(LlvmLibcAsinpiBf16Test, NegativeRange) {
+  for (uint16_t v = NEG_START; v <= NEG_STOP; ++v) {
+    bfloat16 x = FPBits(v).get_val();
+
+    EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Asinpi, x,
+                                   LIBC_NAMESPACE::asinpibf16(x), 0.5);
+  }
+}
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index 79f2ea4806377..96e5b703bec27 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -4769,6 +4769,19 @@ add_fp_unittest(
     libc.src.__support.FPUtil.fp_bits
 )
 
+add_fp_unittest(
+  asinpibf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    asinpibf16_test.cpp
+  DEPENDS
+    libc.hdr.errno_macros
+    libc.src.math.asinpibf16
+    libc.hdr.fenv_macros
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   asinpif_test
   SUITE
diff --git a/libc/test/src/math/smoke/asinpibf16_test.cpp b/libc/test/src/math/smoke/asinpibf16_test.cpp
new file mode 100644
index 0000000000000..363a86d4cfd8d
--- /dev/null
+++ b/libc/test/src/math/smoke/asinpibf16_test.cpp
@@ -0,0 +1,40 @@
+//===-- Unittests for asinpibf16 ------------------------------------------===//
+//
+// 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 "hdr/errno_macros.h"
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/math/asinpibf16.h"
+#include "test/UnitTest/FEnvSafeTest.h"
+#include "test/UnitTest/FPMatcher.h"
+#include "test/UnitTest/Test.h"
+
+class LlvmLibcAsinBf16Test : public LIBC_NAMESPACE::testing::FEnvSafeTest {
+  DECLARE_SPECIAL_CONSTANTS(bfloat16)
+public:
+  void test_special_numbers() {
+    EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::asinpibf16(aNaN));
+    EXPECT_MATH_ERRNO(0);
+
+    EXPECT_FP_EQ_WITH_EXCEPTION_ALL_ROUNDING(
+        aNaN, LIBC_NAMESPACE::asinpibf16(sNaN), FE_INVALID);
+    EXPECT_MATH_ERRNO(0);
+
+    EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::asinpibf16(zero));
+    EXPECT_MATH_ERRNO(0);
+
+    EXPECT_FP_EQ_ALL_ROUNDING(neg_zero, LIBC_NAMESPACE::asinpibf16(neg_zero));
+    EXPECT_MATH_ERRNO(0);
+
+    EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::asinpibf16(inf));
+    EXPECT_MATH_ERRNO(EDOM);
+
+    EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::asinpibf16(neg_inf));
+    EXPECT_MATH_ERRNO(EDOM);
+  }
+};
+TEST_F(LlvmLibcAsinBf16Test, SpecialNumbers) { test_special_numbers(); }
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index a69ebcdb63fa7..8a882982464bd 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -3208,6 +3208,21 @@ libc_support_library(
     ],
 )
 
+libc_support_library(
+    name = "__support_math_asinpibf16",
+    hdrs = ["src/__support/math/asinpibf16.h"],
+    deps = [
+        ":__support_fputil_bfloat16",
+        ":__support_fputil_cast",
+        ":__support_fputil_fenv_impl",
+        ":__support_fputil_fp_bits",
+        ":__support_fputil_multiply_add",
+        ":__support_fputil_sqrt",
+        ":__support_macros_optimization",
+        ":__support_math_inv_trigf_utils",
+    ],
+)
+
 libc_support_library(
     name = "__support_math_asinpif",
     hdrs = ["src/__support/math/asinpif.h"],
@@ -8589,6 +8604,11 @@ libc_math_function(
     ],
 )
 
+libc_math_function(
+    name = "asinpibf16",
+    additional_deps = [":__support_math_asinpibf16"],
+)
+
 libc_math_function(
     name = "sinpif",
     additional_deps = [":__support_math_sinpif"],

>From f1e1a3ecb0f852be4c6385f793c8e3def1be572d Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 30 Mar 2026 16:13:47 +0530
Subject: [PATCH 3/5] nits

---
 libc/src/math/generic/asinpibf16.cpp         | 2 +-
 libc/test/src/math/smoke/asinpibf16_test.cpp | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/libc/src/math/generic/asinpibf16.cpp b/libc/src/math/generic/asinpibf16.cpp
index 28c988e8b483b..8197bfee4ba87 100644
--- a/libc/src/math/generic/asinpibf16.cpp
+++ b/libc/src/math/generic/asinpibf16.cpp
@@ -1,4 +1,4 @@
-//===-- Single-precision asinpibf16(x) function ---------------------------===//
+//===-- Bfloat16 asinpibf16(x) function -----------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/libc/test/src/math/smoke/asinpibf16_test.cpp b/libc/test/src/math/smoke/asinpibf16_test.cpp
index 363a86d4cfd8d..91e166e9259ea 100644
--- a/libc/test/src/math/smoke/asinpibf16_test.cpp
+++ b/libc/test/src/math/smoke/asinpibf16_test.cpp
@@ -13,7 +13,7 @@
 #include "test/UnitTest/FPMatcher.h"
 #include "test/UnitTest/Test.h"
 
-class LlvmLibcAsinBf16Test : public LIBC_NAMESPACE::testing::FEnvSafeTest {
+class LlvmLibcAsinpiBf16Test : public LIBC_NAMESPACE::testing::FEnvSafeTest {
   DECLARE_SPECIAL_CONSTANTS(bfloat16)
 public:
   void test_special_numbers() {
@@ -37,4 +37,4 @@ class LlvmLibcAsinBf16Test : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     EXPECT_MATH_ERRNO(EDOM);
   }
 };
-TEST_F(LlvmLibcAsinBf16Test, SpecialNumbers) { test_special_numbers(); }
+TEST_F(LlvmLibcAsinpiBf16Test, SpecialNumbers) { test_special_numbers(); }

>From 977f70513d522987776215dc960ad3be54175222 Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 30 Mar 2026 16:17:30 +0530
Subject: [PATCH 4/5] marked

---
 libc/docs/headers/math/index.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index f9614c6d19d22..6763f1b1e0af2 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -269,7 +269,7 @@ Higher Math Functions
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | asinh     | |check|          |                 |                        | |check|              |                        |                        | 7.12.5.2               | F.10.2.2                   |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| asinpi    | |check|          | |check|         |                        | |check|              |                        |                        | 7.12.4.9               | F.10.1.9                   |
+| asinpi    | |check|          | |check|         |                        | |check|              |                        | |check|                | 7.12.4.9               | F.10.1.9                   |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | atan      | |check|          | 1 ULP           |                        | |check|              |                        | |check|                | 7.12.4.3               | F.10.1.3                   |
 +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+

>From 37b7e42184073e733e1859d7fc03722815faf8ba Mon Sep 17 00:00:00 2001
From: Sukumarsawant <sawantsukumar at gmail.com>
Date: Mon, 30 Mar 2026 16:22:00 +0530
Subject: [PATCH 5/5] nits

---
 libc/shared/math.h                    | 2 +-
 libc/src/math/generic/asinpibf16.cpp  | 5 +++--
 libc/test/shared/shared_math_test.cpp | 3 ++-
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/libc/shared/math.h b/libc/shared/math.h
index 8e7817e86065e..b311c8c7913fe 100644
--- a/libc/shared/math.h
+++ b/libc/shared/math.h
@@ -24,8 +24,8 @@
 #include "math/asinhf.h"
 #include "math/asinhf16.h"
 #include "math/asinpi.h"
-#include "math/asinpif.h"
 #include "math/asinpibf16.h"
+#include "math/asinpif.h"
 #include "math/asinpif16.h"
 #include "math/atan.h"
 #include "math/atan2.h"
diff --git a/libc/src/math/generic/asinpibf16.cpp b/libc/src/math/generic/asinpibf16.cpp
index 8197bfee4ba87..05895449547e0 100644
--- a/libc/src/math/generic/asinpibf16.cpp
+++ b/libc/src/math/generic/asinpibf16.cpp
@@ -11,6 +11,7 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-LLVM_LIBC_FUNCTION(bfloat16, asinpibf16, (bfloat16 x)) { return math::asinpibf16(x); }
-
+LLVM_LIBC_FUNCTION(bfloat16, asinpibf16, (bfloat16 x)) {
+  return math::asinpibf16(x);
+}
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/shared/shared_math_test.cpp b/libc/test/shared/shared_math_test.cpp
index b9046d89c6ac7..41c30fc975f78 100644
--- a/libc/test/shared/shared_math_test.cpp
+++ b/libc/test/shared/shared_math_test.cpp
@@ -424,8 +424,9 @@ TEST(LlvmLibcSharedMathTest, AllFloat128) {
 
 TEST(LlvmLibcSharedMathTest, AllBFloat16) {
   using FPBits = LIBC_NAMESPACE::fputil::FPBits<bfloat16>;
+  EXPECT_FP_EQ(bfloat16(0.0),
+               LIBC_NAMESPACE::shared::asinpibf16(bfloat16(0.0)));
   EXPECT_FP_EQ(bfloat16(0.0), LIBC_NAMESPACE::shared::atanbf16(bfloat16(0.0)));
-  EXPECT_FP_EQ(bfloat16(0.0), LIBC_NAMESPACE::shared::asinpibf16(bfloat16(0.0)));
   EXPECT_FP_EQ(bfloat16(5.0), LIBC_NAMESPACE::shared::bf16add(2.0, 3.0));
   EXPECT_FP_EQ(bfloat16(2.0f), LIBC_NAMESPACE::shared::bf16divf(4.0f, 2.0f));
   EXPECT_FP_EQ(bfloat16(2.0), LIBC_NAMESPACE::shared::bf16divl(6.0L, 3.0L));



More information about the libc-commits mailing list