Skip to content

Conversation

krishna2803
Copy link
Contributor

This PR adds the following basic math functions for BFloat16 type along with the tests:

  • totalorderbf16
  • totalordermagbf16

@llvmbot
Copy link
Member

llvmbot commented Aug 27, 2025

@llvm/pr-subscribers-backend-risc-v

@llvm/pr-subscribers-backend-amdgpu

Author: Krishna Pandey (krishna2803)

Changes

This PR adds the following basic math functions for BFloat16 type along with the tests:

  • totalorderbf16
  • totalordermagbf16

Patch is 25.61 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/155568.diff

24 Files Affected:

  • (modified) libc/config/baremetal/aarch64/entrypoints.txt (+3-1)
  • (modified) libc/config/baremetal/arm/entrypoints.txt (+3-1)
  • (modified) libc/config/baremetal/riscv/entrypoints.txt (+3-1)
  • (modified) libc/config/darwin/aarch64/entrypoints.txt (+3-1)
  • (modified) libc/config/darwin/x86_64/entrypoints.txt (+3-1)
  • (modified) libc/config/gpu/amdgpu/entrypoints.txt (+3-1)
  • (modified) libc/config/gpu/nvptx/entrypoints.txt (+3-1)
  • (modified) libc/config/linux/aarch64/entrypoints.txt (+3-1)
  • (modified) libc/config/linux/arm/entrypoints.txt (+3-1)
  • (modified) libc/config/linux/riscv/entrypoints.txt (+3-1)
  • (modified) libc/config/linux/x86_64/entrypoints.txt (+3-1)
  • (modified) libc/config/windows/entrypoints.txt (+3-1)
  • (modified) libc/docs/headers/math/index.rst (+2-2)
  • (modified) libc/src/math/CMakeLists.txt (+2)
  • (modified) libc/src/math/generic/CMakeLists.txt (+29)
  • (added) libc/src/math/generic/totalorderbf16.cpp (+22)
  • (added) libc/src/math/generic/totalordermagbf16.cpp (+22)
  • (added) libc/src/math/totalorderbf16.h (+21)
  • (added) libc/src/math/totalordermagbf16.h (+21)
  • (modified) libc/test/src/math/smoke/CMakeLists.txt (+26)
  • (modified) libc/test/src/math/smoke/TotalOrderMagTest.h (+33-8)
  • (modified) libc/test/src/math/smoke/TotalOrderTest.h (+33-8)
  • (added) libc/test/src/math/smoke/totalorderbf16_test.cpp (+14)
  • (added) libc/test/src/math/smoke/totalordermagbf16_test.cpp (+14)
diff --git a/libc/config/baremetal/aarch64/entrypoints.txt b/libc/config/baremetal/aarch64/entrypoints.txt
index ce6d0a7e440a4..ff3a6bfa8a2fc 100644
--- a/libc/config/baremetal/aarch64/entrypoints.txt
+++ b/libc/config/baremetal/aarch64/entrypoints.txt
@@ -794,7 +794,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -817,6 +817,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index d8fffd0da48da..f8916d71f86aa 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -797,7 +797,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -820,6 +820,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 2a120b2f68c41..8a72fa6692869 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -797,7 +797,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -820,6 +820,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 8945b61f186b3..796c0d3c8a4ff 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -627,7 +627,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -650,6 +650,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/darwin/x86_64/entrypoints.txt b/libc/config/darwin/x86_64/entrypoints.txt
index 1a5c75fb0c038..fa1d8def8936c 100644
--- a/libc/config/darwin/x86_64/entrypoints.txt
+++ b/libc/config/darwin/x86_64/entrypoints.txt
@@ -270,7 +270,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -293,6 +293,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/gpu/amdgpu/entrypoints.txt b/libc/config/gpu/amdgpu/entrypoints.txt
index 53fbabc6fce39..49c41411cb5d2 100644
--- a/libc/config/gpu/amdgpu/entrypoints.txt
+++ b/libc/config/gpu/amdgpu/entrypoints.txt
@@ -653,7 +653,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -676,6 +676,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/gpu/nvptx/entrypoints.txt b/libc/config/gpu/nvptx/entrypoints.txt
index a970618643f5c..06a2c9addb7fb 100644
--- a/libc/config/gpu/nvptx/entrypoints.txt
+++ b/libc/config/gpu/nvptx/entrypoints.txt
@@ -655,7 +655,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -678,6 +678,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index e55c47e1ee4d6..feea7ff69c166 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -882,7 +882,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -905,6 +905,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index 55554e439e71e..8e92fac863c6b 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -497,7 +497,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -520,6 +520,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 6bf97c5164ada..fb08cfe7bd3f8 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -900,7 +900,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -923,6 +923,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 998d4193c353b..37af75454daa3 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -933,7 +933,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -956,6 +956,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index 2ca06edfa9a2c..c09e6b259fa42 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -343,7 +343,7 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.getpayloadbf16
   libc.src.math.ilogbbf16
   libc.src.math.iscanonicalbf16
-  libc.src.math.isignalingbf16
+  libc.src.math.issignalingbf16
   libc.src.math.ldexpbf16
   libc.src.math.llogbbf16
   libc.src.math.llrintbf16
@@ -366,6 +366,8 @@ list(APPEND TARGET_LIBM_ENTRYPOINTS
   libc.src.math.setpayloadbf16
   libc.src.math.setpayloadsigbf16
   libc.src.math.truncbf16
+  libc.src.math.totalorderbf16
+  libc.src.math.totalordermagbf16
   libc.src.math.ufromfpbf16
   libc.src.math.ufromfpxbf16
 )
diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst
index 818386aa18f02..89624460c3af5 100644
--- a/libc/docs/headers/math/index.rst
+++ b/libc/docs/headers/math/index.rst
@@ -241,9 +241,9 @@ Basic Operations
 +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | setpayloadsig    | |check|          | |check|         | |check|                | |check|              | |check|                | |check|                | F.10.13.3              | N/A                        |
 +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| totalorder       | |check|          | |check|         | |check|                | |check|              | |check|                |                        | F.10.12.1              | N/A                        |
+| totalorder       | |check|          | |check|         | |check|                | |check|              | |check|                | |check|                | F.10.12.1              | N/A                        |
 +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
-| totalordermag    | |check|          | |check|         | |check|                | |check|              | |check|                |                        | F.10.12.2              | N/A                        |
+| totalordermag    | |check|          | |check|         | |check|                | |check|              | |check|                | |check|                | F.10.12.2              | N/A                        |
 +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
 | trunc            | |check|          | |check|         | |check|                | |check|              | |check|                | |check|                | 7.12.9.9               | F.10.6.9                   |
 +------------------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+------------------------+----------------------------+
diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt
index e6a2f868e46b5..1edb517421e28 100644
--- a/libc/src/math/CMakeLists.txt
+++ b/libc/src/math/CMakeLists.txt
@@ -579,12 +579,14 @@ add_math_entrypoint_object(totalorderf)
 add_math_entrypoint_object(totalorderl)
 add_math_entrypoint_object(totalorderf16)
 add_math_entrypoint_object(totalorderf128)
+add_math_entrypoint_object(totalorderbf16)
 
 add_math_entrypoint_object(totalordermag)
 add_math_entrypoint_object(totalordermagf)
 add_math_entrypoint_object(totalordermagl)
 add_math_entrypoint_object(totalordermagf16)
 add_math_entrypoint_object(totalordermagf128)
+add_math_entrypoint_object(totalordermagbf16)
 
 add_math_entrypoint_object(trunc)
 add_math_entrypoint_object(truncf)
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 70ca5c51990de..904f8d2eb4704 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -4784,6 +4784,21 @@ add_entrypoint_object(
     libc.src.__support.FPUtil.basic_operations
     libc.src.__support.macros.properties.types
 )
+
+add_entrypoint_object(
+  totalorderbf16
+  SRCS
+    totalorderbf16.cpp
+  HDRS
+    ../totalorderbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+    libc.src.__support.FPUtil.basic_operations
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_entrypoint_object(
   totalordermag
   SRCS
@@ -4835,6 +4850,20 @@ add_entrypoint_object(
     libc.src.__support.macros.properties.types
 )
 
+add_entrypoint_object(
+  totalordermagbf16
+  SRCS
+    totalordermagbf16.cpp
+  HDRS
+    ../totalordermagbf16.h
+  DEPENDS
+    libc.src.__support.common
+    libc.src.__support.macros.config
+    libc.src.__support.macros.properties.types
+    libc.src.__support.FPUtil.basic_operations
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_entrypoint_object(
   getpayload
   SRCS
diff --git a/libc/src/math/generic/totalorderbf16.cpp b/libc/src/math/generic/totalorderbf16.cpp
new file mode 100644
index 0000000000000..bb9c86e281f6b
--- /dev/null
+++ b/libc/src/math/generic/totalorderbf16.cpp
@@ -0,0 +1,22 @@
+//===-- Implementation of totalorderbf16 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/totalorderbf16.h"
+#include "src/__support/FPUtil/BasicOperations.h"
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, totalorderbf16,
+                   (const bfloat16 *x, const bfloat16 *y)) {
+  return static_cast<int>(fputil::totalorder(*x, *y));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/generic/totalordermagbf16.cpp b/libc/src/math/generic/totalordermagbf16.cpp
new file mode 100644
index 0000000000000..3fc61d9d8bcb4
--- /dev/null
+++ b/libc/src/math/generic/totalordermagbf16.cpp
@@ -0,0 +1,22 @@
+//===-- Implementation of totalordermagbf16 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/totalordermagbf16.h"
+#include "src/__support/FPUtil/BasicOperations.h"
+#include "src/__support/FPUtil/bfloat16.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, totalordermagbf16,
+                   (const bfloat16 *x, const bfloat16 *y)) {
+  return static_cast<int>(fputil::totalordermag(*x, *y));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/math/totalorderbf16.h b/libc/src/math/totalorderbf16.h
new file mode 100644
index 0000000000000..2414852db92b8
--- /dev/null
+++ b/libc/src/math/totalorderbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for totalorderbf16 ----------------*- 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_TOTALORDERF16_H
+#define LLVM_LIBC_SRC_MATH_TOTALORDERF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int totalorderbf16(const bfloat16 *x, const bfloat16 *y);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_TOTALORDERF16_H
diff --git a/libc/src/math/totalordermagbf16.h b/libc/src/math/totalordermagbf16.h
new file mode 100644
index 0000000000000..c48de1ca8e540
--- /dev/null
+++ b/libc/src/math/totalordermagbf16.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for totalordermagbf16 -------------*- 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_TOTALORDERMAGF16_H
+#define LLVM_LIBC_SRC_MATH_TOTALORDERMAGF16_H
+
+#include "src/__support/macros/config.h"
+#include "src/__support/macros/properties/types.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int totalordermagbf16(const bfloat16 *x, const bfloat16 *y);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_MATH_TOTALORDERMAGF16_H
diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt
index 0497d5e0c06ed..166802fd9f9cc 100644
--- a/libc/test/src/math/smoke/CMakeLists.txt
+++ b/libc/test/src/math/smoke/CMakeLists.txt
@@ -5050,6 +5050,19 @@ add_fp_unittest(
     libc.src.math.totalorderf128
 )
 
+add_fp_unittest(
+  totalorderbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    totalorderbf16_test.cpp
+  HDRS
+    TotalOrderTest.h
+  DEPENDS
+    libc.src.math.totalorderbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   totalordermag_test
   SUITE
@@ -5110,6 +5123,19 @@ add_fp_unittest(
     libc.src.math.totalordermagf128
 )
 
+add_fp_unittest(
+  totalordermagbf16_test
+  SUITE
+    libc-math-smoke-tests
+  SRCS
+    totalordermagbf16_test.cpp
+  HDRS
+    TotalOrderMagTest.h
+  DEPENDS
+    libc.src.math.totalordermagbf16
+    libc.src.__support.FPUtil.bfloat16
+)
+
 add_fp_unittest(
   getpayload_test
   SUITE
diff --git a/libc/test/src/math/smoke/TotalOrderMagTest.h b/libc/test/src/math/smoke/TotalOrderMagTest.h
index 0a13fd2922e4c..2b37d8b2f6c4a 100644
--- a/libc/test/src/math/smoke/TotalOrderMagTest.h
+++ b/libc/test/src/math/smoke/TotalOrderMagTest.h
@@ -111,19 +111,44 @@ class TotalOrderMagTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
     T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
     T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
 
+    T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val();
+    T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val();
+    T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val();
+    T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val();
+
     EXPECT_TRUE(funcWrapper(func, aNaN, aNaN));
     EXPECT_TRUE(funcWrapper(func, sNaN, sNaN));
-    EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));
-    EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42));
-    EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN));
-    EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN));
+
+    if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {
+      EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));
+      EXPECT_FALSE(funcWrapper(func, sNaN, sna...
[truncated]

Base automatically changed from users/krishna2803/canonicalizebf16 to main August 27, 2025 17:01
@@ -111,19 +111,44 @@ class TotalOrderMagTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();

T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More of a nit but I think it would make more sense to have it like this:

        if constexpr (FPBits::FRACTION_LEN - 1 >= 5) {
          T qnan_0x15 = FPBits::quiet_nan(Sign::POS, 0x15).get_val();
          T neg_qnan_0x15 = FPBits::quiet_nan(Sign::NEG, 0x15).get_val();
          T snan_0x15 = FPBits::signaling_nan(Sign::POS, 0x15).get_val();
          T neg_snan_0x15 = FPBits::signaling_nan(Sign::NEG, 0x15).get_val();

          EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x15));
          EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x15));
          EXPECT_FALSE(funcWrapper(func, qnan_0x15, aNaN));
          EXPECT_TRUE(funcWrapper(func, snan_0x15, sNaN));

          EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x15));
          EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x15));
          EXPECT_FALSE(funcWrapper(func, neg_qnan_0x15, neg_aNaN));
          EXPECT_TRUE(funcWrapper(func, neg_snan_0x15, neg_sNaN));
        }

        if constexpr (FPBits::FRACTION_LEN - 1 >= 7) {
          T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
          T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
          T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
          T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();

          EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));
          EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42));
          EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN));
          EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN));

          EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42));
          EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42));
          EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN));
          EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN));
        }

@krishna2803 krishna2803 merged commit 691f231 into main Aug 28, 2025
20 checks passed
@krishna2803 krishna2803 deleted the users/krishna2803/totalorderbf16 branch August 28, 2025 14:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants