1 //===-- Definition of cfloat128 type --------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIBC_TYPES_CFLOAT128_H
10 #define LLVM_LIBC_TYPES_CFLOAT128_H
12 #include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG
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.
19 // TODO: Update the complex variant of C23 `_Float128` type detection again when
21 #if defined(__STDC_IEC_60559_COMPLEX__) && !defined(__clang__)
22 #if !defined(__cplusplus)
23 #define LIBC_TYPES_HAS_CFLOAT128
24 typedef _Complex _Float128 cfloat128
;
25 #elif defined(__GNUC__) && __GNUC__ >= 13
26 #define LIBC_TYPES_HAS_CFLOAT128
27 typedef _Complex _Float128 cfloat128
;
29 #elif __clang_major__ >= 11 && \
30 (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__))
31 // Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__
32 // macro to notify the availability of __float128 type:
33 // https://reviews.llvm.org/D15120
34 #define LIBC_TYPES_HAS_CFLOAT128
35 typedef _Complex __float128 cfloat128
;
36 #elif (LDBL_MANT_DIG == 113)
37 #define LIBC_TYPES_HAS_CFLOAT128
38 typedef _Complex
long double cfloat128
;
41 #endif // LLVM_LIBC_TYPES_CFLOAT128_H