|
9 | 9 | #ifndef LLVM_LIBC_TYPES_CFLOAT128_H |
10 | 10 | #define LLVM_LIBC_TYPES_CFLOAT128_H |
11 | 11 |
|
12 | | -#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG |
| 12 | +#include "../llvm-libc-macros/cfloat128-macros.h" |
13 | 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 |
| 14 | +#ifdef LIBC_TYPES_HAS_CFLOAT128 |
| 15 | +#ifndef LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE |
28 | 16 | 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 |
| 17 | +#else |
41 | 18 | typedef _Complex long double cfloat128; |
42 | | -#endif |
| 19 | +#endif // LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE |
| 20 | +#endif // LIBC_TYPES_HAS_CFLOAT128 |
43 | 21 |
|
44 | 22 | #endif // LLVM_LIBC_TYPES_CFLOAT128_H |
0 commit comments