public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* fix libquadmath build regression
@ 2012-12-21  5:17 Alexandre Oliva
  2012-12-21 10:32 ` Tobias Burnus
  2012-12-24 14:57 ` Paolo Bonzini
  0 siblings, 2 replies; 9+ messages in thread
From: Alexandre Oliva @ 2012-12-21  5:17 UTC (permalink / raw)
  To: gcc-patches; +Cc: Tobias Burnus

[-- Attachment #1: Type: text/plain, Size: 845 bytes --]

Revision 193063 brought in calls to fraiseexcept() into libquadmath,
which caused a build regression on Fedora 16 (BLAG 160k actually) x86_64
while building an i686-linux-gnu native toolchain.

The problem is that glibc has an extern inline definition of
fraiseexcept that is introduced by including fenv.h (it's in
bits/fenv.h), and this definition requires SSE support regardless of
target arch of word width, so it doesn't work for an i686 native that
doesn't assume SSE registers and instructions are available.

This bug is fixed in newer versions of glibc, but I figured it wouldn't
hurt to have a work-around in place for libquadmath to build, detecting
that the extern inline in the header is broken and introducing a wrapper
that bypasses the header so as to use the out-of-line definition in the
math library.

Is this ok to install?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: quadmath-fenv-broken-feraiseexcept.patch --]
[-- Type: text/x-diff, Size: 43085 bytes --]

Deal with SSE-requiring extern inline in bits/fenv.h

From: Alexandre Oliva <aoliva@redhat.com>

for  libquadmath/ChangeLog

	* configure.ac: Check that calling feraiseexcept compiles when
	fenv.h is included.  Define QUADMATH_FERAISEEXCEPT cpp macro
	and LIBQUAD_FERAISEEXCEPT conditional otherwise.
	* Makefile.am (libquadmath_la_SOURCES): Add
	math/feraiseexcept.c, conditional on LIBQUAD_FERAISEEXCEPT.
	* aclocal.m4: Rebuilt.
	* configure: Rebuilt.
	* config.h.in: Rebuilt.
	* Makefile.in: Rebuilt.
	* math/feraiseexcept.c: New file.
	* math/quadmath-imp.h (__quadmath_feraiseexcept): Declare.
	* math/ccoshq.c: Use QUADMATH_FERAISEEXCEPT macro to call, and
	to decide whether to call, feraiseexcept.
	* math/cexpq.c: Likewise.
	* math/csinhq.c: Likewise.
	* math/csinq.c: Likewise.
	* math/ctanhq.c: Likewise.
	* math/ctanq.c: Likewise.
	* math/ilogbq.c: Likewise.  Include fenv.h if HAVE_FENV_H.
---

 libquadmath/Makefile.am          |    3 +
 libquadmath/Makefile.in          |  200 +++++++++++++++++++++++++++-----------
 libquadmath/aclocal.m4           |   74 +++++++++-----
 libquadmath/config.h.in          |    3 +
 libquadmath/configure            |   58 +++++++++++
 libquadmath/configure.ac         |   21 ++++
 libquadmath/math/ccoshq.c        |    8 +-
 libquadmath/math/cexpq.c         |   12 +-
 libquadmath/math/csinhq.c        |   12 +-
 libquadmath/math/csinq.c         |   12 +-
 libquadmath/math/ctanhq.c        |    4 -
 libquadmath/math/ctanq.c         |    4 -
 libquadmath/math/feraiseexcept.c |    9 ++
 libquadmath/math/ilogbq.c        |   16 ++-
 libquadmath/quadmath-imp.h       |    5 +
 15 files changed, 318 insertions(+), 123 deletions(-)
 create mode 100644 libquadmath/math/feraiseexcept.c


diff --git a/libquadmath/Makefile.am b/libquadmath/Makefile.am
index 6c97ee8..9acf619 100644
--- a/libquadmath/Makefile.am
+++ b/libquadmath/Makefile.am
@@ -69,6 +69,9 @@ libquadmath_la_SOURCES = \
   printf/quadmath-printf.c printf/rshift.c printf/submul_1.c printf/sub_n.c \
   strtod/strtoflt128.c strtod/mpn2flt128.c strtod/tens_in_limb.c
 
+if LIBQUAD_FERAISEEXCEPT
+libquadmath_la_SOURCES += math/feraiseexcept.c
+endif
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
diff --git a/libquadmath/configure.ac b/libquadmath/configure.ac
index c547da8..765dfea 100644
--- a/libquadmath/configure.ac
+++ b/libquadmath/configure.ac
@@ -150,6 +150,27 @@ else
   fi
 fi
 
+if test "x$ac_cv_header_fenv_h" = "xyes"; then
+  dnl Some versions of libc 2.16 for x86_64 have an extern inline
+  dnl definition of feraiseexcept in bits/fenv.h that requires SSE
+  dnl support, and they fail to compile with -m32 when targeting
+  dnl pre-x86_64 32-bit architectures.
+
+  dnl This wrapper enables us to bypass the inline definition and call
+  dnl the out-of-line feraiseexcept definition, because it does not
+  dnl include fenv.h itself.
+
+  AC_CACHE_CHECK([whether feraiseexcept is broken in fenv.h], [quadmath_cv_feraiseexcept_fenv_broken], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <fenv.h>]], [feraiseexcept (FE_INVALID);])], [quadmath_cv_feraiseexcept_fenv_broken=no], [quadmath_cv_feraiseexcept_fenv_broken=yes])])
+  if test "x$quadmath_cv_feraiseexcept_fenv_broken" = "xyes"; then
+    feraiseexcept=__quadmath_feraiseexcept
+  else
+    feraiseexcept=feraiseexcept
+  fi
+  AC_DEFINE_UNQUOTED([QUADMATH_FERAISEEXCEPT], [$feraiseexcept],
+    		     [Optional replacement for compile-time broken feraiseexcept.])
+fi
+AM_CONDITIONAL([LIBQUAD_FERAISEEXCEPT], [test "x$ac_cv_header_fenv_h$quadmath_cv_feraiseexcept_fenv_broken" = "xyesyes"])
+
 # Check for hidden visibility (copied from libssp).
 saved_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -Werror"
diff --git a/libquadmath/math/ccoshq.c b/libquadmath/math/ccoshq.c
index 8d55ad3..c1b24ac 100644
--- a/libquadmath/math/ccoshq.c
+++ b/libquadmath/math/ccoshq.c
@@ -89,9 +89,9 @@ ccoshq (__complex128 x)
 	  __imag__ retval = __real__ x == 0.0Q ? 0.0Q : nanq ("");
 	  __real__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
         }
     }
@@ -129,9 +129,9 @@ ccoshq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	 }
     }
diff --git a/libquadmath/math/cexpq.c b/libquadmath/math/cexpq.c
index bd4be1e..a7f42bf 100644
--- a/libquadmath/math/cexpq.c
+++ b/libquadmath/math/cexpq.c
@@ -83,8 +83,8 @@ cexpq (__complex128 x)
 	  __real__ retval = nanq ("");
 	  __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	  feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	  QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
@@ -125,9 +125,9 @@ cexpq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
       else
@@ -142,9 +142,9 @@ cexpq (__complex128 x)
       __real__ retval = nanq ("");
       __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
       if (rcls != QUADFP_NAN || icls != QUADFP_NAN)
-	feraiseexcept (FE_INVALID);
+	QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
     }
 
diff --git a/libquadmath/math/csinhq.c b/libquadmath/math/csinhq.c
index c16d576..5f1d8df 100644
--- a/libquadmath/math/csinhq.c
+++ b/libquadmath/math/csinhq.c
@@ -98,9 +98,9 @@ csinhq (__complex128 x)
 	      __real__ retval = copysignq (0.0Q, negate ? -1.0Q : 1.0Q);
 	      __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	      if (icls == QUADFP_INFINITE)
-		feraiseexcept (FE_INVALID);
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	  else
@@ -108,8 +108,8 @@ csinhq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	      feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	      QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	}
@@ -150,9 +150,9 @@ csinhq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/csinq.c b/libquadmath/math/csinq.c
index c837e50..cd37013 100644
--- a/libquadmath/math/csinq.c
+++ b/libquadmath/math/csinq.c
@@ -98,9 +98,9 @@ csinq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = __imag__ x;
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	      if (rcls == QUADFP_INFINITE)
-		feraiseexcept (FE_INVALID);
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	  else
@@ -108,8 +108,8 @@ csinq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	      feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	      QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	}
@@ -152,9 +152,9 @@ csinq (__complex128 x)
 	  __real__ retval = nanq ("");
 	  __imag__ retval = HUGE_VALQ;
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (rcls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/ctanhq.c b/libquadmath/math/ctanhq.c
index 8934cfa..e954965 100644
--- a/libquadmath/math/ctanhq.c
+++ b/libquadmath/math/ctanhq.c
@@ -45,9 +45,9 @@ ctanhq (__complex128 x)
 	  __real__ res = nanq ("");
 	  __imag__ res = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (__quadmath_isinf_nsq (__imag__ x))
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/ctanq.c b/libquadmath/math/ctanq.c
index d390511..d3570be 100644
--- a/libquadmath/math/ctanq.c
+++ b/libquadmath/math/ctanq.c
@@ -45,9 +45,9 @@ ctanq (__complex128 x)
 	  __real__ res = nanq ("");
 	  __imag__ res = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (__quadmath_isinf_nsq (__real__ x))
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/feraiseexcept.c b/libquadmath/math/feraiseexcept.c
new file mode 100644
index 0000000..3d13743
--- /dev/null
+++ b/libquadmath/math/feraiseexcept.c
@@ -0,0 +1,9 @@
+/* Wrapper for feraiseexcept.  This file is in the public domain.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   See QUADMATH_FERAISEEXCEPT in configure.ac for more information.  */
+
+int
+__quadmath_feraiseexcept (int xcpt)
+{
+  feraiseexcept (xcpt);
+}
diff --git a/libquadmath/math/ilogbq.c b/libquadmath/math/ilogbq.c
index 7f95e9c..553df9e 100644
--- a/libquadmath/math/ilogbq.c
+++ b/libquadmath/math/ilogbq.c
@@ -29,6 +29,10 @@ static char rcsid[] = "$NetBSD: $";
 #include <errno.h>
 #include "quadmath-imp.h"
 
+#ifdef HAVE_FENV_H
+# include <fenv.h>
+#endif
+
 #ifndef FP_ILOGB0
 # define FP_ILOGB0 INT_MIN
 #endif
@@ -48,8 +52,8 @@ ilogbq (__float128 x)
 	    if((hx|lx)==0)
 	      {
 		errno = EDOM;
-#ifdef USE_FENV_H
-		feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
 	      }
@@ -67,16 +71,16 @@ ilogbq (__float128 x)
 	    if (((hx^0x7fff000000000000LL)|lx) == 0)
 	      {
 		errno = EDOM;
-#ifdef USE_FENV_H
-		feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 		return INT_MAX;
 	      }
 	}
 
 	errno = EDOM;
-#ifdef USE_FENV_H
-	feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	return FP_ILOGBNAN;
 }
diff --git a/libquadmath/quadmath-imp.h b/libquadmath/quadmath-imp.h
index 40b346b..6951393 100644
--- a/libquadmath/quadmath-imp.h
+++ b/libquadmath/quadmath-imp.h
@@ -46,8 +46,9 @@ extern __float128 __quadmath_kernel_cosq (__float128, __float128);
 extern __float128 __quadmath_x2y2m1q (__float128 x, __float128 y);
 extern int __quadmath_isinf_nsq (__float128 x);
 
-
-
+#ifdef HAVE_FENV_H
+extern int __quadmath_feraiseexcept (int);
+#endif
 
 
 /* Frankly, if you have __float128, you have 64-bit integers, right?  */
diff --git a/libquadmath/Makefile.in b/libquadmath/Makefile.in
index 92c5d25..bcd6cde 100644
--- a/libquadmath/Makefile.in
+++ b/libquadmath/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -17,6 +17,23 @@
 
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -37,6 +54,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 @BUILD_LIBQUADMATH_FALSE@libquadmath_la_DEPENDENCIES =
+@BUILD_LIBQUADMATH_TRUE@@LIBQUAD_FERAISEEXCEPT_TRUE@am__append_1 = math/feraiseexcept.c
 subdir = .
 DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
 	$(top_srcdir)/configure $(am__configure_deps) \
@@ -83,10 +101,17 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
 am__installdirs = "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" \
 	"$(DESTDIR)$(libsubincludedir)"
 LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
 am__dirstamp = $(am__leading_dot)dirstamp
+@BUILD_LIBQUADMATH_TRUE@@LIBQUAD_FERAISEEXCEPT_TRUE@am__objects_1 = math/feraiseexcept.lo
 @BUILD_LIBQUADMATH_TRUE@am_libquadmath_la_OBJECTS = math/x2y2m1q.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/isinf_nsq.lo math/acoshq.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/fmodq.lo math/acosq.lo \
@@ -142,7 +167,8 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @BUILD_LIBQUADMATH_TRUE@	printf/rshift.lo printf/submul_1.lo \
 @BUILD_LIBQUADMATH_TRUE@	printf/sub_n.lo strtod/strtoflt128.lo \
 @BUILD_LIBQUADMATH_TRUE@	strtod/mpn2flt128.lo \
-@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.lo
+@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.lo \
+@BUILD_LIBQUADMATH_TRUE@	$(am__objects_1)
 libquadmath_la_OBJECTS = $(am_libquadmath_la_OBJECTS)
 libquadmath_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -181,6 +207,11 @@ TEXI2PDF = $(TEXI2DVI) --pdf --batch
 MAKEINFOHTML = $(MAKEINFO) --html
 AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
 DVIPS = dvips
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(nodist_libsubinclude_HEADERS)
 ETAGS = etags
 CTAGS = ctags
@@ -325,33 +356,59 @@ AUTOMAKE_OPTIONS = 1.8 foreign
 @BUILD_LIBQUADMATH_TRUE@libquadmath_la_DEPENDENCIES = $(version_dep) $(libquadmath_la_LIBADD)
 @BUILD_LIBQUADMATH_TRUE@nodist_libsubinclude_HEADERS = quadmath.h quadmath_weak.h
 @BUILD_LIBQUADMATH_TRUE@libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
-@BUILD_LIBQUADMATH_TRUE@libquadmath_la_SOURCES = \
-@BUILD_LIBQUADMATH_TRUE@  math/x2y2m1q.c math/isinf_nsq.c math/acoshq.c math/fmodq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/acosq.c math/frexpq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/rem_pio2q.c math/asinhq.c math/hypotq.c math/remainderq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/asinq.c math/rintq.c math/atan2q.c math/isinfq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/roundq.c math/atanhq.c math/isnanq.c math/scalblnq.c math/atanq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/j0q.c math/scalbnq.c math/cbrtq.c math/j1q.c math/signbitq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/ceilq.c math/jnq.c math/sincos_table.c math/complex.c math/ldexpq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/sincosq.c math/copysignq.c math/lgammaq.c math/sincosq_kernel.c \
-@BUILD_LIBQUADMATH_TRUE@  math/coshq.c math/llroundq.c math/sinhq.c math/cosq.c math/log10q.c \
-@BUILD_LIBQUADMATH_TRUE@  math/sinq.c math/cosq_kernel.c math/log1pq.c math/sinq_kernel.c \
-@BUILD_LIBQUADMATH_TRUE@  math/erfq.c math/logq.c math/sqrtq.c math/expm1q.c math/lroundq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/tanhq.c math/expq.c math/modfq.c math/tanq.c math/fabsq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/nanq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/truncq.c math/floorq.c math/powq.c math/fmaq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/cacoshq.c math/cacosq.c math/casinhq.c math/casinq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/catanhq.c math/catanq.c math/cimagq.c math/conjq.c math/cprojq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/crealq.c math/fdimq.c math/fmaxq.c math/fminq.c math/ilogbq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/llrintq.c math/log2q.c math/lrintq.c math/nearbyintq.c math/remquoq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/ccoshq.c math/cexpq.c math/clog10q.c math/clogq.c math/csinq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/csinhq.c math/csqrtq.c math/ctanq.c math/ctanhq.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/addmul_1.c printf/add_n.c printf/cmp.c printf/divrem.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/flt1282mpn.c printf/fpioconst.c printf/lshift.c printf/mul_1.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/mul_n.c printf/mul.c printf/printf_fphex.c printf/printf_fp.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/quadmath-printf.c printf/rshift.c printf/submul_1.c printf/sub_n.c \
-@BUILD_LIBQUADMATH_TRUE@  strtod/strtoflt128.c strtod/mpn2flt128.c strtod/tens_in_limb.c
-
+@BUILD_LIBQUADMATH_TRUE@libquadmath_la_SOURCES = math/x2y2m1q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/isinf_nsq.c math/acoshq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fmodq.c math/acosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/frexpq.c math/rem_pio2q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/asinhq.c math/hypotq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/remainderq.c math/asinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/rintq.c math/atan2q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/isinfq.c math/roundq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/atanhq.c math/isnanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/scalblnq.c math/atanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/j0q.c math/scalbnq.c math/cbrtq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/j1q.c math/signbitq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ceilq.c math/jnq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sincos_table.c math/complex.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ldexpq.c math/sincosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/copysignq.c math/lgammaq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sincosq_kernel.c math/coshq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/llroundq.c math/sinhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cosq.c math/log10q.c math/sinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cosq_kernel.c math/log1pq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sinq_kernel.c math/erfq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/logq.c math/sqrtq.c math/expm1q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/lroundq.c math/tanhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/expq.c math/modfq.c math/tanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fabsq.c math/nanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/tgammaq.c math/finiteq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/nextafterq.c math/truncq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/floorq.c math/powq.c math/fmaq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cacoshq.c math/cacosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/casinhq.c math/casinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/catanhq.c math/catanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cimagq.c math/conjq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cprojq.c math/crealq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fdimq.c math/fmaxq.c math/fminq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ilogbq.c math/llrintq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/log2q.c math/lrintq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/nearbyintq.c math/remquoq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ccoshq.c math/cexpq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/clog10q.c math/clogq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/csinq.c math/csinhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/csqrtq.c math/ctanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ctanhq.c printf/addmul_1.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/add_n.c printf/cmp.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/divrem.c printf/flt1282mpn.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/fpioconst.c printf/lshift.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/mul_1.c printf/mul_n.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/mul.c printf/printf_fphex.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/printf_fp.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/quadmath-printf.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/rshift.c printf/submul_1.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/sub_n.c strtod/strtoflt128.c \
+@BUILD_LIBQUADMATH_TRUE@	strtod/mpn2flt128.c \
+@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.c $(am__append_1)
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
@@ -424,7 +481,7 @@ all: config.h
 
 .SUFFIXES:
 .SUFFIXES: .c .dvi .lo .o .obj .ps
-am--refresh:
+am--refresh: Makefile
 	@:
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
@@ -460,10 +517,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 
 config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
+	@if test ! -f $@; then rm -f stamp-h1; else :; fi
+	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
 	@rm -f stamp-h1
@@ -477,7 +532,6 @@ distclean-hdr:
 	-rm -f config.h stamp-h1
 install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
-	test -z "$(toolexeclibdir)" || $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)"
 	@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
 	list2=; for p in $$list; do \
 	  if test -f $$p; then \
@@ -485,6 +539,8 @@ install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
 	  else :; fi; \
 	done; \
 	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
 	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \
 	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \
 	}
@@ -655,7 +711,9 @@ strtod/mpn2flt128.lo: strtod/$(am__dirstamp) \
 	strtod/$(DEPDIR)/$(am__dirstamp)
 strtod/tens_in_limb.lo: strtod/$(am__dirstamp) \
 	strtod/$(DEPDIR)/$(am__dirstamp)
-libquadmath.la: $(libquadmath_la_OBJECTS) $(libquadmath_la_DEPENDENCIES) 
+math/feraiseexcept.lo: math/$(am__dirstamp) \
+	math/$(DEPDIR)/$(am__dirstamp)
+libquadmath.la: $(libquadmath_la_OBJECTS) $(libquadmath_la_DEPENDENCIES) $(EXTRA_libquadmath_la_DEPENDENCIES) 
 	$(libquadmath_la_LINK) $(am_libquadmath_la_rpath) $(libquadmath_la_OBJECTS) $(libquadmath_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
@@ -736,6 +794,8 @@ mostlyclean-compile:
 	-rm -f math/fabsq.lo
 	-rm -f math/fdimq.$(OBJEXT)
 	-rm -f math/fdimq.lo
+	-rm -f math/feraiseexcept.$(OBJEXT)
+	-rm -f math/feraiseexcept.lo
 	-rm -f math/finiteq.$(OBJEXT)
 	-rm -f math/finiteq.lo
 	-rm -f math/floorq.$(OBJEXT)
@@ -916,6 +976,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/expq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fabsq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fdimq.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/feraiseexcept.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/finiteq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/floorq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fmaq.Plo@am__quote@
@@ -1086,9 +1147,7 @@ uninstall-html-am:
 
 uninstall-info-am:
 	@$(PRE_UNINSTALL)
-	@if test -d '$(DESTDIR)$(infodir)' && \
-	    (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+	@if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
 	  list='$(INFO_DEPS)'; \
 	  for file in $$list; do \
 	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
@@ -1163,8 +1222,11 @@ maintainer-clean-aminfo:
 	done
 install-nodist_libsubincludeHEADERS: $(nodist_libsubinclude_HEADERS)
 	@$(NORMAL_INSTALL)
-	test -z "$(libsubincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libsubincludedir)"
 	@list='$(nodist_libsubinclude_HEADERS)'; test -n "$(libsubincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libsubincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libsubincludedir)" || exit 1; \
+	fi; \
 	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  echo "$$d$$p"; \
@@ -1178,9 +1240,7 @@ uninstall-nodist_libsubincludeHEADERS:
 	@$(NORMAL_UNINSTALL)
 	@list='$(nodist_libsubinclude_HEADERS)'; test -n "$(libsubincludedir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(libsubincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(libsubincludedir)" && rm -f $$files
+	dir='$(DESTDIR)$(libsubincludedir)'; $(am__uninstall_files_from_dir)
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -1252,10 +1312,15 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
 mostlyclean-generic:
 
 clean-generic:
@@ -1305,8 +1370,11 @@ install-dvi: install-dvi-am
 
 install-dvi-am: $(DVIS)
 	@$(NORMAL_INSTALL)
-	test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
 	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
+	fi; \
 	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  echo "$$d$$p"; \
@@ -1321,18 +1389,22 @@ install-html: install-html-am
 
 install-html-am: $(HTMLS)
 	@$(NORMAL_INSTALL)
-	test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
 	@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+	fi; \
 	for p in $$list; do \
 	  if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  $(am__strip_dir) \
-	  if test -d "$$d$$p"; then \
+	  d2=$$d$$p; \
+	  if test -d "$$d2"; then \
 	    echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
 	    $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
-	    echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
-	    $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+	    echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+	    $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
 	  else \
-	    list2="$$list2 $$d$$p"; \
+	    list2="$$list2 $$d2"; \
 	  fi; \
 	done; \
 	test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
@@ -1344,9 +1416,12 @@ install-info: install-info-am
 
 install-info-am: $(INFO_DEPS)
 	@$(NORMAL_INSTALL)
-	test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
+	fi; \
 	for file in $$list; do \
 	  case $$file in \
 	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
@@ -1364,8 +1439,7 @@ install-info-am: $(INFO_DEPS)
 	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
 	  $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
 	@$(POST_INSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+	@if $(am__can_run_installinfo); then \
 	  list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
 	  for file in $$list; do \
 	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
@@ -1379,8 +1453,11 @@ install-pdf: install-pdf-am
 
 install-pdf-am: $(PDFS)
 	@$(NORMAL_INSTALL)
-	test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
 	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
 	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  echo "$$d$$p"; \
@@ -1392,8 +1469,11 @@ install-ps: install-ps-am
 
 install-ps-am: $(PSS)
 	@$(NORMAL_INSTALL)
-	test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
 	@list='$(PSS)'; test -n "$(psdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
+	fi; \
 	for p in $$list; do \
 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 	  echo "$$d$$p"; \
diff --git a/libquadmath/aclocal.m4 b/libquadmath/aclocal.m4
index 6116764..b9ebb8a 100644
--- a/libquadmath/aclocal.m4
+++ b/libquadmath/aclocal.m4
@@ -1,7 +1,8 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -19,12 +20,15 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 1
+
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
@@ -34,7 +38,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.11.6], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -50,19 +54,21 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 1
+
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
 # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
 # `$srcdir', `$srcdir/..', or `$srcdir/../..'.
@@ -144,14 +150,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 10
+# serial 12
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -191,6 +197,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # instance it was reported that on HP-UX the gcc test will end up
   # making a dummy file named `D' -- because `-MD' means `put the output
   # in D'.
+  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -255,7 +262,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
 	break
       fi
       ;;
-    msvisualcpp | msvcmsys)
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
       # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
@@ -320,10 +327,13 @@ AC_DEFUN([AM_DEP_TRACK],
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
+  am__nodep='_no'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
 AC_SUBST([AMDEPBACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
@@ -545,12 +555,15 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 1
+
 # AM_PROG_INSTALL_SH
 # ------------------
 # Define $install_sh.
@@ -569,8 +582,8 @@ AC_SUBST(install_sh)])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -590,7 +603,7 @@ AC_DEFUN([AM_MAINTAINER_MODE],
        [disable], [m4_define([am_maintainer_other], [enable])],
        [m4_define([am_maintainer_other], [enable])
         m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
   dnl maintainer-mode's default is 'disable' unless 'enable' is passed
   AC_ARG_ENABLE([maintainer-mode],
 [  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
@@ -736,12 +749,15 @@ else
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 1
+
 # AM_PROG_MKDIR_P
 # ---------------
 # Check for `mkdir -p'.
@@ -764,13 +780,14 @@ esac
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
+# serial 5
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -778,13 +795,13 @@ AC_DEFUN([_AM_MANGLE_OPTION],
 [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
 
 # _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
 [m4_define(_AM_MANGLE_OPTION([$1]), 1)])
 
 # _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
 [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -860,12 +877,14 @@ Check your system clock])
 fi
 AC_MSG_RESULT(yes)])
 
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
+# serial 1
+
 # AM_PROG_INSTALL_STRIP
 # ---------------------
 # One issue with vendor `install' (even GNU) is that you can't
@@ -888,13 +907,13 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
+# serial 3
 
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
@@ -903,13 +922,13 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
 AC_DEFUN([_AM_SUBST_NOTMAKE])
 
 # AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
 # Public sister of _AM_SUBST_NOTMAKE.
 AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -931,10 +950,11 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 # a tarball read from stdin.
 #     $(am__untar) < result.tar
 AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
 m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
      [m4_case([$1], [ustar],, [pax],,
               [m4_fatal([Unknown tar format])])
 AC_MSG_CHECKING([how to create a $1 tar archive])
diff --git a/libquadmath/config.h.in b/libquadmath/config.h.in
index 9d18cc3..2ec0e1f 100644
--- a/libquadmath/config.h.in
+++ b/libquadmath/config.h.in
@@ -118,6 +118,9 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Optional replacement for compile-time broken feraiseexcept. */
+#undef QUADMATH_FERAISEEXCEPT
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
diff --git a/libquadmath/configure b/libquadmath/configure
index 0ea6e07..907daaf 100755
--- a/libquadmath/configure
+++ b/libquadmath/configure
@@ -611,6 +611,8 @@ LIBQUAD_USE_SYMVER_GNU_FALSE
 LIBQUAD_USE_SYMVER_GNU_TRUE
 LIBQUAD_USE_SYMVER_FALSE
 LIBQUAD_USE_SYMVER_TRUE
+LIBQUAD_FERAISEEXCEPT_FALSE
+LIBQUAD_FERAISEEXCEPT_TRUE
 toolexeclibdir
 toolexecdir
 multi_basedir
@@ -10521,7 +10523,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10524 "configure"
+#line 10526 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10627,7 +10629,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10630 "configure"
+#line 10632 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12351,6 +12353,54 @@ $as_echo "#define HAVE_FETESTEXCEPT 1" >>confdefs.h
   fi
 fi
 
+if test "x$ac_cv_header_fenv_h" = "xyes"; then
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether feraiseexcept is broken in fenv.h" >&5
+$as_echo_n "checking whether feraiseexcept is broken in fenv.h... " >&6; }
+if test "${quadmath_cv_feraiseexcept_fenv_broken+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fenv.h>
+int
+main ()
+{
+feraiseexcept (FE_INVALID);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  quadmath_cv_feraiseexcept_fenv_broken=no
+else
+  quadmath_cv_feraiseexcept_fenv_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $quadmath_cv_feraiseexcept_fenv_broken" >&5
+$as_echo "$quadmath_cv_feraiseexcept_fenv_broken" >&6; }
+  if test "x$quadmath_cv_feraiseexcept_fenv_broken" = "xyes"; then
+    feraiseexcept=__quadmath_feraiseexcept
+  else
+    feraiseexcept=feraiseexcept
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define QUADMATH_FERAISEEXCEPT $feraiseexcept
+_ACEOF
+
+fi
+ if test "x$ac_cv_header_fenv_h$quadmath_cv_feraiseexcept_fenv_broken" = "xyesyes"; then
+  LIBQUAD_FERAISEEXCEPT_TRUE=
+  LIBQUAD_FERAISEEXCEPT_FALSE='#'
+else
+  LIBQUAD_FERAISEEXCEPT_TRUE='#'
+  LIBQUAD_FERAISEEXCEPT_FALSE=
+fi
+
+
 # Check for hidden visibility (copied from libssp).
 saved_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -Werror"
@@ -13035,6 +13085,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${LIBQUAD_FERAISEEXCEPT_TRUE}" && test -z "${LIBQUAD_FERAISEEXCEPT_FALSE}"; then
+  as_fn_error "conditional \"LIBQUAD_FERAISEEXCEPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${LIBQUAD_USE_SYMVER_TRUE}" && test -z "${LIBQUAD_USE_SYMVER_FALSE}"; then
   as_fn_error "conditional \"LIBQUAD_USE_SYMVER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5

[-- Attachment #3: Type: text/plain, Size: 258 bytes --]



-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fix libquadmath build regression
  2012-12-21  5:17 fix libquadmath build regression Alexandre Oliva
@ 2012-12-21 10:32 ` Tobias Burnus
  2012-12-30  0:17   ` Alexandre Oliva
  2012-12-24 14:57 ` Paolo Bonzini
  1 sibling, 1 reply; 9+ messages in thread
From: Tobias Burnus @ 2012-12-21 10:32 UTC (permalink / raw)
  To: Alexandre Oliva; +Cc: gcc patches

Alexandre Oliva wrote:
> Revision 193063 brought in calls to fraiseexcept() into libquadmath,
> which caused a build regression on Fedora 16 (BLAG 160k actually) x86_64
> while building an i686-linux-gnu native toolchain.
>
> The problem is that glibc has an extern inline definition of
> fraiseexcept that is introduced by including fenv.h (it's in
> bits/fenv.h), and this definition requires SSE support regardless of
> target arch of word width, so it doesn't work for an i686 native that
> doesn't assume SSE registers and instructions are available.
>
> This bug is fixed in newer versions of glibc, but I figured it wouldn't
> hurt to have a work-around in place for libquadmath to build, detecting
> that the extern inline in the header is broken and introducing a wrapper
> that bypasses the header so as to use the out-of-line definition in the
> math library.
>
> Is this ok to install?

> +  AC_CACHE_CHECK([whether feraiseexcept is broken in fenv.h],
> [quadmath_cv_feraiseexcept_fenv_broken],
> [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <fenv.h>]],
> [feraiseexcept (FE_INVALID);])],
> [quadmath_cv_feraiseexcept_fenv_broken=no],
> [quadmath_cv_feraiseexcept_fenv_broken=yes])])

The line is too long; there is no reason that it is longer than 80 
characters.

> -# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
> +# generated automatically by aclocal 1.11.6 -*- Autoconf -*-

I think you should use automake 1.11.1; at least that's what is stated 
in http://gcc.gnu.org/install/prerequisites.html

(Side note: I wouldn't mind if GCC would update to a newer  required 
autoconf/automake version.)


> +/* Optional replacement for compile-time broken feraiseexcept. */
> +#undef QUADMATH_FERAISEEXCEPT

That comment doesn't reflect the use (cf. below). Shouldn't that be 
something like "Function to call for raising an exception; allows for 
replacing a compile-time broken feraiseexcept."?

> -#ifdef USE_FENV_H
> -		feraiseexcept (FE_INVALID);
> +#ifdef QUADMATH_FERAISEEXCEPT
> +		QUADMATH_FERAISEEXCEPT (FE_INVALID);
>   #endif



> +/* Wrapper for feraiseexcept.  This file is in the public domain.
> +   Contributed by Alexandre Oliva<aoliva@redhat.com>
> +   See QUADMATH_FERAISEEXCEPT in configure.ac for more information.  */
> +
> +int
> +__quadmath_feraiseexcept (int xcpt)
> +{
> +  feraiseexcept (xcpt);
> +}

I personally would like to see a tiny bit longer comment, additionally 
explaining quickly the purpose. For instance:  "Avoid calling an inline 
function." or something like that. Additionally, GCC warns by default 
that you do not return an int and that feraiseexcept is implicitly 
declared. Can you fix both?

Otherwise, it looks okay to me.

Tobias

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fix libquadmath build regression
  2012-12-21  5:17 fix libquadmath build regression Alexandre Oliva
  2012-12-21 10:32 ` Tobias Burnus
@ 2012-12-24 14:57 ` Paolo Bonzini
  2012-12-30  0:13   ` Alexandre Oliva
  1 sibling, 1 reply; 9+ messages in thread
From: Paolo Bonzini @ 2012-12-24 14:57 UTC (permalink / raw)
  To: Alexandre Oliva; +Cc: gcc-patches, Tobias Burnus

Il 21/12/2012 06:17, Alexandre Oliva ha scritto:
> Revision 193063 brought in calls to fraiseexcept() into libquadmath,
> which caused a build regression on Fedora 16 (BLAG 160k actually) x86_64
> while building an i686-linux-gnu native toolchain.
> 
> The problem is that glibc has an extern inline definition of
> fraiseexcept that is introduced by including fenv.h (it's in
> bits/fenv.h), and this definition requires SSE support regardless of
> target arch of word width, so it doesn't work for an i686 native that
> doesn't assume SSE registers and instructions are available.
> 
> This bug is fixed in newer versions of glibc, but I figured it wouldn't
> hurt to have a work-around in place for libquadmath to build, detecting
> that the extern inline in the header is broken and introducing a wrapper
> that bypasses the header so as to use the out-of-line definition in the
> math library.
> 
> Is this ok to install?

Would it be possible to fix it in fixincludes instead?

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fix libquadmath build regression
  2012-12-24 14:57 ` Paolo Bonzini
@ 2012-12-30  0:13   ` Alexandre Oliva
  2012-12-30  9:42     ` Paolo Bonzini
  0 siblings, 1 reply; 9+ messages in thread
From: Alexandre Oliva @ 2012-12-30  0:13 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: gcc-patches, Tobias Burnus

[-- Attachment #1: Type: text/plain, Size: 881 bytes --]

On Dec 24, 2012, Paolo Bonzini <bonzini@gnu.org> wrote:

> Il 21/12/2012 06:17, Alexandre Oliva ha scritto:
>> The problem is that glibc has an extern inline definition of
>> fraiseexcept that is introduced by including fenv.h (it's in
>> bits/fenv.h), and this definition requires SSE support regardless of
>> target arch of word width, so it doesn't work for an i686 native that
>> doesn't assume SSE registers and instructions are available.
>> 
>> This bug is fixed in newer versions of glibc, but I figured it wouldn't
>> hurt to have a work-around in place for libquadmath to build

> Would it be possible to fix it in fixincludes instead?

Heh, who'd have thought of using fixincludes to fix broken include
files? :-)  (hint: not me :-)  *blush*

Thanks for the suggestion, this patch fixes the problem.  Regstrapped on
x86_64-linux-gnu and i686-linux-gnu.  Ok to install?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: fixinc-fenv-broken-feraiseexcept.patch --]
[-- Type: text/x-diff, Size: 8832 bytes --]

Fix mandatory SSE in 2.1[56]ish glibc's feraiseexcept

From: Alexandre Oliva <aoliva@redhat.com>

for fixincludes/ChangeLog

	* inclhack.def (feraiseexcept_nosse_invalid): New.
	(feraiseexcept_nosse_divbyzero): Likewise.
	* fixincl.x: Rebuilt.
	* tests/base/bits/fenv.h: New.
---

 fixincludes/fixincl.x              |  130 ++++++++++++++++++++++++++++++++++--
 fixincludes/inclhack.def           |   39 +++++++++++
 fixincludes/tests/base/bits/fenv.h |   29 ++++++++
 3 files changed, 190 insertions(+), 8 deletions(-)
 create mode 100644 fixincludes/tests/base/bits/fenv.h


diff --git a/fixincludes/fixincl.x b/fixincludes/fixincl.x
index 4115772..29fc52a 100644
--- a/fixincludes/fixincl.x
+++ b/fixincludes/fixincl.x
@@ -2,11 +2,11 @@
  * 
  * DO NOT EDIT THIS FILE   (fixincl.x)
  * 
- * It has been AutoGen-ed  October 28, 2012 at 02:53:25 PM by AutoGen 5.17.0pre5
+ * It has been AutoGen-ed  Saturday December 29, 2012 at 09:17:09 AM BRST
  * From the definitions    inclhack.def
  * and the template file   fixincl
  */
-/* DO NOT SVN-MERGE THIS FILE, EITHER Sun Oct 28 14:53:25 PDT 2012
+/* DO NOT SVN-MERGE THIS FILE, EITHER Sat Dec 29 09:17:10 BRST 2012
  *
  * You must regenerate it.  Use the ./genfixes script.
  *
@@ -15,7 +15,7 @@
  * certain ANSI-incompatible system header files which are fixed to work
  * correctly with ANSI C and placed in a directory that GNU C will search.
  *
- * This file contains 224 fixup descriptions.
+ * This file contains 226 fixup descriptions.
  *
  * See README for more information.
  *
@@ -9158,14 +9158,116 @@ static const char* apzX11_SprintfPatch[] = {
 #endif /* !defined __STDC__ */",
     (char*)NULL };
 
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ *  Description of Feraiseexcept_Nosse_Invalid fix
+ */
+tSCC zFeraiseexcept_Nosse_InvalidName[] =
+     "feraiseexcept_nosse_invalid";
+
+/*
+ *  File name selection pattern
+ */
+tSCC zFeraiseexcept_Nosse_InvalidList[] =
+  "bits/fenv.h\0";
+/*
+ *  Machine/OS name selection pattern
+ */
+tSCC* apzFeraiseexcept_Nosse_InvalidMachs[] = {
+        "i[34567]86-*-linux*",
+        "x86*-linux*",
+        "amd64-*-linux*",
+        (const char*)NULL };
+
+/*
+ *  content selection pattern - do fix if pattern found
+ */
+tSCC zFeraiseexcept_Nosse_InvalidSelect0[] =
+       "^([\t ]*)__asm__ __volatile__ \\(\"divss %0, %0 *\" : : \"x\" \\(__f\\)\\);$";
+
+/*
+ *  content bypass pattern - skip fix if pattern found
+ */
+tSCC zFeraiseexcept_Nosse_InvalidBypass0[] =
+       "\"fdiv .*; fwait\"";
+
+#define    FERAISEEXCEPT_NOSSE_INVALID_TEST_CT  2
+static tTestDesc aFeraiseexcept_Nosse_InvalidTests[] = {
+  { TT_NEGREP,   zFeraiseexcept_Nosse_InvalidBypass0, (regex_t*)NULL },
+  { TT_EGREP,    zFeraiseexcept_Nosse_InvalidSelect0, (regex_t*)NULL }, };
+
+/*
+ *  Fix Command Arguments for Feraiseexcept_Nosse_Invalid
+ */
+static const char* apzFeraiseexcept_Nosse_InvalidPatch[] = {
+    "format",
+    "# ifdef __SSE_MATH__\n\
+%0\n\
+# else\n\
+%1__asm__ __volatile__ (\"fdiv %%%%st, %%%%st(0); fwait\"\n\
+%1\t\t\t: \"=t\" (__f) : \"0\" (__f));\n\
+# endif",
+    (char*)NULL };
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ *  Description of Feraiseexcept_Nosse_Divbyzero fix
+ */
+tSCC zFeraiseexcept_Nosse_DivbyzeroName[] =
+     "feraiseexcept_nosse_divbyzero";
+
+/*
+ *  File name selection pattern
+ */
+tSCC zFeraiseexcept_Nosse_DivbyzeroList[] =
+  "bits/fenv.h\0";
+/*
+ *  Machine/OS name selection pattern
+ */
+tSCC* apzFeraiseexcept_Nosse_DivbyzeroMachs[] = {
+        "i[34567]86-*-linux*",
+        "x86*-linux*",
+        "amd64-*-linux*",
+        (const char*)NULL };
+
+/*
+ *  content selection pattern - do fix if pattern found
+ */
+tSCC zFeraiseexcept_Nosse_DivbyzeroSelect0[] =
+       "^([\t ]*)__asm__ __volatile__ \\(\"divss %1, %0 *\" : : \"x\" \\(__f\\), \"x\" \\(__g\\)\\);$";
+
+/*
+ *  content bypass pattern - skip fix if pattern found
+ */
+tSCC zFeraiseexcept_Nosse_DivbyzeroBypass0[] =
+       "\"fdivp .*; fwait\"";
+
+#define    FERAISEEXCEPT_NOSSE_DIVBYZERO_TEST_CT  2
+static tTestDesc aFeraiseexcept_Nosse_DivbyzeroTests[] = {
+  { TT_NEGREP,   zFeraiseexcept_Nosse_DivbyzeroBypass0, (regex_t*)NULL },
+  { TT_EGREP,    zFeraiseexcept_Nosse_DivbyzeroSelect0, (regex_t*)NULL }, };
+
+/*
+ *  Fix Command Arguments for Feraiseexcept_Nosse_Divbyzero
+ */
+static const char* apzFeraiseexcept_Nosse_DivbyzeroPatch[] = {
+    "format",
+    "# ifdef __SSE_MATH__\n\
+%0\n\
+# else\n\
+%1__asm__ __volatile__ (\"fdivp %%%%st, %%%%st(1); fwait\"\n\
+%1\t\t\t: \"=t\" (__f) : \"0\" (__f), \"u\" (__g) : \"st(1)\");\n\
+# endif",
+    (char*)NULL };
+
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  *  List of all fixes
  */
-#define REGEX_COUNT          260
-#define MACH_LIST_SIZE_LIMIT 181
-#define FIX_COUNT            224
+#define REGEX_COUNT          264
+#define MACH_LIST_SIZE_LIMIT 187
+#define FIX_COUNT            226
 
 /*
  *  Enumerate the fixes
@@ -9394,7 +9496,9 @@ typedef enum {
     X11_CLASS_FIXIDX,
     X11_CLASS_USAGE_FIXIDX,
     X11_NEW_FIXIDX,
-    X11_SPRINTF_FIXIDX
+    X11_SPRINTF_FIXIDX,
+    FERAISEEXCEPT_NOSSE_INVALID_FIXIDX,
+    FERAISEEXCEPT_NOSSE_DIVBYZERO_FIXIDX
 } t_fixinc_idx;
 
 tFixDesc fixDescList[ FIX_COUNT ] = {
@@ -10516,5 +10620,15 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
   {  zX11_SprintfName,    zX11_SprintfList,
      apzX11_SprintfMachs,
      X11_SPRINTF_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
-     aX11_SprintfTests,   apzX11_SprintfPatch, 0 }
+     aX11_SprintfTests,   apzX11_SprintfPatch, 0 },
+
+  {  zFeraiseexcept_Nosse_InvalidName,    zFeraiseexcept_Nosse_InvalidList,
+     apzFeraiseexcept_Nosse_InvalidMachs,
+     FERAISEEXCEPT_NOSSE_INVALID_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+     aFeraiseexcept_Nosse_InvalidTests,   apzFeraiseexcept_Nosse_InvalidPatch, 0 },
+
+  {  zFeraiseexcept_Nosse_DivbyzeroName,    zFeraiseexcept_Nosse_DivbyzeroList,
+     apzFeraiseexcept_Nosse_DivbyzeroMachs,
+     FERAISEEXCEPT_NOSSE_DIVBYZERO_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+     aFeraiseexcept_Nosse_DivbyzeroTests,   apzFeraiseexcept_Nosse_DivbyzeroPatch, 0 }
 };
diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
index 09eac7c6..b06e370 100644
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -4815,4 +4815,43 @@ fix = {
     test_text = "extern char *\tsprintf();";
 };
 
+/*
+ *  Incorrect feraiseexcept extern inline in bits/fenv.h on x86_64
+ *  that fails when compiling for SSE-less 32-bit x86.
+ */
+fix = {
+    hackname = feraiseexcept_nosse_invalid;
+    mach     = 'i[34567]86-*-linux*', 'x86*-linux*', 'amd64-*-linux*';
+    files    = bits/fenv.h;
+    select   = "^([\t ]*)__asm__ __volatile__ \\(\"divss %0, %0 *\" : "
+    ": \"x\" \\(__f\\)\\);$";
+    bypass   = "\"fdiv .*; fwait\"";
+    
+    c_fix     = format;
+    c_fix_arg = "# ifdef __SSE_MATH__\n%0\n"
+    "# else\n%1__asm__ __volatile__ (\"fdiv %%%%st, %%%%st(0); fwait\"\n"
+    "%1\t\t\t: \"=t\" (__f) : \"0\" (__f));\n"
+    "# endif";
+
+    test_text = "\t __asm__ __volatile__ (\"divss %0, %0\" : "
+    ": \"x\" (__f));";
+};
+fix = {
+    hackname = feraiseexcept_nosse_divbyzero;
+    mach     = 'i[34567]86-*-linux*', 'x86*-linux*', 'amd64-*-linux*';
+    files    = bits/fenv.h;
+    select   = "^([\t ]*)__asm__ __volatile__ \\(\"divss %1, %0 *\" : "
+    ": \"x\" \\(__f\\), \"x\" \\(__g\\)\\);$";
+    bypass   = "\"fdivp .*; fwait\"";
+    
+    c_fix     = format;
+    c_fix_arg = "# ifdef __SSE_MATH__\n%0\n"
+    "# else\n%1__asm__ __volatile__ (\"fdivp %%%%st, %%%%st(1); fwait\"\n"
+    "%1\t\t\t: \"=t\" (__f) : \"0\" (__f), \"u\" (__g) : \"st(1)\");\n"
+    "# endif";
+
+    test_text = "\t __asm__ __volatile__ (\"divss %1, %0\" : "
+    ": \"x\" (__f), \"x\" (__g));";
+};
+
 /*EOF*/
diff --git a/fixincludes/tests/base/bits/fenv.h b/fixincludes/tests/base/bits/fenv.h
new file mode 100644
index 0000000..4b8b71a
--- /dev/null
+++ b/fixincludes/tests/base/bits/fenv.h
@@ -0,0 +1,29 @@
+/*  DO NOT EDIT THIS FILE.
+
+    It has been auto-edited by fixincludes from:
+
+	"fixinc/tests/inc/bits/fenv.h"
+
+    This had to be done to correct non-standard usages in the
+    original, manufacturer supplied header file.  */
+
+
+
+#if defined( FERAISEEXCEPT_NOSSE_INVALID_CHECK )
+# ifdef __SSE_MATH__
+	 __asm__ __volatile__ ("divss %0, %0" : : "x" (__f));
+# else
+	 __asm__ __volatile__ ("fdiv %%st, %%st(0); fwait"
+	 			: "=t" (__f) : "0" (__f));
+# endif
+#endif  /* FERAISEEXCEPT_NOSSE_INVALID_CHECK */
+
+
+#if defined( FERAISEEXCEPT_NOSSE_DIVBYZERO_CHECK )
+# ifdef __SSE_MATH__
+	 __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
+# else
+	 __asm__ __volatile__ ("fdivp %%st, %%st(1); fwait"
+	 			: "=t" (__f) : "0" (__f), "u" (__g) : "st(1)");
+# endif
+#endif  /* FERAISEEXCEPT_NOSSE_DIVBYZERO_CHECK */

[-- Attachment #3: Type: text/plain, Size: 258 bytes --]



-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fix libquadmath build regression
  2012-12-21 10:32 ` Tobias Burnus
@ 2012-12-30  0:17   ` Alexandre Oliva
  0 siblings, 0 replies; 9+ messages in thread
From: Alexandre Oliva @ 2012-12-30  0:17 UTC (permalink / raw)
  To: Tobias Burnus; +Cc: gcc patches

[-- Attachment #1: Type: text/plain, Size: 476 bytes --]

On Dec 21, 2012, Tobias Burnus <burnus@net-b.de> wrote:

> Otherwise, it looks okay to me.

Thanks, I'd fixed all the problems you caught in the review, but then
Paolo's suggestion to use fixincludes came in and I sat on it for a
while.  I'm now leaning towards fixincludes, but I figured I'd post the
latest version of the patch for libquadmath just in case the library
maintainers wish to have an internal fix for this particular bug.  What
do you say, should I put it in?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: quadmath-fenv-broken-feraiseexcept.patch --]
[-- Type: text/x-diff, Size: 23214 bytes --]

Deal with SSE-requiring extern inline in bits/fenv.h

From: Alexandre Oliva <aoliva@redhat.com>

for  libquadmath/ChangeLog

	* configure.ac: Check that calling feraiseexcept compiles when
	fenv.h is included.  Define QUADMATH_FERAISEEXCEPT cpp macro
	and LIBQUAD_FERAISEEXCEPT conditional otherwise.
	* Makefile.am (libquadmath_la_SOURCES): Add
	math/feraiseexcept.c, conditional on LIBQUAD_FERAISEEXCEPT.
	* aclocal.m4: Rebuilt.
	* configure: Rebuilt.
	* config.h.in: Rebuilt.
	* Makefile.in: Rebuilt.
	* math/feraiseexcept.c: New file.
	* math/quadmath-imp.h (__quadmath_feraiseexcept): Declare.
	* math/ccoshq.c: Use QUADMATH_FERAISEEXCEPT macro to call, and
	to decide whether to call, feraiseexcept.
	* math/cexpq.c: Likewise.
	* math/csinhq.c: Likewise.
	* math/csinq.c: Likewise.
	* math/ctanhq.c: Likewise.
	* math/ctanq.c: Likewise.
	* math/ilogbq.c: Likewise.  Include fenv.h if HAVE_FENV_H.
---

 libquadmath/Makefile.am          |    3 +
 libquadmath/Makefile.in          |   90 ++++++++++++++++++++++++++------------
 libquadmath/config.h.in          |    3 +
 libquadmath/configure            |   59 ++++++++++++++++++++++++-
 libquadmath/configure.ac         |   28 ++++++++++++
 libquadmath/math/ccoshq.c        |    8 ++-
 libquadmath/math/cexpq.c         |   12 +++--
 libquadmath/math/csinhq.c        |   12 +++--
 libquadmath/math/csinq.c         |   12 +++--
 libquadmath/math/ctanhq.c        |    4 +-
 libquadmath/math/ctanq.c         |    4 +-
 libquadmath/math/feraiseexcept.c |   12 +++++
 libquadmath/math/ilogbq.c        |   16 ++++---
 libquadmath/quadmath-imp.h       |    5 +-
 14 files changed, 204 insertions(+), 64 deletions(-)
 create mode 100644 libquadmath/math/feraiseexcept.c


diff --git a/libquadmath/Makefile.am b/libquadmath/Makefile.am
index 6c97ee8..9acf619 100644
--- a/libquadmath/Makefile.am
+++ b/libquadmath/Makefile.am
@@ -69,6 +69,9 @@ libquadmath_la_SOURCES = \
   printf/quadmath-printf.c printf/rshift.c printf/submul_1.c printf/sub_n.c \
   strtod/strtoflt128.c strtod/mpn2flt128.c strtod/tens_in_limb.c
 
+if LIBQUAD_FERAISEEXCEPT
+libquadmath_la_SOURCES += math/feraiseexcept.c
+endif
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
diff --git a/libquadmath/Makefile.in b/libquadmath/Makefile.in
index 92c5d25..395e236 100644
--- a/libquadmath/Makefile.in
+++ b/libquadmath/Makefile.in
@@ -37,6 +37,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 @BUILD_LIBQUADMATH_FALSE@libquadmath_la_DEPENDENCIES =
+@BUILD_LIBQUADMATH_TRUE@@LIBQUAD_FERAISEEXCEPT_TRUE@am__append_1 = math/feraiseexcept.c
 subdir = .
 DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
 	$(top_srcdir)/configure $(am__configure_deps) \
@@ -87,6 +88,7 @@ am__installdirs = "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" \
 	"$(DESTDIR)$(libsubincludedir)"
 LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
 am__dirstamp = $(am__leading_dot)dirstamp
+@BUILD_LIBQUADMATH_TRUE@@LIBQUAD_FERAISEEXCEPT_TRUE@am__objects_1 = math/feraiseexcept.lo
 @BUILD_LIBQUADMATH_TRUE@am_libquadmath_la_OBJECTS = math/x2y2m1q.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/isinf_nsq.lo math/acoshq.lo \
 @BUILD_LIBQUADMATH_TRUE@	math/fmodq.lo math/acosq.lo \
@@ -142,7 +144,8 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @BUILD_LIBQUADMATH_TRUE@	printf/rshift.lo printf/submul_1.lo \
 @BUILD_LIBQUADMATH_TRUE@	printf/sub_n.lo strtod/strtoflt128.lo \
 @BUILD_LIBQUADMATH_TRUE@	strtod/mpn2flt128.lo \
-@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.lo
+@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.lo \
+@BUILD_LIBQUADMATH_TRUE@	$(am__objects_1)
 libquadmath_la_OBJECTS = $(am_libquadmath_la_OBJECTS)
 libquadmath_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -325,33 +328,59 @@ AUTOMAKE_OPTIONS = 1.8 foreign
 @BUILD_LIBQUADMATH_TRUE@libquadmath_la_DEPENDENCIES = $(version_dep) $(libquadmath_la_LIBADD)
 @BUILD_LIBQUADMATH_TRUE@nodist_libsubinclude_HEADERS = quadmath.h quadmath_weak.h
 @BUILD_LIBQUADMATH_TRUE@libsubincludedir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
-@BUILD_LIBQUADMATH_TRUE@libquadmath_la_SOURCES = \
-@BUILD_LIBQUADMATH_TRUE@  math/x2y2m1q.c math/isinf_nsq.c math/acoshq.c math/fmodq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/acosq.c math/frexpq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/rem_pio2q.c math/asinhq.c math/hypotq.c math/remainderq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/asinq.c math/rintq.c math/atan2q.c math/isinfq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/roundq.c math/atanhq.c math/isnanq.c math/scalblnq.c math/atanq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/j0q.c math/scalbnq.c math/cbrtq.c math/j1q.c math/signbitq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/ceilq.c math/jnq.c math/sincos_table.c math/complex.c math/ldexpq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/sincosq.c math/copysignq.c math/lgammaq.c math/sincosq_kernel.c \
-@BUILD_LIBQUADMATH_TRUE@  math/coshq.c math/llroundq.c math/sinhq.c math/cosq.c math/log10q.c \
-@BUILD_LIBQUADMATH_TRUE@  math/sinq.c math/cosq_kernel.c math/log1pq.c math/sinq_kernel.c \
-@BUILD_LIBQUADMATH_TRUE@  math/erfq.c math/logq.c math/sqrtq.c math/expm1q.c math/lroundq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/tanhq.c math/expq.c math/modfq.c math/tanq.c math/fabsq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/nanq.c math/tgammaq.c math/finiteq.c math/nextafterq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/truncq.c math/floorq.c math/powq.c math/fmaq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/cacoshq.c math/cacosq.c math/casinhq.c math/casinq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/catanhq.c math/catanq.c math/cimagq.c math/conjq.c math/cprojq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/crealq.c math/fdimq.c math/fmaxq.c math/fminq.c math/ilogbq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/llrintq.c math/log2q.c math/lrintq.c math/nearbyintq.c math/remquoq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/ccoshq.c math/cexpq.c math/clog10q.c math/clogq.c math/csinq.c \
-@BUILD_LIBQUADMATH_TRUE@  math/csinhq.c math/csqrtq.c math/ctanq.c math/ctanhq.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/addmul_1.c printf/add_n.c printf/cmp.c printf/divrem.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/flt1282mpn.c printf/fpioconst.c printf/lshift.c printf/mul_1.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/mul_n.c printf/mul.c printf/printf_fphex.c printf/printf_fp.c \
-@BUILD_LIBQUADMATH_TRUE@  printf/quadmath-printf.c printf/rshift.c printf/submul_1.c printf/sub_n.c \
-@BUILD_LIBQUADMATH_TRUE@  strtod/strtoflt128.c strtod/mpn2flt128.c strtod/tens_in_limb.c
-
+@BUILD_LIBQUADMATH_TRUE@libquadmath_la_SOURCES = math/x2y2m1q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/isinf_nsq.c math/acoshq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fmodq.c math/acosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/frexpq.c math/rem_pio2q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/asinhq.c math/hypotq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/remainderq.c math/asinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/rintq.c math/atan2q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/isinfq.c math/roundq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/atanhq.c math/isnanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/scalblnq.c math/atanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/j0q.c math/scalbnq.c math/cbrtq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/j1q.c math/signbitq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ceilq.c math/jnq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sincos_table.c math/complex.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ldexpq.c math/sincosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/copysignq.c math/lgammaq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sincosq_kernel.c math/coshq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/llroundq.c math/sinhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cosq.c math/log10q.c math/sinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cosq_kernel.c math/log1pq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/sinq_kernel.c math/erfq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/logq.c math/sqrtq.c math/expm1q.c \
+@BUILD_LIBQUADMATH_TRUE@	math/lroundq.c math/tanhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/expq.c math/modfq.c math/tanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fabsq.c math/nanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/tgammaq.c math/finiteq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/nextafterq.c math/truncq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/floorq.c math/powq.c math/fmaq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cacoshq.c math/cacosq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/casinhq.c math/casinq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/catanhq.c math/catanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cimagq.c math/conjq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/cprojq.c math/crealq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/fdimq.c math/fmaxq.c math/fminq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ilogbq.c math/llrintq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/log2q.c math/lrintq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/nearbyintq.c math/remquoq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ccoshq.c math/cexpq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/clog10q.c math/clogq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/csinq.c math/csinhq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/csqrtq.c math/ctanq.c \
+@BUILD_LIBQUADMATH_TRUE@	math/ctanhq.c printf/addmul_1.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/add_n.c printf/cmp.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/divrem.c printf/flt1282mpn.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/fpioconst.c printf/lshift.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/mul_1.c printf/mul_n.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/mul.c printf/printf_fphex.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/printf_fp.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/quadmath-printf.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/rshift.c printf/submul_1.c \
+@BUILD_LIBQUADMATH_TRUE@	printf/sub_n.c strtod/strtoflt128.c \
+@BUILD_LIBQUADMATH_TRUE@	strtod/mpn2flt128.c \
+@BUILD_LIBQUADMATH_TRUE@	strtod/tens_in_limb.c $(am__append_1)
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
@@ -655,6 +684,8 @@ strtod/mpn2flt128.lo: strtod/$(am__dirstamp) \
 	strtod/$(DEPDIR)/$(am__dirstamp)
 strtod/tens_in_limb.lo: strtod/$(am__dirstamp) \
 	strtod/$(DEPDIR)/$(am__dirstamp)
+math/feraiseexcept.lo: math/$(am__dirstamp) \
+	math/$(DEPDIR)/$(am__dirstamp)
 libquadmath.la: $(libquadmath_la_OBJECTS) $(libquadmath_la_DEPENDENCIES) 
 	$(libquadmath_la_LINK) $(am_libquadmath_la_rpath) $(libquadmath_la_OBJECTS) $(libquadmath_la_LIBADD) $(LIBS)
 
@@ -736,6 +767,8 @@ mostlyclean-compile:
 	-rm -f math/fabsq.lo
 	-rm -f math/fdimq.$(OBJEXT)
 	-rm -f math/fdimq.lo
+	-rm -f math/feraiseexcept.$(OBJEXT)
+	-rm -f math/feraiseexcept.lo
 	-rm -f math/finiteq.$(OBJEXT)
 	-rm -f math/finiteq.lo
 	-rm -f math/floorq.$(OBJEXT)
@@ -916,6 +949,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/expq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fabsq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fdimq.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/feraiseexcept.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/finiteq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/floorq.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@math/$(DEPDIR)/fmaq.Plo@am__quote@
diff --git a/libquadmath/config.h.in b/libquadmath/config.h.in
index 9d18cc3..66ce693 100644
--- a/libquadmath/config.h.in
+++ b/libquadmath/config.h.in
@@ -118,6 +118,9 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Function to call to get the effects of feraiseexcept. */
+#undef QUADMATH_FERAISEEXCEPT
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
diff --git a/libquadmath/configure b/libquadmath/configure
index 0ea6e07..e8aa317 100755
--- a/libquadmath/configure
+++ b/libquadmath/configure
@@ -611,6 +611,8 @@ LIBQUAD_USE_SYMVER_GNU_FALSE
 LIBQUAD_USE_SYMVER_GNU_TRUE
 LIBQUAD_USE_SYMVER_FALSE
 LIBQUAD_USE_SYMVER_TRUE
+LIBQUAD_FERAISEEXCEPT_FALSE
+LIBQUAD_FERAISEEXCEPT_TRUE
 toolexeclibdir
 toolexecdir
 multi_basedir
@@ -10521,7 +10523,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10524 "configure"
+#line 10526 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10627,7 +10629,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10630 "configure"
+#line 10632 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12351,6 +12353,55 @@ $as_echo "#define HAVE_FETESTEXCEPT 1" >>confdefs.h
   fi
 fi
 
+if test "x$ac_cv_header_fenv_h" = "xyes"; then
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether feraiseexcept is broken in fenv.h" >&5
+$as_echo_n "checking whether feraiseexcept is broken in fenv.h... " >&6; }
+if test "${quadmath_cv_feraiseexcept_fenv_broken+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fenv.h>
+int
+main ()
+{
+feraiseexcept (FE_INVALID);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  quadmath_cv_feraiseexcept_fenv_broken=no
+else
+  quadmath_cv_feraiseexcept_fenv_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $quadmath_cv_feraiseexcept_fenv_broken" >&5
+$as_echo "$quadmath_cv_feraiseexcept_fenv_broken" >&6; }
+  if test "x$quadmath_cv_feraiseexcept_fenv_broken" = "xyes"; then
+    feraiseexcept=__quadmath_feraiseexcept
+  else
+    feraiseexcept=feraiseexcept
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define QUADMATH_FERAISEEXCEPT $feraiseexcept
+_ACEOF
+
+fi
+ if test "x$ac_cv_header_fenv_h$quadmath_cv_feraiseexcept_fenv_broken" \
+        = "xyesyes"; then
+  LIBQUAD_FERAISEEXCEPT_TRUE=
+  LIBQUAD_FERAISEEXCEPT_FALSE='#'
+else
+  LIBQUAD_FERAISEEXCEPT_TRUE='#'
+  LIBQUAD_FERAISEEXCEPT_FALSE=
+fi
+
+
 # Check for hidden visibility (copied from libssp).
 saved_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -Werror"
@@ -13035,6 +13086,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${LIBQUAD_FERAISEEXCEPT_TRUE}" && test -z "${LIBQUAD_FERAISEEXCEPT_FALSE}"; then
+  as_fn_error "conditional \"LIBQUAD_FERAISEEXCEPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${LIBQUAD_USE_SYMVER_TRUE}" && test -z "${LIBQUAD_USE_SYMVER_FALSE}"; then
   as_fn_error "conditional \"LIBQUAD_USE_SYMVER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/libquadmath/configure.ac b/libquadmath/configure.ac
index c547da8..7df8c37 100644
--- a/libquadmath/configure.ac
+++ b/libquadmath/configure.ac
@@ -150,6 +150,34 @@ else
   fi
 fi
 
+if test "x$ac_cv_header_fenv_h" = "xyes"; then
+  dnl Some versions of libc 2.16 for x86_64 have an extern inline
+  dnl definition of feraiseexcept in bits/fenv.h that requires SSE
+  dnl support, and they fail to compile with -m32 when targeting
+  dnl pre-x86_64 32-bit architectures.
+
+  dnl This wrapper enables us to bypass the inline definition and call
+  dnl the out-of-line feraiseexcept definition, because it does not
+  dnl include fenv.h itself.
+
+  AC_CACHE_CHECK([whether feraiseexcept is broken in fenv.h],
+    [quadmath_cv_feraiseexcept_fenv_broken],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <fenv.h>]],
+        [feraiseexcept (FE_INVALID);])],
+      [quadmath_cv_feraiseexcept_fenv_broken=no],
+      [quadmath_cv_feraiseexcept_fenv_broken=yes])])
+  if test "x$quadmath_cv_feraiseexcept_fenv_broken" = "xyes"; then
+    feraiseexcept=__quadmath_feraiseexcept
+  else
+    feraiseexcept=feraiseexcept
+  fi
+  AC_DEFINE_UNQUOTED([QUADMATH_FERAISEEXCEPT], [$feraiseexcept],
+    [Function to call to get the effects of feraiseexcept.])
+fi
+AM_CONDITIONAL([LIBQUAD_FERAISEEXCEPT],
+  [test "x$ac_cv_header_fenv_h$quadmath_cv_feraiseexcept_fenv_broken" \
+        = "xyesyes"])
+
 # Check for hidden visibility (copied from libssp).
 saved_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -Werror"
diff --git a/libquadmath/math/ccoshq.c b/libquadmath/math/ccoshq.c
index 8d55ad3..c1b24ac 100644
--- a/libquadmath/math/ccoshq.c
+++ b/libquadmath/math/ccoshq.c
@@ -89,9 +89,9 @@ ccoshq (__complex128 x)
 	  __imag__ retval = __real__ x == 0.0Q ? 0.0Q : nanq ("");
 	  __real__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
         }
     }
@@ -129,9 +129,9 @@ ccoshq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	 }
     }
diff --git a/libquadmath/math/cexpq.c b/libquadmath/math/cexpq.c
index bd4be1e..a7f42bf 100644
--- a/libquadmath/math/cexpq.c
+++ b/libquadmath/math/cexpq.c
@@ -83,8 +83,8 @@ cexpq (__complex128 x)
 	  __real__ retval = nanq ("");
 	  __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	  feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	  QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
@@ -125,9 +125,9 @@ cexpq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
       else
@@ -142,9 +142,9 @@ cexpq (__complex128 x)
       __real__ retval = nanq ("");
       __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
       if (rcls != QUADFP_NAN || icls != QUADFP_NAN)
-	feraiseexcept (FE_INVALID);
+	QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
     }
 
diff --git a/libquadmath/math/csinhq.c b/libquadmath/math/csinhq.c
index c16d576..5f1d8df 100644
--- a/libquadmath/math/csinhq.c
+++ b/libquadmath/math/csinhq.c
@@ -98,9 +98,9 @@ csinhq (__complex128 x)
 	      __real__ retval = copysignq (0.0Q, negate ? -1.0Q : 1.0Q);
 	      __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	      if (icls == QUADFP_INFINITE)
-		feraiseexcept (FE_INVALID);
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	  else
@@ -108,8 +108,8 @@ csinhq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	      feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	      QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	}
@@ -150,9 +150,9 @@ csinhq (__complex128 x)
 	  __real__ retval = HUGE_VALQ;
 	  __imag__ retval = nanq ("") + nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (icls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/csinq.c b/libquadmath/math/csinq.c
index c837e50..cd37013 100644
--- a/libquadmath/math/csinq.c
+++ b/libquadmath/math/csinq.c
@@ -98,9 +98,9 @@ csinq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = __imag__ x;
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	      if (rcls == QUADFP_INFINITE)
-		feraiseexcept (FE_INVALID);
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	  else
@@ -108,8 +108,8 @@ csinq (__complex128 x)
 	      __real__ retval = nanq ("");
 	      __imag__ retval = nanq ("");
 
-#ifdef HAVE_FENV_H
-	      feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	      QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	    }
 	}
@@ -152,9 +152,9 @@ csinq (__complex128 x)
 	  __real__ retval = nanq ("");
 	  __imag__ retval = HUGE_VALQ;
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (rcls == QUADFP_INFINITE)
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/ctanhq.c b/libquadmath/math/ctanhq.c
index 8934cfa..e954965 100644
--- a/libquadmath/math/ctanhq.c
+++ b/libquadmath/math/ctanhq.c
@@ -45,9 +45,9 @@ ctanhq (__complex128 x)
 	  __real__ res = nanq ("");
 	  __imag__ res = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (__quadmath_isinf_nsq (__imag__ x))
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/ctanq.c b/libquadmath/math/ctanq.c
index d390511..d3570be 100644
--- a/libquadmath/math/ctanq.c
+++ b/libquadmath/math/ctanq.c
@@ -45,9 +45,9 @@ ctanq (__complex128 x)
 	  __real__ res = nanq ("");
 	  __imag__ res = nanq ("");
 
-#ifdef HAVE_FENV_H
+#ifdef QUADMATH_FERAISEEXCEPT
 	  if (__quadmath_isinf_nsq (__real__ x))
-	    feraiseexcept (FE_INVALID);
+	    QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	}
     }
diff --git a/libquadmath/math/feraiseexcept.c b/libquadmath/math/feraiseexcept.c
new file mode 100644
index 0000000..b47ff5c
--- /dev/null
+++ b/libquadmath/math/feraiseexcept.c
@@ -0,0 +1,12 @@
+/* Wrapper for feraiseexcept.  This file is in the public domain.
+   Contributed by Alexandre Oliva <aoliva@redhat.com>
+   See QUADMATH_FERAISEEXCEPT in configure.ac for more information.  */
+
+/* Do NOT include fenv.h.  This is a wrapper for a broken extern
+   inline feraiseexcept defined there.  */
+int
+__quadmath_feraiseexcept (int xcpt)
+{
+  extern int feraiseexcept (int);
+  return feraiseexcept (xcpt);
+}
diff --git a/libquadmath/math/ilogbq.c b/libquadmath/math/ilogbq.c
index 7f95e9c..553df9e 100644
--- a/libquadmath/math/ilogbq.c
+++ b/libquadmath/math/ilogbq.c
@@ -29,6 +29,10 @@ static char rcsid[] = "$NetBSD: $";
 #include <errno.h>
 #include "quadmath-imp.h"
 
+#ifdef HAVE_FENV_H
+# include <fenv.h>
+#endif
+
 #ifndef FP_ILOGB0
 # define FP_ILOGB0 INT_MIN
 #endif
@@ -48,8 +52,8 @@ ilogbq (__float128 x)
 	    if((hx|lx)==0)
 	      {
 		errno = EDOM;
-#ifdef USE_FENV_H
-		feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 		return FP_ILOGB0;	/* ilogbl(0) = FP_ILOGB0 */
 	      }
@@ -67,16 +71,16 @@ ilogbq (__float128 x)
 	    if (((hx^0x7fff000000000000LL)|lx) == 0)
 	      {
 		errno = EDOM;
-#ifdef USE_FENV_H
-		feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+		QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 		return INT_MAX;
 	      }
 	}
 
 	errno = EDOM;
-#ifdef USE_FENV_H
-	feraiseexcept (FE_INVALID);
+#ifdef QUADMATH_FERAISEEXCEPT
+	QUADMATH_FERAISEEXCEPT (FE_INVALID);
 #endif
 	return FP_ILOGBNAN;
 }
diff --git a/libquadmath/quadmath-imp.h b/libquadmath/quadmath-imp.h
index 40b346b..6951393 100644
--- a/libquadmath/quadmath-imp.h
+++ b/libquadmath/quadmath-imp.h
@@ -46,8 +46,9 @@ extern __float128 __quadmath_kernel_cosq (__float128, __float128);
 extern __float128 __quadmath_x2y2m1q (__float128 x, __float128 y);
 extern int __quadmath_isinf_nsq (__float128 x);
 
-
-
+#ifdef HAVE_FENV_H
+extern int __quadmath_feraiseexcept (int);
+#endif
 
 
 /* Frankly, if you have __float128, you have 64-bit integers, right?  */

[-- Attachment #3: Type: text/plain, Size: 258 bytes --]



-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fix libquadmath build regression
  2012-12-30  0:13   ` Alexandre Oliva
@ 2012-12-30  9:42     ` Paolo Bonzini
  2012-12-30 22:26       ` fixincludes for " Bruce Korb
  0 siblings, 1 reply; 9+ messages in thread
From: Paolo Bonzini @ 2012-12-30  9:42 UTC (permalink / raw)
  To: Alexandre Oliva; +Cc: gcc-patches, Tobias Burnus, Bruce Korb

Il 30/12/2012 01:13, Alexandre Oliva ha scritto:
> On Dec 24, 2012, Paolo Bonzini <bonzini@gnu.org> wrote:
> 
>> Il 21/12/2012 06:17, Alexandre Oliva ha scritto:
>>> The problem is that glibc has an extern inline definition of
>>> fraiseexcept that is introduced by including fenv.h (it's in
>>> bits/fenv.h), and this definition requires SSE support regardless of
>>> target arch of word width, so it doesn't work for an i686 native that
>>> doesn't assume SSE registers and instructions are available.
>>>
>>> This bug is fixed in newer versions of glibc, but I figured it wouldn't
>>> hurt to have a work-around in place for libquadmath to build
> 
>> Would it be possible to fix it in fixincludes instead?
> 
> Heh, who'd have thought of using fixincludes to fix broken include
> files? :-)  (hint: not me :-)  *blush*
> 
> Thanks for the suggestion, this patch fixes the problem.  Regstrapped on
> x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

Not my territory anymore, but it looks much better!  CCing Bruce.

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fixincludes for libquadmath build regression
  2012-12-30  9:42     ` Paolo Bonzini
@ 2012-12-30 22:26       ` Bruce Korb
  2013-01-06 20:12         ` Alexandre Oliva
  0 siblings, 1 reply; 9+ messages in thread
From: Bruce Korb @ 2012-12-30 22:26 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: Alexandre Oliva, gcc-patches, Tobias Burnus

On 12/30/12 01:42, Paolo Bonzini wrote:
> Not my territory anymore, but it looks much better!  CCing Bruce.

Hi Alexandre,

Long time.  It's no wonder you've forgotten this little world! :)

Anyway, please make the expressions more readable and strip
out the generated text from the review message.

Readability guidance:  indent text and break lines logically.
Consider "here-strings".  e.g. not:

    c_fix_arg = "# ifdef __SSE_MATH__\n%0\n"
    "# else\n%1__asm__ __volatile__ (\"fdiv %%%%st, %%%%st(0); fwait\"\n"
    "%1\t\t\t: \"=t\" (__f) : \"0\" (__f));\n"
    "# endif";

instead:

    c_fix_arg = "# ifdef __SSE_MATH__\n%0\n"
                "# else\n"
                "%1__asm__ __volatile__ (\"fdiv %%%%st, %%%%st(0); fwait\"\n"
                "%1\t\t\t: \"=t\" (__f) : \"0\" (__f));\n"
                "# endif";

or even better:

    c_fix_arg = <<- _EOText_
	# ifdef __SSE_MATH__\n
	%0
	# else
	%1__asm__ __volatile__ ("fdiv %%%%st, %%%%st(0); fwait"
	%1			"=t" (__f) : "0" (__f));
	# endif
	_EOText_;

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fixincludes for libquadmath build regression
  2012-12-30 22:26       ` fixincludes for " Bruce Korb
@ 2013-01-06 20:12         ` Alexandre Oliva
  2013-01-06 20:44           ` Bruce Korb
  0 siblings, 1 reply; 9+ messages in thread
From: Alexandre Oliva @ 2013-01-06 20:12 UTC (permalink / raw)
  To: Bruce Korb; +Cc: Paolo Bonzini, gcc-patches, Tobias Burnus

[-- Attachment #1: Type: text/plain, Size: 367 bytes --]

On Dec 30, 2012, Bruce Korb <bkorb@gnu.org> wrote:

> On 12/30/12 01:42, Paolo Bonzini wrote:
>> Not my territory anymore, but it looks much better!  CCing Bruce.

> Long time.  It's no wonder you've forgotten this little world! :)

Indeed!

> Anyway, please make the expressions more readable and strip
> out the generated text from the review message.

Done.  Ok?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: fixinc-fenv-broken-feraiseexcept.patch --]
[-- Type: text/x-diff, Size: 3294 bytes --]

Fix mandatory SSE in 2.1[56]ish glibc's feraiseexcept

From: Alexandre Oliva <aoliva@redhat.com>

for fixincludes/ChangeLog

	* inclhack.def (feraiseexcept_nosse_invalid): New.
	(feraiseexcept_nosse_divbyzero): Likewise.
	* fixincl.x: Rebuilt.
	* tests/base/bits/fenv.h: New.
---

 fixincludes/fixincl.x              |  130 ++++++++++++++++++++++++++++++++++--
 fixincludes/inclhack.def           |   49 ++++++++++++++
 fixincludes/tests/base/bits/fenv.h |   29 ++++++++
 3 files changed, 200 insertions(+), 8 deletions(-)
 create mode 100644 fixincludes/tests/base/bits/fenv.h


diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
index 09eac7c6..2406920 100644
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -4815,4 +4815,53 @@ fix = {
     test_text = "extern char *\tsprintf();";
 };
 
+/*
+ *  Incorrect feraiseexcept extern inline in bits/fenv.h on x86_64
+ *  that fails when compiling for SSE-less 32-bit x86.
+ */
+fix = {
+    hackname  = feraiseexcept_nosse_invalid;
+    mach      = 'i[34567]86-*-linux*', 'x86*-linux*', 'amd64-*-linux*';
+    files     = bits/fenv.h;
+    select    = "^([\t ]*)__asm__ __volatile__ \\(\"divss %0, %0 *\" : "
+		": \"x\" \\(__f\\)\\);$";
+    bypass    = "\"fdiv .*; fwait\"";
+    
+    c_fix     = format;
+    c_fix_arg = <<- _EOText_
+	# ifdef __SSE_MATH__
+	%0
+	# else
+	%1__asm__ __volatile__ ("fdiv %%%%st, %%%%st(0); fwait"
+	%1			: "=t" (__f) : "0" (__f));
+	# endif
+	_EOText_;
+
+    test_text = <<- _EOText_
+	  __asm__ __volatile__ ("divss %0, %0" : : "x" (__f));
+	_EOText_;
+};
+fix = {
+    hackname  = feraiseexcept_nosse_divbyzero;
+    mach      = 'i[34567]86-*-linux*', 'x86*-linux*', 'amd64-*-linux*';
+    files     = bits/fenv.h;
+    select    = "^([\t ]*)__asm__ __volatile__ \\(\"divss %1, %0 *\" : "
+		": \"x\" \\(__f\\), \"x\" \\(__g\\)\\);$";
+    bypass    = "\"fdivp .*; fwait\"";
+    
+    c_fix     = format;
+    c_fix_arg = <<- _EOText_
+	# ifdef __SSE_MATH__
+	%0
+	# else
+	%1__asm__ __volatile__ ("fdivp %%%%st, %%%%st(1); fwait"
+	%1			: "=t" (__f) : "0" (__f), "u" (__g) : "st(1)");
+	# endif
+	_EOText_;
+
+    test_text = <<- _EOText_
+	  __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
+	_EOText_;
+};
+
 /*EOF*/
diff --git a/fixincludes/tests/base/bits/fenv.h b/fixincludes/tests/base/bits/fenv.h
new file mode 100644
index 0000000..a82ec25
--- /dev/null
+++ b/fixincludes/tests/base/bits/fenv.h
@@ -0,0 +1,29 @@
+/*  DO NOT EDIT THIS FILE.
+
+    It has been auto-edited by fixincludes from:
+
+	"fixinc/tests/inc/bits/fenv.h"
+
+    This had to be done to correct non-standard usages in the
+    original, manufacturer supplied header file.  */
+
+
+
+#if defined( FERAISEEXCEPT_NOSSE_INVALID_CHECK )
+# ifdef __SSE_MATH__
+  __asm__ __volatile__ ("divss %0, %0" : : "x" (__f));
+# else
+  __asm__ __volatile__ ("fdiv %%st, %%st(0); fwait"
+  			: "=t" (__f) : "0" (__f));
+# endif
+#endif  /* FERAISEEXCEPT_NOSSE_INVALID_CHECK */
+
+
+#if defined( FERAISEEXCEPT_NOSSE_DIVBYZERO_CHECK )
+# ifdef __SSE_MATH__
+  __asm__ __volatile__ ("divss %1, %0" : : "x" (__f), "x" (__g));
+# else
+  __asm__ __volatile__ ("fdivp %%st, %%st(1); fwait"
+  			: "=t" (__f) : "0" (__f), "u" (__g) : "st(1)");
+# endif
+#endif  /* FERAISEEXCEPT_NOSSE_DIVBYZERO_CHECK */

[-- Attachment #3: Type: text/plain, Size: 258 bytes --]



-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: fixincludes for libquadmath build regression
  2013-01-06 20:12         ` Alexandre Oliva
@ 2013-01-06 20:44           ` Bruce Korb
  0 siblings, 0 replies; 9+ messages in thread
From: Bruce Korb @ 2013-01-06 20:44 UTC (permalink / raw)
  To: Alexandre Oliva; +Cc: Paolo Bonzini, gcc-patches, Tobias Burnus

On 01/06/13 12:12, Alexandre Oliva wrote:
> On Dec 30, 2012, Bruce Korb <bkorb@gnu.org> wrote:
> 
>> On 12/30/12 01:42, Paolo Bonzini wrote:
>>> Not my territory anymore, but it looks much better!  CCing Bruce.
> 
>> Long time.  It's no wonder you've forgotten this little world! :)
> 
> Indeed!
> 
>> Anyway, please make the expressions more readable and strip
>> out the generated text from the review message.
> 
> Done.  Ok?

Looks good to me.  Thanks!

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-01-06 20:44 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-21  5:17 fix libquadmath build regression Alexandre Oliva
2012-12-21 10:32 ` Tobias Burnus
2012-12-30  0:17   ` Alexandre Oliva
2012-12-24 14:57 ` Paolo Bonzini
2012-12-30  0:13   ` Alexandre Oliva
2012-12-30  9:42     ` Paolo Bonzini
2012-12-30 22:26       ` fixincludes for " Bruce Korb
2013-01-06 20:12         ` Alexandre Oliva
2013-01-06 20:44           ` Bruce Korb

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).