summaryrefslogtreecommitdiff
path: root/libc/include/llvm-libc-macros/cfloat128-macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/include/llvm-libc-macros/cfloat128-macros.h')
-rw-r--r--libc/include/llvm-libc-macros/cfloat128-macros.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/libc/include/llvm-libc-macros/cfloat128-macros.h b/libc/include/llvm-libc-macros/cfloat128-macros.h
new file mode 100644
index 000000000000..5f28cfa21aae
--- /dev/null
+++ b/libc/include/llvm-libc-macros/cfloat128-macros.h
@@ -0,0 +1,41 @@
+//===-- Detection of _Complex _Float128 compiler builtin 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_MACROS_CFLOAT128_MACROS_H
+#define LLVM_LIBC_MACROS_CFLOAT128_MACROS_H
+
+#include "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, for C and in GCC 13 or later, for C++. For
+// clang, the complex variant of `__float128` is defined instead, and only on
+// x86-64 targets for clang 11 or later.
+//
+// TODO: Update the complex variant of C23 `_Float128` type detection again when
+// clang supports it.
+#ifdef __clang__
+#if (__clang_major__ >= 11) && \
+ (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
+// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__
+// macro to notify the availability of __float128 type:
+// https://reviews.llvm.org/D15120
+#define LIBC_TYPES_HAS_CFLOAT128
+#endif
+#elif defined(__GNUC__)
+#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \
+ (__GNUC__ >= 13 || (!defined(__cplusplus)))
+#define LIBC_TYPES_HAS_CFLOAT128
+#endif
+#endif
+
+#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113)
+#define LIBC_TYPES_HAS_CFLOAT128
+#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE
+#endif
+
+#endif // LLVM_LIBC_MACROS_CFLOAT128_MACROS_H