1 /* Macros to control TS 18661-3 glibc features on MIPS 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 */