[libc-commits] [libc] [libc][complex] Added support for CFP16 and CFP128 (PR #112594)

via libc-commits libc-commits at lists.llvm.org
Wed Oct 16 11:38:03 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Shourya Goel (Sh0g0-1758)

<details>
<summary>Changes</summary>

Fixes: #<!-- -->112217

---
Full diff: https://github.com/llvm/llvm-project/pull/112594.diff


8 Files Affected:

- (modified) libc/include/llvm-libc-types/CMakeLists.txt (+8) 
- (added) libc/include/llvm-libc-types/cfloat128.h (+38) 
- (added) libc/include/llvm-libc-types/cfloat16.h (+20) 
- (modified) libc/src/__support/CPP/CMakeLists.txt (+2) 
- (modified) libc/src/__support/CPP/type_traits/is_complex.h (+14-1) 
- (modified) libc/src/__support/macros/properties/CMakeLists.txt (+10) 
- (added) libc/src/__support/macros/properties/complex_types.h (+25) 
- (modified) libc/test/UnitTest/FPMatcher.h (+16) 


``````````diff
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index a4cf4631c8470e..836e8a507bd6f2 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -134,6 +134,14 @@ add_header(
   DEPENDS
     libc.include.llvm-libc-macros.float_macros
 )
+add_header(
+  cfloat128
+  HDR
+    cfloat128.h
+  DEPENDS
+    libc.include.llvm-libc-macros.float_macros
+)
+add_header(cfloat16 HDR cfloat16.h)
 add_header(fsblkcnt_t HDR fsblkcnt_t.h)
 add_header(fsfilcnt_t HDR fsfilcnt_t.h)
 add_header(
diff --git a/libc/include/llvm-libc-types/cfloat128.h b/libc/include/llvm-libc-types/cfloat128.h
new file mode 100644
index 00000000000000..0cc8ed3041d6f0
--- /dev/null
+++ b/libc/include/llvm-libc-types/cfloat128.h
@@ -0,0 +1,38 @@
+//===-- Definition of cfloat128 type --------------------------------------===//
+//
+// 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_TYPES_CFLOAT128_H
+#define LLVM_LIBC_TYPES_CFLOAT128_H
+
+#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG
+
+// Currently, the complex variant of C23 `_Float128` type is only defined as a
+// built-in type in GCC 7 or later, and only for C.  For C++, or for clang,
+// the complex variant of `__float128` is defined instead, and only on x86-64
+// targets.
+//
+// TODO: Update the complex variant of C23 `_Float128` type detection again when
+// clang supports it.
+//   https://github.com/llvm/llvm-project/issues/80195
+#if defined(__STDC_IEC_60559_COMPLEX__) && !defined(__clang__) &&              \
+    !defined(__cplusplus)
+#define LIBC_TYPES_HAS_CFLOAT128
+typedef _Complex _Float128 cfloat128;
+#elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
+// Use _Complex __float128 type.  gcc and clang sometime use __SIZEOF_FLOAT128__
+// to notify the availability of __float128. clang also uses __FLOAT128__ macro
+// to notify the availability of __float128 type:
+// https://reviews.llvm.org/D15120
+#define LIBC_TYPES_HAS_CFLOAT128
+typedef _Complex __float128 cfloat128;
+#elif (LDBL_MANT_DIG == 113)
+#define LIBC_TYPES_HAS_CFLOAT128
+typedef _Complex long double cfloat128;
+#endif
+
+#endif // LLVM_LIBC_TYPES_CFLOAT128_H
diff --git a/libc/include/llvm-libc-types/cfloat16.h b/libc/include/llvm-libc-types/cfloat16.h
new file mode 100644
index 00000000000000..e7e5631e025074
--- /dev/null
+++ b/libc/include/llvm-libc-types/cfloat16.h
@@ -0,0 +1,20 @@
+//===-- Definition of cfloat16 type ---------------------------------------===//
+//
+// 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_TYPES_CFLOAT16_H
+#define LLVM_LIBC_TYPES_CFLOAT16_H
+
+#if defined(__FLT16_MANT_DIG__) &&                                             \
+    (!defined(__GNUC__) || __GNUC__ >= 13 || defined(__clang__)) &&            \
+    !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) &&              \
+    !defined(_WIN32)
+#define LIBC_TYPES_HAS_CFLOAT16
+typedef _Complex _Float16 cfloat16;
+#endif
+
+#endif // LLVM_LIBC_TYPES_CFLOAT16_H
diff --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt
index c1981b827042ca..774668be42e56d 100644
--- a/libc/src/__support/CPP/CMakeLists.txt
+++ b/libc/src/__support/CPP/CMakeLists.txt
@@ -126,6 +126,7 @@ add_header_library(
     type_traits/is_array.h
     type_traits/is_base_of.h
     type_traits/is_class.h
+    type_traits/is_complex.h
     type_traits/is_const.h
     type_traits/is_constant_evaluated.h
     type_traits/is_convertible.h
@@ -165,6 +166,7 @@ add_header_library(
     libc.include.llvm-libc-macros.stdfix_macros
     libc.src.__support.macros.attributes
     libc.src.__support.macros.properties.types
+    libc.src.__support.macros.properties.complex_types
 )
 
 add_header_library(
diff --git a/libc/src/__support/CPP/type_traits/is_complex.h b/libc/src/__support/CPP/type_traits/is_complex.h
index 4f5ee9abdb33a5..23f05c08ccab5a 100644
--- a/libc/src/__support/CPP/type_traits/is_complex.h
+++ b/libc/src/__support/CPP/type_traits/is_complex.h
@@ -10,6 +10,10 @@
 
 #include "src/__support/CPP/type_traits/is_same.h"
 #include "src/__support/CPP/type_traits/remove_cv.h"
+#include "src/__support/macros/attributes.h"
+#include "src/__support/macros/config.h"
+// LIBC_TYPES_HAS_CFLOAT16 && LIBC_TYPES_HAS_CFLOAT128
+#include "src/__support/macros/properties/complex_types.h"
 
 namespace LIBC_NAMESPACE_DECL {
 namespace cpp {
@@ -25,7 +29,16 @@ template <typename T> struct is_complex {
 public:
   LIBC_INLINE_VAR static constexpr bool value =
       __is_unqualified_any_of<T, _Complex float, _Complex double,
-                              _Complex long double>();
+                              _Complex long double
+#ifdef LIBC_TYPES_HAS_CFLOAT16
+                              ,
+                              cfloat16
+#endif
+#ifdef LIBC_TYPES_HAS_CFLOAT128
+                              ,
+                              cfloat128
+#endif
+                              >();
 };
 template <typename T>
 LIBC_INLINE_VAR constexpr bool is_complex_v = is_complex<T>::value;
diff --git a/libc/src/__support/macros/properties/CMakeLists.txt b/libc/src/__support/macros/properties/CMakeLists.txt
index c69f3a85d7287a..80ed63a2fbcf70 100644
--- a/libc/src/__support/macros/properties/CMakeLists.txt
+++ b/libc/src/__support/macros/properties/CMakeLists.txt
@@ -37,3 +37,13 @@ add_header_library(
     libc.include.llvm-libc-macros.float16_macros
     libc.include.llvm-libc-types.float128
 )
+
+add_header_library(
+  complex_types
+  HDRS
+    complex_types.h
+  DEPENDS
+    .types
+    libc.include.llvm-libc-types.cfloat16
+    libc.include.llvm-libc-types.cfloat128
+)
diff --git a/libc/src/__support/macros/properties/complex_types.h b/libc/src/__support/macros/properties/complex_types.h
new file mode 100644
index 00000000000000..3f4a7646649c64
--- /dev/null
+++ b/libc/src/__support/macros/properties/complex_types.h
@@ -0,0 +1,25 @@
+//===-- Complex Types support -----------------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+// Complex Types detection and support.
+
+#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H
+#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H
+
+#include "include/llvm-libc-types/cfloat128.h"
+#include "include/llvm-libc-types/cfloat16.h"
+#include "types.h"
+
+// -- cfloat16 support --------------------------------------------------------
+// LIBC_TYPES_HAS_CFLOAT16 and 'cfloat16' type is provided by
+// "include/llvm-libc-types/cfloat16.h"
+
+// -- cfloat128 support -------------------------------------------------------
+// LIBC_TYPES_HAS_CFLOAT128 and 'cfloat128' type are provided by
+// "include/llvm-libc-types/cfloat128.h"
+
+#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CTYPES_H
diff --git a/libc/test/UnitTest/FPMatcher.h b/libc/test/UnitTest/FPMatcher.h
index 5220b1245bf3a5..181fb353febd0b 100644
--- a/libc/test/UnitTest/FPMatcher.h
+++ b/libc/test/UnitTest/FPMatcher.h
@@ -128,6 +128,14 @@ template <typename T, TestCond Condition> class CFPMatcher : public Matcher<T> {
       return matchComplex<double>();
     else if (cpp::is_complex_type_same<T, _Complex long double>())
       return matchComplex<long double>();
+#ifdef LIBC_TYPES_HAS_CFLOAT16
+    else if (cpp::is_complex_type_same<T, cfloat16>)
+      return matchComplex<float16>();
+#endif
+#ifdef LIBC_TYPES_HAS_CFLOAT128
+    else if (cpp::is_complex_type_same<T, cfloat128>)
+      return matchComplex<float128>();
+#endif
   }
 
   void explainError() override {
@@ -137,6 +145,14 @@ template <typename T, TestCond Condition> class CFPMatcher : public Matcher<T> {
       return explainErrorComplex<double>();
     else if (cpp::is_complex_type_same<T, _Complex long double>())
       return explainErrorComplex<long double>();
+#ifdef LIBC_TYPES_HAS_CFLOAT16
+    else if (cpp::is_complex_type_same<T, cfloat16>)
+      return explainErrorComplex<float16>();
+#endif
+#ifdef LIBC_TYPES_HAS_CFLOAT128
+    else if (cpp::is_complex_type_same<T, cfloat128>)
+      return explainErrorComplex<float128>();
+#endif
   }
 };
 

``````````

</details>


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


More information about the libc-commits mailing list