xref: /llvm-project/libc/include/llvm-libc-types/cfloat128.h (revision b86153919652302982356990d93fda4ad9ddae30)
1 //===-- Definition of cfloat128 type --------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_LIBC_TYPES_CFLOAT128_H
10 #define LLVM_LIBC_TYPES_CFLOAT128_H
11 
12 #include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG
13 
14 // Currently, the complex variant of C23 `_Float128` type is only defined as a
15 // built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For
16 // clang, the complex variant of `__float128` is defined instead, and only on
17 // x86-64 targets for clang 11 or later.
18 //
19 // TODO: Update the complex variant of C23 `_Float128` type detection again when
20 // clang supports it.
21 #ifdef __clang__
22 #if (__clang_major__ >= 11) &&                                                 \
23     (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
24 // Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__
25 // macro to notify the availability of __float128 type:
26 // https://reviews.llvm.org/D15120
27 #define LIBC_TYPES_HAS_CFLOAT128
28 typedef _Complex __float128 cfloat128;
29 #endif
30 #elif defined(__GNUC__)
31 #if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) &&   \
32     (__GNUC__ >= 13 || (!defined(__cplusplus)))
33 #define LIBC_TYPES_HAS_CFLOAT128
34 typedef _Complex _Float128 cfloat128;
35 #endif
36 #endif
37 
38 #if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113)
39 #define LIBC_TYPES_HAS_CFLOAT128
40 #define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE
41 typedef _Complex long double cfloat128;
42 #endif
43 
44 #endif // LLVM_LIBC_TYPES_CFLOAT128_H
45