[libc] [llvm] [libc][math][c23] Implement canonicalize functions (PR #85940)

Joshua Cranmer via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 28 08:52:57 PDT 2024


================
@@ -178,6 +181,66 @@ LIBC_INLINE T fdim(T x, T y) {
   return (x > y ? x - y : 0);
 }
 
+template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
+LIBC_INLINE int canonicalize(T &cx, const T &x) {
+  FPBits<T> sx(x);
+  if constexpr (get_fp_type<T>() == FPType::X86_Binary80) {
+    // All the pseudo and unnormal numbers are not canonical.
+    // More precisely :
+    // Exponent   |       Significand      | Meaning
+    //            | Bits 63-62 | Bits 61-0 |
+    // All Ones   |     00     |    Zero   | Pseudo Infinity, Value = Infinty
----------------
jcranmer-intel wrote:

Yes, they should be treated as sNaN, and therefore returned as qNaN

(alternatively, use the escape hatch of don't-canonicalize-this-value that C provides--glibc takes this approach).

https://github.com/llvm/llvm-project/pull/85940


More information about the llvm-commits mailing list