1 /* Macros to control TS 18661-3 glibc features on ldbl-128 platforms. 2 Copyright (C) 2017-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #ifndef _BITS_FLOATN_H 20 #define _BITS_FLOATN_H 21 22 #include <features.h> 23 #include <bits/long-double.h> 24 25 /* Defined to 1 if the current compiler invocation provides a 26 floating-point type with the IEEE 754 binary128 format, and this 27 glibc includes corresponding *f128 interfaces for it. */ 28 #ifndef __NO_LONG_DOUBLE_MATH 29 # define __HAVE_FLOAT128 1 30 #else 31 /* glibc does not support _Float128 for platforms where long double is 32 normally binary128 when building with long double as binary64. 33 GCC's default for supported scalar modes does not support it either 34 in that case. */ 35 # define __HAVE_FLOAT128 0 36 #endif 37 38 /* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct 39 from the default float, double and long double types in this glibc. */ 40 #define __HAVE_DISTINCT_FLOAT128 0 41 42 /* Defined to 1 if the current compiler invocation provides a 43 floating-point type with the right format for _Float64x, and this 44 glibc includes corresponding *f64x interfaces for it. */ 45 #define __HAVE_FLOAT64X __HAVE_FLOAT128 46 47 /* Defined to 1 if __HAVE_FLOAT64X is 1 and _Float64x has the format 48 of long double. Otherwise, if __HAVE_FLOAT64X is 1, _Float64x has 49 the format of _Float128, which must be different from that of long 50 double. */ 51 #define __HAVE_FLOAT64X_LONG_DOUBLE __HAVE_FLOAT128 52 53 #ifndef __ASSEMBLER__ 54 55 /* Defined to concatenate the literal suffix to be used with _Float128 56 types, if __HAVE_FLOAT128 is 1. */ 57 # if __HAVE_FLOAT128 58 # if !__GNUC_PREREQ (7, 0) || defined __cplusplus 59 /* The literal suffix f128 exists only since GCC 7.0. */ 60 # define __f128(x) x##l 61 # else 62 # define __f128(x) x##f128 63 # endif 64 # endif 65 66 /* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */ 67 # if __HAVE_FLOAT128 68 # if !__GNUC_PREREQ (7, 0) || defined __cplusplus 69 # define __CFLOAT128 _Complex long double 70 # else 71 # define __CFLOAT128 _Complex _Float128 72 # endif 73 # endif 74 75 /* The remaining of this file provides support for older compilers. */ 76 # if __HAVE_FLOAT128 77 78 /* The type _Float128 exists only since GCC 7.0. */ 79 # if !__GNUC_PREREQ (7, 0) || defined __cplusplus 80 typedef long double _Float128; 81 # endif 82 83 /* Various built-in functions do not exist before GCC 7.0. */ 84 # if !__GNUC_PREREQ (7, 0) 85 # define __builtin_huge_valf128() (__builtin_huge_vall ()) 86 # define __builtin_inff128() (__builtin_infl ()) 87 # define __builtin_nanf128(x) (__builtin_nanl (x)) 88 # define __builtin_nansf128(x) (__builtin_nansl (x)) 89 # endif 90 91 # endif 92 93 #endif /* !__ASSEMBLER__. */ 94 95 #include <bits/floatn-common.h> 96 97 #endif /* _BITS_FLOATN_H */