X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libquadmath%2Fquadmath-imp.h;h=bac714d1c8bf5c040dab1cf5acf2f7e936301690;hb=ecb588071d67c5c63dabd65e6fd5703b74451ec9;hp=e297529a1e693d24d606162f5f0fcde5d3a0e396;hpb=0aa903b3612e56d607fb46b6852ba97b2c2d382b;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libquadmath/quadmath-imp.h b/libquadmath/quadmath-imp.h index e297529a1e6..bac714d1c8b 100644 --- a/libquadmath/quadmath-imp.h +++ b/libquadmath/quadmath-imp.h @@ -1,20 +1,20 @@ /* GCC Quad-Precision Math Library - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010, 2011 Free Software Foundation, Inc. Written by Francois-Xavier Coudert -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or +This file is part of the libquadmath library. +Libquadmath is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. -Libiberty is distributed in the hope that it will be useful, +Libquadmath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If +License along with libquadmath; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ @@ -24,9 +24,10 @@ Boston, MA 02110-1301, USA. */ #include #include #include "quadmath.h" +#include "config.h" -// Prototypes for internal functions +/* Prototypes for internal functions. */ extern int32_t __quadmath_rem_pio2q (__float128, __float128 *); extern void __quadmath_kernel_sincosq (__float128, __float128, __float128 *, __float128 *, int); @@ -35,32 +36,30 @@ extern __float128 __quadmath_kernel_cosq (__float128, __float128); -// Frankly, if you have __float128, you have 64-bit integers, right? +/* Frankly, if you have __float128, you have 64-bit integers, right? */ #ifndef UINT64_C # error "No way!" #endif -// If we don't have macros to know endianess, assume little endian -#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) -# define __LITTLE_ENDIAN__ 1 -#endif - - -// Main union type we use to manipulate the floating-point type +/* Main union type we use to manipulate the floating-point type. */ typedef union { __float128 value; struct +#ifdef __MINGW32__ + /* On mingw targets the ms-bitfields option is active by default. + Therefore enforce gnu-bitfield style. */ + __attribute__ ((gcc_struct)) +#endif { -#if __BIG_ENDIAN__ +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ unsigned negative:1; unsigned exponent:15; uint64_t mant_high:48; uint64_t mant_low:64; -#endif -#if __LITTLE_ENDIAN__ +#else uint64_t mant_low:64; uint64_t mant_high:48; unsigned exponent:15; @@ -70,11 +69,10 @@ typedef union struct { -#if __BIG_ENDIAN__ +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ uint64_t high; uint64_t low; -#endif -#if __LITTLE_ENDIAN__ +#else uint64_t low; uint64_t high; #endif @@ -82,13 +80,12 @@ typedef union struct { -#if __BIG_ENDIAN__ +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ uint32_t w0; uint32_t w1; uint32_t w2; uint32_t w3; -#endif -#if __LITTLE_ENDIAN__ +#else uint32_t w3; uint32_t w2; uint32_t w1; @@ -97,15 +94,18 @@ typedef union } words32; struct +#ifdef __MINGW32__ + /* Make sure we are using gnu-style bitfield handling. */ + __attribute__ ((gcc_struct)) +#endif { -#if __BIG_ENDIAN__ +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ unsigned negative:1; unsigned exponent:15; unsigned quiet_nan:1; uint64_t mant_high:47; uint64_t mant_low:64; -#endif -#if __LITTLE_ENDIAN__ +#else uint64_t mant_low:64; uint64_t mant_high:47; unsigned quiet_nan:1; @@ -163,5 +163,13 @@ do { \ #define IEEE854_FLOAT128_BIAS 0x3fff +#define QUADFP_NAN 0 +#define QUADFP_INFINITE 1 +#define QUADFP_ZERO 2 +#define QUADFP_SUBNORMAL 3 +#define QUADFP_NORMAL 4 +#define fpclassifyq(x) \ + __builtin_fpclassify (QUADFP_NAN, QUADFP_INFINITE, QUADFP_NORMAL, \ + QUADFP_SUBNORMAL, QUADFP_ZERO, x) #endif