Move VTV_SUPPORTED check after AC_CANONICAL_SYSTEM
[gcc.git] / libquadmath / quadmath-imp.h
index 5544fabca19be5a8d2d96d94b0d275609626561d..40b346b6ff22bd4028d0931f5b8ea576b4d57eda 100644 (file)
@@ -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  <fxcoudert@gcc.gnu.org>
 
-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,42 +24,56 @@ Boston, MA 02110-1301, USA.  */
 #include <stdint.h>
 #include <stdlib.h>
 #include "quadmath.h"
+#include "config.h"
 
 
-// Prototypes for internal functions
-extern int32_t rem_pio2q (__float128, __float128 *);
-extern void __kernel_sincosq (__float128, __float128, __float128 *, __float128 *, int);
-extern __float128 __kernel_sinq (__float128, __float128, int);
-extern __float128 __kernel_cosq (__float128, __float128);
+/* Under IEEE 754, an architecture may determine tininess of
+   floating-point results either "before rounding" or "after
+   rounding", but must do so in the same way for all operations
+   returning binary results.  Define TININESS_AFTER_ROUNDING to 1 for
+   "after rounding" architectures, 0 for "before rounding"
+   architectures.  */
 
+#define TININESS_AFTER_ROUNDING   1
 
 
-// Frankly, if you have __float128, you have 64-bit integers, right?
-#ifndef UINT64_C
-# error "No way!"
-#endif
+/* Prototypes for internal functions.  */
+extern int32_t __quadmath_rem_pio2q (__float128, __float128 *);
+extern void __quadmath_kernel_sincosq (__float128, __float128, __float128 *,
+                                      __float128 *, int);
+extern __float128 __quadmath_kernel_sinq (__float128, __float128, int);
+extern __float128 __quadmath_kernel_cosq (__float128, __float128);
+extern __float128 __quadmath_x2y2m1q (__float128 x, __float128 y);
+extern int __quadmath_isinf_nsq (__float128 x);
+
 
 
-// If we don't have macros to know endianess, assume little endian
-#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
-# define __LITTLE_ENDIAN__ 1
+
+
+/* Frankly, if you have __float128, you have 64-bit integers, right?  */
+#ifndef UINT64_C
+# error "No way!"
 #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;
@@ -69,11 +83,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
@@ -81,13 +94,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;
@@ -96,15 +108,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;
@@ -162,5 +177,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