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 | |