1 /* GCC Quad-Precision Math Library
2 Copyright (C) 2010, 2011 Free Software Foundation, Inc.
3 Written by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
5 This file is part of the libquadmath library.
6 Libquadmath is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 Libquadmath is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public
17 License along with libquadmath; see the file COPYING.LIB. If
18 not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
21 #ifndef QUADMATH_IMP_H
22 #define QUADMATH_IMP_H
30 /* Under IEEE 754, an architecture may determine tininess of
31 floating-point results either "before rounding" or "after
32 rounding", but must do so in the same way for all operations
33 returning binary results. Define TININESS_AFTER_ROUNDING to 1 for
34 "after rounding" architectures, 0 for "before rounding"
37 #define TININESS_AFTER_ROUNDING 1
40 /* Prototypes for internal functions. */
41 extern int32_t __quadmath_rem_pio2q (__float128
, __float128
*);
42 extern void __quadmath_kernel_sincosq (__float128
, __float128
, __float128
*,
44 extern __float128
__quadmath_kernel_sinq (__float128
, __float128
, int);
45 extern __float128
__quadmath_kernel_cosq (__float128
, __float128
);
46 extern __float128
__quadmath_x2y2m1q (__float128 x
, __float128 y
);
47 extern int __quadmath_isinf_nsq (__float128 x
);
53 /* Frankly, if you have __float128, you have 64-bit integers, right? */
59 /* Main union type we use to manipulate the floating-point type. */
66 /* On mingw targets the ms-bitfields option is active by default.
67 Therefore enforce gnu-bitfield style. */
68 __attribute__ ((gcc_struct
))
71 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
74 uint64_t mant_high
:48;
78 uint64_t mant_high
:48;
86 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
97 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
112 /* Make sure we are using gnu-style bitfield handling. */
113 __attribute__ ((gcc_struct
))
116 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
118 unsigned exponent
:15;
119 unsigned quiet_nan
:1;
120 uint64_t mant_high
:47;
121 uint64_t mant_low
:64;
123 uint64_t mant_low
:64;
124 uint64_t mant_high
:47;
125 unsigned quiet_nan
:1;
126 unsigned exponent
:15;
134 /* Get two 64 bit ints from a long double. */
135 #define GET_FLT128_WORDS64(ix0,ix1,d) \
137 ieee854_float128 u; \
139 (ix0) = u.words64.high; \
140 (ix1) = u.words64.low; \
143 /* Set a long double from two 64 bit ints. */
144 #define SET_FLT128_WORDS64(d,ix0,ix1) \
146 ieee854_float128 u; \
147 u.words64.high = (ix0); \
148 u.words64.low = (ix1); \
152 /* Get the more significant 64 bits of a long double mantissa. */
153 #define GET_FLT128_MSW64(v,d) \
155 ieee854_float128 u; \
157 (v) = u.words64.high; \
160 /* Set the more significant 64 bits of a long double mantissa from an int. */
161 #define SET_FLT128_MSW64(d,v) \
163 ieee854_float128 u; \
165 u.words64.high = (v); \
169 /* Get the least significant 64 bits of a long double mantissa. */
170 #define GET_FLT128_LSW64(v,d) \
172 ieee854_float128 u; \
174 (v) = u.words64.low; \
178 #define IEEE854_FLOAT128_BIAS 0x3fff
181 #define QUADFP_INFINITE 1
182 #define QUADFP_ZERO 2
183 #define QUADFP_SUBNORMAL 3
184 #define QUADFP_NORMAL 4
185 #define fpclassifyq(x) \
186 __builtin_fpclassify (QUADFP_NAN, QUADFP_INFINITE, QUADFP_NORMAL, \
187 QUADFP_SUBNORMAL, QUADFP_ZERO, x)