public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: Update soft-fp from glibc
@ 2013-11-08 16:52 Uros Bizjak
  2013-11-08 21:33 ` Joseph S. Myers
  0 siblings, 1 reply; 7+ messages in thread
From: Uros Bizjak @ 2013-11-08 16:52 UTC (permalink / raw)
  To: gcc-patches; +Cc: Joseph S. Myers

Hello!

> I've applied this patch to update libgcc's copy of soft-fp from
> glibc.  There are lots of coding standards fixes, but also various bug
> fixes; I've added testcases for various of the fixed bugs illustrating
> them for __float128.

Is there really no way to get those "missing prototypes" warning fixed?

Uros.

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

* Re: Update soft-fp from glibc
  2013-11-08 16:52 Update soft-fp from glibc Uros Bizjak
@ 2013-11-08 21:33 ` Joseph S. Myers
  2013-11-10 13:16   ` Uros Bizjak
  0 siblings, 1 reply; 7+ messages in thread
From: Joseph S. Myers @ 2013-11-08 21:33 UTC (permalink / raw)
  To: Uros Bizjak; +Cc: gcc-patches

On Fri, 8 Nov 2013, Uros Bizjak wrote:

> Hello!
> 
> > I've applied this patch to update libgcc's copy of soft-fp from
> > glibc.  There are lots of coding standards fixes, but also various bug
> > fixes; I've added testcases for various of the fixed bugs illustrating
> > them for __float128.
> 
> Is there really no way to get those "missing prototypes" warning fixed?

libgcc/config/t-softfp has a setting using -Wno-missing-prototypes - I 
don't know offhand why it's not being used.

-- 
Joseph S. Myers
joseph@codesourcery.com

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

* Re: Update soft-fp from glibc
  2013-11-08 21:33 ` Joseph S. Myers
@ 2013-11-10 13:16   ` Uros Bizjak
  0 siblings, 0 replies; 7+ messages in thread
From: Uros Bizjak @ 2013-11-10 13:16 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: gcc-patches

On Fri, Nov 8, 2013 at 10:26 PM, Joseph S. Myers
<joseph@codesourcery.com> wrote:

>> > I've applied this patch to update libgcc's copy of soft-fp from
>> > glibc.  There are lots of coding standards fixes, but also various bug
>> > fixes; I've added testcases for various of the fixed bugs illustrating
>> > them for __float128.
>>
>> Is there really no way to get those "missing prototypes" warning fixed?
>
> libgcc/config/t-softfp has a setting using -Wno-missing-prototypes - I
> don't know offhand why it's not being used.

Because this setting is written in the prerequisites section of the
makefile rule.

OTOH, multiple rules are not allowed, so this setting is totally wrong.

Uros.

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

* Update soft-fp from glibc
@ 2015-09-28 23:53 Joseph Myers
  0 siblings, 0 replies; 7+ messages in thread
From: Joseph Myers @ 2015-09-28 23:53 UTC (permalink / raw)
  To: gcc-patches

This patch updates the soft-fp code in libgcc from glibc.  There are
no changes here of significance to the use of soft-fp in GCC (and so
no testsuite additions); it's simply an update to bring in the latest
soft-fp version (which will also hopefully go into Linux 4.4 to
replace the 15-year-old copy currently in Linux).

Bootstrapped with no regressions on x86_64-pc-linux-gnu.  Applied to 
mainline.

2015-09-28  Joseph Myers  <joseph@codesourcery.com>

	* soft-fp/adddf3.c: Update from glibc.
	* soft-fp/addsf3.c: Likewise.
	* soft-fp/addtf3.c: Likewise.
	* soft-fp/divdf3.c: Likewise.
	* soft-fp/divsf3.c: Likewise.
	* soft-fp/divtf3.c: Likewise.
	* soft-fp/double.h: Likewise.
	* soft-fp/eqdf2.c: Likewise.
	* soft-fp/eqsf2.c: Likewise.
	* soft-fp/eqtf2.c: Likewise.
	* soft-fp/extenddftf2.c: Likewise.
	* soft-fp/extended.h: Likewise.
	* soft-fp/extendsfdf2.c: Likewise.
	* soft-fp/extendsftf2.c: Likewise.
	* soft-fp/extendxftf2.c: Likewise.
	* soft-fp/fixdfdi.c: Likewise.
	* soft-fp/fixdfsi.c: Likewise.
	* soft-fp/fixdfti.c: Likewise.
	* soft-fp/fixsfdi.c: Likewise.
	* soft-fp/fixsfsi.c: Likewise.
	* soft-fp/fixsfti.c: Likewise.
	* soft-fp/fixtfdi.c: Likewise.
	* soft-fp/fixtfsi.c: Likewise.
	* soft-fp/fixtfti.c: Likewise.
	* soft-fp/fixunsdfdi.c: Likewise.
	* soft-fp/fixunsdfsi.c: Likewise.
	* soft-fp/fixunsdfti.c: Likewise.
	* soft-fp/fixunssfdi.c: Likewise.
	* soft-fp/fixunssfsi.c: Likewise.
	* soft-fp/fixunssfti.c: Likewise.
	* soft-fp/fixunstfdi.c: Likewise.
	* soft-fp/fixunstfsi.c: Likewise.
	* soft-fp/fixunstfti.c: Likewise.
	* soft-fp/floatdidf.c: Likewise.
	* soft-fp/floatdisf.c: Likewise.
	* soft-fp/floatditf.c: Likewise.
	* soft-fp/floatsidf.c: Likewise.
	* soft-fp/floatsisf.c: Likewise.
	* soft-fp/floatsitf.c: Likewise.
	* soft-fp/floattidf.c: Likewise.
	* soft-fp/floattisf.c: Likewise.
	* soft-fp/floattitf.c: Likewise.
	* soft-fp/floatundidf.c: Likewise.
	* soft-fp/floatundisf.c: Likewise.
	* soft-fp/floatunditf.c: Likewise.
	* soft-fp/floatunsidf.c: Likewise.
	* soft-fp/floatunsisf.c: Likewise.
	* soft-fp/floatunsitf.c: Likewise.
	* soft-fp/floatuntidf.c: Likewise.
	* soft-fp/floatuntisf.c: Likewise.
	* soft-fp/floatuntitf.c: Likewise.
	* soft-fp/gedf2.c: Likewise.
	* soft-fp/gesf2.c: Likewise.
	* soft-fp/getf2.c: Likewise.
	* soft-fp/ledf2.c: Likewise.
	* soft-fp/lesf2.c: Likewise.
	* soft-fp/letf2.c: Likewise.
	* soft-fp/muldf3.c: Likewise.
	* soft-fp/mulsf3.c: Likewise.
	* soft-fp/multf3.c: Likewise.
	* soft-fp/negdf2.c: Likewise.
	* soft-fp/negsf2.c: Likewise.
	* soft-fp/negtf2.c: Likewise.
	* soft-fp/op-1.h: Likewise.
	* soft-fp/op-2.h: Likewise.
	* soft-fp/op-4.h: Likewise.
	* soft-fp/op-8.h: Likewise.
	* soft-fp/op-common.h: Likewise.
	* soft-fp/quad.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/soft-fp.h: Likewise.
	* soft-fp/subdf3.c: Likewise.
	* soft-fp/subsf3.c: Likewise.
	* soft-fp/subtf3.c: Likewise.
	* soft-fp/truncdfsf2.c: Likewise.
	* soft-fp/trunctfdf2.c: Likewise.
	* soft-fp/trunctfsf2.c: Likewise.
	* soft-fp/trunctfxf2.c: Likewise.
	* soft-fp/unorddf2.c: Likewise.
	* soft-fp/unordsf2.c: Likewise.
	* soft-fp/unordtf2.c: Likewise.

Index: libgcc/soft-fp/adddf3.c
===================================================================
--- libgcc/soft-fp/adddf3.c	(revision 228199)
+++ libgcc/soft-fp/adddf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/addsf3.c
===================================================================
--- libgcc/soft-fp/addsf3.c	(revision 228199)
+++ libgcc/soft-fp/addsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/addtf3.c
===================================================================
--- libgcc/soft-fp/addtf3.c	(revision 228199)
+++ libgcc/soft-fp/addtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divdf3.c
===================================================================
--- libgcc/soft-fp/divdf3.c	(revision 228199)
+++ libgcc/soft-fp/divdf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divsf3.c
===================================================================
--- libgcc/soft-fp/divsf3.c	(revision 228199)
+++ libgcc/soft-fp/divsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divtf3.c
===================================================================
--- libgcc/soft-fp/divtf3.c	(revision 228199)
+++ libgcc/soft-fp/divtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/double.h
===================================================================
--- libgcc/soft-fp/double.h	(revision 228199)
+++ libgcc/soft-fp/double.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Double Precision
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,6 +30,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_DOUBLE_H
+#define SOFT_FP_DOUBLE_H	1
+
 #if _FP_W_TYPE_SIZE < 32
 # error "Here's a nickel kid.  Go buy yourself a real computer."
 #endif
@@ -182,6 +185,8 @@ union _FP_UNION_D
 # define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 2, (r), X, Y, (ex))
 
 # define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 2, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_D(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (D, 2, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_2 (X)
@@ -304,6 +309,8 @@ union _FP_UNION_D
 # define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 1, (r), X, Y, (ex))
 
 # define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 1, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_D(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (D, 1, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 1, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_1 (X)
@@ -312,3 +319,5 @@ union _FP_UNION_D
 # define _FP_FRAC_HIGH_DW_D(X)	_FP_FRAC_HIGH_2 (X)
 
 #endif /* W_TYPE_SIZE < 64 */
+
+#endif /* !SOFT_FP_DOUBLE_H */
Index: libgcc/soft-fp/eqdf2.c
===================================================================
--- libgcc/soft-fp/eqdf2.c	(revision 228199)
+++ libgcc/soft-fp/eqdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/eqsf2.c
===================================================================
--- libgcc/soft-fp/eqsf2.c	(revision 228199)
+++ libgcc/soft-fp/eqsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/eqtf2.c
===================================================================
--- libgcc/soft-fp/eqtf2.c	(revision 228199)
+++ libgcc/soft-fp/eqtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extenddftf2.c
===================================================================
--- libgcc/soft-fp/extenddftf2.c	(revision 228199)
+++ libgcc/soft-fp/extenddftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extended.h
===================================================================
--- libgcc/soft-fp/extended.h	(revision 228199)
+++ libgcc/soft-fp/extended.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Extended Precision.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
+   Copyright (C) 1999-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek (jj@ultra.linux.cz).
 
@@ -27,6 +27,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_EXTENDED_H
+#define SOFT_FP_EXTENDED_H	1
+
 #if _FP_W_TYPE_SIZE < 32
 # error "Here's a nickel, kid. Go buy yourself a real computer."
 #endif
@@ -292,6 +295,8 @@ union _FP_UNION_E
 # define FP_CMP_UNORD_E(r, X, Y, ex)	_FP_CMP_UNORD (E, 4, (r), X, Y, (ex))
 
 # define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 4, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_E(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (E, 4, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 4, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_E(X)	(X##_f[2])
@@ -494,6 +499,8 @@ union _FP_UNION_E
 # define FP_CMP_UNORD_E(r, X, Y, ex)	_FP_CMP_UNORD (E, 2, (r), X, Y, (ex))
 
 # define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 2, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_E(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (E, 2, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_E(X)	(X##_f1)
@@ -502,3 +509,5 @@ union _FP_UNION_E
 # define _FP_FRAC_HIGH_DW_E(X)	(X##_f[2])
 
 #endif /* not _FP_W_TYPE_SIZE < 64 */
+
+#endif /* !SOFT_FP_EXTENDED_H */
Index: libgcc/soft-fp/extendsfdf2.c
===================================================================
--- libgcc/soft-fp/extendsfdf2.c	(revision 228199)
+++ libgcc/soft-fp/extendsfdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extendsftf2.c
===================================================================
--- libgcc/soft-fp/extendsftf2.c	(revision 228199)
+++ libgcc/soft-fp/extendsftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extendxftf2.c
===================================================================
--- libgcc/soft-fp/extendxftf2.c	(revision 228199)
+++ libgcc/soft-fp/extendxftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixdfdi.c
===================================================================
--- libgcc/soft-fp/fixdfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixdfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixdfsi.c
===================================================================
--- libgcc/soft-fp/fixdfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixdfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixdfti.c
===================================================================
--- libgcc/soft-fp/fixdfti.c	(revision 228199)
+++ libgcc/soft-fp/fixdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit signed integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixsfdi.c
===================================================================
--- libgcc/soft-fp/fixsfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixsfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixsfsi.c
===================================================================
--- libgcc/soft-fp/fixsfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixsfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixsfti.c
===================================================================
--- libgcc/soft-fp/fixsfti.c	(revision 228199)
+++ libgcc/soft-fp/fixsfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit signed integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixtfdi.c
===================================================================
--- libgcc/soft-fp/fixtfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixtfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixtfsi.c
===================================================================
--- libgcc/soft-fp/fixtfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixtfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixtfti.c
===================================================================
--- libgcc/soft-fp/fixtfti.c	(revision 228199)
+++ libgcc/soft-fp/fixtfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit signed integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunsdfdi.c
===================================================================
--- libgcc/soft-fp/fixunsdfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixunsdfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunsdfsi.c
===================================================================
--- libgcc/soft-fp/fixunsdfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixunsdfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunsdfti.c
===================================================================
--- libgcc/soft-fp/fixunsdfti.c	(revision 228199)
+++ libgcc/soft-fp/fixunsdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit unsigned integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunssfdi.c
===================================================================
--- libgcc/soft-fp/fixunssfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixunssfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunssfsi.c
===================================================================
--- libgcc/soft-fp/fixunssfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixunssfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunssfti.c
===================================================================
--- libgcc/soft-fp/fixunssfti.c	(revision 228199)
+++ libgcc/soft-fp/fixunssfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit unsigned integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunstfdi.c
===================================================================
--- libgcc/soft-fp/fixunstfdi.c	(revision 228199)
+++ libgcc/soft-fp/fixunstfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunstfsi.c
===================================================================
--- libgcc/soft-fp/fixunstfsi.c	(revision 228199)
+++ libgcc/soft-fp/fixunstfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunstfti.c
===================================================================
--- libgcc/soft-fp/fixunstfti.c	(revision 228199)
+++ libgcc/soft-fp/fixunstfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit unsigned integer
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatdidf.c
===================================================================
--- libgcc/soft-fp/floatdidf.c	(revision 228199)
+++ libgcc/soft-fp/floatdidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatdisf.c
===================================================================
--- libgcc/soft-fp/floatdisf.c	(revision 228199)
+++ libgcc/soft-fp/floatdisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatditf.c
===================================================================
--- libgcc/soft-fp/floatditf.c	(revision 228199)
+++ libgcc/soft-fp/floatditf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatsidf.c
===================================================================
--- libgcc/soft-fp/floatsidf.c	(revision 228199)
+++ libgcc/soft-fp/floatsidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatsisf.c
===================================================================
--- libgcc/soft-fp/floatsisf.c	(revision 228199)
+++ libgcc/soft-fp/floatsisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatsitf.c
===================================================================
--- libgcc/soft-fp/floatsitf.c	(revision 228199)
+++ libgcc/soft-fp/floatsitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floattidf.c
===================================================================
--- libgcc/soft-fp/floattidf.c	(revision 228199)
+++ libgcc/soft-fp/floattidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE double
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floattisf.c
===================================================================
--- libgcc/soft-fp/floattisf.c	(revision 228199)
+++ libgcc/soft-fp/floattisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE single
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floattitf.c
===================================================================
--- libgcc/soft-fp/floattitf.c	(revision 228199)
+++ libgcc/soft-fp/floattitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE quad
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatundidf.c
===================================================================
--- libgcc/soft-fp/floatundidf.c	(revision 228199)
+++ libgcc/soft-fp/floatundidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatundisf.c
===================================================================
--- libgcc/soft-fp/floatundisf.c	(revision 228199)
+++ libgcc/soft-fp/floatundisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunditf.c
===================================================================
--- libgcc/soft-fp/floatunditf.c	(revision 228199)
+++ libgcc/soft-fp/floatunditf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsidf.c
===================================================================
--- libgcc/soft-fp/floatunsidf.c	(revision 228199)
+++ libgcc/soft-fp/floatunsidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsisf.c
===================================================================
--- libgcc/soft-fp/floatunsisf.c	(revision 228199)
+++ libgcc/soft-fp/floatunsisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsitf.c
===================================================================
--- libgcc/soft-fp/floatunsitf.c	(revision 228199)
+++ libgcc/soft-fp/floatunsitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE quad
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatuntidf.c
===================================================================
--- libgcc/soft-fp/floatuntidf.c	(revision 228199)
+++ libgcc/soft-fp/floatuntidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatuntisf.c
===================================================================
--- libgcc/soft-fp/floatuntisf.c	(revision 228199)
+++ libgcc/soft-fp/floatuntisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE single
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatuntitf.c
===================================================================
--- libgcc/soft-fp/floatuntitf.c	(revision 228199)
+++ libgcc/soft-fp/floatuntitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE quad
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/gedf2.c
===================================================================
--- libgcc/soft-fp/gedf2.c	(revision 228199)
+++ libgcc/soft-fp/gedf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/gesf2.c
===================================================================
--- libgcc/soft-fp/gesf2.c	(revision 228199)
+++ libgcc/soft-fp/gesf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/getf2.c
===================================================================
--- libgcc/soft-fp/getf2.c	(revision 228199)
+++ libgcc/soft-fp/getf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/ledf2.c
===================================================================
--- libgcc/soft-fp/ledf2.c	(revision 228199)
+++ libgcc/soft-fp/ledf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/lesf2.c
===================================================================
--- libgcc/soft-fp/lesf2.c	(revision 228199)
+++ libgcc/soft-fp/lesf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/letf2.c
===================================================================
--- libgcc/soft-fp/letf2.c	(revision 228199)
+++ libgcc/soft-fp/letf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/muldf3.c
===================================================================
--- libgcc/soft-fp/muldf3.c	(revision 228199)
+++ libgcc/soft-fp/muldf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/mulsf3.c
===================================================================
--- libgcc/soft-fp/mulsf3.c	(revision 228199)
+++ libgcc/soft-fp/mulsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/multf3.c
===================================================================
--- libgcc/soft-fp/multf3.c	(revision 228199)
+++ libgcc/soft-fp/multf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/negdf2.c
===================================================================
--- libgcc/soft-fp/negdf2.c	(revision 228199)
+++ libgcc/soft-fp/negdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/negsf2.c
===================================================================
--- libgcc/soft-fp/negsf2.c	(revision 228199)
+++ libgcc/soft-fp/negsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/negtf2.c
===================================================================
--- libgcc/soft-fp/negtf2.c	(revision 228199)
+++ libgcc/soft-fp/negtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-1.h
===================================================================
--- libgcc/soft-fp/op-1.h	(revision 228199)
+++ libgcc/soft-fp/op-1.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic one-word fraction declaration and manipulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,7 +30,10 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_FRAC_DECL_1(X)	_FP_W_TYPE X##_f
+#ifndef SOFT_FP_OP_1_H
+#define SOFT_FP_OP_1_H	1
+
+#define _FP_FRAC_DECL_1(X)	_FP_W_TYPE X##_f _FP_ZERO_INIT
 #define _FP_FRAC_COPY_1(D, S)	(D##_f = S##_f)
 #define _FP_FRAC_SET_1(X, I)	(X##_f = I)
 #define _FP_FRAC_HIGH_1(X)	(X##_f)
@@ -362,3 +365,5 @@
 /* Convert FP values between word sizes.  */
 
 #define _FP_FRAC_COPY_1_1(D, S)		(D##_f = S##_f)
+
+#endif /* !SOFT_FP_OP_1_H */
Index: libgcc/soft-fp/op-2.h
===================================================================
--- libgcc/soft-fp/op-2.h	(revision 228199)
+++ libgcc/soft-fp/op-2.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic two-word fraction declaration and manipulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,7 +30,11 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_FRAC_DECL_2(X)	_FP_W_TYPE X##_f0, X##_f1
+#ifndef SOFT_FP_OP_2_H
+#define SOFT_FP_OP_2_H	1
+
+#define _FP_FRAC_DECL_2(X)				\
+  _FP_W_TYPE X##_f0 _FP_ZERO_INIT, X##_f1 _FP_ZERO_INIT
 #define _FP_FRAC_COPY_2(D, S)	(D##_f0 = S##_f0, D##_f1 = S##_f1)
 #define _FP_FRAC_SET_2(X, I)	__FP_FRAC_SET_2 (X, I)
 #define _FP_FRAC_HIGH_2(X)	(X##_f1)
@@ -454,8 +458,8 @@
 				       _p240, _q240, _r240, _s240;	\
       UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;		\
 									\
-      if ((wfracbits) < 106 || (wfracbits) > 120)			\
-	abort ();							\
+      _FP_STATIC_ASSERT ((wfracbits) >= 106 && (wfracbits) <= 120,	\
+			 "wfracbits out of range");			\
 									\
       setfetz;								\
 									\
@@ -697,3 +701,5 @@
 #define _FP_FRAC_COPY_2_1(D, S)		((D##_f0 = S##_f), (D##_f1 = 0))
 
 #define _FP_FRAC_COPY_2_2(D, S)		_FP_FRAC_COPY_2 (D, S)
+
+#endif /* !SOFT_FP_OP_2_H */
Index: libgcc/soft-fp/op-4.h
===================================================================
--- libgcc/soft-fp/op-4.h	(revision 228199)
+++ libgcc/soft-fp/op-4.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic four-word fraction declaration and manipulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,6 +30,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_OP_4_H
+#define SOFT_FP_OP_4_H	1
+
 #define _FP_FRAC_DECL_4(X)	_FP_W_TYPE X##_f[4]
 #define _FP_FRAC_COPY_4(D, S)			\
   (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],	\
@@ -868,3 +871,5 @@
   while (0)
 
 #define _FP_FRAC_COPY_4_4(D, S)	_FP_FRAC_COPY_4 (D, S)
+
+#endif /* !SOFT_FP_OP_4_H */
Index: libgcc/soft-fp/op-8.h
===================================================================
--- libgcc/soft-fp/op-8.h	(revision 228199)
+++ libgcc/soft-fp/op-8.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic eight-word fraction declaration and manipulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz) and
@@ -29,6 +29,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_OP_8_H
+#define SOFT_FP_OP_8_H	1
+
 /* We need just a few things from here for op-4, if we ever need some
    other macros, they can be added.  */
 #define _FP_FRAC_DECL_8(X)	_FP_W_TYPE X##_f[8]
@@ -143,3 +146,5 @@
       X##_f[0] |= (_FP_FRAC_SRS_8_s != 0);				\
     }									\
   while (0)
+
+#endif /* !SOFT_FP_OP_8_H */
Index: libgcc/soft-fp/op-common.h
===================================================================
--- libgcc/soft-fp/op-common.h	(revision 228199)
+++ libgcc/soft-fp/op-common.h	(working copy)
@@ -1,5 +1,5 @@
 /* Software floating-point emulation. Common operations.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -29,10 +29,13 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#define _FP_DECL(wc, X)				\
-  _FP_I_TYPE X##_c __attribute__ ((unused));	\
-  _FP_I_TYPE X##_s __attribute__ ((unused));	\
-  _FP_I_TYPE X##_e __attribute__ ((unused));	\
+#ifndef SOFT_FP_OP_COMMON_H
+#define SOFT_FP_OP_COMMON_H	1
+
+#define _FP_DECL(wc, X)						\
+  _FP_I_TYPE X##_c __attribute__ ((unused)) _FP_ZERO_INIT;	\
+  _FP_I_TYPE X##_s __attribute__ ((unused)) _FP_ZERO_INIT;	\
+  _FP_I_TYPE X##_e __attribute__ ((unused)) _FP_ZERO_INIT;	\
   _FP_FRAC_DECL_##wc (X)
 
 /* Test whether the qNaN bit denotes a signaling NaN.  */
@@ -414,6 +417,7 @@
       if (X##_s == Y##_s)						\
 	{								\
 	  /* Addition.  */						\
+	  __label__ add1, add2, add3, add_done;				\
 	  R##_s = X##_s;						\
 	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
 	  if (_FP_ADD_INTERNAL_ediff > 0)				\
@@ -599,6 +603,7 @@
       else								\
 	{								\
 	  /* Subtraction.  */						\
+	  __label__ sub1, sub2, sub3, norm, sub_done;			\
 	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
 	  if (_FP_ADD_INTERNAL_ediff > 0)				\
 	    {								\
@@ -922,7 +927,7 @@
 	  break;						\
 								\
 	default:						\
-	  abort ();						\
+	  _FP_UNREACHABLE;					\
 	}							\
     }								\
   while (0)
@@ -933,6 +938,7 @@
 #define _FP_FMA(fs, wc, dwc, R, X, Y, Z)				\
   do									\
     {									\
+      __label__ done_fma;						\
       FP_DECL_##fs (_FP_FMA_T);						\
       _FP_FMA_T##_s = X##_s ^ Y##_s;					\
       _FP_FMA_T##_e = X##_e + Y##_e + 1;				\
@@ -1086,7 +1092,7 @@
 	  break;							\
 									\
 	default:							\
-	  abort ();							\
+	  _FP_UNREACHABLE;						\
 	}								\
 									\
       /* T = X * Y is zero, infinity or NaN.  */			\
@@ -1113,6 +1119,7 @@
 	  R##_s = Z##_s;						\
 	  _FP_FRAC_COPY_##wc (R, Z);					\
 	  R##_c = Z##_c;						\
+	  R##_e = Z##_e;						\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):			\
@@ -1141,7 +1148,7 @@
 	  break;							\
 									\
 	default:							\
-	  abort ();							\
+	  _FP_UNREACHABLE;						\
 	}								\
     done_fma: ;								\
     }									\
@@ -1208,7 +1215,7 @@
 	  break;						\
 								\
 	default:						\
-	  abort ();						\
+	  _FP_UNREACHABLE;					\
 	}							\
     }								\
   while (0)
@@ -1248,6 +1255,46 @@
     }									\
   while (0)
 
+/* Helper for comparisons.  If denormal operands would raise an
+   exception, check for them, and flush to zero as appropriate
+   (otherwise, we need only check and flush to zero if it might affect
+   the result, which is done later with _FP_CMP_CHECK_FLUSH_ZERO).  */
+#define _FP_CMP_CHECK_DENORM(fs, wc, X, Y)				\
+  do									\
+    {									\
+      if (FP_EX_DENORM != 0)						\
+	{								\
+	  /* We must ensure the correct exceptions are raised for	\
+	     denormal operands, even though this may not affect the	\
+	     result of the comparison.  */				\
+	  if (FP_DENORM_ZERO)						\
+	    {								\
+	      _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
+	      _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+	    }								\
+	  else								\
+	    {								\
+	      if ((X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X))		\
+		  || (Y##_e == 0 && !_FP_FRAC_ZEROP_##wc (Y)))		\
+		FP_SET_EXCEPTION (FP_EX_DENORM);			\
+	    }								\
+	}								\
+    }									\
+  while (0)
+
+/* Helper for comparisons.  Check for flushing denormals for zero if
+   we didn't need to check earlier for any denormal operands.  */
+#define _FP_CMP_CHECK_FLUSH_ZERO(fs, wc, X, Y)	\
+  do						\
+    {						\
+      if (FP_EX_DENORM == 0)			\
+	{					\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);	\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);	\
+	}					\
+    }						\
+  while (0)
+
 /* Main differential comparison routine.  The inputs should be raw not
    cooked.  The return is -1, 0, 1 for normal values, UN
    otherwise.  */
@@ -1255,6 +1302,7 @@
 #define _FP_CMP(fs, wc, ret, X, Y, un, ex)				\
   do									\
     {									\
+      _FP_CMP_CHECK_DENORM (fs, wc, X, Y);				\
       /* NANs are unordered.  */					\
       if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
 	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
@@ -1267,8 +1315,7 @@
 	  int _FP_CMP_is_zero_x;					\
 	  int _FP_CMP_is_zero_y;					\
 									\
-	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
-	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+	  _FP_CMP_CHECK_FLUSH_ZERO (fs, wc, X, Y);			\
 									\
 	  _FP_CMP_is_zero_x						\
 	    = (!X##_e && _FP_FRAC_ZEROP_##wc (X)) ? 1 : 0;		\
@@ -1303,6 +1350,7 @@
 #define _FP_CMP_EQ(fs, wc, ret, X, Y, ex)				\
   do									\
     {									\
+      _FP_CMP_CHECK_DENORM (fs, wc, X, Y);				\
       /* NANs are unordered.  */					\
       if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
 	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
@@ -1312,8 +1360,7 @@
 	}								\
       else								\
 	{								\
-	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
-	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+	  _FP_CMP_CHECK_FLUSH_ZERO (fs, wc, X, Y);			\
 									\
 	  (ret) = !(X##_e == Y##_e					\
 		    && _FP_FRAC_EQ_##wc (X, Y)				\
@@ -1328,6 +1375,7 @@
 #define _FP_CMP_UNORD(fs, wc, ret, X, Y, ex)				\
   do									\
     {									\
+      _FP_CMP_CHECK_DENORM (fs, wc, X, Y);				\
       (ret) = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
 	       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))); \
       if (ret)								\
@@ -1525,19 +1573,234 @@
     }									\
   while (0)
 
+/* Convert from floating point to integer, rounding according to the
+   current rounding direction.  Input is raw.  RSIGNED is as for
+   _FP_TO_INT.  */
+#define _FP_TO_INT_ROUND(fs, wc, r, X, rsize, rsigned)			\
+  do									\
+    {									\
+      __label__ _FP_TO_INT_ROUND_done;					\
+      if (X##_e < _FP_EXPBIAS_##fs)					\
+	{								\
+	  int _FP_TO_INT_ROUND_rounds_away = 0;				\
+	  if (X##_e == 0)						\
+	    {								\
+	      if (_FP_FRAC_ZEROP_##wc (X))				\
+		{							\
+		  (r) = 0;						\
+		  goto _FP_TO_INT_ROUND_done;				\
+		}							\
+	      else							\
+		{							\
+		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		  if (FP_DENORM_ZERO)					\
+		    {							\
+		      (r) = 0;						\
+		      goto _FP_TO_INT_ROUND_done;			\
+		    }							\
+		}							\
+	    }								\
+	  /* The result is 0, 1 or -1 depending on the rounding mode;	\
+	     -1 may cause overflow in the unsigned case.  */		\
+	  switch (FP_ROUNDMODE)						\
+	    {								\
+	    case FP_RND_NEAREST:					\
+	      _FP_TO_INT_ROUND_rounds_away				\
+		= (X##_e == _FP_EXPBIAS_##fs - 1			\
+		   && !_FP_FRAC_ZEROP_##wc (X));			\
+	      break;							\
+	    case FP_RND_ZERO:						\
+	      /* _FP_TO_INT_ROUND_rounds_away is already 0.  */		\
+	      break;							\
+	    case FP_RND_PINF:						\
+	      _FP_TO_INT_ROUND_rounds_away = !X##_s;			\
+	      break;							\
+	    case FP_RND_MINF:						\
+	      _FP_TO_INT_ROUND_rounds_away = X##_s;			\
+	      break;							\
+	    }								\
+	  if ((rsigned) == 0 && _FP_TO_INT_ROUND_rounds_away && X##_s)	\
+	    {								\
+	      /* Result of -1 for an unsigned conversion.  */		\
+	      (r) = 0;							\
+	      FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+	    }								\
+	  else if ((rsize) == 1 && (rsigned) > 0			\
+		   && _FP_TO_INT_ROUND_rounds_away && !X##_s)		\
+	    {								\
+	      /* Converting to a 1-bit signed bit-field, which cannot	\
+		 represent +1.  */					\
+	      (r) = ((rsigned) == 2 ? -1 : 0);				\
+	      FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+	    }								\
+	  else								\
+	    {								\
+	      (r) = (_FP_TO_INT_ROUND_rounds_away			\
+		     ? (X##_s ? -1 : 1)					\
+		     : 0);						\
+	      FP_SET_EXCEPTION (FP_EX_INEXACT);				\
+	    }								\
+	}								\
+      else if ((rsigned) == 2						\
+	       && (X##_e						\
+		   >= ((_FP_EXPMAX_##fs					\
+			< _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + (rsize) - 1) \
+		       ? _FP_EXPMAX_##fs				\
+		       : _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + (rsize) - 1))) \
+	{								\
+	  /* Overflow resulting in 0.  */				\
+	  (r) = 0;							\
+	  FP_SET_EXCEPTION (FP_EX_INVALID				\
+			    | FP_EX_INVALID_CVI				\
+			    | ((FP_EX_INVALID_SNAN			\
+				&& _FP_ISSIGNAN (fs, wc, X))		\
+			       ? FP_EX_INVALID_SNAN			\
+			       : 0));					\
+	}								\
+      else if ((rsigned) != 2						\
+	       && (X##_e >= (_FP_EXPMAX_##fs < _FP_EXPBIAS_##fs + (rsize) \
+			     ? _FP_EXPMAX_##fs				\
+			     : (_FP_EXPBIAS_##fs + (rsize)		\
+				- ((rsigned) > 0 && !X##_s)))		\
+		   || ((rsigned) == 0 && X##_s)))			\
+	{								\
+	  /* Definite overflow (does not require rounding to tell).  */	\
+	  if ((rsigned) != 0)						\
+	    {								\
+	      (r) = 1;							\
+	      (r) <<= (rsize) - 1;					\
+	      (r) -= 1 - X##_s;						\
+	    }								\
+	  else								\
+	    {								\
+	      (r) = 0;							\
+	      if (!X##_s)						\
+		(r) = ~(r);						\
+	    }								\
+									\
+	  FP_SET_EXCEPTION (FP_EX_INVALID				\
+			    | FP_EX_INVALID_CVI				\
+			    | ((FP_EX_INVALID_SNAN			\
+				&& _FP_ISSIGNAN (fs, wc, X))		\
+			       ? FP_EX_INVALID_SNAN			\
+			       : 0));					\
+	}								\
+      else								\
+	{								\
+	  /* The value is finite, with magnitude at least 1.  If	\
+	     the conversion is unsigned, the value is positive.		\
+	     If RSIGNED is not 2, the value does not definitely		\
+	     overflow by virtue of its exponent, but may still turn	\
+	     out to overflow after rounding; if RSIGNED is 2, the	\
+	     exponent may be such that the value definitely overflows,	\
+	     but at least one mantissa bit will not be shifted out.  */ \
+	  int _FP_TO_INT_ROUND_inexact = 0;				\
+	  _FP_FRAC_HIGH_RAW_##fs (X) |= _FP_IMPLBIT_##fs;		\
+	  if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)	\
+	    {								\
+	      /* The value is an integer, no rounding needed.  */	\
+	      _FP_FRAC_ASSEMBLE_##wc ((r), X, (rsize));			\
+	      (r) <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1; \
+	    }								\
+	  else								\
+	    {								\
+	      /* May need to shift in order to round (unless there	\
+		 are exactly _FP_WORKBITS fractional bits already).  */	\
+	      int _FP_TO_INT_ROUND_rshift				\
+		= (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs			\
+		   - 1 - _FP_WORKBITS - X##_e);				\
+	      if (_FP_TO_INT_ROUND_rshift > 0)				\
+		_FP_FRAC_SRS_##wc (X, _FP_TO_INT_ROUND_rshift,		\
+				   _FP_WFRACBITS_##fs);			\
+	      else if (_FP_TO_INT_ROUND_rshift < 0)			\
+		_FP_FRAC_SLL_##wc (X, -_FP_TO_INT_ROUND_rshift);	\
+	      /* Round like _FP_ROUND, but setting			\
+		 _FP_TO_INT_ROUND_inexact instead of directly setting	\
+		 the "inexact" exception, since it may turn out we	\
+		 should set "invalid" instead.  */			\
+	      if (_FP_FRAC_LOW_##wc (X) & 7)				\
+		{							\
+		  _FP_TO_INT_ROUND_inexact = 1;				\
+		  switch (FP_ROUNDMODE)					\
+		    {							\
+		    case FP_RND_NEAREST:				\
+		      _FP_ROUND_NEAREST (wc, X);			\
+		      break;						\
+		    case FP_RND_ZERO:					\
+		      _FP_ROUND_ZERO (wc, X);				\
+		      break;						\
+		    case FP_RND_PINF:					\
+		      _FP_ROUND_PINF (wc, X);				\
+		      break;						\
+		    case FP_RND_MINF:					\
+		      _FP_ROUND_MINF (wc, X);				\
+		      break;						\
+		    }							\
+		}							\
+	      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);			\
+	      _FP_FRAC_ASSEMBLE_##wc ((r), X, (rsize));			\
+	    }								\
+	  if ((rsigned) != 0 && X##_s)					\
+	    (r) = -(r);							\
+	  /* An exponent of RSIZE - 1 always needs testing for		\
+	     overflow (either directly overflowing, or overflowing	\
+	     when rounding up results in 2^RSIZE).  An exponent of	\
+	     RSIZE - 2 can overflow for positive values when rounding	\
+	     up to 2^(RSIZE-1), but cannot overflow for negative	\
+	     values.  Smaller exponents cannot overflow.  */		\
+	  if (X##_e >= (_FP_EXPBIAS_##fs + (rsize) - 1			\
+			- ((rsigned) > 0 && !X##_s)))			\
+	    {								\
+	      if (X##_e > _FP_EXPBIAS_##fs + (rsize) - 1		\
+		  || (X##_e == _FP_EXPBIAS_##fs + (rsize) - 1		\
+		      && (X##_s						\
+			  ? (r) != (((typeof (r)) 1) << ((rsize) - 1))	\
+			  : ((rsigned) > 0 || (r) == 0)))		\
+		  || ((rsigned) > 0					\
+		      && !X##_s						\
+		      && X##_e == _FP_EXPBIAS_##fs + (rsize) - 2	\
+		      && (r) == (((typeof (r)) 1) << ((rsize) - 1))))	\
+		{							\
+		  if ((rsigned) != 2)					\
+		    {							\
+		      if ((rsigned) != 0)				\
+			{						\
+			  (r) = 1;					\
+			  (r) <<= (rsize) - 1;				\
+			  (r) -= 1 - X##_s;				\
+			}						\
+		      else						\
+			{						\
+			  (r) = 0;					\
+			  (r) = ~(r);					\
+			}						\
+		    }							\
+		  _FP_TO_INT_ROUND_inexact = 0;				\
+		  FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+		}							\
+	    }								\
+	  if (_FP_TO_INT_ROUND_inexact)					\
+	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
+	}								\
+    _FP_TO_INT_ROUND_done: ;						\
+    }									\
+  while (0)
+
 /* Convert integer to fp.  Output is raw.  RTYPE is unsigned even if
    input is signed.  */
 #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)			\
   do									\
     {									\
+      __label__ pack_semiraw;						\
       if (r)								\
 	{								\
-	  rtype _FP_FROM_INT_ur;					\
+	  rtype _FP_FROM_INT_ur = (r);					\
 									\
 	  if ((X##_s = ((r) < 0)))					\
-	    (r) = -(rtype) (r);						\
+	    _FP_FROM_INT_ur = -_FP_FROM_INT_ur;				\
 									\
-	  _FP_FROM_INT_ur = (rtype) (r);				\
+	  _FP_STATIC_ASSERT ((rsize) <= 2 * _FP_W_TYPE_SIZE,		\
+			     "rsize too large");			\
 	  (void) (((rsize) <= _FP_W_TYPE_SIZE)				\
 		  ? ({							\
 		      int _FP_FROM_INT_lz;				\
@@ -1546,17 +1809,15 @@
 		      X##_e = (_FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1	\
 			       - _FP_FROM_INT_lz);			\
 		    })							\
-		  : (((rsize) <= 2 * _FP_W_TYPE_SIZE)			\
-		     ? ({						\
-			 int _FP_FROM_INT_lz;				\
-			 __FP_CLZ_2 (_FP_FROM_INT_lz,			\
-				     (_FP_W_TYPE) (_FP_FROM_INT_ur	\
-						   >> _FP_W_TYPE_SIZE), \
-				     (_FP_W_TYPE) _FP_FROM_INT_ur);	\
-			 X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
-				  - _FP_FROM_INT_lz);			\
-		       })						\
-		     : (abort (), 0)));					\
+		  : ({						\
+		      int _FP_FROM_INT_lz;				\
+		      __FP_CLZ_2 (_FP_FROM_INT_lz,			\
+				  (_FP_W_TYPE) (_FP_FROM_INT_ur		\
+						>> _FP_W_TYPE_SIZE),	\
+				  (_FP_W_TYPE) _FP_FROM_INT_ur);	\
+		      X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
+			       - _FP_FROM_INT_lz);			\
+		    }));						\
 									\
 	  if ((rsize) - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		\
 	      && X##_e >= _FP_EXPMAX_##fs)				\
@@ -1608,16 +1869,24 @@
 
 
 /* Extend from a narrower floating-point format to a wider one.  Input
-   and output are raw.  */
-#define FP_EXTEND(dfs, sfs, dwc, swc, D, S)				\
+   and output are raw.  If CHECK_NAN, then signaling NaNs are
+   converted to quiet with the "invalid" exception raised; otherwise
+   signaling NaNs remain signaling with no exception.  */
+#define _FP_EXTEND_CNAN(dfs, sfs, dwc, swc, D, S, check_nan)		\
   do									\
     {									\
-      if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs			\
-	  || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs			\
-	      < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs)			\
-	  || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
-	      && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs))		\
-	abort ();							\
+      _FP_STATIC_ASSERT (_FP_FRACBITS_##dfs >= _FP_FRACBITS_##sfs,	\
+			 "destination mantissa narrower than source");	\
+      _FP_STATIC_ASSERT ((_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs		\
+			  >= _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs),	\
+			 "destination max exponent smaller"		\
+			 " than source");				\
+      _FP_STATIC_ASSERT (((_FP_EXPBIAS_##dfs				\
+			   >= (_FP_EXPBIAS_##sfs			\
+			       + _FP_FRACBITS_##sfs - 1))		\
+			  || (_FP_EXPBIAS_##dfs == _FP_EXPBIAS_##sfs)), \
+			 "source subnormals do not all become normal,"	\
+			 " but bias not the same");			\
       D##_s = S##_s;							\
       _FP_FRAC_COPY_##dwc##_##swc (D, S);				\
       if (_FP_EXP_NORMAL (sfs, swc, S))					\
@@ -1659,12 +1928,13 @@
 	      D##_e = _FP_EXPMAX_##dfs;					\
 	      if (!_FP_FRAC_ZEROP_##swc (S))				\
 		{							\
-		  if (_FP_FRAC_SNANP (sfs, S))				\
+		  if (check_nan && _FP_FRAC_SNANP (sfs, S))		\
 		    FP_SET_EXCEPTION (FP_EX_INVALID			\
 				      | FP_EX_INVALID_SNAN);		\
 		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
 					  - _FP_FRACBITS_##sfs));	\
-		  _FP_SETQNAN (dfs, dwc, D);				\
+		  if (check_nan)					\
+		    _FP_SETQNAN (dfs, dwc, D);				\
 		}							\
 	    }								\
 	}								\
@@ -1671,15 +1941,22 @@
     }									\
   while (0)
 
+#define FP_EXTEND(dfs, sfs, dwc, swc, D, S)		\
+    _FP_EXTEND_CNAN (dfs, sfs, dwc, swc, D, S, 1)
+
 /* Truncate from a wider floating-point format to a narrower one.
    Input and output are semi-raw.  */
 #define FP_TRUNC(dfs, sfs, dwc, swc, D, S)				\
   do									\
     {									\
-      if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs			\
-	  || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
-	      && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs))		\
-	abort ();							\
+      _FP_STATIC_ASSERT (_FP_FRACBITS_##sfs >= _FP_FRACBITS_##dfs,	\
+			 "destination mantissa wider than source");	\
+      _FP_STATIC_ASSERT (((_FP_EXPBIAS_##sfs				\
+			   >= (_FP_EXPBIAS_##dfs			\
+			       + _FP_FRACBITS_##dfs - 1))		\
+			  || _FP_EXPBIAS_##sfs == _FP_EXPBIAS_##dfs),	\
+			 "source subnormals do not all become same,"	\
+			 " but bias not the same");			\
       D##_s = S##_s;							\
       if (_FP_EXP_NORMAL (sfs, swc, S))					\
 	{								\
@@ -1768,14 +2045,18 @@
 # define __FP_CLZ(r, x)							\
   do									\
     {									\
+      _FP_STATIC_ASSERT ((sizeof (_FP_W_TYPE) == sizeof (unsigned int)	\
+			  || (sizeof (_FP_W_TYPE)			\
+			      == sizeof (unsigned long))		\
+			  || (sizeof (_FP_W_TYPE)			\
+			      == sizeof (unsigned long long))),		\
+			 "_FP_W_TYPE size unsupported for clz");	\
       if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))			\
 	(r) = __builtin_clz (x);					\
       else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))		\
 	(r) = __builtin_clzl (x);					\
-      else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))	\
+      else /* sizeof (_FP_W_TYPE) == sizeof (unsigned long long).  */	\
 	(r) = __builtin_clzll (x);					\
-      else								\
-	abort ();							\
     }									\
   while (0)
 #endif /* ndef __FP_CLZ */
@@ -1844,3 +2125,5 @@
 #define _FP_DIV_MEAT_1_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
 #define _FP_DIV_MEAT_2_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
 #define _FP_DIV_MEAT_4_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 4, R, X, Y)
+
+#endif /* !SOFT_FP_OP_COMMON_H */
Index: libgcc/soft-fp/quad.h
===================================================================
--- libgcc/soft-fp/quad.h	(revision 228199)
+++ libgcc/soft-fp/quad.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Quad Precision.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,6 +30,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_QUAD_H
+#define SOFT_FP_QUAD_H	1
+
 #if _FP_W_TYPE_SIZE < 32
 # error "Here's a nickel, kid. Go buy yourself a real computer."
 #endif
@@ -187,6 +190,8 @@ union _FP_UNION_Q
 # define FP_CMP_UNORD_Q(r, X, Y, ex)	_FP_CMP_UNORD (Q, 4, (r), X, Y, (ex))
 
 # define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 4, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_Q(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (Q, 4, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 4, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_4 (X)
@@ -311,6 +316,8 @@ union _FP_UNION_Q
 # define FP_CMP_UNORD_Q(r, X, Y, ex)	_FP_CMP_UNORD (Q, 2, (r), X, Y, (ex))
 
 # define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 2, (r), X, (rsz), (rsg))
+# define FP_TO_INT_ROUND_Q(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (Q, 2, (r), X, (rsz), (rsg))
 # define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_2 (X)
@@ -319,3 +326,5 @@ union _FP_UNION_Q
 # define _FP_FRAC_HIGH_DW_Q(X)	_FP_FRAC_HIGH_4 (X)
 
 #endif /* not _FP_W_TYPE_SIZE < 64 */
+
+#endif /* !SOFT_FP_QUAD_H */
Index: libgcc/soft-fp/single.h
===================================================================
--- libgcc/soft-fp/single.h	(revision 228199)
+++ libgcc/soft-fp/single.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Single Precision.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,6 +30,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_SINGLE_H
+#define SOFT_FP_SINGLE_H	1
+
 #if _FP_W_TYPE_SIZE < 32
 # error "Here's a nickel kid.  Go buy yourself a real computer."
 #endif
@@ -180,6 +183,8 @@ union _FP_UNION_S
 #define FP_CMP_UNORD_S(r, X, Y, ex)	_FP_CMP_UNORD (S, 1, (r), X, Y, (ex))
 
 #define FP_TO_INT_S(r, X, rsz, rsg)	_FP_TO_INT (S, 1, (r), X, (rsz), (rsg))
+#define FP_TO_INT_ROUND_S(r, X, rsz, rsg)	\
+  _FP_TO_INT_ROUND (S, 1, (r), X, (rsz), (rsg))
 #define FP_FROM_INT_S(X, r, rs, rt)	_FP_FROM_INT (S, 1, X, (r), (rs), rt)
 
 #define _FP_FRAC_HIGH_S(X)	_FP_FRAC_HIGH_1 (X)
@@ -190,3 +195,5 @@ union _FP_UNION_S
 #else
 # define _FP_FRAC_HIGH_DW_S(X)	_FP_FRAC_HIGH_1 (X)
 #endif
+
+#endif /* !SOFT_FP_SINGLE_H */
Index: libgcc/soft-fp/soft-fp.h
===================================================================
--- libgcc/soft-fp/soft-fp.h	(revision 228199)
+++ libgcc/soft-fp/soft-fp.h	(working copy)
@@ -1,5 +1,5 @@
 /* Software floating-point emulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,10 +30,14 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef SOFT_FP_H
-#define SOFT_FP_H
+#define SOFT_FP_H	1
 
 #ifdef _LIBC
 # include <sfp-machine.h>
+#elif defined __KERNEL__
+/* The Linux kernel uses asm/ names for architecture-specific
+   files.  */
+# include <asm/sfp-machine.h>
 #else
 # include "sfp-machine.h"
 #endif
@@ -47,6 +51,37 @@
 # endif
 #endif
 
+/* For unreachable default cases in switch statements over bitwise OR
+   of FP_CLS_* values.  */
+#if (defined __GNUC__							\
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
+# define _FP_UNREACHABLE	__builtin_unreachable ()
+#else
+# define _FP_UNREACHABLE	abort ()
+#endif
+
+#if ((defined __GNUC__							\
+      && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))	\
+     || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
+# define _FP_STATIC_ASSERT(expr, msg)		\
+  _Static_assert ((expr), msg)
+#else
+# define _FP_STATIC_ASSERT(expr, msg)					\
+  extern int (*__Static_assert_function (void))				\
+    [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
+#endif
+
+/* In the Linux kernel, some architectures have a single function that
+   uses different kinds of unpacking and packing depending on the
+   instruction being emulated, meaning it is not readily visible to
+   the compiler that variables from _FP_DECL and _FP_FRAC_DECL_*
+   macros are only used in cases where they were initialized.  */
+#ifdef __KERNEL__
+# define _FP_ZERO_INIT		= 0
+#else
+# define _FP_ZERO_INIT
+#endif
+
 #define _FP_WORKBITS		3
 #define _FP_WORK_LSB		((_FP_W_TYPE) 1 << 3)
 #define _FP_WORK_ROUND		((_FP_W_TYPE) 1 << 2)
@@ -316,10 +351,4 @@ typedef USItype UHWtype;
 # endif
 #endif
 
-#ifdef _LIBC
-# include <stdlib.h>
-#else
-extern void abort (void);
-#endif
-
-#endif
+#endif /* !SOFT_FP_H */
Index: libgcc/soft-fp/subdf3.c
===================================================================
--- libgcc/soft-fp/subdf3.c	(revision 228199)
+++ libgcc/soft-fp/subdf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/subsf3.c
===================================================================
--- libgcc/soft-fp/subsf3.c	(revision 228199)
+++ libgcc/soft-fp/subsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/subtf3.c
===================================================================
--- libgcc/soft-fp/subtf3.c	(revision 228199)
+++ libgcc/soft-fp/subtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/truncdfsf2.c
===================================================================
--- libgcc/soft-fp/truncdfsf2.c	(revision 228199)
+++ libgcc/soft-fp/truncdfsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE double into IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/trunctfdf2.c
===================================================================
--- libgcc/soft-fp/trunctfdf2.c	(revision 228199)
+++ libgcc/soft-fp/trunctfdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE double
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/trunctfsf2.c
===================================================================
--- libgcc/soft-fp/trunctfsf2.c	(revision 228199)
+++ libgcc/soft-fp/trunctfsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE single
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/trunctfxf2.c
===================================================================
--- libgcc/soft-fp/trunctfxf2.c	(revision 228199)
+++ libgcc/soft-fp/trunctfxf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE extended
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
+   Copyright (C) 2007-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/unorddf2.c
===================================================================
--- libgcc/soft-fp/unorddf2.c	(revision 228199)
+++ libgcc/soft-fp/unorddf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 
Index: libgcc/soft-fp/unordsf2.c
===================================================================
--- libgcc/soft-fp/unordsf2.c	(revision 228199)
+++ libgcc/soft-fp/unordsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 
Index: libgcc/soft-fp/unordtf2.c
===================================================================
--- libgcc/soft-fp/unordtf2.c	(revision 228199)
+++ libgcc/soft-fp/unordtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
+   Copyright (C) 2006-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 

-- 
Joseph S. Myers
joseph@codesourcery.com

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

* Update soft-fp from glibc
@ 2014-10-09 18:51 Joseph S. Myers
  0 siblings, 0 replies; 7+ messages in thread
From: Joseph S. Myers @ 2014-10-09 18:51 UTC (permalink / raw)
  To: gcc-patches

This patch updates libgcc's copy of soft-fp from glibc, adding a
testcase for a bug fix this brings in.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
to mainline.

libgcc:
2014-10-09  Joseph Myers  <joseph@codesourcery.com>

	* soft-fp/double.h: Update from glibc.
	* soft-fp/eqdf2.c: Likewise.
	* soft-fp/eqsf2.c: Likewise.
	* soft-fp/eqtf2.c: Likewise.
	* soft-fp/extenddftf2.c: Likewise.
	* soft-fp/extended.h: Likewise.
	* soft-fp/extendsfdf2.c: Likewise.
	* soft-fp/extendsftf2.c: Likewise.
	* soft-fp/extendxftf2.c: Likewise.
	* soft-fp/gedf2.c: Likewise.
	* soft-fp/gesf2.c: Likewise.
	* soft-fp/getf2.c: Likewise.
	* soft-fp/ledf2.c: Likewise.
	* soft-fp/lesf2.c: Likewise.
	* soft-fp/letf2.c: Likewise.
	* soft-fp/op-1.h: Likewise.
	* soft-fp/op-2.h: Likewise.
	* soft-fp/op-4.h: Likewise.
	* soft-fp/op-8.h: Likewise.
	* soft-fp/op-common.h: Likewise.
	* soft-fp/quad.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/soft-fp.h: Likewise.
	* soft-fp/unorddf2.c: Likewise.
	* soft-fp/unordsf2.c: Likewise.
	* soft-fp/unordtf2.c: Likewise.
	* config/c6x/eqd.c (__c6xabi_eqd): Update call to FP_CMP_EQ_D.
	* config/c6x/eqf.c (__c6xabi_eqf): Update call to FP_CMP_EQ_S.
	* config/c6x/ged.c (__c6xabi_ged): Update call to FP_CMP_D.
	* config/c6x/gef.c (__c6xabi_gef): Update call to FP_CMP_S.
	* config/c6x/gtd.c (__c6xabi_gtd): Update call to FP_CMP_D.
	* config/c6x/gtf.c (__c6xabi_gtf): Update call to FP_CMP_S.
	* config/c6x/led.c (__c6xabi_led): Update call to FP_CMP_D.
	* config/c6x/lef.c (__c6xabi_lef): Update call to FP_CMP_S.
	* config/c6x/ltd.c (__c6xabi_ltd): Update call to FP_CMP_D.
	* config/c6x/ltf.c (__c6xabi_ltf): Update call to FP_CMP_S.

gcc/testsuite:
2014-10-09  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/torture/float128-extendxf-underflow.c: New test.

Index: gcc/testsuite/gcc.dg/torture/float128-extendxf-underflow.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-extendxf-underflow.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-extendxf-underflow.c	(working copy)
@@ -0,0 +1,40 @@
+/* Test that extension from XFmode to __float128 raises underflow for
+   exact tiny values, if trapping on underflow is enabled.  */
+
+/* { dg-do run { target i?86-*-*gnu* x86_64-*-*gnu* ia64-*-*gnu* } } */
+/* { dg-options "-D_GNU_SOURCE" } */
+/* { dg-require-effective-target fenv_exceptions } */
+
+#include <fenv.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdlib.h>
+
+volatile sig_atomic_t caught_sigfpe;
+sigjmp_buf buf;
+
+static void
+handle_sigfpe (int sig)
+{
+  caught_sigfpe = 1;
+  siglongjmp (buf, 1);
+}
+
+int
+main (void)
+{
+  volatile long double a = 0x1p-16384L;
+  volatile __float128 r;
+  r = a;
+  if (fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (r != 0x1p-16384q)
+    abort ();
+  feenableexcept (FE_UNDERFLOW);
+  signal (SIGFPE, handle_sigfpe);
+  if (sigsetjmp (buf, 1) == 0)
+    r = a;
+  if (!caught_sigfpe)
+    abort ();
+  exit (0);
+}
Index: libgcc/config/c6x/eqd.c
===================================================================
--- libgcc/config/c6x/eqd.c	(revision 216037)
+++ libgcc/config/c6x/eqd.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
-  FP_CMP_EQ_D(r, A, B);
-  if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_EQ_D(r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return !r;
Index: libgcc/config/c6x/eqf.c
===================================================================
--- libgcc/config/c6x/eqf.c	(revision 216037)
+++ libgcc/config/c6x/eqf.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
-  FP_CMP_EQ_S(r, A, B);
-  if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_EQ_S(r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return !r;
Index: libgcc/config/c6x/ged.c
===================================================================
--- libgcc/config/c6x/ged.c	(revision 216037)
+++ libgcc/config/c6x/ged.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_D(r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r >= 0;
Index: libgcc/config/c6x/gef.c
===================================================================
--- libgcc/config/c6x/gef.c	(revision 216037)
+++ libgcc/config/c6x/gef.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_S(r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r >= 0;
Index: libgcc/config/c6x/gtd.c
===================================================================
--- libgcc/config/c6x/gtd.c	(revision 216037)
+++ libgcc/config/c6x/gtd.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_D(r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r > 0;
Index: libgcc/config/c6x/gtf.c
===================================================================
--- libgcc/config/c6x/gtf.c	(revision 216037)
+++ libgcc/config/c6x/gtf.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_S(r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r > 0;
Index: libgcc/config/c6x/led.c
===================================================================
--- libgcc/config/c6x/led.c	(revision 216037)
+++ libgcc/config/c6x/led.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_D(r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r <= 0;
Index: libgcc/config/c6x/lef.c
===================================================================
--- libgcc/config/c6x/lef.c	(revision 216037)
+++ libgcc/config/c6x/lef.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_S(r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r <= 0;
Index: libgcc/config/c6x/ltd.c
===================================================================
--- libgcc/config/c6x/ltd.c	(revision 216037)
+++ libgcc/config/c6x/ltd.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_D(A, a);
   FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_D(r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r < 0;
Index: libgcc/config/c6x/ltf.c
===================================================================
--- libgcc/config/c6x/ltf.c	(revision 216037)
+++ libgcc/config/c6x/ltf.c	(working copy)
@@ -38,9 +38,7 @@
 
   FP_UNPACK_RAW_S(A, a);
   FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_CMP_S(r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r < 0;
Index: libgcc/soft-fp/double.h
===================================================================
--- libgcc/soft-fp/double.h	(revision 216037)
+++ libgcc/soft-fp/double.h	(working copy)
@@ -90,14 +90,14 @@
 };
 
 # define FP_DECL_D(X)		_FP_DECL (2, X)
-# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_2 (D, X, val)
-# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_2_P (D, X, val)
-# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_2 (D, val, X)
+# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_2 (D, X, (val))
+# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_2_P (D, X, (val))
+# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_2 (D, (val), X)
 # define FP_PACK_RAW_DP(val, X)			\
   do						\
     {						\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (D, val, X);		\
+	_FP_PACK_RAW_2_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -104,7 +104,7 @@
 # define FP_UNPACK_D(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_2 (D, X, val);		\
+      _FP_UNPACK_RAW_2 (D, X, (val));		\
       _FP_UNPACK_CANONICAL (D, 2, X);		\
     }						\
   while (0)
@@ -112,7 +112,7 @@
 # define FP_UNPACK_DP(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_2_P (D, X, val);		\
+      _FP_UNPACK_RAW_2_P (D, X, (val));		\
       _FP_UNPACK_CANONICAL (D, 2, X);		\
     }						\
   while (0)
@@ -120,7 +120,7 @@
 # define FP_UNPACK_SEMIRAW_D(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_2 (D, X, val);		\
+      _FP_UNPACK_RAW_2 (D, X, (val));		\
       _FP_UNPACK_SEMIRAW (D, 2, X);		\
     }						\
   while (0)
@@ -128,7 +128,7 @@
 # define FP_UNPACK_SEMIRAW_DP(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_2_P (D, X, val);		\
+      _FP_UNPACK_RAW_2_P (D, X, (val));		\
       _FP_UNPACK_SEMIRAW (D, 2, X);		\
     }						\
   while (0)
@@ -137,7 +137,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (D, 2, X);		\
-      _FP_PACK_RAW_2 (D, val, X);		\
+      _FP_PACK_RAW_2 (D, (val), X);		\
     }						\
   while (0)
 
@@ -146,7 +146,7 @@
     {						\
       _FP_PACK_CANONICAL (D, 2, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (D, val, X);		\
+	_FP_PACK_RAW_2_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -154,7 +154,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (D, 2, X);		\
-      _FP_PACK_RAW_2 (D, val, X);		\
+      _FP_PACK_RAW_2 (D, (val), X);		\
     }						\
   while (0)
 
@@ -163,7 +163,7 @@
     {						\
       _FP_PACK_SEMIRAW (D, 2, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (D, val, X);		\
+	_FP_PACK_RAW_2_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -174,15 +174,15 @@
 # define FP_MUL_D(R, X, Y)		_FP_MUL (D, 2, R, X, Y)
 # define FP_DIV_D(R, X, Y)		_FP_DIV (D, 2, R, X, Y)
 # define FP_SQRT_D(R, X)		_FP_SQRT (D, 2, R, X)
-# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, Q)
+# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, (Q))
 # define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 2, 4, R, X, Y, Z)
 
-# define FP_CMP_D(r, X, Y, un)		_FP_CMP (D, 2, r, X, Y, un)
-# define FP_CMP_EQ_D(r, X, Y)		_FP_CMP_EQ (D, 2, r, X, Y)
-# define FP_CMP_UNORD_D(r, X, Y)	_FP_CMP_UNORD (D, 2, r, X, Y)
+# define FP_CMP_D(r, X, Y, un, ex)	_FP_CMP (D, 2, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_D(r, X, Y, ex)	_FP_CMP_EQ (D, 2, (r), X, Y, (ex))
+# define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 2, (r), X, Y, (ex))
 
-# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 2, r, X, rsz, rsg)
-# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 2, X, r, rs, rt)
+# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 2, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_2 (X)
 # define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_2 (X)
@@ -209,14 +209,14 @@
 };
 
 # define FP_DECL_D(X)		_FP_DECL (1, X)
-# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_1 (D, X, val)
-# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_1_P (D, X, val)
-# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_1 (D, val, X)
+# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_1 (D, X, (val))
+# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_1_P (D, X, (val))
+# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_1 (D, (val), X)
 # define FP_PACK_RAW_DP(val, X)			\
   do						\
     {						\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (D, val, X);		\
+	_FP_PACK_RAW_1_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -223,7 +223,7 @@
 # define FP_UNPACK_D(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_1 (D, X, val);		\
+      _FP_UNPACK_RAW_1 (D, X, (val));		\
       _FP_UNPACK_CANONICAL (D, 1, X);		\
     }						\
   while (0)
@@ -231,7 +231,7 @@
 # define FP_UNPACK_DP(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_1_P (D, X, val);		\
+      _FP_UNPACK_RAW_1_P (D, X, (val));		\
       _FP_UNPACK_CANONICAL (D, 1, X);		\
     }						\
   while (0)
@@ -239,7 +239,7 @@
 # define FP_UNPACK_SEMIRAW_D(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_1 (D, X, val);		\
+      _FP_UNPACK_RAW_1 (D, X, (val));		\
       _FP_UNPACK_SEMIRAW (D, 1, X);		\
     }						\
   while (0)
@@ -247,7 +247,7 @@
 # define FP_UNPACK_SEMIRAW_DP(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_1_P (D, X, val);		\
+      _FP_UNPACK_RAW_1_P (D, X, (val));		\
       _FP_UNPACK_SEMIRAW (D, 1, X);		\
     }						\
   while (0)
@@ -256,7 +256,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (D, 1, X);		\
-      _FP_PACK_RAW_1 (D, val, X);		\
+      _FP_PACK_RAW_1 (D, (val), X);		\
     }						\
   while (0)
 
@@ -265,7 +265,7 @@
     {						\
       _FP_PACK_CANONICAL (D, 1, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (D, val, X);		\
+	_FP_PACK_RAW_1_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -273,7 +273,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (D, 1, X);		\
-      _FP_PACK_RAW_1 (D, val, X);		\
+      _FP_PACK_RAW_1 (D, (val), X);		\
     }						\
   while (0)
 
@@ -282,7 +282,7 @@
     {						\
       _FP_PACK_SEMIRAW (D, 1, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (D, val, X);		\
+	_FP_PACK_RAW_1_P (D, (val), X);		\
     }						\
   while (0)
 
@@ -293,18 +293,18 @@
 # define FP_MUL_D(R, X, Y)		_FP_MUL (D, 1, R, X, Y)
 # define FP_DIV_D(R, X, Y)		_FP_DIV (D, 1, R, X, Y)
 # define FP_SQRT_D(R, X)		_FP_SQRT (D, 1, R, X)
-# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, Q)
+# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, (Q))
 # define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 1, 2, R, X, Y, Z)
 
 /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
    the target machine.  */
 
-# define FP_CMP_D(r, X, Y, un)		_FP_CMP (D, 1, r, X, Y, un)
-# define FP_CMP_EQ_D(r, X, Y)		_FP_CMP_EQ (D, 1, r, X, Y)
-# define FP_CMP_UNORD_D(r, X, Y)	_FP_CMP_UNORD (D, 1, r, X, Y)
+# define FP_CMP_D(r, X, Y, un, ex)	_FP_CMP (D, 1, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_D(r, X, Y, ex)	_FP_CMP_EQ (D, 1, (r), X, Y, (ex))
+# define FP_CMP_UNORD_D(r, X, Y, ex)	_FP_CMP_UNORD (D, 1, (r), X, Y, (ex))
 
-# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 1, r, X, rsz, rsg)
-# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 1, X, r, rs, rt)
+# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 1, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 1, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_1 (X)
 # define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_1 (X)
Index: libgcc/soft-fp/eqdf2.c
===================================================================
--- libgcc/soft-fp/eqdf2.c	(revision 216037)
+++ libgcc/soft-fp/eqdf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_D (A, a);
   FP_UNPACK_RAW_D (B, b);
-  FP_CMP_EQ_D (r, A, B);
-  if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_EQ_D (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/eqsf2.c
===================================================================
--- libgcc/soft-fp/eqsf2.c	(revision 216037)
+++ libgcc/soft-fp/eqsf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_S (A, a);
   FP_UNPACK_RAW_S (B, b);
-  FP_CMP_EQ_S (r, A, B);
-  if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_EQ_S (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/eqtf2.c
===================================================================
--- libgcc/soft-fp/eqtf2.c	(revision 216037)
+++ libgcc/soft-fp/eqtf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_Q (A, a);
   FP_UNPACK_RAW_Q (B, b);
-  FP_CMP_EQ_Q (r, A, B);
-  if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_EQ_Q (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/extenddftf2.c
===================================================================
--- libgcc/soft-fp/extenddftf2.c	(revision 216037)
+++ libgcc/soft-fp/extenddftf2.c	(working copy)
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "double.h"
 #include "quad.h"
Index: libgcc/soft-fp/extended.h
===================================================================
--- libgcc/soft-fp/extended.h	(revision 216037)
+++ libgcc/soft-fp/extended.h	(working copy)
@@ -91,76 +91,78 @@
 
 # define FP_DECL_E(X)		_FP_DECL (4, X)
 
-# define FP_UNPACK_RAW_E(X, val)		\
-  do						\
-    {						\
-      union _FP_UNION_E _flo;			\
-      _flo.flt = (val);				\
-						\
-      X##_f[2] = 0;				\
-      X##_f[3] = 0;				\
-      X##_f[0] = _flo.bits.frac0;		\
-      X##_f[1] = _flo.bits.frac1;		\
-      X##_e  = _flo.bits.exp;			\
-      X##_s  = _flo.bits.sign;			\
-    }						\
+# define FP_UNPACK_RAW_E(X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_E FP_UNPACK_RAW_E_flo;		\
+      FP_UNPACK_RAW_E_flo.flt = (val);			\
+							\
+      X##_f[2] = 0;					\
+      X##_f[3] = 0;					\
+      X##_f[0] = FP_UNPACK_RAW_E_flo.bits.frac0;	\
+      X##_f[1] = FP_UNPACK_RAW_E_flo.bits.frac1;	\
+      X##_e  = FP_UNPACK_RAW_E_flo.bits.exp;		\
+      X##_s  = FP_UNPACK_RAW_E_flo.bits.sign;		\
+    }							\
   while (0)
 
-# define FP_UNPACK_RAW_EP(X, val)				\
-  do								\
-    {								\
-      union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
-								\
-      X##_f[2] = 0;						\
-      X##_f[3] = 0;						\
-      X##_f[0] = _flo->bits.frac0;				\
-      X##_f[1] = _flo->bits.frac1;				\
-      X##_e  = _flo->bits.exp;					\
-      X##_s  = _flo->bits.sign;					\
-    }								\
+# define FP_UNPACK_RAW_EP(X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_E *FP_UNPACK_RAW_EP_flo		\
+	= (union _FP_UNION_E *) (val);			\
+							\
+      X##_f[2] = 0;					\
+      X##_f[3] = 0;					\
+      X##_f[0] = FP_UNPACK_RAW_EP_flo->bits.frac0;	\
+      X##_f[1] = FP_UNPACK_RAW_EP_flo->bits.frac1;	\
+      X##_e  = FP_UNPACK_RAW_EP_flo->bits.exp;		\
+      X##_s  = FP_UNPACK_RAW_EP_flo->bits.sign;		\
+    }							\
   while (0)
 
 # define FP_PACK_RAW_E(val, X)			\
   do						\
     {						\
-      union _FP_UNION_E _flo;			\
+      union _FP_UNION_E FP_PACK_RAW_E_flo;	\
 						\
       if (X##_e)				\
 	X##_f[1] |= _FP_IMPLBIT_E;		\
       else					\
 	X##_f[1] &= ~(_FP_IMPLBIT_E);		\
-      _flo.bits.frac0 = X##_f[0];		\
-      _flo.bits.frac1 = X##_f[1];		\
-      _flo.bits.exp   = X##_e;			\
-      _flo.bits.sign  = X##_s;			\
+      FP_PACK_RAW_E_flo.bits.frac0 = X##_f[0];	\
+      FP_PACK_RAW_E_flo.bits.frac1 = X##_f[1];	\
+      FP_PACK_RAW_E_flo.bits.exp   = X##_e;	\
+      FP_PACK_RAW_E_flo.bits.sign  = X##_s;	\
 						\
-      (val) = _flo.flt;				\
+      (val) = FP_PACK_RAW_E_flo.flt;		\
     }						\
   while (0)
 
-# define FP_PACK_RAW_EP(val, X)						\
-  do									\
-    {									\
-      if (!FP_INHIBIT_RESULTS)						\
-	{								\
-	  union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
-									\
-	  if (X##_e)							\
-	    X##_f[1] |= _FP_IMPLBIT_E;					\
-	  else								\
-	    X##_f[1] &= ~(_FP_IMPLBIT_E);				\
-	  _flo->bits.frac0 = X##_f[0];					\
-	  _flo->bits.frac1 = X##_f[1];					\
-	  _flo->bits.exp   = X##_e;					\
-	  _flo->bits.sign  = X##_s;					\
-	}								\
-    }									\
+# define FP_PACK_RAW_EP(val, X)				\
+  do							\
+    {							\
+      if (!FP_INHIBIT_RESULTS)				\
+	{						\
+	  union _FP_UNION_E *FP_PACK_RAW_EP_flo		\
+	    = (union _FP_UNION_E *) (val);		\
+							\
+	  if (X##_e)					\
+	    X##_f[1] |= _FP_IMPLBIT_E;			\
+	  else						\
+	    X##_f[1] &= ~(_FP_IMPLBIT_E);		\
+	  FP_PACK_RAW_EP_flo->bits.frac0 = X##_f[0];	\
+	  FP_PACK_RAW_EP_flo->bits.frac1 = X##_f[1];	\
+	  FP_PACK_RAW_EP_flo->bits.exp   = X##_e;	\
+	  FP_PACK_RAW_EP_flo->bits.sign  = X##_s;	\
+	}						\
+    }							\
   while (0)
 
 # define FP_UNPACK_E(X, val)			\
   do						\
     {						\
-      FP_UNPACK_RAW_E (X, val);			\
+      FP_UNPACK_RAW_E (X, (val));		\
       _FP_UNPACK_CANONICAL (E, 4, X);		\
     }						\
   while (0)
@@ -168,7 +170,7 @@
 # define FP_UNPACK_EP(X, val)			\
   do						\
     {						\
-      FP_UNPACK_RAW_EP (X, val);		\
+      FP_UNPACK_RAW_EP (X, (val));		\
       _FP_UNPACK_CANONICAL (E, 4, X);		\
     }						\
   while (0)
@@ -176,7 +178,7 @@
 # define FP_UNPACK_SEMIRAW_E(X, val)		\
   do						\
     {						\
-      FP_UNPACK_RAW_E (X, val);			\
+      FP_UNPACK_RAW_E (X, (val));		\
       _FP_UNPACK_SEMIRAW (E, 4, X);		\
     }						\
   while (0)
@@ -184,7 +186,7 @@
 # define FP_UNPACK_SEMIRAW_EP(X, val)		\
   do						\
     {						\
-      FP_UNPACK_RAW_EP (X, val);		\
+      FP_UNPACK_RAW_EP (X, (val));		\
       _FP_UNPACK_SEMIRAW (E, 4, X);		\
     }						\
   while (0)
@@ -193,7 +195,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (E, 4, X);		\
-      FP_PACK_RAW_E (val, X);			\
+      FP_PACK_RAW_E ((val), X);			\
     }						\
   while (0)
 
@@ -201,7 +203,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (E, 4, X);		\
-      FP_PACK_RAW_EP (val, X);			\
+      FP_PACK_RAW_EP ((val), X);		\
     }						\
   while (0)
 
@@ -209,7 +211,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (E, 4, X);		\
-      FP_PACK_RAW_E (val, X);			\
+      FP_PACK_RAW_E ((val), X);			\
     }						\
   while (0)
 
@@ -217,7 +219,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (E, 4, X);		\
-      FP_PACK_RAW_EP (val, X);			\
+      FP_PACK_RAW_EP ((val), X);		\
     }						\
   while (0)
 
@@ -230,50 +232,48 @@
 # define FP_SQRT_E(R, X)	_FP_SQRT (E, 4, R, X)
 # define FP_FMA_E(R, X, Y, Z)	_FP_FMA (E, 4, 8, R, X, Y, Z)
 
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- * This has special _E version because standard _4 square
- * root would not work (it has to start normally with the
- * second word and not the first), but as we have to do it
- * anyway, we optimize it by doing most of the calculations
- * in two UWtype registers instead of four.
- */
+/* Square root algorithms:
+   We have just one right now, maybe Newton approximation
+   should be added for those machines where division is fast.
+   This has special _E version because standard _4 square
+   root would not work (it has to start normally with the
+   second word and not the first), but as we have to do it
+   anyway, we optimize it by doing most of the calculations
+   in two UWtype registers instead of four.  */
 
 # define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
   do							\
     {							\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
       _FP_FRAC_SRL_4 (X, (_FP_WORKBITS));		\
       while (q)						\
 	{						\
-	  T##_f[1] = S##_f[1] + q;			\
+	  T##_f[1] = S##_f[1] + (q);			\
 	  if (T##_f[1] <= X##_f[1])			\
 	    {						\
-	      S##_f[1] = T##_f[1] + q;			\
+	      S##_f[1] = T##_f[1] + (q);		\
 	      X##_f[1] -= T##_f[1];			\
-	      R##_f[1] += q;				\
+	      R##_f[1] += (q);				\
 	    }						\
 	  _FP_FRAC_SLL_2 (X, 1);			\
-	  q >>= 1;					\
+	  (q) >>= 1;					\
 	}						\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
       while (q)						\
 	{						\
-	  T##_f[0] = S##_f[0] + q;			\
+	  T##_f[0] = S##_f[0] + (q);			\
 	  T##_f[1] = S##_f[1];				\
 	  if (T##_f[1] < X##_f[1]			\
 	      || (T##_f[1] == X##_f[1]			\
 		  && T##_f[0] <= X##_f[0]))		\
 	    {						\
-	      S##_f[0] = T##_f[0] + q;			\
+	      S##_f[0] = T##_f[0] + (q);		\
 	      S##_f[1] += (T##_f[0] > S##_f[0]);	\
 	      _FP_FRAC_DEC_2 (X, T);			\
-	      R##_f[0] += q;				\
+	      R##_f[0] += (q);				\
 	    }						\
 	  _FP_FRAC_SLL_2 (X, 1);			\
-	  q >>= 1;					\
+	  (q) >>= 1;					\
 	}						\
       _FP_FRAC_SLL_4 (R, (_FP_WORKBITS));		\
       if (X##_f[0] | X##_f[1])				\
@@ -287,12 +287,12 @@
     }							\
   while (0)
 
-# define FP_CMP_E(r, X, Y, un)		_FP_CMP (E, 4, r, X, Y, un)
-# define FP_CMP_EQ_E(r, X, Y)		_FP_CMP_EQ (E, 4, r, X, Y)
-# define FP_CMP_UNORD_E(r, X, Y)	_FP_CMP_UNORD (E, 4, r, X, Y)
+# define FP_CMP_E(r, X, Y, un, ex)	_FP_CMP (E, 4, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_E(r, X, Y, ex)	_FP_CMP_EQ (E, 4, (r), X, Y, (ex))
+# define FP_CMP_UNORD_E(r, X, Y, ex)	_FP_CMP_UNORD (E, 4, (r), X, Y, (ex))
 
-# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 4, r, X, rsz, rsg)
-# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 4, X, r, rs, rt)
+# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 4, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 4, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_E(X)	(X##_f[2])
 # define _FP_FRAC_HIGH_RAW_E(X)	(X##_f[1])
@@ -323,61 +323,63 @@
 # define FP_UNPACK_RAW_E(X, val)		\
   do						\
     {						\
-      union _FP_UNION_E _flo;			\
-      _flo.flt = (val);				\
+      union _FP_UNION_E FP_UNPACK_RAW_E_flo;	\
+      FP_UNPACK_RAW_E_flo.flt = (val);		\
 						\
-      X##_f0 = _flo.bits.frac;			\
+      X##_f0 = FP_UNPACK_RAW_E_flo.bits.frac;	\
       X##_f1 = 0;				\
-      X##_e = _flo.bits.exp;			\
-      X##_s = _flo.bits.sign;			\
+      X##_e = FP_UNPACK_RAW_E_flo.bits.exp;	\
+      X##_s = FP_UNPACK_RAW_E_flo.bits.sign;	\
     }						\
   while (0)
 
-# define FP_UNPACK_RAW_EP(X, val)				\
-  do								\
-    {								\
-      union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
-								\
-      X##_f0 = _flo->bits.frac;					\
-      X##_f1 = 0;						\
-      X##_e = _flo->bits.exp;					\
-      X##_s = _flo->bits.sign;					\
-    }								\
+# define FP_UNPACK_RAW_EP(X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_E *FP_UNPACK_RAW_EP_flo	\
+	= (union _FP_UNION_E *) (val);		\
+						\
+      X##_f0 = FP_UNPACK_RAW_EP_flo->bits.frac;	\
+      X##_f1 = 0;				\
+      X##_e = FP_UNPACK_RAW_EP_flo->bits.exp;	\
+      X##_s = FP_UNPACK_RAW_EP_flo->bits.sign;	\
+    }						\
   while (0)
 
 # define FP_PACK_RAW_E(val, X)			\
   do						\
     {						\
-      union _FP_UNION_E _flo;			\
+      union _FP_UNION_E FP_PACK_RAW_E_flo;	\
 						\
       if (X##_e)				\
 	X##_f0 |= _FP_IMPLBIT_E;		\
       else					\
 	X##_f0 &= ~(_FP_IMPLBIT_E);		\
-      _flo.bits.frac = X##_f0;			\
-      _flo.bits.exp  = X##_e;			\
-      _flo.bits.sign = X##_s;			\
+      FP_PACK_RAW_E_flo.bits.frac = X##_f0;	\
+      FP_PACK_RAW_E_flo.bits.exp  = X##_e;	\
+      FP_PACK_RAW_E_flo.bits.sign = X##_s;	\
 						\
-      (val) = _flo.flt;				\
+      (val) = FP_PACK_RAW_E_flo.flt;		\
     }						\
   while (0)
 
-# define FP_PACK_RAW_EP(fs, val, X)					\
-  do									\
-    {									\
-      if (!FP_INHIBIT_RESULTS)						\
-	{								\
-	  union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
-									\
-	  if (X##_e)							\
-	    X##_f0 |= _FP_IMPLBIT_E;					\
-	  else								\
-	    X##_f0 &= ~(_FP_IMPLBIT_E);					\
-	  _flo->bits.frac = X##_f0;					\
-	  _flo->bits.exp  = X##_e;					\
-	  _flo->bits.sign = X##_s;					\
-	}								\
-    }									\
+# define FP_PACK_RAW_EP(fs, val, X)			\
+  do							\
+    {							\
+      if (!FP_INHIBIT_RESULTS)				\
+	{						\
+	  union _FP_UNION_E *FP_PACK_RAW_EP_flo		\
+	    = (union _FP_UNION_E *) (val);		\
+							\
+	  if (X##_e)					\
+	    X##_f0 |= _FP_IMPLBIT_E;			\
+	  else						\
+	    X##_f0 &= ~(_FP_IMPLBIT_E);			\
+	  FP_PACK_RAW_EP_flo->bits.frac = X##_f0;	\
+	  FP_PACK_RAW_EP_flo->bits.exp  = X##_e;	\
+	  FP_PACK_RAW_EP_flo->bits.sign = X##_s;	\
+	}						\
+    }							\
   while (0)
 
 
@@ -384,7 +386,7 @@
 # define FP_UNPACK_E(X, val)			\
   do						\
     {						\
-      FP_UNPACK_RAW_E (X, val);			\
+      FP_UNPACK_RAW_E (X, (val));		\
       _FP_UNPACK_CANONICAL (E, 2, X);		\
     }						\
   while (0)
@@ -392,7 +394,7 @@
 # define FP_UNPACK_EP(X, val)			\
   do						\
     {						\
-      FP_UNPACK_RAW_EP (X, val);		\
+      FP_UNPACK_RAW_EP (X, (val));		\
       _FP_UNPACK_CANONICAL (E, 2, X);		\
     }						\
   while (0)
@@ -400,7 +402,7 @@
 # define FP_UNPACK_SEMIRAW_E(X, val)		\
   do						\
     {						\
-      FP_UNPACK_RAW_E (X, val);			\
+      FP_UNPACK_RAW_E (X, (val));		\
       _FP_UNPACK_SEMIRAW (E, 2, X);		\
     }						\
   while (0)
@@ -408,7 +410,7 @@
 # define FP_UNPACK_SEMIRAW_EP(X, val)		\
   do						\
     {						\
-      FP_UNPACK_RAW_EP (X, val);		\
+      FP_UNPACK_RAW_EP (X, (val));		\
       _FP_UNPACK_SEMIRAW (E, 2, X);		\
     }						\
   while (0)
@@ -417,7 +419,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (E, 2, X);		\
-      FP_PACK_RAW_E (val, X);			\
+      FP_PACK_RAW_E ((val), X);			\
     }						\
   while (0)
 
@@ -425,7 +427,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (E, 2, X);		\
-      FP_PACK_RAW_EP (val, X);			\
+      FP_PACK_RAW_EP ((val), X);		\
     }						\
   while (0)
 
@@ -433,7 +435,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (E, 2, X);		\
-      FP_PACK_RAW_E (val, X);			\
+      FP_PACK_RAW_E ((val), X);			\
     }						\
   while (0)
 
@@ -441,7 +443,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (E, 2, X);		\
-      FP_PACK_RAW_EP (val, X);			\
+      FP_PACK_RAW_EP ((val), X);		\
     }						\
   while (0)
 
@@ -454,30 +456,28 @@
 # define FP_SQRT_E(R, X)	_FP_SQRT (E, 2, R, X)
 # define FP_FMA_E(R, X, Y, Z)	_FP_FMA (E, 2, 4, R, X, Y, Z)
 
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- * We optimize it by doing most of the calculations
- * in one UWtype registers instead of two, although we don't
- * have to.
- */
+/* Square root algorithms:
+   We have just one right now, maybe Newton approximation
+   should be added for those machines where division is fast.
+   We optimize it by doing most of the calculations
+   in one UWtype registers instead of two, although we don't
+   have to.  */
 # define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
   do							\
     {							\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
       _FP_FRAC_SRL_2 (X, (_FP_WORKBITS));		\
       while (q)						\
 	{						\
-	  T##_f0 = S##_f0 + q;				\
+	  T##_f0 = S##_f0 + (q);			\
 	  if (T##_f0 <= X##_f0)				\
 	    {						\
-	      S##_f0 = T##_f0 + q;			\
+	      S##_f0 = T##_f0 + (q);			\
 	      X##_f0 -= T##_f0;				\
-	      R##_f0 += q;				\
+	      R##_f0 += (q);				\
 	    }						\
 	  _FP_FRAC_SLL_1 (X, 1);			\
-	  q >>= 1;					\
+	  (q) >>= 1;					\
 	}						\
       _FP_FRAC_SLL_2 (R, (_FP_WORKBITS));		\
       if (X##_f0)					\
@@ -489,12 +489,12 @@
     }							\
   while (0)
 
-# define FP_CMP_E(r, X, Y, un)		_FP_CMP (E, 2, r, X, Y, un)
-# define FP_CMP_EQ_E(r, X, Y)		_FP_CMP_EQ (E, 2, r, X, Y)
-# define FP_CMP_UNORD_E(r, X, Y)	_FP_CMP_UNORD (E, 2, r, X, Y)
+# define FP_CMP_E(r, X, Y, un, ex)	_FP_CMP (E, 2, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_E(r, X, Y, ex)	_FP_CMP_EQ (E, 2, (r), X, Y, (ex))
+# define FP_CMP_UNORD_E(r, X, Y, ex)	_FP_CMP_UNORD (E, 2, (r), X, Y, (ex))
 
-# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 2, r, X, rsz, rsg)
-# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 2, X, r, rs, rt)
+# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 2, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_E(X)	(X##_f1)
 # define _FP_FRAC_HIGH_RAW_E(X)	(X##_f0)
Index: libgcc/soft-fp/extendsfdf2.c
===================================================================
--- libgcc/soft-fp/extendsfdf2.c	(revision 216037)
+++ libgcc/soft-fp/extendsfdf2.c	(working copy)
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "single.h"
 #include "double.h"
Index: libgcc/soft-fp/extendsftf2.c
===================================================================
--- libgcc/soft-fp/extendsftf2.c	(revision 216037)
+++ libgcc/soft-fp/extendsftf2.c	(working copy)
@@ -28,6 +28,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXACT_UNDERFLOW
 #include "soft-fp.h"
 #include "single.h"
 #include "quad.h"
Index: libgcc/soft-fp/extendxftf2.c
===================================================================
--- libgcc/soft-fp/extendxftf2.c	(revision 216037)
+++ libgcc/soft-fp/extendxftf2.c	(working copy)
@@ -39,7 +39,7 @@
   FP_DECL_Q (R);
   TFtype r;
 
-  FP_INIT_ROUNDMODE;
+  FP_INIT_TRAPPING_EXCEPTIONS;
   FP_UNPACK_RAW_E (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
   FP_EXTEND (Q, E, 4, 4, R, A);
Index: libgcc/soft-fp/gedf2.c
===================================================================
--- libgcc/soft-fp/gedf2.c	(revision 216037)
+++ libgcc/soft-fp/gedf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_D (A, a);
   FP_UNPACK_RAW_D (B, b);
-  FP_CMP_D (r, A, B, -2);
-  if (r == -2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_D (r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/gesf2.c
===================================================================
--- libgcc/soft-fp/gesf2.c	(revision 216037)
+++ libgcc/soft-fp/gesf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_S (A, a);
   FP_UNPACK_RAW_S (B, b);
-  FP_CMP_S (r, A, B, -2);
-  if (r == -2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_S (r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/getf2.c
===================================================================
--- libgcc/soft-fp/getf2.c	(revision 216037)
+++ libgcc/soft-fp/getf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_Q (A, a);
   FP_UNPACK_RAW_Q (B, b);
-  FP_CMP_Q (r, A, B, -2);
-  if (r == -2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_Q (r, A, B, -2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/ledf2.c
===================================================================
--- libgcc/soft-fp/ledf2.c	(revision 216037)
+++ libgcc/soft-fp/ledf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_D (A, a);
   FP_UNPACK_RAW_D (B, b);
-  FP_CMP_D (r, A, B, 2);
-  if (r == 2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_D (r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/lesf2.c
===================================================================
--- libgcc/soft-fp/lesf2.c	(revision 216037)
+++ libgcc/soft-fp/lesf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_S (A, a);
   FP_UNPACK_RAW_S (B, b);
-  FP_CMP_S (r, A, B, 2);
-  if (r == 2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_S (r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/letf2.c
===================================================================
--- libgcc/soft-fp/letf2.c	(revision 216037)
+++ libgcc/soft-fp/letf2.c	(working copy)
@@ -42,9 +42,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_Q (A, a);
   FP_UNPACK_RAW_Q (B, b);
-  FP_CMP_Q (r, A, B, 2);
-  if (r == 2)
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_Q (r, A, B, 2, 2);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/op-1.h
===================================================================
--- libgcc/soft-fp/op-1.h	(revision 216037)
+++ libgcc/soft-fp/op-1.h	(working copy)
@@ -50,8 +50,8 @@
 #define _FP_FRAC_SRL_1(X, N)	(X##_f >>= N)
 
 /* Right shift with sticky-lsb.  */
-#define _FP_FRAC_SRST_1(X, S, N, sz)	__FP_FRAC_SRST_1 (X##_f, S, N, sz)
-#define _FP_FRAC_SRS_1(X, N, sz)	__FP_FRAC_SRS_1 (X##_f, N, sz)
+#define _FP_FRAC_SRST_1(X, S, N, sz)	__FP_FRAC_SRST_1 (X##_f, S, (N), (sz))
+#define _FP_FRAC_SRS_1(X, N, sz)	__FP_FRAC_SRS_1 (X##_f, (N), (sz))
 
 #define __FP_FRAC_SRST_1(X, S, N, sz)			\
   do							\
@@ -71,9 +71,9 @@
 #define _FP_FRAC_ADD_1(R, X, Y)	(R##_f = X##_f + Y##_f)
 #define _FP_FRAC_SUB_1(R, X, Y)	(R##_f = X##_f - Y##_f)
 #define _FP_FRAC_DEC_1(X, Y)	(X##_f -= Y##_f)
-#define _FP_FRAC_CLZ_1(z, X)	__FP_CLZ (z, X##_f)
+#define _FP_FRAC_CLZ_1(z, X)	__FP_CLZ ((z), X##_f)
 
-/* Predicates */
+/* Predicates.  */
 #define _FP_FRAC_NEGP_1(X)	((_FP_WS_TYPE) X##_f < 0)
 #define _FP_FRAC_ZEROP_1(X)	(X##_f == 0)
 #define _FP_FRAC_OVERP_1(fs, X)	(X##_f & _FP_OVERFLOW_##fs)
@@ -87,66 +87,62 @@
 #define _FP_MINFRAC_1		1
 #define _FP_MAXFRAC_1		(~(_FP_WS_TYPE) 0)
 
-/*
- * Unpack the raw bits of a native fp value.  Do not classify or
- * normalize the data.
- */
+/* Unpack the raw bits of a native fp value.  Do not classify or
+   normalize the data.  */
 
-#define _FP_UNPACK_RAW_1(fs, X, val)		\
-  do						\
-    {						\
-      union _FP_UNION_##fs _flo;		\
-      _flo.flt = (val);				\
-						\
-      X##_f = _flo.bits.frac;			\
-      X##_e = _flo.bits.exp;			\
-      X##_s = _flo.bits.sign;			\
-    }						\
+#define _FP_UNPACK_RAW_1(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs _FP_UNPACK_RAW_1_flo;	\
+      _FP_UNPACK_RAW_1_flo.flt = (val);			\
+							\
+      X##_f = _FP_UNPACK_RAW_1_flo.bits.frac;		\
+      X##_e = _FP_UNPACK_RAW_1_flo.bits.exp;		\
+      X##_s = _FP_UNPACK_RAW_1_flo.bits.sign;		\
+    }							\
   while (0)
 
-#define _FP_UNPACK_RAW_1_P(fs, X, val)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      X##_f = _flo->bits.frac;						\
-      X##_e = _flo->bits.exp;						\
-      X##_s = _flo->bits.sign;						\
-    }									\
+#define _FP_UNPACK_RAW_1_P(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_UNPACK_RAW_1_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      X##_f = _FP_UNPACK_RAW_1_P_flo->bits.frac;	\
+      X##_e = _FP_UNPACK_RAW_1_P_flo->bits.exp;		\
+      X##_s = _FP_UNPACK_RAW_1_P_flo->bits.sign;	\
+    }							\
   while (0)
 
-/*
- * Repack the raw bits of a native fp value.
- */
+/* Repack the raw bits of a native fp value.  */
 
 #define _FP_PACK_RAW_1(fs, val, X)		\
   do						\
     {						\
-      union _FP_UNION_##fs _flo;		\
+      union _FP_UNION_##fs _FP_PACK_RAW_1_flo;	\
 						\
-      _flo.bits.frac = X##_f;			\
-      _flo.bits.exp  = X##_e;			\
-      _flo.bits.sign = X##_s;			\
+      _FP_PACK_RAW_1_flo.bits.frac = X##_f;	\
+      _FP_PACK_RAW_1_flo.bits.exp  = X##_e;	\
+      _FP_PACK_RAW_1_flo.bits.sign = X##_s;	\
 						\
-      (val) = _flo.flt;				\
+      (val) = _FP_PACK_RAW_1_flo.flt;		\
     }						\
   while (0)
 
-#define _FP_PACK_RAW_1_P(fs, val, X)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      _flo->bits.frac = X##_f;						\
-      _flo->bits.exp  = X##_e;						\
-      _flo->bits.sign = X##_s;						\
-    }									\
+#define _FP_PACK_RAW_1_P(fs, val, X)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_PACK_RAW_1_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      _FP_PACK_RAW_1_P_flo->bits.frac = X##_f;		\
+      _FP_PACK_RAW_1_P_flo->bits.exp  = X##_e;		\
+      _FP_PACK_RAW_1_P_flo->bits.sign = X##_s;		\
+    }							\
   while (0)
 
 
-/*
- * Multiplication algorithms:
- */
+/* Multiplication algorithms: */
 
 /* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
    multiplication immediately.  */
@@ -161,11 +157,11 @@
 #define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y)				\
   do									\
     {									\
-      _FP_MUL_MEAT_DW_1_imm (wfracbits, R, X, Y);			\
+      _FP_MUL_MEAT_DW_1_imm ((wfracbits), R, X, Y);			\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_1 (R, wfracbits-1, 2*wfracbits);			\
+      _FP_FRAC_SRS_1 (R, (wfracbits)-1, 2*(wfracbits));			\
     }									\
   while (0)
 
@@ -181,13 +177,15 @@
 #define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit)			\
   do									\
     {									\
-      _FP_FRAC_DECL_2 (_Z);						\
-      _FP_MUL_MEAT_DW_1_wide (wfracbits, _Z, X, Y, doit);		\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_1_wide_Z);				\
+      _FP_MUL_MEAT_DW_1_wide ((wfracbits), _FP_MUL_MEAT_1_wide_Z,	\
+			      X, Y, doit);				\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_2 (_Z, wfracbits-1, 2*wfracbits);			\
-      R##_f = _Z_f0;							\
+      _FP_FRAC_SRS_2 (_FP_MUL_MEAT_1_wide_Z, (wfracbits)-1,		\
+		      2*(wfracbits));					\
+      R##_f = _FP_MUL_MEAT_1_wide_Z_f0;					\
     }									\
   while (0)
 
@@ -196,46 +194,54 @@
 #define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y)			\
   do									\
     {									\
-      _FP_W_TYPE _xh, _xl, _yh, _yl;					\
-      _FP_FRAC_DECL_2 (_a);						\
+      _FP_W_TYPE _FP_MUL_MEAT_DW_1_hard_xh, _FP_MUL_MEAT_DW_1_hard_xl;	\
+      _FP_W_TYPE _FP_MUL_MEAT_DW_1_hard_yh, _FP_MUL_MEAT_DW_1_hard_yl;	\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_1_hard_a);			\
 									\
-      /* split the words in half */					\
-      _xh = X##_f >> (_FP_W_TYPE_SIZE/2);				\
-      _xl = X##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
-      _yh = Y##_f >> (_FP_W_TYPE_SIZE/2);				\
-      _yl = Y##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
+      /* Split the words in half.  */					\
+      _FP_MUL_MEAT_DW_1_hard_xh = X##_f >> (_FP_W_TYPE_SIZE/2);		\
+      _FP_MUL_MEAT_DW_1_hard_xl						\
+	= X##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
+      _FP_MUL_MEAT_DW_1_hard_yh = Y##_f >> (_FP_W_TYPE_SIZE/2);		\
+      _FP_MUL_MEAT_DW_1_hard_yl						\
+	= Y##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
 									\
-      /* multiply the pieces */						\
-      R##_f0 = _xl * _yl;						\
-      _a_f0 = _xh * _yl;						\
-      _a_f1 = _xl * _yh;						\
-      R##_f1 = _xh * _yh;						\
+      /* Multiply the pieces.  */					\
+      R##_f0 = _FP_MUL_MEAT_DW_1_hard_xl * _FP_MUL_MEAT_DW_1_hard_yl;	\
+      _FP_MUL_MEAT_DW_1_hard_a_f0					\
+	= _FP_MUL_MEAT_DW_1_hard_xh * _FP_MUL_MEAT_DW_1_hard_yl;	\
+      _FP_MUL_MEAT_DW_1_hard_a_f1					\
+	= _FP_MUL_MEAT_DW_1_hard_xl * _FP_MUL_MEAT_DW_1_hard_yh;	\
+      R##_f1 = _FP_MUL_MEAT_DW_1_hard_xh * _FP_MUL_MEAT_DW_1_hard_yh;	\
 									\
-      /* reassemble into two full words */				\
-      if ((_a_f0 += _a_f1) < _a_f1)					\
+      /* Reassemble into two full words.  */				\
+      if ((_FP_MUL_MEAT_DW_1_hard_a_f0 += _FP_MUL_MEAT_DW_1_hard_a_f1)	\
+	  < _FP_MUL_MEAT_DW_1_hard_a_f1)				\
 	R##_f1 += (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2);		\
-      _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2);				\
-      _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2);				\
-      _FP_FRAC_ADD_2 (R, R, _a);					\
+      _FP_MUL_MEAT_DW_1_hard_a_f1					\
+	= _FP_MUL_MEAT_DW_1_hard_a_f0 >> (_FP_W_TYPE_SIZE/2);		\
+      _FP_MUL_MEAT_DW_1_hard_a_f0					\
+	= _FP_MUL_MEAT_DW_1_hard_a_f0 << (_FP_W_TYPE_SIZE/2);		\
+      _FP_FRAC_ADD_2 (R, R, _FP_MUL_MEAT_DW_1_hard_a);			\
     }									\
   while (0)
 
-#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)		\
-  do							\
-    {							\
-      _FP_FRAC_DECL_2 (_z);				\
-      _FP_MUL_MEAT_DW_1_hard (wfracbits, _z, X, Y);	\
-							\
-      /* normalize */					\
-      _FP_FRAC_SRS_2 (_z, wfracbits - 1, 2*wfracbits);	\
-      R##_f = _z_f0;					\
-    }							\
+#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)			\
+  do								\
+    {								\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_1_hard_z);			\
+      _FP_MUL_MEAT_DW_1_hard ((wfracbits),			\
+			      _FP_MUL_MEAT_1_hard_z, X, Y);	\
+								\
+      /* Normalize.  */						\
+      _FP_FRAC_SRS_2 (_FP_MUL_MEAT_1_hard_z,			\
+		      (wfracbits) - 1, 2*(wfracbits));		\
+      R##_f = _FP_MUL_MEAT_1_hard_z_f0;				\
+    }								\
   while (0)
 
 
-/*
- * Division algorithms:
- */
+/* Division algorithms: */
 
 /* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
    division immediately.  Give this macro either _FP_DIV_HELP_imm for
@@ -242,16 +248,16 @@
    C primitives or _FP_DIV_HELP_ldiv for the ISO function.  Which you
    choose will depend on what the compiler does with divrem4.  */
 
-#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)	\
-  do						\
-    {						\
-      _FP_W_TYPE _q, _r;			\
-      X##_f <<= (X##_f < Y##_f			\
-		 ? R##_e--, _FP_WFRACBITS_##fs	\
-		 : _FP_WFRACBITS_##fs - 1);	\
-      doit (_q, _r, X##_f, Y##_f);		\
-      R##_f = _q | (_r != 0);			\
-    }						\
+#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)				\
+  do									\
+    {									\
+      _FP_W_TYPE _FP_DIV_MEAT_1_imm_q, _FP_DIV_MEAT_1_imm_r;		\
+      X##_f <<= (X##_f < Y##_f						\
+		 ? R##_e--, _FP_WFRACBITS_##fs				\
+		 : _FP_WFRACBITS_##fs - 1);				\
+      doit (_FP_DIV_MEAT_1_imm_q, _FP_DIV_MEAT_1_imm_r, X##_f, Y##_f);	\
+      R##_f = _FP_DIV_MEAT_1_imm_q | (_FP_DIV_MEAT_1_imm_r != 0);	\
+    }									\
   while (0)
 
 /* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
@@ -262,70 +268,80 @@
 #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y)				\
   do									\
     {									\
-      _FP_W_TYPE _nh, _nl, _q, _r, _y;					\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_nh;				\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_nl;				\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_q;				\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_r;				\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_y;				\
 									\
       /* Normalize Y -- i.e. make the most significant bit set.  */	\
-      _y = Y##_f << _FP_WFRACXBITS_##fs;				\
+      _FP_DIV_MEAT_1_udiv_norm_y = Y##_f << _FP_WFRACXBITS_##fs;	\
 									\
       /* Shift X op correspondingly high, that is, up one full word.  */ \
       if (X##_f < Y##_f)						\
 	{								\
 	  R##_e--;							\
-	  _nl = 0;							\
-	  _nh = X##_f;							\
+	  _FP_DIV_MEAT_1_udiv_norm_nl = 0;				\
+	  _FP_DIV_MEAT_1_udiv_norm_nh = X##_f;				\
 	}								\
       else								\
 	{								\
-	  _nl = X##_f << (_FP_W_TYPE_SIZE - 1);				\
-	  _nh = X##_f >> 1;						\
+	  _FP_DIV_MEAT_1_udiv_norm_nl = X##_f << (_FP_W_TYPE_SIZE - 1);	\
+	  _FP_DIV_MEAT_1_udiv_norm_nh = X##_f >> 1;			\
 	}								\
 									\
-      udiv_qrnnd (_q, _r, _nh, _nl, _y);				\
-      R##_f = _q | (_r != 0);						\
+      udiv_qrnnd (_FP_DIV_MEAT_1_udiv_norm_q,				\
+		  _FP_DIV_MEAT_1_udiv_norm_r,				\
+		  _FP_DIV_MEAT_1_udiv_norm_nh,				\
+		  _FP_DIV_MEAT_1_udiv_norm_nl,				\
+		  _FP_DIV_MEAT_1_udiv_norm_y);				\
+      R##_f = (_FP_DIV_MEAT_1_udiv_norm_q				\
+	       | (_FP_DIV_MEAT_1_udiv_norm_r != 0));			\
     }									\
   while (0)
 
-#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y)		\
-  do							\
-    {							\
-      _FP_W_TYPE _nh, _nl, _q, _r;			\
-      if (X##_f < Y##_f)				\
-	{						\
-	  R##_e--;					\
-	  _nl = X##_f << _FP_WFRACBITS_##fs;		\
-	  _nh = X##_f >> _FP_WFRACXBITS_##fs;		\
-	}						\
-      else						\
-	{						\
-	  _nl = X##_f << (_FP_WFRACBITS_##fs - 1);	\
-	  _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);	\
-	}						\
-      udiv_qrnnd (_q, _r, _nh, _nl, Y##_f);		\
-      R##_f = _q | (_r != 0);				\
-    }							\
+#define _FP_DIV_MEAT_1_udiv(fs, R, X, Y)				\
+  do									\
+    {									\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_nh, _FP_DIV_MEAT_1_udiv_nl;	\
+      _FP_W_TYPE _FP_DIV_MEAT_1_udiv_q, _FP_DIV_MEAT_1_udiv_r;		\
+      if (X##_f < Y##_f)						\
+	{								\
+	  R##_e--;							\
+	  _FP_DIV_MEAT_1_udiv_nl = X##_f << _FP_WFRACBITS_##fs;		\
+	  _FP_DIV_MEAT_1_udiv_nh = X##_f >> _FP_WFRACXBITS_##fs;	\
+	}								\
+      else								\
+	{								\
+	  _FP_DIV_MEAT_1_udiv_nl = X##_f << (_FP_WFRACBITS_##fs - 1);	\
+	  _FP_DIV_MEAT_1_udiv_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);	\
+	}								\
+      udiv_qrnnd (_FP_DIV_MEAT_1_udiv_q, _FP_DIV_MEAT_1_udiv_r,		\
+		  _FP_DIV_MEAT_1_udiv_nh, _FP_DIV_MEAT_1_udiv_nl,	\
+		  Y##_f);						\
+      R##_f = _FP_DIV_MEAT_1_udiv_q | (_FP_DIV_MEAT_1_udiv_r != 0);	\
+    }									\
   while (0)
 
 
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
+/* Square root algorithms:
+   We have just one right now, maybe Newton approximation
+   should be added for those machines where division is fast.  */
 
 #define _FP_SQRT_MEAT_1(R, S, T, X, q)		\
   do						\
     {						\
-      while (q != _FP_WORK_ROUND)		\
+      while ((q) != _FP_WORK_ROUND)		\
 	{					\
-	  T##_f = S##_f + q;			\
+	  T##_f = S##_f + (q);			\
 	  if (T##_f <= X##_f)			\
 	    {					\
-	      S##_f = T##_f + q;		\
+	      S##_f = T##_f + (q);		\
 	      X##_f -= T##_f;			\
-	      R##_f += q;			\
+	      R##_f += (q);			\
 	    }					\
 	  _FP_FRAC_SLL_1 (X, 1);		\
-	  q >>= 1;				\
+	  (q) >>= 1;				\
 	}					\
       if (X##_f)				\
 	{					\
@@ -336,17 +352,13 @@
     }						\
   while (0)
 
-/*
- * Assembly/disassembly for converting to/from integral types.
- * No shifting or overflow handled here.
- */
+/* Assembly/disassembly for converting to/from integral types.
+   No shifting or overflow handled here.  */
 
-#define _FP_FRAC_ASSEMBLE_1(r, X, rsize)	(r = X##_f)
-#define _FP_FRAC_DISASSEMBLE_1(X, r, rsize)	(X##_f = r)
+#define _FP_FRAC_ASSEMBLE_1(r, X, rsize)	((r) = X##_f)
+#define _FP_FRAC_DISASSEMBLE_1(X, r, rsize)	(X##_f = (r))
 
 
-/*
- * Convert FP values between word sizes
- */
+/* Convert FP values between word sizes.  */
 
 #define _FP_FRAC_COPY_1_1(D, S)		(D##_f = S##_f)
Index: libgcc/soft-fp/op-2.h
===================================================================
--- libgcc/soft-fp/op-2.h	(revision 216037)
+++ libgcc/soft-fp/op-2.h	(working copy)
@@ -122,16 +122,16 @@
   do						\
     {						\
       if (X##_f1)				\
-	__FP_CLZ (R, X##_f1);			\
+	__FP_CLZ ((R), X##_f1);			\
       else					\
 	{					\
-	  __FP_CLZ (R, X##_f0);			\
-	  R += _FP_W_TYPE_SIZE;			\
+	  __FP_CLZ ((R), X##_f0);		\
+	  (R) += _FP_W_TYPE_SIZE;		\
 	}					\
     }						\
   while (0)
 
-/* Predicates */
+/* Predicates.  */
 #define _FP_FRAC_NEGP_2(X)	((_FP_WS_TYPE) X##_f1 < 0)
 #define _FP_FRAC_ZEROP_2(X)	((X##_f1 | X##_f0) == 0)
 #define _FP_FRAC_OVERP_2(fs, X)	(_FP_FRAC_HIGH_##fs (X) & _FP_OVERFLOW_##fs)
@@ -148,9 +148,7 @@
 #define _FP_MINFRAC_2		0, 1
 #define _FP_MAXFRAC_2		(~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0)
 
-/*
- * Internals
- */
+/* Internals.  */
 
 #define __FP_FRAC_SET_2(X, I1, I0)	(X##_f0 = I0, X##_f1 = I1)
 
@@ -158,11 +156,11 @@
   do						\
     {						\
       if (xh)					\
-	__FP_CLZ (R, xh);			\
+	__FP_CLZ ((R), xh);			\
       else					\
 	{					\
-	  __FP_CLZ (R, xl);			\
-	  R += _FP_W_TYPE_SIZE;			\
+	  __FP_CLZ ((R), xl);			\
+	  (R) += _FP_W_TYPE_SIZE;		\
 	}					\
     }						\
   while (0)
@@ -182,12 +180,12 @@
   (rh = xh - yh - ((rl = xl - yl) > xl))
 # endif
 # ifndef __FP_FRAC_DEC_2
-#  define __FP_FRAC_DEC_2(xh, xl, yh, yl)	\
-  do						\
-    {						\
-      UWtype _t = xl;				\
-      xh -= yh + ((xl -= yl) > _t);		\
-    }						\
+#  define __FP_FRAC_DEC_2(xh, xl, yh, yl)		\
+  do							\
+    {							\
+      UWtype __FP_FRAC_DEC_2_t = xl;			\
+      xh -= yh + ((xl -= yl) > __FP_FRAC_DEC_2_t);	\
+    }							\
   while (0)
 # endif
 
@@ -205,71 +203,67 @@
 
 #endif
 
-/*
- * Unpack the raw bits of a native fp value.  Do not classify or
- * normalize the data.
- */
+/* Unpack the raw bits of a native fp value.  Do not classify or
+   normalize the data.  */
 
-#define _FP_UNPACK_RAW_2(fs, X, val)		\
-  do						\
-    {						\
-      union _FP_UNION_##fs _flo;		\
-      _flo.flt = (val);				\
-						\
-      X##_f0 = _flo.bits.frac0;			\
-      X##_f1 = _flo.bits.frac1;			\
-      X##_e  = _flo.bits.exp;			\
-      X##_s  = _flo.bits.sign;			\
-    }						\
+#define _FP_UNPACK_RAW_2(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs _FP_UNPACK_RAW_2_flo;	\
+      _FP_UNPACK_RAW_2_flo.flt = (val);			\
+							\
+      X##_f0 = _FP_UNPACK_RAW_2_flo.bits.frac0;		\
+      X##_f1 = _FP_UNPACK_RAW_2_flo.bits.frac1;		\
+      X##_e  = _FP_UNPACK_RAW_2_flo.bits.exp;		\
+      X##_s  = _FP_UNPACK_RAW_2_flo.bits.sign;		\
+    }							\
   while (0)
 
-#define _FP_UNPACK_RAW_2_P(fs, X, val)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      X##_f0 = _flo->bits.frac0;					\
-      X##_f1 = _flo->bits.frac1;					\
-      X##_e  = _flo->bits.exp;						\
-      X##_s  = _flo->bits.sign;						\
-    }									\
+#define _FP_UNPACK_RAW_2_P(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_UNPACK_RAW_2_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      X##_f0 = _FP_UNPACK_RAW_2_P_flo->bits.frac0;	\
+      X##_f1 = _FP_UNPACK_RAW_2_P_flo->bits.frac1;	\
+      X##_e  = _FP_UNPACK_RAW_2_P_flo->bits.exp;	\
+      X##_s  = _FP_UNPACK_RAW_2_P_flo->bits.sign;	\
+    }							\
   while (0)
 
 
-/*
- * Repack the raw bits of a native fp value.
- */
+/* Repack the raw bits of a native fp value.  */
 
 #define _FP_PACK_RAW_2(fs, val, X)		\
   do						\
     {						\
-      union _FP_UNION_##fs _flo;		\
+      union _FP_UNION_##fs _FP_PACK_RAW_2_flo;	\
 						\
-      _flo.bits.frac0 = X##_f0;			\
-      _flo.bits.frac1 = X##_f1;			\
-      _flo.bits.exp   = X##_e;			\
-      _flo.bits.sign  = X##_s;			\
+      _FP_PACK_RAW_2_flo.bits.frac0 = X##_f0;	\
+      _FP_PACK_RAW_2_flo.bits.frac1 = X##_f1;	\
+      _FP_PACK_RAW_2_flo.bits.exp   = X##_e;	\
+      _FP_PACK_RAW_2_flo.bits.sign  = X##_s;	\
 						\
-      (val) = _flo.flt;				\
+      (val) = _FP_PACK_RAW_2_flo.flt;		\
     }						\
   while (0)
 
-#define _FP_PACK_RAW_2_P(fs, val, X)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      _flo->bits.frac0 = X##_f0;					\
-      _flo->bits.frac1 = X##_f1;					\
-      _flo->bits.exp   = X##_e;						\
-      _flo->bits.sign  = X##_s;						\
-    }									\
+#define _FP_PACK_RAW_2_P(fs, val, X)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_PACK_RAW_2_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      _FP_PACK_RAW_2_P_flo->bits.frac0 = X##_f0;	\
+      _FP_PACK_RAW_2_P_flo->bits.frac1 = X##_f1;	\
+      _FP_PACK_RAW_2_P_flo->bits.exp   = X##_e;		\
+      _FP_PACK_RAW_2_P_flo->bits.sign  = X##_s;		\
+    }							\
   while (0)
 
 
-/*
- * Multiplication algorithms:
- */
+/* Multiplication algorithms: */
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
 
@@ -276,20 +270,28 @@
 #define _FP_MUL_MEAT_DW_2_wide(wfracbits, R, X, Y, doit)		\
   do									\
     {									\
-      _FP_FRAC_DECL_2 (_b);						\
-      _FP_FRAC_DECL_2 (_c);						\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_b);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_c);			\
 									\
-      doit (_FP_FRAC_WORD_4 (R, 1), _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0); \
-      doit (_b_f1, _b_f0, X##_f0, Y##_f1);				\
-      doit (_c_f1, _c_f0, X##_f1, Y##_f0);				\
-      doit (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), X##_f1, Y##_f1); \
+      doit (_FP_FRAC_WORD_4 (R, 1), _FP_FRAC_WORD_4 (R, 0),		\
+	    X##_f0, Y##_f0);						\
+      doit (_FP_MUL_MEAT_DW_2_wide_b_f1, _FP_MUL_MEAT_DW_2_wide_b_f0,	\
+	    X##_f0, Y##_f1);						\
+      doit (_FP_MUL_MEAT_DW_2_wide_c_f1, _FP_MUL_MEAT_DW_2_wide_c_f0,	\
+	    X##_f1, Y##_f0);						\
+      doit (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),		\
+	    X##_f1, Y##_f1);						\
 									\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-		       _FP_FRAC_WORD_4 (R, 1), 0, _b_f1, _b_f0,		\
+		       _FP_FRAC_WORD_4 (R, 1), 0,			\
+		       _FP_MUL_MEAT_DW_2_wide_b_f1,			\
+		       _FP_MUL_MEAT_DW_2_wide_b_f0,			\
 		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
 		       _FP_FRAC_WORD_4 (R, 1));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-		       _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_4 (R, 1), 0,			\
+		       _FP_MUL_MEAT_DW_2_wide_c_f1,			\
+		       _FP_MUL_MEAT_DW_2_wide_c_f0,			\
 		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
 		       _FP_FRAC_WORD_4 (R, 1));				\
     }									\
@@ -298,16 +300,18 @@
 #define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit)			\
   do									\
     {									\
-      _FP_FRAC_DECL_4 (_z);						\
+      _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_wide_z);				\
 									\
-      _FP_MUL_MEAT_DW_2_wide (wfracbits, _z, X, Y, doit);		\
+      _FP_MUL_MEAT_DW_2_wide ((wfracbits), _FP_MUL_MEAT_2_wide_z,	\
+			      X, Y, doit);				\
 									\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
-      R##_f0 = _FP_FRAC_WORD_4 (_z, 0);					\
-      R##_f1 = _FP_FRAC_WORD_4 (_z, 1);					\
+      _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_wide_z, (wfracbits)-1,		\
+		      2*(wfracbits));					\
+      R##_f0 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_z, 0);		\
+      R##_f1 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_z, 1);		\
     }									\
   while (0)
 
@@ -318,35 +322,51 @@
 #define _FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, R, X, Y, doit)		\
   do									\
     {									\
-      _FP_FRAC_DECL_2 (_b);						\
-      _FP_FRAC_DECL_2 (_c);						\
-      _FP_W_TYPE _d;							\
-      int _c1, _c2;							\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_3mul_b);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_3mul_c);			\
+      _FP_W_TYPE _FP_MUL_MEAT_DW_2_wide_3mul_d;				\
+      int _FP_MUL_MEAT_DW_2_wide_3mul_c1;				\
+      int _FP_MUL_MEAT_DW_2_wide_3mul_c2;				\
 									\
-      _b_f0 = X##_f0 + X##_f1;						\
-      _c1 = _b_f0 < X##_f0;						\
-      _b_f1 = Y##_f0 + Y##_f1;						\
-      _c2 = _b_f1 < Y##_f0;						\
-      doit (_d, _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0);		\
-      doit (_FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1), _b_f0, _b_f1); \
-      doit (_c_f1, _c_f0, X##_f1, Y##_f1);				\
+      _FP_MUL_MEAT_DW_2_wide_3mul_b_f0 = X##_f0 + X##_f1;		\
+      _FP_MUL_MEAT_DW_2_wide_3mul_c1					\
+	= _FP_MUL_MEAT_DW_2_wide_3mul_b_f0 < X##_f0;			\
+      _FP_MUL_MEAT_DW_2_wide_3mul_b_f1 = Y##_f0 + Y##_f1;		\
+      _FP_MUL_MEAT_DW_2_wide_3mul_c2					\
+	= _FP_MUL_MEAT_DW_2_wide_3mul_b_f1 < Y##_f0;			\
+      doit (_FP_MUL_MEAT_DW_2_wide_3mul_d, _FP_FRAC_WORD_4 (R, 0),	\
+	    X##_f0, Y##_f0);						\
+      doit (_FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1),		\
+	    _FP_MUL_MEAT_DW_2_wide_3mul_b_f0,				\
+	    _FP_MUL_MEAT_DW_2_wide_3mul_b_f1);				\
+      doit (_FP_MUL_MEAT_DW_2_wide_3mul_c_f1,				\
+	    _FP_MUL_MEAT_DW_2_wide_3mul_c_f0, X##_f1, Y##_f1);		\
 									\
-      _b_f0 &= -_c2;							\
-      _b_f1 &= -_c1;							\
+      _FP_MUL_MEAT_DW_2_wide_3mul_b_f0					\
+	&= -_FP_MUL_MEAT_DW_2_wide_3mul_c2;				\
+      _FP_MUL_MEAT_DW_2_wide_3mul_b_f1					\
+	&= -_FP_MUL_MEAT_DW_2_wide_3mul_c1;				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-		       _FP_FRAC_WORD_4 (R, 1), (_c1 & _c2), 0, _d,	\
+		       _FP_FRAC_WORD_4 (R, 1),				\
+		       (_FP_MUL_MEAT_DW_2_wide_3mul_c1			\
+			& _FP_MUL_MEAT_DW_2_wide_3mul_c2), 0,		\
+		       _FP_MUL_MEAT_DW_2_wide_3mul_d,			\
 		       0, _FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1)); \
       __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-			_b_f0);						\
+			_FP_MUL_MEAT_DW_2_wide_3mul_b_f0);		\
       __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-			_b_f1);						\
+			_FP_MUL_MEAT_DW_2_wide_3mul_b_f1);		\
       __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
 		       _FP_FRAC_WORD_4 (R, 1),				\
-		       0, _d, _FP_FRAC_WORD_4 (R, 0));			\
+		       0, _FP_MUL_MEAT_DW_2_wide_3mul_d,		\
+		       _FP_FRAC_WORD_4 (R, 0));				\
       __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-		       _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0);	\
+		       _FP_FRAC_WORD_4 (R, 1), 0,			\
+		       _FP_MUL_MEAT_DW_2_wide_3mul_c_f1,		\
+		       _FP_MUL_MEAT_DW_2_wide_3mul_c_f0);		\
       __FP_FRAC_ADD_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
-		       _c_f1, _c_f0,					\
+		       _FP_MUL_MEAT_DW_2_wide_3mul_c_f1,		\
+		       _FP_MUL_MEAT_DW_2_wide_3mul_c_f0,		\
 		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2));	\
     }									\
   while (0)
@@ -354,16 +374,19 @@
 #define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit)		\
   do									\
     {									\
-      _FP_FRAC_DECL_4 (_z);						\
+      _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_wide_3mul_z);			\
 									\
-      _FP_MUL_MEAT_DW_2_wide_3mul (wfracbits, _z, X, Y, doit);		\
+      _FP_MUL_MEAT_DW_2_wide_3mul ((wfracbits),				\
+				   _FP_MUL_MEAT_2_wide_3mul_z,		\
+				   X, Y, doit);				\
 									\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
-      R##_f0 = _FP_FRAC_WORD_4 (_z, 0);					\
-      R##_f1 = _FP_FRAC_WORD_4 (_z, 1);					\
+      _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_wide_3mul_z,			\
+		      (wfracbits)-1, 2*(wfracbits));			\
+      R##_f0 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_3mul_z, 0);		\
+      R##_f1 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_3mul_z, 1);		\
     }									\
   while (0)
 
@@ -370,13 +393,15 @@
 #define _FP_MUL_MEAT_DW_2_gmp(wfracbits, R, X, Y)	\
   do							\
     {							\
-      _FP_W_TYPE _x[2], _y[2];				\
-      _x[0] = X##_f0;					\
-      _x[1] = X##_f1;					\
-      _y[0] = Y##_f0;					\
-      _y[1] = Y##_f1;					\
+      _FP_W_TYPE _FP_MUL_MEAT_DW_2_gmp_x[2];		\
+      _FP_W_TYPE _FP_MUL_MEAT_DW_2_gmp_y[2];		\
+      _FP_MUL_MEAT_DW_2_gmp_x[0] = X##_f0;		\
+      _FP_MUL_MEAT_DW_2_gmp_x[1] = X##_f1;		\
+      _FP_MUL_MEAT_DW_2_gmp_y[0] = Y##_f0;		\
+      _FP_MUL_MEAT_DW_2_gmp_y[1] = Y##_f1;		\
 							\
-      mpn_mul_n (R##_f, _x, _y, 2);			\
+      mpn_mul_n (R##_f, _FP_MUL_MEAT_DW_2_gmp_x,	\
+		 _FP_MUL_MEAT_DW_2_gmp_y, 2);		\
     }							\
   while (0)
 
@@ -383,16 +408,17 @@
 #define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)				\
   do									\
     {									\
-      _FP_FRAC_DECL_4 (_z);						\
+      _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_gmp_z);				\
 									\
-      _FP_MUL_MEAT_DW_2_gmp (wfracbits, _z, X, Y);			\
+      _FP_MUL_MEAT_DW_2_gmp ((wfracbits), _FP_MUL_MEAT_2_gmp_z, X, Y);	\
 									\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
-      R##_f0 = _z_f[0];							\
-      R##_f1 = _z_f[1];							\
+      _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_gmp_z, (wfracbits)-1,		\
+		      2*(wfracbits));					\
+      R##_f0 = _FP_MUL_MEAT_2_gmp_z_f[0];				\
+      R##_f1 = _FP_MUL_MEAT_2_gmp_z_f[1];				\
     }									\
   while (0)
 
@@ -428,7 +454,7 @@
 				       _p240, _q240, _r240, _s240;	\
       UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;		\
 									\
-      if (wfracbits < 106 || wfracbits > 120)				\
+      if ((wfracbits) < 106 || (wfracbits) > 120)			\
 	abort ();							\
 									\
       setfetz;								\
@@ -500,74 +526,96 @@
     }									\
   while (0)
 
-/*
- * Division algorithms:
- */
+/* Division algorithms: */
 
 #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)				\
   do									\
     {									\
-      _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;	\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f2;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f1;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f0;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_r_f1;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_r_f0;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_m_f1;				\
+      _FP_W_TYPE _FP_DIV_MEAT_2_udiv_m_f0;				\
       if (_FP_FRAC_GE_2 (X, Y))						\
 	{								\
-	  _n_f2 = X##_f1 >> 1;						\
-	  _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;	\
-	  _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1);			\
+	  _FP_DIV_MEAT_2_udiv_n_f2 = X##_f1 >> 1;			\
+	  _FP_DIV_MEAT_2_udiv_n_f1					\
+	    = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;		\
+	  _FP_DIV_MEAT_2_udiv_n_f0					\
+	    = X##_f0 << (_FP_W_TYPE_SIZE - 1);				\
 	}								\
       else								\
 	{								\
 	  R##_e--;							\
-	  _n_f2 = X##_f1;						\
-	  _n_f1 = X##_f0;						\
-	  _n_f0 = 0;							\
+	  _FP_DIV_MEAT_2_udiv_n_f2 = X##_f1;				\
+	  _FP_DIV_MEAT_2_udiv_n_f1 = X##_f0;				\
+	  _FP_DIV_MEAT_2_udiv_n_f0 = 0;					\
 	}								\
 									\
       /* Normalize, i.e. make the most significant bit of the		\
-	 denominator set. */						\
+	 denominator set.  */						\
       _FP_FRAC_SLL_2 (Y, _FP_WFRACXBITS_##fs);				\
 									\
-      udiv_qrnnd (R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1);			\
-      umul_ppmm (_m_f1, _m_f0, R##_f1, Y##_f0);				\
-      _r_f0 = _n_f0;							\
-      if (_FP_FRAC_GT_2 (_m, _r))					\
+      udiv_qrnnd (R##_f1, _FP_DIV_MEAT_2_udiv_r_f1,			\
+		  _FP_DIV_MEAT_2_udiv_n_f2, _FP_DIV_MEAT_2_udiv_n_f1,	\
+		  Y##_f1);						\
+      umul_ppmm (_FP_DIV_MEAT_2_udiv_m_f1, _FP_DIV_MEAT_2_udiv_m_f0,	\
+		 R##_f1, Y##_f0);					\
+      _FP_DIV_MEAT_2_udiv_r_f0 = _FP_DIV_MEAT_2_udiv_n_f0;		\
+      if (_FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m, _FP_DIV_MEAT_2_udiv_r))	\
 	{								\
 	  R##_f1--;							\
-	  _FP_FRAC_ADD_2 (_r, Y, _r);					\
-	  if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r))		\
+	  _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y,			\
+			  _FP_DIV_MEAT_2_udiv_r);			\
+	  if (_FP_FRAC_GE_2 (_FP_DIV_MEAT_2_udiv_r, Y)			\
+	      && _FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m,			\
+				_FP_DIV_MEAT_2_udiv_r))			\
 	    {								\
 	      R##_f1--;							\
-	      _FP_FRAC_ADD_2 (_r, Y, _r);				\
+	      _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y,			\
+			      _FP_DIV_MEAT_2_udiv_r);			\
 	    }								\
 	}								\
-      _FP_FRAC_DEC_2 (_r, _m);						\
+      _FP_FRAC_DEC_2 (_FP_DIV_MEAT_2_udiv_r, _FP_DIV_MEAT_2_udiv_m);	\
 									\
-      if (_r_f1 == Y##_f1)						\
+      if (_FP_DIV_MEAT_2_udiv_r_f1 == Y##_f1)				\
 	{								\
 	  /* This is a special case, not an optimization		\
-	     (_r/Y##_f1 would not fit into UWtype).			\
-	     As _r is guaranteed to be < Y,  R##_f0 can be either	\
-	     (UWtype)-1 or (UWtype)-2.  But as we know what kind	\
-	     of bits it is (sticky, guard, round),  we don't care.	\
-	     We also don't care what the reminder is,  because the	\
-	     guard bit will be set anyway.  -jj */			\
+	     (_FP_DIV_MEAT_2_udiv_r/Y##_f1 would not fit into UWtype).	\
+	     As _FP_DIV_MEAT_2_udiv_r is guaranteed to be < Y,		\
+	     R##_f0 can be either (UWtype)-1 or (UWtype)-2.  But as we	\
+	     know what kind of bits it is (sticky, guard, round),	\
+	     we don't care.  We also don't care what the reminder is,	\
+	     because the guard bit will be set anyway.  -jj */		\
 	  R##_f0 = -1;							\
 	}								\
       else								\
 	{								\
-	  udiv_qrnnd (R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1);		\
-	  umul_ppmm (_m_f1, _m_f0, R##_f0, Y##_f0);			\
-	  _r_f0 = 0;							\
-	  if (_FP_FRAC_GT_2 (_m, _r))					\
+	  udiv_qrnnd (R##_f0, _FP_DIV_MEAT_2_udiv_r_f1,			\
+		      _FP_DIV_MEAT_2_udiv_r_f1,				\
+		      _FP_DIV_MEAT_2_udiv_r_f0, Y##_f1);		\
+	  umul_ppmm (_FP_DIV_MEAT_2_udiv_m_f1,				\
+		     _FP_DIV_MEAT_2_udiv_m_f0, R##_f0, Y##_f0);		\
+	  _FP_DIV_MEAT_2_udiv_r_f0 = 0;					\
+	  if (_FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m,			\
+			     _FP_DIV_MEAT_2_udiv_r))			\
 	    {								\
 	      R##_f0--;							\
-	      _FP_FRAC_ADD_2 (_r, Y, _r);				\
-	      if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r))	\
+	      _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y,			\
+			      _FP_DIV_MEAT_2_udiv_r);			\
+	      if (_FP_FRAC_GE_2 (_FP_DIV_MEAT_2_udiv_r, Y)		\
+		  && _FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m,		\
+				    _FP_DIV_MEAT_2_udiv_r))		\
 		{							\
 		  R##_f0--;						\
-		  _FP_FRAC_ADD_2 (_r, Y, _r);				\
+		  _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y,		\
+				  _FP_DIV_MEAT_2_udiv_r);		\
 		}							\
 	    }								\
-	  if (!_FP_FRAC_EQ_2 (_r, _m))					\
+	  if (!_FP_FRAC_EQ_2 (_FP_DIV_MEAT_2_udiv_r,			\
+			      _FP_DIV_MEAT_2_udiv_m))			\
 	    R##_f0 |= _FP_WORK_STICKY;					\
 	}								\
     }									\
@@ -574,11 +622,9 @@
   while (0)
 
 
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
+/* Square root algorithms:
+   We have just one right now, maybe Newton approximation
+   should be added for those machines where division is fast.  */
 
 #define _FP_SQRT_MEAT_2(R, S, T, X, q)				\
   do								\
@@ -585,31 +631,31 @@
     {								\
       while (q)							\
 	{							\
-	  T##_f1 = S##_f1 + q;					\
+	  T##_f1 = S##_f1 + (q);				\
 	  if (T##_f1 <= X##_f1)					\
 	    {							\
-	      S##_f1 = T##_f1 + q;				\
+	      S##_f1 = T##_f1 + (q);				\
 	      X##_f1 -= T##_f1;					\
-	      R##_f1 += q;					\
+	      R##_f1 += (q);					\
 	    }							\
 	  _FP_FRAC_SLL_2 (X, 1);				\
-	  q >>= 1;						\
+	  (q) >>= 1;						\
 	}							\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);		\
-      while (q != _FP_WORK_ROUND)				\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);		\
+      while ((q) != _FP_WORK_ROUND)				\
 	{							\
-	  T##_f0 = S##_f0 + q;					\
+	  T##_f0 = S##_f0 + (q);				\
 	  T##_f1 = S##_f1;					\
 	  if (T##_f1 < X##_f1					\
 	      || (T##_f1 == X##_f1 && T##_f0 <= X##_f0))	\
 	    {							\
-	      S##_f0 = T##_f0 + q;				\
+	      S##_f0 = T##_f0 + (q);				\
 	      S##_f1 += (T##_f0 > S##_f0);			\
 	      _FP_FRAC_DEC_2 (X, T);				\
-	      R##_f0 += q;					\
+	      R##_f0 += (q);					\
 	    }							\
 	  _FP_FRAC_SLL_2 (X, 1);				\
-	  q >>= 1;						\
+	  (q) >>= 1;						\
 	}							\
       if (X##_f0 | X##_f1)					\
 	{							\
@@ -622,31 +668,29 @@
   while (0)
 
 
-/*
- * Assembly/disassembly for converting to/from integral types.
- * No shifting or overflow handled here.
- */
+/* Assembly/disassembly for converting to/from integral types.
+   No shifting or overflow handled here.  */
 
 #define _FP_FRAC_ASSEMBLE_2(r, X, rsize)	\
-  (void) ((rsize <= _FP_W_TYPE_SIZE)		\
-	  ? ({ r = X##_f0; })			\
+  (void) (((rsize) <= _FP_W_TYPE_SIZE)		\
+	  ? ({ (r) = X##_f0; })			\
 	  : ({					\
-	      r = X##_f1;			\
-	      r <<= _FP_W_TYPE_SIZE;		\
-	      r += X##_f0;			\
+	      (r) = X##_f1;			\
+	      (r) <<= _FP_W_TYPE_SIZE;		\
+	      (r) += X##_f0;			\
 	    }))
 
-#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)				\
-  do									\
-    {									\
-      X##_f0 = r;							\
-      X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
-    }									\
+#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)	\
+  do						\
+    {						\
+      X##_f0 = (r);				\
+      X##_f1 = ((rsize) <= _FP_W_TYPE_SIZE	\
+		? 0				\
+		: (r) >> _FP_W_TYPE_SIZE);	\
+    }						\
   while (0)
 
-/*
- * Convert FP values between word sizes
- */
+/* Convert FP values between word sizes.  */
 
 #define _FP_FRAC_COPY_1_2(D, S)		(D##_f = S##_f0)
 
Index: libgcc/soft-fp/op-4.h
===================================================================
--- libgcc/soft-fp/op-4.h	(revision 216037)
+++ libgcc/soft-fp/op-4.h	(working copy)
@@ -39,91 +39,121 @@
 #define _FP_FRAC_LOW_4(X)	(X##_f[0])
 #define _FP_FRAC_WORD_4(X, w)	(X##_f[w])
 
-#define _FP_FRAC_SLL_4(X, N)				\
-  do							\
-    {							\
-      _FP_I_TYPE _up, _down, _skip, _i;			\
-      _skip = (N) / _FP_W_TYPE_SIZE;			\
-      _up = (N) % _FP_W_TYPE_SIZE;			\
-      _down = _FP_W_TYPE_SIZE - _up;			\
-      if (!_up)						\
-	for (_i = 3; _i >= _skip; --_i)			\
-	  X##_f[_i] = X##_f[_i-_skip];			\
-      else						\
-	{						\
-	  for (_i = 3; _i > _skip; --_i)		\
-	    X##_f[_i] = (X##_f[_i-_skip] << _up		\
-			 | X##_f[_i-_skip-1] >> _down);	\
-	  X##_f[_i--] = X##_f[0] << _up;		\
-	}						\
-      for (; _i >= 0; --_i)				\
-	X##_f[_i] = 0;					\
-    }							\
+#define _FP_FRAC_SLL_4(X, N)						\
+  do									\
+    {									\
+      _FP_I_TYPE _FP_FRAC_SLL_4_up, _FP_FRAC_SLL_4_down;		\
+      _FP_I_TYPE _FP_FRAC_SLL_4_skip, _FP_FRAC_SLL_4_i;			\
+      _FP_FRAC_SLL_4_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SLL_4_up = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SLL_4_down = _FP_W_TYPE_SIZE - _FP_FRAC_SLL_4_up;	\
+      if (!_FP_FRAC_SLL_4_up)						\
+	for (_FP_FRAC_SLL_4_i = 3;					\
+	     _FP_FRAC_SLL_4_i >= _FP_FRAC_SLL_4_skip;			\
+	     --_FP_FRAC_SLL_4_i)					\
+	  X##_f[_FP_FRAC_SLL_4_i]					\
+	    = X##_f[_FP_FRAC_SLL_4_i-_FP_FRAC_SLL_4_skip];		\
+      else								\
+	{								\
+	  for (_FP_FRAC_SLL_4_i = 3;					\
+	       _FP_FRAC_SLL_4_i > _FP_FRAC_SLL_4_skip;			\
+	       --_FP_FRAC_SLL_4_i)					\
+	    X##_f[_FP_FRAC_SLL_4_i]					\
+	      = ((X##_f[_FP_FRAC_SLL_4_i-_FP_FRAC_SLL_4_skip]		\
+		  << _FP_FRAC_SLL_4_up)					\
+		 | (X##_f[_FP_FRAC_SLL_4_i-_FP_FRAC_SLL_4_skip-1]	\
+		    >> _FP_FRAC_SLL_4_down));				\
+	  X##_f[_FP_FRAC_SLL_4_i--] = X##_f[0] << _FP_FRAC_SLL_4_up;	\
+	}								\
+      for (; _FP_FRAC_SLL_4_i >= 0; --_FP_FRAC_SLL_4_i)			\
+	X##_f[_FP_FRAC_SLL_4_i] = 0;					\
+    }									\
   while (0)
 
-/* This one was broken too */
-#define _FP_FRAC_SRL_4(X, N)				\
-  do							\
-    {							\
-      _FP_I_TYPE _up, _down, _skip, _i;			\
-      _skip = (N) / _FP_W_TYPE_SIZE;			\
-      _down = (N) % _FP_W_TYPE_SIZE;			\
-      _up = _FP_W_TYPE_SIZE - _down;			\
-      if (!_down)					\
-	for (_i = 0; _i <= 3-_skip; ++_i)		\
-	  X##_f[_i] = X##_f[_i+_skip];			\
-      else						\
-	{						\
-	  for (_i = 0; _i < 3-_skip; ++_i)		\
-	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
-			 | X##_f[_i+_skip+1] << _up);	\
-	  X##_f[_i++] = X##_f[3] >> _down;		\
-	}						\
-      for (; _i < 4; ++_i)				\
-	X##_f[_i] = 0;					\
-    }							\
+/* This one was broken too.  */
+#define _FP_FRAC_SRL_4(X, N)						\
+  do									\
+    {									\
+      _FP_I_TYPE _FP_FRAC_SRL_4_up, _FP_FRAC_SRL_4_down;		\
+      _FP_I_TYPE _FP_FRAC_SRL_4_skip, _FP_FRAC_SRL_4_i;			\
+      _FP_FRAC_SRL_4_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRL_4_down = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRL_4_up = _FP_W_TYPE_SIZE - _FP_FRAC_SRL_4_down;	\
+      if (!_FP_FRAC_SRL_4_down)						\
+	for (_FP_FRAC_SRL_4_i = 0;					\
+	     _FP_FRAC_SRL_4_i <= 3-_FP_FRAC_SRL_4_skip;			\
+	     ++_FP_FRAC_SRL_4_i)					\
+	  X##_f[_FP_FRAC_SRL_4_i]					\
+	    = X##_f[_FP_FRAC_SRL_4_i+_FP_FRAC_SRL_4_skip];		\
+      else								\
+	{								\
+	  for (_FP_FRAC_SRL_4_i = 0;					\
+	       _FP_FRAC_SRL_4_i < 3-_FP_FRAC_SRL_4_skip;		\
+	       ++_FP_FRAC_SRL_4_i)					\
+	    X##_f[_FP_FRAC_SRL_4_i]					\
+	      = ((X##_f[_FP_FRAC_SRL_4_i+_FP_FRAC_SRL_4_skip]		\
+		  >> _FP_FRAC_SRL_4_down)				\
+		 | (X##_f[_FP_FRAC_SRL_4_i+_FP_FRAC_SRL_4_skip+1]	\
+		    << _FP_FRAC_SRL_4_up));				\
+	  X##_f[_FP_FRAC_SRL_4_i++] = X##_f[3] >> _FP_FRAC_SRL_4_down;	\
+	}								\
+      for (; _FP_FRAC_SRL_4_i < 4; ++_FP_FRAC_SRL_4_i)			\
+	X##_f[_FP_FRAC_SRL_4_i] = 0;					\
+    }									\
   while (0)
 
 
 /* Right shift with sticky-lsb.
- * What this actually means is that we do a standard right-shift,
- * but that if any of the bits that fall off the right hand side
- * were one then we always set the LSbit.
- */
-#define _FP_FRAC_SRST_4(X, S, N, size)			\
-  do							\
-    {							\
-      _FP_I_TYPE _up, _down, _skip, _i;			\
-      _FP_W_TYPE _s;					\
-      _skip = (N) / _FP_W_TYPE_SIZE;			\
-      _down = (N) % _FP_W_TYPE_SIZE;			\
-      _up = _FP_W_TYPE_SIZE - _down;			\
-      for (_s = _i = 0; _i < _skip; ++_i)		\
-	_s |= X##_f[_i];				\
-      if (!_down)					\
-	for (_i = 0; _i <= 3-_skip; ++_i)		\
-	  X##_f[_i] = X##_f[_i+_skip];			\
-      else						\
-	{						\
-	  _s |= X##_f[_i] << _up;			\
-	  for (_i = 0; _i < 3-_skip; ++_i)		\
-	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
-			 | X##_f[_i+_skip+1] << _up);	\
-	  X##_f[_i++] = X##_f[3] >> _down;		\
-	}						\
-      for (; _i < 4; ++_i)				\
-	X##_f[_i] = 0;					\
-      S = (_s != 0);					\
-    }							\
+   What this actually means is that we do a standard right-shift,
+   but that if any of the bits that fall off the right hand side
+   were one then we always set the LSbit.  */
+#define _FP_FRAC_SRST_4(X, S, N, size)					\
+  do									\
+    {									\
+      _FP_I_TYPE _FP_FRAC_SRST_4_up, _FP_FRAC_SRST_4_down;		\
+      _FP_I_TYPE _FP_FRAC_SRST_4_skip, _FP_FRAC_SRST_4_i;		\
+      _FP_W_TYPE _FP_FRAC_SRST_4_s;					\
+      _FP_FRAC_SRST_4_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRST_4_down = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRST_4_up = _FP_W_TYPE_SIZE - _FP_FRAC_SRST_4_down;	\
+      for (_FP_FRAC_SRST_4_s = _FP_FRAC_SRST_4_i = 0;			\
+	   _FP_FRAC_SRST_4_i < _FP_FRAC_SRST_4_skip;			\
+	   ++_FP_FRAC_SRST_4_i)						\
+	_FP_FRAC_SRST_4_s |= X##_f[_FP_FRAC_SRST_4_i];			\
+      if (!_FP_FRAC_SRST_4_down)					\
+	for (_FP_FRAC_SRST_4_i = 0;					\
+	     _FP_FRAC_SRST_4_i <= 3-_FP_FRAC_SRST_4_skip;		\
+	     ++_FP_FRAC_SRST_4_i)					\
+	  X##_f[_FP_FRAC_SRST_4_i]					\
+	    = X##_f[_FP_FRAC_SRST_4_i+_FP_FRAC_SRST_4_skip];		\
+      else								\
+	{								\
+	  _FP_FRAC_SRST_4_s						\
+	    |= X##_f[_FP_FRAC_SRST_4_i] << _FP_FRAC_SRST_4_up;		\
+	  for (_FP_FRAC_SRST_4_i = 0;					\
+	       _FP_FRAC_SRST_4_i < 3-_FP_FRAC_SRST_4_skip;		\
+	       ++_FP_FRAC_SRST_4_i)					\
+	    X##_f[_FP_FRAC_SRST_4_i]					\
+	      = ((X##_f[_FP_FRAC_SRST_4_i+_FP_FRAC_SRST_4_skip]		\
+		  >> _FP_FRAC_SRST_4_down)				\
+		 | (X##_f[_FP_FRAC_SRST_4_i+_FP_FRAC_SRST_4_skip+1]	\
+		    << _FP_FRAC_SRST_4_up));				\
+	  X##_f[_FP_FRAC_SRST_4_i++]					\
+	    = X##_f[3] >> _FP_FRAC_SRST_4_down;				\
+	}								\
+      for (; _FP_FRAC_SRST_4_i < 4; ++_FP_FRAC_SRST_4_i)		\
+	X##_f[_FP_FRAC_SRST_4_i] = 0;					\
+      S = (_FP_FRAC_SRST_4_s != 0);					\
+    }									\
   while (0)
 
-#define _FP_FRAC_SRS_4(X, N, size)		\
-  do						\
-    {						\
-      int _sticky;				\
-      _FP_FRAC_SRST_4 (X, _sticky, N, size);	\
-      X##_f[0] |= _sticky;			\
-    }						\
+#define _FP_FRAC_SRS_4(X, N, size)				\
+  do								\
+    {								\
+      int _FP_FRAC_SRS_4_sticky;				\
+      _FP_FRAC_SRST_4 (X, _FP_FRAC_SRS_4_sticky, (N), (size));	\
+      X##_f[0] |= _FP_FRAC_SRS_4_sticky;			\
+    }								\
   while (0)
 
 #define _FP_FRAC_ADD_4(R, X, Y)					\
@@ -181,85 +211,85 @@
   do						\
     {						\
       if (X##_f[3])				\
-	__FP_CLZ (R, X##_f[3]);			\
+	__FP_CLZ ((R), X##_f[3]);		\
       else if (X##_f[2])			\
 	{					\
-	  __FP_CLZ (R, X##_f[2]);		\
-	  R += _FP_W_TYPE_SIZE;			\
+	  __FP_CLZ ((R), X##_f[2]);		\
+	  (R) += _FP_W_TYPE_SIZE;		\
 	}					\
       else if (X##_f[1])			\
 	{					\
-	  __FP_CLZ (R, X##_f[1]);		\
-	  R += _FP_W_TYPE_SIZE*2;		\
+	  __FP_CLZ ((R), X##_f[1]);		\
+	  (R) += _FP_W_TYPE_SIZE*2;		\
 	}					\
       else					\
 	{					\
-	  __FP_CLZ (R, X##_f[0]);		\
-	  R += _FP_W_TYPE_SIZE*3;		\
+	  __FP_CLZ ((R), X##_f[0]);		\
+	  (R) += _FP_W_TYPE_SIZE*3;		\
 	}					\
     }						\
   while (0)
 
 
-#define _FP_UNPACK_RAW_4(fs, X, val)		\
-  do						\
-    {						\
-      union _FP_UNION_##fs _flo;		\
-      _flo.flt = (val);				\
-      X##_f[0] = _flo.bits.frac0;		\
-      X##_f[1] = _flo.bits.frac1;		\
-      X##_f[2] = _flo.bits.frac2;		\
-      X##_f[3] = _flo.bits.frac3;		\
-      X##_e  = _flo.bits.exp;			\
-      X##_s  = _flo.bits.sign;			\
-    }						\
+#define _FP_UNPACK_RAW_4(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs _FP_UNPACK_RAW_4_flo;	\
+      _FP_UNPACK_RAW_4_flo.flt = (val);			\
+      X##_f[0] = _FP_UNPACK_RAW_4_flo.bits.frac0;	\
+      X##_f[1] = _FP_UNPACK_RAW_4_flo.bits.frac1;	\
+      X##_f[2] = _FP_UNPACK_RAW_4_flo.bits.frac2;	\
+      X##_f[3] = _FP_UNPACK_RAW_4_flo.bits.frac3;	\
+      X##_e  = _FP_UNPACK_RAW_4_flo.bits.exp;		\
+      X##_s  = _FP_UNPACK_RAW_4_flo.bits.sign;		\
+    }							\
   while (0)
 
-#define _FP_UNPACK_RAW_4_P(fs, X, val)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      X##_f[0] = _flo->bits.frac0;					\
-      X##_f[1] = _flo->bits.frac1;					\
-      X##_f[2] = _flo->bits.frac2;					\
-      X##_f[3] = _flo->bits.frac3;					\
-      X##_e  = _flo->bits.exp;						\
-      X##_s  = _flo->bits.sign;						\
-    }									\
+#define _FP_UNPACK_RAW_4_P(fs, X, val)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_UNPACK_RAW_4_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      X##_f[0] = _FP_UNPACK_RAW_4_P_flo->bits.frac0;	\
+      X##_f[1] = _FP_UNPACK_RAW_4_P_flo->bits.frac1;	\
+      X##_f[2] = _FP_UNPACK_RAW_4_P_flo->bits.frac2;	\
+      X##_f[3] = _FP_UNPACK_RAW_4_P_flo->bits.frac3;	\
+      X##_e  = _FP_UNPACK_RAW_4_P_flo->bits.exp;	\
+      X##_s  = _FP_UNPACK_RAW_4_P_flo->bits.sign;	\
+    }							\
   while (0)
 
 #define _FP_PACK_RAW_4(fs, val, X)		\
   do						\
     {						\
-      union _FP_UNION_##fs _flo;		\
-      _flo.bits.frac0 = X##_f[0];		\
-      _flo.bits.frac1 = X##_f[1];		\
-      _flo.bits.frac2 = X##_f[2];		\
-      _flo.bits.frac3 = X##_f[3];		\
-      _flo.bits.exp   = X##_e;			\
-      _flo.bits.sign  = X##_s;			\
-      (val) = _flo.flt;				\
+      union _FP_UNION_##fs _FP_PACK_RAW_4_flo;	\
+      _FP_PACK_RAW_4_flo.bits.frac0 = X##_f[0];	\
+      _FP_PACK_RAW_4_flo.bits.frac1 = X##_f[1];	\
+      _FP_PACK_RAW_4_flo.bits.frac2 = X##_f[2];	\
+      _FP_PACK_RAW_4_flo.bits.frac3 = X##_f[3];	\
+      _FP_PACK_RAW_4_flo.bits.exp   = X##_e;	\
+      _FP_PACK_RAW_4_flo.bits.sign  = X##_s;	\
+      (val) = _FP_PACK_RAW_4_flo.flt;		\
     }						\
   while (0)
 
-#define _FP_PACK_RAW_4_P(fs, val, X)					\
-  do									\
-    {									\
-      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
-									\
-      _flo->bits.frac0 = X##_f[0];					\
-      _flo->bits.frac1 = X##_f[1];					\
-      _flo->bits.frac2 = X##_f[2];					\
-      _flo->bits.frac3 = X##_f[3];					\
-      _flo->bits.exp   = X##_e;						\
-      _flo->bits.sign  = X##_s;						\
-    }									\
+#define _FP_PACK_RAW_4_P(fs, val, X)			\
+  do							\
+    {							\
+      union _FP_UNION_##fs *_FP_PACK_RAW_4_P_flo	\
+	= (union _FP_UNION_##fs *) (val);		\
+							\
+      _FP_PACK_RAW_4_P_flo->bits.frac0 = X##_f[0];	\
+      _FP_PACK_RAW_4_P_flo->bits.frac1 = X##_f[1];	\
+      _FP_PACK_RAW_4_P_flo->bits.frac2 = X##_f[2];	\
+      _FP_PACK_RAW_4_P_flo->bits.frac3 = X##_f[3];	\
+      _FP_PACK_RAW_4_P_flo->bits.exp   = X##_e;		\
+      _FP_PACK_RAW_4_P_flo->bits.sign  = X##_s;		\
+    }							\
   while (0)
 
-/*
- * Multiplication algorithms:
- */
+/* Multiplication algorithms: */
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
 
@@ -266,81 +296,126 @@
 #define _FP_MUL_MEAT_DW_4_wide(wfracbits, R, X, Y, doit)		\
   do									\
     {									\
-      _FP_FRAC_DECL_2 (_b);						\
-      _FP_FRAC_DECL_2 (_c);						\
-      _FP_FRAC_DECL_2 (_d);						\
-      _FP_FRAC_DECL_2 (_e);						\
-      _FP_FRAC_DECL_2 (_f);						\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_4_wide_b);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_4_wide_c);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_4_wide_d);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_4_wide_e);			\
+      _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_4_wide_f);			\
 									\
-      doit (_FP_FRAC_WORD_8 (R, 1), _FP_FRAC_WORD_8 (R, 0), X##_f[0], Y##_f[0]); \
-      doit (_b_f1, _b_f0, X##_f[0], Y##_f[1]);				\
-      doit (_c_f1, _c_f0, X##_f[1], Y##_f[0]);				\
-      doit (_d_f1, _d_f0, X##_f[1], Y##_f[1]);				\
-      doit (_e_f1, _e_f0, X##_f[0], Y##_f[2]);				\
-      doit (_f_f1, _f_f0, X##_f[2], Y##_f[0]);				\
+      doit (_FP_FRAC_WORD_8 (R, 1), _FP_FRAC_WORD_8 (R, 0),		\
+	    X##_f[0], Y##_f[0]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_b_f1, _FP_MUL_MEAT_DW_4_wide_b_f0,	\
+	    X##_f[0], Y##_f[1]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_c_f1, _FP_MUL_MEAT_DW_4_wide_c_f0,	\
+	    X##_f[1], Y##_f[0]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_d_f1, _FP_MUL_MEAT_DW_4_wide_d_f0,	\
+	    X##_f[1], Y##_f[1]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_e_f1, _FP_MUL_MEAT_DW_4_wide_e_f0,	\
+	    X##_f[0], Y##_f[2]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_f_f1, _FP_MUL_MEAT_DW_4_wide_f_f0,	\
+	    X##_f[2], Y##_f[0]);					\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
-		       _FP_FRAC_WORD_8 (R, 1), 0, _b_f1, _b_f0,		\
+		       _FP_FRAC_WORD_8 (R, 1), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f0,			\
 		       0, 0, _FP_FRAC_WORD_8 (R, 1));			\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
-		       _FP_FRAC_WORD_8 (R, 1), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 1), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f0,			\
 		       _FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
 		       _FP_FRAC_WORD_8 (R, 1));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
-		       _FP_FRAC_WORD_8 (R, 2), 0, _d_f1, _d_f0,		\
+		       _FP_FRAC_WORD_8 (R, 2), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f0,			\
 		       0, _FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2)); \
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
-		       _FP_FRAC_WORD_8 (R, 2), 0, _e_f1, _e_f0,		\
+		       _FP_FRAC_WORD_8 (R, 2), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f0,			\
 		       _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
 		       _FP_FRAC_WORD_8 (R, 2));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
-		       _FP_FRAC_WORD_8 (R, 2), 0, _f_f1, _f_f0,		\
+		       _FP_FRAC_WORD_8 (R, 2), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_f_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_f_f0,			\
 		       _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
 		       _FP_FRAC_WORD_8 (R, 2));				\
-      doit (_b_f1, _b_f0, X##_f[0], Y##_f[3]);				\
-      doit (_c_f1, _c_f0, X##_f[3], Y##_f[0]);				\
-      doit (_d_f1, _d_f0, X##_f[1], Y##_f[2]);				\
-      doit (_e_f1, _e_f0, X##_f[2], Y##_f[1]);				\
+      doit (_FP_MUL_MEAT_DW_4_wide_b_f1,				\
+	    _FP_MUL_MEAT_DW_4_wide_b_f0, X##_f[0], Y##_f[3]);		\
+      doit (_FP_MUL_MEAT_DW_4_wide_c_f1,				\
+	    _FP_MUL_MEAT_DW_4_wide_c_f0, X##_f[3], Y##_f[0]);		\
+      doit (_FP_MUL_MEAT_DW_4_wide_d_f1, _FP_MUL_MEAT_DW_4_wide_d_f0,	\
+	    X##_f[1], Y##_f[2]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_e_f1, _FP_MUL_MEAT_DW_4_wide_e_f0,	\
+	    X##_f[2], Y##_f[1]);					\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
-		       _FP_FRAC_WORD_8 (R, 3), 0, _b_f1, _b_f0,		\
+		       _FP_FRAC_WORD_8 (R, 3), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f0,			\
 		       0, _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3)); \
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
-		       _FP_FRAC_WORD_8 (R, 3), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 3), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f0,			\
 		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
 		       _FP_FRAC_WORD_8 (R, 3));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
-		       _FP_FRAC_WORD_8 (R, 3), 0, _d_f1, _d_f0,		\
+		       _FP_FRAC_WORD_8 (R, 3), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f0,			\
 		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
 		       _FP_FRAC_WORD_8 (R, 3));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
-		       _FP_FRAC_WORD_8 (R, 3), 0, _e_f1, _e_f0,		\
+		       _FP_FRAC_WORD_8 (R, 3), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f0,			\
 		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
 		       _FP_FRAC_WORD_8 (R, 3));				\
-      doit (_b_f1, _b_f0, X##_f[2], Y##_f[2]);				\
-      doit (_c_f1, _c_f0, X##_f[1], Y##_f[3]);				\
-      doit (_d_f1, _d_f0, X##_f[3], Y##_f[1]);				\
-      doit (_e_f1, _e_f0, X##_f[2], Y##_f[3]);				\
-      doit (_f_f1, _f_f0, X##_f[3], Y##_f[2]);				\
+      doit (_FP_MUL_MEAT_DW_4_wide_b_f1, _FP_MUL_MEAT_DW_4_wide_b_f0,	\
+	    X##_f[2], Y##_f[2]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_c_f1, _FP_MUL_MEAT_DW_4_wide_c_f0,	\
+	    X##_f[1], Y##_f[3]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_d_f1, _FP_MUL_MEAT_DW_4_wide_d_f0,	\
+	    X##_f[3], Y##_f[1]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_e_f1, _FP_MUL_MEAT_DW_4_wide_e_f0,	\
+	    X##_f[2], Y##_f[3]);					\
+      doit (_FP_MUL_MEAT_DW_4_wide_f_f1, _FP_MUL_MEAT_DW_4_wide_f_f0,	\
+	    X##_f[3], Y##_f[2]);					\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
-		       _FP_FRAC_WORD_8 (R, 4), 0, _b_f1, _b_f0,		\
+		       _FP_FRAC_WORD_8 (R, 4), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f0,			\
 		       0, _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4)); \
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
-		       _FP_FRAC_WORD_8 (R, 4), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 4), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_c_f0,			\
 		       _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
 		       _FP_FRAC_WORD_8 (R, 4));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
-		       _FP_FRAC_WORD_8 (R, 4), 0, _d_f1, _d_f0,		\
+		       _FP_FRAC_WORD_8 (R, 4), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_d_f0,			\
 		       _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
 		       _FP_FRAC_WORD_8 (R, 4));				\
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
-		       _FP_FRAC_WORD_8 (R, 5), 0, _e_f1, _e_f0,		\
+		       _FP_FRAC_WORD_8 (R, 5), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_e_f0,			\
 		       0, _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5)); \
       __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
-		       _FP_FRAC_WORD_8 (R, 5), 0, _f_f1, _f_f0,		\
+		       _FP_FRAC_WORD_8 (R, 5), 0,			\
+		       _FP_MUL_MEAT_DW_4_wide_f_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_f_f0,			\
 		       _FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
 		       _FP_FRAC_WORD_8 (R, 5));				\
-      doit (_b_f1, _b_f0, X##_f[3], Y##_f[3]);				\
+      doit (_FP_MUL_MEAT_DW_4_wide_b_f1, _FP_MUL_MEAT_DW_4_wide_b_f0,	\
+	    X##_f[3], Y##_f[3]);					\
       __FP_FRAC_ADD_2 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
-		       _b_f1, _b_f0,					\
+		       _FP_MUL_MEAT_DW_4_wide_b_f1,			\
+		       _FP_MUL_MEAT_DW_4_wide_b_f0,			\
 		       _FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6));	\
     }									\
   while (0)
@@ -348,16 +423,20 @@
 #define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit)			\
   do									\
     {									\
-      _FP_FRAC_DECL_8 (_z);						\
+      _FP_FRAC_DECL_8 (_FP_MUL_MEAT_4_wide_z);				\
 									\
-      _FP_MUL_MEAT_DW_4_wide (wfracbits, _z, X, Y, doit);		\
+      _FP_MUL_MEAT_DW_4_wide ((wfracbits), _FP_MUL_MEAT_4_wide_z,	\
+			      X, Y, doit);				\
 									\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_8 (_z, wfracbits-1, 2*wfracbits);			\
-      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_z, 3), _FP_FRAC_WORD_8 (_z, 2), \
-		       _FP_FRAC_WORD_8 (_z, 1), _FP_FRAC_WORD_8 (_z, 0)); \
+      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_wide_z, (wfracbits)-1,		\
+		      2*(wfracbits));					\
+      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 3),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 2),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 1),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 0));	\
     }									\
   while (0)
 
@@ -371,49 +450,49 @@
 #define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y)				\
   do									\
     {									\
-      _FP_FRAC_DECL_8 (_z);						\
+      _FP_FRAC_DECL_8 (_FP_MUL_MEAT_4_gmp_z);				\
 									\
-      _FP_MUL_MEAT_DW_4_gmp (wfracbits, _z, X, Y);			\
+      _FP_MUL_MEAT_DW_4_gmp ((wfracbits), _FP_MUL_MEAT_4_gmp_z, X, Y);	\
 									\
       /* Normalize since we know where the msb of the multiplicands	\
 	 were (bit B), we know that the msb of the of the product is	\
 	 at either 2B or 2B-1.  */					\
-      _FP_FRAC_SRS_8 (_z, wfracbits-1, 2*wfracbits);			\
-      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_z, 3), _FP_FRAC_WORD_8 (_z, 2), \
-		       _FP_FRAC_WORD_8 (_z, 1), _FP_FRAC_WORD_8 (_z, 0)); \
+      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_gmp_z, (wfracbits)-1,		\
+		      2*(wfracbits));					\
+      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 3),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 2),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 1),	\
+		       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 0));	\
     }									\
   while (0)
 
-/*
- * Helper utility for _FP_DIV_MEAT_4_udiv:
- * pppp = m * nnn
- */
+/* Helper utility for _FP_DIV_MEAT_4_udiv:
+ * pppp = m * nnn.  */
 #define umul_ppppmnnn(p3, p2, p1, p0, m, n2, n1, n0)	\
   do							\
     {							\
-      UWtype _t;					\
+      UWtype umul_ppppmnnn_t;				\
       umul_ppmm (p1, p0, m, n0);			\
-      umul_ppmm (p2, _t, m, n1);			\
-      __FP_FRAC_ADDI_2 (p2, p1, _t);			\
-      umul_ppmm (p3, _t, m, n2);			\
-      __FP_FRAC_ADDI_2 (p3, p2, _t);			\
+      umul_ppmm (p2, umul_ppppmnnn_t, m, n1);		\
+      __FP_FRAC_ADDI_2 (p2, p1, umul_ppppmnnn_t);	\
+      umul_ppmm (p3, umul_ppppmnnn_t, m, n2);		\
+      __FP_FRAC_ADDI_2 (p3, p2, umul_ppppmnnn_t);	\
     }							\
   while (0)
 
-/*
- * Division algorithms:
- */
+/* Division algorithms: */
 
 #define _FP_DIV_MEAT_4_udiv(fs, R, X, Y)				\
   do									\
     {									\
-      int _i;								\
-      _FP_FRAC_DECL_4 (_n);						\
-      _FP_FRAC_DECL_4 (_m);						\
-      _FP_FRAC_SET_4 (_n, _FP_ZEROFRAC_4);				\
+      int _FP_DIV_MEAT_4_udiv_i;					\
+      _FP_FRAC_DECL_4 (_FP_DIV_MEAT_4_udiv_n);				\
+      _FP_FRAC_DECL_4 (_FP_DIV_MEAT_4_udiv_m);				\
+      _FP_FRAC_SET_4 (_FP_DIV_MEAT_4_udiv_n, _FP_ZEROFRAC_4);		\
       if (_FP_FRAC_GE_4 (X, Y))						\
 	{								\
-	  _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);			\
+	  _FP_DIV_MEAT_4_udiv_n_f[3]					\
+	    = X##_f[0] << (_FP_W_TYPE_SIZE - 1);			\
 	  _FP_FRAC_SRL_4 (X, 1);					\
 	}								\
       else								\
@@ -420,52 +499,61 @@
 	R##_e--;							\
 									\
       /* Normalize, i.e. make the most significant bit of the		\
-	 denominator set. */						\
+	 denominator set.  */						\
       _FP_FRAC_SLL_4 (Y, _FP_WFRACXBITS_##fs);				\
 									\
-      for (_i = 3; ; _i--)						\
+      for (_FP_DIV_MEAT_4_udiv_i = 3; ; _FP_DIV_MEAT_4_udiv_i--)	\
 	{								\
 	  if (X##_f[3] == Y##_f[3])					\
 	    {								\
 	      /* This is a special case, not an optimization		\
 		 (X##_f[3]/Y##_f[3] would not fit into UWtype).		\
-		 As X## is guaranteed to be < Y,  R##_f[_i] can be either \
+		 As X## is guaranteed to be < Y,			\
+		 R##_f[_FP_DIV_MEAT_4_udiv_i] can be either		\
 		 (UWtype)-1 or (UWtype)-2.  */				\
-	      R##_f[_i] = -1;						\
-	      if (!_i)							\
+	      R##_f[_FP_DIV_MEAT_4_udiv_i] = -1;			\
+	      if (!_FP_DIV_MEAT_4_udiv_i)				\
 		break;							\
 	      __FP_FRAC_SUB_4 (X##_f[3], X##_f[2], X##_f[1], X##_f[0],	\
 			       Y##_f[2], Y##_f[1], Y##_f[0], 0,		\
-			       X##_f[2], X##_f[1], X##_f[0], _n_f[_i]);	\
+			       X##_f[2], X##_f[1], X##_f[0],		\
+			       _FP_DIV_MEAT_4_udiv_n_f[_FP_DIV_MEAT_4_udiv_i]); \
 	      _FP_FRAC_SUB_4 (X, Y, X);					\
 	      if (X##_f[3] > Y##_f[3])					\
 		{							\
-		  R##_f[_i] = -2;					\
+		  R##_f[_FP_DIV_MEAT_4_udiv_i] = -2;			\
 		  _FP_FRAC_ADD_4 (X, Y, X);				\
 		}							\
 	    }								\
 	  else								\
 	    {								\
-	      udiv_qrnnd (R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]); \
-	      umul_ppppmnnn (_m_f[3], _m_f[2], _m_f[1], _m_f[0],	\
-			     R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]);	\
+	      udiv_qrnnd (R##_f[_FP_DIV_MEAT_4_udiv_i],			\
+			  X##_f[3], X##_f[3], X##_f[2], Y##_f[3]);	\
+	      umul_ppppmnnn (_FP_DIV_MEAT_4_udiv_m_f[3],		\
+			     _FP_DIV_MEAT_4_udiv_m_f[2],		\
+			     _FP_DIV_MEAT_4_udiv_m_f[1],		\
+			     _FP_DIV_MEAT_4_udiv_m_f[0],		\
+			     R##_f[_FP_DIV_MEAT_4_udiv_i],		\
+			     Y##_f[2], Y##_f[1], Y##_f[0]);		\
 	      X##_f[2] = X##_f[1];					\
 	      X##_f[1] = X##_f[0];					\
-	      X##_f[0] = _n_f[_i];					\
-	      if (_FP_FRAC_GT_4 (_m, X))				\
+	      X##_f[0]							\
+		= _FP_DIV_MEAT_4_udiv_n_f[_FP_DIV_MEAT_4_udiv_i];	\
+	      if (_FP_FRAC_GT_4 (_FP_DIV_MEAT_4_udiv_m, X))		\
 		{							\
-		  R##_f[_i]--;						\
+		  R##_f[_FP_DIV_MEAT_4_udiv_i]--;			\
 		  _FP_FRAC_ADD_4 (X, Y, X);				\
-		  if (_FP_FRAC_GE_4 (X, Y) && _FP_FRAC_GT_4 (_m, X))	\
+		  if (_FP_FRAC_GE_4 (X, Y)				\
+		      && _FP_FRAC_GT_4 (_FP_DIV_MEAT_4_udiv_m, X))	\
 		    {							\
-		      R##_f[_i]--;					\
+		      R##_f[_FP_DIV_MEAT_4_udiv_i]--;			\
 		      _FP_FRAC_ADD_4 (X, Y, X);				\
 		    }							\
 		}							\
-	      _FP_FRAC_DEC_4 (X, _m);					\
-	      if (!_i)							\
+	      _FP_FRAC_DEC_4 (X, _FP_DIV_MEAT_4_udiv_m);		\
+	      if (!_FP_DIV_MEAT_4_udiv_i)				\
 		{							\
-		  if (!_FP_FRAC_EQ_4 (X, _m))				\
+		  if (!_FP_FRAC_EQ_4 (X, _FP_DIV_MEAT_4_udiv_m))	\
 		    R##_f[0] |= _FP_WORK_STICKY;			\
 		  break;						\
 		}							\
@@ -475,11 +563,9 @@
   while (0)
 
 
-/*
- * Square root algorithms:
- * We have just one right now, maybe Newton approximation
- * should be added for those machines where division is fast.
- */
+/* Square root algorithms:
+   We have just one right now, maybe Newton approximation
+   should be added for those machines where division is fast.  */
 
 #define _FP_SQRT_MEAT_4(R, S, T, X, q)					\
   do									\
@@ -486,37 +572,37 @@
     {									\
       while (q)								\
 	{								\
-	  T##_f[3] = S##_f[3] + q;					\
+	  T##_f[3] = S##_f[3] + (q);					\
 	  if (T##_f[3] <= X##_f[3])					\
 	    {								\
-	      S##_f[3] = T##_f[3] + q;					\
+	      S##_f[3] = T##_f[3] + (q);				\
 	      X##_f[3] -= T##_f[3];					\
-	      R##_f[3] += q;						\
+	      R##_f[3] += (q);						\
 	    }								\
 	  _FP_FRAC_SLL_4 (X, 1);					\
-	  q >>= 1;							\
+	  (q) >>= 1;							\
 	}								\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
       while (q)								\
 	{								\
-	  T##_f[2] = S##_f[2] + q;					\
+	  T##_f[2] = S##_f[2] + (q);					\
 	  T##_f[3] = S##_f[3];						\
 	  if (T##_f[3] < X##_f[3]					\
 	      || (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))	\
 	    {								\
-	      S##_f[2] = T##_f[2] + q;					\
+	      S##_f[2] = T##_f[2] + (q);				\
 	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
 	      __FP_FRAC_DEC_2 (X##_f[3], X##_f[2],			\
 			       T##_f[3], T##_f[2]);			\
-	      R##_f[2] += q;						\
+	      R##_f[2] += (q);						\
 	    }								\
 	  _FP_FRAC_SLL_4 (X, 1);					\
-	  q >>= 1;							\
+	  (q) >>= 1;							\
 	}								\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
       while (q)								\
 	{								\
-	  T##_f[1] = S##_f[1] + q;					\
+	  T##_f[1] = S##_f[1] + (q);					\
 	  T##_f[2] = S##_f[2];						\
 	  T##_f[3] = S##_f[3];						\
 	  if (T##_f[3] < X##_f[3]					\
@@ -525,34 +611,34 @@
 		      || (T##_f[2] == X##_f[2]				\
 			  && T##_f[1] <= X##_f[1]))))			\
 	    {								\
-	      S##_f[1] = T##_f[1] + q;					\
+	      S##_f[1] = T##_f[1] + (q);				\
 	      S##_f[2] += (T##_f[1] > S##_f[1]);			\
 	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
 	      __FP_FRAC_DEC_3 (X##_f[3], X##_f[2], X##_f[1],		\
 			       T##_f[3], T##_f[2], T##_f[1]);		\
-	      R##_f[1] += q;						\
+	      R##_f[1] += (q);						\
 	    }								\
 	  _FP_FRAC_SLL_4 (X, 1);					\
-	  q >>= 1;							\
+	  (q) >>= 1;							\
 	}								\
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
-      while (q != _FP_WORK_ROUND)					\
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      while ((q) != _FP_WORK_ROUND)					\
 	{								\
-	  T##_f[0] = S##_f[0] + q;					\
+	  T##_f[0] = S##_f[0] + (q);					\
 	  T##_f[1] = S##_f[1];						\
 	  T##_f[2] = S##_f[2];						\
 	  T##_f[3] = S##_f[3];						\
 	  if (_FP_FRAC_GE_4 (X, T))					\
 	    {								\
-	      S##_f[0] = T##_f[0] + q;					\
+	      S##_f[0] = T##_f[0] + (q);				\
 	      S##_f[1] += (T##_f[0] > S##_f[0]);			\
 	      S##_f[2] += (T##_f[1] > S##_f[1]);			\
 	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
 	      _FP_FRAC_DEC_4 (X, T);					\
-	      R##_f[0] += q;						\
+	      R##_f[0] += (q);						\
 	    }								\
 	  _FP_FRAC_SLL_4 (X, 1);					\
-	  q >>= 1;							\
+	  (q) >>= 1;							\
 	}								\
       if (!_FP_FRAC_ZEROP_4 (X))					\
 	{								\
@@ -564,9 +650,7 @@
   while (0)
 
 
-/*
- * Internals
- */
+/* Internals.  */
 
 #define __FP_FRAC_SET_4(X, I3, I2, I1, I0)			\
   (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
@@ -591,18 +675,19 @@
 # define __FP_FRAC_ADD_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) \
   do									\
     {									\
-      _FP_W_TYPE _c1, _c2, _c3;						\
+      _FP_W_TYPE __FP_FRAC_ADD_4_c1, __FP_FRAC_ADD_4_c2;		\
+      _FP_W_TYPE __FP_FRAC_ADD_4_c3;					\
       r0 = x0 + y0;							\
-      _c1 = r0 < x0;							\
+      __FP_FRAC_ADD_4_c1 = r0 < x0;					\
       r1 = x1 + y1;							\
-      _c2 = r1 < x1;							\
-      r1 += _c1;							\
-      _c2 |= r1 < _c1;							\
+      __FP_FRAC_ADD_4_c2 = r1 < x1;					\
+      r1 += __FP_FRAC_ADD_4_c1;						\
+      __FP_FRAC_ADD_4_c2 |= r1 < __FP_FRAC_ADD_4_c1;			\
       r2 = x2 + y2;							\
-      _c3 = r2 < x2;							\
-      r2 += _c2;							\
-      _c3 |= r2 < _c2;							\
-      r3 = x3 + y3 + _c3;						\
+      __FP_FRAC_ADD_4_c3 = r2 < x2;					\
+      r2 += __FP_FRAC_ADD_4_c2;						\
+      __FP_FRAC_ADD_4_c3 |= r2 < __FP_FRAC_ADD_4_c2;			\
+      r3 = x3 + y3 + __FP_FRAC_ADD_4_c3;				\
     }									\
   while (0)
 #endif
@@ -611,14 +696,14 @@
 # define __FP_FRAC_SUB_3(r2, r1, r0, x2, x1, x0, y2, y1, y0)	\
   do								\
     {								\
-      _FP_W_TYPE _c1, _c2;					\
+      _FP_W_TYPE __FP_FRAC_SUB_3_c1, __FP_FRAC_SUB_3_c2;	\
       r0 = x0 - y0;						\
-      _c1 = r0 > x0;						\
+      __FP_FRAC_SUB_3_c1 = r0 > x0;				\
       r1 = x1 - y1;						\
-      _c2 = r1 > x1;						\
-      r1 -= _c1;						\
-      _c2 |= _c1 && (y1 == x1);					\
-      r2 = x2 - y2 - _c2;					\
+      __FP_FRAC_SUB_3_c2 = r1 > x1;				\
+      r1 -= __FP_FRAC_SUB_3_c1;					\
+      __FP_FRAC_SUB_3_c2 |= __FP_FRAC_SUB_3_c1 && (y1 == x1);	\
+      r2 = x2 - y2 - __FP_FRAC_SUB_3_c2;			\
     }								\
   while (0)
 #endif
@@ -627,18 +712,19 @@
 # define __FP_FRAC_SUB_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) \
   do									\
     {									\
-      _FP_W_TYPE _c1, _c2, _c3;						\
+      _FP_W_TYPE __FP_FRAC_SUB_4_c1, __FP_FRAC_SUB_4_c2;		\
+      _FP_W_TYPE __FP_FRAC_SUB_4_c3;					\
       r0 = x0 - y0;							\
-      _c1 = r0 > x0;							\
+      __FP_FRAC_SUB_4_c1 = r0 > x0;					\
       r1 = x1 - y1;							\
-      _c2 = r1 > x1;							\
-      r1 -= _c1;							\
-      _c2 |= _c1 && (y1 == x1);						\
+      __FP_FRAC_SUB_4_c2 = r1 > x1;					\
+      r1 -= __FP_FRAC_SUB_4_c1;						\
+      __FP_FRAC_SUB_4_c2 |= __FP_FRAC_SUB_4_c1 && (y1 == x1);		\
       r2 = x2 - y2;							\
-      _c3 = r2 > x2;							\
-      r2 -= _c2;							\
-      _c3 |= _c2 && (y2 == x2);						\
-      r3 = x3 - y3 - _c3;						\
+      __FP_FRAC_SUB_4_c3 = r2 > x2;					\
+      r2 -= __FP_FRAC_SUB_4_c2;						\
+      __FP_FRAC_SUB_4_c3 |= __FP_FRAC_SUB_4_c2 && (y2 == x2);		\
+      r3 = x3 - y3 - __FP_FRAC_SUB_4_c3;				\
     }									\
   while (0)
 #endif
@@ -647,46 +733,56 @@
 # define __FP_FRAC_DEC_3(x2, x1, x0, y2, y1, y0)		\
   do								\
     {								\
-      UWtype _t0, _t1, _t2;					\
-      _t0 = x0, _t1 = x1, _t2 = x2;				\
-      __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0);	\
+      UWtype __FP_FRAC_DEC_3_t0, __FP_FRAC_DEC_3_t1;		\
+      UWtype __FP_FRAC_DEC_3_t2;				\
+      __FP_FRAC_DEC_3_t0 = x0;					\
+      __FP_FRAC_DEC_3_t1 = x1;					\
+      __FP_FRAC_DEC_3_t2 = x2;					\
+      __FP_FRAC_SUB_3 (x2, x1, x0, __FP_FRAC_DEC_3_t2,		\
+		       __FP_FRAC_DEC_3_t1, __FP_FRAC_DEC_3_t0,	\
+		       y2, y1, y0);				\
     }								\
   while (0)
 #endif
 
 #ifndef __FP_FRAC_DEC_4
-# define __FP_FRAC_DEC_4(x3, x2, x1, x0, y3, y2, y1, y0)		\
-  do									\
-    {									\
-      UWtype _t0, _t1, _t2, _t3;					\
-      _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3;				\
-      __FP_FRAC_SUB_4 (x3, x2, x1, x0, _t3, _t2, _t1, _t0, y3, y2, y1, y0); \
-    }									\
+# define __FP_FRAC_DEC_4(x3, x2, x1, x0, y3, y2, y1, y0)	\
+  do								\
+    {								\
+      UWtype __FP_FRAC_DEC_4_t0, __FP_FRAC_DEC_4_t1;		\
+      UWtype __FP_FRAC_DEC_4_t2, __FP_FRAC_DEC_4_t3;		\
+      __FP_FRAC_DEC_4_t0 = x0;					\
+      __FP_FRAC_DEC_4_t1 = x1;					\
+      __FP_FRAC_DEC_4_t2 = x2;					\
+      __FP_FRAC_DEC_4_t3 = x3;					\
+      __FP_FRAC_SUB_4 (x3, x2, x1, x0, __FP_FRAC_DEC_4_t3,	\
+		       __FP_FRAC_DEC_4_t2, __FP_FRAC_DEC_4_t1,	\
+		       __FP_FRAC_DEC_4_t0, y3, y2, y1, y0);	\
+    }								\
   while (0)
 #endif
 
 #ifndef __FP_FRAC_ADDI_4
-# define __FP_FRAC_ADDI_4(x3, x2, x1, x0, i)	\
-  do						\
-    {						\
-      UWtype _t;				\
-      _t = ((x0 += i) < i);			\
-      x1 += _t;					\
-      _t = (x1 < _t);				\
-      x2 += _t;					\
-      _t = (x2 < _t);				\
-      x3 += _t;					\
-    }						\
+# define __FP_FRAC_ADDI_4(x3, x2, x1, x0, i)		\
+  do							\
+    {							\
+      UWtype __FP_FRAC_ADDI_4_t;			\
+      __FP_FRAC_ADDI_4_t = ((x0 += i) < i);		\
+      x1 += __FP_FRAC_ADDI_4_t;				\
+      __FP_FRAC_ADDI_4_t = (x1 < __FP_FRAC_ADDI_4_t);	\
+      x2 += __FP_FRAC_ADDI_4_t;				\
+      __FP_FRAC_ADDI_4_t = (x2 < __FP_FRAC_ADDI_4_t);	\
+      x3 += __FP_FRAC_ADDI_4_t;				\
+    }							\
   while (0)
 #endif
 
 /* Convert FP values between word sizes. This appears to be more
- * complicated than I'd have expected it to be, so these might be
- * wrong... These macros are in any case somewhat bogus because they
- * use information about what various FRAC_n variables look like
- * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
- * the ones in op-2.h and op-1.h.
- */
+   complicated than I'd have expected it to be, so these might be
+   wrong... These macros are in any case somewhat bogus because they
+   use information about what various FRAC_n variables look like
+   internally [eg, that 2 word vars are X_f0 and x_f1]. But so do
+   the ones in op-2.h and op-1.h.  */
 #define _FP_FRAC_COPY_1_4(D, S)		(D##_f = S##_f[0])
 
 #define _FP_FRAC_COPY_2_4(D, S)			\
@@ -698,48 +794,60 @@
   while (0)
 
 /* Assembly/disassembly for converting to/from integral types.
- * No shifting or overflow handled here.
- */
-/* Put the FP value X into r, which is an integer of size rsize. */
+   No shifting or overflow handled here.  */
+/* Put the FP value X into r, which is an integer of size rsize.  */
 #define _FP_FRAC_ASSEMBLE_4(r, X, rsize)				\
   do									\
     {									\
-      if (rsize <= _FP_W_TYPE_SIZE)					\
-	r = X##_f[0];							\
-      else if (rsize <= 2*_FP_W_TYPE_SIZE)				\
+      if ((rsize) <= _FP_W_TYPE_SIZE)					\
+	(r) = X##_f[0];							\
+	else if ((rsize) <= 2*_FP_W_TYPE_SIZE)				\
 	{								\
-	  r = X##_f[1];							\
-	  r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);	\
-	  r += X##_f[0];						\
+	  (r) = X##_f[1];						\
+	  (r) = ((rsize) <= _FP_W_TYPE_SIZE				\
+		 ? 0							\
+		 : (r) << _FP_W_TYPE_SIZE);				\
+	  (r) += X##_f[0];						\
 	}								\
       else								\
 	{								\
-	  /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \
-	  /* and int == 4words as a single case.			 */ \
-	  r = X##_f[3];							\
-	  r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);	\
-	  r += X##_f[2];						\
-	  r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);	\
-	  r += X##_f[1];						\
-	  r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);	\
-	  r += X##_f[0];						\
+	  /* I'm feeling lazy so we deal with int == 3words		\
+	     (implausible) and int == 4words as a single case.  */	\
+	  (r) = X##_f[3];						\
+	  (r) = ((rsize) <= _FP_W_TYPE_SIZE				\
+		 ? 0							\
+		 : (r) << _FP_W_TYPE_SIZE);				\
+	  (r) += X##_f[2];						\
+	  (r) = ((rsize) <= _FP_W_TYPE_SIZE				\
+		 ? 0							\
+		 : (r) << _FP_W_TYPE_SIZE);				\
+	  (r) += X##_f[1];						\
+	  (r) = ((rsize) <= _FP_W_TYPE_SIZE				\
+		 ? 0							\
+		 : (r) << _FP_W_TYPE_SIZE);				\
+	  (r) += X##_f[0];						\
 	}								\
     }									\
   while (0)
 
 /* "No disassemble Number Five!" */
-/* move an integer of size rsize into X's fractional part. We rely on
- * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
- * having to mask the values we store into it.
- */
-#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)				\
-  do									\
-    {									\
-      X##_f[0] = r;							\
-      X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
-      X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
-      X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
-    }									\
+/* Move an integer of size rsize into X's fractional part. We rely on
+   the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
+   having to mask the values we store into it.  */
+#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)	\
+  do						\
+    {						\
+      X##_f[0] = (r);				\
+      X##_f[1] = ((rsize) <= _FP_W_TYPE_SIZE	\
+		  ? 0				\
+		  : (r) >> _FP_W_TYPE_SIZE);	\
+      X##_f[2] = ((rsize) <= 2*_FP_W_TYPE_SIZE	\
+		  ? 0				\
+		  : (r) >> 2*_FP_W_TYPE_SIZE);	\
+      X##_f[3] = ((rsize) <= 3*_FP_W_TYPE_SIZE	\
+		  ? 0				\
+		  : (r) >> 3*_FP_W_TYPE_SIZE);	\
+    }						\
   while (0)
 
 #define _FP_FRAC_COPY_4_1(D, S)			\
Index: libgcc/soft-fp/op-8.h
===================================================================
--- libgcc/soft-fp/op-8.h	(revision 216037)
+++ libgcc/soft-fp/op-8.h	(working copy)
@@ -30,87 +30,116 @@
    <http://www.gnu.org/licenses/>.  */
 
 /* We need just a few things from here for op-4, if we ever need some
-   other macros, they can be added. */
+   other macros, they can be added.  */
 #define _FP_FRAC_DECL_8(X)	_FP_W_TYPE X##_f[8]
 #define _FP_FRAC_HIGH_8(X)	(X##_f[7])
 #define _FP_FRAC_LOW_8(X)	(X##_f[0])
 #define _FP_FRAC_WORD_8(X, w)	(X##_f[w])
 
-#define _FP_FRAC_SLL_8(X, N)				\
-  do							\
-    {							\
-      _FP_I_TYPE _up, _down, _skip, _i;			\
-      _skip = (N) / _FP_W_TYPE_SIZE;			\
-      _up = (N) % _FP_W_TYPE_SIZE;			\
-      _down = _FP_W_TYPE_SIZE - _up;			\
-      if (!_up)						\
-	for (_i = 7; _i >= _skip; --_i)			\
-	  X##_f[_i] = X##_f[_i-_skip];			\
-      else						\
-	{						\
-	  for (_i = 7; _i > _skip; --_i)		\
-	    X##_f[_i] = (X##_f[_i-_skip] << _up		\
-			 | X##_f[_i-_skip-1] >> _down);	\
-	  X##_f[_i--] = X##_f[0] << _up;		\
-	}						\
-      for (; _i >= 0; --_i)				\
-	X##_f[_i] = 0;					\
-    }							\
+#define _FP_FRAC_SLL_8(X, N)						\
+  do									\
+    {									\
+      _FP_I_TYPE _FP_FRAC_SLL_8_up, _FP_FRAC_SLL_8_down;		\
+      _FP_I_TYPE _FP_FRAC_SLL_8_skip, _FP_FRAC_SLL_8_i;			\
+      _FP_FRAC_SLL_8_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SLL_8_up = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SLL_8_down = _FP_W_TYPE_SIZE - _FP_FRAC_SLL_8_up;	\
+      if (!_FP_FRAC_SLL_8_up)						\
+	for (_FP_FRAC_SLL_8_i = 7;					\
+	     _FP_FRAC_SLL_8_i >= _FP_FRAC_SLL_8_skip;			\
+	     --_FP_FRAC_SLL_8_i)					\
+	  X##_f[_FP_FRAC_SLL_8_i]					\
+	    = X##_f[_FP_FRAC_SLL_8_i-_FP_FRAC_SLL_8_skip];		\
+      else								\
+	{								\
+	  for (_FP_FRAC_SLL_8_i = 7;					\
+	       _FP_FRAC_SLL_8_i > _FP_FRAC_SLL_8_skip;			\
+	       --_FP_FRAC_SLL_8_i)					\
+	    X##_f[_FP_FRAC_SLL_8_i]					\
+	      = ((X##_f[_FP_FRAC_SLL_8_i-_FP_FRAC_SLL_8_skip]		\
+		  << _FP_FRAC_SLL_8_up)					\
+		 | (X##_f[_FP_FRAC_SLL_8_i-_FP_FRAC_SLL_8_skip-1]	\
+		    >> _FP_FRAC_SLL_8_down));				\
+	  X##_f[_FP_FRAC_SLL_8_i--] = X##_f[0] << _FP_FRAC_SLL_8_up;	\
+	}								\
+      for (; _FP_FRAC_SLL_8_i >= 0; --_FP_FRAC_SLL_8_i)			\
+	X##_f[_FP_FRAC_SLL_8_i] = 0;					\
+    }									\
   while (0)
 
-#define _FP_FRAC_SRL_8(X, N)				\
-  do							\
-    {							\
-      _FP_I_TYPE _up, _down, _skip, _i;			\
-      _skip = (N) / _FP_W_TYPE_SIZE;			\
-      _down = (N) % _FP_W_TYPE_SIZE;			\
-      _up = _FP_W_TYPE_SIZE - _down;			\
-      if (!_down)					\
-	for (_i = 0; _i <= 7-_skip; ++_i)		\
-	  X##_f[_i] = X##_f[_i+_skip];			\
-      else						\
-	{						\
-	  for (_i = 0; _i < 7-_skip; ++_i)		\
-	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
-			 | X##_f[_i+_skip+1] << _up);	\
-	  X##_f[_i++] = X##_f[7] >> _down;		\
-	}						\
-      for (; _i < 8; ++_i)				\
-	X##_f[_i] = 0;					\
-    }							\
+#define _FP_FRAC_SRL_8(X, N)						\
+  do									\
+    {									\
+      _FP_I_TYPE _FP_FRAC_SRL_8_up, _FP_FRAC_SRL_8_down;		\
+      _FP_I_TYPE _FP_FRAC_SRL_8_skip, _FP_FRAC_SRL_8_i;			\
+      _FP_FRAC_SRL_8_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRL_8_down = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRL_8_up = _FP_W_TYPE_SIZE - _FP_FRAC_SRL_8_down;	\
+      if (!_FP_FRAC_SRL_8_down)						\
+	for (_FP_FRAC_SRL_8_i = 0;					\
+	     _FP_FRAC_SRL_8_i <= 7-_FP_FRAC_SRL_8_skip;			\
+	     ++_FP_FRAC_SRL_8_i)					\
+	  X##_f[_FP_FRAC_SRL_8_i]					\
+	    = X##_f[_FP_FRAC_SRL_8_i+_FP_FRAC_SRL_8_skip];		\
+      else								\
+	{								\
+	  for (_FP_FRAC_SRL_8_i = 0;					\
+	       _FP_FRAC_SRL_8_i < 7-_FP_FRAC_SRL_8_skip;		\
+	       ++_FP_FRAC_SRL_8_i)					\
+	    X##_f[_FP_FRAC_SRL_8_i]					\
+	      = ((X##_f[_FP_FRAC_SRL_8_i+_FP_FRAC_SRL_8_skip]		\
+		  >> _FP_FRAC_SRL_8_down)				\
+		 | (X##_f[_FP_FRAC_SRL_8_i+_FP_FRAC_SRL_8_skip+1]	\
+		    << _FP_FRAC_SRL_8_up));				\
+	  X##_f[_FP_FRAC_SRL_8_i++] = X##_f[7] >> _FP_FRAC_SRL_8_down;	\
+	}								\
+      for (; _FP_FRAC_SRL_8_i < 8; ++_FP_FRAC_SRL_8_i)			\
+	X##_f[_FP_FRAC_SRL_8_i] = 0;					\
+    }									\
   while (0)
 
 
 /* Right shift with sticky-lsb.
- * What this actually means is that we do a standard right-shift,
- * but that if any of the bits that fall off the right hand side
- * were one then we always set the LSbit.
- */
+   What this actually means is that we do a standard right-shift,
+   but that if any of the bits that fall off the right hand side
+   were one then we always set the LSbit.  */
 #define _FP_FRAC_SRS_8(X, N, size)					\
   do									\
     {									\
-      _FP_I_TYPE _up, _down, _skip, _i;					\
-      _FP_W_TYPE _s;							\
-      _skip = (N) / _FP_W_TYPE_SIZE;					\
-      _down = (N) % _FP_W_TYPE_SIZE;					\
-      _up = _FP_W_TYPE_SIZE - _down;					\
-      for (_s = _i = 0; _i < _skip; ++_i)				\
-	_s |= X##_f[_i];						\
-      if (!_down)							\
-	for (_i = 0; _i <= 7-_skip; ++_i)				\
-	  X##_f[_i] = X##_f[_i+_skip];					\
+      _FP_I_TYPE _FP_FRAC_SRS_8_up, _FP_FRAC_SRS_8_down;		\
+      _FP_I_TYPE _FP_FRAC_SRS_8_skip, _FP_FRAC_SRS_8_i;			\
+      _FP_W_TYPE _FP_FRAC_SRS_8_s;					\
+      _FP_FRAC_SRS_8_skip = (N) / _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRS_8_down = (N) % _FP_W_TYPE_SIZE;			\
+      _FP_FRAC_SRS_8_up = _FP_W_TYPE_SIZE - _FP_FRAC_SRS_8_down;	\
+      for (_FP_FRAC_SRS_8_s = _FP_FRAC_SRS_8_i = 0;			\
+	   _FP_FRAC_SRS_8_i < _FP_FRAC_SRS_8_skip;			\
+	   ++_FP_FRAC_SRS_8_i)						\
+	_FP_FRAC_SRS_8_s |= X##_f[_FP_FRAC_SRS_8_i];			\
+      if (!_FP_FRAC_SRS_8_down)						\
+	for (_FP_FRAC_SRS_8_i = 0;					\
+	     _FP_FRAC_SRS_8_i <= 7-_FP_FRAC_SRS_8_skip;			\
+	     ++_FP_FRAC_SRS_8_i)					\
+	  X##_f[_FP_FRAC_SRS_8_i]					\
+	    = X##_f[_FP_FRAC_SRS_8_i+_FP_FRAC_SRS_8_skip];		\
       else								\
 	{								\
-	  _s |= X##_f[_i] << _up;					\
-	  for (_i = 0; _i < 7-_skip; ++_i)				\
-	    X##_f[_i] = (X##_f[_i+_skip] >> _down			\
-			 | X##_f[_i+_skip+1] << _up);			\
-	  X##_f[_i++] = X##_f[7] >> _down;				\
+	  _FP_FRAC_SRS_8_s						\
+	    |= X##_f[_FP_FRAC_SRS_8_i] << _FP_FRAC_SRS_8_up;		\
+	  for (_FP_FRAC_SRS_8_i = 0;					\
+	       _FP_FRAC_SRS_8_i < 7-_FP_FRAC_SRS_8_skip;		\
+	       ++_FP_FRAC_SRS_8_i)					\
+	    X##_f[_FP_FRAC_SRS_8_i]					\
+	      = ((X##_f[_FP_FRAC_SRS_8_i+_FP_FRAC_SRS_8_skip]		\
+		  >> _FP_FRAC_SRS_8_down)				\
+		 | (X##_f[_FP_FRAC_SRS_8_i+_FP_FRAC_SRS_8_skip+1]	\
+		    << _FP_FRAC_SRS_8_up));				\
+	  X##_f[_FP_FRAC_SRS_8_i++] = X##_f[7] >> _FP_FRAC_SRS_8_down;	\
 	}								\
-      for (; _i < 8; ++_i)						\
-	X##_f[_i] = 0;							\
-      /* don't fix the LSB until the very end when we're sure f[0] is	\
-	 stable */							\
-      X##_f[0] |= (_s != 0);						\
+      for (; _FP_FRAC_SRS_8_i < 8; ++_FP_FRAC_SRS_8_i)			\
+	X##_f[_FP_FRAC_SRS_8_i] = 0;					\
+      /* Don't fix the LSB until the very end when we're sure f[0] is	\
+	 stable.  */							\
+      X##_f[0] |= (_FP_FRAC_SRS_8_s != 0);				\
     }									\
   while (0)
Index: libgcc/soft-fp/op-common.h
===================================================================
--- libgcc/soft-fp/op-common.h	(revision 216037)
+++ libgcc/soft-fp/op-common.h	(working copy)
@@ -45,10 +45,8 @@
    ? (_FP_FRAC_HIGH_##fs (X) & _FP_QNANBIT_SH_##fs)	\
    : !(_FP_FRAC_HIGH_##fs (X) & _FP_QNANBIT_SH_##fs))
 
-/*
- * Finish truly unpacking a native fp value by classifying the kind
- * of fp value and normalizing both the exponent and the fraction.
- */
+/* Finish truly unpacking a native fp value by classifying the kind
+   of fp value and normalizing both the exponent and the fraction.  */
 
 #define _FP_UNPACK_CANONICAL(fs, wc, X)				\
   do								\
@@ -65,14 +63,23 @@
 	case 0:							\
 	  if (_FP_FRAC_ZEROP_##wc (X))				\
 	    X##_c = FP_CLS_ZERO;				\
+	  else if (FP_DENORM_ZERO)				\
+	    {							\
+	      X##_c = FP_CLS_ZERO;				\
+	      _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);		\
+	      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+	    }							\
 	  else							\
 	    {							\
-	      /* a denormalized number */			\
-	      _FP_I_TYPE _shift;				\
-	      _FP_FRAC_CLZ_##wc (_shift, X);			\
-	      _shift -= _FP_FRACXBITS_##fs;			\
-	      _FP_FRAC_SLL_##wc (X, (_shift+_FP_WORKBITS));	\
-	      X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;		\
+	      /* A denormalized number.  */			\
+	      _FP_I_TYPE _FP_UNPACK_CANONICAL_shift;		\
+	      _FP_FRAC_CLZ_##wc (_FP_UNPACK_CANONICAL_shift,	\
+				 X);				\
+	      _FP_UNPACK_CANONICAL_shift -= _FP_FRACXBITS_##fs;	\
+	      _FP_FRAC_SLL_##wc (X, (_FP_UNPACK_CANONICAL_shift \
+				     + _FP_WORKBITS));		\
+	      X##_e -= (_FP_EXPBIAS_##fs - 1			\
+			+ _FP_UNPACK_CANONICAL_shift);		\
 	      X##_c = FP_CLS_NORMAL;				\
 	      FP_SET_EXCEPTION (FP_EX_DENORM);			\
 	    }							\
@@ -84,9 +91,10 @@
 	  else							\
 	    {							\
 	      X##_c = FP_CLS_NAN;				\
-	      /* Check for signaling NaN */			\
+	      /* Check for signaling NaN.  */			\
 	      if (_FP_FRAC_SNANP (fs, X))			\
-		FP_SET_EXCEPTION (FP_EX_INVALID);		\
+		FP_SET_EXCEPTION (FP_EX_INVALID			\
+				  | FP_EX_INVALID_SNAN);	\
 	    }							\
 	  break;						\
 	}							\
@@ -98,6 +106,21 @@
    other classification is not done.  */
 #define _FP_UNPACK_SEMIRAW(fs, wc, X)	_FP_FRAC_SLL_##wc (X, _FP_WORKBITS)
 
+/* Check whether a raw or semi-raw input value should be flushed to
+   zero, and flush it to zero if so.  */
+#define _FP_CHECK_FLUSH_ZERO(fs, wc, X)			\
+  do							\
+    {							\
+      if (FP_DENORM_ZERO				\
+	  && X##_e == 0					\
+	  && !_FP_FRAC_ZEROP_##wc (X))			\
+	{						\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);	\
+	  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+	}						\
+    }							\
+  while (0)
+
 /* A semi-raw value has overflowed to infinity.  Adjust the mantissa
    and exponent appropriately.  */
 #define _FP_OVERFLOW_SEMIRAW(fs, wc, X)			\
@@ -122,14 +145,14 @@
 
 /* Check for a semi-raw value being a signaling NaN and raise the
    invalid exception if so.  */
-#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)	\
-  do						\
-    {						\
-      if (X##_e == _FP_EXPMAX_##fs		\
-	  && !_FP_FRAC_ZEROP_##wc (X)		\
-	  && _FP_FRAC_SNANP_SEMIRAW (fs, X))	\
-	FP_SET_EXCEPTION (FP_EX_INVALID);	\
-    }						\
+#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)			\
+  do								\
+    {								\
+      if (X##_e == _FP_EXPMAX_##fs				\
+	  && !_FP_FRAC_ZEROP_##wc (X)				\
+	  && _FP_FRAC_SNANP_SEMIRAW (fs, X))			\
+	FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_SNAN);	\
+    }								\
   while (0)
 
 /* Choose a NaN result from an operation on two semi-raw NaN
@@ -234,12 +257,10 @@
     }								\
   while (0)
 
-/*
- * Before packing the bits back into the native fp result, take care
- * of such mundane things as rounding and overflow.  Also, for some
- * kinds of fp values, the original parts may not have been fully
- * extracted -- but that is ok, we can regenerate them now.
- */
+/* Before packing the bits back into the native fp result, take care
+   of such mundane things as rounding and overflow.  Also, for some
+   kinds of fp values, the original parts may not have been fully
+   extracted -- but that is ok, we can regenerate them now.  */
 
 #define _FP_PACK_CANONICAL(fs, wc, X)					\
   do									\
@@ -259,7 +280,7 @@
 	      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);			\
 	      if (X##_e >= _FP_EXPMAX_##fs)				\
 		{							\
-		  /* overflow */					\
+		  /* Overflow.  */					\
 		  switch (FP_ROUNDMODE)					\
 		    {							\
 		    case FP_RND_NEAREST:				\
@@ -276,13 +297,13 @@
 		    }							\
 		  if (X##_c == FP_CLS_INF)				\
 		    {							\
-		      /* Overflow to infinity */			\
+		      /* Overflow to infinity.  */			\
 		      X##_e = _FP_EXPMAX_##fs;				\
 		      _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);		\
 		    }							\
 		  else							\
 		    {							\
-		      /* Overflow to maximum normal */			\
+		      /* Overflow to maximum normal.  */		\
 		      X##_e = _FP_EXPMAX_##fs - 1;			\
 		      _FP_FRAC_SET_##wc (X, _FP_MAXFRAC_##wc);		\
 		    }							\
@@ -292,7 +313,7 @@
 	    }								\
 	  else								\
 	    {								\
-	      /* we've got a denormalized number */			\
+	      /* We've got a denormalized number.  */			\
 	      int _FP_PACK_CANONICAL_is_tiny = 1;			\
 	      if (_FP_TININESS_AFTER_ROUNDING && X##_e == 0)		\
 		{							\
@@ -329,7 +350,7 @@
 		}							\
 	      else							\
 		{							\
-		  /* underflow to zero */				\
+		  /* Underflow to zero.  */				\
 		  X##_e = 0;						\
 		  if (!_FP_FRAC_ZEROP_##wc (X))				\
 		    {							\
@@ -367,18 +388,17 @@
   while (0)
 
 /* This one accepts raw argument and not cooked,  returns
- * 1 if X is a signaling NaN.
- */
+   1 if X is a signaling NaN.  */
 #define _FP_ISSIGNAN(fs, wc, X)			\
   ({						\
-    int __ret = 0;				\
+    int _FP_ISSIGNAN_ret = 0;			\
     if (X##_e == _FP_EXPMAX_##fs)		\
       {						\
 	if (!_FP_FRAC_ZEROP_##wc (X)		\
 	    && _FP_FRAC_SNANP (fs, X))		\
-	  __ret = 1;				\
+	  _FP_ISSIGNAN_ret = 1;			\
       }						\
-    __ret;					\
+    _FP_ISSIGNAN_ret;				\
   })
 
 
@@ -389,12 +409,14 @@
 #define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)				\
   do									\
     {									\
+      _FP_CHECK_FLUSH_ZERO (fs, wc, X);					\
+      _FP_CHECK_FLUSH_ZERO (fs, wc, Y);					\
       if (X##_s == Y##_s)						\
 	{								\
 	  /* Addition.  */						\
 	  R##_s = X##_s;						\
-	  int ediff = X##_e - Y##_e;					\
-	  if (ediff > 0)						\
+	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
+	  if (_FP_ADD_INTERNAL_ediff > 0)				\
 	    {								\
 	      R##_e = X##_e;						\
 	      if (Y##_e == 0)						\
@@ -409,8 +431,8 @@
 		  else							\
 		    {							\
 		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
-		      ediff--;						\
-		      if (ediff == 0)					\
+		      _FP_ADD_INTERNAL_ediff--;				\
+		      if (_FP_ADD_INTERNAL_ediff == 0)			\
 			{						\
 			  _FP_FRAC_ADD_##wc (R, X, Y);			\
 			  goto add3;					\
@@ -436,17 +458,19 @@
 	      _FP_FRAC_HIGH_##fs (Y) |= _FP_IMPLBIT_SH_##fs;		\
 									\
 	    add1:							\
-	      /* Shift the mantissa of Y to the right EDIFF steps;	\
-		 remember to account later for the implicit MSB of X.  */ \
-	      if (ediff <= _FP_WFRACBITS_##fs)				\
-		_FP_FRAC_SRS_##wc (Y, ediff, _FP_WFRACBITS_##fs);	\
+	      /* Shift the mantissa of Y to the right			\
+		 _FP_ADD_INTERNAL_EDIFF steps; remember to account	\
+		 later for the implicit MSB of X.  */			\
+	      if (_FP_ADD_INTERNAL_ediff <= _FP_WFRACBITS_##fs)		\
+		_FP_FRAC_SRS_##wc (Y, _FP_ADD_INTERNAL_ediff,		\
+				   _FP_WFRACBITS_##fs);			\
 	      else if (!_FP_FRAC_ZEROP_##wc (Y))			\
 		_FP_FRAC_SET_##wc (Y, _FP_MINFRAC_##wc);		\
 	      _FP_FRAC_ADD_##wc (R, X, Y);				\
 	    }								\
-	  else if (ediff < 0)						\
+	  else if (_FP_ADD_INTERNAL_ediff < 0)				\
 	    {								\
-	      ediff = -ediff;						\
+	      _FP_ADD_INTERNAL_ediff = -_FP_ADD_INTERNAL_ediff;		\
 	      R##_e = Y##_e;						\
 	      if (X##_e == 0)						\
 		{							\
@@ -460,8 +484,8 @@
 		  else							\
 		    {							\
 		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
-		      ediff--;						\
-		      if (ediff == 0)					\
+		      _FP_ADD_INTERNAL_ediff--;				\
+		      if (_FP_ADD_INTERNAL_ediff == 0)			\
 			{						\
 			  _FP_FRAC_ADD_##wc (R, Y, X);			\
 			  goto add3;					\
@@ -487,10 +511,12 @@
 	      _FP_FRAC_HIGH_##fs (X) |= _FP_IMPLBIT_SH_##fs;		\
 									\
 	    add2:							\
-	      /* Shift the mantissa of X to the right EDIFF steps;	\
-		 remember to account later for the implicit MSB of Y.  */ \
-	      if (ediff <= _FP_WFRACBITS_##fs)				\
-		_FP_FRAC_SRS_##wc (X, ediff, _FP_WFRACBITS_##fs);	\
+	      /* Shift the mantissa of X to the right			\
+		 _FP_ADD_INTERNAL_EDIFF steps; remember to account	\
+		 later for the implicit MSB of Y.  */			\
+	      if (_FP_ADD_INTERNAL_ediff <= _FP_WFRACBITS_##fs)		\
+		_FP_FRAC_SRS_##wc (X, _FP_ADD_INTERNAL_ediff,		\
+				   _FP_WFRACBITS_##fs);			\
 	      else if (!_FP_FRAC_ZEROP_##wc (X))			\
 		_FP_FRAC_SET_##wc (X, _FP_MINFRAC_##wc);		\
 	      _FP_FRAC_ADD_##wc (R, Y, X);				\
@@ -497,7 +523,7 @@
 	    }								\
 	  else								\
 	    {								\
-	      /* ediff == 0.  */					\
+	      /* _FP_ADD_INTERNAL_ediff == 0.  */			\
 	      if (!_FP_EXP_NORMAL (fs, wc, X))				\
 		{							\
 		  if (X##_e == 0)					\
@@ -573,8 +599,8 @@
       else								\
 	{								\
 	  /* Subtraction.  */						\
-	  int ediff = X##_e - Y##_e;					\
-	  if (ediff > 0)						\
+	  int _FP_ADD_INTERNAL_ediff = X##_e - Y##_e;			\
+	  if (_FP_ADD_INTERNAL_ediff > 0)				\
 	    {								\
 	      R##_e = X##_e;						\
 	      R##_s = X##_s;						\
@@ -590,8 +616,8 @@
 		  else							\
 		    {							\
 		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
-		      ediff--;						\
-		      if (ediff == 0)					\
+		      _FP_ADD_INTERNAL_ediff--;				\
+		      if (_FP_ADD_INTERNAL_ediff == 0)			\
 			{						\
 			  _FP_FRAC_SUB_##wc (R, X, Y);			\
 			  goto sub3;					\
@@ -617,17 +643,19 @@
 	      _FP_FRAC_HIGH_##fs (Y) |= _FP_IMPLBIT_SH_##fs;		\
 									\
 	    sub1:							\
-	      /* Shift the mantissa of Y to the right EDIFF steps;	\
-		 remember to account later for the implicit MSB of X.  */ \
-	      if (ediff <= _FP_WFRACBITS_##fs)				\
-		_FP_FRAC_SRS_##wc (Y, ediff, _FP_WFRACBITS_##fs);	\
+	      /* Shift the mantissa of Y to the right			\
+		 _FP_ADD_INTERNAL_EDIFF steps; remember to account	\
+		 later for the implicit MSB of X.  */			\
+	      if (_FP_ADD_INTERNAL_ediff <= _FP_WFRACBITS_##fs)		\
+		_FP_FRAC_SRS_##wc (Y, _FP_ADD_INTERNAL_ediff,		\
+				   _FP_WFRACBITS_##fs);			\
 	      else if (!_FP_FRAC_ZEROP_##wc (Y))			\
 		_FP_FRAC_SET_##wc (Y, _FP_MINFRAC_##wc);		\
 	      _FP_FRAC_SUB_##wc (R, X, Y);				\
 	    }								\
-	  else if (ediff < 0)						\
+	  else if (_FP_ADD_INTERNAL_ediff < 0)				\
 	    {								\
-	      ediff = -ediff;						\
+	      _FP_ADD_INTERNAL_ediff = -_FP_ADD_INTERNAL_ediff;		\
 	      R##_e = Y##_e;						\
 	      R##_s = Y##_s;						\
 	      if (X##_e == 0)						\
@@ -642,8 +670,8 @@
 		  else							\
 		    {							\
 		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
-		      ediff--;						\
-		      if (ediff == 0)					\
+		      _FP_ADD_INTERNAL_ediff--;				\
+		      if (_FP_ADD_INTERNAL_ediff == 0)			\
 			{						\
 			  _FP_FRAC_SUB_##wc (R, Y, X);			\
 			  goto sub3;					\
@@ -669,10 +697,12 @@
 	      _FP_FRAC_HIGH_##fs (X) |= _FP_IMPLBIT_SH_##fs;		\
 									\
 	    sub2:							\
-	      /* Shift the mantissa of X to the right EDIFF steps;	\
-		 remember to account later for the implicit MSB of Y.  */ \
-	      if (ediff <= _FP_WFRACBITS_##fs)				\
-		_FP_FRAC_SRS_##wc (X, ediff, _FP_WFRACBITS_##fs);	\
+	      /* Shift the mantissa of X to the right			\
+		 _FP_ADD_INTERNAL_EDIFF steps; remember to account	\
+		 later for the implicit MSB of Y.  */			\
+	      if (_FP_ADD_INTERNAL_ediff <= _FP_WFRACBITS_##fs)		\
+		_FP_FRAC_SRS_##wc (X, _FP_ADD_INTERNAL_ediff,		\
+				   _FP_WFRACBITS_##fs);			\
 	      else if (!_FP_FRAC_ZEROP_##wc (X))			\
 		_FP_FRAC_SET_##wc (X, _FP_MINFRAC_##wc);		\
 	      _FP_FRAC_SUB_##wc (R, Y, X);				\
@@ -735,7 +765,8 @@
 			      R##_s = _FP_NANSIGN_##fs;			\
 			      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);	\
 			      _FP_FRAC_SLL_##wc (R, _FP_WORKBITS);	\
-			      FP_SET_EXCEPTION (FP_EX_INVALID);		\
+			      FP_SET_EXCEPTION (FP_EX_INVALID		\
+						| FP_EX_INVALID_ISI);	\
 			    }						\
 			  else						\
 			    {						\
@@ -783,24 +814,26 @@
 	sub3:								\
 	  if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs)		\
 	    {								\
-	      int diff;							\
+	      int _FP_ADD_INTERNAL_diff;				\
 	      /* Carry into most significant bit of larger one of X and Y, \
 		 canceling it; renormalize.  */				\
 	      _FP_FRAC_HIGH_##fs (R) &= _FP_IMPLBIT_SH_##fs - 1;	\
 	    norm:							\
-	      _FP_FRAC_CLZ_##wc (diff, R);				\
-	      diff -= _FP_WFRACXBITS_##fs;				\
-	      _FP_FRAC_SLL_##wc (R, diff);				\
-	      if (R##_e <= diff)					\
+	      _FP_FRAC_CLZ_##wc (_FP_ADD_INTERNAL_diff, R);		\
+	      _FP_ADD_INTERNAL_diff -= _FP_WFRACXBITS_##fs;		\
+	      _FP_FRAC_SLL_##wc (R, _FP_ADD_INTERNAL_diff);		\
+	      if (R##_e <= _FP_ADD_INTERNAL_diff)			\
 		{							\
 		  /* R is denormalized.  */				\
-		  diff = diff - R##_e + 1;				\
-		  _FP_FRAC_SRS_##wc (R, diff, _FP_WFRACBITS_##fs);	\
+		  _FP_ADD_INTERNAL_diff					\
+		    = _FP_ADD_INTERNAL_diff - R##_e + 1;		\
+		  _FP_FRAC_SRS_##wc (R, _FP_ADD_INTERNAL_diff,		\
+				     _FP_WFRACBITS_##fs);		\
 		  R##_e = 0;						\
 		}							\
 	      else							\
 		{							\
-		  R##_e -= diff;					\
+		  R##_e -= _FP_ADD_INTERNAL_diff;			\
 		  _FP_FRAC_HIGH_##fs (R) &= ~(_FP_W_TYPE) _FP_IMPLBIT_SH_##fs; \
 		}							\
 	    }								\
@@ -820,9 +853,7 @@
   while (0)
 
 
-/*
- * Main negation routine.  The input value is raw.
- */
+/* Main negation routine.  The input value is raw.  */
 
 #define _FP_NEG(fs, wc, R, X)			\
   do						\
@@ -834,9 +865,7 @@
   while (0)
 
 
-/*
- * Main multiplication routine.  The input values should be cooked.
- */
+/* Main multiplication routine.  The input values should be cooked.  */
 
 #define _FP_MUL(fs, wc, R, X, Y)				\
   do								\
@@ -889,7 +918,7 @@
 	  R##_s = _FP_NANSIGN_##fs;				\
 	  R##_c = FP_CLS_NAN;					\
 	  _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
-	  FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	  FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_IMZ);	\
 	  break;						\
 								\
 	default:						\
@@ -904,9 +933,9 @@
 #define _FP_FMA(fs, wc, dwc, R, X, Y, Z)				\
   do									\
     {									\
-      FP_DECL_##fs (T);							\
-      T##_s = X##_s ^ Y##_s;						\
-      T##_e = X##_e + Y##_e + 1;					\
+      FP_DECL_##fs (_FP_FMA_T);						\
+      _FP_FMA_T##_s = X##_s ^ Y##_s;					\
+      _FP_FMA_T##_e = X##_e + Y##_e + 1;				\
       switch (_FP_CLS_COMBINE (X##_c, Y##_c))				\
 	{								\
 	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NORMAL):		\
@@ -921,8 +950,8 @@
 									\
 	    case FP_CLS_ZERO:						\
 	      R##_c = FP_CLS_NORMAL;					\
-	      R##_s = T##_s;						\
-	      R##_e = T##_e;						\
+	      R##_s = _FP_FMA_T##_s;					\
+	      R##_e = _FP_FMA_T##_e;					\
 									\
 	      _FP_MUL_MEAT_##fs (R, X, Y);				\
 									\
@@ -933,38 +962,43 @@
 	      break;							\
 									\
 	    case FP_CLS_NORMAL:;					\
-	      _FP_FRAC_DECL_##dwc (TD);					\
-	      _FP_FRAC_DECL_##dwc (ZD);					\
-	      _FP_FRAC_DECL_##dwc (RD);					\
-	      _FP_MUL_MEAT_DW_##fs (TD, X, Y);				\
-	      R##_e = T##_e;						\
-	      int tsh = _FP_FRAC_HIGHBIT_DW_##dwc (fs, TD) == 0;	\
-	      T##_e -= tsh;						\
-	      int ediff = T##_e - Z##_e;				\
-	      if (ediff >= 0)						\
+	      _FP_FRAC_DECL_##dwc (_FP_FMA_TD);				\
+	      _FP_FRAC_DECL_##dwc (_FP_FMA_ZD);				\
+	      _FP_FRAC_DECL_##dwc (_FP_FMA_RD);				\
+	      _FP_MUL_MEAT_DW_##fs (_FP_FMA_TD, X, Y);			\
+	      R##_e = _FP_FMA_T##_e;					\
+	      int _FP_FMA_tsh						\
+		= _FP_FRAC_HIGHBIT_DW_##dwc (fs, _FP_FMA_TD) == 0;	\
+	      _FP_FMA_T##_e -= _FP_FMA_tsh;				\
+	      int _FP_FMA_ediff = _FP_FMA_T##_e - Z##_e;		\
+	      if (_FP_FMA_ediff >= 0)					\
 		{							\
-		  int shift = _FP_WFRACBITS_##fs - tsh - ediff;		\
-		  if (shift <= -_FP_WFRACBITS_##fs)			\
-		    _FP_FRAC_SET_##dwc (ZD, _FP_MINFRAC_##dwc);		\
+		  int _FP_FMA_shift					\
+		    = _FP_WFRACBITS_##fs - _FP_FMA_tsh - _FP_FMA_ediff;	\
+		  if (_FP_FMA_shift <= -_FP_WFRACBITS_##fs)		\
+		    _FP_FRAC_SET_##dwc (_FP_FMA_ZD, _FP_MINFRAC_##dwc);	\
 		  else							\
 		    {							\
-		      _FP_FRAC_COPY_##dwc##_##wc (ZD, Z);		\
-		      if (shift < 0)					\
-			_FP_FRAC_SRS_##dwc (ZD, -shift,			\
+		      _FP_FRAC_COPY_##dwc##_##wc (_FP_FMA_ZD, Z);	\
+		      if (_FP_FMA_shift < 0)				\
+			_FP_FRAC_SRS_##dwc (_FP_FMA_ZD, -_FP_FMA_shift,	\
 					    _FP_WFRACBITS_DW_##fs);	\
-		      else if (shift > 0)				\
-			_FP_FRAC_SLL_##dwc (ZD, shift);			\
+		      else if (_FP_FMA_shift > 0)			\
+			_FP_FRAC_SLL_##dwc (_FP_FMA_ZD, _FP_FMA_shift);	\
 		    }							\
-		  R##_s = T##_s;					\
-		  if (T##_s == Z##_s)					\
-		    _FP_FRAC_ADD_##dwc (RD, TD, ZD);			\
+		  R##_s = _FP_FMA_T##_s;				\
+		  if (_FP_FMA_T##_s == Z##_s)				\
+		    _FP_FRAC_ADD_##dwc (_FP_FMA_RD, _FP_FMA_TD,		\
+					_FP_FMA_ZD);			\
 		  else							\
 		    {							\
-		      _FP_FRAC_SUB_##dwc (RD, TD, ZD);			\
-		      if (_FP_FRAC_NEGP_##dwc (RD))			\
+		      _FP_FRAC_SUB_##dwc (_FP_FMA_RD, _FP_FMA_TD,	\
+					  _FP_FMA_ZD);			\
+		      if (_FP_FRAC_NEGP_##dwc (_FP_FMA_RD))		\
 			{						\
 			  R##_s = Z##_s;				\
-			  _FP_FRAC_SUB_##dwc (RD, ZD, TD);		\
+			  _FP_FRAC_SUB_##dwc (_FP_FMA_RD, _FP_FMA_ZD,	\
+					      _FP_FMA_TD);		\
 			}						\
 		    }							\
 		}							\
@@ -972,22 +1006,24 @@
 		{							\
 		  R##_e = Z##_e;					\
 		  R##_s = Z##_s;					\
-		  _FP_FRAC_COPY_##dwc##_##wc (ZD, Z);			\
-		  _FP_FRAC_SLL_##dwc (ZD, _FP_WFRACBITS_##fs);		\
-		  int shift = -ediff - tsh;				\
-		  if (shift >= _FP_WFRACBITS_DW_##fs)			\
-		    _FP_FRAC_SET_##dwc (TD, _FP_MINFRAC_##dwc);		\
-		  else if (shift > 0)					\
-		    _FP_FRAC_SRS_##dwc (TD, shift,			\
+		  _FP_FRAC_COPY_##dwc##_##wc (_FP_FMA_ZD, Z);		\
+		  _FP_FRAC_SLL_##dwc (_FP_FMA_ZD, _FP_WFRACBITS_##fs);	\
+		  int _FP_FMA_shift = -_FP_FMA_ediff - _FP_FMA_tsh;	\
+		  if (_FP_FMA_shift >= _FP_WFRACBITS_DW_##fs)		\
+		    _FP_FRAC_SET_##dwc (_FP_FMA_TD, _FP_MINFRAC_##dwc);	\
+		  else if (_FP_FMA_shift > 0)				\
+		    _FP_FRAC_SRS_##dwc (_FP_FMA_TD, _FP_FMA_shift,	\
 					_FP_WFRACBITS_DW_##fs);		\
-		  if (Z##_s == T##_s)					\
-		    _FP_FRAC_ADD_##dwc (RD, ZD, TD);			\
+		  if (Z##_s == _FP_FMA_T##_s)				\
+		    _FP_FRAC_ADD_##dwc (_FP_FMA_RD, _FP_FMA_ZD,		\
+					_FP_FMA_TD);			\
 		  else							\
-		    _FP_FRAC_SUB_##dwc (RD, ZD, TD);			\
+		    _FP_FRAC_SUB_##dwc (_FP_FMA_RD, _FP_FMA_ZD,		\
+					_FP_FMA_TD);			\
 		}							\
-	      if (_FP_FRAC_ZEROP_##dwc (RD))				\
+	      if (_FP_FRAC_ZEROP_##dwc (_FP_FMA_RD))			\
 		{							\
-		  if (T##_s == Z##_s)					\
+		  if (_FP_FMA_T##_s == Z##_s)				\
 		    R##_s = Z##_s;					\
 		  else							\
 		    R##_s = (FP_ROUNDMODE == FP_RND_MINF);		\
@@ -996,17 +1032,17 @@
 		}							\
 	      else							\
 		{							\
-		  int rlz;						\
-		  _FP_FRAC_CLZ_##dwc (rlz, RD);				\
-		  rlz -= _FP_WFRACXBITS_DW_##fs;			\
-		  R##_e -= rlz;						\
-		  int shift = _FP_WFRACBITS_##fs - rlz;			\
-		  if (shift > 0)					\
-		    _FP_FRAC_SRS_##dwc (RD, shift,			\
+		  int _FP_FMA_rlz;					\
+		  _FP_FRAC_CLZ_##dwc (_FP_FMA_rlz, _FP_FMA_RD);		\
+		  _FP_FMA_rlz -= _FP_WFRACXBITS_DW_##fs;		\
+		  R##_e -= _FP_FMA_rlz;					\
+		  int _FP_FMA_shift = _FP_WFRACBITS_##fs - _FP_FMA_rlz;	\
+		  if (_FP_FMA_shift > 0)				\
+		    _FP_FRAC_SRS_##dwc (_FP_FMA_RD, _FP_FMA_shift,	\
 					_FP_WFRACBITS_DW_##fs);		\
-		  else if (shift < 0)					\
-		    _FP_FRAC_SLL_##dwc (RD, -shift);			\
-		  _FP_FRAC_COPY_##wc##_##dwc (R, RD);			\
+		  else if (_FP_FMA_shift < 0)				\
+		    _FP_FRAC_SLL_##dwc (_FP_FMA_RD, -_FP_FMA_shift);	\
+		  _FP_FRAC_COPY_##wc##_##dwc (R, _FP_FMA_RD);		\
 		  R##_c = FP_CLS_NORMAL;				\
 		}							\
 	      break;							\
@@ -1014,39 +1050,39 @@
 	  goto done_fma;						\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):			\
-	  _FP_CHOOSENAN (fs, wc, T, X, Y, '*');				\
+	  _FP_CHOOSENAN (fs, wc, _FP_FMA_T, X, Y, '*');			\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):		\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_INF):			\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):			\
-	  T##_s = X##_s;						\
+	  _FP_FMA_T##_s = X##_s;					\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):			\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):		\
 	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NORMAL):		\
 	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):		\
-	  _FP_FRAC_COPY_##wc (T, X);					\
-	  T##_c = X##_c;						\
+	  _FP_FRAC_COPY_##wc (_FP_FMA_T, X);				\
+	  _FP_FMA_T##_c = X##_c;					\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NAN):		\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):			\
 	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NAN):			\
-	  T##_s = Y##_s;						\
+	  _FP_FMA_T##_s = Y##_s;					\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_INF):		\
 	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_ZERO):		\
-	  _FP_FRAC_COPY_##wc (T, Y);					\
-	  T##_c = Y##_c;						\
+	  _FP_FRAC_COPY_##wc (_FP_FMA_T, Y);				\
+	  _FP_FMA_T##_c = Y##_c;					\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):			\
 	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_INF):			\
-	  T##_s = _FP_NANSIGN_##fs;					\
-	  T##_c = FP_CLS_NAN;						\
-	  _FP_FRAC_SET_##wc (T, _FP_NANFRAC_##fs);			\
-	  FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	  _FP_FMA_T##_s = _FP_NANSIGN_##fs;				\
+	  _FP_FMA_T##_c = FP_CLS_NAN;					\
+	  _FP_FRAC_SET_##wc (_FP_FMA_T, _FP_NANFRAC_##fs);		\
+	  FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_IMZ_FMA);	\
 	  break;							\
 									\
 	default:							\
@@ -1054,10 +1090,10 @@
 	}								\
 									\
       /* T = X * Y is zero, infinity or NaN.  */			\
-      switch (_FP_CLS_COMBINE (T##_c, Z##_c))				\
+      switch (_FP_CLS_COMBINE (_FP_FMA_T##_c, Z##_c))			\
 	{								\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):			\
-	  _FP_CHOOSENAN (fs, wc, R, T, Z, '+');				\
+	  _FP_CHOOSENAN (fs, wc, R, _FP_FMA_T, Z, '+');			\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):		\
@@ -1065,9 +1101,9 @@
 	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):			\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):		\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):			\
-	  R##_s = T##_s;						\
-	  _FP_FRAC_COPY_##wc (R, T);					\
-	  R##_c = T##_c;						\
+	  R##_s = _FP_FMA_T##_s;					\
+	  _FP_FRAC_COPY_##wc (R, _FP_FMA_T);				\
+	  R##_c = _FP_FMA_T##_c;					\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):			\
@@ -1080,7 +1116,7 @@
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):			\
-	  if (T##_s == Z##_s)						\
+	  if (_FP_FMA_T##_s == Z##_s)					\
 	    {								\
 	      R##_s = Z##_s;						\
 	      _FP_FRAC_COPY_##wc (R, Z);				\
@@ -1091,12 +1127,12 @@
 	      R##_s = _FP_NANSIGN_##fs;					\
 	      R##_c = FP_CLS_NAN;					\
 	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);			\
-	      FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	      FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_ISI);	\
 	    }								\
 	  break;							\
 									\
 	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):		\
-	  if (T##_s == Z##_s)						\
+	  if (_FP_FMA_T##_s == Z##_s)					\
 	    R##_s = Z##_s;						\
 	  else								\
 	    R##_s = (FP_ROUNDMODE == FP_RND_MINF);			\
@@ -1112,9 +1148,7 @@
   while (0)
 
 
-/*
- * Main division routine.  The input values should be cooked.
- */
+/* Main division routine.  The input values should be cooked.  */
 
 #define _FP_DIV(fs, wc, R, X, Y)				\
   do								\
@@ -1167,7 +1201,10 @@
 	  R##_s = _FP_NANSIGN_##fs;				\
 	  R##_c = FP_CLS_NAN;					\
 	  _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
-	  FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	  FP_SET_EXCEPTION (FP_EX_INVALID			\
+			    | (X##_c == FP_CLS_INF		\
+			       ? FP_EX_INVALID_IDI		\
+			       : FP_EX_INVALID_ZDZ));		\
 	  break;						\
 								\
 	default:						\
@@ -1177,46 +1214,85 @@
   while (0)
 
 
-/*
- * Main differential comparison routine.  The inputs should be raw not
- * cooked.  The return is -1,0,1 for normal values, 2 otherwise.
- */
+/* Helper for comparisons.  EX is 0 not to raise exceptions, 1 to
+   raise exceptions for signaling NaN operands, 2 to raise exceptions
+   for all NaN operands.  Conditionals are organized to allow the
+   compiler to optimize away code based on the value of EX.  */
 
-#define _FP_CMP(fs, wc, ret, X, Y, un)					\
+#define _FP_CMP_CHECK_NAN(fs, wc, X, Y, ex)				\
   do									\
     {									\
-      /* NANs are unordered */						\
+      /* The arguments are unordered, which may or may not result in	\
+	 an exception.  */						\
+      if (ex)								\
+	{								\
+	  /* At least some cases of unordered arguments result in	\
+	     exceptions; check whether this is one.  */			\
+	  if (FP_EX_INVALID_SNAN || FP_EX_INVALID_VC)			\
+	    {								\
+	      /* Check separately for each case of "invalid"		\
+		 exceptions.  */					\
+	      if ((ex) == 2)						\
+		FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_VC);	\
+	      if (_FP_ISSIGNAN (fs, wc, X)				\
+		  || _FP_ISSIGNAN (fs, wc, Y))				\
+		FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_SNAN);	\
+	    }								\
+	  /* Otherwise, we only need to check whether to raise an	\
+	     exception, not which case or cases it is.  */		\
+	  else if ((ex) == 2						\
+		   || _FP_ISSIGNAN (fs, wc, X)				\
+		   || _FP_ISSIGNAN (fs, wc, Y))				\
+	    FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	}								\
+    }									\
+  while (0)
+
+/* Main differential comparison routine.  The inputs should be raw not
+   cooked.  The return is -1, 0, 1 for normal values, UN
+   otherwise.  */
+
+#define _FP_CMP(fs, wc, ret, X, Y, un, ex)				\
+  do									\
+    {									\
+      /* NANs are unordered.  */					\
       if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
 	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
 	{								\
-	  ret = un;							\
+	  (ret) = (un);							\
+	  _FP_CMP_CHECK_NAN (fs, wc, X, Y, (ex));			\
 	}								\
       else								\
 	{								\
-	  int __is_zero_x;						\
-	  int __is_zero_y;						\
+	  int _FP_CMP_is_zero_x;					\
+	  int _FP_CMP_is_zero_y;					\
 									\
-	  __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc (X)) ? 1 : 0;	\
-	  __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc (Y)) ? 1 : 0;	\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
 									\
-	  if (__is_zero_x && __is_zero_y)				\
-	    ret = 0;							\
-	  else if (__is_zero_x)						\
-	    ret = Y##_s ? 1 : -1;					\
-	  else if (__is_zero_y)						\
-	    ret = X##_s ? -1 : 1;					\
+	  _FP_CMP_is_zero_x						\
+	    = (!X##_e && _FP_FRAC_ZEROP_##wc (X)) ? 1 : 0;		\
+	  _FP_CMP_is_zero_y						\
+	    = (!Y##_e && _FP_FRAC_ZEROP_##wc (Y)) ? 1 : 0;		\
+									\
+	  if (_FP_CMP_is_zero_x && _FP_CMP_is_zero_y)			\
+	    (ret) = 0;							\
+	  else if (_FP_CMP_is_zero_x)					\
+	    (ret) = Y##_s ? 1 : -1;					\
+	  else if (_FP_CMP_is_zero_y)					\
+	    (ret) = X##_s ? -1 : 1;					\
 	  else if (X##_s != Y##_s)					\
-	    ret = X##_s ? -1 : 1;					\
+	    (ret) = X##_s ? -1 : 1;					\
 	  else if (X##_e > Y##_e)					\
-	    ret = X##_s ? -1 : 1;					\
+	    (ret) = X##_s ? -1 : 1;					\
 	  else if (X##_e < Y##_e)					\
-	    ret = X##_s ? 1 : -1;					\
+	    (ret) = X##_s ? 1 : -1;					\
 	  else if (_FP_FRAC_GT_##wc (X, Y))				\
-	    ret = X##_s ? -1 : 1;					\
+	    (ret) = X##_s ? -1 : 1;					\
 	  else if (_FP_FRAC_GT_##wc (Y, X))				\
-	    ret = X##_s ? 1 : -1;					\
+	    (ret) = X##_s ? 1 : -1;					\
 	  else								\
-	    ret = 0;							\
+	    (ret) = 0;							\
 	}								\
     }									\
   while (0)
@@ -1224,20 +1300,25 @@
 
 /* Simplification for strict equality.  */
 
-#define _FP_CMP_EQ(fs, wc, ret, X, Y)					\
+#define _FP_CMP_EQ(fs, wc, ret, X, Y, ex)				\
   do									\
     {									\
-      /* NANs are unordered */						\
+      /* NANs are unordered.  */					\
       if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
 	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
 	{								\
-	  ret = 1;							\
+	  (ret) = 1;							\
+	  _FP_CMP_CHECK_NAN (fs, wc, X, Y, (ex));			\
 	}								\
       else								\
 	{								\
-	  ret = !(X##_e == Y##_e					\
-		  && _FP_FRAC_EQ_##wc (X, Y)				\
-		  && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc (X)))); \
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, X);				\
+	  _FP_CHECK_FLUSH_ZERO (fs, wc, Y);				\
+									\
+	  (ret) = !(X##_e == Y##_e					\
+		    && _FP_FRAC_EQ_##wc (X, Y)				\
+		    && (X##_s == Y##_s					\
+			|| (!X##_e && _FP_FRAC_ZEROP_##wc (X))));	\
 	}								\
     }									\
   while (0)
@@ -1244,97 +1325,98 @@
 
 /* Version to test unordered.  */
 
-#define _FP_CMP_UNORD(fs, wc, ret, X, Y)				\
+#define _FP_CMP_UNORD(fs, wc, ret, X, Y, ex)				\
   do									\
     {									\
-      ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
-	     || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))); \
+      (ret) = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
+	       || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))); \
+      if (ret)								\
+	_FP_CMP_CHECK_NAN (fs, wc, X, Y, (ex));				\
     }									\
   while (0)
 
-/*
- * Main square root routine.  The input value should be cooked.
- */
+/* Main square root routine.  The input value should be cooked.  */
 
-#define _FP_SQRT(fs, wc, R, X)					\
-  do								\
-    {								\
-      _FP_FRAC_DECL_##wc (T);					\
-      _FP_FRAC_DECL_##wc (S);					\
-      _FP_W_TYPE q;						\
-      switch (X##_c)						\
-	{							\
-	case FP_CLS_NAN:					\
-	  _FP_FRAC_COPY_##wc (R, X);				\
-	  R##_s = X##_s;					\
-	  R##_c = FP_CLS_NAN;					\
-	  break;						\
-	case FP_CLS_INF:					\
-	  if (X##_s)						\
-	    {							\
-	      R##_s = _FP_NANSIGN_##fs;				\
-	      R##_c = FP_CLS_NAN; /* NAN */			\
-	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
-	      FP_SET_EXCEPTION (FP_EX_INVALID);			\
-	    }							\
-	  else							\
-	    {							\
-	      R##_s = 0;					\
-	      R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */	\
-	    }							\
-	  break;						\
-	case FP_CLS_ZERO:					\
-	  R##_s = X##_s;					\
-	  R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */		\
-	  break;						\
-	case FP_CLS_NORMAL:					\
-	  R##_s = 0;						\
-	  if (X##_s)						\
-	    {							\
-	      R##_c = FP_CLS_NAN; /* NAN */			\
-	      R##_s = _FP_NANSIGN_##fs;				\
-	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
-	      FP_SET_EXCEPTION (FP_EX_INVALID);			\
-	      break;						\
-	    }							\
-	  R##_c = FP_CLS_NORMAL;				\
-	  if (X##_e & 1)					\
-	    _FP_FRAC_SLL_##wc (X, 1);				\
-	  R##_e = X##_e >> 1;					\
-	  _FP_FRAC_SET_##wc (S, _FP_ZEROFRAC_##wc);		\
-	  _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);		\
-	  q = _FP_OVERFLOW_##fs >> 1;				\
-	  _FP_SQRT_MEAT_##wc (R, S, T, X, q);			\
-	}							\
-    }								\
+#define _FP_SQRT(fs, wc, R, X)						\
+  do									\
+    {									\
+      _FP_FRAC_DECL_##wc (_FP_SQRT_T);					\
+      _FP_FRAC_DECL_##wc (_FP_SQRT_S);					\
+      _FP_W_TYPE _FP_SQRT_q;						\
+      switch (X##_c)							\
+	{								\
+	case FP_CLS_NAN:						\
+	  _FP_FRAC_COPY_##wc (R, X);					\
+	  R##_s = X##_s;						\
+	  R##_c = FP_CLS_NAN;						\
+	  break;							\
+	case FP_CLS_INF:						\
+	  if (X##_s)							\
+	    {								\
+	      R##_s = _FP_NANSIGN_##fs;					\
+	      R##_c = FP_CLS_NAN; /* NAN */				\
+	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);			\
+	      FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_SQRT);	\
+	    }								\
+	  else								\
+	    {								\
+	      R##_s = 0;						\
+	      R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */		\
+	    }								\
+	  break;							\
+	case FP_CLS_ZERO:						\
+	  R##_s = X##_s;						\
+	  R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */			\
+	  break;							\
+	case FP_CLS_NORMAL:						\
+	  R##_s = 0;							\
+	  if (X##_s)							\
+	    {								\
+	      R##_c = FP_CLS_NAN; /* NAN */				\
+	      R##_s = _FP_NANSIGN_##fs;					\
+	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);			\
+	      FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_SQRT);	\
+	      break;							\
+	    }								\
+	  R##_c = FP_CLS_NORMAL;					\
+	  if (X##_e & 1)						\
+	    _FP_FRAC_SLL_##wc (X, 1);					\
+	  R##_e = X##_e >> 1;						\
+	  _FP_FRAC_SET_##wc (_FP_SQRT_S, _FP_ZEROFRAC_##wc);		\
+	  _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);			\
+	  _FP_SQRT_q = _FP_OVERFLOW_##fs >> 1;				\
+	  _FP_SQRT_MEAT_##wc (R, _FP_SQRT_S, _FP_SQRT_T, X,		\
+			      _FP_SQRT_q);				\
+	}								\
+    }									\
   while (0)
 
-/*
- * Convert from FP to integer.  Input is raw.
- */
+/* Convert from FP to integer.  Input is raw.  */
 
 /* RSIGNED can have following values:
- * 0:  the number is required to be 0..(2^rsize)-1, if not, NV is set plus
- *     the result is either 0 or (2^rsize)-1 depending on the sign in such
- *     case.
- * 1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
- *     NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- *     depending on the sign in such case.
- * -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
- *     set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
- *     depending on the sign in such case.
- */
+   0:  the number is required to be 0..(2^rsize)-1, if not, NV is set plus
+       the result is either 0 or (2^rsize)-1 depending on the sign in such
+       case.
+   1:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
+       NV is set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
+       depending on the sign in such case.
+   2:  the number is required to be -(2^(rsize-1))..(2^(rsize-1))-1, if not,
+       NV is set plus the result is reduced modulo 2^rsize.
+   -1: the number is required to be -(2^(rsize-1))..(2^rsize)-1, if not, NV is
+       set plus the result is either -(2^(rsize-1)) or (2^(rsize-1))-1
+       depending on the sign in such case.  */
 #define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)			\
   do									\
     {									\
       if (X##_e < _FP_EXPBIAS_##fs)					\
 	{								\
-	  r = 0;							\
+	  (r) = 0;							\
 	  if (X##_e == 0)						\
 	    {								\
 	      if (!_FP_FRAC_ZEROP_##wc (X))				\
 		{							\
-		  FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+		  if (!FP_DENORM_ZERO)					\
+		    FP_SET_EXCEPTION (FP_EX_INEXACT);			\
 		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
 		}							\
 	    }								\
@@ -1341,63 +1423,104 @@
 	  else								\
 	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
 	}								\
-      else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s) \
-	       || (!rsigned && X##_s))					\
+      else if ((rsigned) == 2						\
+	       && (X##_e						\
+		   >= ((_FP_EXPMAX_##fs					\
+			< _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + (rsize) - 1) \
+		       ? _FP_EXPMAX_##fs				\
+		       : _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs + (rsize) - 1))) \
 	{								\
+	  /* Overflow resulting in 0.  */				\
+	  (r) = 0;							\
+	  FP_SET_EXCEPTION (FP_EX_INVALID				\
+			    | FP_EX_INVALID_CVI				\
+			    | ((FP_EX_INVALID_SNAN			\
+				&& _FP_ISSIGNAN (fs, wc, X))		\
+			       ? FP_EX_INVALID_SNAN			\
+			       : 0));					\
+	}								\
+      else if ((rsigned) != 2						\
+	       && (X##_e >= (_FP_EXPMAX_##fs < _FP_EXPBIAS_##fs + (rsize) \
+			     ? _FP_EXPMAX_##fs				\
+			     : (_FP_EXPBIAS_##fs + (rsize)		\
+				- ((rsigned) > 0 || X##_s)))		\
+		   || (!(rsigned) && X##_s)))				\
+	{								\
 	  /* Overflow or converting to the most negative integer.  */	\
 	  if (rsigned)							\
 	    {								\
-	      r = 1;							\
-	      r <<= rsize - 1;						\
-	      r -= 1 - X##_s;						\
-	    } else {							\
-	    r = 0;							\
-	    if (!X##_s)							\
-	      r = ~r;							\
-	  }								\
+	      (r) = 1;							\
+	      (r) <<= (rsize) - 1;					\
+	      (r) -= 1 - X##_s;						\
+	    }								\
+	  else								\
+	    {								\
+	      (r) = 0;							\
+	      if (!X##_s)						\
+		(r) = ~(r);						\
+	    }								\
 									\
-	  if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1) \
+	  if (_FP_EXPBIAS_##fs + (rsize) - 1 < _FP_EXPMAX_##fs		\
+	      && (rsigned)						\
+	      && X##_s							\
+	      && X##_e == _FP_EXPBIAS_##fs + (rsize) - 1)		\
 	    {								\
 	      /* Possibly converting to most negative integer; check the \
 		 mantissa.  */						\
-	      int inexact = 0;						\
-	      (void) ((_FP_FRACBITS_##fs > rsize)			\
+	      int _FP_TO_INT_inexact = 0;				\
+	      (void) ((_FP_FRACBITS_##fs > (rsize))			\
 		      ? ({						\
-			  _FP_FRAC_SRST_##wc (X, inexact,		\
-					      _FP_FRACBITS_##fs - rsize, \
+			  _FP_FRAC_SRST_##wc (X, _FP_TO_INT_inexact,	\
+					      _FP_FRACBITS_##fs - (rsize), \
 					      _FP_FRACBITS_##fs);	\
 			  0;						\
 			})						\
 		      : 0);						\
 	      if (!_FP_FRAC_ZEROP_##wc (X))				\
-		FP_SET_EXCEPTION (FP_EX_INVALID);			\
-	      else if (inexact)						\
+		FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+	      else if (_FP_TO_INT_inexact)				\
 		FP_SET_EXCEPTION (FP_EX_INEXACT);			\
 	    }								\
 	  else								\
-	    FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	    FP_SET_EXCEPTION (FP_EX_INVALID				\
+			      | FP_EX_INVALID_CVI			\
+			      | ((FP_EX_INVALID_SNAN			\
+				  && _FP_ISSIGNAN (fs, wc, X))		\
+				 ? FP_EX_INVALID_SNAN			\
+				 : 0));					\
 	}								\
       else								\
 	{								\
+	  int _FP_TO_INT_inexact = 0;					\
 	  _FP_FRAC_HIGH_RAW_##fs (X) |= _FP_IMPLBIT_##fs;		\
 	  if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)	\
 	    {								\
-	      _FP_FRAC_ASSEMBLE_##wc (r, X, rsize);			\
-	      r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1;	\
+	      _FP_FRAC_ASSEMBLE_##wc ((r), X, (rsize));			\
+	      (r) <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1; \
 	    }								\
 	  else								\
 	    {								\
-	      int inexact;						\
-	      _FP_FRAC_SRST_##wc (X, inexact,				\
+	      _FP_FRAC_SRST_##wc (X, _FP_TO_INT_inexact,		\
 				  (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1 \
 				   - X##_e),				\
 				  _FP_FRACBITS_##fs);			\
-	      if (inexact)						\
-		FP_SET_EXCEPTION (FP_EX_INEXACT);			\
-	      _FP_FRAC_ASSEMBLE_##wc (r, X, rsize);			\
+	      _FP_FRAC_ASSEMBLE_##wc ((r), X, (rsize));			\
 	    }								\
-	  if (rsigned && X##_s)						\
-	    r = -r;							\
+	  if ((rsigned) && X##_s)					\
+	    (r) = -(r);							\
+	  if ((rsigned) == 2 && X##_e >= _FP_EXPBIAS_##fs + (rsize) - 1) \
+	    {								\
+	      /* Overflow or converting to the most negative integer.  */ \
+	      if (X##_e > _FP_EXPBIAS_##fs + (rsize) - 1		\
+		  || !X##_s						\
+		  || (r) != (((typeof (r)) 1) << ((rsize) - 1)))	\
+		{							\
+		  _FP_TO_INT_inexact = 0;				\
+		  FP_SET_EXCEPTION (FP_EX_INVALID | FP_EX_INVALID_CVI);	\
+		}							\
+	    }								\
+	  if (_FP_TO_INT_inexact)					\
+	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
 	}								\
     }									\
   while (0)
@@ -1409,30 +1532,33 @@
     {									\
       if (r)								\
 	{								\
-	  rtype ur_;							\
+	  rtype _FP_FROM_INT_ur;					\
 									\
-	  if ((X##_s = (r < 0)))					\
-	    r = -(rtype) r;						\
+	  if ((X##_s = ((r) < 0)))					\
+	    (r) = -(rtype) (r);						\
 									\
-	  ur_ = (rtype) r;						\
-	  (void) ((rsize <= _FP_W_TYPE_SIZE)				\
+	  _FP_FROM_INT_ur = (rtype) (r);				\
+	  (void) (((rsize) <= _FP_W_TYPE_SIZE)				\
 		  ? ({							\
-		      int lz_;						\
-		      __FP_CLZ (lz_, (_FP_W_TYPE) ur_);			\
-		      X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_; \
+		      int _FP_FROM_INT_lz;				\
+		      __FP_CLZ (_FP_FROM_INT_lz,			\
+				(_FP_W_TYPE) _FP_FROM_INT_ur);		\
+		      X##_e = (_FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1	\
+			       - _FP_FROM_INT_lz);			\
 		    })							\
-		  : ((rsize <= 2 * _FP_W_TYPE_SIZE)			\
+		  : (((rsize) <= 2 * _FP_W_TYPE_SIZE)			\
 		     ? ({						\
-			 int lz_;					\
-			 __FP_CLZ_2 (lz_,				\
-				     (_FP_W_TYPE) (ur_ >> _FP_W_TYPE_SIZE), \
-				     (_FP_W_TYPE) ur_);			\
+			 int _FP_FROM_INT_lz;				\
+			 __FP_CLZ_2 (_FP_FROM_INT_lz,			\
+				     (_FP_W_TYPE) (_FP_FROM_INT_ur	\
+						   >> _FP_W_TYPE_SIZE), \
+				     (_FP_W_TYPE) _FP_FROM_INT_ur);	\
 			 X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
-				  - lz_);				\
+				  - _FP_FROM_INT_lz);			\
 		       })						\
 		     : (abort (), 0)));					\
 									\
-	  if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		\
+	  if ((rsize) - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		\
 	      && X##_e >= _FP_EXPMAX_##fs)				\
 	    {								\
 	      /* Exponent too big; overflow to infinity.  (May also	\
@@ -1441,11 +1567,11 @@
 	      goto pack_semiraw;					\
 	    }								\
 									\
-	  if (rsize <= _FP_FRACBITS_##fs				\
+	  if ((rsize) <= _FP_FRACBITS_##fs				\
 	      || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs)		\
 	    {								\
 	      /* Exactly representable; shift left.  */			\
-	      _FP_FRAC_DISASSEMBLE_##wc (X, ur_, rsize);		\
+	      _FP_FRAC_DISASSEMBLE_##wc (X, _FP_FROM_INT_ur, (rsize));	\
 	      if (_FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1 - X##_e > 0)	\
 		_FP_FRAC_SLL_##wc (X, (_FP_EXPBIAS_##fs			\
 				       + _FP_FRACBITS_##fs - 1 - X##_e)); \
@@ -1455,12 +1581,14 @@
 	      /* More bits in integer than in floating type; need to	\
 		 round.  */						\
 	      if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e)	\
-		ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs		\
-				- _FP_WFRACBITS_##fs + 1))		\
-		       | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs	\
-					    - _FP_WFRACBITS_##fs + 1)))	\
-			  != 0));					\
-	      _FP_FRAC_DISASSEMBLE_##wc (X, ur_, rsize);		\
+		_FP_FROM_INT_ur						\
+		  = ((_FP_FROM_INT_ur >> (X##_e - _FP_EXPBIAS_##fs	\
+					  - _FP_WFRACBITS_##fs + 1))	\
+		     | ((_FP_FROM_INT_ur				\
+			 << ((rsize) - (X##_e - _FP_EXPBIAS_##fs	\
+					- _FP_WFRACBITS_##fs + 1)))	\
+			!= 0));						\
+	      _FP_FRAC_DISASSEMBLE_##wc (X, _FP_FROM_INT_ur, (rsize));	\
 	      if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0) \
 		_FP_FRAC_SLL_##wc (X, (_FP_EXPBIAS_##fs			\
 				       + _FP_WFRACBITS_##fs - 1 - X##_e)); \
@@ -1501,6 +1629,7 @@
 	{								\
 	  if (S##_e == 0)						\
 	    {								\
+	      _FP_CHECK_FLUSH_ZERO (sfs, swc, S);			\
 	      if (_FP_FRAC_ZEROP_##swc (S))				\
 		D##_e = 0;						\
 	      else if (_FP_EXPBIAS_##dfs				\
@@ -1510,17 +1639,19 @@
 		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
 					  - _FP_FRACBITS_##sfs));	\
 		  D##_e = 0;						\
+		  if (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)		\
+		    FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
 		}							\
 	      else							\
 		{							\
-		  int _lz;						\
+		  int FP_EXTEND_lz;					\
 		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
-		  _FP_FRAC_CLZ_##swc (_lz, S);				\
+		  _FP_FRAC_CLZ_##swc (FP_EXTEND_lz, S);			\
 		  _FP_FRAC_SLL_##dwc (D,				\
-				      _lz + _FP_FRACBITS_##dfs		\
+				      FP_EXTEND_lz + _FP_FRACBITS_##dfs	\
 				      - _FP_FRACTBITS_##sfs);		\
 		  D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1	\
-			   + _FP_FRACXBITS_##sfs - _lz);		\
+			   + _FP_FRACXBITS_##sfs - FP_EXTEND_lz);	\
 		}							\
 	    }								\
 	  else								\
@@ -1529,7 +1660,8 @@
 	      if (!_FP_FRAC_ZEROP_##swc (S))				\
 		{							\
 		  if (_FP_FRAC_SNANP (sfs, S))				\
-		    FP_SET_EXCEPTION (FP_EX_INVALID);			\
+		    FP_SET_EXCEPTION (FP_EX_INVALID			\
+				      | FP_EX_INVALID_SNAN);		\
 		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
 					  - _FP_FRACBITS_##sfs));	\
 		  _FP_SETQNAN (dfs, dwc, D);				\
@@ -1584,6 +1716,7 @@
 	{								\
 	  if (S##_e == 0)						\
 	    {								\
+	      _FP_CHECK_FLUSH_ZERO (sfs, swc, S);			\
 	      D##_e = 0;						\
 	      if (_FP_FRAC_ZEROP_##swc (S))				\
 		_FP_FRAC_SET_##dwc (D, _FP_ZEROFRAC_##dwc);		\
@@ -1626,9 +1759,7 @@
     }									\
   while (0)
 
-/*
- * Helper primitives.
- */
+/* Helper primitives.  */
 
 /* Count leading zeros in a word.  */
 
@@ -1638,11 +1769,11 @@
   do									\
     {									\
       if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))			\
-	r = __builtin_clz (x);						\
+	(r) = __builtin_clz (x);					\
       else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))		\
-	r = __builtin_clzl (x);						\
+	(r) = __builtin_clzl (x);					\
       else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))	\
-	r = __builtin_clzll (x);					\
+	(r) = __builtin_clzll (x);					\
       else								\
 	abort ();							\
     }									\
@@ -1652,7 +1783,7 @@
 #define _FP_DIV_HELP_imm(q, r, n, d)		\
   do						\
     {						\
-      q = n / d, r = n % d;			\
+      (q) = (n) / (d), (r) = (n) % (d);		\
     }						\
   while (0)
 
@@ -1662,24 +1793,26 @@
 #define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y)				\
   do									\
     {									\
-      int count = _FP_WFRACBITS_##fs;					\
-      _FP_FRAC_DECL_##wc (u);						\
-      _FP_FRAC_DECL_##wc (v);						\
-      _FP_FRAC_COPY_##wc (u, X);					\
-      _FP_FRAC_COPY_##wc (v, Y);					\
+      int _FP_DIV_MEAT_N_loop_count = _FP_WFRACBITS_##fs;		\
+      _FP_FRAC_DECL_##wc (_FP_DIV_MEAT_N_loop_u);			\
+      _FP_FRAC_DECL_##wc (_FP_DIV_MEAT_N_loop_v);			\
+      _FP_FRAC_COPY_##wc (_FP_DIV_MEAT_N_loop_u, X);			\
+      _FP_FRAC_COPY_##wc (_FP_DIV_MEAT_N_loop_v, Y);			\
       _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);				\
-      /* Normalize U and V.  */						\
-      _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs);			\
-      _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs);			\
+      /* Normalize _FP_DIV_MEAT_N_LOOP_U and _FP_DIV_MEAT_N_LOOP_V.  */	\
+      _FP_FRAC_SLL_##wc (_FP_DIV_MEAT_N_loop_u, _FP_WFRACXBITS_##fs);	\
+      _FP_FRAC_SLL_##wc (_FP_DIV_MEAT_N_loop_v, _FP_WFRACXBITS_##fs);	\
       /* First round.  Since the operands are normalized, either the	\
 	 first or second bit will be set in the fraction.  Produce a	\
 	 normalized result by checking which and adjusting the loop	\
 	 count and exponent accordingly.  */				\
-      if (_FP_FRAC_GE_1 (u, v))						\
+      if (_FP_FRAC_GE_1 (_FP_DIV_MEAT_N_loop_u, _FP_DIV_MEAT_N_loop_v))	\
 	{								\
-	  _FP_FRAC_SUB_##wc (u, u, v);					\
+	  _FP_FRAC_SUB_##wc (_FP_DIV_MEAT_N_loop_u,			\
+			     _FP_DIV_MEAT_N_loop_u,			\
+			     _FP_DIV_MEAT_N_loop_v);			\
 	  _FP_FRAC_LOW_##wc (R) |= 1;					\
-	  count--;							\
+	  _FP_DIV_MEAT_N_loop_count--;					\
 	}								\
       else								\
 	R##_e--;							\
@@ -1686,18 +1819,25 @@
       /* Subsequent rounds.  */						\
       do								\
 	{								\
-	  int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0;		\
-	  _FP_FRAC_SLL_##wc (u, 1);					\
+	  int _FP_DIV_MEAT_N_loop_msb					\
+	    = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (_FP_DIV_MEAT_N_loop_u) < 0; \
+	  _FP_FRAC_SLL_##wc (_FP_DIV_MEAT_N_loop_u, 1);			\
 	  _FP_FRAC_SLL_##wc (R, 1);					\
-	  if (msb || _FP_FRAC_GE_1 (u, v))				\
+	  if (_FP_DIV_MEAT_N_loop_msb					\
+	      || _FP_FRAC_GE_1 (_FP_DIV_MEAT_N_loop_u,			\
+				_FP_DIV_MEAT_N_loop_v))			\
 	    {								\
-	      _FP_FRAC_SUB_##wc (u, u, v);				\
+	      _FP_FRAC_SUB_##wc (_FP_DIV_MEAT_N_loop_u,			\
+				 _FP_DIV_MEAT_N_loop_u,			\
+				 _FP_DIV_MEAT_N_loop_v);		\
 	      _FP_FRAC_LOW_##wc (R) |= 1;				\
 	    }								\
 	}								\
-      while (--count > 0);						\
-      /* If there's anything left in U, the result is inexact.  */	\
-      _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u);		\
+      while (--_FP_DIV_MEAT_N_loop_count > 0);				\
+      /* If there's anything left in _FP_DIV_MEAT_N_LOOP_U, the result	\
+	 is inexact.  */						\
+      _FP_FRAC_LOW_##wc (R)						\
+	|= !_FP_FRAC_ZEROP_##wc (_FP_DIV_MEAT_N_loop_u);		\
     }									\
   while (0)
 
Index: libgcc/soft-fp/quad.h
===================================================================
--- libgcc/soft-fp/quad.h	(revision 216037)
+++ libgcc/soft-fp/quad.h	(working copy)
@@ -95,14 +95,14 @@
 
 
 # define FP_DECL_Q(X)		_FP_DECL (4, X)
-# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_4 (Q, X, val)
-# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_4_P (Q, X, val)
-# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_4 (Q, val, X)
+# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_4 (Q, X, (val))
+# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_4_P (Q, X, (val))
+# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_4 (Q, (val), X)
 # define FP_PACK_RAW_QP(val, X)			\
   do						\
     {						\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_4_P (Q, val, X);		\
+	_FP_PACK_RAW_4_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -109,7 +109,7 @@
 # define FP_UNPACK_Q(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_4 (Q, X, val);		\
+      _FP_UNPACK_RAW_4 (Q, X, (val));		\
       _FP_UNPACK_CANONICAL (Q, 4, X);		\
     }						\
   while (0)
@@ -117,7 +117,7 @@
 # define FP_UNPACK_QP(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_4_P (Q, X, val);		\
+      _FP_UNPACK_RAW_4_P (Q, X, (val));		\
       _FP_UNPACK_CANONICAL (Q, 4, X);		\
     }						\
   while (0)
@@ -125,7 +125,7 @@
 # define FP_UNPACK_SEMIRAW_Q(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_4 (Q, X, val);		\
+      _FP_UNPACK_RAW_4 (Q, X, (val));		\
       _FP_UNPACK_SEMIRAW (Q, 4, X);		\
     }						\
   while (0)
@@ -133,7 +133,7 @@
 # define FP_UNPACK_SEMIRAW_QP(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_4_P (Q, X, val);		\
+      _FP_UNPACK_RAW_4_P (Q, X, (val));		\
       _FP_UNPACK_SEMIRAW (Q, 4, X);		\
     }						\
   while (0)
@@ -142,7 +142,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (Q, 4, X);		\
-      _FP_PACK_RAW_4 (Q, val, X);		\
+      _FP_PACK_RAW_4 (Q, (val), X);		\
     }						\
   while (0)
 
@@ -151,7 +151,7 @@
     {						\
       _FP_PACK_CANONICAL (Q, 4, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_4_P (Q, val, X);		\
+	_FP_PACK_RAW_4_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -159,7 +159,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (Q, 4, X);		\
-      _FP_PACK_RAW_4 (Q, val, X);		\
+      _FP_PACK_RAW_4 (Q, (val), X);		\
     }						\
   while (0)
 
@@ -168,7 +168,7 @@
     {						\
       _FP_PACK_SEMIRAW (Q, 4, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_4_P (Q, val, X);		\
+	_FP_PACK_RAW_4_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -179,15 +179,15 @@
 # define FP_MUL_Q(R, X, Y)		_FP_MUL (Q, 4, R, X, Y)
 # define FP_DIV_Q(R, X, Y)		_FP_DIV (Q, 4, R, X, Y)
 # define FP_SQRT_Q(R, X)		_FP_SQRT (Q, 4, R, X)
-# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_4 (R, S, T, X, Q)
+# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_4 (R, S, T, X, (Q))
 # define FP_FMA_Q(R, X, Y, Z)		_FP_FMA (Q, 4, 8, R, X, Y, Z)
 
-# define FP_CMP_Q(r, X, Y, un)		_FP_CMP (Q, 4, r, X, Y, un)
-# define FP_CMP_EQ_Q(r, X, Y)		_FP_CMP_EQ (Q, 4, r, X, Y)
-# define FP_CMP_UNORD_Q(r, X, Y)	_FP_CMP_UNORD (Q, 4, r, X, Y)
+# define FP_CMP_Q(r, X, Y, un, ex)	_FP_CMP (Q, 4, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_Q(r, X, Y, ex)	_FP_CMP_EQ (Q, 4, (r), X, Y, (ex))
+# define FP_CMP_UNORD_Q(r, X, Y, ex)	_FP_CMP_UNORD (Q, 4, (r), X, Y, (ex))
 
-# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 4, r, X, rsz, rsg)
-# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 4, X, r, rs, rt)
+# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 4, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 4, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_4 (X)
 # define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_4 (X)
@@ -219,14 +219,14 @@
 };
 
 # define FP_DECL_Q(X)		_FP_DECL (2, X)
-# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_2 (Q, X, val)
-# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_2_P (Q, X, val)
-# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_2 (Q, val, X)
+# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_2 (Q, X, (val))
+# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_2_P (Q, X, (val))
+# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_2 (Q, (val), X)
 # define FP_PACK_RAW_QP(val, X)			\
   do						\
     {						\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (Q, val, X);		\
+	_FP_PACK_RAW_2_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -233,7 +233,7 @@
 # define FP_UNPACK_Q(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_2 (Q, X, val);		\
+      _FP_UNPACK_RAW_2 (Q, X, (val));		\
       _FP_UNPACK_CANONICAL (Q, 2, X);		\
     }						\
   while (0)
@@ -241,7 +241,7 @@
 # define FP_UNPACK_QP(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_2_P (Q, X, val);		\
+      _FP_UNPACK_RAW_2_P (Q, X, (val));		\
       _FP_UNPACK_CANONICAL (Q, 2, X);		\
     }						\
   while (0)
@@ -249,7 +249,7 @@
 # define FP_UNPACK_SEMIRAW_Q(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_2 (Q, X, val);		\
+      _FP_UNPACK_RAW_2 (Q, X, (val));		\
       _FP_UNPACK_SEMIRAW (Q, 2, X);		\
     }						\
   while (0)
@@ -257,7 +257,7 @@
 # define FP_UNPACK_SEMIRAW_QP(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_2_P (Q, X, val);		\
+      _FP_UNPACK_RAW_2_P (Q, X, (val));		\
       _FP_UNPACK_SEMIRAW (Q, 2, X);		\
     }						\
   while (0)
@@ -266,7 +266,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (Q, 2, X);		\
-      _FP_PACK_RAW_2 (Q, val, X);		\
+      _FP_PACK_RAW_2 (Q, (val), X);		\
     }						\
   while (0)
 
@@ -275,7 +275,7 @@
     {						\
       _FP_PACK_CANONICAL (Q, 2, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (Q, val, X);		\
+	_FP_PACK_RAW_2_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -283,7 +283,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (Q, 2, X);		\
-      _FP_PACK_RAW_2 (Q, val, X);		\
+      _FP_PACK_RAW_2 (Q, (val), X);		\
     }						\
   while (0)
 
@@ -292,7 +292,7 @@
     {						\
       _FP_PACK_SEMIRAW (Q, 2, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_2_P (Q, val, X);		\
+	_FP_PACK_RAW_2_P (Q, (val), X);		\
     }						\
   while (0)
 
@@ -303,15 +303,15 @@
 # define FP_MUL_Q(R, X, Y)		_FP_MUL (Q, 2, R, X, Y)
 # define FP_DIV_Q(R, X, Y)		_FP_DIV (Q, 2, R, X, Y)
 # define FP_SQRT_Q(R, X)		_FP_SQRT (Q, 2, R, X)
-# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, Q)
+# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, (Q))
 # define FP_FMA_Q(R, X, Y, Z)		_FP_FMA (Q, 2, 4, R, X, Y, Z)
 
-# define FP_CMP_Q(r, X, Y, un)		_FP_CMP (Q, 2, r, X, Y, un)
-# define FP_CMP_EQ_Q(r, X, Y)		_FP_CMP_EQ (Q, 2, r, X, Y)
-# define FP_CMP_UNORD_Q(r, X, Y)	_FP_CMP_UNORD (Q, 2, r, X, Y)
+# define FP_CMP_Q(r, X, Y, un, ex)	_FP_CMP (Q, 2, (r), X, Y, (un), (ex))
+# define FP_CMP_EQ_Q(r, X, Y, ex)	_FP_CMP_EQ (Q, 2, (r), X, Y, (ex))
+# define FP_CMP_UNORD_Q(r, X, Y, ex)	_FP_CMP_UNORD (Q, 2, (r), X, Y, (ex))
 
-# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 2, r, X, rsz, rsg)
-# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 2, X, r, rs, rt)
+# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 2, (r), X, (rsz), (rsg))
+# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 2, X, (r), (rs), rt)
 
 # define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_2 (X)
 # define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_2 (X)
Index: libgcc/soft-fp/single.h
===================================================================
--- libgcc/soft-fp/single.h	(revision 216037)
+++ libgcc/soft-fp/single.h	(working copy)
@@ -83,14 +83,14 @@
 };
 
 #define FP_DECL_S(X)		_FP_DECL (1, X)
-#define FP_UNPACK_RAW_S(X, val)	_FP_UNPACK_RAW_1 (S, X, val)
-#define FP_UNPACK_RAW_SP(X, val)	_FP_UNPACK_RAW_1_P (S, X, val)
-#define FP_PACK_RAW_S(val, X)	_FP_PACK_RAW_1 (S, val, X)
+#define FP_UNPACK_RAW_S(X, val)	_FP_UNPACK_RAW_1 (S, X, (val))
+#define FP_UNPACK_RAW_SP(X, val)	_FP_UNPACK_RAW_1_P (S, X, (val))
+#define FP_PACK_RAW_S(val, X)	_FP_PACK_RAW_1 (S, (val), X)
 #define FP_PACK_RAW_SP(val, X)			\
   do						\
     {						\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (S, val, X);		\
+	_FP_PACK_RAW_1_P (S, (val), X);		\
     }						\
   while (0)
 
@@ -97,7 +97,7 @@
 #define FP_UNPACK_S(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_1 (S, X, val);		\
+      _FP_UNPACK_RAW_1 (S, X, (val));		\
       _FP_UNPACK_CANONICAL (S, 1, X);		\
     }						\
   while (0)
@@ -105,7 +105,7 @@
 #define FP_UNPACK_SP(X, val)			\
   do						\
     {						\
-      _FP_UNPACK_RAW_1_P (S, X, val);		\
+      _FP_UNPACK_RAW_1_P (S, X, (val));		\
       _FP_UNPACK_CANONICAL (S, 1, X);		\
     }						\
   while (0)
@@ -113,7 +113,7 @@
 #define FP_UNPACK_SEMIRAW_S(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_1 (S, X, val);		\
+      _FP_UNPACK_RAW_1 (S, X, (val));		\
       _FP_UNPACK_SEMIRAW (S, 1, X);		\
     }						\
   while (0)
@@ -121,7 +121,7 @@
 #define FP_UNPACK_SEMIRAW_SP(X, val)		\
   do						\
     {						\
-      _FP_UNPACK_RAW_1_P (S, X, val);		\
+      _FP_UNPACK_RAW_1_P (S, X, (val));		\
       _FP_UNPACK_SEMIRAW (S, 1, X);		\
     }						\
   while (0)
@@ -130,7 +130,7 @@
   do						\
     {						\
       _FP_PACK_CANONICAL (S, 1, X);		\
-      _FP_PACK_RAW_1 (S, val, X);		\
+      _FP_PACK_RAW_1 (S, (val), X);		\
     }						\
   while (0)
 
@@ -139,7 +139,7 @@
     {						\
       _FP_PACK_CANONICAL (S, 1, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (S, val, X);		\
+	_FP_PACK_RAW_1_P (S, (val), X);		\
     }						\
   while (0)
 
@@ -147,7 +147,7 @@
   do						\
     {						\
       _FP_PACK_SEMIRAW (S, 1, X);		\
-      _FP_PACK_RAW_1 (S, val, X);		\
+      _FP_PACK_RAW_1 (S, (val), X);		\
     }						\
   while (0)
 
@@ -156,7 +156,7 @@
     {						\
       _FP_PACK_SEMIRAW (S, 1, X);		\
       if (!FP_INHIBIT_RESULTS)			\
-	_FP_PACK_RAW_1_P (S, val, X);		\
+	_FP_PACK_RAW_1_P (S, (val), X);		\
     }						\
   while (0)
 
@@ -167,7 +167,7 @@
 #define FP_MUL_S(R, X, Y)		_FP_MUL (S, 1, R, X, Y)
 #define FP_DIV_S(R, X, Y)		_FP_DIV (S, 1, R, X, Y)
 #define FP_SQRT_S(R, X)			_FP_SQRT (S, 1, R, X)
-#define _FP_SQRT_MEAT_S(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, Q)
+#define _FP_SQRT_MEAT_S(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, (Q))
 
 #if _FP_W_TYPE_SIZE < 64
 # define FP_FMA_S(R, X, Y, Z)	_FP_FMA (S, 1, 2, R, X, Y, Z)
@@ -175,12 +175,12 @@
 # define FP_FMA_S(R, X, Y, Z)	_FP_FMA (S, 1, 1, R, X, Y, Z)
 #endif
 
-#define FP_CMP_S(r, X, Y, un)	_FP_CMP (S, 1, r, X, Y, un)
-#define FP_CMP_EQ_S(r, X, Y)	_FP_CMP_EQ (S, 1, r, X, Y)
-#define FP_CMP_UNORD_S(r, X, Y)	_FP_CMP_UNORD (S, 1, r, X, Y)
+#define FP_CMP_S(r, X, Y, un, ex)	_FP_CMP (S, 1, (r), X, Y, (un), (ex))
+#define FP_CMP_EQ_S(r, X, Y, ex)	_FP_CMP_EQ (S, 1, (r), X, Y, (ex))
+#define FP_CMP_UNORD_S(r, X, Y, ex)	_FP_CMP_UNORD (S, 1, (r), X, Y, (ex))
 
-#define FP_TO_INT_S(r, X, rsz, rsg)	_FP_TO_INT (S, 1, r, X, rsz, rsg)
-#define FP_FROM_INT_S(X, r, rs, rt)	_FP_FROM_INT (S, 1, X, r, rs, rt)
+#define FP_TO_INT_S(r, X, rsz, rsg)	_FP_TO_INT (S, 1, (r), X, (rsz), (rsg))
+#define FP_FROM_INT_S(X, r, rs, rt)	_FP_FROM_INT (S, 1, X, (r), (rs), rt)
 
 #define _FP_FRAC_HIGH_S(X)	_FP_FRAC_HIGH_1 (X)
 #define _FP_FRAC_HIGH_RAW_S(X)	_FP_FRAC_HIGH_1 (X)
Index: libgcc/soft-fp/soft-fp.h
===================================================================
--- libgcc/soft-fp/soft-fp.h	(revision 216037)
+++ libgcc/soft-fp/soft-fp.h	(working copy)
@@ -38,7 +38,7 @@
 # include "sfp-machine.h"
 #endif
 
-/* Allow sfp-machine to have its own byte order definitions. */
+/* Allow sfp-machine to have its own byte order definitions.  */
 #ifndef __BYTE_ORDER
 # ifdef _LIBC
 #  include <endian.h>
@@ -63,7 +63,7 @@
 # define FP_ROUNDMODE		FP_RND_NEAREST
 #endif
 
-/* By default don't care about exceptions. */
+/* By default don't care about exceptions.  */
 #ifndef FP_EX_INVALID
 # define FP_EX_INVALID		0
 #endif
@@ -83,6 +83,44 @@
 # define FP_EX_DENORM		0
 #endif
 
+/* Sub-exceptions of "invalid".  */
+/* Signaling NaN operand.  */
+#ifndef FP_EX_INVALID_SNAN
+# define FP_EX_INVALID_SNAN	0
+#endif
+/* Inf * 0.  */
+#ifndef FP_EX_INVALID_IMZ
+# define FP_EX_INVALID_IMZ	0
+#endif
+/* fma (Inf, 0, c).  */
+#ifndef FP_EX_INVALID_IMZ_FMA
+# define FP_EX_INVALID_IMZ_FMA	0
+#endif
+/* Inf - Inf.  */
+#ifndef FP_EX_INVALID_ISI
+# define FP_EX_INVALID_ISI	0
+#endif
+/* 0 / 0.  */
+#ifndef FP_EX_INVALID_ZDZ
+# define FP_EX_INVALID_ZDZ	0
+#endif
+/* Inf / Inf.  */
+#ifndef FP_EX_INVALID_IDI
+# define FP_EX_INVALID_IDI	0
+#endif
+/* sqrt (negative).  */
+#ifndef FP_EX_INVALID_SQRT
+# define FP_EX_INVALID_SQRT	0
+#endif
+/* Invalid conversion to integer.  */
+#ifndef FP_EX_INVALID_CVI
+# define FP_EX_INVALID_CVI	0
+#endif
+/* Invalid comparison.  */
+#ifndef FP_EX_INVALID_VC
+# define FP_EX_INVALID_VC	0
+#endif
+
 /* _FP_STRUCT_LAYOUT may be defined as an attribute to determine the
    struct layout variant used for structures where bit-fields are used
    to access specific parts of binary floating-point numbers.  This is
@@ -108,9 +146,15 @@
 #endif
 
 /* Initialize any machine-specific state used in
+   FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS.  */
+#ifndef FP_INIT_TRAPPING_EXCEPTIONS
+# define FP_INIT_TRAPPING_EXCEPTIONS FP_INIT_ROUNDMODE
+#endif
+
+/* Initialize any machine-specific state used in
    FP_HANDLE_EXCEPTIONS.  */
 #ifndef FP_INIT_EXCEPTIONS
-# define FP_INIT_EXCEPTIONS FP_INIT_ROUNDMODE
+# define FP_INIT_EXCEPTIONS FP_INIT_TRAPPING_EXCEPTIONS
 #endif
 
 #ifndef FP_HANDLE_EXCEPTIONS
@@ -117,12 +161,16 @@
 # define FP_HANDLE_EXCEPTIONS do {} while (0)
 #endif
 
+/* Whether to flush subnormal inputs to zero with the same sign.  */
+#ifndef FP_DENORM_ZERO
+# define FP_DENORM_ZERO 0
+#endif
+
 #ifndef FP_INHIBIT_RESULTS
 /* By default we write the results always.
- * sfp-machine may override this and e.g.
- * check if some exceptions are unmasked
- * and inhibit it in such a case.
- */
+   sfp-machine may override this and e.g.
+   check if some exceptions are unmasked
+   and inhibit it in such a case.  */
 # define FP_INHIBIT_RESULTS 0
 #endif
 
@@ -129,9 +177,6 @@
 #define FP_SET_EXCEPTION(ex)				\
   _fex |= (ex)
 
-#define FP_CLEAR_EXCEPTIONS				\
-  _fex = 0
-
 #define FP_CUR_EXCEPTIONS				\
   (_fex)
 
@@ -166,6 +211,16 @@
 
 #endif
 
+/* A file using soft-fp may define FP_NO_EXACT_UNDERFLOW before
+   including soft-fp.h to indicate that, although a macro used there
+   could allow for the case of exact underflow requiring the underflow
+   exception to be raised if traps are enabled, for the particular
+   arguments used in that file no exact underflow can occur.  */
+#ifdef FP_NO_EXACT_UNDERFLOW
+# undef FP_TRAPPING_EXCEPTIONS
+# define FP_TRAPPING_EXCEPTIONS 0
+#endif
+
 #define _FP_ROUND_NEAREST(wc, X)				\
   do								\
     {								\
Index: libgcc/soft-fp/unorddf2.c
===================================================================
--- libgcc/soft-fp/unorddf2.c	(revision 216037)
+++ libgcc/soft-fp/unorddf2.c	(working copy)
@@ -41,9 +41,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_D (A, a);
   FP_UNPACK_RAW_D (B, b);
-  FP_CMP_UNORD_D (r, A, B);
-  if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_UNORD_D (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/unordsf2.c
===================================================================
--- libgcc/soft-fp/unordsf2.c	(revision 216037)
+++ libgcc/soft-fp/unordsf2.c	(working copy)
@@ -41,9 +41,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_S (A, a);
   FP_UNPACK_RAW_S (B, b);
-  FP_CMP_UNORD_S (r, A, B);
-  if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_UNORD_S (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/unordtf2.c
===================================================================
--- libgcc/soft-fp/unordtf2.c	(revision 216037)
+++ libgcc/soft-fp/unordtf2.c	(working copy)
@@ -41,9 +41,7 @@
   FP_INIT_EXCEPTIONS;
   FP_UNPACK_RAW_Q (A, a);
   FP_UNPACK_RAW_Q (B, b);
-  FP_CMP_UNORD_Q (r, A, B);
-  if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
-    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_CMP_UNORD_Q (r, A, B, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;

-- 
Joseph S. Myers
joseph@codesourcery.com

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

* Update soft-fp from glibc
@ 2014-02-12 23:26 Joseph S. Myers
  0 siblings, 0 replies; 7+ messages in thread
From: Joseph S. Myers @ 2014-02-12 23:26 UTC (permalink / raw)
  To: gcc-patches

This patch updates soft-fp in libgcc from glibc.  The motivation for
this late update is the recent change of MIPS to use soft-fp: the
update brings in the new support for after-rounding tininess
detection, without which MIPS TFmode operations would have started
raising underflow exceptions in certain cases where they should not be
raised on after-rounding architectures such as MIPS, and would not
previously have been raised (because of the use of fp-bit), a
technical regression that would cause issues for enabling testing
rounding modes and exceptions for MIPS long double in glibc.  The only
other soft-fp changes are to copyright dates.

The _FP_TININESS_AFTER_ROUNDING settings in sfp-machine.h for
architectures not supported by glibc have not been checked, and have
comments to that effect - but since none of the unchecked
architectures actually have any support in libgcc for generating
hardware exceptions from software floating point, there is no
observable effect of any inaccuracy in the choice of setting (which in
any case is only meaningful if the architecture defines this choice at
all - i.e. if it has some form of hardware floating point, but soft-fp
is being used for operations or types not supported in hardware).

__float128 testcases are added that illustrate on x86 / x86_64 / ia64
what has been fixed (IEEE 754-2008 requires the choice of tininess
detection to be the same for all binary operations, so it was a bug
that __float128 previously used before-rounding tininess detection
when hardware floating point used after-rounding on those
architectures).

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
to mainline.

gcc/testsuite:
2014-02-12  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/torture/float128-mul-underflow.c,
	gcc.dg/torture/float128-truncdf-underflow.c,
	gcc.dg/torture/float128-truncsf-underflow.c: New tests.

libgcc:
2014-02-12  Joseph Myers  <joseph@codesourcery.com>

	* soft-fp/adddf3.c: Update from glibc.
	* soft-fp/addsf3.c: Likewise.
	* soft-fp/addtf3.c: Likewise.
	* soft-fp/divdf3.c: Likewise.
	* soft-fp/divsf3.c: Likewise.
	* soft-fp/divtf3.c: Likewise.
	* soft-fp/double.h: Likewise.
	* soft-fp/eqdf2.c: Likewise.
	* soft-fp/eqsf2.c: Likewise.
	* soft-fp/eqtf2.c: Likewise.
	* soft-fp/extenddftf2.c: Likewise.
	* soft-fp/extended.h: Likewise.
	* soft-fp/extendsfdf2.c: Likewise.
	* soft-fp/extendsftf2.c: Likewise.
	* soft-fp/extendxftf2.c: Likewise.
	* soft-fp/fixdfdi.c: Likewise.
	* soft-fp/fixdfsi.c: Likewise.
	* soft-fp/fixdfti.c: Likewise.
	* soft-fp/fixsfdi.c: Likewise.
	* soft-fp/fixsfsi.c: Likewise.
	* soft-fp/fixsfti.c: Likewise.
	* soft-fp/fixtfdi.c: Likewise.
	* soft-fp/fixtfsi.c: Likewise.
	* soft-fp/fixtfti.c: Likewise.
	* soft-fp/fixunsdfdi.c: Likewise.
	* soft-fp/fixunsdfsi.c: Likewise.
	* soft-fp/fixunsdfti.c: Likewise.
	* soft-fp/fixunssfdi.c: Likewise.
	* soft-fp/fixunssfsi.c: Likewise.
	* soft-fp/fixunssfti.c: Likewise.
	* soft-fp/fixunstfdi.c: Likewise.
	* soft-fp/fixunstfsi.c: Likewise.
	* soft-fp/fixunstfti.c: Likewise.
	* soft-fp/floatdidf.c: Likewise.
	* soft-fp/floatdisf.c: Likewise.
	* soft-fp/floatditf.c: Likewise.
	* soft-fp/floatsidf.c: Likewise.
	* soft-fp/floatsisf.c: Likewise.
	* soft-fp/floatsitf.c: Likewise.
	* soft-fp/floattidf.c: Likewise.
	* soft-fp/floattisf.c: Likewise.
	* soft-fp/floattitf.c: Likewise.
	* soft-fp/floatundidf.c: Likewise.
	* soft-fp/floatundisf.c: Likewise.
	* soft-fp/floatunditf.c: Likewise.
	* soft-fp/floatunsidf.c: Likewise.
	* soft-fp/floatunsisf.c: Likewise.
	* soft-fp/floatunsitf.c: Likewise.
	* soft-fp/floatuntidf.c: Likewise.
	* soft-fp/floatuntisf.c: Likewise.
	* soft-fp/floatuntitf.c: Likewise.
	* soft-fp/gedf2.c: Likewise.
	* soft-fp/gesf2.c: Likewise.
	* soft-fp/getf2.c: Likewise.
	* soft-fp/ledf2.c: Likewise.
	* soft-fp/lesf2.c: Likewise.
	* soft-fp/letf2.c: Likewise.
	* soft-fp/muldf3.c: Likewise.
	* soft-fp/mulsf3.c: Likewise.
	* soft-fp/multf3.c: Likewise.
	* soft-fp/negdf2.c: Likewise.
	* soft-fp/negsf2.c: Likewise.
	* soft-fp/negtf2.c: Likewise.
	* soft-fp/op-1.h: Likewise.
	* soft-fp/op-2.h: Likewise.
	* soft-fp/op-4.h: Likewise.
	* soft-fp/op-8.h: Likewise.
	* soft-fp/op-common.h: Likewise.
	* soft-fp/quad.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/soft-fp.h: Likewise.
	* soft-fp/subdf3.c: Likewise.
	* soft-fp/subsf3.c: Likewise.
	* soft-fp/subtf3.c: Likewise.
	* soft-fp/truncdfsf2.c: Likewise.
	* soft-fp/trunctfdf2.c: Likewise.
	* soft-fp/trunctfsf2.c: Likewise.
	* soft-fp/trunctfxf2.c: Likewise.
	* soft-fp/unorddf2.c: Likewise.
	* soft-fp/unordsf2.c: Likewise.
	* soft-fp/unordtf2.c: Likewise.
	* config/aarch64/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING): New
	macro.
	* config/arm/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/c6x/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/cris/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/i386/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/ia64/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/lm32/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/mips/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/moxie/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/nds32/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/nios2/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/rs6000/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/score/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/tilegx/sfp-machine32.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/tilegx/sfp-machine64.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.
	* config/tilepro/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
	Likewise.

Index: libgcc/config/moxie/sfp-machine.h
===================================================================
--- libgcc/config/moxie/sfp-machine.h	(revision 207735)
+++ libgcc/config/moxie/sfp-machine.h	(working copy)
@@ -46,6 +46,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/aarch64/sfp-machine.h
===================================================================
--- libgcc/config/aarch64/sfp-machine.h	(revision 207735)
+++ libgcc/config/aarch64/sfp-machine.h	(working copy)
@@ -80,6 +80,8 @@
 	(FP_EX_INVALID | FP_EX_DIVZERO | FP_EX_OVERFLOW | FP_EX_UNDERFLOW \
 	 | FP_EX_INEXACT)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 void __sfp_handle_exceptions (int);
 
 #define FP_HANDLE_EXCEPTIONS			\
Index: libgcc/config/nios2/sfp-machine.h
===================================================================
--- libgcc/config/nios2/sfp-machine.h	(revision 207735)
+++ libgcc/config/nios2/sfp-machine.h	(working copy)
@@ -63,6 +63,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/mips/sfp-machine.h
===================================================================
--- libgcc/config/mips/sfp-machine.h	(revision 207735)
+++ libgcc/config/mips/sfp-machine.h	(working copy)
@@ -163,6 +163,8 @@
 #define FP_EX_INEXACT           (1 << 0)
 #endif
 
+#define _FP_TININESS_AFTER_ROUNDING 1
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/lm32/sfp-machine.h
===================================================================
--- libgcc/config/lm32/sfp-machine.h	(revision 207735)
+++ libgcc/config/lm32/sfp-machine.h	(working copy)
@@ -41,6 +41,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/tilepro/sfp-machine.h
===================================================================
--- libgcc/config/tilepro/sfp-machine.h	(revision 207735)
+++ libgcc/config/tilepro/sfp-machine.h	(working copy)
@@ -45,6 +45,8 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/arm/sfp-machine.h
===================================================================
--- libgcc/config/arm/sfp-machine.h	(revision 207735)
+++ libgcc/config/arm/sfp-machine.h	(working copy)
@@ -48,6 +48,8 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/rs6000/sfp-machine.h
===================================================================
--- libgcc/config/rs6000/sfp-machine.h	(revision 207735)
+++ libgcc/config/rs6000/sfp-machine.h	(working copy)
@@ -46,6 +46,8 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/tilegx/sfp-machine32.h
===================================================================
--- libgcc/config/tilegx/sfp-machine32.h	(revision 207735)
+++ libgcc/config/tilegx/sfp-machine32.h	(working copy)
@@ -50,6 +50,8 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/tilegx/sfp-machine64.h
===================================================================
--- libgcc/config/tilegx/sfp-machine64.h	(revision 207735)
+++ libgcc/config/tilegx/sfp-machine64.h	(working copy)
@@ -50,6 +50,8 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/cris/sfp-machine.h
===================================================================
--- libgcc/config/cris/sfp-machine.h	(revision 207735)
+++ libgcc/config/cris/sfp-machine.h	(working copy)
@@ -67,6 +67,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/ia64/sfp-machine.h
===================================================================
--- libgcc/config/ia64/sfp-machine.h	(revision 207735)
+++ libgcc/config/ia64/sfp-machine.h	(working copy)
@@ -57,6 +57,8 @@
 #define FP_EX_UNDERFLOW		0x10
 #define FP_EX_INEXACT		0x20
 
+#define _FP_TININESS_AFTER_ROUNDING 1
+
 void __sfp_handle_exceptions (int);
 
 #define FP_HANDLE_EXCEPTIONS			\
Index: libgcc/config/score/sfp-machine.h
===================================================================
--- libgcc/config/score/sfp-machine.h	(revision 207735)
+++ libgcc/config/score/sfp-machine.h	(working copy)
@@ -46,6 +46,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/nds32/sfp-machine.h
===================================================================
--- libgcc/config/nds32/sfp-machine.h	(revision 207735)
+++ libgcc/config/nds32/sfp-machine.h	(working copy)
@@ -76,6 +76,9 @@
     R##_c = FP_CLS_NAN;						\
   } while (0)
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/i386/sfp-machine.h
===================================================================
--- libgcc/config/i386/sfp-machine.h	(revision 207735)
+++ libgcc/config/i386/sfp-machine.h	(working copy)
@@ -65,6 +65,8 @@
 #define FP_ROUNDMODE		(_fcw & FP_RND_MASK)
 #endif
 
+#define _FP_TININESS_AFTER_ROUNDING 1
+
 #define	__LITTLE_ENDIAN	1234
 #define	__BIG_ENDIAN	4321
 
Index: libgcc/config/c6x/sfp-machine.h
===================================================================
--- libgcc/config/c6x/sfp-machine.h	(revision 207735)
+++ libgcc/config/c6x/sfp-machine.h	(working copy)
@@ -78,7 +78,10 @@
 # define __BYTE_ORDER __LITTLE_ENDIAN
 #endif
 
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
 
+
 /* Define ALIASNAME as a strong alias for NAME.  */
 # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
 # define _strong_alias(name, aliasname) \
Index: libgcc/soft-fp/floatuntitf.c
===================================================================
--- libgcc/soft-fp/floatuntitf.c	(revision 207735)
+++ libgcc/soft-fp/floatuntitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE quad
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/eqdf2.c
===================================================================
--- libgcc/soft-fp/eqdf2.c	(revision 207735)
+++ libgcc/soft-fp/eqdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunssfti.c
===================================================================
--- libgcc/soft-fp/fixunssfti.c	(revision 207735)
+++ libgcc/soft-fp/fixunssfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit unsigned integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunsdfdi.c
===================================================================
--- libgcc/soft-fp/fixunsdfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixunsdfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/subsf3.c
===================================================================
--- libgcc/soft-fp/subsf3.c	(revision 207735)
+++ libgcc/soft-fp/subsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/subtf3.c
===================================================================
--- libgcc/soft-fp/subtf3.c	(revision 207735)
+++ libgcc/soft-fp/subtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/gesf2.c
===================================================================
--- libgcc/soft-fp/gesf2.c	(revision 207735)
+++ libgcc/soft-fp/gesf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/getf2.c
===================================================================
--- libgcc/soft-fp/getf2.c	(revision 207735)
+++ libgcc/soft-fp/getf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/mulsf3.c
===================================================================
--- libgcc/soft-fp/mulsf3.c	(revision 207735)
+++ libgcc/soft-fp/mulsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-common.h
===================================================================
--- libgcc/soft-fp/op-common.h	(revision 207735)
+++ libgcc/soft-fp/op-common.h	(working copy)
@@ -1,5 +1,5 @@
 /* Software floating-point emulation. Common operations.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -32,7 +32,7 @@
 #define _FP_DECL(wc, X)				\
   _FP_I_TYPE X##_c __attribute__ ((unused));	\
   _FP_I_TYPE X##_s __attribute__ ((unused));	\
-  _FP_I_TYPE X##_e;				\
+  _FP_I_TYPE X##_e __attribute__ ((unused));	\
   _FP_FRAC_DECL_##wc (X)
 
 /* Test whether the qNaN bit denotes a signaling NaN.  */
@@ -191,8 +191,22 @@
 #define _FP_PACK_SEMIRAW(fs, wc, X)				\
   do								\
     {								\
+      int _FP_PACK_SEMIRAW_is_tiny				\
+	= X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X);		\
+      if (_FP_TININESS_AFTER_ROUNDING				\
+	  && _FP_PACK_SEMIRAW_is_tiny)				\
+	{							\
+	  FP_DECL_##fs (_FP_PACK_SEMIRAW_T);			\
+	  _FP_FRAC_COPY_##wc (_FP_PACK_SEMIRAW_T, X);		\
+	  _FP_PACK_SEMIRAW_T##_s = X##_s;			\
+	  _FP_PACK_SEMIRAW_T##_e = X##_e;			\
+	  _FP_FRAC_SLL_##wc (_FP_PACK_SEMIRAW_T, 1);		\
+	  _FP_ROUND (wc, _FP_PACK_SEMIRAW_T);			\
+	  if (_FP_FRAC_OVERP_##wc (fs, _FP_PACK_SEMIRAW_T))	\
+	    _FP_PACK_SEMIRAW_is_tiny = 0;			\
+	}							\
       _FP_ROUND (wc, X);					\
-      if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X))		\
+      if (_FP_PACK_SEMIRAW_is_tiny)				\
 	{							\
 	  if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
 	      || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))	\
@@ -279,6 +293,17 @@
 	  else								\
 	    {								\
 	      /* we've got a denormalized number */			\
+	      int _FP_PACK_CANONICAL_is_tiny = 1;			\
+	      if (_FP_TININESS_AFTER_ROUNDING && X##_e == 0)		\
+		{							\
+		  FP_DECL_##fs (_FP_PACK_CANONICAL_T);			\
+		  _FP_FRAC_COPY_##wc (_FP_PACK_CANONICAL_T, X);		\
+		  _FP_PACK_CANONICAL_T##_s = X##_s;			\
+		  _FP_PACK_CANONICAL_T##_e = X##_e;			\
+		  _FP_ROUND (wc, _FP_PACK_CANONICAL_T);			\
+		  if (_FP_FRAC_OVERP_##wc (fs, _FP_PACK_CANONICAL_T))	\
+		    _FP_PACK_CANONICAL_is_tiny = 0;			\
+		}							\
 	      X##_e = -X##_e + 1;					\
 	      if (X##_e <= _FP_WFRACBITS_##fs)				\
 		{							\
@@ -296,8 +321,10 @@
 		      X##_e = 0;					\
 		      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);		\
 		    }							\
-		  if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
-		      || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))	\
+		  if (_FP_PACK_CANONICAL_is_tiny			\
+		      && ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
+			  || (FP_TRAPPING_EXCEPTIONS			\
+			      & FP_EX_UNDERFLOW)))			\
 		    FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
 		}							\
 	      else							\
Index: libgcc/soft-fp/multf3.c
===================================================================
--- libgcc/soft-fp/multf3.c	(revision 207735)
+++ libgcc/soft-fp/multf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatsidf.c
===================================================================
--- libgcc/soft-fp/floatsidf.c	(revision 207735)
+++ libgcc/soft-fp/floatsidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixsfti.c
===================================================================
--- libgcc/soft-fp/fixsfti.c	(revision 207735)
+++ libgcc/soft-fp/fixsfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit signed integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/extenddftf2.c
===================================================================
--- libgcc/soft-fp/extenddftf2.c	(revision 207735)
+++ libgcc/soft-fp/extenddftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixdfdi.c
===================================================================
--- libgcc/soft-fp/fixdfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixdfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatundisf.c
===================================================================
--- libgcc/soft-fp/floatundisf.c	(revision 207735)
+++ libgcc/soft-fp/floatundisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/eqsf2.c
===================================================================
--- libgcc/soft-fp/eqsf2.c	(revision 207735)
+++ libgcc/soft-fp/eqsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/eqtf2.c
===================================================================
--- libgcc/soft-fp/eqtf2.c	(revision 207735)
+++ libgcc/soft-fp/eqtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-2.h
===================================================================
--- libgcc/soft-fp/op-2.h	(revision 207735)
+++ libgcc/soft-fp/op-2.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic two-word fraction declaration and manipulation.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/fixunsdfti.c
===================================================================
--- libgcc/soft-fp/fixunsdfti.c	(revision 207735)
+++ libgcc/soft-fp/fixunsdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit unsigned integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunstfdi.c
===================================================================
--- libgcc/soft-fp/fixunstfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixunstfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-4.h
===================================================================
--- libgcc/soft-fp/op-4.h	(revision 207735)
+++ libgcc/soft-fp/op-4.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic four-word fraction declaration and manipulation.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/adddf3.c
===================================================================
--- libgcc/soft-fp/adddf3.c	(revision 207735)
+++ libgcc/soft-fp/adddf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-8.h
===================================================================
--- libgcc/soft-fp/op-8.h	(revision 207735)
+++ libgcc/soft-fp/op-8.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic eight-word fraction declaration and manipulation.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz) and
Index: libgcc/soft-fp/floatsitf.c
===================================================================
--- libgcc/soft-fp/floatsitf.c	(revision 207735)
+++ libgcc/soft-fp/floatsitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatdidf.c
===================================================================
--- libgcc/soft-fp/floatdidf.c	(revision 207735)
+++ libgcc/soft-fp/floatdidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixtfdi.c
===================================================================
--- libgcc/soft-fp/fixtfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixtfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixdfti.c
===================================================================
--- libgcc/soft-fp/fixdfti.c	(revision 207735)
+++ libgcc/soft-fp/fixdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit signed integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatuntisf.c
===================================================================
--- libgcc/soft-fp/floatuntisf.c	(revision 207735)
+++ libgcc/soft-fp/floatuntisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE single
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/extendxftf2.c
===================================================================
--- libgcc/soft-fp/extendxftf2.c	(revision 207735)
+++ libgcc/soft-fp/extendxftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/fixunssfsi.c
===================================================================
--- libgcc/soft-fp/fixunssfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixunssfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunstfti.c
===================================================================
--- libgcc/soft-fp/fixunstfti.c	(revision 207735)
+++ libgcc/soft-fp/fixunstfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit unsigned integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/addsf3.c
===================================================================
--- libgcc/soft-fp/addsf3.c	(revision 207735)
+++ libgcc/soft-fp/addsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/addtf3.c
===================================================================
--- libgcc/soft-fp/addtf3.c	(revision 207735)
+++ libgcc/soft-fp/addtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixsfsi.c
===================================================================
--- libgcc/soft-fp/fixsfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixsfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floattidf.c
===================================================================
--- libgcc/soft-fp/floattidf.c	(revision 207735)
+++ libgcc/soft-fp/floattidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE double
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatditf.c
===================================================================
--- libgcc/soft-fp/floatditf.c	(revision 207735)
+++ libgcc/soft-fp/floatditf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixtfti.c
===================================================================
--- libgcc/soft-fp/fixtfti.c	(revision 207735)
+++ libgcc/soft-fp/fixtfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit signed integer
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/double.h
===================================================================
--- libgcc/soft-fp/double.h	(revision 207735)
+++ libgcc/soft-fp/double.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Double Precision
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/fixunsdfsi.c
===================================================================
--- libgcc/soft-fp/fixunsdfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixunsdfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/soft-fp.h
===================================================================
--- libgcc/soft-fp/soft-fp.h	(revision 207735)
+++ libgcc/soft-fp/soft-fp.h	(working copy)
@@ -1,5 +1,5 @@
 /* Software floating-point emulation.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
@@ -161,6 +161,9 @@
 # undef FP_ROUNDMODE
 # define FP_ROUNDMODE FP_RND_ZERO
 
+# undef _FP_TININESS_AFTER_ROUNDING
+# define _FP_TININESS_AFTER_ROUNDING 0
+
 #endif
 
 #define _FP_ROUND_NEAREST(wc, X)				\
Index: libgcc/soft-fp/unorddf2.c
===================================================================
--- libgcc/soft-fp/unorddf2.c	(revision 207735)
+++ libgcc/soft-fp/unorddf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2013 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 
Index: libgcc/soft-fp/floatsisf.c
===================================================================
--- libgcc/soft-fp/floatsisf.c	(revision 207735)
+++ libgcc/soft-fp/floatsisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixdfsi.c
===================================================================
--- libgcc/soft-fp/fixdfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixdfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floattitf.c
===================================================================
--- libgcc/soft-fp/floattitf.c	(revision 207735)
+++ libgcc/soft-fp/floattitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE quad
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/ledf2.c
===================================================================
--- libgcc/soft-fp/ledf2.c	(revision 207735)
+++ libgcc/soft-fp/ledf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/quad.h
===================================================================
--- libgcc/soft-fp/quad.h	(revision 207735)
+++ libgcc/soft-fp/quad.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Quad Precision.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/unordsf2.c
===================================================================
--- libgcc/soft-fp/unordsf2.c	(revision 207735)
+++ libgcc/soft-fp/unordsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2013 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 
Index: libgcc/soft-fp/fixunstfsi.c
===================================================================
--- libgcc/soft-fp/fixunstfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixunstfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/unordtf2.c
===================================================================
--- libgcc/soft-fp/unordtf2.c	(revision 207735)
+++ libgcc/soft-fp/unordtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 1 iff a or b is a NaN, 0 otherwise.
-   Copyright (C) 2006-2013 Free Software Foundation, Inc.
+   Copyright (C) 2006-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Joseph Myers (joseph@codesourcery.com).
 
Index: libgcc/soft-fp/floatdisf.c
===================================================================
--- libgcc/soft-fp/floatdisf.c	(revision 207735)
+++ libgcc/soft-fp/floatdisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/lesf2.c
===================================================================
--- libgcc/soft-fp/lesf2.c	(revision 207735)
+++ libgcc/soft-fp/lesf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extendsfdf2.c
===================================================================
--- libgcc/soft-fp/extendsfdf2.c	(revision 207735)
+++ libgcc/soft-fp/extendsfdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixtfsi.c
===================================================================
--- libgcc/soft-fp/fixtfsi.c	(revision 207735)
+++ libgcc/soft-fp/fixtfsi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/letf2.c
===================================================================
--- libgcc/soft-fp/letf2.c	(revision 207735)
+++ libgcc/soft-fp/letf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, 2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsidf.c
===================================================================
--- libgcc/soft-fp/floatunsidf.c	(revision 207735)
+++ libgcc/soft-fp/floatunsidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divdf3.c
===================================================================
--- libgcc/soft-fp/divdf3.c	(revision 207735)
+++ libgcc/soft-fp/divdf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/truncdfsf2.c
===================================================================
--- libgcc/soft-fp/truncdfsf2.c	(revision 207735)
+++ libgcc/soft-fp/truncdfsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE double into IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/op-1.h
===================================================================
--- libgcc/soft-fp/op-1.h	(revision 207735)
+++ libgcc/soft-fp/op-1.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic one-word fraction declaration and manipulation.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/trunctfdf2.c
===================================================================
--- libgcc/soft-fp/trunctfdf2.c	(revision 207735)
+++ libgcc/soft-fp/trunctfdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floattisf.c
===================================================================
--- libgcc/soft-fp/floattisf.c	(revision 207735)
+++ libgcc/soft-fp/floattisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE single
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/extendsftf2.c
===================================================================
--- libgcc/soft-fp/extendsftf2.c	(revision 207735)
+++ libgcc/soft-fp/extendsftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divsf3.c
===================================================================
--- libgcc/soft-fp/divsf3.c	(revision 207735)
+++ libgcc/soft-fp/divsf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsitf.c
===================================================================
--- libgcc/soft-fp/floatunsitf.c	(revision 207735)
+++ libgcc/soft-fp/floatunsitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/divtf3.c
===================================================================
--- libgcc/soft-fp/divtf3.c	(revision 207735)
+++ libgcc/soft-fp/divtf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatundidf.c
===================================================================
--- libgcc/soft-fp/floatundidf.c	(revision 207735)
+++ libgcc/soft-fp/floatundidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/trunctfsf2.c
===================================================================
--- libgcc/soft-fp/trunctfsf2.c	(revision 207735)
+++ libgcc/soft-fp/trunctfsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/extended.h
===================================================================
--- libgcc/soft-fp/extended.h	(revision 207735)
+++ libgcc/soft-fp/extended.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Extended Precision.
-   Copyright (C) 1999-2013 Free Software Foundation, Inc.
+   Copyright (C) 1999-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek (jj@ultra.linux.cz).
 
Index: libgcc/soft-fp/trunctfxf2.c
===================================================================
--- libgcc/soft-fp/trunctfxf2.c	(revision 207735)
+++ libgcc/soft-fp/trunctfxf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE extended
-   Copyright (C) 2007-2013 Free Software Foundation, Inc.
+   Copyright (C) 2007-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/negdf2.c
===================================================================
--- libgcc/soft-fp/negdf2.c	(revision 207735)
+++ libgcc/soft-fp/negdf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatuntidf.c
===================================================================
--- libgcc/soft-fp/floatuntidf.c	(revision 207735)
+++ libgcc/soft-fp/floatuntidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE double
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
Index: libgcc/soft-fp/floatunditf.c
===================================================================
--- libgcc/soft-fp/floatunditf.c	(revision 207735)
+++ libgcc/soft-fp/floatunditf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit unsigned integer to IEEE quad
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixunssfdi.c
===================================================================
--- libgcc/soft-fp/fixunssfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixunssfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/negsf2.c
===================================================================
--- libgcc/soft-fp/negsf2.c	(revision 207735)
+++ libgcc/soft-fp/negsf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/negtf2.c
===================================================================
--- libgcc/soft-fp/negtf2.c	(revision 207735)
+++ libgcc/soft-fp/negtf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/subdf3.c
===================================================================
--- libgcc/soft-fp/subdf3.c	(revision 207735)
+++ libgcc/soft-fp/subdf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a - b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/single.h
===================================================================
--- libgcc/soft-fp/single.h	(revision 207735)
+++ libgcc/soft-fp/single.h	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Single Precision.
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
 		  Jakub Jelinek (jj@ultra.linux.cz),
Index: libgcc/soft-fp/gedf2.c
===================================================================
--- libgcc/soft-fp/gedf2.c	(revision 207735)
+++ libgcc/soft-fp/gedf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 iff a > b, -2 iff a ? b, -1 iff a < b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/muldf3.c
===================================================================
--- libgcc/soft-fp/muldf3.c	(revision 207735)
+++ libgcc/soft-fp/muldf3.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/fixsfdi.c
===================================================================
--- libgcc/soft-fp/fixsfdi.c	(revision 207735)
+++ libgcc/soft-fp/fixsfdi.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: libgcc/soft-fp/floatunsisf.c
===================================================================
--- libgcc/soft-fp/floatunsisf.c	(revision 207735)
+++ libgcc/soft-fp/floatunsisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit unsigned integer to IEEE single
-   Copyright (C) 1997-2013 Free Software Foundation, Inc.
+   Copyright (C) 1997-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com) and
 		  Jakub Jelinek (jj@ultra.linux.cz).
Index: gcc/testsuite/gcc.dg/torture/float128-truncdf-underflow.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-truncdf-underflow.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-truncdf-underflow.c	(revision 0)
@@ -0,0 +1,27 @@
+/* Test truncation from __float128 to double uses after-rounding
+   tininess detection.  */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "" } */
+/* { dg-require-effective-target fenv_exceptions } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile __float128 a = 0x0.fffffffffffffffp-1022q, b = 0x0.fffffffffffff8p-1022q;
+  volatile double r;
+  r = (double) a;
+  if (fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (r != 0x1p-1022)
+    abort ();
+  r = (double) b;
+  if (!fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (r != 0x1p-1022)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.dg/torture/float128-truncsf-underflow.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-truncsf-underflow.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-truncsf-underflow.c	(revision 0)
@@ -0,0 +1,27 @@
+/* Test truncation from __float128 to float uses after-rounding
+   tininess detection.  */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "" } */
+/* { dg-require-effective-target fenv_exceptions } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile __float128 a = 0x0.ffffffffffp-126q, b = 0x0.ffffffp-126q;
+  volatile float r;
+  r = (float) a;
+  if (fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (r != 0x1p-126f)
+    abort ();
+  r = (float) b;
+  if (!fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (r != 0x1p-126f)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.dg/torture/float128-mul-underflow.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-mul-underflow.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-mul-underflow.c	(revision 0)
@@ -0,0 +1,21 @@
+/* Test __float128 multiplication uses after-rounding tininess
+   detection.  */
+
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "" } */
+/* { dg-require-effective-target fenv_exceptions } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile __float128 a = 0x1.fffffffffffffffp-16382q, b = 0x1.0000000000000008p-1q, c;
+  c = a * b;
+  if (fetestexcept (FE_UNDERFLOW))
+    abort ();
+  if (c != 0x1p-16382q)
+    abort ();
+  exit (0);
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

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

* Update soft-fp from glibc
@ 2013-11-06 22:57 Joseph S. Myers
  0 siblings, 0 replies; 7+ messages in thread
From: Joseph S. Myers @ 2013-11-06 22:57 UTC (permalink / raw)
  To: gcc-patches

I've applied this patch to update libgcc's copy of soft-fp from
glibc.  There are lots of coding standards fixes, but also various bug
fixes; I've added testcases for various of the fixed bugs illustrating
them for __float128.

Note that the TImode functions and conversions between XFmode and
TFmode are now included in the soft-fp sources in glibc (although not
directly compiled in glibc).

It may now be possible to optimize some architectures' sfp-machine.h
files by defining FP_INIT_EXCEPTIONS separate to FP_INIT_ROUNDMODE, if
the latter does initialization not needed when only exceptions but not
rounding modes are relevant to a particular function.  And the
soft-float powerpc IBM long double code could use the fused
multiply-add support now present in soft-fp in place of its present
hack to emulate fused multiply-add.  (As noted previously, IA64 should
still have a definition of FP_TRAPPING_EXCEPTIONS added.)

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.

gcc/testsuite:
2013-11-06  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/torture/float128-cmp-invalid.c,
	gcc.dg/torture/float128-div-underflow.c,
	gcc.dg/torture/float128-extend-nan.c,
	gcc.dg/torture/fp-int-convert-float128-timode-3.c: New tests.

libgcc:
2013-11-06  Joseph Myers  <joseph@codesourcery.com>

	* soft-fp/README: Update.
	* soft-fp/adddf3.c: Update from glibc.
	* soft-fp/addsf3.c: Likewise.
	* soft-fp/addtf3.c: Likewise.
	* soft-fp/divdf3.c: Likewise.
	* soft-fp/divsf3.c: Likewise.
	* soft-fp/divtf3.c: Likewise.
	* soft-fp/double.h: Likewise.
	* soft-fp/eqdf2.c: Likewise.
	* soft-fp/eqsf2.c: Likewise.
	* soft-fp/eqtf2.c: Likewise.
	* soft-fp/extenddftf2.c: Likewise.
	* soft-fp/extended.h: Likewise.
	* soft-fp/extendsfdf2.c: Likewise.
	* soft-fp/extendsftf2.c: Likewise.
	* soft-fp/extendxftf2.c: Likewise.
	* soft-fp/fixdfdi.c: Likewise.
	* soft-fp/fixdfsi.c: Likewise.
	* soft-fp/fixdfti.c: Likewise.
	* soft-fp/fixsfdi.c: Likewise.
	* soft-fp/fixsfsi.c: Likewise.
	* soft-fp/fixsfti.c: Likewise.
	* soft-fp/fixtfdi.c: Likewise.
	* soft-fp/fixtfsi.c: Likewise.
	* soft-fp/fixtfti.c: Likewise.
	* soft-fp/fixunsdfdi.c: Likewise.
	* soft-fp/fixunsdfsi.c: Likewise.
	* soft-fp/fixunsdfti.c: Likewise.
	* soft-fp/fixunssfdi.c: Likewise.
	* soft-fp/fixunssfsi.c: Likewise.
	* soft-fp/fixunssfti.c: Likewise.
	* soft-fp/fixunstfdi.c: Likewise.
	* soft-fp/fixunstfsi.c: Likewise.
	* soft-fp/fixunstfti.c: Likewise.
	* soft-fp/floatdidf.c: Likewise.
	* soft-fp/floatdisf.c: Likewise.
	* soft-fp/floatditf.c: Likewise.
	* soft-fp/floatsidf.c: Likewise.
	* soft-fp/floatsisf.c: Likewise.
	* soft-fp/floatsitf.c: Likewise.
	* soft-fp/floattidf.c: Likewise.
	* soft-fp/floattisf.c: Likewise.
	* soft-fp/floattitf.c: Likewise.
	* soft-fp/floatundidf.c: Likewise.
	* soft-fp/floatundisf.c: Likewise.
	* soft-fp/floatunditf.c: Likewise.
	* soft-fp/floatunsidf.c: Likewise.
	* soft-fp/floatunsisf.c: Likewise.
	* soft-fp/floatunsitf.c: Likewise.
	* soft-fp/floatuntidf.c: Likewise.
	* soft-fp/floatuntisf.c: Likewise.
	* soft-fp/floatuntitf.c: Likewise.
	* soft-fp/gedf2.c: Likewise.
	* soft-fp/gesf2.c: Likewise.
	* soft-fp/getf2.c: Likewise.
	* soft-fp/ledf2.c: Likewise.
	* soft-fp/lesf2.c: Likewise.
	* soft-fp/letf2.c: Likewise.
	* soft-fp/muldf3.c: Likewise.
	* soft-fp/mulsf3.c: Likewise.
	* soft-fp/multf3.c: Likewise.
	* soft-fp/negdf2.c: Likewise.
	* soft-fp/negsf2.c: Likewise.
	* soft-fp/negtf2.c: Likewise.
	* soft-fp/op-1.h: Likewise.
	* soft-fp/op-2.h: Likewise.
	* soft-fp/op-4.h: Likewise.
	* soft-fp/op-8.h: Likewise.
	* soft-fp/op-common.h: Likewise.
	* soft-fp/quad.h: Likewise.
	* soft-fp/single.h: Likewise.
	* soft-fp/soft-fp.h: Likewise.
	* soft-fp/subdf3.c: Likewise.
	* soft-fp/subsf3.c: Likewise.
	* soft-fp/subtf3.c: Likewise.
	* soft-fp/truncdfsf2.c: Likewise.
	* soft-fp/trunctfdf2.c: Likewise.
	* soft-fp/trunctfsf2.c: Likewise.
	* soft-fp/trunctfxf2.c: Likewise.
	* soft-fp/unorddf2.c: Likewise.
	* soft-fp/unordsf2.c: Likewise.
	* soft-fp/unordtf2.c: Likewise.

Index: gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/fp-int-convert-float128-timode-3.c	(revision 0)
@@ -0,0 +1,23 @@
+/* Test for correct rounding of conversions from __int128 to
+   __float128.  */
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-require-effective-target int128 } */
+/* { dg-options "-frounding-math" } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile unsigned long long h = -1ULL;
+  volatile unsigned __int128 u128 = (((unsigned __int128) h) << 64) | h;
+  volatile __int128 s128 = u128 >> 1;
+  fesetround (FE_TOWARDZERO);
+  __float128 ru = u128, rs = s128;
+  if (ru != 0x1.ffffffffffffffffffffffffffffp127q)
+    abort ();
+  if (rs != 0x1.ffffffffffffffffffffffffffffp126q)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.dg/torture/float128-extend-nan.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-extend-nan.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-extend-nan.c	(revision 0)
@@ -0,0 +1,22 @@
+/* Test extensions to __float128 quiet signaling NaNs.  */
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "-fsignaling-nans" } */
+
+#include <fenv.h>
+#include <float.h>
+#include <stdlib.h>
+
+volatile long double a = __builtin_nansl ("");
+
+int
+main (void)
+{
+#if LDBL_MANT_DIG < 113
+  volatile __float128 r = a;
+  feclearexcept (FE_INVALID);
+  r += 1;
+  if (fetestexcept (FE_INVALID))
+    abort ();
+#endif
+  exit (0);
+}
Index: gcc/testsuite/gcc.dg/torture/float128-div-underflow.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-div-underflow.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-div-underflow.c	(revision 0)
@@ -0,0 +1,18 @@
+/* Test for spurious underflow from __float128 division.  */
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "" } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile __float128 a = 0x0.fffp-16382q, b = 0x0.fffp0q, c;
+  c = a / b;
+  if (fetestexcept (FE_UNDERFLOW | FE_INEXACT))
+    abort ();
+  if (c != 0x1p-16382q)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/float128-cmp-invalid.c	(revision 0)
@@ -0,0 +1,18 @@
+/* Test for "invalid" exceptions from __float128 comparisons.  */
+/* { dg-do run { target i?86-*-* x86_64-*-* ia64-*-* } } */
+/* { dg-options "" } */
+
+#include <fenv.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+  volatile __float128 a = __builtin_nan (""), b = 0;
+  volatile int r = a < b;
+  if (!fetestexcept (FE_INVALID))
+    abort ();
+  if (r)
+    abort ();
+  exit (0);
+}
Index: libgcc/soft-fp/floatsitf.c
===================================================================
--- libgcc/soft-fp/floatsitf.c	(revision 204460)
+++ libgcc/soft-fp/floatsitf.c	(working copy)
@@ -28,18 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __floatsitf(SItype i)
+TFtype
+__floatsitf (SItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_Q (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_Q (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/extendsftf2.c
===================================================================
--- libgcc/soft-fp/extendsftf2.c	(revision 204460)
+++ libgcc/soft-fp/extendsftf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "single.h"
 #include "quad.h"
 
-TFtype __extendsftf2(SFtype a)
+TFtype
+__extendsftf2 (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
-  FP_DECL_Q(R);
+  FP_DECL_S (A);
+  FP_DECL_Q (R);
   TFtype r;
 
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_S(A, a);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,S,4,1,R,A);
+  FP_EXTEND (Q, S, 4, 1, R, A);
 #else
-  FP_EXTEND(Q,S,2,1,R,A);
+  FP_EXTEND (Q, S, 2, 1, R, A);
 #endif
-  FP_PACK_RAW_Q(r, R);
+  FP_PACK_RAW_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatdidf.c
===================================================================
--- libgcc/soft-fp/floatdidf.c	(revision 204460)
+++ libgcc/soft-fp/floatdidf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floatdidf(DItype i)
+DFtype
+__floatdidf (DItype i)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_D(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_D (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_D (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/floatunsitf.c
===================================================================
--- libgcc/soft-fp/floatunsitf.c	(revision 204460)
+++ libgcc/soft-fp/floatunsitf.c	(working copy)
@@ -28,19 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "quad.h"
 
 TFtype
-__floatunsitf(USItype i)
+__floatunsitf (USItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_Q (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_Q (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/floatundidf.c
===================================================================
--- libgcc/soft-fp/floatundidf.c	(revision 204460)
+++ libgcc/soft-fp/floatundidf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floatundidf(UDItype i)
+DFtype
+__floatundidf (UDItype i)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_D(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_D (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_D (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/fixunstfsi.c
===================================================================
--- libgcc/soft-fp/fixunstfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixunstfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-USItype __fixunstfsi(TFtype a)
+USItype
+__fixunstfsi (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   USItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, SI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floattidf.c
===================================================================
--- libgcc/soft-fp/floattidf.c	(revision 204460)
+++ libgcc/soft-fp/floattidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE double
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floattidf(TItype i)
+DFtype
+__floattidf (TItype i)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_D(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_D (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_D (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/floatditf.c
===================================================================
--- libgcc/soft-fp/floatditf.c	(revision 204460)
+++ libgcc/soft-fp/floatditf.c	(working copy)
@@ -28,18 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __floatditf(DItype i)
+TFtype
+__floatditf (DItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_Q (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_Q (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/floatunditf.c
===================================================================
--- libgcc/soft-fp/floatunditf.c	(revision 204460)
+++ libgcc/soft-fp/floatunditf.c	(working copy)
@@ -28,19 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "quad.h"
 
 TFtype
-__floatunditf(UDItype i)
+__floatunditf (UDItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_Q(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_Q (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_Q (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/floatuntidf.c
===================================================================
--- libgcc/soft-fp/floatuntidf.c	(revision 204460)
+++ libgcc/soft-fp/floatuntidf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE double
-   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1997-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floatuntidf(UTItype i)
+DFtype
+__floatuntidf (UTItype i)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_D(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_D (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_D (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/divdf3.c
===================================================================
--- libgcc/soft-fp/divdf3.c	(revision 204460)
+++ libgcc/soft-fp/divdf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __divdf3(DFtype a, DFtype b)
+DFtype
+__divdf3 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
+  FP_DECL_D (R);
   DFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
-  FP_UNPACK_D(B, b);
-  FP_DIV_D(R, A, B);
-  FP_PACK_D(r, R);
+  FP_UNPACK_D (A, a);
+  FP_UNPACK_D (B, b);
+  FP_DIV_D (R, A, B);
+  FP_PACK_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/truncdfsf2.c
===================================================================
--- libgcc/soft-fp/truncdfsf2.c	(revision 204460)
+++ libgcc/soft-fp/truncdfsf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "single.h"
 #include "double.h"
 
-SFtype __truncdfsf2(DFtype a)
+SFtype
+__truncdfsf2 (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
-  FP_DECL_S(R);
+  FP_DECL_D (A);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
+  FP_UNPACK_SEMIRAW_D (A, a);
 #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
-  FP_TRUNC(S,D,1,2,R,A);
+  FP_TRUNC (S, D, 1, 2, R, A);
 #else
-  FP_TRUNC(S,D,1,1,R,A);
+  FP_TRUNC (S, D, 1, 1, R, A);
 #endif
-  FP_PACK_SEMIRAW_S(r, R);
+  FP_PACK_SEMIRAW_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/trunctfdf2.c
===================================================================
--- libgcc/soft-fp/trunctfdf2.c	(revision 204460)
+++ libgcc/soft-fp/trunctfdf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "double.h"
 #include "quad.h"
 
-DFtype __trunctfdf2(TFtype a)
+DFtype
+__trunctfdf2 (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_D(R);
+  FP_DECL_Q (A);
+  FP_DECL_D (R);
   DFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(D,Q,2,4,R,A);
+  FP_TRUNC (D, Q, 2, 4, R, A);
 #else
-  FP_TRUNC(D,Q,1,2,R,A);
+  FP_TRUNC (D, Q, 1, 2, R, A);
 #endif
-  FP_PACK_SEMIRAW_D(r, R);
+  FP_PACK_SEMIRAW_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/op-2.h
===================================================================
--- libgcc/soft-fp/op-2.h	(revision 204460)
+++ libgcc/soft-fp/op-2.h	(working copy)
@@ -31,109 +31,113 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define _FP_FRAC_DECL_2(X)	_FP_W_TYPE X##_f0, X##_f1
-#define _FP_FRAC_COPY_2(D,S)	(D##_f0 = S##_f0, D##_f1 = S##_f1)
-#define _FP_FRAC_SET_2(X,I)	__FP_FRAC_SET_2(X, I)
+#define _FP_FRAC_COPY_2(D, S)	(D##_f0 = S##_f0, D##_f1 = S##_f1)
+#define _FP_FRAC_SET_2(X, I)	__FP_FRAC_SET_2 (X, I)
 #define _FP_FRAC_HIGH_2(X)	(X##_f1)
 #define _FP_FRAC_LOW_2(X)	(X##_f0)
-#define _FP_FRAC_WORD_2(X,w)	(X##_f##w)
+#define _FP_FRAC_WORD_2(X, w)	(X##_f##w)
 
-#define _FP_FRAC_SLL_2(X,N)						    \
-(void)(((N) < _FP_W_TYPE_SIZE)						    \
-       ? ({								    \
-	    if (__builtin_constant_p(N) && (N) == 1)			    \
-	      {								    \
-		X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0);   \
-		X##_f0 += X##_f0;					    \
-	      }								    \
-	    else							    \
-	      {								    \
-		X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \
-		X##_f0 <<= (N);						    \
-	      }								    \
-	    0;								    \
-	  })								    \
-       : ({								    \
-	    X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE);			    \
-	    X##_f0 = 0;							    \
-	  }))
+#define _FP_FRAC_SLL_2(X, N)						\
+  (void) (((N) < _FP_W_TYPE_SIZE)					\
+	  ? ({								\
+	      if (__builtin_constant_p (N) && (N) == 1)			\
+		{							\
+		  X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE) (X##_f0)) < 0); \
+		  X##_f0 += X##_f0;					\
+		}							\
+	      else							\
+		{							\
+		  X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \
+		  X##_f0 <<= (N);					\
+		}							\
+	      0;							\
+	    })								\
+	  : ({								\
+	      X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE);		\
+	      X##_f0 = 0;						\
+	    }))
 
 
-#define _FP_FRAC_SRL_2(X,N)						\
-(void)(((N) < _FP_W_TYPE_SIZE)						\
-       ? ({								\
-	    X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N));	\
-	    X##_f1 >>= (N);						\
-	  })								\
-       : ({								\
-	    X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE);			\
-	    X##_f1 = 0;							\
-	  }))
+#define _FP_FRAC_SRL_2(X, N)						\
+  (void) (((N) < _FP_W_TYPE_SIZE)					\
+	  ? ({								\
+	      X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \
+	      X##_f1 >>= (N);						\
+	    })								\
+	  : ({								\
+	      X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE);		\
+	      X##_f1 = 0;						\
+	    }))
 
 /* Right shift with sticky-lsb.  */
-#define _FP_FRAC_SRST_2(X,S, N,sz)					  \
-(void)(((N) < _FP_W_TYPE_SIZE)						  \
-       ? ({								  \
-	    S = (__builtin_constant_p(N) && (N) == 1			  \
-		 ? X##_f0 & 1						  \
-		 : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0);		  \
-	    X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N)); \
-	    X##_f1 >>= (N);						  \
-	  })								  \
-       : ({								  \
-	    S = ((((N) == _FP_W_TYPE_SIZE				  \
-		   ? 0							  \
-		   : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))		  \
-		  | X##_f0) != 0);					  \
-	    X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE));		  \
-	    X##_f1 = 0;							  \
-	  }))
+#define _FP_FRAC_SRST_2(X, S, N, sz)					\
+  (void) (((N) < _FP_W_TYPE_SIZE)					\
+	  ? ({								\
+	      S = (__builtin_constant_p (N) && (N) == 1			\
+		   ? X##_f0 & 1						\
+		   : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0);		\
+	      X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N)); \
+	      X##_f1 >>= (N);						\
+	    })								\
+	  : ({								\
+	      S = ((((N) == _FP_W_TYPE_SIZE				\
+		     ? 0						\
+		     : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))		\
+		    | X##_f0) != 0);					\
+	      X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE));		\
+	      X##_f1 = 0;						\
+	    }))
 
-#define _FP_FRAC_SRS_2(X,N,sz)						  \
-(void)(((N) < _FP_W_TYPE_SIZE)						  \
-       ? ({								  \
-	    X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \
-		      (__builtin_constant_p(N) && (N) == 1		  \
-		       ? X##_f0 & 1					  \
-		       : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0));	  \
-	    X##_f1 >>= (N);						  \
-	  })								  \
-       : ({								  \
-	    X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) |		  \
-		      ((((N) == _FP_W_TYPE_SIZE				  \
-			 ? 0						  \
-			 : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))	  \
-			| X##_f0) != 0));				  \
-	    X##_f1 = 0;							  \
-	  }))
+#define _FP_FRAC_SRS_2(X, N, sz)					\
+  (void) (((N) < _FP_W_TYPE_SIZE)					\
+	  ? ({								\
+	      X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) \
+			| (__builtin_constant_p (N) && (N) == 1		\
+			   ? X##_f0 & 1					\
+			   : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \
+	      X##_f1 >>= (N);						\
+	    })								\
+	  : ({								\
+	      X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE)		\
+			| ((((N) == _FP_W_TYPE_SIZE			\
+			     ? 0					\
+			     : (X##_f1 << (2*_FP_W_TYPE_SIZE - (N))))	\
+			    | X##_f0) != 0));				\
+	      X##_f1 = 0;						\
+	    }))
 
-#define _FP_FRAC_ADDI_2(X,I)	\
-  __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)
+#define _FP_FRAC_ADDI_2(X, I)	\
+  __FP_FRAC_ADDI_2 (X##_f1, X##_f0, I)
 
-#define _FP_FRAC_ADD_2(R,X,Y)	\
-  __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
+#define _FP_FRAC_ADD_2(R, X, Y)	\
+  __FP_FRAC_ADD_2 (R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
 
-#define _FP_FRAC_SUB_2(R,X,Y)	\
-  __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
+#define _FP_FRAC_SUB_2(R, X, Y)	\
+  __FP_FRAC_SUB_2 (R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0)
 
-#define _FP_FRAC_DEC_2(X,Y)	\
-  __FP_FRAC_DEC_2(X##_f1, X##_f0, Y##_f1, Y##_f0)
+#define _FP_FRAC_DEC_2(X, Y)	\
+  __FP_FRAC_DEC_2 (X##_f1, X##_f0, Y##_f1, Y##_f0)
 
-#define _FP_FRAC_CLZ_2(R,X)	\
-  do {				\
-    if (X##_f1)			\
-      __FP_CLZ(R,X##_f1);	\
-    else 			\
-    {				\
-      __FP_CLZ(R,X##_f0);	\
-      R += _FP_W_TYPE_SIZE;	\
-    }				\
-  } while(0)
+#define _FP_FRAC_CLZ_2(R, X)			\
+  do						\
+    {						\
+      if (X##_f1)				\
+	__FP_CLZ (R, X##_f1);			\
+      else					\
+	{					\
+	  __FP_CLZ (R, X##_f0);			\
+	  R += _FP_W_TYPE_SIZE;			\
+	}					\
+    }						\
+  while (0)
 
 /* Predicates */
-#define _FP_FRAC_NEGP_2(X)	((_FP_WS_TYPE)X##_f1 < 0)
+#define _FP_FRAC_NEGP_2(X)	((_FP_WS_TYPE) X##_f1 < 0)
 #define _FP_FRAC_ZEROP_2(X)	((X##_f1 | X##_f0) == 0)
-#define _FP_FRAC_OVERP_2(fs,X)	(_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_2(fs,X)	(_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_OVERP_2(fs, X)	(_FP_FRAC_HIGH_##fs (X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_2(fs, X)	(_FP_FRAC_HIGH_##fs (X) &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_HIGHBIT_DW_2(fs, X)	\
+  (_FP_FRAC_HIGH_DW_##fs (X) & _FP_HIGHBIT_DW_##fs)
 #define _FP_FRAC_EQ_2(X, Y)	(X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
 #define _FP_FRAC_GT_2(X, Y)	\
   (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
@@ -142,57 +146,62 @@
 
 #define _FP_ZEROFRAC_2		0, 0
 #define _FP_MINFRAC_2		0, 1
-#define _FP_MAXFRAC_2		(~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
+#define _FP_MAXFRAC_2		(~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0)
 
 /*
  * Internals
  */
 
-#define __FP_FRAC_SET_2(X,I1,I0)	(X##_f0 = I0, X##_f1 = I1)
+#define __FP_FRAC_SET_2(X, I1, I0)	(X##_f0 = I0, X##_f1 = I1)
 
-#define __FP_CLZ_2(R, xh, xl)	\
-  do {				\
-    if (xh)			\
-      __FP_CLZ(R,xh);		\
-    else 			\
-    {				\
-      __FP_CLZ(R,xl);		\
-      R += _FP_W_TYPE_SIZE;	\
-    }				\
-  } while(0)
+#define __FP_CLZ_2(R, xh, xl)			\
+  do						\
+    {						\
+      if (xh)					\
+	__FP_CLZ (R, xh);			\
+      else					\
+	{					\
+	  __FP_CLZ (R, xl);			\
+	  R += _FP_W_TYPE_SIZE;			\
+	}					\
+    }						\
+  while (0)
 
 #if 0
 
-#ifndef __FP_FRAC_ADDI_2
-#define __FP_FRAC_ADDI_2(xh, xl, i)	\
+# ifndef __FP_FRAC_ADDI_2
+#  define __FP_FRAC_ADDI_2(xh, xl, i)	\
   (xh += ((xl += i) < i))
-#endif
-#ifndef __FP_FRAC_ADD_2
-#define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl)	\
+# endif
+# ifndef __FP_FRAC_ADD_2
+#  define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl)	\
   (rh = xh + yh + ((rl = xl + yl) < xl))
-#endif
-#ifndef __FP_FRAC_SUB_2
-#define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl)	\
+# endif
+# ifndef __FP_FRAC_SUB_2
+#  define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl)	\
   (rh = xh - yh - ((rl = xl - yl) > xl))
-#endif
-#ifndef __FP_FRAC_DEC_2
-#define __FP_FRAC_DEC_2(xh, xl, yh, yl)	\
-  do {					\
-    UWtype _t = xl;			\
-    xh -= yh + ((xl -= yl) > _t);	\
-  } while (0)
-#endif
+# endif
+# ifndef __FP_FRAC_DEC_2
+#  define __FP_FRAC_DEC_2(xh, xl, yh, yl)	\
+  do						\
+    {						\
+      UWtype _t = xl;				\
+      xh -= yh + ((xl -= yl) > _t);		\
+    }						\
+  while (0)
+# endif
 
 #else
 
-#undef __FP_FRAC_ADDI_2
-#define __FP_FRAC_ADDI_2(xh, xl, i)	add_ssaaaa(xh, xl, xh, xl, 0, i)
-#undef __FP_FRAC_ADD_2
-#define __FP_FRAC_ADD_2			add_ssaaaa
-#undef __FP_FRAC_SUB_2
-#define __FP_FRAC_SUB_2			sub_ddmmss
-#undef __FP_FRAC_DEC_2
-#define __FP_FRAC_DEC_2(xh, xl, yh, yl)	sub_ddmmss(xh, xl, xh, xl, yh, yl)
+# undef __FP_FRAC_ADDI_2
+# define __FP_FRAC_ADDI_2(xh, xl, i)	add_ssaaaa (xh, xl, xh, xl, 0, i)
+# undef __FP_FRAC_ADD_2
+# define __FP_FRAC_ADD_2		add_ssaaaa
+# undef __FP_FRAC_SUB_2
+# define __FP_FRAC_SUB_2		sub_ddmmss
+# undef __FP_FRAC_DEC_2
+# define __FP_FRAC_DEC_2(xh, xl, yh, yl)	\
+  sub_ddmmss (xh, xl, xh, xl, yh, yl)
 
 #endif
 
@@ -201,54 +210,61 @@
  * normalize the data.
  */
 
-#define _FP_UNPACK_RAW_2(fs, X, val)			\
-  do {							\
-    union _FP_UNION_##fs _flo; _flo.flt = (val);	\
-							\
-    X##_f0 = _flo.bits.frac0;				\
-    X##_f1 = _flo.bits.frac1;				\
-    X##_e  = _flo.bits.exp;				\
-    X##_s  = _flo.bits.sign;				\
-  } while (0)
+#define _FP_UNPACK_RAW_2(fs, X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+      _flo.flt = (val);				\
+						\
+      X##_f0 = _flo.bits.frac0;			\
+      X##_f1 = _flo.bits.frac1;			\
+      X##_e  = _flo.bits.exp;			\
+      X##_s  = _flo.bits.sign;			\
+    }						\
+  while (0)
 
-#define _FP_UNPACK_RAW_2_P(fs, X, val)			\
-  do {							\
-    union _FP_UNION_##fs *_flo =			\
-      (union _FP_UNION_##fs *)(val);			\
-							\
-    X##_f0 = _flo->bits.frac0;				\
-    X##_f1 = _flo->bits.frac1;				\
-    X##_e  = _flo->bits.exp;				\
-    X##_s  = _flo->bits.sign;				\
-  } while (0)
+#define _FP_UNPACK_RAW_2_P(fs, X, val)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      X##_f0 = _flo->bits.frac0;					\
+      X##_f1 = _flo->bits.frac1;					\
+      X##_e  = _flo->bits.exp;						\
+      X##_s  = _flo->bits.sign;						\
+    }									\
+  while (0)
 
 
 /*
  * Repack the raw bits of a native fp value.
  */
 
-#define _FP_PACK_RAW_2(fs, val, X)			\
-  do {							\
-    union _FP_UNION_##fs _flo;				\
-							\
-    _flo.bits.frac0 = X##_f0;				\
-    _flo.bits.frac1 = X##_f1;				\
-    _flo.bits.exp   = X##_e;				\
-    _flo.bits.sign  = X##_s;				\
-							\
-    (val) = _flo.flt;					\
-  } while (0)
+#define _FP_PACK_RAW_2(fs, val, X)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+						\
+      _flo.bits.frac0 = X##_f0;			\
+      _flo.bits.frac1 = X##_f1;			\
+      _flo.bits.exp   = X##_e;			\
+      _flo.bits.sign  = X##_s;			\
+						\
+      (val) = _flo.flt;				\
+    }						\
+  while (0)
 
-#define _FP_PACK_RAW_2_P(fs, val, X)			\
-  do {							\
-    union _FP_UNION_##fs *_flo =			\
-      (union _FP_UNION_##fs *)(val);			\
-							\
-    _flo->bits.frac0 = X##_f0;				\
-    _flo->bits.frac1 = X##_f1;				\
-    _flo->bits.exp   = X##_e;				\
-    _flo->bits.sign  = X##_s;				\
-  } while (0)
+#define _FP_PACK_RAW_2_P(fs, val, X)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      _flo->bits.frac0 = X##_f0;					\
+      _flo->bits.frac1 = X##_f1;					\
+      _flo->bits.exp   = X##_e;						\
+      _flo->bits.sign  = X##_s;						\
+    }									\
+  while (0)
 
 
 /*
@@ -257,92 +273,128 @@
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
 
+#define _FP_MUL_MEAT_DW_2_wide(wfracbits, R, X, Y, doit)		\
+  do									\
+    {									\
+      _FP_FRAC_DECL_2 (_b);						\
+      _FP_FRAC_DECL_2 (_c);						\
+									\
+      doit (_FP_FRAC_WORD_4 (R, 1), _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0); \
+      doit (_b_f1, _b_f0, X##_f0, Y##_f1);				\
+      doit (_c_f1, _c_f0, X##_f1, Y##_f0);				\
+      doit (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), X##_f1, Y##_f1); \
+									\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1), 0, _b_f1, _b_f0,		\
+		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1));				\
+    }									\
+  while (0)
+
 #define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit)			\
-  do {									\
-    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);	\
+  do									\
+    {									\
+      _FP_FRAC_DECL_4 (_z);						\
 									\
-    doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);	\
-    doit(_b_f1, _b_f0, X##_f0, Y##_f1);					\
-    doit(_c_f1, _c_f0, X##_f1, Y##_f0);					\
-    doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1);	\
+      _FP_MUL_MEAT_DW_2_wide (wfracbits, _z, X, Y, doit);		\
 									\
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1), 0, _b_f1, _b_f0,		\
-		    _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1));				\
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0,		\
-		    _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1));				\
-									\
-    /* Normalize since we know where the msb of the multiplicands	\
-       were (bit B), we know that the msb of the of the product is	\
-       at either 2B or 2B-1.  */					\
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);			\
-    R##_f0 = _FP_FRAC_WORD_4(_z,0);					\
-    R##_f1 = _FP_FRAC_WORD_4(_z,1);					\
-  } while (0)
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
+      R##_f0 = _FP_FRAC_WORD_4 (_z, 0);					\
+      R##_f1 = _FP_FRAC_WORD_4 (_z, 1);					\
+    }									\
+  while (0)
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.
    Do only 3 multiplications instead of four. This one is for machines
    where multiplication is much more expensive than subtraction.  */
 
+#define _FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, R, X, Y, doit)		\
+  do									\
+    {									\
+      _FP_FRAC_DECL_2 (_b);						\
+      _FP_FRAC_DECL_2 (_c);						\
+      _FP_W_TYPE _d;							\
+      int _c1, _c2;							\
+									\
+      _b_f0 = X##_f0 + X##_f1;						\
+      _c1 = _b_f0 < X##_f0;						\
+      _b_f1 = Y##_f0 + Y##_f1;						\
+      _c2 = _b_f1 < Y##_f0;						\
+      doit (_d, _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0);		\
+      doit (_FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1), _b_f0, _b_f1); \
+      doit (_c_f1, _c_f0, X##_f1, Y##_f1);				\
+									\
+      _b_f0 &= -_c2;							\
+      _b_f1 &= -_c1;							\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1), (_c1 & _c2), 0, _d,	\
+		       0, _FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1)); \
+      __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+			_b_f0);						\
+      __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+			_b_f1);						\
+      __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1),				\
+		       0, _d, _FP_FRAC_WORD_4 (R, 0));			\
+      __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0);	\
+      __FP_FRAC_ADD_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2),	\
+		       _c_f1, _c_f0,					\
+		       _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2));	\
+    }									\
+  while (0)
+
 #define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit)		\
-  do {									\
-    _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);	\
-    _FP_W_TYPE _d;							\
-    int _c1, _c2;							\
+  do									\
+    {									\
+      _FP_FRAC_DECL_4 (_z);						\
 									\
-    _b_f0 = X##_f0 + X##_f1;						\
-    _c1 = _b_f0 < X##_f0;						\
-    _b_f1 = Y##_f0 + Y##_f1;						\
-    _c2 = _b_f1 < Y##_f0;						\
-    doit(_d, _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0);			\
-    doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1), _b_f0, _b_f1);	\
-    doit(_c_f1, _c_f0, X##_f1, Y##_f1);					\
+      _FP_MUL_MEAT_DW_2_wide_3mul (wfracbits, _z, X, Y, doit);		\
 									\
-    _b_f0 &= -_c2;							\
-    _b_f1 &= -_c1;							\
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1), (_c1 & _c2), 0, _d,		\
-		    0, _FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1));	\
-    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		     _b_f0);						\
-    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		     _b_f1);						\
-    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1),				\
-		    0, _d, _FP_FRAC_WORD_4(_z,0));			\
-    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),	\
-		    _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0);		\
-    __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2),	\
-		    _c_f1, _c_f0,					\
-		    _FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2));	\
-									\
-    /* Normalize since we know where the msb of the multiplicands	\
-       were (bit B), we know that the msb of the of the product is	\
-       at either 2B or 2B-1.  */					\
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);			\
-    R##_f0 = _FP_FRAC_WORD_4(_z,0);					\
-    R##_f1 = _FP_FRAC_WORD_4(_z,1);					\
-  } while (0)
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
+      R##_f0 = _FP_FRAC_WORD_4 (_z, 0);					\
+      R##_f1 = _FP_FRAC_WORD_4 (_z, 1);					\
+    }									\
+  while (0)
 
+#define _FP_MUL_MEAT_DW_2_gmp(wfracbits, R, X, Y)	\
+  do							\
+    {							\
+      _FP_W_TYPE _x[2], _y[2];				\
+      _x[0] = X##_f0;					\
+      _x[1] = X##_f1;					\
+      _y[0] = Y##_f0;					\
+      _y[1] = Y##_f1;					\
+							\
+      mpn_mul_n (R##_f, _x, _y, 2);			\
+    }							\
+  while (0)
+
 #define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)				\
-  do {									\
-    _FP_FRAC_DECL_4(_z);						\
-    _FP_W_TYPE _x[2], _y[2];						\
-    _x[0] = X##_f0; _x[1] = X##_f1;					\
-    _y[0] = Y##_f0; _y[1] = Y##_f1;					\
+  do									\
+    {									\
+      _FP_FRAC_DECL_4 (_z);						\
 									\
-    mpn_mul_n(_z_f, _x, _y, 2);						\
+      _FP_MUL_MEAT_DW_2_gmp (wfracbits, _z, X, Y);			\
 									\
-    /* Normalize since we know where the msb of the multiplicands	\
-       were (bit B), we know that the msb of the of the product is	\
-       at either 2B or 2B-1.  */					\
-    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);			\
-    R##_f0 = _z_f[0];							\
-    R##_f1 = _z_f[1];							\
-  } while (0)
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits);			\
+      R##_f0 = _z_f[0];							\
+      R##_f1 = _z_f[1];							\
+    }									\
+  while (0)
 
 /* Do at most 120x120=240 bits multiplication using double floating
    point multiplication.  This is useful if floating point
@@ -353,236 +405,221 @@
    SETFETZ is a macro which will disable all FPU exceptions and set rounding
    towards zero,  RESETFE should optionally reset it back.  */
 
-#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe)	\
-  do {										\
-    static const double _const[] = {						\
-      /* 2^-24 */ 5.9604644775390625e-08,					\
-      /* 2^-48 */ 3.5527136788005009e-15,					\
-      /* 2^-72 */ 2.1175823681357508e-22,					\
-      /* 2^-96 */ 1.2621774483536189e-29,					\
-      /* 2^28 */ 2.68435456e+08,						\
-      /* 2^4 */ 1.600000e+01,							\
-      /* 2^-20 */ 9.5367431640625e-07,						\
-      /* 2^-44 */ 5.6843418860808015e-14,					\
-      /* 2^-68 */ 3.3881317890172014e-21,					\
-      /* 2^-92 */ 2.0194839173657902e-28,					\
-      /* 2^-116 */ 1.2037062152420224e-35};					\
-    double _a240, _b240, _c240, _d240, _e240, _f240, 				\
-	   _g240, _h240, _i240, _j240, _k240;					\
-    union { double d; UDItype i; } _l240, _m240, _n240, _o240,			\
-				   _p240, _q240, _r240, _s240;			\
-    UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;			\
-										\
-    if (wfracbits < 106 || wfracbits > 120)					\
-      abort();									\
-										\
-    setfetz;									\
-										\
-    _e240 = (double)(long)(X##_f0 & 0xffffff);					\
-    _j240 = (double)(long)(Y##_f0 & 0xffffff);					\
-    _d240 = (double)(long)((X##_f0 >> 24) & 0xffffff);				\
-    _i240 = (double)(long)((Y##_f0 >> 24) & 0xffffff);				\
-    _c240 = (double)(long)(((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48));	\
-    _h240 = (double)(long)(((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48));	\
-    _b240 = (double)(long)((X##_f1 >> 8) & 0xffffff);				\
-    _g240 = (double)(long)((Y##_f1 >> 8) & 0xffffff);				\
-    _a240 = (double)(long)(X##_f1 >> 32);					\
-    _f240 = (double)(long)(Y##_f1 >> 32);					\
-    _e240 *= _const[3];								\
-    _j240 *= _const[3];								\
-    _d240 *= _const[2];								\
-    _i240 *= _const[2];								\
-    _c240 *= _const[1];								\
-    _h240 *= _const[1];								\
-    _b240 *= _const[0];								\
-    _g240 *= _const[0];								\
-    _s240.d =							      _e240*_j240;\
-    _r240.d =						_d240*_j240 + _e240*_i240;\
-    _q240.d =				  _c240*_j240 + _d240*_i240 + _e240*_h240;\
-    _p240.d =		    _b240*_j240 + _c240*_i240 + _d240*_h240 + _e240*_g240;\
-    _o240.d = _a240*_j240 + _b240*_i240 + _c240*_h240 + _d240*_g240 + _e240*_f240;\
-    _n240.d = _a240*_i240 + _b240*_h240 + _c240*_g240 + _d240*_f240;		\
-    _m240.d = _a240*_h240 + _b240*_g240 + _c240*_f240;				\
-    _l240.d = _a240*_g240 + _b240*_f240;					\
-    _k240 =   _a240*_f240;							\
-    _r240.d += _s240.d;								\
-    _q240.d += _r240.d;								\
-    _p240.d += _q240.d;								\
-    _o240.d += _p240.d;								\
-    _n240.d += _o240.d;								\
-    _m240.d += _n240.d;								\
-    _l240.d += _m240.d;								\
-    _k240 += _l240.d;								\
-    _s240.d -= ((_const[10]+_s240.d)-_const[10]);				\
-    _r240.d -= ((_const[9]+_r240.d)-_const[9]);					\
-    _q240.d -= ((_const[8]+_q240.d)-_const[8]);					\
-    _p240.d -= ((_const[7]+_p240.d)-_const[7]);					\
-    _o240.d += _const[7];							\
-    _n240.d += _const[6];							\
-    _m240.d += _const[5];							\
-    _l240.d += _const[4];							\
-    if (_s240.d != 0.0) _y240 = 1;						\
-    if (_r240.d != 0.0) _y240 = 1;						\
-    if (_q240.d != 0.0) _y240 = 1;						\
-    if (_p240.d != 0.0) _y240 = 1;						\
-    _t240 = (DItype)_k240;							\
-    _u240 = _l240.i;								\
-    _v240 = _m240.i;								\
-    _w240 = _n240.i;								\
-    _x240 = _o240.i;								\
-    R##_f1 = (_t240 << (128 - (wfracbits - 1)))					\
-	     | ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104));			\
-    R##_f0 = ((_u240 & 0xffffff) << (168 - (wfracbits - 1)))			\
-	     | ((_v240 & 0xffffff) << (144 - (wfracbits - 1)))			\
-	     | ((_w240 & 0xffffff) << (120 - (wfracbits - 1)))			\
-	     | ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96))			\
-	     | _y240;								\
-    resetfe;									\
-  } while (0)
+#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe) \
+  do									\
+    {									\
+      static const double _const[] =					\
+	{								\
+	  /* 2^-24 */ 5.9604644775390625e-08,				\
+	  /* 2^-48 */ 3.5527136788005009e-15,				\
+	  /* 2^-72 */ 2.1175823681357508e-22,				\
+	  /* 2^-96 */ 1.2621774483536189e-29,				\
+	  /* 2^28 */ 2.68435456e+08,					\
+	  /* 2^4 */ 1.600000e+01,					\
+	  /* 2^-20 */ 9.5367431640625e-07,				\
+	  /* 2^-44 */ 5.6843418860808015e-14,				\
+	  /* 2^-68 */ 3.3881317890172014e-21,				\
+	  /* 2^-92 */ 2.0194839173657902e-28,				\
+	  /* 2^-116 */ 1.2037062152420224e-35				\
+	};								\
+      double _a240, _b240, _c240, _d240, _e240, _f240,			\
+	_g240, _h240, _i240, _j240, _k240;				\
+      union { double d; UDItype i; } _l240, _m240, _n240, _o240,	\
+				       _p240, _q240, _r240, _s240;	\
+      UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;		\
+									\
+      if (wfracbits < 106 || wfracbits > 120)				\
+	abort ();							\
+									\
+      setfetz;								\
+									\
+      _e240 = (double) (long) (X##_f0 & 0xffffff);			\
+      _j240 = (double) (long) (Y##_f0 & 0xffffff);			\
+      _d240 = (double) (long) ((X##_f0 >> 24) & 0xffffff);		\
+      _i240 = (double) (long) ((Y##_f0 >> 24) & 0xffffff);		\
+      _c240 = (double) (long) (((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48)); \
+      _h240 = (double) (long) (((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48)); \
+      _b240 = (double) (long) ((X##_f1 >> 8) & 0xffffff);		\
+      _g240 = (double) (long) ((Y##_f1 >> 8) & 0xffffff);		\
+      _a240 = (double) (long) (X##_f1 >> 32);				\
+      _f240 = (double) (long) (Y##_f1 >> 32);				\
+      _e240 *= _const[3];						\
+      _j240 *= _const[3];						\
+      _d240 *= _const[2];						\
+      _i240 *= _const[2];						\
+      _c240 *= _const[1];						\
+      _h240 *= _const[1];						\
+      _b240 *= _const[0];						\
+      _g240 *= _const[0];						\
+      _s240.d =							      _e240*_j240; \
+      _r240.d =						_d240*_j240 + _e240*_i240; \
+      _q240.d =				  _c240*_j240 + _d240*_i240 + _e240*_h240; \
+      _p240.d =		    _b240*_j240 + _c240*_i240 + _d240*_h240 + _e240*_g240; \
+      _o240.d = _a240*_j240 + _b240*_i240 + _c240*_h240 + _d240*_g240 + _e240*_f240; \
+      _n240.d = _a240*_i240 + _b240*_h240 + _c240*_g240 + _d240*_f240;	\
+      _m240.d = _a240*_h240 + _b240*_g240 + _c240*_f240;		\
+      _l240.d = _a240*_g240 + _b240*_f240;				\
+      _k240 =   _a240*_f240;						\
+      _r240.d += _s240.d;						\
+      _q240.d += _r240.d;						\
+      _p240.d += _q240.d;						\
+      _o240.d += _p240.d;						\
+      _n240.d += _o240.d;						\
+      _m240.d += _n240.d;						\
+      _l240.d += _m240.d;						\
+      _k240 += _l240.d;							\
+      _s240.d -= ((_const[10]+_s240.d)-_const[10]);			\
+      _r240.d -= ((_const[9]+_r240.d)-_const[9]);			\
+      _q240.d -= ((_const[8]+_q240.d)-_const[8]);			\
+      _p240.d -= ((_const[7]+_p240.d)-_const[7]);			\
+      _o240.d += _const[7];						\
+      _n240.d += _const[6];						\
+      _m240.d += _const[5];						\
+      _l240.d += _const[4];						\
+      if (_s240.d != 0.0)						\
+	_y240 = 1;							\
+      if (_r240.d != 0.0)						\
+	_y240 = 1;							\
+      if (_q240.d != 0.0)						\
+	_y240 = 1;							\
+      if (_p240.d != 0.0)						\
+	_y240 = 1;							\
+      _t240 = (DItype) _k240;						\
+      _u240 = _l240.i;							\
+      _v240 = _m240.i;							\
+      _w240 = _n240.i;							\
+      _x240 = _o240.i;							\
+      R##_f1 = ((_t240 << (128 - (wfracbits - 1)))			\
+		| ((_u240 & 0xffffff) >> ((wfracbits - 1) - 104)));	\
+      R##_f0 = (((_u240 & 0xffffff) << (168 - (wfracbits - 1)))		\
+		| ((_v240 & 0xffffff) << (144 - (wfracbits - 1)))	\
+		| ((_w240 & 0xffffff) << (120 - (wfracbits - 1)))	\
+		| ((_x240 & 0xffffff) >> ((wfracbits - 1) - 96))	\
+		| _y240);						\
+      resetfe;								\
+    }									\
+  while (0)
 
 /*
  * Division algorithms:
  */
 
 #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)				\
-  do {									\
-    _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;		\
-    if (_FP_FRAC_GT_2(X, Y))						\
-      {									\
-	_n_f2 = X##_f1 >> 1;						\
-	_n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;		\
-	_n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1);			\
-      }									\
-    else								\
-      {									\
-	R##_e--;							\
-	_n_f2 = X##_f1;							\
-	_n_f1 = X##_f0;							\
-	_n_f0 = 0;							\
-      }									\
+  do									\
+    {									\
+      _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;	\
+      if (_FP_FRAC_GE_2 (X, Y))						\
+	{								\
+	  _n_f2 = X##_f1 >> 1;						\
+	  _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;	\
+	  _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1);			\
+	}								\
+      else								\
+	{								\
+	  R##_e--;							\
+	  _n_f2 = X##_f1;						\
+	  _n_f1 = X##_f0;						\
+	  _n_f0 = 0;							\
+	}								\
 									\
-    /* Normalize, i.e. make the most significant bit of the 		\
-       denominator set. */						\
-    _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs);				\
+      /* Normalize, i.e. make the most significant bit of the		\
+	 denominator set. */						\
+      _FP_FRAC_SLL_2 (Y, _FP_WFRACXBITS_##fs);				\
 									\
-    udiv_qrnnd(R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1);			\
-    umul_ppmm(_m_f1, _m_f0, R##_f1, Y##_f0);				\
-    _r_f0 = _n_f0;							\
-    if (_FP_FRAC_GT_2(_m, _r))						\
-      {									\
-	R##_f1--;							\
-	_FP_FRAC_ADD_2(_r, Y, _r);					\
-	if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))		\
-	  {								\
-	    R##_f1--;							\
-	    _FP_FRAC_ADD_2(_r, Y, _r);					\
-	  }								\
-      }									\
-    _FP_FRAC_DEC_2(_r, _m);						\
+      udiv_qrnnd (R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1);			\
+      umul_ppmm (_m_f1, _m_f0, R##_f1, Y##_f0);				\
+      _r_f0 = _n_f0;							\
+      if (_FP_FRAC_GT_2 (_m, _r))					\
+	{								\
+	  R##_f1--;							\
+	  _FP_FRAC_ADD_2 (_r, Y, _r);					\
+	  if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r))		\
+	    {								\
+	      R##_f1--;							\
+	      _FP_FRAC_ADD_2 (_r, Y, _r);				\
+	    }								\
+	}								\
+      _FP_FRAC_DEC_2 (_r, _m);						\
 									\
-    if (_r_f1 == Y##_f1)						\
-      {									\
-	/* This is a special case, not an optimization			\
-	   (_r/Y##_f1 would not fit into UWtype).			\
-	   As _r is guaranteed to be < Y,  R##_f0 can be either		\
-	   (UWtype)-1 or (UWtype)-2.  But as we know what kind		\
-	   of bits it is (sticky, guard, round),  we don't care.	\
-	   We also don't care what the reminder is,  because the	\
-	   guard bit will be set anyway.  -jj */			\
-	R##_f0 = -1;							\
-      }									\
-    else								\
-      {									\
-	udiv_qrnnd(R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1);		\
-	umul_ppmm(_m_f1, _m_f0, R##_f0, Y##_f0);			\
-	_r_f0 = 0;							\
-	if (_FP_FRAC_GT_2(_m, _r))					\
-	  {								\
-	    R##_f0--;							\
-	    _FP_FRAC_ADD_2(_r, Y, _r);					\
-	    if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r))		\
-	      {								\
-		R##_f0--;						\
-		_FP_FRAC_ADD_2(_r, Y, _r);				\
-	      }								\
-	  }								\
-	if (!_FP_FRAC_EQ_2(_r, _m))					\
-	  R##_f0 |= _FP_WORK_STICKY;					\
-      }									\
-  } while (0)
+      if (_r_f1 == Y##_f1)						\
+	{								\
+	  /* This is a special case, not an optimization		\
+	     (_r/Y##_f1 would not fit into UWtype).			\
+	     As _r is guaranteed to be < Y,  R##_f0 can be either	\
+	     (UWtype)-1 or (UWtype)-2.  But as we know what kind	\
+	     of bits it is (sticky, guard, round),  we don't care.	\
+	     We also don't care what the reminder is,  because the	\
+	     guard bit will be set anyway.  -jj */			\
+	  R##_f0 = -1;							\
+	}								\
+      else								\
+	{								\
+	  udiv_qrnnd (R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1);		\
+	  umul_ppmm (_m_f1, _m_f0, R##_f0, Y##_f0);			\
+	  _r_f0 = 0;							\
+	  if (_FP_FRAC_GT_2 (_m, _r))					\
+	    {								\
+	      R##_f0--;							\
+	      _FP_FRAC_ADD_2 (_r, Y, _r);				\
+	      if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r))	\
+		{							\
+		  R##_f0--;						\
+		  _FP_FRAC_ADD_2 (_r, Y, _r);				\
+		}							\
+	    }								\
+	  if (!_FP_FRAC_EQ_2 (_r, _m))					\
+	    R##_f0 |= _FP_WORK_STICKY;					\
+	}								\
+    }									\
+  while (0)
 
 
-#define _FP_DIV_MEAT_2_gmp(fs, R, X, Y)					\
-  do {									\
-    _FP_W_TYPE _x[4], _y[2], _z[4];					\
-    _y[0] = Y##_f0; _y[1] = Y##_f1;					\
-    _x[0] = _x[3] = 0;							\
-    if (_FP_FRAC_GT_2(X, Y))						\
-      {									\
-	R##_e++;							\
-	_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) |	\
-		 X##_f1 >> (_FP_W_TYPE_SIZE -				\
-			    (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE)));	\
-	_x[2] = X##_f1 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE);	\
-      }									\
-    else								\
-      {									\
-	_x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) |	\
-		 X##_f1 >> (_FP_W_TYPE_SIZE -				\
-			    (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE)));	\
-	_x[2] = X##_f1 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE);	\
-      }									\
-									\
-    (void) mpn_divrem (_z, 0, _x, 4, _y, 2);				\
-    R##_f1 = _z[1];							\
-    R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0);				\
-  } while (0)
-
-
 /*
  * Square root algorithms:
  * We have just one right now, maybe Newton approximation
  * should be added for those machines where division is fast.
  */
 
-#define _FP_SQRT_MEAT_2(R, S, T, X, q)			\
-  do {							\
-    while (q)						\
-      {							\
-	T##_f1 = S##_f1 + q;				\
-	if (T##_f1 <= X##_f1)				\
-	  {						\
-	    S##_f1 = T##_f1 + q;			\
-	    X##_f1 -= T##_f1;				\
-	    R##_f1 += q;				\
-	  }						\
-	_FP_FRAC_SLL_2(X, 1);				\
-	q >>= 1;					\
-      }							\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);		\
-    while (q != _FP_WORK_ROUND)				\
-      {							\
-	T##_f0 = S##_f0 + q;				\
-	T##_f1 = S##_f1;				\
-	if (T##_f1 < X##_f1 || 				\
-	    (T##_f1 == X##_f1 && T##_f0 <= X##_f0))	\
-	  {						\
-	    S##_f0 = T##_f0 + q;			\
-	    S##_f1 += (T##_f0 > S##_f0);		\
-	    _FP_FRAC_DEC_2(X, T);			\
-	    R##_f0 += q;				\
-	  }						\
-	_FP_FRAC_SLL_2(X, 1);				\
-	q >>= 1;					\
-      }							\
-    if (X##_f0 | X##_f1)				\
-      {							\
-	if (S##_f1 < X##_f1 || 				\
-	    (S##_f1 == X##_f1 && S##_f0 < X##_f0))	\
-	  R##_f0 |= _FP_WORK_ROUND;			\
-	R##_f0 |= _FP_WORK_STICKY;			\
-      }							\
-  } while (0)
+#define _FP_SQRT_MEAT_2(R, S, T, X, q)				\
+  do								\
+    {								\
+      while (q)							\
+	{							\
+	  T##_f1 = S##_f1 + q;					\
+	  if (T##_f1 <= X##_f1)					\
+	    {							\
+	      S##_f1 = T##_f1 + q;				\
+	      X##_f1 -= T##_f1;					\
+	      R##_f1 += q;					\
+	    }							\
+	  _FP_FRAC_SLL_2 (X, 1);				\
+	  q >>= 1;						\
+	}							\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);		\
+      while (q != _FP_WORK_ROUND)				\
+	{							\
+	  T##_f0 = S##_f0 + q;					\
+	  T##_f1 = S##_f1;					\
+	  if (T##_f1 < X##_f1					\
+	      || (T##_f1 == X##_f1 && T##_f0 <= X##_f0))	\
+	    {							\
+	      S##_f0 = T##_f0 + q;				\
+	      S##_f1 += (T##_f0 > S##_f0);			\
+	      _FP_FRAC_DEC_2 (X, T);				\
+	      R##_f0 += q;					\
+	    }							\
+	  _FP_FRAC_SLL_2 (X, 1);				\
+	  q >>= 1;						\
+	}							\
+      if (X##_f0 | X##_f1)					\
+	{							\
+	  if (S##_f1 < X##_f1					\
+	      || (S##_f1 == X##_f1 && S##_f0 < X##_f0))		\
+	    R##_f0 |= _FP_WORK_ROUND;				\
+	  R##_f0 |= _FP_WORK_STICKY;				\
+	}							\
+    }								\
+  while (0)
 
 
 /*
@@ -591,19 +628,21 @@
  */
 
 #define _FP_FRAC_ASSEMBLE_2(r, X, rsize)	\
-(void)((rsize <= _FP_W_TYPE_SIZE)		\
-       ? ({ r = X##_f0; })			\
-       : ({					\
-	    r = X##_f1;				\
-	    r <<= _FP_W_TYPE_SIZE;		\
-	    r += X##_f0;			\
-	  }))
+  (void) ((rsize <= _FP_W_TYPE_SIZE)		\
+	  ? ({ r = X##_f0; })			\
+	  : ({					\
+	      r = X##_f1;			\
+	      r <<= _FP_W_TYPE_SIZE;		\
+	      r += X##_f0;			\
+	    }))
 
 #define _FP_FRAC_DISASSEMBLE_2(X, r, rsize)				\
-  do {									\
-    X##_f0 = r;								\
-    X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
-  } while (0)
+  do									\
+    {									\
+      X##_f0 = r;							\
+      X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
+    }									\
+  while (0)
 
 /*
  * Convert FP values between word sizes
@@ -613,4 +652,4 @@
 
 #define _FP_FRAC_COPY_2_1(D, S)		((D##_f0 = S##_f), (D##_f1 = 0))
 
-#define _FP_FRAC_COPY_2_2(D,S)		_FP_FRAC_COPY_2(D,S)
+#define _FP_FRAC_COPY_2_2(D, S)		_FP_FRAC_COPY_2 (D, S)
Index: libgcc/soft-fp/op-4.h
===================================================================
--- libgcc/soft-fp/op-4.h	(revision 204460)
+++ libgcc/soft-fp/op-4.h	(working copy)
@@ -31,54 +31,58 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define _FP_FRAC_DECL_4(X)	_FP_W_TYPE X##_f[4]
-#define _FP_FRAC_COPY_4(D,S)			\
+#define _FP_FRAC_COPY_4(D, S)			\
   (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],	\
    D##_f[2] = S##_f[2], D##_f[3] = S##_f[3])
-#define _FP_FRAC_SET_4(X,I)	__FP_FRAC_SET_4(X, I)
+#define _FP_FRAC_SET_4(X, I)	__FP_FRAC_SET_4 (X, I)
 #define _FP_FRAC_HIGH_4(X)	(X##_f[3])
 #define _FP_FRAC_LOW_4(X)	(X##_f[0])
-#define _FP_FRAC_WORD_4(X,w)	(X##_f[w])
+#define _FP_FRAC_WORD_4(X, w)	(X##_f[w])
 
-#define _FP_FRAC_SLL_4(X,N)						\
-  do {									\
-    _FP_I_TYPE _up, _down, _skip, _i;					\
-    _skip = (N) / _FP_W_TYPE_SIZE;					\
-    _up = (N) % _FP_W_TYPE_SIZE;					\
-    _down = _FP_W_TYPE_SIZE - _up;					\
-    if (!_up)								\
-      for (_i = 3; _i >= _skip; --_i)					\
-	X##_f[_i] = X##_f[_i-_skip];					\
-    else								\
-      {									\
-	for (_i = 3; _i > _skip; --_i)					\
-	  X##_f[_i] = X##_f[_i-_skip] << _up				\
-		      | X##_f[_i-_skip-1] >> _down;			\
-	X##_f[_i--] = X##_f[0] << _up; 					\
-      }									\
-    for (; _i >= 0; --_i)						\
-      X##_f[_i] = 0;							\
-  } while (0)
+#define _FP_FRAC_SLL_4(X, N)				\
+  do							\
+    {							\
+      _FP_I_TYPE _up, _down, _skip, _i;			\
+      _skip = (N) / _FP_W_TYPE_SIZE;			\
+      _up = (N) % _FP_W_TYPE_SIZE;			\
+      _down = _FP_W_TYPE_SIZE - _up;			\
+      if (!_up)						\
+	for (_i = 3; _i >= _skip; --_i)			\
+	  X##_f[_i] = X##_f[_i-_skip];			\
+      else						\
+	{						\
+	  for (_i = 3; _i > _skip; --_i)		\
+	    X##_f[_i] = (X##_f[_i-_skip] << _up		\
+			 | X##_f[_i-_skip-1] >> _down);	\
+	  X##_f[_i--] = X##_f[0] << _up;		\
+	}						\
+      for (; _i >= 0; --_i)				\
+	X##_f[_i] = 0;					\
+    }							\
+  while (0)
 
 /* This one was broken too */
-#define _FP_FRAC_SRL_4(X,N)						\
-  do {									\
-    _FP_I_TYPE _up, _down, _skip, _i;					\
-    _skip = (N) / _FP_W_TYPE_SIZE;					\
-    _down = (N) % _FP_W_TYPE_SIZE;					\
-    _up = _FP_W_TYPE_SIZE - _down;					\
-    if (!_down)								\
-      for (_i = 0; _i <= 3-_skip; ++_i)					\
-	X##_f[_i] = X##_f[_i+_skip];					\
-    else								\
-      {									\
-	for (_i = 0; _i < 3-_skip; ++_i)				\
-	  X##_f[_i] = X##_f[_i+_skip] >> _down				\
-		      | X##_f[_i+_skip+1] << _up;			\
-	X##_f[_i++] = X##_f[3] >> _down;				\
-      }									\
-    for (; _i < 4; ++_i)						\
-      X##_f[_i] = 0;							\
-  } while (0)
+#define _FP_FRAC_SRL_4(X, N)				\
+  do							\
+    {							\
+      _FP_I_TYPE _up, _down, _skip, _i;			\
+      _skip = (N) / _FP_W_TYPE_SIZE;			\
+      _down = (N) % _FP_W_TYPE_SIZE;			\
+      _up = _FP_W_TYPE_SIZE - _down;			\
+      if (!_down)					\
+	for (_i = 0; _i <= 3-_skip; ++_i)		\
+	  X##_f[_i] = X##_f[_i+_skip];			\
+      else						\
+	{						\
+	  for (_i = 0; _i < 3-_skip; ++_i)		\
+	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
+			 | X##_f[_i+_skip+1] << _up);	\
+	  X##_f[_i++] = X##_f[3] >> _down;		\
+	}						\
+      for (; _i < 4; ++_i)				\
+	X##_f[_i] = 0;					\
+    }							\
+  while (0)
 
 
 /* Right shift with sticky-lsb.
@@ -86,159 +90,172 @@
  * but that if any of the bits that fall off the right hand side
  * were one then we always set the LSbit.
  */
-#define _FP_FRAC_SRST_4(X,S,N,size)			\
-  do {							\
-    _FP_I_TYPE _up, _down, _skip, _i;			\
-    _FP_W_TYPE _s;					\
-    _skip = (N) / _FP_W_TYPE_SIZE;			\
-    _down = (N) % _FP_W_TYPE_SIZE;			\
-    _up = _FP_W_TYPE_SIZE - _down;			\
-    for (_s = _i = 0; _i < _skip; ++_i)			\
-      _s |= X##_f[_i];					\
-    if (!_down)						\
-      for (_i = 0; _i <= 3-_skip; ++_i)			\
-	X##_f[_i] = X##_f[_i+_skip];			\
-    else						\
-      {							\
-	_s |= X##_f[_i] << _up;				\
-	for (_i = 0; _i < 3-_skip; ++_i)		\
-	  X##_f[_i] = X##_f[_i+_skip] >> _down		\
-		      | X##_f[_i+_skip+1] << _up;	\
-	X##_f[_i++] = X##_f[3] >> _down;		\
-      }							\
-    for (; _i < 4; ++_i)				\
-      X##_f[_i] = 0;					\
-    S = (_s != 0);					\
-  } while (0)
+#define _FP_FRAC_SRST_4(X, S, N, size)			\
+  do							\
+    {							\
+      _FP_I_TYPE _up, _down, _skip, _i;			\
+      _FP_W_TYPE _s;					\
+      _skip = (N) / _FP_W_TYPE_SIZE;			\
+      _down = (N) % _FP_W_TYPE_SIZE;			\
+      _up = _FP_W_TYPE_SIZE - _down;			\
+      for (_s = _i = 0; _i < _skip; ++_i)		\
+	_s |= X##_f[_i];				\
+      if (!_down)					\
+	for (_i = 0; _i <= 3-_skip; ++_i)		\
+	  X##_f[_i] = X##_f[_i+_skip];			\
+      else						\
+	{						\
+	  _s |= X##_f[_i] << _up;			\
+	  for (_i = 0; _i < 3-_skip; ++_i)		\
+	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
+			 | X##_f[_i+_skip+1] << _up);	\
+	  X##_f[_i++] = X##_f[3] >> _down;		\
+	}						\
+      for (; _i < 4; ++_i)				\
+	X##_f[_i] = 0;					\
+      S = (_s != 0);					\
+    }							\
+  while (0)
 
-#define _FP_FRAC_SRS_4(X,N,size)		\
-  do {						\
-    int _sticky;				\
-    _FP_FRAC_SRST_4(X, _sticky, N, size);	\
-    X##_f[0] |= _sticky;			\
-  } while (0)
+#define _FP_FRAC_SRS_4(X, N, size)		\
+  do						\
+    {						\
+      int _sticky;				\
+      _FP_FRAC_SRST_4 (X, _sticky, N, size);	\
+      X##_f[0] |= _sticky;			\
+    }						\
+  while (0)
 
-#define _FP_FRAC_ADD_4(R,X,Y)						\
-  __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],		\
-		  X##_f[3], X##_f[2], X##_f[1], X##_f[0],		\
-		  Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+#define _FP_FRAC_ADD_4(R, X, Y)					\
+  __FP_FRAC_ADD_4 (R##_f[3], R##_f[2], R##_f[1], R##_f[0],	\
+		   X##_f[3], X##_f[2], X##_f[1], X##_f[0],	\
+		   Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
 
-#define _FP_FRAC_SUB_4(R,X,Y)						\
-  __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0],		\
-		  X##_f[3], X##_f[2], X##_f[1], X##_f[0],		\
-		  Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+#define _FP_FRAC_SUB_4(R, X, Y)					\
+  __FP_FRAC_SUB_4 (R##_f[3], R##_f[2], R##_f[1], R##_f[0],	\
+		   X##_f[3], X##_f[2], X##_f[1], X##_f[0],	\
+		   Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
 
-#define _FP_FRAC_DEC_4(X,Y)						\
-  __FP_FRAC_DEC_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],		\
-		  Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
+#define _FP_FRAC_DEC_4(X, Y)					\
+  __FP_FRAC_DEC_4 (X##_f[3], X##_f[2], X##_f[1], X##_f[0],	\
+		   Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0])
 
-#define _FP_FRAC_ADDI_4(X,I)						\
-  __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
+#define _FP_FRAC_ADDI_4(X, I)					\
+  __FP_FRAC_ADDI_4 (X##_f[3], X##_f[2], X##_f[1], X##_f[0], I)
 
-#define _FP_ZEROFRAC_4  0,0,0,0
-#define _FP_MINFRAC_4   0,0,0,1
-#define _FP_MAXFRAC_4	(~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0)
+#define _FP_ZEROFRAC_4  0, 0, 0, 0
+#define _FP_MINFRAC_4   0, 0, 0, 1
+#define _FP_MAXFRAC_4	(~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0)
 
 #define _FP_FRAC_ZEROP_4(X)     ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
-#define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE)X##_f[3] < 0)
-#define _FP_FRAC_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE) X##_f[3] < 0)
+#define _FP_FRAC_OVERP_4(fs, X)  (_FP_FRAC_HIGH_##fs (X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_HIGHBIT_DW_4(fs, X)	\
+  (_FP_FRAC_HIGH_DW_##fs (X) & _FP_HIGHBIT_DW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_4(fs, X)  (_FP_FRAC_HIGH_##fs (X) &= ~_FP_OVERFLOW_##fs)
 
-#define _FP_FRAC_EQ_4(X,Y)				\
- (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]		\
-  && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
+#define _FP_FRAC_EQ_4(X, Y)				\
+  (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]		\
+   && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3])
 
-#define _FP_FRAC_GT_4(X,Y)				\
- (X##_f[3] > Y##_f[3] ||				\
-  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||	\
-   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||	\
-    (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0])	\
-   ))							\
-  ))							\
- )
+#define _FP_FRAC_GT_4(X, Y)				\
+  (X##_f[3] > Y##_f[3]					\
+   || (X##_f[3] == Y##_f[3]				\
+       && (X##_f[2] > Y##_f[2]				\
+	   || (X##_f[2] == Y##_f[2]			\
+	       && (X##_f[1] > Y##_f[1]			\
+		   || (X##_f[1] == Y##_f[1]		\
+		       && X##_f[0] > Y##_f[0]))))))
 
-#define _FP_FRAC_GE_4(X,Y)				\
- (X##_f[3] > Y##_f[3] ||				\
-  (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] ||	\
-   (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] ||	\
-    (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0])	\
-   ))							\
-  ))							\
- )
+#define _FP_FRAC_GE_4(X, Y)				\
+  (X##_f[3] > Y##_f[3]					\
+   || (X##_f[3] == Y##_f[3]				\
+       && (X##_f[2] > Y##_f[2]				\
+	   || (X##_f[2] == Y##_f[2]			\
+	       && (X##_f[1] > Y##_f[1]			\
+		   || (X##_f[1] == Y##_f[1]		\
+		       && X##_f[0] >= Y##_f[0]))))))
 
 
-#define _FP_FRAC_CLZ_4(R,X)		\
-  do {					\
-    if (X##_f[3])			\
-    {					\
-	__FP_CLZ(R,X##_f[3]);		\
-    }					\
-    else if (X##_f[2])			\
-    {					\
-	__FP_CLZ(R,X##_f[2]);		\
-	R += _FP_W_TYPE_SIZE;		\
-    }					\
-    else if (X##_f[1])			\
-    {					\
-	__FP_CLZ(R,X##_f[1]);		\
-	R += _FP_W_TYPE_SIZE*2;		\
-    }					\
-    else				\
-    {					\
-	__FP_CLZ(R,X##_f[0]);		\
-	R += _FP_W_TYPE_SIZE*3;		\
-    }					\
-  } while(0)
+#define _FP_FRAC_CLZ_4(R, X)			\
+  do						\
+    {						\
+      if (X##_f[3])				\
+	__FP_CLZ (R, X##_f[3]);			\
+      else if (X##_f[2])			\
+	{					\
+	  __FP_CLZ (R, X##_f[2]);		\
+	  R += _FP_W_TYPE_SIZE;			\
+	}					\
+      else if (X##_f[1])			\
+	{					\
+	  __FP_CLZ (R, X##_f[1]);		\
+	  R += _FP_W_TYPE_SIZE*2;		\
+	}					\
+      else					\
+	{					\
+	  __FP_CLZ (R, X##_f[0]);		\
+	  R += _FP_W_TYPE_SIZE*3;		\
+	}					\
+    }						\
+  while (0)
 
 
-#define _FP_UNPACK_RAW_4(fs, X, val)				\
-  do {								\
-    union _FP_UNION_##fs _flo; _flo.flt = (val);		\
-    X##_f[0] = _flo.bits.frac0;					\
-    X##_f[1] = _flo.bits.frac1;					\
-    X##_f[2] = _flo.bits.frac2;					\
-    X##_f[3] = _flo.bits.frac3;					\
-    X##_e  = _flo.bits.exp;					\
-    X##_s  = _flo.bits.sign;					\
-  } while (0)
+#define _FP_UNPACK_RAW_4(fs, X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+      _flo.flt = (val);				\
+      X##_f[0] = _flo.bits.frac0;		\
+      X##_f[1] = _flo.bits.frac1;		\
+      X##_f[2] = _flo.bits.frac2;		\
+      X##_f[3] = _flo.bits.frac3;		\
+      X##_e  = _flo.bits.exp;			\
+      X##_s  = _flo.bits.sign;			\
+    }						\
+  while (0)
 
-#define _FP_UNPACK_RAW_4_P(fs, X, val)				\
-  do {								\
-    union _FP_UNION_##fs *_flo =				\
-      (union _FP_UNION_##fs *)(val);				\
-								\
-    X##_f[0] = _flo->bits.frac0;				\
-    X##_f[1] = _flo->bits.frac1;				\
-    X##_f[2] = _flo->bits.frac2;				\
-    X##_f[3] = _flo->bits.frac3;				\
-    X##_e  = _flo->bits.exp;					\
-    X##_s  = _flo->bits.sign;					\
-  } while (0)
+#define _FP_UNPACK_RAW_4_P(fs, X, val)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      X##_f[0] = _flo->bits.frac0;					\
+      X##_f[1] = _flo->bits.frac1;					\
+      X##_f[2] = _flo->bits.frac2;					\
+      X##_f[3] = _flo->bits.frac3;					\
+      X##_e  = _flo->bits.exp;						\
+      X##_s  = _flo->bits.sign;						\
+    }									\
+  while (0)
 
-#define _FP_PACK_RAW_4(fs, val, X)				\
-  do {								\
-    union _FP_UNION_##fs _flo;					\
-    _flo.bits.frac0 = X##_f[0];					\
-    _flo.bits.frac1 = X##_f[1];					\
-    _flo.bits.frac2 = X##_f[2];					\
-    _flo.bits.frac3 = X##_f[3];					\
-    _flo.bits.exp   = X##_e;					\
-    _flo.bits.sign  = X##_s;					\
-    (val) = _flo.flt;				   		\
-  } while (0)
+#define _FP_PACK_RAW_4(fs, val, X)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+      _flo.bits.frac0 = X##_f[0];		\
+      _flo.bits.frac1 = X##_f[1];		\
+      _flo.bits.frac2 = X##_f[2];		\
+      _flo.bits.frac3 = X##_f[3];		\
+      _flo.bits.exp   = X##_e;			\
+      _flo.bits.sign  = X##_s;			\
+      (val) = _flo.flt;				\
+    }						\
+  while (0)
 
-#define _FP_PACK_RAW_4_P(fs, val, X)				\
-  do {								\
-    union _FP_UNION_##fs *_flo =				\
-      (union _FP_UNION_##fs *)(val);				\
-								\
-    _flo->bits.frac0 = X##_f[0];				\
-    _flo->bits.frac1 = X##_f[1];				\
-    _flo->bits.frac2 = X##_f[2];				\
-    _flo->bits.frac3 = X##_f[3];				\
-    _flo->bits.exp   = X##_e;					\
-    _flo->bits.sign  = X##_s;					\
-  } while (0)
+#define _FP_PACK_RAW_4_P(fs, val, X)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      _flo->bits.frac0 = X##_f[0];					\
+      _flo->bits.frac1 = X##_f[1];					\
+      _flo->bits.frac2 = X##_f[2];					\
+      _flo->bits.frac3 = X##_f[3];					\
+      _flo->bits.exp   = X##_e;						\
+      _flo->bits.sign  = X##_s;						\
+    }									\
+  while (0)
 
 /*
  * Multiplication algorithms:
@@ -246,188 +263,216 @@
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
 
-#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit)			    \
-  do {									    \
-    _FP_FRAC_DECL_8(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c);	    \
-    _FP_FRAC_DECL_2(_d); _FP_FRAC_DECL_2(_e); _FP_FRAC_DECL_2(_f);	    \
-									    \
-    doit(_FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0), X##_f[0], Y##_f[0]); \
-    doit(_b_f1, _b_f0, X##_f[0], Y##_f[1]);				    \
-    doit(_c_f1, _c_f0, X##_f[1], Y##_f[0]);				    \
-    doit(_d_f1, _d_f0, X##_f[1], Y##_f[1]);				    \
-    doit(_e_f1, _e_f0, X##_f[0], Y##_f[2]);				    \
-    doit(_f_f1, _f_f0, X##_f[2], Y##_f[0]);				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),	    \
-		    _FP_FRAC_WORD_8(_z,1), 0,_b_f1,_b_f0,		    \
-		    0,0,_FP_FRAC_WORD_8(_z,1));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),	    \
-		    _FP_FRAC_WORD_8(_z,1), 0,_c_f1,_c_f0,		    \
-		    _FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2),	    \
-		    _FP_FRAC_WORD_8(_z,1));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),	    \
-		    _FP_FRAC_WORD_8(_z,2), 0,_d_f1,_d_f0,		    \
-		    0,_FP_FRAC_WORD_8(_z,3),_FP_FRAC_WORD_8(_z,2));	    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),	    \
-		    _FP_FRAC_WORD_8(_z,2), 0,_e_f1,_e_f0,		    \
-		    _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),	    \
-		    _FP_FRAC_WORD_8(_z,2));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),	    \
-		    _FP_FRAC_WORD_8(_z,2), 0,_f_f1,_f_f0,		    \
-		    _FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3),	    \
-		    _FP_FRAC_WORD_8(_z,2));				    \
-    doit(_b_f1, _b_f0, X##_f[0], Y##_f[3]);				    \
-    doit(_c_f1, _c_f0, X##_f[3], Y##_f[0]);				    \
-    doit(_d_f1, _d_f0, X##_f[1], Y##_f[2]);				    \
-    doit(_e_f1, _e_f0, X##_f[2], Y##_f[1]);				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3), 0,_b_f1,_b_f0,		    \
-		    0,_FP_FRAC_WORD_8(_z,4),_FP_FRAC_WORD_8(_z,3));	    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3), 0,_c_f1,_c_f0,		    \
-		    _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3), 0,_d_f1,_d_f0,		    \
-		    _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3), 0,_e_f1,_e_f0,		    \
-		    _FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4),	    \
-		    _FP_FRAC_WORD_8(_z,3));				    \
-    doit(_b_f1, _b_f0, X##_f[2], Y##_f[2]);				    \
-    doit(_c_f1, _c_f0, X##_f[1], Y##_f[3]);				    \
-    doit(_d_f1, _d_f0, X##_f[3], Y##_f[1]);				    \
-    doit(_e_f1, _e_f0, X##_f[2], Y##_f[3]);				    \
-    doit(_f_f1, _f_f0, X##_f[3], Y##_f[2]);				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),	    \
-		    _FP_FRAC_WORD_8(_z,4), 0,_b_f1,_b_f0,		    \
-		    0,_FP_FRAC_WORD_8(_z,5),_FP_FRAC_WORD_8(_z,4));	    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),	    \
-		    _FP_FRAC_WORD_8(_z,4), 0,_c_f1,_c_f0,		    \
-		    _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),	    \
-		    _FP_FRAC_WORD_8(_z,4));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),	    \
-		    _FP_FRAC_WORD_8(_z,4), 0,_d_f1,_d_f0,		    \
-		    _FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5),	    \
-		    _FP_FRAC_WORD_8(_z,4));				    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),	    \
-		    _FP_FRAC_WORD_8(_z,5), 0,_e_f1,_e_f0,		    \
-		    0,_FP_FRAC_WORD_8(_z,6),_FP_FRAC_WORD_8(_z,5));	    \
-    __FP_FRAC_ADD_3(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),	    \
-		    _FP_FRAC_WORD_8(_z,5), 0,_f_f1,_f_f0,		    \
-		    _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),	    \
-		    _FP_FRAC_WORD_8(_z,5));				    \
-    doit(_b_f1, _b_f0, X##_f[3], Y##_f[3]);				    \
-    __FP_FRAC_ADD_2(_FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6),	    \
-		    _b_f1,_b_f0,					    \
-		    _FP_FRAC_WORD_8(_z,7),_FP_FRAC_WORD_8(_z,6));	    \
-									    \
-    /* Normalize since we know where the msb of the multiplicands	    \
-       were (bit B), we know that the msb of the of the product is	    \
-       at either 2B or 2B-1.  */					    \
-    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);			    \
-    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),	    \
-		    _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));	    \
-  } while (0)
+#define _FP_MUL_MEAT_DW_4_wide(wfracbits, R, X, Y, doit)		\
+  do									\
+    {									\
+      _FP_FRAC_DECL_2 (_b);						\
+      _FP_FRAC_DECL_2 (_c);						\
+      _FP_FRAC_DECL_2 (_d);						\
+      _FP_FRAC_DECL_2 (_e);						\
+      _FP_FRAC_DECL_2 (_f);						\
+									\
+      doit (_FP_FRAC_WORD_8 (R, 1), _FP_FRAC_WORD_8 (R, 0), X##_f[0], Y##_f[0]); \
+      doit (_b_f1, _b_f0, X##_f[0], Y##_f[1]);				\
+      doit (_c_f1, _c_f0, X##_f[1], Y##_f[0]);				\
+      doit (_d_f1, _d_f0, X##_f[1], Y##_f[1]);				\
+      doit (_e_f1, _e_f0, X##_f[0], Y##_f[2]);				\
+      doit (_f_f1, _f_f0, X##_f[2], Y##_f[0]);				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
+		       _FP_FRAC_WORD_8 (R, 1), 0, _b_f1, _b_f0,		\
+		       0, 0, _FP_FRAC_WORD_8 (R, 1));			\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
+		       _FP_FRAC_WORD_8 (R, 1), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2),	\
+		       _FP_FRAC_WORD_8 (R, 1));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
+		       _FP_FRAC_WORD_8 (R, 2), 0, _d_f1, _d_f0,		\
+		       0, _FP_FRAC_WORD_8 (R, 3), _FP_FRAC_WORD_8 (R, 2)); \
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
+		       _FP_FRAC_WORD_8 (R, 2), 0, _e_f1, _e_f0,		\
+		       _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
+		       _FP_FRAC_WORD_8 (R, 2));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
+		       _FP_FRAC_WORD_8 (R, 2), 0, _f_f1, _f_f0,		\
+		       _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3),	\
+		       _FP_FRAC_WORD_8 (R, 2));				\
+      doit (_b_f1, _b_f0, X##_f[0], Y##_f[3]);				\
+      doit (_c_f1, _c_f0, X##_f[3], Y##_f[0]);				\
+      doit (_d_f1, _d_f0, X##_f[1], Y##_f[2]);				\
+      doit (_e_f1, _e_f0, X##_f[2], Y##_f[1]);				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3), 0, _b_f1, _b_f0,		\
+		       0, _FP_FRAC_WORD_8 (R, 4), _FP_FRAC_WORD_8 (R, 3)); \
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3), 0, _d_f1, _d_f0,		\
+		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3), 0, _e_f1, _e_f0,		\
+		       _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4),	\
+		       _FP_FRAC_WORD_8 (R, 3));				\
+      doit (_b_f1, _b_f0, X##_f[2], Y##_f[2]);				\
+      doit (_c_f1, _c_f0, X##_f[1], Y##_f[3]);				\
+      doit (_d_f1, _d_f0, X##_f[3], Y##_f[1]);				\
+      doit (_e_f1, _e_f0, X##_f[2], Y##_f[3]);				\
+      doit (_f_f1, _f_f0, X##_f[3], Y##_f[2]);				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
+		       _FP_FRAC_WORD_8 (R, 4), 0, _b_f1, _b_f0,		\
+		       0, _FP_FRAC_WORD_8 (R, 5), _FP_FRAC_WORD_8 (R, 4)); \
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
+		       _FP_FRAC_WORD_8 (R, 4), 0, _c_f1, _c_f0,		\
+		       _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
+		       _FP_FRAC_WORD_8 (R, 4));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
+		       _FP_FRAC_WORD_8 (R, 4), 0, _d_f1, _d_f0,		\
+		       _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5),	\
+		       _FP_FRAC_WORD_8 (R, 4));				\
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
+		       _FP_FRAC_WORD_8 (R, 5), 0, _e_f1, _e_f0,		\
+		       0, _FP_FRAC_WORD_8 (R, 6), _FP_FRAC_WORD_8 (R, 5)); \
+      __FP_FRAC_ADD_3 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
+		       _FP_FRAC_WORD_8 (R, 5), 0, _f_f1, _f_f0,		\
+		       _FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
+		       _FP_FRAC_WORD_8 (R, 5));				\
+      doit (_b_f1, _b_f0, X##_f[3], Y##_f[3]);				\
+      __FP_FRAC_ADD_2 (_FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6),	\
+		       _b_f1, _b_f0,					\
+		       _FP_FRAC_WORD_8 (R, 7), _FP_FRAC_WORD_8 (R, 6));	\
+    }									\
+  while (0)
 
-#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y)				    \
-  do {									    \
-    _FP_FRAC_DECL_8(_z);						    \
-									    \
-    mpn_mul_n(_z_f, _x_f, _y_f, 4);					    \
-									    \
-    /* Normalize since we know where the msb of the multiplicands	    \
-       were (bit B), we know that the msb of the of the product is	    \
-       at either 2B or 2B-1.  */					    \
-    _FP_FRAC_SRS_8(_z, wfracbits-1, 2*wfracbits);	 		    \
-    __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2),	    \
-		    _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0));	    \
-  } while (0)
+#define _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit)			\
+  do									\
+    {									\
+      _FP_FRAC_DECL_8 (_z);						\
+									\
+      _FP_MUL_MEAT_DW_4_wide (wfracbits, _z, X, Y, doit);		\
+									\
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_8 (_z, wfracbits-1, 2*wfracbits);			\
+      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_z, 3), _FP_FRAC_WORD_8 (_z, 2), \
+		       _FP_FRAC_WORD_8 (_z, 1), _FP_FRAC_WORD_8 (_z, 0)); \
+    }									\
+  while (0)
 
+#define _FP_MUL_MEAT_DW_4_gmp(wfracbits, R, X, Y)	\
+  do							\
+    {							\
+      mpn_mul_n (R##_f, _x_f, _y_f, 4);			\
+    }							\
+  while (0)
+
+#define _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y)				\
+  do									\
+    {									\
+      _FP_FRAC_DECL_8 (_z);						\
+									\
+      _FP_MUL_MEAT_DW_4_gmp (wfracbits, _z, X, Y);			\
+									\
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_8 (_z, wfracbits-1, 2*wfracbits);			\
+      __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_z, 3), _FP_FRAC_WORD_8 (_z, 2), \
+		       _FP_FRAC_WORD_8 (_z, 1), _FP_FRAC_WORD_8 (_z, 0)); \
+    }									\
+  while (0)
+
 /*
  * Helper utility for _FP_DIV_MEAT_4_udiv:
  * pppp = m * nnn
  */
-#define umul_ppppmnnn(p3,p2,p1,p0,m,n2,n1,n0)				    \
-  do {									    \
-    UWtype _t;								    \
-    umul_ppmm(p1,p0,m,n0);						    \
-    umul_ppmm(p2,_t,m,n1);						    \
-    __FP_FRAC_ADDI_2(p2,p1,_t);						    \
-    umul_ppmm(p3,_t,m,n2);						    \
-    __FP_FRAC_ADDI_2(p3,p2,_t);						    \
-  } while (0)
+#define umul_ppppmnnn(p3, p2, p1, p0, m, n2, n1, n0)	\
+  do							\
+    {							\
+      UWtype _t;					\
+      umul_ppmm (p1, p0, m, n0);			\
+      umul_ppmm (p2, _t, m, n1);			\
+      __FP_FRAC_ADDI_2 (p2, p1, _t);			\
+      umul_ppmm (p3, _t, m, n2);			\
+      __FP_FRAC_ADDI_2 (p3, p2, _t);			\
+    }							\
+  while (0)
 
 /*
  * Division algorithms:
  */
 
-#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y)				    \
-  do {									    \
-    int _i;								    \
-    _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m);				    \
-    _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4);					    \
-    if (_FP_FRAC_GT_4(X, Y))						    \
-      {									    \
-	_n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);			    \
-	_FP_FRAC_SRL_4(X, 1);						    \
-      }									    \
-    else								    \
-      R##_e--;								    \
-									    \
-    /* Normalize, i.e. make the most significant bit of the 		    \
-       denominator set. */						    \
-    _FP_FRAC_SLL_4(Y, _FP_WFRACXBITS_##fs);				    \
-									    \
-    for (_i = 3; ; _i--)						    \
-      {									    \
-        if (X##_f[3] == Y##_f[3])					    \
-          {								    \
-            /* This is a special case, not an optimization		    \
-               (X##_f[3]/Y##_f[3] would not fit into UWtype).		    \
-               As X## is guaranteed to be < Y,  R##_f[_i] can be either	    \
-               (UWtype)-1 or (UWtype)-2.  */				    \
-            R##_f[_i] = -1;						    \
-            if (!_i)							    \
-	      break;							    \
-            __FP_FRAC_SUB_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0],	    \
-			    Y##_f[2], Y##_f[1], Y##_f[0], 0,		    \
-			    X##_f[2], X##_f[1], X##_f[0], _n_f[_i]);	    \
-            _FP_FRAC_SUB_4(X, Y, X);					    \
-            if (X##_f[3] > Y##_f[3])					    \
-              {								    \
-                R##_f[_i] = -2;						    \
-                _FP_FRAC_ADD_4(X, Y, X);				    \
-              }								    \
-          }								    \
-        else								    \
-          {								    \
-            udiv_qrnnd(R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]);  \
-            umul_ppppmnnn(_m_f[3], _m_f[2], _m_f[1], _m_f[0],		    \
-			  R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]);	    \
-            X##_f[2] = X##_f[1];					    \
-            X##_f[1] = X##_f[0];					    \
-            X##_f[0] = _n_f[_i];					    \
-            if (_FP_FRAC_GT_4(_m, X))					    \
-              {								    \
-                R##_f[_i]--;						    \
-                _FP_FRAC_ADD_4(X, Y, X);				    \
-                if (_FP_FRAC_GE_4(X, Y) && _FP_FRAC_GT_4(_m, X))	    \
-                  {							    \
-		    R##_f[_i]--;					    \
-		    _FP_FRAC_ADD_4(X, Y, X);				    \
-                  }							    \
-              }								    \
-            _FP_FRAC_DEC_4(X, _m);					    \
-            if (!_i)							    \
-	      {								    \
-		if (!_FP_FRAC_EQ_4(X, _m))				    \
-		  R##_f[0] |= _FP_WORK_STICKY;				    \
-		break;							    \
-	      }								    \
-          }								    \
-      }									    \
-  } while (0)
+#define _FP_DIV_MEAT_4_udiv(fs, R, X, Y)				\
+  do									\
+    {									\
+      int _i;								\
+      _FP_FRAC_DECL_4 (_n);						\
+      _FP_FRAC_DECL_4 (_m);						\
+      _FP_FRAC_SET_4 (_n, _FP_ZEROFRAC_4);				\
+      if (_FP_FRAC_GE_4 (X, Y))						\
+	{								\
+	  _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);			\
+	  _FP_FRAC_SRL_4 (X, 1);					\
+	}								\
+      else								\
+	R##_e--;							\
+									\
+      /* Normalize, i.e. make the most significant bit of the		\
+	 denominator set. */						\
+      _FP_FRAC_SLL_4 (Y, _FP_WFRACXBITS_##fs);				\
+									\
+      for (_i = 3; ; _i--)						\
+	{								\
+	  if (X##_f[3] == Y##_f[3])					\
+	    {								\
+	      /* This is a special case, not an optimization		\
+		 (X##_f[3]/Y##_f[3] would not fit into UWtype).		\
+		 As X## is guaranteed to be < Y,  R##_f[_i] can be either \
+		 (UWtype)-1 or (UWtype)-2.  */				\
+	      R##_f[_i] = -1;						\
+	      if (!_i)							\
+		break;							\
+	      __FP_FRAC_SUB_4 (X##_f[3], X##_f[2], X##_f[1], X##_f[0],	\
+			       Y##_f[2], Y##_f[1], Y##_f[0], 0,		\
+			       X##_f[2], X##_f[1], X##_f[0], _n_f[_i]);	\
+	      _FP_FRAC_SUB_4 (X, Y, X);					\
+	      if (X##_f[3] > Y##_f[3])					\
+		{							\
+		  R##_f[_i] = -2;					\
+		  _FP_FRAC_ADD_4 (X, Y, X);				\
+		}							\
+	    }								\
+	  else								\
+	    {								\
+	      udiv_qrnnd (R##_f[_i], X##_f[3], X##_f[3], X##_f[2], Y##_f[3]); \
+	      umul_ppppmnnn (_m_f[3], _m_f[2], _m_f[1], _m_f[0],	\
+			     R##_f[_i], Y##_f[2], Y##_f[1], Y##_f[0]);	\
+	      X##_f[2] = X##_f[1];					\
+	      X##_f[1] = X##_f[0];					\
+	      X##_f[0] = _n_f[_i];					\
+	      if (_FP_FRAC_GT_4 (_m, X))				\
+		{							\
+		  R##_f[_i]--;						\
+		  _FP_FRAC_ADD_4 (X, Y, X);				\
+		  if (_FP_FRAC_GE_4 (X, Y) && _FP_FRAC_GT_4 (_m, X))	\
+		    {							\
+		      R##_f[_i]--;					\
+		      _FP_FRAC_ADD_4 (X, Y, X);				\
+		    }							\
+		}							\
+	      _FP_FRAC_DEC_4 (X, _m);					\
+	      if (!_i)							\
+		{							\
+		  if (!_FP_FRAC_EQ_4 (X, _m))				\
+		    R##_f[0] |= _FP_WORK_STICKY;			\
+		  break;						\
+		}							\
+	    }								\
+	}								\
+    }									\
+  while (0)
 
 
 /*
@@ -436,183 +481,203 @@
  * should be added for those machines where division is fast.
  */
 
-#define _FP_SQRT_MEAT_4(R, S, T, X, q)				\
-  do {								\
-    while (q)							\
-      {								\
-	T##_f[3] = S##_f[3] + q;				\
-	if (T##_f[3] <= X##_f[3])				\
-	  {							\
-	    S##_f[3] = T##_f[3] + q;				\
-	    X##_f[3] -= T##_f[3];				\
-	    R##_f[3] += q;					\
-	  }							\
-	_FP_FRAC_SLL_4(X, 1);					\
-	q >>= 1;						\
-      }								\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);			\
-    while (q)							\
-      {								\
-	T##_f[2] = S##_f[2] + q;				\
-	T##_f[3] = S##_f[3];					\
-	if (T##_f[3] < X##_f[3] || 				\
-	    (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))	\
-	  {							\
-	    S##_f[2] = T##_f[2] + q;				\
-	    S##_f[3] += (T##_f[2] > S##_f[2]);			\
-	    __FP_FRAC_DEC_2(X##_f[3], X##_f[2],			\
-			    T##_f[3], T##_f[2]);		\
-	    R##_f[2] += q;					\
-	  }							\
-	_FP_FRAC_SLL_4(X, 1);					\
-	q >>= 1;						\
-      }								\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);			\
-    while (q)							\
-      {								\
-	T##_f[1] = S##_f[1] + q;				\
-	T##_f[2] = S##_f[2];					\
-	T##_f[3] = S##_f[3];					\
-	if (T##_f[3] < X##_f[3] || 				\
-	    (T##_f[3] == X##_f[3] && (T##_f[2] < X##_f[2] ||	\
-	     (T##_f[2] == X##_f[2] && T##_f[1] <= X##_f[1]))))	\
-	  {							\
-	    S##_f[1] = T##_f[1] + q;				\
-	    S##_f[2] += (T##_f[1] > S##_f[1]);			\
-	    S##_f[3] += (T##_f[2] > S##_f[2]);			\
-	    __FP_FRAC_DEC_3(X##_f[3], X##_f[2], X##_f[1],	\
-			    T##_f[3], T##_f[2], T##_f[1]);	\
-	    R##_f[1] += q;					\
-	  }							\
-	_FP_FRAC_SLL_4(X, 1);					\
-	q >>= 1;						\
-      }								\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);			\
-    while (q != _FP_WORK_ROUND)					\
-      {								\
-	T##_f[0] = S##_f[0] + q;				\
-	T##_f[1] = S##_f[1];					\
-	T##_f[2] = S##_f[2];					\
-	T##_f[3] = S##_f[3];					\
-	if (_FP_FRAC_GE_4(X,T))					\
-	  {							\
-	    S##_f[0] = T##_f[0] + q;				\
-	    S##_f[1] += (T##_f[0] > S##_f[0]);			\
-	    S##_f[2] += (T##_f[1] > S##_f[1]);			\
-	    S##_f[3] += (T##_f[2] > S##_f[2]);			\
-	    _FP_FRAC_DEC_4(X, T);				\
-	    R##_f[0] += q;					\
-	  }							\
-	_FP_FRAC_SLL_4(X, 1);					\
-	q >>= 1;						\
-      }								\
-    if (!_FP_FRAC_ZEROP_4(X))					\
-      {								\
-	if (_FP_FRAC_GT_4(X,S))					\
-	  R##_f[0] |= _FP_WORK_ROUND;				\
-	R##_f[0] |= _FP_WORK_STICKY;				\
-      }								\
-  } while (0)
+#define _FP_SQRT_MEAT_4(R, S, T, X, q)					\
+  do									\
+    {									\
+      while (q)								\
+	{								\
+	  T##_f[3] = S##_f[3] + q;					\
+	  if (T##_f[3] <= X##_f[3])					\
+	    {								\
+	      S##_f[3] = T##_f[3] + q;					\
+	      X##_f[3] -= T##_f[3];					\
+	      R##_f[3] += q;						\
+	    }								\
+	  _FP_FRAC_SLL_4 (X, 1);					\
+	  q >>= 1;							\
+	}								\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      while (q)								\
+	{								\
+	  T##_f[2] = S##_f[2] + q;					\
+	  T##_f[3] = S##_f[3];						\
+	  if (T##_f[3] < X##_f[3]					\
+	      || (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))	\
+	    {								\
+	      S##_f[2] = T##_f[2] + q;					\
+	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
+	      __FP_FRAC_DEC_2 (X##_f[3], X##_f[2],			\
+			       T##_f[3], T##_f[2]);			\
+	      R##_f[2] += q;						\
+	    }								\
+	  _FP_FRAC_SLL_4 (X, 1);					\
+	  q >>= 1;							\
+	}								\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      while (q)								\
+	{								\
+	  T##_f[1] = S##_f[1] + q;					\
+	  T##_f[2] = S##_f[2];						\
+	  T##_f[3] = S##_f[3];						\
+	  if (T##_f[3] < X##_f[3]					\
+	      || (T##_f[3] == X##_f[3]					\
+		  && (T##_f[2] < X##_f[2]				\
+		      || (T##_f[2] == X##_f[2]				\
+			  && T##_f[1] <= X##_f[1]))))			\
+	    {								\
+	      S##_f[1] = T##_f[1] + q;					\
+	      S##_f[2] += (T##_f[1] > S##_f[1]);			\
+	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
+	      __FP_FRAC_DEC_3 (X##_f[3], X##_f[2], X##_f[1],		\
+			       T##_f[3], T##_f[2], T##_f[1]);		\
+	      R##_f[1] += q;						\
+	    }								\
+	  _FP_FRAC_SLL_4 (X, 1);					\
+	  q >>= 1;							\
+	}								\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);			\
+      while (q != _FP_WORK_ROUND)					\
+	{								\
+	  T##_f[0] = S##_f[0] + q;					\
+	  T##_f[1] = S##_f[1];						\
+	  T##_f[2] = S##_f[2];						\
+	  T##_f[3] = S##_f[3];						\
+	  if (_FP_FRAC_GE_4 (X, T))					\
+	    {								\
+	      S##_f[0] = T##_f[0] + q;					\
+	      S##_f[1] += (T##_f[0] > S##_f[0]);			\
+	      S##_f[2] += (T##_f[1] > S##_f[1]);			\
+	      S##_f[3] += (T##_f[2] > S##_f[2]);			\
+	      _FP_FRAC_DEC_4 (X, T);					\
+	      R##_f[0] += q;						\
+	    }								\
+	  _FP_FRAC_SLL_4 (X, 1);					\
+	  q >>= 1;							\
+	}								\
+      if (!_FP_FRAC_ZEROP_4 (X))					\
+	{								\
+	  if (_FP_FRAC_GT_4 (X, S))					\
+	    R##_f[0] |= _FP_WORK_ROUND;					\
+	  R##_f[0] |= _FP_WORK_STICKY;					\
+	}								\
+    }									\
+  while (0)
 
 
 /*
  * Internals
  */
 
-#define __FP_FRAC_SET_4(X,I3,I2,I1,I0)					\
+#define __FP_FRAC_SET_4(X, I3, I2, I1, I0)			\
   (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
 
 #ifndef __FP_FRAC_ADD_3
-#define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)		\
-  do {								\
-    _FP_W_TYPE _c1, _c2;					\
-    r0 = x0 + y0;						\
-    _c1 = r0 < x0;						\
-    r1 = x1 + y1;						\
-    _c2 = r1 < x1;						\
-    r1 += _c1;							\
-    _c2 |= r1 < _c1;						\
-    r2 = x2 + y2 + _c2;						\
-  } while (0)
+# define __FP_FRAC_ADD_3(r2, r1, r0, x2, x1, x0, y2, y1, y0)	\
+  do								\
+    {								\
+      _FP_W_TYPE __FP_FRAC_ADD_3_c1, __FP_FRAC_ADD_3_c2;	\
+      r0 = x0 + y0;						\
+      __FP_FRAC_ADD_3_c1 = r0 < x0;				\
+      r1 = x1 + y1;						\
+      __FP_FRAC_ADD_3_c2 = r1 < x1;				\
+      r1 += __FP_FRAC_ADD_3_c1;					\
+      __FP_FRAC_ADD_3_c2 |= r1 < __FP_FRAC_ADD_3_c1;		\
+      r2 = x2 + y2 + __FP_FRAC_ADD_3_c2;			\
+    }								\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_ADD_4
-#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)	\
-  do {								\
-    _FP_W_TYPE _c1, _c2, _c3;					\
-    r0 = x0 + y0;						\
-    _c1 = r0 < x0;						\
-    r1 = x1 + y1;						\
-    _c2 = r1 < x1;						\
-    r1 += _c1;							\
-    _c2 |= r1 < _c1;						\
-    r2 = x2 + y2;						\
-    _c3 = r2 < x2;						\
-    r2 += _c2;							\
-    _c3 |= r2 < _c2;						\
-    r3 = x3 + y3 + _c3;						\
-  } while (0)
+# define __FP_FRAC_ADD_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) \
+  do									\
+    {									\
+      _FP_W_TYPE _c1, _c2, _c3;						\
+      r0 = x0 + y0;							\
+      _c1 = r0 < x0;							\
+      r1 = x1 + y1;							\
+      _c2 = r1 < x1;							\
+      r1 += _c1;							\
+      _c2 |= r1 < _c1;							\
+      r2 = x2 + y2;							\
+      _c3 = r2 < x2;							\
+      r2 += _c2;							\
+      _c3 |= r2 < _c2;							\
+      r3 = x3 + y3 + _c3;						\
+    }									\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_SUB_3
-#define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0)		\
-  do {								\
-    _FP_W_TYPE _c1, _c2;					\
-    r0 = x0 - y0;						\
-    _c1 = r0 > x0;						\
-    r1 = x1 - y1;						\
-    _c2 = r1 > x1;						\
-    r1 -= _c1;							\
-    _c2 |= _c1 && (y1 == x1);					\
-    r2 = x2 - y2 - _c2;						\
-  } while (0)
+# define __FP_FRAC_SUB_3(r2, r1, r0, x2, x1, x0, y2, y1, y0)	\
+  do								\
+    {								\
+      _FP_W_TYPE _c1, _c2;					\
+      r0 = x0 - y0;						\
+      _c1 = r0 > x0;						\
+      r1 = x1 - y1;						\
+      _c2 = r1 > x1;						\
+      r1 -= _c1;						\
+      _c2 |= _c1 && (y1 == x1);					\
+      r2 = x2 - y2 - _c2;					\
+    }								\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_SUB_4
-#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0)	\
-  do {								\
-    _FP_W_TYPE _c1, _c2, _c3;					\
-    r0 = x0 - y0;						\
-    _c1 = r0 > x0;						\
-    r1 = x1 - y1;						\
-    _c2 = r1 > x1;						\
-    r1 -= _c1;							\
-    _c2 |= _c1 && (y1 == x1);					\
-    r2 = x2 - y2;						\
-    _c3 = r2 > x2;						\
-    r2 -= _c2;							\
-    _c3 |= _c2 && (y2 == x2);					\
-    r3 = x3 - y3 - _c3;						\
-  } while (0)
+# define __FP_FRAC_SUB_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) \
+  do									\
+    {									\
+      _FP_W_TYPE _c1, _c2, _c3;						\
+      r0 = x0 - y0;							\
+      _c1 = r0 > x0;							\
+      r1 = x1 - y1;							\
+      _c2 = r1 > x1;							\
+      r1 -= _c1;							\
+      _c2 |= _c1 && (y1 == x1);						\
+      r2 = x2 - y2;							\
+      _c3 = r2 > x2;							\
+      r2 -= _c2;							\
+      _c3 |= _c2 && (y2 == x2);						\
+      r3 = x3 - y3 - _c3;						\
+    }									\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_DEC_3
-#define __FP_FRAC_DEC_3(x2,x1,x0,y2,y1,y0)				\
-  do {									\
-    UWtype _t0, _t1, _t2;						\
-    _t0 = x0, _t1 = x1, _t2 = x2;					\
-    __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0);		\
-  } while (0)
+# define __FP_FRAC_DEC_3(x2, x1, x0, y2, y1, y0)		\
+  do								\
+    {								\
+      UWtype _t0, _t1, _t2;					\
+      _t0 = x0, _t1 = x1, _t2 = x2;				\
+      __FP_FRAC_SUB_3 (x2, x1, x0, _t2, _t1, _t0, y2, y1, y0);	\
+    }								\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_DEC_4
-#define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0)			\
-  do {									\
-    UWtype _t0, _t1, _t2, _t3;						\
-    _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3;				\
-    __FP_FRAC_SUB_4 (x3,x2,x1,x0,_t3,_t2,_t1,_t0, y3,y2,y1,y0);		\
-  } while (0)
+# define __FP_FRAC_DEC_4(x3, x2, x1, x0, y3, y2, y1, y0)		\
+  do									\
+    {									\
+      UWtype _t0, _t1, _t2, _t3;					\
+      _t0 = x0, _t1 = x1, _t2 = x2, _t3 = x3;				\
+      __FP_FRAC_SUB_4 (x3, x2, x1, x0, _t3, _t2, _t1, _t0, y3, y2, y1, y0); \
+    }									\
+  while (0)
 #endif
 
 #ifndef __FP_FRAC_ADDI_4
-#define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i)					\
-  do {									\
-    UWtype _t;								\
-    _t = ((x0 += i) < i);						\
-    x1 += _t; _t = (x1 < _t);						\
-    x2 += _t; _t = (x2 < _t);						\
-    x3 += _t;								\
-  } while (0)
+# define __FP_FRAC_ADDI_4(x3, x2, x1, x0, i)	\
+  do						\
+    {						\
+      UWtype _t;				\
+      _t = ((x0 += i) < i);			\
+      x1 += _t;					\
+      _t = (x1 < _t);				\
+      x2 += _t;					\
+      _t = (x2 < _t);				\
+      x3 += _t;					\
+    }						\
+  while (0)
 #endif
 
 /* Convert FP values between word sizes. This appears to be more
@@ -625,38 +690,42 @@
 #define _FP_FRAC_COPY_1_4(D, S)		(D##_f = S##_f[0])
 
 #define _FP_FRAC_COPY_2_4(D, S)			\
-do {						\
-  D##_f0 = S##_f[0];				\
-  D##_f1 = S##_f[1];				\
-} while (0)
+  do						\
+    {						\
+      D##_f0 = S##_f[0];			\
+      D##_f1 = S##_f[1];			\
+    }						\
+  while (0)
 
 /* Assembly/disassembly for converting to/from integral types.
  * No shifting or overflow handled here.
  */
 /* Put the FP value X into r, which is an integer of size rsize. */
 #define _FP_FRAC_ASSEMBLE_4(r, X, rsize)				\
-  do {									\
-    if (rsize <= _FP_W_TYPE_SIZE)					\
-      r = X##_f[0];							\
-    else if (rsize <= 2*_FP_W_TYPE_SIZE)				\
+  do									\
     {									\
-      r = X##_f[1];							\
-      r <<= _FP_W_TYPE_SIZE;						\
-      r += X##_f[0];							\
+      if (rsize <= _FP_W_TYPE_SIZE)					\
+	r = X##_f[0];							\
+      else if (rsize <= 2*_FP_W_TYPE_SIZE)				\
+	{								\
+	  r = X##_f[1];							\
+	  r <<= _FP_W_TYPE_SIZE;					\
+	  r += X##_f[0];						\
+	}								\
+      else								\
+	{								\
+	  /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \
+	  /* and int == 4words as a single case.			 */ \
+	  r = X##_f[3];							\
+	  r <<= _FP_W_TYPE_SIZE;					\
+	  r += X##_f[2];						\
+	  r <<= _FP_W_TYPE_SIZE;					\
+	  r += X##_f[1];						\
+	  r <<= _FP_W_TYPE_SIZE;					\
+	  r += X##_f[0];						\
+	}								\
     }									\
-    else								\
-    {									\
-      /* I'm feeling lazy so we deal with int == 3words (implausible)*/	\
-      /* and int == 4words as a single case.			 */	\
-      r = X##_f[3];							\
-      r <<= _FP_W_TYPE_SIZE;						\
-      r += X##_f[2];							\
-      r <<= _FP_W_TYPE_SIZE;						\
-      r += X##_f[1];							\
-      r <<= _FP_W_TYPE_SIZE;						\
-      r += X##_f[0];							\
-    }									\
-  } while (0)
+  while (0)
 
 /* "No disassemble Number Five!" */
 /* move an integer of size rsize into X's fractional part. We rely on
@@ -664,24 +733,30 @@
  * having to mask the values we store into it.
  */
 #define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)				\
-  do {									\
-    X##_f[0] = r;							\
-    X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
-    X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
-    X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
-  } while (0);
+  do									\
+    {									\
+      X##_f[0] = r;							\
+      X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);	\
+      X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
+      X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
+    }									\
+  while (0)
 
 #define _FP_FRAC_COPY_4_1(D, S)			\
-do {						\
-  D##_f[0] = S##_f;				\
-  D##_f[1] = D##_f[2] = D##_f[3] = 0;		\
-} while (0)
+  do						\
+    {						\
+      D##_f[0] = S##_f;				\
+      D##_f[1] = D##_f[2] = D##_f[3] = 0;	\
+    }						\
+  while (0)
 
 #define _FP_FRAC_COPY_4_2(D, S)			\
-do {						\
-  D##_f[0] = S##_f0;				\
-  D##_f[1] = S##_f1;				\
-  D##_f[2] = D##_f[3] = 0;			\
-} while (0)
+  do						\
+    {						\
+      D##_f[0] = S##_f0;			\
+      D##_f[1] = S##_f1;			\
+      D##_f[2] = D##_f[3] = 0;			\
+    }						\
+  while (0)
 
-#define _FP_FRAC_COPY_4_4(D,S)	_FP_FRAC_COPY_4(D,S)
+#define _FP_FRAC_COPY_4_4(D, S)	_FP_FRAC_COPY_4 (D, S)
Index: libgcc/soft-fp/op-8.h
===================================================================
--- libgcc/soft-fp/op-8.h	(revision 204460)
+++ libgcc/soft-fp/op-8.h	(working copy)
@@ -34,47 +34,51 @@
 #define _FP_FRAC_DECL_8(X)	_FP_W_TYPE X##_f[8]
 #define _FP_FRAC_HIGH_8(X)	(X##_f[7])
 #define _FP_FRAC_LOW_8(X)	(X##_f[0])
-#define _FP_FRAC_WORD_8(X,w)	(X##_f[w])
+#define _FP_FRAC_WORD_8(X, w)	(X##_f[w])
 
-#define _FP_FRAC_SLL_8(X,N)						\
-  do {									\
-    _FP_I_TYPE _up, _down, _skip, _i;					\
-    _skip = (N) / _FP_W_TYPE_SIZE;					\
-    _up = (N) % _FP_W_TYPE_SIZE;					\
-    _down = _FP_W_TYPE_SIZE - _up;					\
-    if (!_up)								\
-      for (_i = 7; _i >= _skip; --_i)					\
-	X##_f[_i] = X##_f[_i-_skip];					\
-    else								\
-      {									\
-	for (_i = 7; _i > _skip; --_i)					\
-	  X##_f[_i] = X##_f[_i-_skip] << _up				\
-		      | X##_f[_i-_skip-1] >> _down;			\
-	X##_f[_i--] = X##_f[0] << _up; 					\
-      }									\
-    for (; _i >= 0; --_i)						\
-      X##_f[_i] = 0;							\
-  } while (0)
+#define _FP_FRAC_SLL_8(X, N)				\
+  do							\
+    {							\
+      _FP_I_TYPE _up, _down, _skip, _i;			\
+      _skip = (N) / _FP_W_TYPE_SIZE;			\
+      _up = (N) % _FP_W_TYPE_SIZE;			\
+      _down = _FP_W_TYPE_SIZE - _up;			\
+      if (!_up)						\
+	for (_i = 7; _i >= _skip; --_i)			\
+	  X##_f[_i] = X##_f[_i-_skip];			\
+      else						\
+	{						\
+	  for (_i = 7; _i > _skip; --_i)		\
+	    X##_f[_i] = (X##_f[_i-_skip] << _up		\
+			 | X##_f[_i-_skip-1] >> _down);	\
+	  X##_f[_i--] = X##_f[0] << _up;		\
+	}						\
+      for (; _i >= 0; --_i)				\
+	X##_f[_i] = 0;					\
+    }							\
+  while (0)
 
-#define _FP_FRAC_SRL_8(X,N)						\
-  do {									\
-    _FP_I_TYPE _up, _down, _skip, _i;					\
-    _skip = (N) / _FP_W_TYPE_SIZE;					\
-    _down = (N) % _FP_W_TYPE_SIZE;					\
-    _up = _FP_W_TYPE_SIZE - _down;					\
-    if (!_down)								\
-      for (_i = 0; _i <= 7-_skip; ++_i)					\
-	X##_f[_i] = X##_f[_i+_skip];					\
-    else								\
-      {									\
-	for (_i = 0; _i < 7-_skip; ++_i)				\
-	  X##_f[_i] = X##_f[_i+_skip] >> _down				\
-		      | X##_f[_i+_skip+1] << _up;			\
-	X##_f[_i++] = X##_f[7] >> _down;				\
-      }									\
-    for (; _i < 8; ++_i)						\
-      X##_f[_i] = 0;							\
-  } while (0)
+#define _FP_FRAC_SRL_8(X, N)				\
+  do							\
+    {							\
+      _FP_I_TYPE _up, _down, _skip, _i;			\
+      _skip = (N) / _FP_W_TYPE_SIZE;			\
+      _down = (N) % _FP_W_TYPE_SIZE;			\
+      _up = _FP_W_TYPE_SIZE - _down;			\
+      if (!_down)					\
+	for (_i = 0; _i <= 7-_skip; ++_i)		\
+	  X##_f[_i] = X##_f[_i+_skip];			\
+      else						\
+	{						\
+	  for (_i = 0; _i < 7-_skip; ++_i)		\
+	    X##_f[_i] = (X##_f[_i+_skip] >> _down	\
+			 | X##_f[_i+_skip+1] << _up);	\
+	  X##_f[_i++] = X##_f[7] >> _down;		\
+	}						\
+      for (; _i < 8; ++_i)				\
+	X##_f[_i] = 0;					\
+    }							\
+  while (0)
 
 
 /* Right shift with sticky-lsb.
@@ -82,28 +86,31 @@
  * but that if any of the bits that fall off the right hand side
  * were one then we always set the LSbit.
  */
-#define _FP_FRAC_SRS_8(X,N,size)					\
-  do {									\
-    _FP_I_TYPE _up, _down, _skip, _i;					\
-    _FP_W_TYPE _s;							\
-    _skip = (N) / _FP_W_TYPE_SIZE;					\
-    _down = (N) % _FP_W_TYPE_SIZE;					\
-    _up = _FP_W_TYPE_SIZE - _down;					\
-    for (_s = _i = 0; _i < _skip; ++_i)					\
-      _s |= X##_f[_i];							\
-    if (!_down)								\
-      for (_i = 0; _i <= 7-_skip; ++_i)					\
-	X##_f[_i] = X##_f[_i+_skip];					\
-    else								\
-      {									\
-	_s |= X##_f[_i] << _up;						\
-	for (_i = 0; _i < 7-_skip; ++_i)				\
-	  X##_f[_i] = X##_f[_i+_skip] >> _down				\
-		      | X##_f[_i+_skip+1] << _up;			\
-	X##_f[_i++] = X##_f[7] >> _down;				\
-      }									\
-    for (; _i < 8; ++_i)						\
-      X##_f[_i] = 0;							\
-    /* don't fix the LSB until the very end when we're sure f[0] is stable */	\
-    X##_f[0] |= (_s != 0);						\
-  } while (0)
+#define _FP_FRAC_SRS_8(X, N, size)					\
+  do									\
+    {									\
+      _FP_I_TYPE _up, _down, _skip, _i;					\
+      _FP_W_TYPE _s;							\
+      _skip = (N) / _FP_W_TYPE_SIZE;					\
+      _down = (N) % _FP_W_TYPE_SIZE;					\
+      _up = _FP_W_TYPE_SIZE - _down;					\
+      for (_s = _i = 0; _i < _skip; ++_i)				\
+	_s |= X##_f[_i];						\
+      if (!_down)							\
+	for (_i = 0; _i <= 7-_skip; ++_i)				\
+	  X##_f[_i] = X##_f[_i+_skip];					\
+      else								\
+	{								\
+	  _s |= X##_f[_i] << _up;					\
+	  for (_i = 0; _i < 7-_skip; ++_i)				\
+	    X##_f[_i] = (X##_f[_i+_skip] >> _down			\
+			 | X##_f[_i+_skip+1] << _up);			\
+	  X##_f[_i++] = X##_f[7] >> _down;				\
+	}								\
+      for (; _i < 8; ++_i)						\
+	X##_f[_i] = 0;							\
+      /* don't fix the LSB until the very end when we're sure f[0] is	\
+	 stable */							\
+      X##_f[0] |= (_s != 0);						\
+    }									\
+  while (0)
Index: libgcc/soft-fp/floatsisf.c
===================================================================
--- libgcc/soft-fp/floatsisf.c	(revision 204460)
+++ libgcc/soft-fp/floatsisf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floatsisf(SItype i)
+SFtype
+__floatsisf (SItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/fixsfdi.c
===================================================================
--- libgcc/soft-fp/fixsfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixsfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-DItype __fixsfdi(SFtype a)
+DItype
+__fixsfdi (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   UDItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, DI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/ledf2.c
===================================================================
--- libgcc/soft-fp/ledf2.c	(revision 204460)
+++ libgcc/soft-fp/ledf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "double.h"
 
-CMPtype __ledf2(DFtype a, DFtype b)
+CMPtype
+__ledf2 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_UNPACK_RAW_D (B, b);
+  FP_CMP_D (r, A, B, 2);
+  if (r == 2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__ledf2, __ltdf2);
+strong_alias (__ledf2, __ltdf2);
Index: libgcc/soft-fp/floattitf.c
===================================================================
--- libgcc/soft-fp/floattitf.c	(revision 204460)
+++ libgcc/soft-fp/floattitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __floattitf(TItype i)
+TFtype
+__floattitf (TItype i)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_Q(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_Q (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_Q (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/floatunsisf.c
===================================================================
--- libgcc/soft-fp/floatunsisf.c	(revision 204460)
+++ libgcc/soft-fp/floatunsisf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floatunsisf(USItype i)
+SFtype
+__floatunsisf (USItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/divsf3.c
===================================================================
--- libgcc/soft-fp/divsf3.c	(revision 204460)
+++ libgcc/soft-fp/divsf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __divsf3(SFtype a, SFtype b)
+SFtype
+__divsf3 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
-  FP_UNPACK_S(B, b);
-  FP_DIV_S(R, A, B);
-  FP_PACK_S(r, R);
+  FP_UNPACK_S (A, a);
+  FP_UNPACK_S (B, b);
+  FP_DIV_S (R, A, B);
+  FP_PACK_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatuntitf.c
===================================================================
--- libgcc/soft-fp/floatuntitf.c	(revision 204460)
+++ libgcc/soft-fp/floatuntitf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __floatuntitf(UTItype i)
+TFtype
+__floatuntitf (UTItype i)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   TFtype a;
 
-  FP_FROM_INT_Q(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_Q(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_Q (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_Q (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/divtf3.c
===================================================================
--- libgcc/soft-fp/divtf3.c	(revision 204460)
+++ libgcc/soft-fp/divtf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __divtf3(TFtype a, TFtype b)
+TFtype
+__divtf3 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
+  FP_DECL_Q (R);
   TFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q(A, a);
-  FP_UNPACK_Q(B, b);
-  FP_DIV_Q(R, A, B);
-  FP_PACK_Q(r, R);
+  FP_UNPACK_Q (A, a);
+  FP_UNPACK_Q (B, b);
+  FP_DIV_Q (R, A, B);
+  FP_PACK_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/trunctfsf2.c
===================================================================
--- libgcc/soft-fp/trunctfsf2.c	(revision 204460)
+++ libgcc/soft-fp/trunctfsf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "single.h"
 #include "quad.h"
 
-SFtype __trunctfsf2(TFtype a)
+SFtype
+__trunctfsf2 (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_S(R);
+  FP_DECL_Q (A);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(S,Q,1,4,R,A);
+  FP_TRUNC (S, Q, 1, 4, R, A);
 #else
-  FP_TRUNC(S,Q,1,2,R,A);
+  FP_TRUNC (S, Q, 1, 2, R, A);
 #endif
-  FP_PACK_SEMIRAW_S(r, R);
+  FP_PACK_SEMIRAW_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/negdf2.c
===================================================================
--- libgcc/soft-fp/negdf2.c	(revision 204460)
+++ libgcc/soft-fp/negdf2.c	(working copy)
@@ -31,17 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __negdf2(DFtype a)
+DFtype
+__negdf2 (DFtype a)
 {
-  FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(R);
+  FP_DECL_D (A);
+  FP_DECL_D (R);
   DFtype r;
 
-  FP_UNPACK_D(A, a);
-  FP_NEG_D(R, A);
-  FP_PACK_D(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_NEG_D (R, A);
+  FP_PACK_RAW_D (r, R);
 
   return r;
 }
Index: libgcc/soft-fp/trunctfxf2.c
===================================================================
--- libgcc/soft-fp/trunctfxf2.c	(revision 204460)
+++ libgcc/soft-fp/trunctfxf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Truncate IEEE quad into IEEE extended
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,29 +24,29 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "extended.h"
 #include "quad.h"
 
-XFtype __trunctfxf2(TFtype a)
+XFtype
+__trunctfxf2 (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
-  FP_DECL_E(R);
+  FP_DECL_Q (A);
+  FP_DECL_E (R);
   XFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_TRUNC(E,Q,4,4,R,A);
+  FP_TRUNC (E, Q, 4, 4, R, A);
 #else
-  FP_TRUNC(E,Q,2,2,R,A);
+  FP_TRUNC (E, Q, 2, 2, R, A);
 #endif
-  FP_PACK_SEMIRAW_E(r, R);
+  FP_PACK_SEMIRAW_E (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatdisf.c
===================================================================
--- libgcc/soft-fp/floatdisf.c	(revision 204460)
+++ libgcc/soft-fp/floatdisf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floatdisf(DItype i)
+SFtype
+__floatdisf (DItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/lesf2.c
===================================================================
--- libgcc/soft-fp/lesf2.c	(revision 204460)
+++ libgcc/soft-fp/lesf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "single.h"
 
-CMPtype __lesf2(SFtype a, SFtype b)
+CMPtype
+__lesf2 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_UNPACK_RAW_S (B, b);
+  FP_CMP_S (r, A, B, 2);
+  if (r == 2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__lesf2, __ltsf2);
+strong_alias (__lesf2, __ltsf2);
Index: libgcc/soft-fp/README
===================================================================
--- libgcc/soft-fp/README	(revision 204460)
+++ libgcc/soft-fp/README	(working copy)
@@ -1,5 +1,4 @@
-Except for conversions involving TImode and conversions involving
-XFmode, the files in this directory are part of the GNU C Library, not part
-of GCC.  As described at <http://gcc.gnu.org/codingconventions.html>, changes
-should be made to the GNU C Library and the changed files then imported
-into GCC.
+The files in this directory are part of the GNU C Library, not part of
+GCC.  As described at <http://gcc.gnu.org/codingconventions.html>,
+changes should be made to the GNU C Library and the changed files then
+imported into GCC.
Index: libgcc/soft-fp/letf2.c
===================================================================
--- libgcc/soft-fp/letf2.c	(revision 204460)
+++ libgcc/soft-fp/letf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-CMPtype __letf2(TFtype a, TFtype b)
+CMPtype
+__letf2 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_Q(r, A, B, 2);
-  if (r == 2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_UNPACK_RAW_Q (B, b);
+  FP_CMP_Q (r, A, B, 2);
+  if (r == 2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__letf2, __lttf2);
+strong_alias (__letf2, __lttf2);
Index: libgcc/soft-fp/fixsfti.c
===================================================================
--- libgcc/soft-fp/fixsfti.c	(revision 204460)
+++ libgcc/soft-fp/fixsfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit signed integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "single.h"
 
-TItype __fixsfti(SFtype a)
+TItype
+__fixsfti (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   UTItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, TI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, TI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixdfdi.c
===================================================================
--- libgcc/soft-fp/fixdfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixdfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DItype __fixdfdi(DFtype a)
+DItype
+__fixdfdi (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   UDItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, DI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/extenddftf2.c
===================================================================
--- libgcc/soft-fp/extenddftf2.c	(revision 204460)
+++ libgcc/soft-fp/extenddftf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "double.h"
 #include "quad.h"
 
-TFtype __extenddftf2(DFtype a)
+TFtype
+__extenddftf2 (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
-  FP_DECL_Q(R);
+  FP_DECL_D (A);
+  FP_DECL_Q (R);
   TFtype r;
 
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_D(A, a);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,D,4,2,R,A);
+  FP_EXTEND (Q, D, 4, 2, R, A);
 #else
-  FP_EXTEND(Q,D,2,1,R,A);
+  FP_EXTEND (Q, D, 2, 1, R, A);
 #endif
-  FP_PACK_RAW_Q(r, R);
+  FP_PACK_RAW_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatundisf.c
===================================================================
--- libgcc/soft-fp/floatundisf.c	(revision 204460)
+++ libgcc/soft-fp/floatundisf.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floatundisf(UDItype i)
+SFtype
+__floatundisf (UDItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, DI_BITS, UDItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/fixunssfdi.c
===================================================================
--- libgcc/soft-fp/fixunssfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixunssfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-UDItype __fixunssfdi(SFtype a)
+UDItype
+__fixunssfdi (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   UDItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, DI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/unorddf2.c
===================================================================
--- libgcc/soft-fp/unorddf2.c	(revision 204460)
+++ libgcc/soft-fp/unorddf2.c	(working copy)
@@ -30,14 +30,21 @@
 #include "soft-fp.h"
 #include "double.h"
 
-CMPtype __unorddf2(DFtype a, DFtype b)
+CMPtype
+__unorddf2 (DFtype a, DFtype b)
 {
-  FP_DECL_D(A); FP_DECL_D(B);
+  FP_DECL_EX;
+  FP_DECL_D (A);
+  FP_DECL_D (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_UNORD_D(r, A, B);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_UNPACK_RAW_D (B, b);
+  FP_CMP_UNORD_D (r, A, B);
+  if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
Index: libgcc/soft-fp/negsf2.c
===================================================================
--- libgcc/soft-fp/negsf2.c	(revision 204460)
+++ libgcc/soft-fp/negsf2.c	(working copy)
@@ -31,17 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __negsf2(SFtype a)
+SFtype
+__negsf2 (SFtype a)
 {
-  FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(R);
+  FP_DECL_S (A);
+  FP_DECL_S (R);
   SFtype r;
 
-  FP_UNPACK_S(A, a);
-  FP_NEG_S(R, A);
-  FP_PACK_S(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_NEG_S (R, A);
+  FP_PACK_RAW_S (r, R);
 
   return r;
 }
Index: libgcc/soft-fp/negtf2.c
===================================================================
--- libgcc/soft-fp/negtf2.c	(revision 204460)
+++ libgcc/soft-fp/negtf2.c	(working copy)
@@ -31,17 +31,16 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __negtf2(TFtype a)
+TFtype
+__negtf2 (TFtype a)
 {
-  FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(R);
+  FP_DECL_Q (A);
+  FP_DECL_Q (R);
   TFtype r;
 
-  FP_UNPACK_Q(A, a);
-  FP_NEG_Q(R, A);
-  FP_PACK_Q(r, R);
-  FP_CLEAR_EXCEPTIONS;
-  FP_HANDLE_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_NEG_Q (R, A);
+  FP_PACK_RAW_Q (r, R);
 
   return r;
 }
Index: libgcc/soft-fp/single.h
===================================================================
--- libgcc/soft-fp/single.h	(revision 204460)
+++ libgcc/soft-fp/single.h	(working copy)
@@ -31,11 +31,17 @@
    <http://www.gnu.org/licenses/>.  */
 
 #if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel kid.  Go buy yourself a real computer."
+# error "Here's a nickel kid.  Go buy yourself a real computer."
 #endif
 
 #define _FP_FRACTBITS_S		_FP_W_TYPE_SIZE
 
+#if _FP_W_TYPE_SIZE < 64
+# define _FP_FRACTBITS_DW_S	(2 * _FP_W_TYPE_SIZE)
+#else
+# define _FP_FRACTBITS_DW_S	_FP_W_TYPE_SIZE
+#endif
+
 #define _FP_FRACBITS_S		24
 #define _FP_FRACXBITS_S		(_FP_FRACTBITS_S - _FP_FRACBITS_S)
 #define _FP_WFRACBITS_S		(_FP_WORKBITS + _FP_FRACBITS_S)
@@ -43,21 +49,27 @@
 #define _FP_EXPBITS_S		8
 #define _FP_EXPBIAS_S		127
 #define _FP_EXPMAX_S		255
-#define _FP_QNANBIT_S		((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2))
-#define _FP_QNANBIT_SH_S	((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
-#define _FP_IMPLBIT_S		((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1))
-#define _FP_IMPLBIT_SH_S	((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
-#define _FP_OVERFLOW_S		((_FP_W_TYPE)1 << (_FP_WFRACBITS_S))
+#define _FP_QNANBIT_S		((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2))
+#define _FP_QNANBIT_SH_S	((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
+#define _FP_IMPLBIT_S		((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1))
+#define _FP_IMPLBIT_SH_S	((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
+#define _FP_OVERFLOW_S		((_FP_W_TYPE) 1 << (_FP_WFRACBITS_S))
 
+#define _FP_WFRACBITS_DW_S	(2 * _FP_WFRACBITS_S)
+#define _FP_WFRACXBITS_DW_S	(_FP_FRACTBITS_DW_S - _FP_WFRACBITS_DW_S)
+#define _FP_HIGHBIT_DW_S	\
+  ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_S - 1) % _FP_W_TYPE_SIZE)
+
 /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
    chosen by the target machine.  */
 
-typedef float SFtype __attribute__((mode(SF)));
+typedef float SFtype __attribute__ ((mode (SF)));
 
 union _FP_UNION_S
 {
   SFtype flt;
-  struct _FP_STRUCT_LAYOUT {
+  struct _FP_STRUCT_LAYOUT
+  {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign : 1;
     unsigned exp  : _FP_EXPBITS_S;
@@ -67,84 +79,114 @@
     unsigned exp  : _FP_EXPBITS_S;
     unsigned sign : 1;
 #endif
-  } bits __attribute__((packed));
+  } bits __attribute__ ((packed));
 };
 
-#define FP_DECL_S(X)		_FP_DECL(1,X)
-#define FP_UNPACK_RAW_S(X,val)	_FP_UNPACK_RAW_1(S,X,val)
-#define FP_UNPACK_RAW_SP(X,val)	_FP_UNPACK_RAW_1_P(S,X,val)
-#define FP_PACK_RAW_S(val,X)	_FP_PACK_RAW_1(S,val,X)
-#define FP_PACK_RAW_SP(val,X)		\
-  do {					\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(S,val,X);	\
-  } while (0)
+#define FP_DECL_S(X)		_FP_DECL (1, X)
+#define FP_UNPACK_RAW_S(X, val)	_FP_UNPACK_RAW_1 (S, X, val)
+#define FP_UNPACK_RAW_SP(X, val)	_FP_UNPACK_RAW_1_P (S, X, val)
+#define FP_PACK_RAW_S(val, X)	_FP_PACK_RAW_1 (S, val, X)
+#define FP_PACK_RAW_SP(val, X)			\
+  do						\
+    {						\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (S, val, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_S(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_1(S,X,val);		\
-    _FP_UNPACK_CANONICAL(S,1,X);	\
-  } while (0)
+#define FP_UNPACK_S(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1 (S, X, val);		\
+      _FP_UNPACK_CANONICAL (S, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SP(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_1_P(S,X,val);	\
-    _FP_UNPACK_CANONICAL(S,1,X);	\
-  } while (0)
+#define FP_UNPACK_SP(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1_P (S, X, val);		\
+      _FP_UNPACK_CANONICAL (S, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_S(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_1(S,X,val);		\
-    _FP_UNPACK_SEMIRAW(S,1,X);		\
-  } while (0)
+#define FP_UNPACK_SEMIRAW_S(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1 (S, X, val);		\
+      _FP_UNPACK_SEMIRAW (S, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_SP(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_1_P(S,X,val);	\
-    _FP_UNPACK_SEMIRAW(S,1,X);		\
-  } while (0)
+#define FP_UNPACK_SEMIRAW_SP(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1_P (S, X, val);		\
+      _FP_UNPACK_SEMIRAW (S, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_S(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(S,1,X);		\
-    _FP_PACK_RAW_1(S,val,X);		\
-  } while (0)
+#define FP_PACK_S(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (S, 1, X);		\
+      _FP_PACK_RAW_1 (S, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(S,1,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(S,val,X);	\
-  } while (0)
+#define FP_PACK_SP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (S, 1, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (S, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_S(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(S,1,X);		\
-    _FP_PACK_RAW_1(S,val,X);		\
-  } while (0)
+#define FP_PACK_SEMIRAW_S(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (S, 1, X);		\
+      _FP_PACK_RAW_1 (S, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_SP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(S,1,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(S,val,X);	\
-  } while (0)
+#define FP_PACK_SEMIRAW_SP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (S, 1, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (S, val, X);		\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_S(X)		_FP_ISSIGNAN(S,1,X)
-#define FP_NEG_S(R,X)			_FP_NEG(S,1,R,X)
-#define FP_ADD_S(R,X,Y)			_FP_ADD(S,1,R,X,Y)
-#define FP_SUB_S(R,X,Y)			_FP_SUB(S,1,R,X,Y)
-#define FP_MUL_S(R,X,Y)			_FP_MUL(S,1,R,X,Y)
-#define FP_DIV_S(R,X,Y)			_FP_DIV(S,1,R,X,Y)
-#define FP_SQRT_S(R,X)			_FP_SQRT(S,1,R,X)
-#define _FP_SQRT_MEAT_S(R,S,T,X,Q)	_FP_SQRT_MEAT_1(R,S,T,X,Q)
+#define FP_ISSIGNAN_S(X)		_FP_ISSIGNAN (S, 1, X)
+#define FP_NEG_S(R, X)			_FP_NEG (S, 1, R, X)
+#define FP_ADD_S(R, X, Y)		_FP_ADD (S, 1, R, X, Y)
+#define FP_SUB_S(R, X, Y)		_FP_SUB (S, 1, R, X, Y)
+#define FP_MUL_S(R, X, Y)		_FP_MUL (S, 1, R, X, Y)
+#define FP_DIV_S(R, X, Y)		_FP_DIV (S, 1, R, X, Y)
+#define FP_SQRT_S(R, X)			_FP_SQRT (S, 1, R, X)
+#define _FP_SQRT_MEAT_S(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, Q)
 
-#define FP_CMP_S(r,X,Y,un)	_FP_CMP(S,1,r,X,Y,un)
-#define FP_CMP_EQ_S(r,X,Y)	_FP_CMP_EQ(S,1,r,X,Y)
-#define FP_CMP_UNORD_S(r,X,Y)	_FP_CMP_UNORD(S,1,r,X,Y)
+#if _FP_W_TYPE_SIZE < 64
+# define FP_FMA_S(R, X, Y, Z)	_FP_FMA (S, 1, 2, R, X, Y, Z)
+#else
+# define FP_FMA_S(R, X, Y, Z)	_FP_FMA (S, 1, 1, R, X, Y, Z)
+#endif
 
-#define FP_TO_INT_S(r,X,rsz,rsg)	_FP_TO_INT(S,1,r,X,rsz,rsg)
-#define FP_FROM_INT_S(X,r,rs,rt)	_FP_FROM_INT(S,1,X,r,rs,rt)
+#define FP_CMP_S(r, X, Y, un)	_FP_CMP (S, 1, r, X, Y, un)
+#define FP_CMP_EQ_S(r, X, Y)	_FP_CMP_EQ (S, 1, r, X, Y)
+#define FP_CMP_UNORD_S(r, X, Y)	_FP_CMP_UNORD (S, 1, r, X, Y)
 
-#define _FP_FRAC_HIGH_S(X)	_FP_FRAC_HIGH_1(X)
-#define _FP_FRAC_HIGH_RAW_S(X)	_FP_FRAC_HIGH_1(X)
+#define FP_TO_INT_S(r, X, rsz, rsg)	_FP_TO_INT (S, 1, r, X, rsz, rsg)
+#define FP_FROM_INT_S(X, r, rs, rt)	_FP_FROM_INT (S, 1, X, r, rs, rt)
+
+#define _FP_FRAC_HIGH_S(X)	_FP_FRAC_HIGH_1 (X)
+#define _FP_FRAC_HIGH_RAW_S(X)	_FP_FRAC_HIGH_1 (X)
+
+#if _FP_W_TYPE_SIZE < 64
+# define _FP_FRAC_HIGH_DW_S(X)	_FP_FRAC_HIGH_2 (X)
+#else
+# define _FP_FRAC_HIGH_DW_S(X)	_FP_FRAC_HIGH_1 (X)
+#endif
Index: libgcc/soft-fp/subdf3.c
===================================================================
--- libgcc/soft-fp/subdf3.c	(revision 204460)
+++ libgcc/soft-fp/subdf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __subdf3(DFtype a, DFtype b)
+DFtype
+__subdf3 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
+  FP_DECL_D (R);
   DFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
-  FP_UNPACK_SEMIRAW_D(B, b);
-  FP_SUB_D(R, A, B);
-  FP_PACK_SEMIRAW_D(r, R);
+  FP_UNPACK_SEMIRAW_D (A, a);
+  FP_UNPACK_SEMIRAW_D (B, b);
+  FP_SUB_D (R, A, B);
+  FP_PACK_SEMIRAW_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/muldf3.c
===================================================================
--- libgcc/soft-fp/muldf3.c	(revision 204460)
+++ libgcc/soft-fp/muldf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __muldf3(DFtype a, DFtype b)
+DFtype
+__muldf3 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
+  FP_DECL_D (R);
   DFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
-  FP_UNPACK_D(B, b);
-  FP_MUL_D(R, A, B);
-  FP_PACK_D(r, R);
+  FP_UNPACK_D (A, a);
+  FP_UNPACK_D (B, b);
+  FP_MUL_D (R, A, B);
+  FP_PACK_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floattisf.c
===================================================================
--- libgcc/soft-fp/floattisf.c	(revision 204460)
+++ libgcc/soft-fp/floattisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit signed integer to IEEE single
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floattisf(TItype i)
+SFtype
+__floattisf (TItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/fixdfti.c
===================================================================
--- libgcc/soft-fp/fixdfti.c	(revision 204460)
+++ libgcc/soft-fp/fixdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit signed integer
-   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "double.h"
 
-TItype __fixdfti(DFtype a)
+TItype
+__fixdfti (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   UTItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, TI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, TI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixtfdi.c
===================================================================
--- libgcc/soft-fp/fixtfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixtfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-DItype __fixtfdi(TFtype a)
+DItype
+__fixtfdi (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   UDItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, DI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatuntisf.c
===================================================================
--- libgcc/soft-fp/floatuntisf.c	(revision 204460)
+++ libgcc/soft-fp/floatuntisf.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 128bit unsigned integer to IEEE single
-   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __floatuntisf(UTItype i)
+SFtype
+__floatuntisf (UTItype i)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   SFtype a;
 
-  FP_FROM_INT_S(A, i, TI_BITS, UTItype);
-  FP_PACK_RAW_S(a, A);
+  FP_INIT_ROUNDMODE;
+  FP_FROM_INT_S (A, i, TI_BITS, UTItype);
+  FP_PACK_RAW_S (a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: libgcc/soft-fp/quad.h
===================================================================
--- libgcc/soft-fp/quad.h	(revision 204460)
+++ libgcc/soft-fp/quad.h	(working copy)
@@ -31,13 +31,15 @@
    <http://www.gnu.org/licenses/>.  */
 
 #if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel, kid. Go buy yourself a real computer."
+# error "Here's a nickel, kid. Go buy yourself a real computer."
 #endif
 
 #if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_Q         (4*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_Q	(4*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_DW_Q	(8*_FP_W_TYPE_SIZE)
 #else
-#define _FP_FRACTBITS_Q		(2*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_Q		(2*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_DW_Q	(4*_FP_W_TYPE_SIZE)
 #endif
 
 #define _FP_FRACBITS_Q		113
@@ -49,222 +51,271 @@
 #define _FP_EXPMAX_Q		32767
 
 #define _FP_QNANBIT_Q		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-2) % _FP_W_TYPE_SIZE)
 #define _FP_QNANBIT_SH_Q		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_Q		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-1) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_SH_Q		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_Q-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_OVERFLOW_Q		\
-	((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
+	((_FP_W_TYPE) 1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
 
-typedef float TFtype __attribute__((mode(TF)));
+#define _FP_WFRACBITS_DW_Q	(2 * _FP_WFRACBITS_Q)
+#define _FP_WFRACXBITS_DW_Q	(_FP_FRACTBITS_DW_Q - _FP_WFRACBITS_DW_Q)
+#define _FP_HIGHBIT_DW_Q	\
+  ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_Q - 1) % _FP_W_TYPE_SIZE)
 
+typedef float TFtype __attribute__ ((mode (TF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_Q
 {
-   TFtype flt;
-   struct _FP_STRUCT_LAYOUT
-   {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      unsigned sign : 1;
-      unsigned exp : _FP_EXPBITS_Q;
-      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
-      unsigned long frac2 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-#else
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac2 : _FP_W_TYPE_SIZE;
-      unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
-      unsigned exp : _FP_EXPBITS_Q;
-      unsigned sign : 1;
-#endif /* not bigendian */
-   } bits __attribute__((packed));
+  TFtype flt;
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned sign : 1;
+    unsigned exp : _FP_EXPBITS_Q;
+    unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
+    unsigned long frac2 : _FP_W_TYPE_SIZE;
+    unsigned long frac1 : _FP_W_TYPE_SIZE;
+    unsigned long frac0 : _FP_W_TYPE_SIZE;
+# else
+    unsigned long frac0 : _FP_W_TYPE_SIZE;
+    unsigned long frac1 : _FP_W_TYPE_SIZE;
+    unsigned long frac2 : _FP_W_TYPE_SIZE;
+    unsigned long frac3 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0)-(_FP_W_TYPE_SIZE * 3);
+    unsigned exp : _FP_EXPBITS_Q;
+    unsigned sign : 1;
+# endif /* not bigendian */
+  } bits __attribute__ ((packed));
 };
 
 
-#define FP_DECL_Q(X)		_FP_DECL(4,X)
-#define FP_UNPACK_RAW_Q(X,val)	_FP_UNPACK_RAW_4(Q,X,val)
-#define FP_UNPACK_RAW_QP(X,val)	_FP_UNPACK_RAW_4_P(Q,X,val)
-#define FP_PACK_RAW_Q(val,X)	_FP_PACK_RAW_4(Q,val,X)
-#define FP_PACK_RAW_QP(val,X)		\
-  do {					\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_4_P(Q,val,X);	\
-  } while (0)
+# define FP_DECL_Q(X)		_FP_DECL (4, X)
+# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_4 (Q, X, val)
+# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_4_P (Q, X, val)
+# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_4 (Q, val, X)
+# define FP_PACK_RAW_QP(val, X)			\
+  do						\
+    {						\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_4_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_Q(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_4(Q,X,val);		\
-    _FP_UNPACK_CANONICAL(Q,4,X);	\
-  } while (0)
+# define FP_UNPACK_Q(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_4 (Q, X, val);		\
+      _FP_UNPACK_CANONICAL (Q, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_QP(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_4_P(Q,X,val);	\
-    _FP_UNPACK_CANONICAL(Q,4,X);	\
-  } while (0)
+# define FP_UNPACK_QP(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_4_P (Q, X, val);		\
+      _FP_UNPACK_CANONICAL (Q, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_Q(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_4(Q,X,val);		\
-    _FP_UNPACK_SEMIRAW(Q,4,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_Q(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_4 (Q, X, val);		\
+      _FP_UNPACK_SEMIRAW (Q, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_QP(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_4_P(Q,X,val);	\
-    _FP_UNPACK_SEMIRAW(Q,4,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_QP(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_4_P (Q, X, val);		\
+      _FP_UNPACK_SEMIRAW (Q, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_Q(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(Q,4,X);		\
-    _FP_PACK_RAW_4(Q,val,X);		\
-  } while (0)
+# define FP_PACK_Q(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (Q, 4, X);		\
+      _FP_PACK_RAW_4 (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_QP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(Q,4,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_4_P(Q,val,X);	\
-  } while (0)
+# define FP_PACK_QP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (Q, 4, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_4_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_Q(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(Q,4,X);		\
-    _FP_PACK_RAW_4(Q,val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_Q(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (Q, 4, X);		\
+      _FP_PACK_RAW_4 (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_QP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(Q,4,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_4_P(Q,val,X);	\
-  } while (0)
+# define FP_PACK_SEMIRAW_QP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (Q, 4, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_4_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_Q(X)		_FP_ISSIGNAN(Q,4,X)
-#define FP_NEG_Q(R,X)			_FP_NEG(Q,4,R,X)
-#define FP_ADD_Q(R,X,Y)			_FP_ADD(Q,4,R,X,Y)
-#define FP_SUB_Q(R,X,Y)			_FP_SUB(Q,4,R,X,Y)
-#define FP_MUL_Q(R,X,Y)			_FP_MUL(Q,4,R,X,Y)
-#define FP_DIV_Q(R,X,Y)			_FP_DIV(Q,4,R,X,Y)
-#define FP_SQRT_Q(R,X)			_FP_SQRT(Q,4,R,X)
-#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)	_FP_SQRT_MEAT_4(R,S,T,X,Q)
+# define FP_ISSIGNAN_Q(X)		_FP_ISSIGNAN (Q, 4, X)
+# define FP_NEG_Q(R, X)			_FP_NEG (Q, 4, R, X)
+# define FP_ADD_Q(R, X, Y)		_FP_ADD (Q, 4, R, X, Y)
+# define FP_SUB_Q(R, X, Y)		_FP_SUB (Q, 4, R, X, Y)
+# define FP_MUL_Q(R, X, Y)		_FP_MUL (Q, 4, R, X, Y)
+# define FP_DIV_Q(R, X, Y)		_FP_DIV (Q, 4, R, X, Y)
+# define FP_SQRT_Q(R, X)		_FP_SQRT (Q, 4, R, X)
+# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_4 (R, S, T, X, Q)
+# define FP_FMA_Q(R, X, Y, Z)		_FP_FMA (Q, 4, 8, R, X, Y, Z)
 
-#define FP_CMP_Q(r,X,Y,un)	_FP_CMP(Q,4,r,X,Y,un)
-#define FP_CMP_EQ_Q(r,X,Y)	_FP_CMP_EQ(Q,4,r,X,Y)
-#define FP_CMP_UNORD_Q(r,X,Y)	_FP_CMP_UNORD(Q,4,r,X,Y)
+# define FP_CMP_Q(r, X, Y, un)		_FP_CMP (Q, 4, r, X, Y, un)
+# define FP_CMP_EQ_Q(r, X, Y)		_FP_CMP_EQ (Q, 4, r, X, Y)
+# define FP_CMP_UNORD_Q(r, X, Y)	_FP_CMP_UNORD (Q, 4, r, X, Y)
 
-#define FP_TO_INT_Q(r,X,rsz,rsg)	_FP_TO_INT(Q,4,r,X,rsz,rsg)
-#define FP_FROM_INT_Q(X,r,rs,rt)	_FP_FROM_INT(Q,4,X,r,rs,rt)
+# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 4, r, X, rsz, rsg)
+# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 4, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_4(X)
-#define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_4(X)
+# define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_4 (X)
+# define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_4 (X)
 
+# define _FP_FRAC_HIGH_DW_Q(X)	_FP_FRAC_HIGH_8 (X)
+
 #else   /* not _FP_W_TYPE_SIZE < 64 */
 union _FP_UNION_Q
 {
-  TFtype flt /* __attribute__((mode(TF))) */ ;
-  struct _FP_STRUCT_LAYOUT {
+  TFtype flt /* __attribute__ ((mode (TF))) */ ;
+  struct _FP_STRUCT_LAYOUT
+  {
     _FP_W_TYPE a, b;
   } longs;
-  struct _FP_STRUCT_LAYOUT {
-#if __BYTE_ORDER == __BIG_ENDIAN
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign    : 1;
     unsigned exp     : _FP_EXPBITS_Q;
     _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
     _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
-#else
+# else
     _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
     _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
     unsigned exp     : _FP_EXPBITS_Q;
     unsigned sign    : 1;
-#endif
+# endif
   } bits;
 };
 
-#define FP_DECL_Q(X)		_FP_DECL(2,X)
-#define FP_UNPACK_RAW_Q(X,val)	_FP_UNPACK_RAW_2(Q,X,val)
-#define FP_UNPACK_RAW_QP(X,val)	_FP_UNPACK_RAW_2_P(Q,X,val)
-#define FP_PACK_RAW_Q(val,X)	_FP_PACK_RAW_2(Q,val,X)
-#define FP_PACK_RAW_QP(val,X)		\
-  do {					\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(Q,val,X);	\
-  } while (0)
+# define FP_DECL_Q(X)		_FP_DECL (2, X)
+# define FP_UNPACK_RAW_Q(X, val)	_FP_UNPACK_RAW_2 (Q, X, val)
+# define FP_UNPACK_RAW_QP(X, val)	_FP_UNPACK_RAW_2_P (Q, X, val)
+# define FP_PACK_RAW_Q(val, X)	_FP_PACK_RAW_2 (Q, val, X)
+# define FP_PACK_RAW_QP(val, X)			\
+  do						\
+    {						\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_Q(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_2(Q,X,val);		\
-    _FP_UNPACK_CANONICAL(Q,2,X);	\
-  } while (0)
+# define FP_UNPACK_Q(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2 (Q, X, val);		\
+      _FP_UNPACK_CANONICAL (Q, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_QP(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_2_P(Q,X,val);	\
-    _FP_UNPACK_CANONICAL(Q,2,X);	\
-  } while (0)
+# define FP_UNPACK_QP(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2_P (Q, X, val);		\
+      _FP_UNPACK_CANONICAL (Q, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_Q(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_2(Q,X,val);		\
-    _FP_UNPACK_SEMIRAW(Q,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_Q(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2 (Q, X, val);		\
+      _FP_UNPACK_SEMIRAW (Q, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_QP(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_2_P(Q,X,val);	\
-    _FP_UNPACK_SEMIRAW(Q,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_QP(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2_P (Q, X, val);		\
+      _FP_UNPACK_SEMIRAW (Q, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_Q(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(Q,2,X);		\
-    _FP_PACK_RAW_2(Q,val,X);		\
-  } while (0)
+# define FP_PACK_Q(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (Q, 2, X);		\
+      _FP_PACK_RAW_2 (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_QP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(Q,2,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(Q,val,X);	\
-  } while (0)
+# define FP_PACK_QP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (Q, 2, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_Q(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(Q,2,X);		\
-    _FP_PACK_RAW_2(Q,val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_Q(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (Q, 2, X);		\
+      _FP_PACK_RAW_2 (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_QP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(Q,2,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(Q,val,X);	\
-  } while (0)
+# define FP_PACK_SEMIRAW_QP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (Q, 2, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (Q, val, X);		\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_Q(X)		_FP_ISSIGNAN(Q,2,X)
-#define FP_NEG_Q(R,X)			_FP_NEG(Q,2,R,X)
-#define FP_ADD_Q(R,X,Y)			_FP_ADD(Q,2,R,X,Y)
-#define FP_SUB_Q(R,X,Y)			_FP_SUB(Q,2,R,X,Y)
-#define FP_MUL_Q(R,X,Y)			_FP_MUL(Q,2,R,X,Y)
-#define FP_DIV_Q(R,X,Y)			_FP_DIV(Q,2,R,X,Y)
-#define FP_SQRT_Q(R,X)			_FP_SQRT(Q,2,R,X)
-#define _FP_SQRT_MEAT_Q(R,S,T,X,Q)	_FP_SQRT_MEAT_2(R,S,T,X,Q)
+# define FP_ISSIGNAN_Q(X)		_FP_ISSIGNAN (Q, 2, X)
+# define FP_NEG_Q(R, X)			_FP_NEG (Q, 2, R, X)
+# define FP_ADD_Q(R, X, Y)		_FP_ADD (Q, 2, R, X, Y)
+# define FP_SUB_Q(R, X, Y)		_FP_SUB (Q, 2, R, X, Y)
+# define FP_MUL_Q(R, X, Y)		_FP_MUL (Q, 2, R, X, Y)
+# define FP_DIV_Q(R, X, Y)		_FP_DIV (Q, 2, R, X, Y)
+# define FP_SQRT_Q(R, X)		_FP_SQRT (Q, 2, R, X)
+# define _FP_SQRT_MEAT_Q(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, Q)
+# define FP_FMA_Q(R, X, Y, Z)		_FP_FMA (Q, 2, 4, R, X, Y, Z)
 
-#define FP_CMP_Q(r,X,Y,un)	_FP_CMP(Q,2,r,X,Y,un)
-#define FP_CMP_EQ_Q(r,X,Y)	_FP_CMP_EQ(Q,2,r,X,Y)
-#define FP_CMP_UNORD_Q(r,X,Y)	_FP_CMP_UNORD(Q,2,r,X,Y)
+# define FP_CMP_Q(r, X, Y, un)		_FP_CMP (Q, 2, r, X, Y, un)
+# define FP_CMP_EQ_Q(r, X, Y)		_FP_CMP_EQ (Q, 2, r, X, Y)
+# define FP_CMP_UNORD_Q(r, X, Y)	_FP_CMP_UNORD (Q, 2, r, X, Y)
 
-#define FP_TO_INT_Q(r,X,rsz,rsg)	_FP_TO_INT(Q,2,r,X,rsz,rsg)
-#define FP_FROM_INT_Q(X,r,rs,rt)	_FP_FROM_INT(Q,2,X,r,rs,rt)
+# define FP_TO_INT_Q(r, X, rsz, rsg)	_FP_TO_INT (Q, 2, r, X, rsz, rsg)
+# define FP_FROM_INT_Q(X, r, rs, rt)	_FP_FROM_INT (Q, 2, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_2(X)
-#define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_2(X)
+# define _FP_FRAC_HIGH_Q(X)	_FP_FRAC_HIGH_2 (X)
+# define _FP_FRAC_HIGH_RAW_Q(X)	_FP_FRAC_HIGH_2 (X)
 
+# define _FP_FRAC_HIGH_DW_Q(X)	_FP_FRAC_HIGH_4 (X)
+
 #endif /* not _FP_W_TYPE_SIZE < 64 */
Index: libgcc/soft-fp/extendxftf2.c
===================================================================
--- libgcc/soft-fp/extendxftf2.c	(revision 204460)
+++ libgcc/soft-fp/extendxftf2.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,29 +24,29 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "extended.h"
 #include "quad.h"
 
-TFtype __extendxftf2(XFtype a)
+TFtype
+__extendxftf2 (XFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_E(A);
-  FP_DECL_Q(R);
+  FP_DECL_E (A);
+  FP_DECL_Q (R);
   TFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_E(A, a);
+  FP_UNPACK_RAW_E (A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_EXTEND(Q,E,4,4,R,A);
+  FP_EXTEND (Q, E, 4, 4, R, A);
 #else
-  FP_EXTEND(Q,E,2,2,R,A);
+  FP_EXTEND (Q, E, 2, 2, R, A);
 #endif
-  FP_PACK_RAW_Q(r, R);
+  FP_PACK_RAW_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixunssfti.c
===================================================================
--- libgcc/soft-fp/fixunssfti.c	(revision 204460)
+++ libgcc/soft-fp/fixunssfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE single to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "single.h"
 
-UTItype __fixunssfti(SFtype a)
+UTItype
+__fixunssfti (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   UTItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, TI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, TI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/unordsf2.c
===================================================================
--- libgcc/soft-fp/unordsf2.c	(revision 204460)
+++ libgcc/soft-fp/unordsf2.c	(working copy)
@@ -30,15 +30,21 @@
 #include "soft-fp.h"
 #include "single.h"
 
-CMPtype __unordsf2(SFtype a, SFtype b)
+CMPtype
+__unordsf2 (SFtype a, SFtype b)
 {
-  FP_DECL_S(A);
-  FP_DECL_S(B);
+  FP_DECL_EX;
+  FP_DECL_S (A);
+  FP_DECL_S (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_UNORD_S(r, A, B);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_UNPACK_RAW_S (B, b);
+  FP_CMP_UNORD_S (r, A, B);
+  if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
Index: libgcc/soft-fp/fixunsdfdi.c
===================================================================
--- libgcc/soft-fp/fixunsdfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixunsdfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-UDItype __fixunsdfdi(DFtype a)
+UDItype
+__fixunsdfdi (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   UDItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, DI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/unordtf2.c
===================================================================
--- libgcc/soft-fp/unordtf2.c	(revision 204460)
+++ libgcc/soft-fp/unordtf2.c	(working copy)
@@ -30,15 +30,21 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-CMPtype __unordtf2(TFtype a, TFtype b)
+CMPtype
+__unordtf2 (TFtype a, TFtype b)
 {
-  FP_DECL_Q(A);
-  FP_DECL_Q(B);
+  FP_DECL_EX;
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_UNORD_Q(r, A, B);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_UNPACK_RAW_Q (B, b);
+  FP_CMP_UNORD_Q (r, A, B);
+  if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
+  FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
Index: libgcc/soft-fp/subsf3.c
===================================================================
--- libgcc/soft-fp/subsf3.c	(revision 204460)
+++ libgcc/soft-fp/subsf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __subsf3(SFtype a, SFtype b)
+SFtype
+__subsf3 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_S(A, a);
-  FP_UNPACK_SEMIRAW_S(B, b);
-  FP_SUB_S(R, A, B);
-  FP_PACK_SEMIRAW_S(r, R);
+  FP_UNPACK_SEMIRAW_S (A, a);
+  FP_UNPACK_SEMIRAW_S (B, b);
+  FP_SUB_S (R, A, B);
+  FP_PACK_SEMIRAW_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/subtf3.c
===================================================================
--- libgcc/soft-fp/subtf3.c	(revision 204460)
+++ libgcc/soft-fp/subtf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __subtf3(TFtype a, TFtype b)
+TFtype
+__subtf3 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
+  FP_DECL_Q (R);
   TFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-  FP_UNPACK_SEMIRAW_Q(B, b);
-  FP_SUB_Q(R, A, B);
-  FP_PACK_SEMIRAW_Q(r, R);
+  FP_UNPACK_SEMIRAW_Q (A, a);
+  FP_UNPACK_SEMIRAW_Q (B, b);
+  FP_SUB_Q (R, A, B);
+  FP_PACK_SEMIRAW_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/mulsf3.c
===================================================================
--- libgcc/soft-fp/mulsf3.c	(revision 204460)
+++ libgcc/soft-fp/mulsf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __mulsf3(SFtype a, SFtype b)
+SFtype
+__mulsf3 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
-  FP_UNPACK_S(B, b);
-  FP_MUL_S(R, A, B);
-  FP_PACK_S(r, R);
+  FP_UNPACK_S (A, a);
+  FP_UNPACK_S (B, b);
+  FP_MUL_S (R, A, B);
+  FP_PACK_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/multf3.c
===================================================================
--- libgcc/soft-fp/multf3.c	(revision 204460)
+++ libgcc/soft-fp/multf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __multf3(TFtype a, TFtype b)
+TFtype
+__multf3 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
+  FP_DECL_Q (R);
   TFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q(A, a);
-  FP_UNPACK_Q(B, b);
-  FP_MUL_Q(R, A, B);
-  FP_PACK_Q(r, R);
+  FP_UNPACK_Q (A, a);
+  FP_UNPACK_Q (B, b);
+  FP_MUL_Q (R, A, B);
+  FP_PACK_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixsfsi.c
===================================================================
--- libgcc/soft-fp/fixsfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixsfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SItype __fixsfsi(SFtype a)
+SItype
+__fixsfsi (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   USItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, SI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixtfti.c
===================================================================
--- libgcc/soft-fp/fixtfti.c	(revision 204460)
+++ libgcc/soft-fp/fixtfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit signed integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "quad.h"
 
-TItype __fixtfti(TFtype a)
+TItype
+__fixtfti (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   UTItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, TI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, TI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/op-1.h
===================================================================
--- libgcc/soft-fp/op-1.h	(revision 204460)
+++ libgcc/soft-fp/op-1.h	(working copy)
@@ -31,103 +31,117 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define _FP_FRAC_DECL_1(X)	_FP_W_TYPE X##_f
-#define _FP_FRAC_COPY_1(D,S)	(D##_f = S##_f)
-#define _FP_FRAC_SET_1(X,I)	(X##_f = I)
+#define _FP_FRAC_COPY_1(D, S)	(D##_f = S##_f)
+#define _FP_FRAC_SET_1(X, I)	(X##_f = I)
 #define _FP_FRAC_HIGH_1(X)	(X##_f)
 #define _FP_FRAC_LOW_1(X)	(X##_f)
-#define _FP_FRAC_WORD_1(X,w)	(X##_f)
+#define _FP_FRAC_WORD_1(X, w)	(X##_f)
 
-#define _FP_FRAC_ADDI_1(X,I)	(X##_f += I)
-#define _FP_FRAC_SLL_1(X,N)			\
-  do {						\
-    if (__builtin_constant_p(N) && (N) == 1)	\
-      X##_f += X##_f;				\
-    else					\
-      X##_f <<= (N);				\
-  } while (0)
-#define _FP_FRAC_SRL_1(X,N)	(X##_f >>= N)
+#define _FP_FRAC_ADDI_1(X, I)	(X##_f += I)
+#define _FP_FRAC_SLL_1(X, N)			\
+  do						\
+    {						\
+      if (__builtin_constant_p (N) && (N) == 1)	\
+	X##_f += X##_f;				\
+      else					\
+	X##_f <<= (N);				\
+    }						\
+  while (0)
+#define _FP_FRAC_SRL_1(X, N)	(X##_f >>= N)
 
 /* Right shift with sticky-lsb.  */
-#define _FP_FRAC_SRST_1(X,S,N,sz)	__FP_FRAC_SRST_1(X##_f, S, N, sz)
-#define _FP_FRAC_SRS_1(X,N,sz)	__FP_FRAC_SRS_1(X##_f, N, sz)
+#define _FP_FRAC_SRST_1(X, S, N, sz)	__FP_FRAC_SRST_1 (X##_f, S, N, sz)
+#define _FP_FRAC_SRS_1(X, N, sz)	__FP_FRAC_SRS_1 (X##_f, N, sz)
 
-#define __FP_FRAC_SRST_1(X,S,N,sz)			\
-do {							\
-  S = (__builtin_constant_p(N) && (N) == 1		\
-       ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0);	\
-  X = X >> (N);						\
-} while (0)
+#define __FP_FRAC_SRST_1(X, S, N, sz)			\
+  do							\
+    {							\
+      S = (__builtin_constant_p (N) && (N) == 1		\
+	   ? X & 1					\
+	   : (X << (_FP_W_TYPE_SIZE - (N))) != 0);	\
+      X = X >> (N);					\
+    }							\
+  while (0)
 
-#define __FP_FRAC_SRS_1(X,N,sz)						\
-   (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1		\
-		     ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
+#define __FP_FRAC_SRS_1(X, N, sz)				\
+  (X = (X >> (N) | (__builtin_constant_p (N) && (N) == 1	\
+		    ? X & 1					\
+		    : (X << (_FP_W_TYPE_SIZE - (N))) != 0)))
 
-#define _FP_FRAC_ADD_1(R,X,Y)	(R##_f = X##_f + Y##_f)
-#define _FP_FRAC_SUB_1(R,X,Y)	(R##_f = X##_f - Y##_f)
-#define _FP_FRAC_DEC_1(X,Y)	(X##_f -= Y##_f)
-#define _FP_FRAC_CLZ_1(z, X)	__FP_CLZ(z, X##_f)
+#define _FP_FRAC_ADD_1(R, X, Y)	(R##_f = X##_f + Y##_f)
+#define _FP_FRAC_SUB_1(R, X, Y)	(R##_f = X##_f - Y##_f)
+#define _FP_FRAC_DEC_1(X, Y)	(X##_f -= Y##_f)
+#define _FP_FRAC_CLZ_1(z, X)	__FP_CLZ (z, X##_f)
 
 /* Predicates */
-#define _FP_FRAC_NEGP_1(X)	((_FP_WS_TYPE)X##_f < 0)
+#define _FP_FRAC_NEGP_1(X)	((_FP_WS_TYPE) X##_f < 0)
 #define _FP_FRAC_ZEROP_1(X)	(X##_f == 0)
-#define _FP_FRAC_OVERP_1(fs,X)	(X##_f & _FP_OVERFLOW_##fs)
-#define _FP_FRAC_CLEAR_OVERP_1(fs,X)	(X##_f &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_OVERP_1(fs, X)	(X##_f & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_1(fs, X)	(X##_f &= ~_FP_OVERFLOW_##fs)
+#define _FP_FRAC_HIGHBIT_DW_1(fs, X)	(X##_f & _FP_HIGHBIT_DW_##fs)
 #define _FP_FRAC_EQ_1(X, Y)	(X##_f == Y##_f)
 #define _FP_FRAC_GE_1(X, Y)	(X##_f >= Y##_f)
 #define _FP_FRAC_GT_1(X, Y)	(X##_f > Y##_f)
 
 #define _FP_ZEROFRAC_1		0
 #define _FP_MINFRAC_1		1
-#define _FP_MAXFRAC_1		(~(_FP_WS_TYPE)0)
+#define _FP_MAXFRAC_1		(~(_FP_WS_TYPE) 0)
 
 /*
  * Unpack the raw bits of a native fp value.  Do not classify or
  * normalize the data.
  */
 
-#define _FP_UNPACK_RAW_1(fs, X, val)				\
-  do {								\
-    union _FP_UNION_##fs _flo; _flo.flt = (val);		\
-								\
-    X##_f = _flo.bits.frac;					\
-    X##_e = _flo.bits.exp;					\
-    X##_s = _flo.bits.sign;					\
-  } while (0)
+#define _FP_UNPACK_RAW_1(fs, X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+      _flo.flt = (val);				\
+						\
+      X##_f = _flo.bits.frac;			\
+      X##_e = _flo.bits.exp;			\
+      X##_s = _flo.bits.sign;			\
+    }						\
+  while (0)
 
-#define _FP_UNPACK_RAW_1_P(fs, X, val)				\
-  do {								\
-    union _FP_UNION_##fs *_flo =				\
-      (union _FP_UNION_##fs *)(val);				\
-								\
-    X##_f = _flo->bits.frac;					\
-    X##_e = _flo->bits.exp;					\
-    X##_s = _flo->bits.sign;					\
-  } while (0)
+#define _FP_UNPACK_RAW_1_P(fs, X, val)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      X##_f = _flo->bits.frac;						\
+      X##_e = _flo->bits.exp;						\
+      X##_s = _flo->bits.sign;						\
+    }									\
+  while (0)
 
 /*
  * Repack the raw bits of a native fp value.
  */
 
-#define _FP_PACK_RAW_1(fs, val, X)				\
-  do {								\
-    union _FP_UNION_##fs _flo;					\
-								\
-    _flo.bits.frac = X##_f;					\
-    _flo.bits.exp  = X##_e;					\
-    _flo.bits.sign = X##_s;					\
-								\
-    (val) = _flo.flt;						\
-  } while (0)
+#define _FP_PACK_RAW_1(fs, val, X)		\
+  do						\
+    {						\
+      union _FP_UNION_##fs _flo;		\
+						\
+      _flo.bits.frac = X##_f;			\
+      _flo.bits.exp  = X##_e;			\
+      _flo.bits.sign = X##_s;			\
+						\
+      (val) = _flo.flt;				\
+    }						\
+  while (0)
 
-#define _FP_PACK_RAW_1_P(fs, val, X)				\
-  do {								\
-    union _FP_UNION_##fs *_flo =				\
-      (union _FP_UNION_##fs *)(val);				\
-								\
-    _flo->bits.frac = X##_f;					\
-    _flo->bits.exp  = X##_e;					\
-    _flo->bits.sign = X##_s;					\
-  } while (0)
+#define _FP_PACK_RAW_1_P(fs, val, X)					\
+  do									\
+    {									\
+      union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val);	\
+									\
+      _flo->bits.frac = X##_f;						\
+      _flo->bits.exp  = X##_e;						\
+      _flo->bits.sign = X##_s;						\
+    }									\
+  while (0)
 
 
 /*
@@ -137,59 +151,88 @@
 /* Basic.  Assuming the host word size is >= 2*FRACBITS, we can do the
    multiplication immediately.  */
 
+#define _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y)	\
+  do							\
+    {							\
+      R##_f = X##_f * Y##_f;				\
+    }							\
+  while (0)
+
 #define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y)				\
-  do {									\
-    R##_f = X##_f * Y##_f;						\
-    /* Normalize since we know where the msb of the multiplicands	\
-       were (bit B), we know that the msb of the of the product is	\
-       at either 2B or 2B-1.  */					\
-    _FP_FRAC_SRS_1(R, wfracbits-1, 2*wfracbits);			\
-  } while (0)
+  do									\
+    {									\
+      _FP_MUL_MEAT_DW_1_imm (wfracbits, R, X, Y);			\
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_1 (R, wfracbits-1, 2*wfracbits);			\
+    }									\
+  while (0)
 
 /* Given a 1W * 1W => 2W primitive, do the extended multiplication.  */
 
+#define _FP_MUL_MEAT_DW_1_wide(wfracbits, R, X, Y, doit)	\
+  do								\
+    {								\
+      doit (R##_f1, R##_f0, X##_f, Y##_f);			\
+    }								\
+  while (0)
+
 #define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit)			\
-  do {									\
-    _FP_W_TYPE _Z_f0, _Z_f1;						\
-    doit(_Z_f1, _Z_f0, X##_f, Y##_f);					\
-    /* Normalize since we know where the msb of the multiplicands	\
-       were (bit B), we know that the msb of the of the product is	\
-       at either 2B or 2B-1.  */					\
-    _FP_FRAC_SRS_2(_Z, wfracbits-1, 2*wfracbits);			\
-    R##_f = _Z_f0;							\
-  } while (0)
+  do									\
+    {									\
+      _FP_FRAC_DECL_2 (_Z);						\
+      _FP_MUL_MEAT_DW_1_wide (wfracbits, _Z, X, Y, doit);		\
+      /* Normalize since we know where the msb of the multiplicands	\
+	 were (bit B), we know that the msb of the of the product is	\
+	 at either 2B or 2B-1.  */					\
+      _FP_FRAC_SRS_2 (_Z, wfracbits-1, 2*wfracbits);			\
+      R##_f = _Z_f0;							\
+    }									\
+  while (0)
 
 /* Finally, a simple widening multiply algorithm.  What fun!  */
 
-#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)				\
-  do {									\
-    _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1;		\
+#define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y)			\
+  do									\
+    {									\
+      _FP_W_TYPE _xh, _xl, _yh, _yl;					\
+      _FP_FRAC_DECL_2 (_a);						\
 									\
-    /* split the words in half */					\
-    _xh = X##_f >> (_FP_W_TYPE_SIZE/2);					\
-    _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);		\
-    _yh = Y##_f >> (_FP_W_TYPE_SIZE/2);					\
-    _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1);		\
+      /* split the words in half */					\
+      _xh = X##_f >> (_FP_W_TYPE_SIZE/2);				\
+      _xl = X##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
+      _yh = Y##_f >> (_FP_W_TYPE_SIZE/2);				\
+      _yl = Y##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1);	\
 									\
-    /* multiply the pieces */						\
-    _z_f0 = _xl * _yl;							\
-    _a_f0 = _xh * _yl;							\
-    _a_f1 = _xl * _yh;							\
-    _z_f1 = _xh * _yh;							\
+      /* multiply the pieces */						\
+      R##_f0 = _xl * _yl;						\
+      _a_f0 = _xh * _yl;						\
+      _a_f1 = _xl * _yh;						\
+      R##_f1 = _xh * _yh;						\
 									\
-    /* reassemble into two full words */				\
-    if ((_a_f0 += _a_f1) < _a_f1)					\
-      _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2);			\
-    _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2);				\
-    _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2);				\
-    _FP_FRAC_ADD_2(_z, _z, _a);						\
-									\
-    /* normalize */							\
-    _FP_FRAC_SRS_2(_z, wfracbits - 1, 2*wfracbits);			\
-    R##_f = _z_f0;							\
-  } while (0)
+      /* reassemble into two full words */				\
+      if ((_a_f0 += _a_f1) < _a_f1)					\
+	R##_f1 += (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2);		\
+      _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2);				\
+      _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2);				\
+      _FP_FRAC_ADD_2 (R, R, _a);					\
+    }									\
+  while (0)
 
+#define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y)		\
+  do							\
+    {							\
+      _FP_FRAC_DECL_2 (_z);				\
+      _FP_MUL_MEAT_DW_1_hard (wfracbits, _z, X, Y);	\
+							\
+      /* normalize */					\
+      _FP_FRAC_SRS_2 (_z, wfracbits - 1, 2*wfracbits);	\
+      R##_f = _z_f0;					\
+    }							\
+  while (0)
 
+
 /*
  * Division algorithms:
  */
@@ -199,15 +242,17 @@
    C primitives or _FP_DIV_HELP_ldiv for the ISO function.  Which you
    choose will depend on what the compiler does with divrem4.  */
 
-#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)		\
-  do {							\
-    _FP_W_TYPE _q, _r;					\
-    X##_f <<= (X##_f < Y##_f				\
-	       ? R##_e--, _FP_WFRACBITS_##fs		\
-	       : _FP_WFRACBITS_##fs - 1);		\
-    doit(_q, _r, X##_f, Y##_f);				\
-    R##_f = _q | (_r != 0);				\
-  } while (0)
+#define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit)	\
+  do						\
+    {						\
+      _FP_W_TYPE _q, _r;			\
+      X##_f <<= (X##_f < Y##_f			\
+		 ? R##_e--, _FP_WFRACBITS_##fs	\
+		 : _FP_WFRACBITS_##fs - 1);	\
+      doit (_q, _r, X##_f, Y##_f);		\
+      R##_f = _q | (_r != 0);			\
+    }						\
+  while (0)
 
 /* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd
    that may be useful in this situation.  This first is for a primitive
@@ -215,46 +260,50 @@
    for UDIV_NEEDS_NORMALIZATION to tell which your machine needs.  */
 
 #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y)				\
-  do {									\
-    _FP_W_TYPE _nh, _nl, _q, _r, _y;					\
+  do									\
+    {									\
+      _FP_W_TYPE _nh, _nl, _q, _r, _y;					\
 									\
-    /* Normalize Y -- i.e. make the most significant bit set.  */	\
-    _y = Y##_f << _FP_WFRACXBITS_##fs;					\
+      /* Normalize Y -- i.e. make the most significant bit set.  */	\
+      _y = Y##_f << _FP_WFRACXBITS_##fs;				\
 									\
-    /* Shift X op correspondingly high, that is, up one full word.  */	\
-    if (X##_f < Y##_f)							\
-      {									\
-	R##_e--;							\
-	_nl = 0;							\
-	_nh = X##_f;							\
-      }									\
-    else								\
-      {									\
-	_nl = X##_f << (_FP_W_TYPE_SIZE - 1);				\
-	_nh = X##_f >> 1;						\
-      }									\
+      /* Shift X op correspondingly high, that is, up one full word.  */ \
+      if (X##_f < Y##_f)						\
+	{								\
+	  R##_e--;							\
+	  _nl = 0;							\
+	  _nh = X##_f;							\
+	}								\
+      else								\
+	{								\
+	  _nl = X##_f << (_FP_W_TYPE_SIZE - 1);				\
+	  _nh = X##_f >> 1;						\
+	}								\
 									\
-    udiv_qrnnd(_q, _r, _nh, _nl, _y);					\
-    R##_f = _q | (_r != 0);						\
-  } while (0)
+      udiv_qrnnd (_q, _r, _nh, _nl, _y);				\
+      R##_f = _q | (_r != 0);						\
+    }									\
+  while (0)
 
 #define _FP_DIV_MEAT_1_udiv(fs, R, X, Y)		\
-  do {							\
-    _FP_W_TYPE _nh, _nl, _q, _r;			\
-    if (X##_f < Y##_f)					\
-      {							\
-	R##_e--;					\
-	_nl = X##_f << _FP_WFRACBITS_##fs;		\
-	_nh = X##_f >> _FP_WFRACXBITS_##fs;		\
-      }							\
-    else						\
-      {							\
-	_nl = X##_f << (_FP_WFRACBITS_##fs - 1);	\
-	_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);	\
-      }							\
-    udiv_qrnnd(_q, _r, _nh, _nl, Y##_f);		\
-    R##_f = _q | (_r != 0);				\
-  } while (0)
+  do							\
+    {							\
+      _FP_W_TYPE _nh, _nl, _q, _r;			\
+      if (X##_f < Y##_f)				\
+	{						\
+	  R##_e--;					\
+	  _nl = X##_f << _FP_WFRACBITS_##fs;		\
+	  _nh = X##_f >> _FP_WFRACXBITS_##fs;		\
+	}						\
+      else						\
+	{						\
+	  _nl = X##_f << (_FP_WFRACBITS_##fs - 1);	\
+	  _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1);	\
+	}						\
+      udiv_qrnnd (_q, _r, _nh, _nl, Y##_f);		\
+      R##_f = _q | (_r != 0);				\
+    }							\
+  while (0)
 
 
 /*
@@ -263,27 +312,29 @@
  * should be added for those machines where division is fast.
  */
 
-#define _FP_SQRT_MEAT_1(R, S, T, X, q)			\
-  do {							\
-    while (q != _FP_WORK_ROUND)				\
-      {							\
-        T##_f = S##_f + q;				\
-        if (T##_f <= X##_f)				\
-          {						\
-            S##_f = T##_f + q;				\
-            X##_f -= T##_f;				\
-            R##_f += q;					\
-          }						\
-        _FP_FRAC_SLL_1(X, 1);				\
-        q >>= 1;					\
-      }							\
-    if (X##_f)						\
-      {							\
-	if (S##_f < X##_f)				\
-	  R##_f |= _FP_WORK_ROUND;			\
-	R##_f |= _FP_WORK_STICKY;			\
-      }							\
-  } while (0)
+#define _FP_SQRT_MEAT_1(R, S, T, X, q)		\
+  do						\
+    {						\
+      while (q != _FP_WORK_ROUND)		\
+	{					\
+	  T##_f = S##_f + q;			\
+	  if (T##_f <= X##_f)			\
+	    {					\
+	      S##_f = T##_f + q;		\
+	      X##_f -= T##_f;			\
+	      R##_f += q;			\
+	    }					\
+	  _FP_FRAC_SLL_1 (X, 1);		\
+	  q >>= 1;				\
+	}					\
+      if (X##_f)				\
+	{					\
+	  if (S##_f < X##_f)			\
+	    R##_f |= _FP_WORK_ROUND;		\
+	  R##_f |= _FP_WORK_STICKY;		\
+	}					\
+    }						\
+  while (0)
 
 /*
  * Assembly/disassembly for converting to/from integral types.
Index: libgcc/soft-fp/soft-fp.h
===================================================================
--- libgcc/soft-fp/soft-fp.h	(revision 204460)
+++ libgcc/soft-fp/soft-fp.h	(working copy)
@@ -33,25 +33,25 @@
 #define SOFT_FP_H
 
 #ifdef _LIBC
-#include <sfp-machine.h>
+# include <sfp-machine.h>
 #else
-#include "sfp-machine.h"
+# include "sfp-machine.h"
 #endif
 
 /* Allow sfp-machine to have its own byte order definitions. */
 #ifndef __BYTE_ORDER
-#ifdef _LIBC
-#include <endian.h>
-#else
-#error "endianness not defined by sfp-machine.h"
+# ifdef _LIBC
+#  include <endian.h>
+# else
+#  error "endianness not defined by sfp-machine.h"
+# endif
 #endif
-#endif
 
 #define _FP_WORKBITS		3
-#define _FP_WORK_LSB		((_FP_W_TYPE)1 << 3)
-#define _FP_WORK_ROUND		((_FP_W_TYPE)1 << 2)
-#define _FP_WORK_GUARD		((_FP_W_TYPE)1 << 1)
-#define _FP_WORK_STICKY		((_FP_W_TYPE)1 << 0)
+#define _FP_WORK_LSB		((_FP_W_TYPE) 1 << 3)
+#define _FP_WORK_ROUND		((_FP_W_TYPE) 1 << 2)
+#define _FP_WORK_GUARD		((_FP_W_TYPE) 1 << 1)
+#define _FP_WORK_STICKY		((_FP_W_TYPE) 1 << 0)
 
 #ifndef FP_RND_NEAREST
 # define FP_RND_NEAREST		0
@@ -65,22 +65,22 @@
 
 /* By default don't care about exceptions. */
 #ifndef FP_EX_INVALID
-#define FP_EX_INVALID		0
+# define FP_EX_INVALID		0
 #endif
 #ifndef FP_EX_OVERFLOW
-#define FP_EX_OVERFLOW		0
+# define FP_EX_OVERFLOW		0
 #endif
 #ifndef FP_EX_UNDERFLOW
-#define FP_EX_UNDERFLOW		0
+# define FP_EX_UNDERFLOW	0
 #endif
 #ifndef FP_EX_DIVZERO
-#define FP_EX_DIVZERO		0
+# define FP_EX_DIVZERO		0
 #endif
 #ifndef FP_EX_INEXACT
-#define FP_EX_INEXACT		0
+# define FP_EX_INEXACT		0
 #endif
 #ifndef FP_EX_DENORM
-#define FP_EX_DENORM		0
+# define FP_EX_DENORM		0
 #endif
 
 /* _FP_STRUCT_LAYOUT may be defined as an attribute to determine the
@@ -90,23 +90,31 @@
    differences in how consecutive bit-fields are laid out from the
    default expected by soft-fp.  */
 #ifndef _FP_STRUCT_LAYOUT
-#define _FP_STRUCT_LAYOUT
+# define _FP_STRUCT_LAYOUT
 #endif
 
 #ifdef _FP_DECL_EX
-#define FP_DECL_EX					\
+# define FP_DECL_EX					\
   int _fex = 0;						\
   _FP_DECL_EX
 #else
-#define FP_DECL_EX int _fex = 0
+# define FP_DECL_EX int _fex = 0
 #endif
 
+/* Initialize any machine-specific state used in FP_ROUNDMODE,
+   FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS.  */
 #ifndef FP_INIT_ROUNDMODE
-#define FP_INIT_ROUNDMODE do {} while (0)
+# define FP_INIT_ROUNDMODE do {} while (0)
 #endif
 
+/* Initialize any machine-specific state used in
+   FP_HANDLE_EXCEPTIONS.  */
+#ifndef FP_INIT_EXCEPTIONS
+# define FP_INIT_EXCEPTIONS FP_INIT_ROUNDMODE
+#endif
+
 #ifndef FP_HANDLE_EXCEPTIONS
-#define FP_HANDLE_EXCEPTIONS do {} while (0)
+# define FP_HANDLE_EXCEPTIONS do {} while (0)
 #endif
 
 #ifndef FP_INHIBIT_RESULTS
@@ -115,15 +123,12 @@
  * check if some exceptions are unmasked
  * and inhibit it in such a case.
  */
-#define FP_INHIBIT_RESULTS 0
+# define FP_INHIBIT_RESULTS 0
 #endif
 
 #define FP_SET_EXCEPTION(ex)				\
   _fex |= (ex)
 
-#define FP_UNSET_EXCEPTION(ex)				\
-  _fex &= ~(ex)
-
 #define FP_CLEAR_EXCEPTIONS				\
   _fex = 0
 
@@ -131,58 +136,90 @@
   (_fex)
 
 #ifndef FP_TRAPPING_EXCEPTIONS
-#define FP_TRAPPING_EXCEPTIONS 0
+# define FP_TRAPPING_EXCEPTIONS 0
 #endif
 
-#define _FP_ROUND_NEAREST(wc, X)			\
-do {							\
-    if ((_FP_FRAC_LOW_##wc(X) & 15) != _FP_WORK_ROUND)	\
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);		\
-} while (0)
+/* A file using soft-fp may define FP_NO_EXCEPTIONS before including
+   soft-fp.h to indicate that, although a macro used there could raise
+   exceptions, or do rounding and potentially thereby raise
+   exceptions, for some arguments, for the particular arguments used
+   in that file no exceptions or rounding can occur.  Such a file
+   should not itself use macros relating to handling exceptions and
+   rounding modes; this is only for indirect uses (in particular, in
+   _FP_FROM_INT and the macros it calls).  */
+#ifdef FP_NO_EXCEPTIONS
 
-#define _FP_ROUND_ZERO(wc, X)		(void)0
+# undef FP_SET_EXCEPTION
+# define FP_SET_EXCEPTION(ex) do {} while (0)
 
+# undef FP_CUR_EXCEPTIONS
+# define FP_CUR_EXCEPTIONS 0
+
+# undef FP_TRAPPING_EXCEPTIONS
+# define FP_TRAPPING_EXCEPTIONS 0
+
+# undef FP_ROUNDMODE
+# define FP_ROUNDMODE FP_RND_ZERO
+
+#endif
+
+#define _FP_ROUND_NEAREST(wc, X)				\
+  do								\
+    {								\
+      if ((_FP_FRAC_LOW_##wc (X) & 15) != _FP_WORK_ROUND)	\
+	_FP_FRAC_ADDI_##wc (X, _FP_WORK_ROUND);			\
+    }								\
+  while (0)
+
+#define _FP_ROUND_ZERO(wc, X)		(void) 0
+
 #define _FP_ROUND_PINF(wc, X)				\
-do {							\
-    if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
-} while (0)
+  do							\
+    {							\
+      if (!X##_s && (_FP_FRAC_LOW_##wc (X) & 7))	\
+	_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB);		\
+    }							\
+  while (0)
 
-#define _FP_ROUND_MINF(wc, X)				\
-do {							\
-    if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7))		\
-      _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB);		\
-} while (0)
+#define _FP_ROUND_MINF(wc, X)			\
+  do						\
+    {						\
+      if (X##_s && (_FP_FRAC_LOW_##wc (X) & 7))	\
+	_FP_FRAC_ADDI_##wc (X, _FP_WORK_LSB);	\
+    }						\
+  while (0)
 
 #define _FP_ROUND(wc, X)			\
-do {						\
-	if (_FP_FRAC_LOW_##wc(X) & 7)		\
-	  {					\
-	    FP_SET_EXCEPTION(FP_EX_INEXACT);	\
-	    switch (FP_ROUNDMODE)		\
-	      {					\
-	      case FP_RND_NEAREST:		\
-		_FP_ROUND_NEAREST(wc,X);	\
-		break;				\
-	      case FP_RND_ZERO:			\
-		_FP_ROUND_ZERO(wc,X);		\
-		break;				\
-	      case FP_RND_PINF:			\
-		_FP_ROUND_PINF(wc,X);		\
-		break;				\
-	      case FP_RND_MINF:			\
-		_FP_ROUND_MINF(wc,X);		\
-		break;				\
-	      }					\
-	  }					\
-} while (0)
+  do						\
+    {						\
+      if (_FP_FRAC_LOW_##wc (X) & 7)		\
+	{					\
+	  FP_SET_EXCEPTION (FP_EX_INEXACT);	\
+	  switch (FP_ROUNDMODE)			\
+	    {					\
+	    case FP_RND_NEAREST:		\
+	      _FP_ROUND_NEAREST (wc, X);	\
+	      break;				\
+	    case FP_RND_ZERO:			\
+	      _FP_ROUND_ZERO (wc, X);		\
+	      break;				\
+	    case FP_RND_PINF:			\
+	      _FP_ROUND_PINF (wc, X);		\
+	      break;				\
+	    case FP_RND_MINF:			\
+	      _FP_ROUND_MINF (wc, X);		\
+	      break;				\
+	    }					\
+	}					\
+    }						\
+  while (0)
 
 #define FP_CLS_NORMAL		0
 #define FP_CLS_ZERO		1
 #define FP_CLS_INF		2
 #define FP_CLS_NAN		3
 
-#define _FP_CLS_COMBINE(x,y)	(((x) << 2) | (y))
+#define _FP_CLS_COMBINE(x, y)	(((x) << 2) | (y))
 
 #include "op-1.h"
 #include "op-2.h"
@@ -194,35 +231,35 @@
 #define UWtype		_FP_W_TYPE
 #define W_TYPE_SIZE	_FP_W_TYPE_SIZE
 
-typedef int QItype __attribute__((mode(QI)));
-typedef int SItype __attribute__((mode(SI)));
-typedef int DItype __attribute__((mode(DI)));
-typedef unsigned int UQItype __attribute__((mode(QI)));
-typedef unsigned int USItype __attribute__((mode(SI)));
-typedef unsigned int UDItype __attribute__((mode(DI)));
+typedef int QItype __attribute__ ((mode (QI)));
+typedef int SItype __attribute__ ((mode (SI)));
+typedef int DItype __attribute__ ((mode (DI)));
+typedef unsigned int UQItype __attribute__ ((mode (QI)));
+typedef unsigned int USItype __attribute__ ((mode (SI)));
+typedef unsigned int UDItype __attribute__ ((mode (DI)));
 #if _FP_W_TYPE_SIZE == 32
-typedef unsigned int UHWtype __attribute__((mode(HI)));
+typedef unsigned int UHWtype __attribute__ ((mode (HI)));
 #elif _FP_W_TYPE_SIZE == 64
 typedef USItype UHWtype;
 #endif
 
 #ifndef CMPtype
-#define CMPtype		int
+# define CMPtype	int
 #endif
 
-#define SI_BITS		(__CHAR_BIT__ * (int)sizeof(SItype))
-#define DI_BITS		(__CHAR_BIT__ * (int)sizeof(DItype))
+#define SI_BITS		(__CHAR_BIT__ * (int) sizeof (SItype))
+#define DI_BITS		(__CHAR_BIT__ * (int) sizeof (DItype))
 
 #ifndef umul_ppmm
-#ifdef _LIBC
-#include <stdlib/longlong.h>
-#else
-#include "longlong.h"
+# ifdef _LIBC
+#  include <stdlib/longlong.h>
+# else
+#  include "longlong.h"
+# endif
 #endif
-#endif
 
 #ifdef _LIBC
-#include <stdlib.h>
+# include <stdlib.h>
 #else
 extern void abort (void);
 #endif
Index: libgcc/soft-fp/fixunsdfti.c
===================================================================
--- libgcc/soft-fp/fixunsdfti.c	(revision 204460)
+++ libgcc/soft-fp/fixunsdfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE double to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "double.h"
 
-UTItype __fixunsdfti(DFtype a)
+UTItype
+__fixunsdfti (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   UTItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, TI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, TI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixunstfdi.c
===================================================================
--- libgcc/soft-fp/fixunstfdi.c	(revision 204460)
+++ libgcc/soft-fp/fixunstfdi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-UDItype __fixunstfdi(TFtype a)
+UDItype
+__fixunstfdi (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   UDItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, DI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/adddf3.c
===================================================================
--- libgcc/soft-fp/adddf3.c	(revision 204460)
+++ libgcc/soft-fp/adddf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __adddf3(DFtype a, DFtype b)
+DFtype
+__adddf3 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
+  FP_DECL_D (R);
   DFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_D(A, a);
-  FP_UNPACK_SEMIRAW_D(B, b);
-  FP_ADD_D(R, A, B);
-  FP_PACK_SEMIRAW_D(r, R);
+  FP_UNPACK_SEMIRAW_D (A, a);
+  FP_UNPACK_SEMIRAW_D (B, b);
+  FP_ADD_D (R, A, B);
+  FP_PACK_SEMIRAW_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/gedf2.c
===================================================================
--- libgcc/soft-fp/gedf2.c	(revision 204460)
+++ libgcc/soft-fp/gedf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "double.h"
 
-CMPtype __gedf2(DFtype a, DFtype b)
+CMPtype
+__gedf2 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_D(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_UNPACK_RAW_D (B, b);
+  FP_CMP_D (r, A, B, -2);
+  if (r == -2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__gedf2, __gtdf2);
+strong_alias (__gedf2, __gtdf2);
Index: libgcc/soft-fp/fixdfsi.c
===================================================================
--- libgcc/soft-fp/fixdfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixdfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-SItype __fixdfsi(DFtype a)
+SItype
+__fixdfsi (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   USItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, SI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/eqdf2.c
===================================================================
--- libgcc/soft-fp/eqdf2.c	(revision 204460)
+++ libgcc/soft-fp/eqdf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "double.h"
 
-CMPtype __eqdf2(DFtype a, DFtype b)
+CMPtype
+__eqdf2 (DFtype a, DFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_D(A); FP_DECL_D(B);
+  FP_DECL_D (A);
+  FP_DECL_D (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_UNPACK_RAW_D(B, b);
-  FP_CMP_EQ_D(r, A, B);
-  if (r && (FP_ISSIGNAN_D(A) || FP_ISSIGNAN_D(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_UNPACK_RAW_D (B, b);
+  FP_CMP_EQ_D (r, A, B);
+  if (r && (FP_ISSIGNAN_D (A) || FP_ISSIGNAN_D (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__eqdf2, __nedf2);
+strong_alias (__eqdf2, __nedf2);
Index: libgcc/soft-fp/fixunssfsi.c
===================================================================
--- libgcc/soft-fp/fixunssfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixunssfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "single.h"
 
-USItype __fixunssfsi(SFtype a)
+USItype
+__fixunssfsi (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
+  FP_DECL_S (A);
   USItype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, SI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_TO_INT_S (r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixunstfti.c
===================================================================
--- libgcc/soft-fp/fixunstfti.c	(revision 204460)
+++ libgcc/soft-fp/fixunstfti.c	(working copy)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert IEEE quad to 128bit unsigned integer
-   Copyright (C) 2007 Free Software Foundation, Inc.
+   Copyright (C) 2007-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Uros Bizjak (ubizjak@gmail.com).
 
@@ -24,21 +24,22 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include "soft-fp.h"
 #include "quad.h"
 
-UTItype __fixunstfti(TFtype a)
+UTItype
+__fixunstfti (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   UTItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, TI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, TI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/addsf3.c
===================================================================
--- libgcc/soft-fp/addsf3.c	(revision 204460)
+++ libgcc/soft-fp/addsf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SFtype __addsf3(SFtype a, SFtype b)
+SFtype
+__addsf3 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
+  FP_DECL_S (R);
   SFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_S(A, a);
-  FP_UNPACK_SEMIRAW_S(B, b);
-  FP_ADD_S(R, A, B);
-  FP_PACK_SEMIRAW_S(r, R);
+  FP_UNPACK_SEMIRAW_S (A, a);
+  FP_UNPACK_SEMIRAW_S (B, b);
+  FP_ADD_S (R, A, B);
+  FP_PACK_SEMIRAW_S (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/extended.h
===================================================================
--- libgcc/soft-fp/extended.h	(revision 204460)
+++ libgcc/soft-fp/extended.h	(working copy)
@@ -28,13 +28,15 @@
    <http://www.gnu.org/licenses/>.  */
 
 #if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel, kid. Go buy yourself a real computer."
+# error "Here's a nickel, kid. Go buy yourself a real computer."
 #endif
 
 #if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_E         (4*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_E	(4*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_DW_E	(8*_FP_W_TYPE_SIZE)
 #else
-#define _FP_FRACTBITS_E		(2*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_E	(2*_FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_DW_E	(4*_FP_W_TYPE_SIZE)
 #endif
 
 #define _FP_FRACBITS_E		64
@@ -46,152 +48,187 @@
 #define _FP_EXPMAX_E		32767
 
 #define _FP_QNANBIT_E		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-2) % _FP_W_TYPE_SIZE)
 #define _FP_QNANBIT_SH_E		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_E		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-1) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_SH_E		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_E-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_OVERFLOW_E		\
-	((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
+	((_FP_W_TYPE) 1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
 
-typedef float XFtype __attribute__((mode(XF)));
+#define _FP_WFRACBITS_DW_E	(2 * _FP_WFRACBITS_E)
+#define _FP_WFRACXBITS_DW_E	(_FP_FRACTBITS_DW_E - _FP_WFRACBITS_DW_E)
+#define _FP_HIGHBIT_DW_E	\
+  ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_E - 1) % _FP_W_TYPE_SIZE)
 
+typedef float XFtype __attribute__ ((mode (XF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_E
 {
-   XFtype flt;
-   struct _FP_STRUCT_LAYOUT
-   {
-#if __BYTE_ORDER == __BIG_ENDIAN
-      unsigned long pad1 : _FP_W_TYPE_SIZE;
-      unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
-      unsigned long sign : 1;
-      unsigned long exp : _FP_EXPBITS_E;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-#else
-      unsigned long frac0 : _FP_W_TYPE_SIZE;
-      unsigned long frac1 : _FP_W_TYPE_SIZE;
-      unsigned exp : _FP_EXPBITS_E;
-      unsigned sign : 1;
-#endif /* not bigendian */
-   } bits __attribute__((packed));
+  XFtype flt;
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
+    unsigned long pad1 : _FP_W_TYPE_SIZE;
+    unsigned long pad2 : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
+    unsigned long sign : 1;
+    unsigned long exp : _FP_EXPBITS_E;
+    unsigned long frac1 : _FP_W_TYPE_SIZE;
+    unsigned long frac0 : _FP_W_TYPE_SIZE;
+# else
+    unsigned long frac0 : _FP_W_TYPE_SIZE;
+    unsigned long frac1 : _FP_W_TYPE_SIZE;
+    unsigned exp : _FP_EXPBITS_E;
+    unsigned sign : 1;
+# endif /* not bigendian */
+  } bits __attribute__ ((packed));
 };
 
 
-#define FP_DECL_E(X)		_FP_DECL(4,X)
+# define FP_DECL_E(X)		_FP_DECL (4, X)
 
-#define FP_UNPACK_RAW_E(X, val)				\
-  do {							\
-    union _FP_UNION_E _flo; _flo.flt = (val);		\
-							\
-    X##_f[2] = 0; X##_f[3] = 0;				\
-    X##_f[0] = _flo.bits.frac0;				\
-    X##_f[1] = _flo.bits.frac1;				\
-    X##_e  = _flo.bits.exp;				\
-    X##_s  = _flo.bits.sign;				\
-  } while (0)
+# define FP_UNPACK_RAW_E(X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_E _flo;			\
+      _flo.flt = (val);				\
+						\
+      X##_f[2] = 0;				\
+      X##_f[3] = 0;				\
+      X##_f[0] = _flo.bits.frac0;		\
+      X##_f[1] = _flo.bits.frac1;		\
+      X##_e  = _flo.bits.exp;			\
+      X##_s  = _flo.bits.sign;			\
+    }						\
+  while (0)
 
-#define FP_UNPACK_RAW_EP(X, val)			\
-  do {							\
-    union _FP_UNION_E *_flo =				\
-    (union _FP_UNION_E *)(val);				\
-							\
-    X##_f[2] = 0; X##_f[3] = 0;				\
-    X##_f[0] = _flo->bits.frac0;			\
-    X##_f[1] = _flo->bits.frac1;			\
-    X##_e  = _flo->bits.exp;				\
-    X##_s  = _flo->bits.sign;				\
-  } while (0)
+# define FP_UNPACK_RAW_EP(X, val)				\
+  do								\
+    {								\
+      union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
+								\
+      X##_f[2] = 0;						\
+      X##_f[3] = 0;						\
+      X##_f[0] = _flo->bits.frac0;				\
+      X##_f[1] = _flo->bits.frac1;				\
+      X##_e  = _flo->bits.exp;					\
+      X##_s  = _flo->bits.sign;					\
+    }								\
+  while (0)
 
-#define FP_PACK_RAW_E(val, X)				\
-  do {							\
-    union _FP_UNION_E _flo;				\
-							\
-    if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;		\
-    else X##_f[1] &= ~(_FP_IMPLBIT_E);			\
-    _flo.bits.frac0 = X##_f[0];				\
-    _flo.bits.frac1 = X##_f[1];				\
-    _flo.bits.exp   = X##_e;				\
-    _flo.bits.sign  = X##_s;				\
-							\
-    (val) = _flo.flt;					\
-  } while (0)
+# define FP_PACK_RAW_E(val, X)			\
+  do						\
+    {						\
+      union _FP_UNION_E _flo;			\
+						\
+      if (X##_e)				\
+	X##_f[1] |= _FP_IMPLBIT_E;		\
+      else					\
+	X##_f[1] &= ~(_FP_IMPLBIT_E);		\
+      _flo.bits.frac0 = X##_f[0];		\
+      _flo.bits.frac1 = X##_f[1];		\
+      _flo.bits.exp   = X##_e;			\
+      _flo.bits.sign  = X##_s;			\
+						\
+      (val) = _flo.flt;				\
+    }						\
+  while (0)
 
-#define FP_PACK_RAW_EP(val, X)				\
-  do {							\
-    if (!FP_INHIBIT_RESULTS)				\
-      {							\
-	union _FP_UNION_E *_flo =			\
-	  (union _FP_UNION_E *)(val);			\
-							\
-	if (X##_e) X##_f[1] |= _FP_IMPLBIT_E;		\
-	else X##_f[1] &= ~(_FP_IMPLBIT_E);		\
-	_flo->bits.frac0 = X##_f[0];			\
-	_flo->bits.frac1 = X##_f[1];			\
-	_flo->bits.exp   = X##_e;			\
-	_flo->bits.sign  = X##_s;			\
-      }							\
-  } while (0)
+# define FP_PACK_RAW_EP(val, X)						\
+  do									\
+    {									\
+      if (!FP_INHIBIT_RESULTS)						\
+	{								\
+	  union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
+									\
+	  if (X##_e)							\
+	    X##_f[1] |= _FP_IMPLBIT_E;					\
+	  else								\
+	    X##_f[1] &= ~(_FP_IMPLBIT_E);				\
+	  _flo->bits.frac0 = X##_f[0];					\
+	  _flo->bits.frac1 = X##_f[1];					\
+	  _flo->bits.exp   = X##_e;					\
+	  _flo->bits.sign  = X##_s;					\
+	}								\
+    }									\
+  while (0)
 
-#define FP_UNPACK_E(X,val)		\
-  do {					\
-    FP_UNPACK_RAW_E(X,val);		\
-    _FP_UNPACK_CANONICAL(E,4,X);	\
-  } while (0)
+# define FP_UNPACK_E(X, val)			\
+  do						\
+    {						\
+      FP_UNPACK_RAW_E (X, val);			\
+      _FP_UNPACK_CANONICAL (E, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_EP(X,val)		\
-  do {					\
-    FP_UNPACK_RAW_EP(X,val);		\
-    _FP_UNPACK_CANONICAL(E,4,X);	\
-  } while (0)
+# define FP_UNPACK_EP(X, val)			\
+  do						\
+    {						\
+      FP_UNPACK_RAW_EP (X, val);		\
+      _FP_UNPACK_CANONICAL (E, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_E(X,val)	\
-  do {					\
-    FP_UNPACK_RAW_E(X,val);		\
-    _FP_UNPACK_SEMIRAW(E,4,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_E(X, val)		\
+  do						\
+    {						\
+      FP_UNPACK_RAW_E (X, val);			\
+      _FP_UNPACK_SEMIRAW (E, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_EP(X,val)	\
-  do {					\
-    FP_UNPACK_RAW_EP(X,val);		\
-    _FP_UNPACK_SEMIRAW(E,4,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_EP(X, val)		\
+  do						\
+    {						\
+      FP_UNPACK_RAW_EP (X, val);		\
+      _FP_UNPACK_SEMIRAW (E, 4, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_E(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(E,4,X);		\
-    FP_PACK_RAW_E(val,X);		\
-  } while (0)
+# define FP_PACK_E(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (E, 4, X);		\
+      FP_PACK_RAW_E (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_EP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(E,4,X);		\
-    FP_PACK_RAW_EP(val,X);		\
-  } while (0)
+# define FP_PACK_EP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (E, 4, X);		\
+      FP_PACK_RAW_EP (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_E(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(E,4,X);		\
-    FP_PACK_RAW_E(val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_E(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (E, 4, X);		\
+      FP_PACK_RAW_E (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_EP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(E,4,X);		\
-    FP_PACK_RAW_EP(val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_EP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (E, 4, X);		\
+      FP_PACK_RAW_EP (val, X);			\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_E(X)	_FP_ISSIGNAN(E,4,X)
-#define FP_NEG_E(R,X)		_FP_NEG(E,4,R,X)
-#define FP_ADD_E(R,X,Y)		_FP_ADD(E,4,R,X,Y)
-#define FP_SUB_E(R,X,Y)		_FP_SUB(E,4,R,X,Y)
-#define FP_MUL_E(R,X,Y)		_FP_MUL(E,4,R,X,Y)
-#define FP_DIV_E(R,X,Y)		_FP_DIV(E,4,R,X,Y)
-#define FP_SQRT_E(R,X)		_FP_SQRT(E,4,R,X)
+# define FP_ISSIGNAN_E(X)	_FP_ISSIGNAN (E, 4, X)
+# define FP_NEG_E(R, X)		_FP_NEG (E, 4, R, X)
+# define FP_ADD_E(R, X, Y)	_FP_ADD (E, 4, R, X, Y)
+# define FP_SUB_E(R, X, Y)	_FP_SUB (E, 4, R, X, Y)
+# define FP_MUL_E(R, X, Y)	_FP_MUL (E, 4, R, X, Y)
+# define FP_DIV_E(R, X, Y)	_FP_DIV (E, 4, R, X, Y)
+# define FP_SQRT_E(R, X)	_FP_SQRT (E, 4, R, X)
+# define FP_FMA_E(R, X, Y, Z)	_FP_FMA (E, 4, 8, R, X, Y, Z)
 
 /*
  * Square root algorithms:
@@ -204,185 +241,218 @@
  * in two UWtype registers instead of four.
  */
 
-#define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
-  do {							\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);		\
-    _FP_FRAC_SRL_4(X, (_FP_WORKBITS));			\
-    while (q)						\
-      {							\
-	T##_f[1] = S##_f[1] + q;			\
-	if (T##_f[1] <= X##_f[1])			\
-	  {						\
-	    S##_f[1] = T##_f[1] + q;			\
-	    X##_f[1] -= T##_f[1];			\
-	    R##_f[1] += q;				\
-	  }						\
-	_FP_FRAC_SLL_2(X, 1);				\
-	q >>= 1;					\
-      }							\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);		\
-    while (q)						\
-      {							\
-	T##_f[0] = S##_f[0] + q;			\
-	T##_f[1] = S##_f[1];				\
-	if (T##_f[1] < X##_f[1] || 			\
-	    (T##_f[1] == X##_f[1] &&			\
-	     T##_f[0] <= X##_f[0]))			\
-	  {						\
-	    S##_f[0] = T##_f[0] + q;			\
-	    S##_f[1] += (T##_f[0] > S##_f[0]);		\
-	    _FP_FRAC_DEC_2(X, T);			\
-	    R##_f[0] += q;				\
-	  }						\
-	_FP_FRAC_SLL_2(X, 1);				\
-	q >>= 1;					\
-      }							\
-    _FP_FRAC_SLL_4(R, (_FP_WORKBITS));			\
-    if (X##_f[0] | X##_f[1])				\
-      {							\
-	if (S##_f[1] < X##_f[1] || 			\
-	    (S##_f[1] == X##_f[1] &&			\
-	     S##_f[0] < X##_f[0]))			\
-	  R##_f[0] |= _FP_WORK_ROUND;			\
-	R##_f[0] |= _FP_WORK_STICKY;			\
-      }							\
-  } while (0)
+# define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
+  do							\
+    {							\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      _FP_FRAC_SRL_4 (X, (_FP_WORKBITS));		\
+      while (q)						\
+	{						\
+	  T##_f[1] = S##_f[1] + q;			\
+	  if (T##_f[1] <= X##_f[1])			\
+	    {						\
+	      S##_f[1] = T##_f[1] + q;			\
+	      X##_f[1] -= T##_f[1];			\
+	      R##_f[1] += q;				\
+	    }						\
+	  _FP_FRAC_SLL_2 (X, 1);			\
+	  q >>= 1;					\
+	}						\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      while (q)						\
+	{						\
+	  T##_f[0] = S##_f[0] + q;			\
+	  T##_f[1] = S##_f[1];				\
+	  if (T##_f[1] < X##_f[1]			\
+	      || (T##_f[1] == X##_f[1]			\
+		  && T##_f[0] <= X##_f[0]))		\
+	    {						\
+	      S##_f[0] = T##_f[0] + q;			\
+	      S##_f[1] += (T##_f[0] > S##_f[0]);	\
+	      _FP_FRAC_DEC_2 (X, T);			\
+	      R##_f[0] += q;				\
+	    }						\
+	  _FP_FRAC_SLL_2 (X, 1);			\
+	  q >>= 1;					\
+	}						\
+      _FP_FRAC_SLL_4 (R, (_FP_WORKBITS));		\
+      if (X##_f[0] | X##_f[1])				\
+	{						\
+	  if (S##_f[1] < X##_f[1]			\
+	      || (S##_f[1] == X##_f[1]			\
+		  && S##_f[0] < X##_f[0]))		\
+	    R##_f[0] |= _FP_WORK_ROUND;			\
+	  R##_f[0] |= _FP_WORK_STICKY;			\
+	}						\
+    }							\
+  while (0)
 
-#define FP_CMP_E(r,X,Y,un)	_FP_CMP(E,4,r,X,Y,un)
-#define FP_CMP_EQ_E(r,X,Y)	_FP_CMP_EQ(E,4,r,X,Y)
-#define FP_CMP_UNORD_E(r,X,Y)	_FP_CMP_UNORD(E,4,r,X,Y)
+# define FP_CMP_E(r, X, Y, un)		_FP_CMP (E, 4, r, X, Y, un)
+# define FP_CMP_EQ_E(r, X, Y)		_FP_CMP_EQ (E, 4, r, X, Y)
+# define FP_CMP_UNORD_E(r, X, Y)	_FP_CMP_UNORD (E, 4, r, X, Y)
 
-#define FP_TO_INT_E(r,X,rsz,rsg)	_FP_TO_INT(E,4,r,X,rsz,rsg)
-#define FP_FROM_INT_E(X,r,rs,rt)	_FP_FROM_INT(E,4,X,r,rs,rt)
+# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 4, r, X, rsz, rsg)
+# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 4, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_E(X)	(X##_f[2])
-#define _FP_FRAC_HIGH_RAW_E(X)	(X##_f[1])
+# define _FP_FRAC_HIGH_E(X)	(X##_f[2])
+# define _FP_FRAC_HIGH_RAW_E(X)	(X##_f[1])
 
+# define _FP_FRAC_HIGH_DW_E(X)	(X##_f[4])
+
 #else   /* not _FP_W_TYPE_SIZE < 64 */
 union _FP_UNION_E
 {
   XFtype flt;
-  struct _FP_STRUCT_LAYOUT {
-#if __BYTE_ORDER == __BIG_ENDIAN
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
     _FP_W_TYPE pad  : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
     unsigned sign   : 1;
     unsigned exp    : _FP_EXPBITS_E;
     _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
-#else
+# else
     _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
     unsigned exp    : _FP_EXPBITS_E;
     unsigned sign   : 1;
-#endif
+# endif
   } bits;
 };
 
-#define FP_DECL_E(X)		_FP_DECL(2,X)
+# define FP_DECL_E(X)		_FP_DECL (2, X)
 
-#define FP_UNPACK_RAW_E(X, val)					\
-  do {								\
-    union _FP_UNION_E _flo; _flo.flt = (val);			\
-								\
-    X##_f0 = _flo.bits.frac;					\
-    X##_f1 = 0;							\
-    X##_e = _flo.bits.exp;					\
-    X##_s = _flo.bits.sign;					\
-  } while (0)
+# define FP_UNPACK_RAW_E(X, val)		\
+  do						\
+    {						\
+      union _FP_UNION_E _flo;			\
+      _flo.flt = (val);				\
+						\
+      X##_f0 = _flo.bits.frac;			\
+      X##_f1 = 0;				\
+      X##_e = _flo.bits.exp;			\
+      X##_s = _flo.bits.sign;			\
+    }						\
+  while (0)
 
-#define FP_UNPACK_RAW_EP(X, val)				\
-  do {								\
-    union _FP_UNION_E *_flo =					\
-      (union _FP_UNION_E *)(val);				\
+# define FP_UNPACK_RAW_EP(X, val)				\
+  do								\
+    {								\
+      union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
 								\
-    X##_f0 = _flo->bits.frac;					\
-    X##_f1 = 0;							\
-    X##_e = _flo->bits.exp;					\
-    X##_s = _flo->bits.sign;					\
-  } while (0)
+      X##_f0 = _flo->bits.frac;					\
+      X##_f1 = 0;						\
+      X##_e = _flo->bits.exp;					\
+      X##_s = _flo->bits.sign;					\
+    }								\
+  while (0)
 
-#define FP_PACK_RAW_E(val, X)					\
-  do {								\
-    union _FP_UNION_E _flo;					\
-								\
-    if (X##_e) X##_f0 |= _FP_IMPLBIT_E;				\
-    else X##_f0 &= ~(_FP_IMPLBIT_E);				\
-    _flo.bits.frac = X##_f0;					\
-    _flo.bits.exp  = X##_e;					\
-    _flo.bits.sign = X##_s;					\
-								\
-    (val) = _flo.flt;						\
-  } while (0)
+# define FP_PACK_RAW_E(val, X)			\
+  do						\
+    {						\
+      union _FP_UNION_E _flo;			\
+						\
+      if (X##_e)				\
+	X##_f0 |= _FP_IMPLBIT_E;		\
+      else					\
+	X##_f0 &= ~(_FP_IMPLBIT_E);		\
+      _flo.bits.frac = X##_f0;			\
+      _flo.bits.exp  = X##_e;			\
+      _flo.bits.sign = X##_s;			\
+						\
+      (val) = _flo.flt;				\
+    }						\
+  while (0)
 
-#define FP_PACK_RAW_EP(fs, val, X)				\
-  do {								\
-    if (!FP_INHIBIT_RESULTS)					\
-      {								\
-	union _FP_UNION_E *_flo =				\
-	  (union _FP_UNION_E *)(val);				\
-								\
-	if (X##_e) X##_f0 |= _FP_IMPLBIT_E;			\
-	else X##_f0 &= ~(_FP_IMPLBIT_E);			\
-	_flo->bits.frac = X##_f0;				\
-	_flo->bits.exp  = X##_e;				\
-	_flo->bits.sign = X##_s;				\
-      }								\
-  } while (0)
+# define FP_PACK_RAW_EP(fs, val, X)					\
+  do									\
+    {									\
+      if (!FP_INHIBIT_RESULTS)						\
+	{								\
+	  union _FP_UNION_E *_flo = (union _FP_UNION_E *) (val);	\
+									\
+	  if (X##_e)							\
+	    X##_f0 |= _FP_IMPLBIT_E;					\
+	  else								\
+	    X##_f0 &= ~(_FP_IMPLBIT_E);					\
+	  _flo->bits.frac = X##_f0;					\
+	  _flo->bits.exp  = X##_e;					\
+	  _flo->bits.sign = X##_s;					\
+	}								\
+    }									\
+  while (0)
 
 
-#define FP_UNPACK_E(X,val)		\
-  do {					\
-    FP_UNPACK_RAW_E(X,val);		\
-    _FP_UNPACK_CANONICAL(E,2,X);	\
-  } while (0)
+# define FP_UNPACK_E(X, val)			\
+  do						\
+    {						\
+      FP_UNPACK_RAW_E (X, val);			\
+      _FP_UNPACK_CANONICAL (E, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_EP(X,val)		\
-  do {					\
-    FP_UNPACK_RAW_EP(X,val);		\
-    _FP_UNPACK_CANONICAL(E,2,X);	\
-  } while (0)
+# define FP_UNPACK_EP(X, val)			\
+  do						\
+    {						\
+      FP_UNPACK_RAW_EP (X, val);		\
+      _FP_UNPACK_CANONICAL (E, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_E(X,val)	\
-  do {					\
-    FP_UNPACK_RAW_E(X,val);		\
-    _FP_UNPACK_SEMIRAW(E,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_E(X, val)		\
+  do						\
+    {						\
+      FP_UNPACK_RAW_E (X, val);			\
+      _FP_UNPACK_SEMIRAW (E, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_EP(X,val)	\
-  do {					\
-    FP_UNPACK_RAW_EP(X,val);		\
-    _FP_UNPACK_SEMIRAW(E,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_EP(X, val)		\
+  do						\
+    {						\
+      FP_UNPACK_RAW_EP (X, val);		\
+      _FP_UNPACK_SEMIRAW (E, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_E(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(E,2,X);		\
-    FP_PACK_RAW_E(val,X);		\
-  } while (0)
+# define FP_PACK_E(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (E, 2, X);		\
+      FP_PACK_RAW_E (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_EP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(E,2,X);		\
-    FP_PACK_RAW_EP(val,X);		\
-  } while (0)
+# define FP_PACK_EP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (E, 2, X);		\
+      FP_PACK_RAW_EP (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_E(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(E,2,X);		\
-    FP_PACK_RAW_E(val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_E(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (E, 2, X);		\
+      FP_PACK_RAW_E (val, X);			\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_EP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(E,2,X);		\
-    FP_PACK_RAW_EP(val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_EP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (E, 2, X);		\
+      FP_PACK_RAW_EP (val, X);			\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_E(X)	_FP_ISSIGNAN(E,2,X)
-#define FP_NEG_E(R,X)		_FP_NEG(E,2,R,X)
-#define FP_ADD_E(R,X,Y)		_FP_ADD(E,2,R,X,Y)
-#define FP_SUB_E(R,X,Y)		_FP_SUB(E,2,R,X,Y)
-#define FP_MUL_E(R,X,Y)		_FP_MUL(E,2,R,X,Y)
-#define FP_DIV_E(R,X,Y)		_FP_DIV(E,2,R,X,Y)
-#define FP_SQRT_E(R,X)		_FP_SQRT(E,2,R,X)
+# define FP_ISSIGNAN_E(X)	_FP_ISSIGNAN (E, 2, X)
+# define FP_NEG_E(R, X)		_FP_NEG (E, 2, R, X)
+# define FP_ADD_E(R, X, Y)	_FP_ADD (E, 2, R, X, Y)
+# define FP_SUB_E(R, X, Y)	_FP_SUB (E, 2, R, X, Y)
+# define FP_MUL_E(R, X, Y)	_FP_MUL (E, 2, R, X, Y)
+# define FP_DIV_E(R, X, Y)	_FP_DIV (E, 2, R, X, Y)
+# define FP_SQRT_E(R, X)	_FP_SQRT (E, 2, R, X)
+# define FP_FMA_E(R, X, Y, Z)	_FP_FMA (E, 2, 4, R, X, Y, Z)
 
 /*
  * Square root algorithms:
@@ -392,39 +462,43 @@
  * in one UWtype registers instead of two, although we don't
  * have to.
  */
-#define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
-  do {							\
-    q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1);		\
-    _FP_FRAC_SRL_2(X, (_FP_WORKBITS));			\
-    while (q)						\
-      {							\
-        T##_f0 = S##_f0 + q;				\
-        if (T##_f0 <= X##_f0)				\
-          {						\
-            S##_f0 = T##_f0 + q;			\
-            X##_f0 -= T##_f0;				\
-            R##_f0 += q;				\
-          }						\
-        _FP_FRAC_SLL_1(X, 1);				\
-        q >>= 1;					\
-      }							\
-    _FP_FRAC_SLL_2(R, (_FP_WORKBITS));			\
-    if (X##_f0)						\
-      {							\
-	if (S##_f0 < X##_f0)				\
-	  R##_f0 |= _FP_WORK_ROUND;			\
-	R##_f0 |= _FP_WORK_STICKY;			\
-      }							\
-  } while (0)
+# define _FP_SQRT_MEAT_E(R, S, T, X, q)			\
+  do							\
+    {							\
+      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);	\
+      _FP_FRAC_SRL_2 (X, (_FP_WORKBITS));		\
+      while (q)						\
+	{						\
+	  T##_f0 = S##_f0 + q;				\
+	  if (T##_f0 <= X##_f0)				\
+	    {						\
+	      S##_f0 = T##_f0 + q;			\
+	      X##_f0 -= T##_f0;				\
+	      R##_f0 += q;				\
+	    }						\
+	  _FP_FRAC_SLL_1 (X, 1);			\
+	  q >>= 1;					\
+	}						\
+      _FP_FRAC_SLL_2 (R, (_FP_WORKBITS));		\
+      if (X##_f0)					\
+	{						\
+	  if (S##_f0 < X##_f0)				\
+	    R##_f0 |= _FP_WORK_ROUND;			\
+	  R##_f0 |= _FP_WORK_STICKY;			\
+	}						\
+    }							\
+  while (0)
 
-#define FP_CMP_E(r,X,Y,un)	_FP_CMP(E,2,r,X,Y,un)
-#define FP_CMP_EQ_E(r,X,Y)	_FP_CMP_EQ(E,2,r,X,Y)
-#define FP_CMP_UNORD_E(r,X,Y)	_FP_CMP_UNORD(E,2,r,X,Y)
+# define FP_CMP_E(r, X, Y, un)		_FP_CMP (E, 2, r, X, Y, un)
+# define FP_CMP_EQ_E(r, X, Y)		_FP_CMP_EQ (E, 2, r, X, Y)
+# define FP_CMP_UNORD_E(r, X, Y)	_FP_CMP_UNORD (E, 2, r, X, Y)
 
-#define FP_TO_INT_E(r,X,rsz,rsg)	_FP_TO_INT(E,2,r,X,rsz,rsg)
-#define FP_FROM_INT_E(X,r,rs,rt)	_FP_FROM_INT(E,2,X,r,rs,rt)
+# define FP_TO_INT_E(r, X, rsz, rsg)	_FP_TO_INT (E, 2, r, X, rsz, rsg)
+# define FP_FROM_INT_E(X, r, rs, rt)	_FP_FROM_INT (E, 2, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_E(X)	(X##_f1)
-#define _FP_FRAC_HIGH_RAW_E(X)	(X##_f0)
+# define _FP_FRAC_HIGH_E(X)	(X##_f1)
+# define _FP_FRAC_HIGH_RAW_E(X)	(X##_f0)
 
+# define _FP_FRAC_HIGH_DW_E(X)	(X##_f[2])
+
 #endif /* not _FP_W_TYPE_SIZE < 64 */
Index: libgcc/soft-fp/addtf3.c
===================================================================
--- libgcc/soft-fp/addtf3.c	(revision 204460)
+++ libgcc/soft-fp/addtf3.c	(working copy)
@@ -31,17 +31,20 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-TFtype __addtf3(TFtype a, TFtype b)
+TFtype
+__addtf3 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
+  FP_DECL_Q (R);
   TFtype r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_SEMIRAW_Q(A, a);
-  FP_UNPACK_SEMIRAW_Q(B, b);
-  FP_ADD_Q(R, A, B);
-  FP_PACK_SEMIRAW_Q(r, R);
+  FP_UNPACK_SEMIRAW_Q (A, a);
+  FP_UNPACK_SEMIRAW_Q (B, b);
+  FP_ADD_Q (R, A, B);
+  FP_PACK_SEMIRAW_Q (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/gesf2.c
===================================================================
--- libgcc/soft-fp/gesf2.c	(revision 204460)
+++ libgcc/soft-fp/gesf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "single.h"
 
-CMPtype __gesf2(SFtype a, SFtype b)
+CMPtype
+__gesf2 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_S(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_UNPACK_RAW_S (B, b);
+  FP_CMP_S (r, A, B, -2);
+  if (r == -2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__gesf2, __gtsf2);
+strong_alias (__gesf2, __gtsf2);
Index: libgcc/soft-fp/getf2.c
===================================================================
--- libgcc/soft-fp/getf2.c	(revision 204460)
+++ libgcc/soft-fp/getf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-CMPtype __getf2(TFtype a, TFtype b)
+CMPtype
+__getf2 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_Q(r, A, B, -2);
-  if (r == -2 && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_UNPACK_RAW_Q (B, b);
+  FP_CMP_Q (r, A, B, -2);
+  if (r == -2)
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__getf2, __gttf2);
+strong_alias (__getf2, __gttf2);
Index: libgcc/soft-fp/op-common.h
===================================================================
--- libgcc/soft-fp/op-common.h	(revision 204460)
+++ libgcc/soft-fp/op-common.h	(working copy)
@@ -30,145 +30,157 @@
    <http://www.gnu.org/licenses/>.  */
 
 #define _FP_DECL(wc, X)				\
-  _FP_I_TYPE X##_c __attribute__((unused));	\
-  _FP_I_TYPE X##_s __attribute__((unused));	\
+  _FP_I_TYPE X##_c __attribute__ ((unused));	\
+  _FP_I_TYPE X##_s __attribute__ ((unused));	\
   _FP_I_TYPE X##_e;				\
-  _FP_FRAC_DECL_##wc(X)
+  _FP_FRAC_DECL_##wc (X)
 
 /* Test whether the qNaN bit denotes a signaling NaN.  */
-#define _FP_FRAC_SNANP(fs, X)						\
-  ((_FP_QNANNEGATEDP)							\
-   ? (_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)			\
-   : !(_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs))
-#define _FP_FRAC_SNANP_SEMIRAW(fs, X)					\
-  ((_FP_QNANNEGATEDP)							\
-   ? (_FP_FRAC_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs)			\
-   : !(_FP_FRAC_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs))
+#define _FP_FRAC_SNANP(fs, X)				\
+  ((_FP_QNANNEGATEDP)					\
+   ? (_FP_FRAC_HIGH_RAW_##fs (X) & _FP_QNANBIT_##fs)	\
+   : !(_FP_FRAC_HIGH_RAW_##fs (X) & _FP_QNANBIT_##fs))
+#define _FP_FRAC_SNANP_SEMIRAW(fs, X)			\
+  ((_FP_QNANNEGATEDP)					\
+   ? (_FP_FRAC_HIGH_##fs (X) & _FP_QNANBIT_SH_##fs)	\
+   : !(_FP_FRAC_HIGH_##fs (X) & _FP_QNANBIT_SH_##fs))
 
 /*
- * Finish truely unpacking a native fp value by classifying the kind
+ * Finish truly unpacking a native fp value by classifying the kind
  * of fp value and normalizing both the exponent and the fraction.
  */
 
-#define _FP_UNPACK_CANONICAL(fs, wc, X)					\
-do {									\
-  switch (X##_e)							\
-  {									\
-  default:								\
-    _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;			\
-    _FP_FRAC_SLL_##wc(X, _FP_WORKBITS);					\
-    X##_e -= _FP_EXPBIAS_##fs;						\
-    X##_c = FP_CLS_NORMAL;						\
-    break;								\
-									\
-  case 0:								\
-    if (_FP_FRAC_ZEROP_##wc(X))						\
-      X##_c = FP_CLS_ZERO;						\
-    else								\
-      {									\
-	/* a denormalized number */					\
-	_FP_I_TYPE _shift;						\
-	_FP_FRAC_CLZ_##wc(_shift, X);					\
-	_shift -= _FP_FRACXBITS_##fs;					\
-	_FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS));			\
-	X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;				\
-	X##_c = FP_CLS_NORMAL;						\
-	FP_SET_EXCEPTION(FP_EX_DENORM);					\
-      }									\
-    break;								\
-									\
-  case _FP_EXPMAX_##fs:							\
-    if (_FP_FRAC_ZEROP_##wc(X))						\
-      X##_c = FP_CLS_INF;						\
-    else								\
-      {									\
-	X##_c = FP_CLS_NAN;						\
-	/* Check for signaling NaN */					\
-	if (_FP_FRAC_SNANP(fs, X))					\
-	  FP_SET_EXCEPTION(FP_EX_INVALID);				\
-      }									\
-    break;								\
-  }									\
-} while (0)
+#define _FP_UNPACK_CANONICAL(fs, wc, X)				\
+  do								\
+    {								\
+      switch (X##_e)						\
+	{							\
+	default:						\
+	  _FP_FRAC_HIGH_RAW_##fs (X) |= _FP_IMPLBIT_##fs;	\
+	  _FP_FRAC_SLL_##wc (X, _FP_WORKBITS);			\
+	  X##_e -= _FP_EXPBIAS_##fs;				\
+	  X##_c = FP_CLS_NORMAL;				\
+	  break;						\
+								\
+	case 0:							\
+	  if (_FP_FRAC_ZEROP_##wc (X))				\
+	    X##_c = FP_CLS_ZERO;				\
+	  else							\
+	    {							\
+	      /* a denormalized number */			\
+	      _FP_I_TYPE _shift;				\
+	      _FP_FRAC_CLZ_##wc (_shift, X);			\
+	      _shift -= _FP_FRACXBITS_##fs;			\
+	      _FP_FRAC_SLL_##wc (X, (_shift+_FP_WORKBITS));	\
+	      X##_e -= _FP_EXPBIAS_##fs - 1 + _shift;		\
+	      X##_c = FP_CLS_NORMAL;				\
+	      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+	    }							\
+	  break;						\
+								\
+	case _FP_EXPMAX_##fs:					\
+	  if (_FP_FRAC_ZEROP_##wc (X))				\
+	    X##_c = FP_CLS_INF;					\
+	  else							\
+	    {							\
+	      X##_c = FP_CLS_NAN;				\
+	      /* Check for signaling NaN */			\
+	      if (_FP_FRAC_SNANP (fs, X))			\
+		FP_SET_EXCEPTION (FP_EX_INVALID);		\
+	    }							\
+	  break;						\
+	}							\
+    }								\
+  while (0)
 
 /* Finish unpacking an fp value in semi-raw mode: the mantissa is
    shifted by _FP_WORKBITS but the implicit MSB is not inserted and
    other classification is not done.  */
-#define _FP_UNPACK_SEMIRAW(fs, wc, X)	_FP_FRAC_SLL_##wc(X, _FP_WORKBITS)
+#define _FP_UNPACK_SEMIRAW(fs, wc, X)	_FP_FRAC_SLL_##wc (X, _FP_WORKBITS)
 
 /* A semi-raw value has overflowed to infinity.  Adjust the mantissa
    and exponent appropriately.  */
 #define _FP_OVERFLOW_SEMIRAW(fs, wc, X)			\
-do {							\
-  if (FP_ROUNDMODE == FP_RND_NEAREST			\
-      || (FP_ROUNDMODE == FP_RND_PINF && !X##_s)	\
-      || (FP_ROUNDMODE == FP_RND_MINF && X##_s))	\
+  do							\
     {							\
-      X##_e = _FP_EXPMAX_##fs;				\
-      _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);		\
+      if (FP_ROUNDMODE == FP_RND_NEAREST		\
+	  || (FP_ROUNDMODE == FP_RND_PINF && !X##_s)	\
+	  || (FP_ROUNDMODE == FP_RND_MINF && X##_s))	\
+	{						\
+	  X##_e = _FP_EXPMAX_##fs;			\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);	\
+	}						\
+      else						\
+	{						\
+	  X##_e = _FP_EXPMAX_##fs - 1;			\
+	  _FP_FRAC_SET_##wc (X, _FP_MAXFRAC_##wc);	\
+	}						\
+      FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+      FP_SET_EXCEPTION (FP_EX_OVERFLOW);		\
     }							\
-  else							\
-    {							\
-      X##_e = _FP_EXPMAX_##fs - 1;			\
-      _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);		\
-    }							\
-    FP_SET_EXCEPTION(FP_EX_INEXACT);			\
-    FP_SET_EXCEPTION(FP_EX_OVERFLOW);			\
-} while (0)
+  while (0)
 
 /* Check for a semi-raw value being a signaling NaN and raise the
    invalid exception if so.  */
-#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)			\
-do {								\
-  if (X##_e == _FP_EXPMAX_##fs					\
-      && !_FP_FRAC_ZEROP_##wc(X)				\
-      && _FP_FRAC_SNANP_SEMIRAW(fs, X))				\
-    FP_SET_EXCEPTION(FP_EX_INVALID);				\
-} while (0)
+#define _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X)	\
+  do						\
+    {						\
+      if (X##_e == _FP_EXPMAX_##fs		\
+	  && !_FP_FRAC_ZEROP_##wc (X)		\
+	  && _FP_FRAC_SNANP_SEMIRAW (fs, X))	\
+	FP_SET_EXCEPTION (FP_EX_INVALID);	\
+    }						\
+  while (0)
 
 /* Choose a NaN result from an operation on two semi-raw NaN
    values.  */
 #define _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP)			\
-do {									\
-  /* _FP_CHOOSENAN expects raw values, so shift as required.  */	\
-  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);					\
-  _FP_FRAC_SRL_##wc(Y, _FP_WORKBITS);					\
-  _FP_CHOOSENAN(fs, wc, R, X, Y, OP);					\
-  _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);					\
-} while (0)
+  do									\
+    {									\
+      /* _FP_CHOOSENAN expects raw values, so shift as required.  */	\
+      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);				\
+      _FP_FRAC_SRL_##wc (Y, _FP_WORKBITS);				\
+      _FP_CHOOSENAN (fs, wc, R, X, Y, OP);				\
+      _FP_FRAC_SLL_##wc (R, _FP_WORKBITS);				\
+    }									\
+  while (0)
 
 /* Make the fractional part a quiet NaN, preserving the payload
    if possible, otherwise make it the canonical quiet NaN and set
    the sign bit accordingly.  */
-#define _FP_SETQNAN(fs, wc, X)						\
-do {									\
-  if (_FP_QNANNEGATEDP)							\
-    {									\
-      _FP_FRAC_HIGH_RAW_##fs(X) &= _FP_QNANBIT_##fs - 1;		\
-      if (_FP_FRAC_ZEROP_##wc(X))					\
-	{								\
-	  X##_s = _FP_NANSIGN_##fs;					\
-	  _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);			\
-	}								\
-    }									\
-  else									\
-    _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;			\
-} while (0)
-#define _FP_SETQNAN_SEMIRAW(fs, wc, X)					\
-do {									\
-  if (_FP_QNANNEGATEDP)							\
-    {									\
-      _FP_FRAC_HIGH_##fs(X) &= _FP_QNANBIT_SH_##fs - 1;			\
-      if (_FP_FRAC_ZEROP_##wc(X))					\
-	{								\
-	  X##_s = _FP_NANSIGN_##fs;					\
-	  _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);			\
-	  _FP_FRAC_SLL_##wc(X, _FP_WORKBITS);				\
-	}								\
-    }									\
-  else									\
-    _FP_FRAC_HIGH_##fs(X) |= _FP_QNANBIT_SH_##fs;			\
-} while (0)
+#define _FP_SETQNAN(fs, wc, X)					\
+  do								\
+    {								\
+      if (_FP_QNANNEGATEDP)					\
+	{							\
+	  _FP_FRAC_HIGH_RAW_##fs (X) &= _FP_QNANBIT_##fs - 1;	\
+	  if (_FP_FRAC_ZEROP_##wc (X))				\
+	    {							\
+	      X##_s = _FP_NANSIGN_##fs;				\
+	      _FP_FRAC_SET_##wc (X, _FP_NANFRAC_##fs);		\
+	    }							\
+	}							\
+      else							\
+	_FP_FRAC_HIGH_RAW_##fs (X) |= _FP_QNANBIT_##fs;		\
+    }								\
+  while (0)
+#define _FP_SETQNAN_SEMIRAW(fs, wc, X)				\
+  do								\
+    {								\
+      if (_FP_QNANNEGATEDP)					\
+	{							\
+	  _FP_FRAC_HIGH_##fs (X) &= _FP_QNANBIT_SH_##fs - 1;	\
+	  if (_FP_FRAC_ZEROP_##wc (X))				\
+	    {							\
+	      X##_s = _FP_NANSIGN_##fs;				\
+	      _FP_FRAC_SET_##wc (X, _FP_NANFRAC_##fs);		\
+	      _FP_FRAC_SLL_##wc (X, _FP_WORKBITS);		\
+	    }							\
+	}							\
+      else							\
+	_FP_FRAC_HIGH_##fs (X) |= _FP_QNANBIT_SH_##fs;		\
+    }								\
+  while (0)
 
 /* Test whether a biased exponent is normal (not zero or maximum).  */
 #define _FP_EXP_NORMAL(fs, wc, X)	(((X##_e + 1) & _FP_EXPMAX_##fs) > 1)
@@ -177,34 +189,36 @@
    rounded and shifted right, with the rounding possibly increasing
    the exponent (including changing a finite value to infinity).  */
 #define _FP_PACK_SEMIRAW(fs, wc, X)				\
-do {								\
-  _FP_ROUND(wc, X);						\
-  if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc(X))			\
-	{ \
+  do								\
+    {								\
+      _FP_ROUND (wc, X);					\
+      if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X))		\
+	{							\
 	  if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
 	      || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))	\
-	    FP_SET_EXCEPTION(FP_EX_UNDERFLOW);			\
-	} \
-  if (_FP_FRAC_HIGH_##fs(X)					\
-      & (_FP_OVERFLOW_##fs >> 1))				\
-    {								\
-      _FP_FRAC_HIGH_##fs(X) &= ~(_FP_OVERFLOW_##fs >> 1);	\
-      X##_e++;							\
-      if (X##_e == _FP_EXPMAX_##fs)				\
-	_FP_OVERFLOW_SEMIRAW(fs, wc, X);			\
-    }								\
-  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);				\
-  if (X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))	\
-    {								\
-      if (!_FP_KEEPNANFRACP)					\
+	    FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
+	}							\
+      if (_FP_FRAC_HIGH_##fs (X)				\
+	  & (_FP_OVERFLOW_##fs >> 1))				\
 	{							\
-	  _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);		\
-	  X##_s = _FP_NANSIGN_##fs;				\
+	  _FP_FRAC_HIGH_##fs (X) &= ~(_FP_OVERFLOW_##fs >> 1);	\
+	  X##_e++;						\
+	  if (X##_e == _FP_EXPMAX_##fs)				\
+	    _FP_OVERFLOW_SEMIRAW (fs, wc, X);			\
 	}							\
-      else							\
-	_FP_SETQNAN(fs, wc, X);					\
+      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);			\
+      if (X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
+	{							\
+	  if (!_FP_KEEPNANFRACP)				\
+	    {							\
+	      _FP_FRAC_SET_##wc (X, _FP_NANFRAC_##fs);		\
+	      X##_s = _FP_NANSIGN_##fs;				\
+	    }							\
+	  else							\
+	    _FP_SETQNAN (fs, wc, X);				\
+	}							\
     }								\
-} while (0)
+  while (0)
 
 /*
  * Before packing the bits back into the native fp result, take care
@@ -213,701 +227,927 @@
  * extracted -- but that is ok, we can regenerate them now.
  */
 
-#define _FP_PACK_CANONICAL(fs, wc, X)				\
-do {								\
-  switch (X##_c)						\
-  {								\
-  case FP_CLS_NORMAL:						\
-    X##_e += _FP_EXPBIAS_##fs;					\
-    if (X##_e > 0)						\
-      {								\
-	_FP_ROUND(wc, X);					\
-	if (_FP_FRAC_OVERP_##wc(fs, X))				\
-	  {							\
-	    _FP_FRAC_CLEAR_OVERP_##wc(fs, X);			\
-	    X##_e++;						\
-	  }							\
-	_FP_FRAC_SRL_##wc(X, _FP_WORKBITS);			\
-	if (X##_e >= _FP_EXPMAX_##fs)				\
-	  {							\
-	    /* overflow */					\
-	    switch (FP_ROUNDMODE)				\
-	      {							\
-	      case FP_RND_NEAREST:				\
-		X##_c = FP_CLS_INF;				\
-		break;						\
-	      case FP_RND_PINF:					\
-		if (!X##_s) X##_c = FP_CLS_INF;			\
-		break;						\
-	      case FP_RND_MINF:					\
-		if (X##_s) X##_c = FP_CLS_INF;			\
-		break;						\
-	      }							\
-	    if (X##_c == FP_CLS_INF)				\
-	      {							\
-		/* Overflow to infinity */			\
-		X##_e = _FP_EXPMAX_##fs;			\
-		_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);	\
-	      }							\
-	    else						\
-	      {							\
-		/* Overflow to maximum normal */		\
-		X##_e = _FP_EXPMAX_##fs - 1;			\
-		_FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc);		\
-	      }							\
-	    FP_SET_EXCEPTION(FP_EX_OVERFLOW);			\
-            FP_SET_EXCEPTION(FP_EX_INEXACT);			\
-	  }							\
-      }								\
-    else							\
-      {								\
-	/* we've got a denormalized number */			\
-	X##_e = -X##_e + 1;					\
-	if (X##_e <= _FP_WFRACBITS_##fs)			\
-	  {							\
-	    _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);	\
-	    _FP_ROUND(wc, X);					\
-	    if (_FP_FRAC_HIGH_##fs(X)				\
-		& (_FP_OVERFLOW_##fs >> 1))			\
-	      {							\
-	        X##_e = 1;					\
-	        _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);	\
-		FP_SET_EXCEPTION(FP_EX_INEXACT);		\
-	      }							\
-	    else						\
-	      {							\
-		X##_e = 0;					\
-		_FP_FRAC_SRL_##wc(X, _FP_WORKBITS);		\
-	      }							\
-	    if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
-		|| (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))	\
-	      FP_SET_EXCEPTION(FP_EX_UNDERFLOW);		\
-	  }							\
-	else							\
-	  {							\
-	    /* underflow to zero */				\
-	    X##_e = 0;						\
-	    if (!_FP_FRAC_ZEROP_##wc(X))			\
-	      {							\
-	        _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);		\
-	        _FP_ROUND(wc, X);				\
-	        _FP_FRAC_LOW_##wc(X) >>= (_FP_WORKBITS);	\
-	      }							\
-	    FP_SET_EXCEPTION(FP_EX_UNDERFLOW);			\
-	  }							\
-      }								\
-    break;							\
-								\
-  case FP_CLS_ZERO:						\
-    X##_e = 0;							\
-    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			\
-    break;							\
-								\
-  case FP_CLS_INF:						\
-    X##_e = _FP_EXPMAX_##fs;					\
-    _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			\
-    break;							\
-								\
-  case FP_CLS_NAN:						\
-    X##_e = _FP_EXPMAX_##fs;					\
-    if (!_FP_KEEPNANFRACP)					\
-      {								\
-	_FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);			\
-	X##_s = _FP_NANSIGN_##fs;				\
-      }								\
-    else							\
-      _FP_SETQNAN(fs, wc, X);					\
-    break;							\
-  }								\
-} while (0)
+#define _FP_PACK_CANONICAL(fs, wc, X)					\
+  do									\
+    {									\
+      switch (X##_c)							\
+	{								\
+	case FP_CLS_NORMAL:						\
+	  X##_e += _FP_EXPBIAS_##fs;					\
+	  if (X##_e > 0)						\
+	    {								\
+	      _FP_ROUND (wc, X);					\
+	      if (_FP_FRAC_OVERP_##wc (fs, X))				\
+		{							\
+		  _FP_FRAC_CLEAR_OVERP_##wc (fs, X);			\
+		  X##_e++;						\
+		}							\
+	      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);			\
+	      if (X##_e >= _FP_EXPMAX_##fs)				\
+		{							\
+		  /* overflow */					\
+		  switch (FP_ROUNDMODE)					\
+		    {							\
+		    case FP_RND_NEAREST:				\
+		      X##_c = FP_CLS_INF;				\
+		      break;						\
+		    case FP_RND_PINF:					\
+		      if (!X##_s)					\
+			X##_c = FP_CLS_INF;				\
+		      break;						\
+		    case FP_RND_MINF:					\
+		      if (X##_s)					\
+			X##_c = FP_CLS_INF;				\
+		      break;						\
+		    }							\
+		  if (X##_c == FP_CLS_INF)				\
+		    {							\
+		      /* Overflow to infinity */			\
+		      X##_e = _FP_EXPMAX_##fs;				\
+		      _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);		\
+		    }							\
+		  else							\
+		    {							\
+		      /* Overflow to maximum normal */			\
+		      X##_e = _FP_EXPMAX_##fs - 1;			\
+		      _FP_FRAC_SET_##wc (X, _FP_MAXFRAC_##wc);		\
+		    }							\
+		  FP_SET_EXCEPTION (FP_EX_OVERFLOW);			\
+		  FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+		}							\
+	    }								\
+	  else								\
+	    {								\
+	      /* we've got a denormalized number */			\
+	      X##_e = -X##_e + 1;					\
+	      if (X##_e <= _FP_WFRACBITS_##fs)				\
+		{							\
+		  _FP_FRAC_SRS_##wc (X, X##_e, _FP_WFRACBITS_##fs);	\
+		  _FP_ROUND (wc, X);					\
+		  if (_FP_FRAC_HIGH_##fs (X)				\
+		      & (_FP_OVERFLOW_##fs >> 1))			\
+		    {							\
+		      X##_e = 1;					\
+		      _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);		\
+		      FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+		    }							\
+		  else							\
+		    {							\
+		      X##_e = 0;					\
+		      _FP_FRAC_SRL_##wc (X, _FP_WORKBITS);		\
+		    }							\
+		  if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)		\
+		      || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))	\
+		    FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
+		}							\
+	      else							\
+		{							\
+		  /* underflow to zero */				\
+		  X##_e = 0;						\
+		  if (!_FP_FRAC_ZEROP_##wc (X))				\
+		    {							\
+		      _FP_FRAC_SET_##wc (X, _FP_MINFRAC_##wc);		\
+		      _FP_ROUND (wc, X);				\
+		      _FP_FRAC_LOW_##wc (X) >>= (_FP_WORKBITS);		\
+		    }							\
+		  FP_SET_EXCEPTION (FP_EX_UNDERFLOW);			\
+		}							\
+	    }								\
+	  break;							\
+									\
+	case FP_CLS_ZERO:						\
+	  X##_e = 0;							\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);			\
+	  break;							\
+									\
+	case FP_CLS_INF:						\
+	  X##_e = _FP_EXPMAX_##fs;					\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);			\
+	  break;							\
+									\
+	case FP_CLS_NAN:						\
+	  X##_e = _FP_EXPMAX_##fs;					\
+	  if (!_FP_KEEPNANFRACP)					\
+	    {								\
+	      _FP_FRAC_SET_##wc (X, _FP_NANFRAC_##fs);			\
+	      X##_s = _FP_NANSIGN_##fs;					\
+	    }								\
+	  else								\
+	    _FP_SETQNAN (fs, wc, X);					\
+	  break;							\
+	}								\
+    }									\
+  while (0)
 
 /* This one accepts raw argument and not cooked,  returns
  * 1 if X is a signaling NaN.
  */
-#define _FP_ISSIGNAN(fs, wc, X)					\
-({								\
-  int __ret = 0;						\
-  if (X##_e == _FP_EXPMAX_##fs)					\
-    {								\
-      if (!_FP_FRAC_ZEROP_##wc(X)				\
-	  && _FP_FRAC_SNANP(fs, X))				\
-	__ret = 1;						\
-    }								\
-  __ret;							\
-})
+#define _FP_ISSIGNAN(fs, wc, X)			\
+  ({						\
+    int __ret = 0;				\
+    if (X##_e == _FP_EXPMAX_##fs)		\
+      {						\
+	if (!_FP_FRAC_ZEROP_##wc (X)		\
+	    && _FP_FRAC_SNANP (fs, X))		\
+	  __ret = 1;				\
+      }						\
+    __ret;					\
+  })
 
 
 
 
 
 /* Addition on semi-raw values.  */
-#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)				 \
-do {									 \
-  if (X##_s == Y##_s)							 \
-    {									 \
-      /* Addition.  */							 \
-      R##_s = X##_s;							 \
-      int ediff = X##_e - Y##_e;					 \
-      if (ediff > 0)							 \
-	{								 \
-	  R##_e = X##_e;						 \
-	  if (Y##_e == 0)						 \
-	    {								 \
-	      /* Y is zero or denormalized.  */				 \
-	      if (_FP_FRAC_ZEROP_##wc(Y))				 \
-		{							 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-		  _FP_FRAC_COPY_##wc(R, X);				 \
-		  goto add_done;					 \
-		}							 \
-	      else							 \
-		{							 \
-		  FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		  ediff--;						 \
-		  if (ediff == 0)					 \
-		    {							 \
-		      _FP_FRAC_ADD_##wc(R, X, Y);			 \
-		      goto add3;					 \
-		    }							 \
-		  if (X##_e == _FP_EXPMAX_##fs)				 \
-		    {							 \
-		      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);		 \
-		      _FP_FRAC_COPY_##wc(R, X);				 \
-		      goto add_done;					 \
-		    }							 \
-		  goto add1;						 \
-		}							 \
-	    }								 \
-	  else if (X##_e == _FP_EXPMAX_##fs)				 \
-	    {								 \
-	      /* X is NaN or Inf, Y is normal.  */			 \
-	      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-	      _FP_FRAC_COPY_##wc(R, X);					 \
-	      goto add_done;						 \
-	    }								 \
-									 \
-	  /* Insert implicit MSB of Y.  */				 \
-	  _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;			 \
-									 \
-	add1:								 \
-	  /* Shift the mantissa of Y to the right EDIFF steps;		 \
-	     remember to account later for the implicit MSB of X.  */	 \
-	  if (ediff <= _FP_WFRACBITS_##fs)				 \
-	    _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);		 \
-	  else if (!_FP_FRAC_ZEROP_##wc(Y))				 \
-	    _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);			 \
-	  _FP_FRAC_ADD_##wc(R, X, Y);					 \
-	}								 \
-      else if (ediff < 0)						 \
-	{								 \
-	  ediff = -ediff;						 \
-	  R##_e = Y##_e;						 \
-	  if (X##_e == 0)						 \
-	    {								 \
-	      /* X is zero or denormalized.  */				 \
-	      if (_FP_FRAC_ZEROP_##wc(X))				 \
-		{							 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-		  _FP_FRAC_COPY_##wc(R, Y);				 \
-		  goto add_done;					 \
-		}							 \
-	      else							 \
-		{							 \
-		  FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		  ediff--;						 \
-		  if (ediff == 0)					 \
-		    {							 \
-		      _FP_FRAC_ADD_##wc(R, Y, X);			 \
-		      goto add3;					 \
-		    }							 \
-		  if (Y##_e == _FP_EXPMAX_##fs)				 \
-		    {							 \
-		      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);		 \
-		      _FP_FRAC_COPY_##wc(R, Y);				 \
-		      goto add_done;					 \
-		    }							 \
-		  goto add2;						 \
-		}							 \
-	    }								 \
-	  else if (Y##_e == _FP_EXPMAX_##fs)				 \
-	    {								 \
-	      /* Y is NaN or Inf, X is normal.  */			 \
-	      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-	      _FP_FRAC_COPY_##wc(R, Y);					 \
-	      goto add_done;						 \
-	    }								 \
-									 \
-	  /* Insert implicit MSB of X.  */				 \
-	  _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;			 \
-									 \
-	add2:								 \
-	  /* Shift the mantissa of X to the right EDIFF steps;		 \
-	     remember to account later for the implicit MSB of Y.  */	 \
-	  if (ediff <= _FP_WFRACBITS_##fs)				 \
-	    _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);		 \
-	  else if (!_FP_FRAC_ZEROP_##wc(X))				 \
-	    _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);			 \
-	  _FP_FRAC_ADD_##wc(R, Y, X);					 \
-	}								 \
-      else								 \
-	{								 \
-	  /* ediff == 0.  */						 \
-	  if (!_FP_EXP_NORMAL(fs, wc, X))				 \
-	    {								 \
-	      if (X##_e == 0)						 \
-		{							 \
-		  /* X and Y are zero or denormalized.  */		 \
-		  R##_e = 0;						 \
-		  if (_FP_FRAC_ZEROP_##wc(X))				 \
-		    {							 \
-		      if (!_FP_FRAC_ZEROP_##wc(Y))			 \
-			FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		      _FP_FRAC_COPY_##wc(R, Y);				 \
-		      goto add_done;					 \
-		    }							 \
-		  else if (_FP_FRAC_ZEROP_##wc(Y))			 \
-		    {							 \
-		      FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		      _FP_FRAC_COPY_##wc(R, X);				 \
-		      goto add_done;					 \
-		    }							 \
-		  else							 \
-		    {							 \
-		      FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		      _FP_FRAC_ADD_##wc(R, X, Y);			 \
-		      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)	 \
-			{						 \
-			  /* Normalized result.  */			 \
-			  _FP_FRAC_HIGH_##fs(R)				 \
-			    &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;	 \
-			  R##_e = 1;					 \
-			}						 \
-		      goto add_done;					 \
-		    }							 \
-		}							 \
-	      else							 \
-		{							 \
-		  /* X and Y are NaN or Inf.  */			 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-		  R##_e = _FP_EXPMAX_##fs;				 \
-		  if (_FP_FRAC_ZEROP_##wc(X))				 \
-		    _FP_FRAC_COPY_##wc(R, Y);				 \
-		  else if (_FP_FRAC_ZEROP_##wc(Y))			 \
-		    _FP_FRAC_COPY_##wc(R, X);				 \
-		  else							 \
-		    _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);		 \
-		  goto add_done;					 \
-		}							 \
-	    }								 \
-	  /* The exponents of X and Y, both normal, are equal.  The	 \
-	     implicit MSBs will always add to increase the		 \
-	     exponent.  */						 \
-	  _FP_FRAC_ADD_##wc(R, X, Y);					 \
-	  R##_e = X##_e + 1;						 \
-	  _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);			 \
-	  if (R##_e == _FP_EXPMAX_##fs)					 \
-	    /* Overflow to infinity (depending on rounding mode).  */	 \
-	    _FP_OVERFLOW_SEMIRAW(fs, wc, R);				 \
-	  goto add_done;						 \
-	}								 \
-    add3:								 \
-      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)			 \
-	{								 \
-	  /* Overflow.  */						 \
-	  _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;	 \
-	  R##_e++;							 \
-	  _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);			 \
-	  if (R##_e == _FP_EXPMAX_##fs)					 \
-	    /* Overflow to infinity (depending on rounding mode).  */	 \
-	    _FP_OVERFLOW_SEMIRAW(fs, wc, R);				 \
-	}								 \
-    add_done: ;								 \
-    }									 \
-  else									 \
-    {									 \
-      /* Subtraction.  */						 \
-      int ediff = X##_e - Y##_e;					 \
-      if (ediff > 0)							 \
-	{								 \
-	  R##_e = X##_e;						 \
-	  R##_s = X##_s;						 \
-	  if (Y##_e == 0)						 \
-	    {								 \
-	      /* Y is zero or denormalized.  */				 \
-	      if (_FP_FRAC_ZEROP_##wc(Y))				 \
-		{							 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-		  _FP_FRAC_COPY_##wc(R, X);				 \
-		  goto sub_done;					 \
-		}							 \
-	      else							 \
-		{							 \
-		  FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		  ediff--;						 \
-		  if (ediff == 0)					 \
-		    {							 \
-		      _FP_FRAC_SUB_##wc(R, X, Y);			 \
-		      goto sub3;					 \
-		    }							 \
-		  if (X##_e == _FP_EXPMAX_##fs)				 \
-		    {							 \
-		      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);		 \
-		      _FP_FRAC_COPY_##wc(R, X);				 \
-		      goto sub_done;					 \
-		    }							 \
-		  goto sub1;						 \
-		}							 \
-	    }								 \
-	  else if (X##_e == _FP_EXPMAX_##fs)				 \
-	    {								 \
-	      /* X is NaN or Inf, Y is normal.  */			 \
-	      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-	      _FP_FRAC_COPY_##wc(R, X);					 \
-	      goto sub_done;						 \
-	    }								 \
-									 \
-	  /* Insert implicit MSB of Y.  */				 \
-	  _FP_FRAC_HIGH_##fs(Y) |= _FP_IMPLBIT_SH_##fs;			 \
-									 \
-	sub1:								 \
-	  /* Shift the mantissa of Y to the right EDIFF steps;		 \
-	     remember to account later for the implicit MSB of X.  */	 \
-	  if (ediff <= _FP_WFRACBITS_##fs)				 \
-	    _FP_FRAC_SRS_##wc(Y, ediff, _FP_WFRACBITS_##fs);		 \
-	  else if (!_FP_FRAC_ZEROP_##wc(Y))				 \
-	    _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);			 \
-	  _FP_FRAC_SUB_##wc(R, X, Y);					 \
-	}								 \
-      else if (ediff < 0)						 \
-	{								 \
-	  ediff = -ediff;						 \
-	  R##_e = Y##_e;						 \
-	  R##_s = Y##_s;						 \
-	  if (X##_e == 0)						 \
-	    {								 \
-	      /* X is zero or denormalized.  */				 \
-	      if (_FP_FRAC_ZEROP_##wc(X))				 \
-		{							 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-		  _FP_FRAC_COPY_##wc(R, Y);				 \
-		  goto sub_done;					 \
-		}							 \
-	      else							 \
-		{							 \
-		  FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		  ediff--;						 \
-		  if (ediff == 0)					 \
-		    {							 \
-		      _FP_FRAC_SUB_##wc(R, Y, X);			 \
-		      goto sub3;					 \
-		    }							 \
-		  if (Y##_e == _FP_EXPMAX_##fs)				 \
-		    {							 \
-		      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);		 \
-		      _FP_FRAC_COPY_##wc(R, Y);				 \
-		      goto sub_done;					 \
-		    }							 \
-		  goto sub2;						 \
-		}							 \
-	    }								 \
-	  else if (Y##_e == _FP_EXPMAX_##fs)				 \
-	    {								 \
-	      /* Y is NaN or Inf, X is normal.  */			 \
-	      _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-	      _FP_FRAC_COPY_##wc(R, Y);					 \
-	      goto sub_done;						 \
-	    }								 \
-									 \
-	  /* Insert implicit MSB of X.  */				 \
-	  _FP_FRAC_HIGH_##fs(X) |= _FP_IMPLBIT_SH_##fs;			 \
-									 \
-	sub2:								 \
-	  /* Shift the mantissa of X to the right EDIFF steps;		 \
-	     remember to account later for the implicit MSB of Y.  */	 \
-	  if (ediff <= _FP_WFRACBITS_##fs)				 \
-	    _FP_FRAC_SRS_##wc(X, ediff, _FP_WFRACBITS_##fs);		 \
-	  else if (!_FP_FRAC_ZEROP_##wc(X))				 \
-	    _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);			 \
-	  _FP_FRAC_SUB_##wc(R, Y, X);					 \
-	}								 \
-      else								 \
-	{								 \
-	  /* ediff == 0.  */						 \
-	  if (!_FP_EXP_NORMAL(fs, wc, X))				 \
-	    {								 \
-	      if (X##_e == 0)						 \
-		{							 \
-		  /* X and Y are zero or denormalized.  */		 \
-		  R##_e = 0;						 \
-		  if (_FP_FRAC_ZEROP_##wc(X))				 \
-		    {							 \
-		      _FP_FRAC_COPY_##wc(R, Y);				 \
-		      if (_FP_FRAC_ZEROP_##wc(Y))			 \
-			R##_s = (FP_ROUNDMODE == FP_RND_MINF);		 \
-		      else						 \
-			{						 \
-			  FP_SET_EXCEPTION(FP_EX_DENORM);		 \
-			  R##_s = Y##_s;				 \
-			}						 \
-		      goto sub_done;					 \
-		    }							 \
-		  else if (_FP_FRAC_ZEROP_##wc(Y))			 \
-		    {							 \
-		      FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		      _FP_FRAC_COPY_##wc(R, X);				 \
-		      R##_s = X##_s;					 \
-		      goto sub_done;					 \
-		    }							 \
-		  else							 \
-		    {							 \
-		      FP_SET_EXCEPTION(FP_EX_DENORM);			 \
-		      _FP_FRAC_SUB_##wc(R, X, Y);			 \
-		      R##_s = X##_s;					 \
-		      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)	 \
-			{						 \
-			  /* |X| < |Y|, negate result.  */		 \
-			  _FP_FRAC_SUB_##wc(R, Y, X);			 \
-			  R##_s = Y##_s;				 \
-			}						 \
-		      else if (_FP_FRAC_ZEROP_##wc(R))			 \
-			R##_s = (FP_ROUNDMODE == FP_RND_MINF);		 \
-		      goto sub_done;					 \
-		    }							 \
-		}							 \
-	      else							 \
-		{							 \
-		  /* X and Y are NaN or Inf, of opposite signs.  */	 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, X);			 \
-		  _FP_CHECK_SIGNAN_SEMIRAW(fs, wc, Y);			 \
-		  R##_e = _FP_EXPMAX_##fs;				 \
-		  if (_FP_FRAC_ZEROP_##wc(X))				 \
-		    {							 \
-		      if (_FP_FRAC_ZEROP_##wc(Y))			 \
-			{						 \
-			  /* Inf - Inf.  */				 \
-			  R##_s = _FP_NANSIGN_##fs;			 \
-			  _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);	 \
-			  _FP_FRAC_SLL_##wc(R, _FP_WORKBITS);		 \
-			  FP_SET_EXCEPTION(FP_EX_INVALID);		 \
-			}						 \
-		      else						 \
-			{						 \
-			  /* Inf - NaN.  */				 \
-			  R##_s = Y##_s;				 \
-			  _FP_FRAC_COPY_##wc(R, Y);			 \
-			}						 \
-		    }							 \
-		  else							 \
-		    {							 \
-		      if (_FP_FRAC_ZEROP_##wc(Y))			 \
-			{						 \
-			  /* NaN - Inf.  */				 \
-			  R##_s = X##_s;				 \
-			  _FP_FRAC_COPY_##wc(R, X);			 \
-			}						 \
-		      else						 \
-			{						 \
-			  /* NaN - NaN.  */				 \
-			  _FP_CHOOSENAN_SEMIRAW(fs, wc, R, X, Y, OP);	 \
-			}						 \
-		    }							 \
-		  goto sub_done;					 \
-		}							 \
-	    }								 \
-	  /* The exponents of X and Y, both normal, are equal.  The	 \
-	     implicit MSBs cancel.  */					 \
-	  R##_e = X##_e;						 \
-	  _FP_FRAC_SUB_##wc(R, X, Y);					 \
-	  R##_s = X##_s;						 \
-	  if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)		 \
-	    {								 \
-	      /* |X| < |Y|, negate result.  */				 \
-	      _FP_FRAC_SUB_##wc(R, Y, X);				 \
-	      R##_s = Y##_s;						 \
-	    }								 \
-	  else if (_FP_FRAC_ZEROP_##wc(R))				 \
-	    {								 \
-	      R##_e = 0;						 \
-	      R##_s = (FP_ROUNDMODE == FP_RND_MINF);			 \
-	      goto sub_done;						 \
-	    }								 \
-	  goto norm;							 \
-	}								 \
-    sub3:								 \
-      if (_FP_FRAC_HIGH_##fs(R) & _FP_IMPLBIT_SH_##fs)			 \
-	{								 \
-	  int diff;							 \
-	  /* Carry into most significant bit of larger one of X and Y,	 \
-	     canceling it; renormalize.  */				 \
-	  _FP_FRAC_HIGH_##fs(R) &= _FP_IMPLBIT_SH_##fs - 1;		 \
-	norm:								 \
-	  _FP_FRAC_CLZ_##wc(diff, R);					 \
-	  diff -= _FP_WFRACXBITS_##fs;					 \
-	  _FP_FRAC_SLL_##wc(R, diff);					 \
-	  if (R##_e <= diff)						 \
-	    {								 \
-	      /* R is denormalized.  */					 \
-	      diff = diff - R##_e + 1;					 \
-	      _FP_FRAC_SRS_##wc(R, diff, _FP_WFRACBITS_##fs);		 \
-	      R##_e = 0;						 \
-	    }								 \
-	  else								 \
-	    {								 \
-	      R##_e -= diff;						 \
-	      _FP_FRAC_HIGH_##fs(R) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs; \
-	    }								 \
-	}								 \
-    sub_done: ;								 \
-    }									 \
-} while (0)
+#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)				\
+  do									\
+    {									\
+      if (X##_s == Y##_s)						\
+	{								\
+	  /* Addition.  */						\
+	  R##_s = X##_s;						\
+	  int ediff = X##_e - Y##_e;					\
+	  if (ediff > 0)						\
+	    {								\
+	      R##_e = X##_e;						\
+	      if (Y##_e == 0)						\
+		{							\
+		  /* Y is zero or denormalized.  */			\
+		  if (_FP_FRAC_ZEROP_##wc (Y))				\
+		    {							\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+		      _FP_FRAC_COPY_##wc (R, X);			\
+		      goto add_done;					\
+		    }							\
+		  else							\
+		    {							\
+		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		      ediff--;						\
+		      if (ediff == 0)					\
+			{						\
+			  _FP_FRAC_ADD_##wc (R, X, Y);			\
+			  goto add3;					\
+			}						\
+		      if (X##_e == _FP_EXPMAX_##fs)			\
+			{						\
+			  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+			  _FP_FRAC_COPY_##wc (R, X);			\
+			  goto add_done;				\
+			}						\
+		      goto add1;					\
+		    }							\
+		}							\
+	      else if (X##_e == _FP_EXPMAX_##fs)			\
+		{							\
+		  /* X is NaN or Inf, Y is normal.  */			\
+		  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);			\
+		  _FP_FRAC_COPY_##wc (R, X);				\
+		  goto add_done;					\
+		}							\
+									\
+	      /* Insert implicit MSB of Y.  */				\
+	      _FP_FRAC_HIGH_##fs (Y) |= _FP_IMPLBIT_SH_##fs;		\
+									\
+	    add1:							\
+	      /* Shift the mantissa of Y to the right EDIFF steps;	\
+		 remember to account later for the implicit MSB of X.  */ \
+	      if (ediff <= _FP_WFRACBITS_##fs)				\
+		_FP_FRAC_SRS_##wc (Y, ediff, _FP_WFRACBITS_##fs);	\
+	      else if (!_FP_FRAC_ZEROP_##wc (Y))			\
+		_FP_FRAC_SET_##wc (Y, _FP_MINFRAC_##wc);		\
+	      _FP_FRAC_ADD_##wc (R, X, Y);				\
+	    }								\
+	  else if (ediff < 0)						\
+	    {								\
+	      ediff = -ediff;						\
+	      R##_e = Y##_e;						\
+	      if (X##_e == 0)						\
+		{							\
+		  /* X is zero or denormalized.  */			\
+		  if (_FP_FRAC_ZEROP_##wc (X))				\
+		    {							\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+		      _FP_FRAC_COPY_##wc (R, Y);			\
+		      goto add_done;					\
+		    }							\
+		  else							\
+		    {							\
+		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		      ediff--;						\
+		      if (ediff == 0)					\
+			{						\
+			  _FP_FRAC_ADD_##wc (R, Y, X);			\
+			  goto add3;					\
+			}						\
+		      if (Y##_e == _FP_EXPMAX_##fs)			\
+			{						\
+			  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+			  _FP_FRAC_COPY_##wc (R, Y);			\
+			  goto add_done;				\
+			}						\
+		      goto add2;					\
+		    }							\
+		}							\
+	      else if (Y##_e == _FP_EXPMAX_##fs)			\
+		{							\
+		  /* Y is NaN or Inf, X is normal.  */			\
+		  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);			\
+		  _FP_FRAC_COPY_##wc (R, Y);				\
+		  goto add_done;					\
+		}							\
+									\
+	      /* Insert implicit MSB of X.  */				\
+	      _FP_FRAC_HIGH_##fs (X) |= _FP_IMPLBIT_SH_##fs;		\
+									\
+	    add2:							\
+	      /* Shift the mantissa of X to the right EDIFF steps;	\
+		 remember to account later for the implicit MSB of Y.  */ \
+	      if (ediff <= _FP_WFRACBITS_##fs)				\
+		_FP_FRAC_SRS_##wc (X, ediff, _FP_WFRACBITS_##fs);	\
+	      else if (!_FP_FRAC_ZEROP_##wc (X))			\
+		_FP_FRAC_SET_##wc (X, _FP_MINFRAC_##wc);		\
+	      _FP_FRAC_ADD_##wc (R, Y, X);				\
+	    }								\
+	  else								\
+	    {								\
+	      /* ediff == 0.  */					\
+	      if (!_FP_EXP_NORMAL (fs, wc, X))				\
+		{							\
+		  if (X##_e == 0)					\
+		    {							\
+		      /* X and Y are zero or denormalized.  */		\
+		      R##_e = 0;					\
+		      if (_FP_FRAC_ZEROP_##wc (X))			\
+			{						\
+			  if (!_FP_FRAC_ZEROP_##wc (Y))			\
+			    FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			  _FP_FRAC_COPY_##wc (R, Y);			\
+			  goto add_done;				\
+			}						\
+		      else if (_FP_FRAC_ZEROP_##wc (Y))			\
+			{						\
+			  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			  _FP_FRAC_COPY_##wc (R, X);			\
+			  goto add_done;				\
+			}						\
+		      else						\
+			{						\
+			  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			  _FP_FRAC_ADD_##wc (R, X, Y);			\
+			  if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs) \
+			    {						\
+			      /* Normalized result.  */			\
+			      _FP_FRAC_HIGH_##fs (R)			\
+				&= ~(_FP_W_TYPE) _FP_IMPLBIT_SH_##fs;	\
+			      R##_e = 1;				\
+			    }						\
+			  goto add_done;				\
+			}						\
+		    }							\
+		  else							\
+		    {							\
+		      /* X and Y are NaN or Inf.  */			\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+		      R##_e = _FP_EXPMAX_##fs;				\
+		      if (_FP_FRAC_ZEROP_##wc (X))			\
+			_FP_FRAC_COPY_##wc (R, Y);			\
+		      else if (_FP_FRAC_ZEROP_##wc (Y))			\
+			_FP_FRAC_COPY_##wc (R, X);			\
+		      else						\
+			_FP_CHOOSENAN_SEMIRAW (fs, wc, R, X, Y, OP);	\
+		      goto add_done;					\
+		    }							\
+		}							\
+	      /* The exponents of X and Y, both normal, are equal.  The	\
+		 implicit MSBs will always add to increase the		\
+		 exponent.  */						\
+	      _FP_FRAC_ADD_##wc (R, X, Y);				\
+	      R##_e = X##_e + 1;					\
+	      _FP_FRAC_SRS_##wc (R, 1, _FP_WFRACBITS_##fs);		\
+	      if (R##_e == _FP_EXPMAX_##fs)				\
+		/* Overflow to infinity (depending on rounding mode).  */ \
+		_FP_OVERFLOW_SEMIRAW (fs, wc, R);			\
+	      goto add_done;						\
+	    }								\
+	add3:								\
+	  if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs)		\
+	    {								\
+	      /* Overflow.  */						\
+	      _FP_FRAC_HIGH_##fs (R) &= ~(_FP_W_TYPE) _FP_IMPLBIT_SH_##fs; \
+	      R##_e++;							\
+	      _FP_FRAC_SRS_##wc (R, 1, _FP_WFRACBITS_##fs);		\
+	      if (R##_e == _FP_EXPMAX_##fs)				\
+		/* Overflow to infinity (depending on rounding mode).  */ \
+		_FP_OVERFLOW_SEMIRAW (fs, wc, R);			\
+	    }								\
+	add_done: ;							\
+	}								\
+      else								\
+	{								\
+	  /* Subtraction.  */						\
+	  int ediff = X##_e - Y##_e;					\
+	  if (ediff > 0)						\
+	    {								\
+	      R##_e = X##_e;						\
+	      R##_s = X##_s;						\
+	      if (Y##_e == 0)						\
+		{							\
+		  /* Y is zero or denormalized.  */			\
+		  if (_FP_FRAC_ZEROP_##wc (Y))				\
+		    {							\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+		      _FP_FRAC_COPY_##wc (R, X);			\
+		      goto sub_done;					\
+		    }							\
+		  else							\
+		    {							\
+		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		      ediff--;						\
+		      if (ediff == 0)					\
+			{						\
+			  _FP_FRAC_SUB_##wc (R, X, Y);			\
+			  goto sub3;					\
+			}						\
+		      if (X##_e == _FP_EXPMAX_##fs)			\
+			{						\
+			  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+			  _FP_FRAC_COPY_##wc (R, X);			\
+			  goto sub_done;				\
+			}						\
+		      goto sub1;					\
+		    }							\
+		}							\
+	      else if (X##_e == _FP_EXPMAX_##fs)			\
+		{							\
+		  /* X is NaN or Inf, Y is normal.  */			\
+		  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);			\
+		  _FP_FRAC_COPY_##wc (R, X);				\
+		  goto sub_done;					\
+		}							\
+									\
+	      /* Insert implicit MSB of Y.  */				\
+	      _FP_FRAC_HIGH_##fs (Y) |= _FP_IMPLBIT_SH_##fs;		\
+									\
+	    sub1:							\
+	      /* Shift the mantissa of Y to the right EDIFF steps;	\
+		 remember to account later for the implicit MSB of X.  */ \
+	      if (ediff <= _FP_WFRACBITS_##fs)				\
+		_FP_FRAC_SRS_##wc (Y, ediff, _FP_WFRACBITS_##fs);	\
+	      else if (!_FP_FRAC_ZEROP_##wc (Y))			\
+		_FP_FRAC_SET_##wc (Y, _FP_MINFRAC_##wc);		\
+	      _FP_FRAC_SUB_##wc (R, X, Y);				\
+	    }								\
+	  else if (ediff < 0)						\
+	    {								\
+	      ediff = -ediff;						\
+	      R##_e = Y##_e;						\
+	      R##_s = Y##_s;						\
+	      if (X##_e == 0)						\
+		{							\
+		  /* X is zero or denormalized.  */			\
+		  if (_FP_FRAC_ZEROP_##wc (X))				\
+		    {							\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+		      _FP_FRAC_COPY_##wc (R, Y);			\
+		      goto sub_done;					\
+		    }							\
+		  else							\
+		    {							\
+		      FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		      ediff--;						\
+		      if (ediff == 0)					\
+			{						\
+			  _FP_FRAC_SUB_##wc (R, Y, X);			\
+			  goto sub3;					\
+			}						\
+		      if (Y##_e == _FP_EXPMAX_##fs)			\
+			{						\
+			  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+			  _FP_FRAC_COPY_##wc (R, Y);			\
+			  goto sub_done;				\
+			}						\
+		      goto sub2;					\
+		    }							\
+		}							\
+	      else if (Y##_e == _FP_EXPMAX_##fs)			\
+		{							\
+		  /* Y is NaN or Inf, X is normal.  */			\
+		  _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);			\
+		  _FP_FRAC_COPY_##wc (R, Y);				\
+		  goto sub_done;					\
+		}							\
+									\
+	      /* Insert implicit MSB of X.  */				\
+	      _FP_FRAC_HIGH_##fs (X) |= _FP_IMPLBIT_SH_##fs;		\
+									\
+	    sub2:							\
+	      /* Shift the mantissa of X to the right EDIFF steps;	\
+		 remember to account later for the implicit MSB of Y.  */ \
+	      if (ediff <= _FP_WFRACBITS_##fs)				\
+		_FP_FRAC_SRS_##wc (X, ediff, _FP_WFRACBITS_##fs);	\
+	      else if (!_FP_FRAC_ZEROP_##wc (X))			\
+		_FP_FRAC_SET_##wc (X, _FP_MINFRAC_##wc);		\
+	      _FP_FRAC_SUB_##wc (R, Y, X);				\
+	    }								\
+	  else								\
+	    {								\
+	      /* ediff == 0.  */					\
+	      if (!_FP_EXP_NORMAL (fs, wc, X))				\
+		{							\
+		  if (X##_e == 0)					\
+		    {							\
+		      /* X and Y are zero or denormalized.  */		\
+		      R##_e = 0;					\
+		      if (_FP_FRAC_ZEROP_##wc (X))			\
+			{						\
+			  _FP_FRAC_COPY_##wc (R, Y);			\
+			  if (_FP_FRAC_ZEROP_##wc (Y))			\
+			    R##_s = (FP_ROUNDMODE == FP_RND_MINF);	\
+			  else						\
+			    {						\
+			      FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			      R##_s = Y##_s;				\
+			    }						\
+			  goto sub_done;				\
+			}						\
+		      else if (_FP_FRAC_ZEROP_##wc (Y))			\
+			{						\
+			  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			  _FP_FRAC_COPY_##wc (R, X);			\
+			  R##_s = X##_s;				\
+			  goto sub_done;				\
+			}						\
+		      else						\
+			{						\
+			  FP_SET_EXCEPTION (FP_EX_DENORM);		\
+			  _FP_FRAC_SUB_##wc (R, X, Y);			\
+			  R##_s = X##_s;				\
+			  if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs) \
+			    {						\
+			      /* |X| < |Y|, negate result.  */		\
+			      _FP_FRAC_SUB_##wc (R, Y, X);		\
+			      R##_s = Y##_s;				\
+			    }						\
+			  else if (_FP_FRAC_ZEROP_##wc (R))		\
+			    R##_s = (FP_ROUNDMODE == FP_RND_MINF);	\
+			  goto sub_done;				\
+			}						\
+		    }							\
+		  else							\
+		    {							\
+		      /* X and Y are NaN or Inf, of opposite signs.  */	\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, X);		\
+		      _FP_CHECK_SIGNAN_SEMIRAW (fs, wc, Y);		\
+		      R##_e = _FP_EXPMAX_##fs;				\
+		      if (_FP_FRAC_ZEROP_##wc (X))			\
+			{						\
+			  if (_FP_FRAC_ZEROP_##wc (Y))			\
+			    {						\
+			      /* Inf - Inf.  */				\
+			      R##_s = _FP_NANSIGN_##fs;			\
+			      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);	\
+			      _FP_FRAC_SLL_##wc (R, _FP_WORKBITS);	\
+			      FP_SET_EXCEPTION (FP_EX_INVALID);		\
+			    }						\
+			  else						\
+			    {						\
+			      /* Inf - NaN.  */				\
+			      R##_s = Y##_s;				\
+			      _FP_FRAC_COPY_##wc (R, Y);		\
+			    }						\
+			}						\
+		      else						\
+			{						\
+			  if (_FP_FRAC_ZEROP_##wc (Y))			\
+			    {						\
+			      /* NaN - Inf.  */				\
+			      R##_s = X##_s;				\
+			      _FP_FRAC_COPY_##wc (R, X);		\
+			    }						\
+			  else						\
+			    {						\
+			      /* NaN - NaN.  */				\
+			      _FP_CHOOSENAN_SEMIRAW (fs, wc, R, X, Y, OP); \
+			    }						\
+			}						\
+		      goto sub_done;					\
+		    }							\
+		}							\
+	      /* The exponents of X and Y, both normal, are equal.  The	\
+		 implicit MSBs cancel.  */				\
+	      R##_e = X##_e;						\
+	      _FP_FRAC_SUB_##wc (R, X, Y);				\
+	      R##_s = X##_s;						\
+	      if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs)		\
+		{							\
+		  /* |X| < |Y|, negate result.  */			\
+		  _FP_FRAC_SUB_##wc (R, Y, X);				\
+		  R##_s = Y##_s;					\
+		}							\
+	      else if (_FP_FRAC_ZEROP_##wc (R))				\
+		{							\
+		  R##_e = 0;						\
+		  R##_s = (FP_ROUNDMODE == FP_RND_MINF);		\
+		  goto sub_done;					\
+		}							\
+	      goto norm;						\
+	    }								\
+	sub3:								\
+	  if (_FP_FRAC_HIGH_##fs (R) & _FP_IMPLBIT_SH_##fs)		\
+	    {								\
+	      int diff;							\
+	      /* Carry into most significant bit of larger one of X and Y, \
+		 canceling it; renormalize.  */				\
+	      _FP_FRAC_HIGH_##fs (R) &= _FP_IMPLBIT_SH_##fs - 1;	\
+	    norm:							\
+	      _FP_FRAC_CLZ_##wc (diff, R);				\
+	      diff -= _FP_WFRACXBITS_##fs;				\
+	      _FP_FRAC_SLL_##wc (R, diff);				\
+	      if (R##_e <= diff)					\
+		{							\
+		  /* R is denormalized.  */				\
+		  diff = diff - R##_e + 1;				\
+		  _FP_FRAC_SRS_##wc (R, diff, _FP_WFRACBITS_##fs);	\
+		  R##_e = 0;						\
+		}							\
+	      else							\
+		{							\
+		  R##_e -= diff;					\
+		  _FP_FRAC_HIGH_##fs (R) &= ~(_FP_W_TYPE) _FP_IMPLBIT_SH_##fs; \
+		}							\
+	    }								\
+	sub_done: ;							\
+	}								\
+    }									\
+  while (0)
 
-#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL(fs, wc, R, X, Y, '+')
-#define _FP_SUB(fs, wc, R, X, Y)					    \
-  do {									    \
-    if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) Y##_s ^= 1; \
-    _FP_ADD_INTERNAL(fs, wc, R, X, Y, '-');				    \
-  } while (0)
+#define _FP_ADD(fs, wc, R, X, Y) _FP_ADD_INTERNAL (fs, wc, R, X, Y, '+')
+#define _FP_SUB(fs, wc, R, X, Y)					\
+  do									\
+    {									\
+      if (!(Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
+	Y##_s ^= 1;							\
+      _FP_ADD_INTERNAL (fs, wc, R, X, Y, '-');				\
+    }									\
+  while (0)
 
 
 /*
- * Main negation routine.  FIXME -- when we care about setting exception
- * bits reliably, this will not do.  We should examine all of the fp classes.
+ * Main negation routine.  The input value is raw.
  */
 
-#define _FP_NEG(fs, wc, R, X)		\
-  do {					\
-    _FP_FRAC_COPY_##wc(R, X);		\
-    R##_c = X##_c;			\
-    R##_e = X##_e;			\
-    R##_s = 1 ^ X##_s;			\
-  } while (0)
+#define _FP_NEG(fs, wc, R, X)			\
+  do						\
+    {						\
+      _FP_FRAC_COPY_##wc (R, X);		\
+      R##_e = X##_e;				\
+      R##_s = 1 ^ X##_s;			\
+    }						\
+  while (0)
 
 
 /*
  * Main multiplication routine.  The input values should be cooked.
  */
 
-#define _FP_MUL(fs, wc, R, X, Y)			\
-do {							\
-  R##_s = X##_s ^ Y##_s;				\
-  R##_e = X##_e + Y##_e + 1;				\
-  switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
-  {							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):	\
-    R##_c = FP_CLS_NORMAL;				\
-							\
-    _FP_MUL_MEAT_##fs(R,X,Y);				\
-							\
-    if (_FP_FRAC_OVERP_##wc(fs, R))			\
-      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);	\
-    else						\
-      R##_e--;						\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):		\
-    _FP_CHOOSENAN(fs, wc, R, X, Y, '*');		\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):	\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):		\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):		\
-    R##_s = X##_s;					\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):		\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):	\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):	\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):	\
-    _FP_FRAC_COPY_##wc(R, X);				\
-    R##_c = X##_c;					\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):	\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):		\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):		\
-    R##_s = Y##_s;					\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):	\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):	\
-    _FP_FRAC_COPY_##wc(R, Y);				\
-    R##_c = Y##_c;					\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):		\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):		\
-    R##_s = _FP_NANSIGN_##fs;				\
-    R##_c = FP_CLS_NAN;					\
-    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);		\
-    FP_SET_EXCEPTION(FP_EX_INVALID);			\
-    break;						\
-							\
-  default:						\
-    abort();						\
-  }							\
-} while (0)
+#define _FP_MUL(fs, wc, R, X, Y)				\
+  do								\
+    {								\
+      R##_s = X##_s ^ Y##_s;					\
+      R##_e = X##_e + Y##_e + 1;				\
+      switch (_FP_CLS_COMBINE (X##_c, Y##_c))			\
+	{							\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NORMAL):	\
+	  R##_c = FP_CLS_NORMAL;				\
+								\
+	  _FP_MUL_MEAT_##fs (R, X, Y);				\
+								\
+	  if (_FP_FRAC_OVERP_##wc (fs, R))			\
+	    _FP_FRAC_SRS_##wc (R, 1, _FP_WFRACBITS_##fs);	\
+	  else							\
+	    R##_e--;						\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):		\
+	  _FP_CHOOSENAN (fs, wc, R, X, Y, '*');			\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):	\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):		\
+	  R##_s = X##_s;					\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):	\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NORMAL):	\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):	\
+	  _FP_FRAC_COPY_##wc (R, X);				\
+	  R##_c = X##_c;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NAN):	\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NAN):		\
+	  R##_s = Y##_s;					\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_INF):	\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_ZERO):	\
+	  _FP_FRAC_COPY_##wc (R, Y);				\
+	  R##_c = Y##_c;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_INF):		\
+	  R##_s = _FP_NANSIGN_##fs;				\
+	  R##_c = FP_CLS_NAN;					\
+	  _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
+	  FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	  break;						\
+								\
+	default:						\
+	  abort ();						\
+	}							\
+    }								\
+  while (0)
 
 
+/* Fused multiply-add.  The input values should be cooked.  */
+
+#define _FP_FMA(fs, wc, dwc, R, X, Y, Z)				\
+  do									\
+    {									\
+      FP_DECL_##fs (T);							\
+      T##_s = X##_s ^ Y##_s;						\
+      T##_e = X##_e + Y##_e + 1;					\
+      switch (_FP_CLS_COMBINE (X##_c, Y##_c))				\
+	{								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NORMAL):		\
+	  switch (Z##_c)						\
+	    {								\
+	    case FP_CLS_INF:						\
+	    case FP_CLS_NAN:						\
+	      R##_s = Z##_s;						\
+	      _FP_FRAC_COPY_##wc (R, Z);				\
+	      R##_c = Z##_c;						\
+	      break;							\
+									\
+	    case FP_CLS_ZERO:						\
+	      R##_c = FP_CLS_NORMAL;					\
+	      R##_s = T##_s;						\
+	      R##_e = T##_e;						\
+									\
+	      _FP_MUL_MEAT_##fs (R, X, Y);				\
+									\
+	      if (_FP_FRAC_OVERP_##wc (fs, R))				\
+		_FP_FRAC_SRS_##wc (R, 1, _FP_WFRACBITS_##fs);		\
+	      else							\
+		R##_e--;						\
+	      break;							\
+									\
+	    case FP_CLS_NORMAL:;					\
+	      _FP_FRAC_DECL_##dwc (TD);					\
+	      _FP_FRAC_DECL_##dwc (ZD);					\
+	      _FP_FRAC_DECL_##dwc (RD);					\
+	      _FP_MUL_MEAT_DW_##fs (TD, X, Y);				\
+	      R##_e = T##_e;						\
+	      int tsh = _FP_FRAC_HIGHBIT_DW_##dwc (fs, TD) == 0;	\
+	      T##_e -= tsh;						\
+	      int ediff = T##_e - Z##_e;				\
+	      if (ediff >= 0)						\
+		{							\
+		  int shift = _FP_WFRACBITS_##fs - tsh - ediff;		\
+		  if (shift <= -_FP_WFRACBITS_##fs)			\
+		    _FP_FRAC_SET_##dwc (ZD, _FP_MINFRAC_##dwc);		\
+		  else							\
+		    {							\
+		      _FP_FRAC_COPY_##dwc##_##wc (ZD, Z);		\
+		      if (shift < 0)					\
+			_FP_FRAC_SRS_##dwc (ZD, -shift,			\
+					    _FP_WFRACBITS_DW_##fs);	\
+		      else if (shift > 0)				\
+			_FP_FRAC_SLL_##dwc (ZD, shift);			\
+		    }							\
+		  R##_s = T##_s;					\
+		  if (T##_s == Z##_s)					\
+		    _FP_FRAC_ADD_##dwc (RD, TD, ZD);			\
+		  else							\
+		    {							\
+		      _FP_FRAC_SUB_##dwc (RD, TD, ZD);			\
+		      if (_FP_FRAC_NEGP_##dwc (RD))			\
+			{						\
+			  R##_s = Z##_s;				\
+			  _FP_FRAC_SUB_##dwc (RD, ZD, TD);		\
+			}						\
+		    }							\
+		}							\
+	      else							\
+		{							\
+		  R##_e = Z##_e;					\
+		  R##_s = Z##_s;					\
+		  _FP_FRAC_COPY_##dwc##_##wc (ZD, Z);			\
+		  _FP_FRAC_SLL_##dwc (ZD, _FP_WFRACBITS_##fs);		\
+		  int shift = -ediff - tsh;				\
+		  if (shift >= _FP_WFRACBITS_DW_##fs)			\
+		    _FP_FRAC_SET_##dwc (TD, _FP_MINFRAC_##dwc);		\
+		  else if (shift > 0)					\
+		    _FP_FRAC_SRS_##dwc (TD, shift,			\
+					_FP_WFRACBITS_DW_##fs);		\
+		  if (Z##_s == T##_s)					\
+		    _FP_FRAC_ADD_##dwc (RD, ZD, TD);			\
+		  else							\
+		    _FP_FRAC_SUB_##dwc (RD, ZD, TD);			\
+		}							\
+	      if (_FP_FRAC_ZEROP_##dwc (RD))				\
+		{							\
+		  if (T##_s == Z##_s)					\
+		    R##_s = Z##_s;					\
+		  else							\
+		    R##_s = (FP_ROUNDMODE == FP_RND_MINF);		\
+		  _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);		\
+		  R##_c = FP_CLS_ZERO;					\
+		}							\
+	      else							\
+		{							\
+		  int rlz;						\
+		  _FP_FRAC_CLZ_##dwc (rlz, RD);				\
+		  rlz -= _FP_WFRACXBITS_DW_##fs;			\
+		  R##_e -= rlz;						\
+		  int shift = _FP_WFRACBITS_##fs - rlz;			\
+		  if (shift > 0)					\
+		    _FP_FRAC_SRS_##dwc (RD, shift,			\
+					_FP_WFRACBITS_DW_##fs);		\
+		  else if (shift < 0)					\
+		    _FP_FRAC_SLL_##dwc (RD, -shift);			\
+		  _FP_FRAC_COPY_##wc##_##dwc (R, RD);			\
+		  R##_c = FP_CLS_NORMAL;				\
+		}							\
+	      break;							\
+	    }								\
+	  goto done_fma;						\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):			\
+	  _FP_CHOOSENAN (fs, wc, T, X, Y, '*');				\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_INF):			\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):			\
+	  T##_s = X##_s;						\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):			\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):		\
+	  _FP_FRAC_COPY_##wc (T, X);					\
+	  T##_c = X##_c;						\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NAN):		\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):			\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NAN):			\
+	  T##_s = Y##_s;						\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_ZERO):		\
+	  _FP_FRAC_COPY_##wc (T, Y);					\
+	  T##_c = Y##_c;						\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):			\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_INF):			\
+	  T##_s = _FP_NANSIGN_##fs;					\
+	  T##_c = FP_CLS_NAN;						\
+	  _FP_FRAC_SET_##wc (T, _FP_NANFRAC_##fs);			\
+	  FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	  break;							\
+									\
+	default:							\
+	  abort ();							\
+	}								\
+									\
+      /* T = X * Y is zero, infinity or NaN.  */			\
+      switch (_FP_CLS_COMBINE (T##_c, Z##_c))				\
+	{								\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):			\
+	  _FP_CHOOSENAN (fs, wc, R, T, Z, '+');				\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_INF):			\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):			\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):			\
+	  R##_s = T##_s;						\
+	  _FP_FRAC_COPY_##wc (R, T);					\
+	  R##_c = T##_c;						\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):			\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NAN):			\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NORMAL):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_INF):			\
+	  R##_s = Z##_s;						\
+	  _FP_FRAC_COPY_##wc (R, Z);					\
+	  R##_c = Z##_c;						\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):			\
+	  if (T##_s == Z##_s)						\
+	    {								\
+	      R##_s = Z##_s;						\
+	      _FP_FRAC_COPY_##wc (R, Z);				\
+	      R##_c = Z##_c;						\
+	    }								\
+	  else								\
+	    {								\
+	      R##_s = _FP_NANSIGN_##fs;					\
+	      R##_c = FP_CLS_NAN;					\
+	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);			\
+	      FP_SET_EXCEPTION (FP_EX_INVALID);				\
+	    }								\
+	  break;							\
+									\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):		\
+	  if (T##_s == Z##_s)						\
+	    R##_s = Z##_s;						\
+	  else								\
+	    R##_s = (FP_ROUNDMODE == FP_RND_MINF);			\
+	  _FP_FRAC_COPY_##wc (R, Z);					\
+	  R##_c = Z##_c;						\
+	  break;							\
+									\
+	default:							\
+	  abort ();							\
+	}								\
+    done_fma: ;								\
+    }									\
+  while (0)
+
+
 /*
  * Main division routine.  The input values should be cooked.
  */
 
-#define _FP_DIV(fs, wc, R, X, Y)			\
-do {							\
-  R##_s = X##_s ^ Y##_s;				\
-  R##_e = X##_e - Y##_e;				\
-  switch (_FP_CLS_COMBINE(X##_c, Y##_c))		\
-  {							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):	\
-    R##_c = FP_CLS_NORMAL;				\
-							\
-    _FP_DIV_MEAT_##fs(R,X,Y);				\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):		\
-    _FP_CHOOSENAN(fs, wc, R, X, Y, '/');		\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL):	\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF):		\
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO):		\
-    R##_s = X##_s;					\
-    _FP_FRAC_COPY_##wc(R, X);				\
-    R##_c = X##_c;					\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN):	\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN):		\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN):		\
-    R##_s = Y##_s;					\
-    _FP_FRAC_COPY_##wc(R, Y);				\
-    R##_c = Y##_c;					\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):	\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):		\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):	\
-    R##_c = FP_CLS_ZERO;				\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):	\
-    FP_SET_EXCEPTION(FP_EX_DIVZERO);			\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):		\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):	\
-    R##_c = FP_CLS_INF;					\
-    break;						\
-							\
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):		\
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):	\
-    R##_s = _FP_NANSIGN_##fs;				\
-    R##_c = FP_CLS_NAN;					\
-    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);		\
-    FP_SET_EXCEPTION(FP_EX_INVALID);			\
-    break;						\
-							\
-  default:						\
-    abort();						\
-  }							\
-} while (0)
+#define _FP_DIV(fs, wc, R, X, Y)				\
+  do								\
+    {								\
+      R##_s = X##_s ^ Y##_s;					\
+      R##_e = X##_e - Y##_e;					\
+      switch (_FP_CLS_COMBINE (X##_c, Y##_c))			\
+	{							\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NORMAL):	\
+	  R##_c = FP_CLS_NORMAL;				\
+								\
+	  _FP_DIV_MEAT_##fs (R, X, Y);				\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NAN):		\
+	  _FP_CHOOSENAN (fs, wc, R, X, Y, '/');			\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_NORMAL):	\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_NAN, FP_CLS_ZERO):		\
+	  R##_s = X##_s;					\
+	  _FP_FRAC_COPY_##wc (R, X);				\
+	  R##_c = X##_c;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_NAN):	\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NAN):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NAN):		\
+	  R##_s = Y##_s;					\
+	  _FP_FRAC_COPY_##wc (R, Y);				\
+	  R##_c = Y##_c;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_INF):	\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_NORMAL):	\
+	  R##_c = FP_CLS_ZERO;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_NORMAL, FP_CLS_ZERO):	\
+	  FP_SET_EXCEPTION (FP_EX_DIVZERO);			\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_ZERO):		\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_NORMAL):	\
+	  R##_c = FP_CLS_INF;					\
+	  break;						\
+								\
+	case _FP_CLS_COMBINE (FP_CLS_INF, FP_CLS_INF):		\
+	case _FP_CLS_COMBINE (FP_CLS_ZERO, FP_CLS_ZERO):	\
+	  R##_s = _FP_NANSIGN_##fs;				\
+	  R##_c = FP_CLS_NAN;					\
+	  _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
+	  FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	  break;						\
+								\
+	default:						\
+	  abort ();						\
+	}							\
+    }								\
+  while (0)
 
 
 /*
@@ -916,122 +1156,131 @@
  */
 
 #define _FP_CMP(fs, wc, ret, X, Y, un)					\
-  do {									\
-    /* NANs are unordered */						\
-    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))		\
-	|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))	\
-      {									\
-	ret = un;							\
-      }									\
-    else								\
-      {									\
-	int __is_zero_x;						\
-	int __is_zero_y;						\
+  do									\
+    {									\
+      /* NANs are unordered */						\
+      if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
+	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
+	{								\
+	  ret = un;							\
+	}								\
+      else								\
+	{								\
+	  int __is_zero_x;						\
+	  int __is_zero_y;						\
 									\
-	__is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0;	\
-	__is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0;	\
+	  __is_zero_x = (!X##_e && _FP_FRAC_ZEROP_##wc (X)) ? 1 : 0;	\
+	  __is_zero_y = (!Y##_e && _FP_FRAC_ZEROP_##wc (Y)) ? 1 : 0;	\
 									\
-	if (__is_zero_x && __is_zero_y)					\
-		ret = 0;						\
-	else if (__is_zero_x)						\
-		ret = Y##_s ? 1 : -1;					\
-	else if (__is_zero_y)						\
-		ret = X##_s ? -1 : 1;					\
-	else if (X##_s != Y##_s)					\
-	  ret = X##_s ? -1 : 1;						\
-	else if (X##_e > Y##_e)						\
-	  ret = X##_s ? -1 : 1;						\
-	else if (X##_e < Y##_e)						\
-	  ret = X##_s ? 1 : -1;						\
-	else if (_FP_FRAC_GT_##wc(X, Y))				\
-	  ret = X##_s ? -1 : 1;						\
-	else if (_FP_FRAC_GT_##wc(Y, X))				\
-	  ret = X##_s ? 1 : -1;						\
-	else								\
-	  ret = 0;							\
-      }									\
-  } while (0)
+	  if (__is_zero_x && __is_zero_y)				\
+	    ret = 0;							\
+	  else if (__is_zero_x)						\
+	    ret = Y##_s ? 1 : -1;					\
+	  else if (__is_zero_y)						\
+	    ret = X##_s ? -1 : 1;					\
+	  else if (X##_s != Y##_s)					\
+	    ret = X##_s ? -1 : 1;					\
+	  else if (X##_e > Y##_e)					\
+	    ret = X##_s ? -1 : 1;					\
+	  else if (X##_e < Y##_e)					\
+	    ret = X##_s ? 1 : -1;					\
+	  else if (_FP_FRAC_GT_##wc (X, Y))				\
+	    ret = X##_s ? -1 : 1;					\
+	  else if (_FP_FRAC_GT_##wc (Y, X))				\
+	    ret = X##_s ? 1 : -1;					\
+	  else								\
+	    ret = 0;							\
+	}								\
+    }									\
+  while (0)
 
 
 /* Simplification for strict equality.  */
 
-#define _FP_CMP_EQ(fs, wc, ret, X, Y)					    \
-  do {									    \
-    /* NANs are unordered */						    \
-    if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))		    \
-	|| (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)))	    \
-      {									    \
-	ret = 1;							    \
-      }									    \
-    else								    \
-      {									    \
-	ret = !(X##_e == Y##_e						    \
-		&& _FP_FRAC_EQ_##wc(X, Y)				    \
-		&& (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc(X)))); \
-      }									    \
-  } while (0)
+#define _FP_CMP_EQ(fs, wc, ret, X, Y)					\
+  do									\
+    {									\
+      /* NANs are unordered */						\
+      if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
+	  || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y)))	\
+	{								\
+	  ret = 1;							\
+	}								\
+      else								\
+	{								\
+	  ret = !(X##_e == Y##_e					\
+		  && _FP_FRAC_EQ_##wc (X, Y)				\
+		  && (X##_s == Y##_s || (!X##_e && _FP_FRAC_ZEROP_##wc (X)))); \
+	}								\
+    }									\
+  while (0)
 
 /* Version to test unordered.  */
 
 #define _FP_CMP_UNORD(fs, wc, ret, X, Y)				\
-  do {									\
-    ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))	\
-	   || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y)));	\
-  } while (0)
+  do									\
+    {									\
+      ret = ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (X))	\
+	     || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc (Y))); \
+    }									\
+  while (0)
 
 /*
  * Main square root routine.  The input value should be cooked.
  */
 
-#define _FP_SQRT(fs, wc, R, X)						\
-do {									\
-    _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S);			\
-    _FP_W_TYPE q;							\
-    switch (X##_c)							\
-    {									\
-    case FP_CLS_NAN:							\
-	_FP_FRAC_COPY_##wc(R, X);					\
-	R##_s = X##_s;							\
-	R##_c = FP_CLS_NAN;						\
-	break;								\
-    case FP_CLS_INF:							\
-	if (X##_s)							\
-	  {								\
-	    R##_s = _FP_NANSIGN_##fs;					\
-	    R##_c = FP_CLS_NAN; /* NAN */				\
-	    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);			\
-	    FP_SET_EXCEPTION(FP_EX_INVALID);				\
-	  }								\
-	else								\
-	  {								\
-	    R##_s = 0;							\
-	    R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */			\
-	  }								\
-	break;								\
-    case FP_CLS_ZERO:							\
-	R##_s = X##_s;							\
-	R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */			\
-	break;								\
-    case FP_CLS_NORMAL:							\
-	R##_s = 0;							\
-        if (X##_s)							\
-          {								\
-	    R##_c = FP_CLS_NAN; /* NAN */				\
-	    R##_s = _FP_NANSIGN_##fs;					\
-	    _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);			\
-	    FP_SET_EXCEPTION(FP_EX_INVALID);				\
-	    break;							\
-          }								\
-	R##_c = FP_CLS_NORMAL;						\
-        if (X##_e & 1)							\
-          _FP_FRAC_SLL_##wc(X, 1);					\
-        R##_e = X##_e >> 1;						\
-        _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc);			\
-        _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc);			\
-        q = _FP_OVERFLOW_##fs >> 1;					\
-        _FP_SQRT_MEAT_##wc(R, S, T, X, q);				\
-    }									\
-  } while (0)
+#define _FP_SQRT(fs, wc, R, X)					\
+  do								\
+    {								\
+      _FP_FRAC_DECL_##wc (T);					\
+      _FP_FRAC_DECL_##wc (S);					\
+      _FP_W_TYPE q;						\
+      switch (X##_c)						\
+	{							\
+	case FP_CLS_NAN:					\
+	  _FP_FRAC_COPY_##wc (R, X);				\
+	  R##_s = X##_s;					\
+	  R##_c = FP_CLS_NAN;					\
+	  break;						\
+	case FP_CLS_INF:					\
+	  if (X##_s)						\
+	    {							\
+	      R##_s = _FP_NANSIGN_##fs;				\
+	      R##_c = FP_CLS_NAN; /* NAN */			\
+	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
+	      FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	    }							\
+	  else							\
+	    {							\
+	      R##_s = 0;					\
+	      R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */	\
+	    }							\
+	  break;						\
+	case FP_CLS_ZERO:					\
+	  R##_s = X##_s;					\
+	  R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */		\
+	  break;						\
+	case FP_CLS_NORMAL:					\
+	  R##_s = 0;						\
+	  if (X##_s)						\
+	    {							\
+	      R##_c = FP_CLS_NAN; /* NAN */			\
+	      R##_s = _FP_NANSIGN_##fs;				\
+	      _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);		\
+	      FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	      break;						\
+	    }							\
+	  R##_c = FP_CLS_NORMAL;				\
+	  if (X##_e & 1)					\
+	    _FP_FRAC_SLL_##wc (X, 1);				\
+	  R##_e = X##_e >> 1;					\
+	  _FP_FRAC_SET_##wc (S, _FP_ZEROFRAC_##wc);		\
+	  _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);		\
+	  q = _FP_OVERFLOW_##fs >> 1;				\
+	  _FP_SQRT_MEAT_##wc (R, S, T, X, q);			\
+	}							\
+    }								\
+  while (0)
 
 /*
  * Convert from FP to integer.  Input is raw.
@@ -1049,292 +1298,306 @@
  *     depending on the sign in such case.
  */
 #define _FP_TO_INT(fs, wc, r, X, rsize, rsigned)			\
-do {									\
-  if (X##_e < _FP_EXPBIAS_##fs)						\
+  do									\
     {									\
-      r = 0;								\
-      if (X##_e == 0)							\
+      if (X##_e < _FP_EXPBIAS_##fs)					\
 	{								\
-	  if (!_FP_FRAC_ZEROP_##wc(X))					\
+	  r = 0;							\
+	  if (X##_e == 0)						\
 	    {								\
-	      FP_SET_EXCEPTION(FP_EX_INEXACT);				\
-	      FP_SET_EXCEPTION(FP_EX_DENORM);				\
+	      if (!_FP_FRAC_ZEROP_##wc (X))				\
+		{							\
+		  FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		}							\
 	    }								\
+	  else								\
+	    FP_SET_EXCEPTION (FP_EX_INEXACT);				\
 	}								\
-      else								\
-	FP_SET_EXCEPTION(FP_EX_INEXACT);				\
-    }									\
-  else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s)	\
-	   || (!rsigned && X##_s))					\
-    {									\
-      /* Overflow or converting to the most negative integer.  */	\
-      if (rsigned)							\
+      else if (X##_e >= _FP_EXPBIAS_##fs + rsize - (rsigned > 0 || X##_s) \
+	       || (!rsigned && X##_s))					\
 	{								\
-	  r = 1;							\
-	  r <<= rsize - 1;						\
-	  r -= 1 - X##_s;						\
-	} else {							\
-	  r = 0;							\
-	  if (X##_s)							\
-	    r = ~r;							\
+	  /* Overflow or converting to the most negative integer.  */	\
+	  if (rsigned)							\
+	    {								\
+	      r = 1;							\
+	      r <<= rsize - 1;						\
+	      r -= 1 - X##_s;						\
+	    } else {							\
+	    r = 0;							\
+	    if (!X##_s)							\
+	      r = ~r;							\
+	  }								\
+									\
+	  if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1) \
+	    {								\
+	      /* Possibly converting to most negative integer; check the \
+		 mantissa.  */						\
+	      int inexact = 0;						\
+	      (void) ((_FP_FRACBITS_##fs > rsize)			\
+		      ? ({						\
+			  _FP_FRAC_SRST_##wc (X, inexact,		\
+					      _FP_FRACBITS_##fs - rsize, \
+					      _FP_FRACBITS_##fs);	\
+			  0;						\
+			})						\
+		      : 0);						\
+	      if (!_FP_FRAC_ZEROP_##wc (X))				\
+		FP_SET_EXCEPTION (FP_EX_INVALID);			\
+	      else if (inexact)						\
+		FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+	    }								\
+	  else								\
+	    FP_SET_EXCEPTION (FP_EX_INVALID);				\
 	}								\
-									\
-      if (rsigned && X##_s && X##_e == _FP_EXPBIAS_##fs + rsize - 1)	\
+      else								\
 	{								\
-	  /* Possibly converting to most negative integer; check the	\
-	     mantissa.  */						\
-	  int inexact = 0;						\
-	  (void)((_FP_FRACBITS_##fs > rsize)				\
-		 ? ({ _FP_FRAC_SRST_##wc(X, inexact,			\
-					 _FP_FRACBITS_##fs - rsize,	\
-					 _FP_FRACBITS_##fs); 0; })	\
-		 : 0);							\
-	  if (!_FP_FRAC_ZEROP_##wc(X))					\
-	    FP_SET_EXCEPTION(FP_EX_INVALID);				\
-	  else if (inexact)						\
-	    FP_SET_EXCEPTION(FP_EX_INEXACT);				\
+	  _FP_FRAC_HIGH_RAW_##fs (X) |= _FP_IMPLBIT_##fs;		\
+	  if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)	\
+	    {								\
+	      _FP_FRAC_ASSEMBLE_##wc (r, X, rsize);			\
+	      r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1;	\
+	    }								\
+	  else								\
+	    {								\
+	      int inexact;						\
+	      _FP_FRAC_SRST_##wc (X, inexact,				\
+				  (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1 \
+				   - X##_e),				\
+				  _FP_FRACBITS_##fs);			\
+	      if (inexact)						\
+		FP_SET_EXCEPTION (FP_EX_INEXACT);			\
+	      _FP_FRAC_ASSEMBLE_##wc (r, X, rsize);			\
+	    }								\
+	  if (rsigned && X##_s)						\
+	    r = -r;							\
 	}								\
-      else								\
-	FP_SET_EXCEPTION(FP_EX_INVALID);				\
     }									\
-  else									\
+  while (0)
+
+/* Convert integer to fp.  Output is raw.  RTYPE is unsigned even if
+   input is signed.  */
+#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)			\
+  do									\
     {									\
-      _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_IMPLBIT_##fs;			\
-      if (X##_e >= _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1)		\
+      if (r)								\
 	{								\
-	  _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);				\
-	  r <<= X##_e - _FP_EXPBIAS_##fs - _FP_FRACBITS_##fs + 1;	\
+	  rtype ur_;							\
+									\
+	  if ((X##_s = (r < 0)))					\
+	    r = -(rtype) r;						\
+									\
+	  ur_ = (rtype) r;						\
+	  (void) ((rsize <= _FP_W_TYPE_SIZE)				\
+		  ? ({							\
+		      int lz_;						\
+		      __FP_CLZ (lz_, (_FP_W_TYPE) ur_);			\
+		      X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_; \
+		    })							\
+		  : ((rsize <= 2 * _FP_W_TYPE_SIZE)			\
+		     ? ({						\
+			 int lz_;					\
+			 __FP_CLZ_2 (lz_,				\
+				     (_FP_W_TYPE) (ur_ >> _FP_W_TYPE_SIZE), \
+				     (_FP_W_TYPE) ur_);			\
+			 X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1 \
+				  - lz_);				\
+		       })						\
+		     : (abort (), 0)));					\
+									\
+	  if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		\
+	      && X##_e >= _FP_EXPMAX_##fs)				\
+	    {								\
+	      /* Exponent too big; overflow to infinity.  (May also	\
+		 happen after rounding below.)  */			\
+	      _FP_OVERFLOW_SEMIRAW (fs, wc, X);				\
+	      goto pack_semiraw;					\
+	    }								\
+									\
+	  if (rsize <= _FP_FRACBITS_##fs				\
+	      || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs)		\
+	    {								\
+	      /* Exactly representable; shift left.  */			\
+	      _FP_FRAC_DISASSEMBLE_##wc (X, ur_, rsize);		\
+	      if (_FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1 - X##_e > 0)	\
+		_FP_FRAC_SLL_##wc (X, (_FP_EXPBIAS_##fs			\
+				       + _FP_FRACBITS_##fs - 1 - X##_e)); \
+	    }								\
+	  else								\
+	    {								\
+	      /* More bits in integer than in floating type; need to	\
+		 round.  */						\
+	      if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e)	\
+		ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs		\
+				- _FP_WFRACBITS_##fs + 1))		\
+		       | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs	\
+					    - _FP_WFRACBITS_##fs + 1)))	\
+			  != 0));					\
+	      _FP_FRAC_DISASSEMBLE_##wc (X, ur_, rsize);		\
+	      if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0) \
+		_FP_FRAC_SLL_##wc (X, (_FP_EXPBIAS_##fs			\
+				       + _FP_WFRACBITS_##fs - 1 - X##_e)); \
+	      _FP_FRAC_HIGH_##fs (X) &= ~(_FP_W_TYPE) _FP_IMPLBIT_SH_##fs; \
+	    pack_semiraw:						\
+	      _FP_PACK_SEMIRAW (fs, wc, X);				\
+	    }								\
 	}								\
       else								\
 	{								\
-	  int inexact;							\
-	  _FP_FRAC_SRST_##wc(X, inexact,				\
-			    (_FP_FRACBITS_##fs + _FP_EXPBIAS_##fs - 1	\
-			     - X##_e),					\
-			    _FP_FRACBITS_##fs);				\
-	  if (inexact)							\
-	    FP_SET_EXCEPTION(FP_EX_INEXACT);				\
-	  _FP_FRAC_ASSEMBLE_##wc(r, X, rsize);				\
+	  X##_s = 0;							\
+	  X##_e = 0;							\
+	  _FP_FRAC_SET_##wc (X, _FP_ZEROFRAC_##wc);			\
 	}								\
-      if (rsigned && X##_s)						\
-	r = -r;								\
     }									\
-} while (0)
+  while (0)
 
-/* Convert integer to fp.  Output is raw.  RTYPE is unsigned even if
-   input is signed.  */
-#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype)			     \
-  do {									     \
-    if (r)								     \
-      {									     \
-	rtype ur_;							     \
-									     \
-	if ((X##_s = (r < 0)))						     \
-	  r = -(rtype)r;						     \
-									     \
-	ur_ = (rtype) r;						     \
-	(void)((rsize <= _FP_W_TYPE_SIZE)				     \
-	       ? ({							     \
-		    int lz_;						     \
-		    __FP_CLZ(lz_, (_FP_W_TYPE)ur_);			     \
-		    X##_e = _FP_EXPBIAS_##fs + _FP_W_TYPE_SIZE - 1 - lz_;    \
-		  })							     \
-	       : ((rsize <= 2 * _FP_W_TYPE_SIZE)			     \
-		  ? ({							     \
-		       int lz_;						     \
-		       __FP_CLZ_2(lz_, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE), \
-				  (_FP_W_TYPE)ur_);			     \
-		       X##_e = (_FP_EXPBIAS_##fs + 2 * _FP_W_TYPE_SIZE - 1   \
-				- lz_);					     \
-		     })							     \
-		  : (abort(), 0)));					     \
-									     \
-	if (rsize - 1 + _FP_EXPBIAS_##fs >= _FP_EXPMAX_##fs		     \
-	    && X##_e >= _FP_EXPMAX_##fs)				     \
-	  {								     \
-	    /* Exponent too big; overflow to infinity.  (May also	     \
-	       happen after rounding below.)  */			     \
-	    _FP_OVERFLOW_SEMIRAW(fs, wc, X);				     \
-	    goto pack_semiraw;						     \
-	  }								     \
-									     \
-	if (rsize <= _FP_FRACBITS_##fs					     \
-	    || X##_e < _FP_EXPBIAS_##fs + _FP_FRACBITS_##fs)		     \
-	  {								     \
-	    /* Exactly representable; shift left.  */			     \
-	    _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);			     \
-	    if (_FP_EXPBIAS_##fs + _FP_FRACBITS_##fs - 1 - X##_e > 0)	     \
-	      _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs			     \
-				    + _FP_FRACBITS_##fs - 1 - X##_e));	     \
-	  }								     \
-	else								     \
-	  {								     \
-	    /* More bits in integer than in floating type; need to	     \
-	       round.  */						     \
-	    if (_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 < X##_e)	     \
-	      ur_ = ((ur_ >> (X##_e - _FP_EXPBIAS_##fs			     \
-			      - _FP_WFRACBITS_##fs + 1))		     \
-		     | ((ur_ << (rsize - (X##_e - _FP_EXPBIAS_##fs	     \
-					  - _FP_WFRACBITS_##fs + 1)))	     \
-			!= 0));						     \
-	    _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);			     \
-	    if ((_FP_EXPBIAS_##fs + _FP_WFRACBITS_##fs - 1 - X##_e) > 0)     \
-	      _FP_FRAC_SLL_##wc(X, (_FP_EXPBIAS_##fs			     \
-				    + _FP_WFRACBITS_##fs - 1 - X##_e));	     \
-	    _FP_FRAC_HIGH_##fs(X) &= ~(_FP_W_TYPE)_FP_IMPLBIT_SH_##fs;	     \
-	  pack_semiraw:							     \
-	    _FP_PACK_SEMIRAW(fs, wc, X);				     \
-	  }								     \
-      }									     \
-    else								     \
-      {									     \
-	X##_s = 0;							     \
-	X##_e = 0;							     \
-	_FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);			     \
-      }									     \
-  } while (0)
 
-
 /* Extend from a narrower floating-point format to a wider one.  Input
    and output are raw.  */
-#define FP_EXTEND(dfs,sfs,dwc,swc,D,S)					 \
-do {									 \
-  if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs				 \
-      || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs				 \
-	  < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs)			 \
-      || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
-	  && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs))			 \
-    abort();								 \
-  D##_s = S##_s;							 \
-  _FP_FRAC_COPY_##dwc##_##swc(D, S);					 \
-  if (_FP_EXP_NORMAL(sfs, swc, S))					 \
-    {									 \
-      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;		 \
-      _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs - _FP_FRACBITS_##sfs));	 \
-    }									 \
-  else									 \
-    {									 \
-      if (S##_e == 0)							 \
-	{								 \
-	  if (_FP_FRAC_ZEROP_##swc(S))					 \
-	    D##_e = 0;							 \
-	  else if (_FP_EXPBIAS_##dfs					 \
-		   < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1)	 \
-	    {								 \
-	      FP_SET_EXCEPTION(FP_EX_DENORM);				 \
-	      _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs			 \
-				     - _FP_FRACBITS_##sfs));		 \
-	      D##_e = 0;						 \
-	    }								 \
-	  else								 \
-	    {								 \
-	      int _lz;							 \
-	      FP_SET_EXCEPTION(FP_EX_DENORM);				 \
-	      _FP_FRAC_CLZ_##swc(_lz, S);				 \
-	      _FP_FRAC_SLL_##dwc(D,					 \
-				 _lz + _FP_FRACBITS_##dfs		 \
-				 - _FP_FRACTBITS_##sfs);		 \
-	      D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1	 \
-		       + _FP_FRACXBITS_##sfs - _lz);			 \
-	    }								 \
-	}								 \
-      else								 \
-	{								 \
-	  D##_e = _FP_EXPMAX_##dfs;					 \
-	  if (!_FP_FRAC_ZEROP_##swc(S))					 \
-	    {								 \
-	      if (_FP_FRAC_SNANP(sfs, S))				 \
-		FP_SET_EXCEPTION(FP_EX_INVALID);			 \
-	      _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs			 \
-				     - _FP_FRACBITS_##sfs));		 \
-	    }								 \
-	}								 \
-    }									 \
-} while (0)
+#define FP_EXTEND(dfs, sfs, dwc, swc, D, S)				\
+  do									\
+    {									\
+      if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs			\
+	  || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs			\
+	      < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs)			\
+	  || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
+	      && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs))		\
+	abort ();							\
+      D##_s = S##_s;							\
+      _FP_FRAC_COPY_##dwc##_##swc (D, S);				\
+      if (_FP_EXP_NORMAL (sfs, swc, S))					\
+	{								\
+	  D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;	\
+	  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs - _FP_FRACBITS_##sfs)); \
+	}								\
+      else								\
+	{								\
+	  if (S##_e == 0)						\
+	    {								\
+	      if (_FP_FRAC_ZEROP_##swc (S))				\
+		D##_e = 0;						\
+	      else if (_FP_EXPBIAS_##dfs				\
+		       < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1)	\
+		{							\
+		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
+					  - _FP_FRACBITS_##sfs));	\
+		  D##_e = 0;						\
+		}							\
+	      else							\
+		{							\
+		  int _lz;						\
+		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		  _FP_FRAC_CLZ_##swc (_lz, S);				\
+		  _FP_FRAC_SLL_##dwc (D,				\
+				      _lz + _FP_FRACBITS_##dfs		\
+				      - _FP_FRACTBITS_##sfs);		\
+		  D##_e = (_FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs + 1	\
+			   + _FP_FRACXBITS_##sfs - _lz);		\
+		}							\
+	    }								\
+	  else								\
+	    {								\
+	      D##_e = _FP_EXPMAX_##dfs;					\
+	      if (!_FP_FRAC_ZEROP_##swc (S))				\
+		{							\
+		  if (_FP_FRAC_SNANP (sfs, S))				\
+		    FP_SET_EXCEPTION (FP_EX_INVALID);			\
+		  _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs		\
+					  - _FP_FRACBITS_##sfs));	\
+		  _FP_SETQNAN (dfs, dwc, D);				\
+		}							\
+	    }								\
+	}								\
+    }									\
+  while (0)
 
 /* Truncate from a wider floating-point format to a narrower one.
    Input and output are semi-raw.  */
-#define FP_TRUNC(dfs,sfs,dwc,swc,D,S)					     \
-do {									     \
-  if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs				     \
-      || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1     \
-	  && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs))			     \
-    abort();								     \
-  D##_s = S##_s;							     \
-  if (_FP_EXP_NORMAL(sfs, swc, S))					     \
-    {									     \
-      D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;		     \
-      if (D##_e >= _FP_EXPMAX_##dfs)					     \
-	_FP_OVERFLOW_SEMIRAW(dfs, dwc, D);				     \
-      else								     \
-	{								     \
-	  if (D##_e <= 0)						     \
-	    {								     \
-	      if (D##_e < 1 - _FP_FRACBITS_##dfs)			     \
-		{							     \
-		  _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc);		     \
-		  _FP_FRAC_LOW_##swc(S) |= 1;				     \
-		}							     \
-	      else							     \
-		{							     \
-		  _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs;	     \
-		  _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs		     \
-					 - _FP_WFRACBITS_##dfs + 1 - D##_e), \
-				     _FP_WFRACBITS_##sfs);		     \
-		}							     \
-	      D##_e = 0;						     \
-	    }								     \
-	  else								     \
-	    _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs			     \
-				   - _FP_WFRACBITS_##dfs),		     \
-			       _FP_WFRACBITS_##sfs);			     \
-	  _FP_FRAC_COPY_##dwc##_##swc(D, S);				     \
-	}								     \
-    }									     \
-  else									     \
-    {									     \
-      if (S##_e == 0)							     \
-	{								     \
-	  D##_e = 0;							     \
-	  if (_FP_FRAC_ZEROP_##swc(S))					     \
-	    _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);			     \
-	  else								     \
-	    {								     \
-	      FP_SET_EXCEPTION(FP_EX_DENORM);				     \
-	      if (_FP_EXPBIAS_##sfs					     \
-		  < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1)		     \
-		{							     \
-		  _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs		     \
-					 - _FP_WFRACBITS_##dfs),	     \
-				     _FP_WFRACBITS_##sfs);		     \
-		  _FP_FRAC_COPY_##dwc##_##swc(D, S);			     \
-		}							     \
-	      else							     \
-		{							     \
-		  _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);		     \
-		  _FP_FRAC_LOW_##dwc(D) |= 1;				     \
-		}							     \
-	    }								     \
-	}								     \
-      else								     \
-	{								     \
-	  D##_e = _FP_EXPMAX_##dfs;					     \
-	  if (_FP_FRAC_ZEROP_##swc(S))					     \
-	    _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc);			     \
-	  else								     \
-	    {								     \
-	      _FP_CHECK_SIGNAN_SEMIRAW(sfs, swc, S);			     \
-	      _FP_FRAC_SRL_##swc(S, (_FP_WFRACBITS_##sfs		     \
-				     - _FP_WFRACBITS_##dfs));		     \
-	      _FP_FRAC_COPY_##dwc##_##swc(D, S);			     \
-	      /* Semi-raw NaN must have all workbits cleared.  */	     \
-	      _FP_FRAC_LOW_##dwc(D)					     \
-		&= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);		     \
-	      _FP_SETQNAN_SEMIRAW(dfs, dwc, D);				     \
-	    }								     \
-	}								     \
-    }									     \
-} while (0)
+#define FP_TRUNC(dfs, sfs, dwc, swc, D, S)				\
+  do									\
+    {									\
+      if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs			\
+	  || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
+	      && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs))		\
+	abort ();							\
+      D##_s = S##_s;							\
+      if (_FP_EXP_NORMAL (sfs, swc, S))					\
+	{								\
+	  D##_e = S##_e + _FP_EXPBIAS_##dfs - _FP_EXPBIAS_##sfs;	\
+	  if (D##_e >= _FP_EXPMAX_##dfs)				\
+	    _FP_OVERFLOW_SEMIRAW (dfs, dwc, D);				\
+	  else								\
+	    {								\
+	      if (D##_e <= 0)						\
+		{							\
+		  if (D##_e < 1 - _FP_FRACBITS_##dfs)			\
+		    {							\
+		      _FP_FRAC_SET_##swc (S, _FP_ZEROFRAC_##swc);	\
+		      _FP_FRAC_LOW_##swc (S) |= 1;			\
+		    }							\
+		  else							\
+		    {							\
+		      _FP_FRAC_HIGH_##sfs (S) |= _FP_IMPLBIT_SH_##sfs;	\
+		      _FP_FRAC_SRS_##swc (S, (_FP_WFRACBITS_##sfs	\
+					      - _FP_WFRACBITS_##dfs	\
+					      + 1 - D##_e),		\
+					  _FP_WFRACBITS_##sfs);		\
+		    }							\
+		  D##_e = 0;						\
+		}							\
+	      else							\
+		_FP_FRAC_SRS_##swc (S, (_FP_WFRACBITS_##sfs		\
+					- _FP_WFRACBITS_##dfs),		\
+				    _FP_WFRACBITS_##sfs);		\
+	      _FP_FRAC_COPY_##dwc##_##swc (D, S);			\
+	    }								\
+	}								\
+      else								\
+	{								\
+	  if (S##_e == 0)						\
+	    {								\
+	      D##_e = 0;						\
+	      if (_FP_FRAC_ZEROP_##swc (S))				\
+		_FP_FRAC_SET_##dwc (D, _FP_ZEROFRAC_##dwc);		\
+	      else							\
+		{							\
+		  FP_SET_EXCEPTION (FP_EX_DENORM);			\
+		  if (_FP_EXPBIAS_##sfs					\
+		      < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1)	\
+		    {							\
+		      _FP_FRAC_SRS_##swc (S, (_FP_WFRACBITS_##sfs	\
+					      - _FP_WFRACBITS_##dfs),	\
+					  _FP_WFRACBITS_##sfs);		\
+		      _FP_FRAC_COPY_##dwc##_##swc (D, S);		\
+		    }							\
+		  else							\
+		    {							\
+		      _FP_FRAC_SET_##dwc (D, _FP_ZEROFRAC_##dwc);	\
+		      _FP_FRAC_LOW_##dwc (D) |= 1;			\
+		    }							\
+		}							\
+	    }								\
+	  else								\
+	    {								\
+	      D##_e = _FP_EXPMAX_##dfs;					\
+	      if (_FP_FRAC_ZEROP_##swc (S))				\
+		_FP_FRAC_SET_##dwc (D, _FP_ZEROFRAC_##dwc);		\
+	      else							\
+		{							\
+		  _FP_CHECK_SIGNAN_SEMIRAW (sfs, swc, S);		\
+		  _FP_FRAC_SRL_##swc (S, (_FP_WFRACBITS_##sfs		\
+					  - _FP_WFRACBITS_##dfs));	\
+		  _FP_FRAC_COPY_##dwc##_##swc (D, S);			\
+		  /* Semi-raw NaN must have all workbits cleared.  */	\
+		  _FP_FRAC_LOW_##dwc (D)				\
+		    &= ~(_FP_W_TYPE) ((1 << _FP_WORKBITS) - 1);		\
+		  _FP_SETQNAN_SEMIRAW (dfs, dwc, D);			\
+		}							\
+	    }								\
+	}								\
+    }									\
+  while (0)
 
 /*
  * Helper primitives.
@@ -1344,64 +1607,72 @@
 
 #ifndef __FP_CLZ
 /* GCC 3.4 and later provide the builtins for us.  */
-#define __FP_CLZ(r, x)							      \
-  do {									      \
-    if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))			      \
-      r = __builtin_clz (x);						      \
-    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))		      \
-      r = __builtin_clzl (x);						      \
-    else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))	      \
-      r = __builtin_clzll (x);						      \
-    else								      \
-      abort ();								      \
-  } while (0)
+# define __FP_CLZ(r, x)							\
+  do									\
+    {									\
+      if (sizeof (_FP_W_TYPE) == sizeof (unsigned int))			\
+	r = __builtin_clz (x);						\
+      else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long))		\
+	r = __builtin_clzl (x);						\
+      else if (sizeof (_FP_W_TYPE) == sizeof (unsigned long long))	\
+	r = __builtin_clzll (x);					\
+      else								\
+	abort ();							\
+    }									\
+  while (0)
 #endif /* ndef __FP_CLZ */
 
 #define _FP_DIV_HELP_imm(q, r, n, d)		\
-  do {						\
-    q = n / d, r = n % d;			\
-  } while (0)
+  do						\
+    {						\
+      q = n / d, r = n % d;			\
+    }						\
+  while (0)
 
 
 /* A restoring bit-by-bit division primitive.  */
 
 #define _FP_DIV_MEAT_N_loop(fs, wc, R, X, Y)				\
-  do {									\
-    int count = _FP_WFRACBITS_##fs;					\
-    _FP_FRAC_DECL_##wc (u);						\
-    _FP_FRAC_DECL_##wc (v);						\
-    _FP_FRAC_COPY_##wc (u, X);						\
-    _FP_FRAC_COPY_##wc (v, Y);						\
-    _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);				\
-    /* Normalize U and V.  */						\
-    _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs);				\
-    _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs);				\
-    /* First round.  Since the operands are normalized, either the	\
-       first or second bit will be set in the fraction.  Produce a	\
-       normalized result by checking which and adjusting the loop	\
-       count and exponent accordingly.  */				\
-    if (_FP_FRAC_GE_1 (u, v))						\
-      {									\
-	_FP_FRAC_SUB_##wc (u, u, v);					\
-	_FP_FRAC_LOW_##wc (R) |= 1;					\
-	count--;							\
-      }									\
-    else								\
-      R##_e--;								\
-    /* Subsequent rounds.  */						\
-    do {								\
-      int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0;		\
-      _FP_FRAC_SLL_##wc (u, 1);						\
-      _FP_FRAC_SLL_##wc (R, 1);						\
-      if (msb || _FP_FRAC_GE_1 (u, v))					\
+  do									\
+    {									\
+      int count = _FP_WFRACBITS_##fs;					\
+      _FP_FRAC_DECL_##wc (u);						\
+      _FP_FRAC_DECL_##wc (v);						\
+      _FP_FRAC_COPY_##wc (u, X);					\
+      _FP_FRAC_COPY_##wc (v, Y);					\
+      _FP_FRAC_SET_##wc (R, _FP_ZEROFRAC_##wc);				\
+      /* Normalize U and V.  */						\
+      _FP_FRAC_SLL_##wc (u, _FP_WFRACXBITS_##fs);			\
+      _FP_FRAC_SLL_##wc (v, _FP_WFRACXBITS_##fs);			\
+      /* First round.  Since the operands are normalized, either the	\
+	 first or second bit will be set in the fraction.  Produce a	\
+	 normalized result by checking which and adjusting the loop	\
+	 count and exponent accordingly.  */				\
+      if (_FP_FRAC_GE_1 (u, v))						\
 	{								\
 	  _FP_FRAC_SUB_##wc (u, u, v);					\
 	  _FP_FRAC_LOW_##wc (R) |= 1;					\
+	  count--;							\
 	}								\
-    } while (--count > 0);						\
-    /* If there's anything left in U, the result is inexact.  */	\
-    _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u);			\
-  } while (0)
+      else								\
+	R##_e--;							\
+      /* Subsequent rounds.  */						\
+      do								\
+	{								\
+	  int msb = (_FP_WS_TYPE) _FP_FRAC_HIGH_##wc (u) < 0;		\
+	  _FP_FRAC_SLL_##wc (u, 1);					\
+	  _FP_FRAC_SLL_##wc (R, 1);					\
+	  if (msb || _FP_FRAC_GE_1 (u, v))				\
+	    {								\
+	      _FP_FRAC_SUB_##wc (u, u, v);				\
+	      _FP_FRAC_LOW_##wc (R) |= 1;				\
+	    }								\
+	}								\
+      while (--count > 0);						\
+      /* If there's anything left in U, the result is inexact.  */	\
+      _FP_FRAC_LOW_##wc (R) |= !_FP_FRAC_ZEROP_##wc (u);		\
+    }									\
+  while (0)
 
 #define _FP_DIV_MEAT_1_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 1, R, X, Y)
 #define _FP_DIV_MEAT_2_loop(fs, R, X, Y)  _FP_DIV_MEAT_N_loop (fs, 2, R, X, Y)
Index: libgcc/soft-fp/floatsidf.c
===================================================================
--- libgcc/soft-fp/floatsidf.c	(revision 204460)
+++ libgcc/soft-fp/floatsidf.c	(working copy)
@@ -28,18 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floatsidf(SItype i)
+DFtype
+__floatsidf (SItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_D (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_D (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/extendsfdf2.c
===================================================================
--- libgcc/soft-fp/extendsfdf2.c	(revision 204460)
+++ libgcc/soft-fp/extendsfdf2.c	(working copy)
@@ -32,21 +32,22 @@
 #include "single.h"
 #include "double.h"
 
-DFtype __extendsfdf2(SFtype a)
+DFtype
+__extendsfdf2 (SFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_S(A);
-  FP_DECL_D(R);
+  FP_DECL_S (A);
+  FP_DECL_D (R);
   DFtype r;
 
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_RAW_S(A, a);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
 #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
-  FP_EXTEND(D,S,2,1,R,A);
+  FP_EXTEND (D, S, 2, 1, R, A);
 #else
-  FP_EXTEND(D,S,1,1,R,A);
+  FP_EXTEND (D, S, 1, 1, R, A);
 #endif
-  FP_PACK_RAW_D(r, R);
+  FP_PACK_RAW_D (r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/fixtfsi.c
===================================================================
--- libgcc/soft-fp/fixtfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixtfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-SItype __fixtfsi(TFtype a)
+SItype
+__fixtfsi (TFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A);
+  FP_DECL_Q (A);
   USItype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, SI_BITS, 1);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_TO_INT_Q (r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: libgcc/soft-fp/floatunsidf.c
===================================================================
--- libgcc/soft-fp/floatunsidf.c	(revision 204460)
+++ libgcc/soft-fp/floatunsidf.c	(working copy)
@@ -28,18 +28,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#define FP_NO_EXCEPTIONS
 #include "soft-fp.h"
 #include "double.h"
 
-DFtype __floatunsidf(USItype i)
+DFtype
+__floatunsidf (USItype i)
 {
-  FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   DFtype a;
 
-  FP_FROM_INT_D(A, i, SI_BITS, USItype);
-  FP_PACK_RAW_D(a, A);
-  FP_HANDLE_EXCEPTIONS;
+  FP_FROM_INT_D (A, i, SI_BITS, USItype);
+  FP_PACK_RAW_D (a, A);
 
   return a;
 }
Index: libgcc/soft-fp/double.h
===================================================================
--- libgcc/soft-fp/double.h	(revision 204460)
+++ libgcc/soft-fp/double.h	(working copy)
@@ -31,13 +31,15 @@
    <http://www.gnu.org/licenses/>.  */
 
 #if _FP_W_TYPE_SIZE < 32
-#error "Here's a nickel kid.  Go buy yourself a real computer."
+# error "Here's a nickel kid.  Go buy yourself a real computer."
 #endif
 
 #if _FP_W_TYPE_SIZE < 64
-#define _FP_FRACTBITS_D		(2 * _FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_D	(2 * _FP_W_TYPE_SIZE)
+# define _FP_FRACTBITS_DW_D	(4 * _FP_W_TYPE_SIZE)
 #else
-#define _FP_FRACTBITS_D		_FP_W_TYPE_SIZE
+# define _FP_FRACTBITS_D	_FP_W_TYPE_SIZE
+# define _FP_FRACTBITS_DW_D	(2 * _FP_W_TYPE_SIZE)
 #endif
 
 #define _FP_FRACBITS_D		53
@@ -49,215 +51,264 @@
 #define _FP_EXPMAX_D		2047
 
 #define _FP_QNANBIT_D		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)
 #define _FP_QNANBIT_SH_D		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-2+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_D		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)
 #define _FP_IMPLBIT_SH_D		\
-	((_FP_W_TYPE)1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << (_FP_FRACBITS_D-1+_FP_WORKBITS) % _FP_W_TYPE_SIZE)
 #define _FP_OVERFLOW_D		\
-	((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
+	((_FP_W_TYPE) 1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
 
-typedef float DFtype __attribute__((mode(DF)));
+#define _FP_WFRACBITS_DW_D	(2 * _FP_WFRACBITS_D)
+#define _FP_WFRACXBITS_DW_D	(_FP_FRACTBITS_DW_D - _FP_WFRACBITS_DW_D)
+#define _FP_HIGHBIT_DW_D	\
+  ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_D - 1) % _FP_W_TYPE_SIZE)
 
+typedef float DFtype __attribute__ ((mode (DF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_D
 {
   DFtype flt;
-  struct _FP_STRUCT_LAYOUT {
-#if __BYTE_ORDER == __BIG_ENDIAN
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign  : 1;
     unsigned exp   : _FP_EXPBITS_D;
     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
     unsigned frac0 : _FP_W_TYPE_SIZE;
-#else
+# else
     unsigned frac0 : _FP_W_TYPE_SIZE;
     unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE;
     unsigned exp   : _FP_EXPBITS_D;
     unsigned sign  : 1;
-#endif
-  } bits __attribute__((packed));
+# endif
+  } bits __attribute__ ((packed));
 };
 
-#define FP_DECL_D(X)		_FP_DECL(2,X)
-#define FP_UNPACK_RAW_D(X,val)	_FP_UNPACK_RAW_2(D,X,val)
-#define FP_UNPACK_RAW_DP(X,val)	_FP_UNPACK_RAW_2_P(D,X,val)
-#define FP_PACK_RAW_D(val,X)	_FP_PACK_RAW_2(D,val,X)
-#define FP_PACK_RAW_DP(val,X)		\
-  do {					\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(D,val,X);	\
-  } while (0)
+# define FP_DECL_D(X)		_FP_DECL (2, X)
+# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_2 (D, X, val)
+# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_2_P (D, X, val)
+# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_2 (D, val, X)
+# define FP_PACK_RAW_DP(val, X)			\
+  do						\
+    {						\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_D(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_2(D,X,val);		\
-    _FP_UNPACK_CANONICAL(D,2,X);	\
-  } while (0)
+# define FP_UNPACK_D(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2 (D, X, val);		\
+      _FP_UNPACK_CANONICAL (D, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_DP(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_2_P(D,X,val);	\
-    _FP_UNPACK_CANONICAL(D,2,X);	\
-  } while (0)
+# define FP_UNPACK_DP(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2_P (D, X, val);		\
+      _FP_UNPACK_CANONICAL (D, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_D(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_2(D,X,val);		\
-    _FP_UNPACK_SEMIRAW(D,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_D(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2 (D, X, val);		\
+      _FP_UNPACK_SEMIRAW (D, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_DP(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_2_P(D,X,val);	\
-    _FP_UNPACK_SEMIRAW(D,2,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_DP(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_2_P (D, X, val);		\
+      _FP_UNPACK_SEMIRAW (D, 2, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_D(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(D,2,X);		\
-    _FP_PACK_RAW_2(D,val,X);		\
-  } while (0)
+# define FP_PACK_D(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (D, 2, X);		\
+      _FP_PACK_RAW_2 (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_DP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(D,2,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(D,val,X);	\
-  } while (0)
+# define FP_PACK_DP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (D, 2, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_D(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(D,2,X);		\
-    _FP_PACK_RAW_2(D,val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_D(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (D, 2, X);		\
+      _FP_PACK_RAW_2 (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_DP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(D,2,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_2_P(D,val,X);	\
-  } while (0)
+# define FP_PACK_SEMIRAW_DP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (D, 2, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_2_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN(D,2,X)
-#define FP_NEG_D(R,X)			_FP_NEG(D,2,R,X)
-#define FP_ADD_D(R,X,Y)			_FP_ADD(D,2,R,X,Y)
-#define FP_SUB_D(R,X,Y)			_FP_SUB(D,2,R,X,Y)
-#define FP_MUL_D(R,X,Y)			_FP_MUL(D,2,R,X,Y)
-#define FP_DIV_D(R,X,Y)			_FP_DIV(D,2,R,X,Y)
-#define FP_SQRT_D(R,X)			_FP_SQRT(D,2,R,X)
-#define _FP_SQRT_MEAT_D(R,S,T,X,Q)	_FP_SQRT_MEAT_2(R,S,T,X,Q)
+# define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN (D, 2, X)
+# define FP_NEG_D(R, X)			_FP_NEG (D, 2, R, X)
+# define FP_ADD_D(R, X, Y)		_FP_ADD (D, 2, R, X, Y)
+# define FP_SUB_D(R, X, Y)		_FP_SUB (D, 2, R, X, Y)
+# define FP_MUL_D(R, X, Y)		_FP_MUL (D, 2, R, X, Y)
+# define FP_DIV_D(R, X, Y)		_FP_DIV (D, 2, R, X, Y)
+# define FP_SQRT_D(R, X)		_FP_SQRT (D, 2, R, X)
+# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_2 (R, S, T, X, Q)
+# define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 2, 4, R, X, Y, Z)
 
-#define FP_CMP_D(r,X,Y,un)	_FP_CMP(D,2,r,X,Y,un)
-#define FP_CMP_EQ_D(r,X,Y)	_FP_CMP_EQ(D,2,r,X,Y)
-#define FP_CMP_UNORD_D(r,X,Y)	_FP_CMP_UNORD(D,2,r,X,Y)
+# define FP_CMP_D(r, X, Y, un)		_FP_CMP (D, 2, r, X, Y, un)
+# define FP_CMP_EQ_D(r, X, Y)		_FP_CMP_EQ (D, 2, r, X, Y)
+# define FP_CMP_UNORD_D(r, X, Y)	_FP_CMP_UNORD (D, 2, r, X, Y)
 
-#define FP_TO_INT_D(r,X,rsz,rsg)	_FP_TO_INT(D,2,r,X,rsz,rsg)
-#define FP_FROM_INT_D(X,r,rs,rt)	_FP_FROM_INT(D,2,X,r,rs,rt)
+# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 2, r, X, rsz, rsg)
+# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 2, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_2(X)
-#define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_2(X)
+# define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_2 (X)
+# define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_2 (X)
 
+# define _FP_FRAC_HIGH_DW_D(X)	_FP_FRAC_HIGH_4 (X)
+
 #else
 
 union _FP_UNION_D
 {
   DFtype flt;
-  struct _FP_STRUCT_LAYOUT {
-#if __BYTE_ORDER == __BIG_ENDIAN
+  struct _FP_STRUCT_LAYOUT
+  {
+# if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign   : 1;
     unsigned exp    : _FP_EXPBITS_D;
     _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
-#else
+# else
     _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
     unsigned exp    : _FP_EXPBITS_D;
     unsigned sign   : 1;
-#endif
-  } bits __attribute__((packed));
+# endif
+  } bits __attribute__ ((packed));
 };
 
-#define FP_DECL_D(X)		_FP_DECL(1,X)
-#define FP_UNPACK_RAW_D(X,val)	_FP_UNPACK_RAW_1(D,X,val)
-#define FP_UNPACK_RAW_DP(X,val)	_FP_UNPACK_RAW_1_P(D,X,val)
-#define FP_PACK_RAW_D(val,X)	_FP_PACK_RAW_1(D,val,X)
-#define FP_PACK_RAW_DP(val,X)		\
-  do {					\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(D,val,X);	\
-  } while (0)
+# define FP_DECL_D(X)		_FP_DECL (1, X)
+# define FP_UNPACK_RAW_D(X, val)	_FP_UNPACK_RAW_1 (D, X, val)
+# define FP_UNPACK_RAW_DP(X, val)	_FP_UNPACK_RAW_1_P (D, X, val)
+# define FP_PACK_RAW_D(val, X)	_FP_PACK_RAW_1 (D, val, X)
+# define FP_PACK_RAW_DP(val, X)			\
+  do						\
+    {						\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_D(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_1(D,X,val);		\
-    _FP_UNPACK_CANONICAL(D,1,X);	\
-  } while (0)
+# define FP_UNPACK_D(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1 (D, X, val);		\
+      _FP_UNPACK_CANONICAL (D, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_DP(X,val)		\
-  do {					\
-    _FP_UNPACK_RAW_1_P(D,X,val);	\
-    _FP_UNPACK_CANONICAL(D,1,X);	\
-  } while (0)
+# define FP_UNPACK_DP(X, val)			\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1_P (D, X, val);		\
+      _FP_UNPACK_CANONICAL (D, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_D(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_1(D,X,val);		\
-    _FP_UNPACK_SEMIRAW(D,1,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_D(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1 (D, X, val);		\
+      _FP_UNPACK_SEMIRAW (D, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_UNPACK_SEMIRAW_DP(X,val)	\
-  do {					\
-    _FP_UNPACK_RAW_1_P(D,X,val);	\
-    _FP_UNPACK_SEMIRAW(D,1,X);		\
-  } while (0)
+# define FP_UNPACK_SEMIRAW_DP(X, val)		\
+  do						\
+    {						\
+      _FP_UNPACK_RAW_1_P (D, X, val);		\
+      _FP_UNPACK_SEMIRAW (D, 1, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_D(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(D,1,X);		\
-    _FP_PACK_RAW_1(D,val,X);		\
-  } while (0)
+# define FP_PACK_D(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (D, 1, X);		\
+      _FP_PACK_RAW_1 (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_DP(val,X)		\
-  do {					\
-    _FP_PACK_CANONICAL(D,1,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(D,val,X);	\
-  } while (0)
+# define FP_PACK_DP(val, X)			\
+  do						\
+    {						\
+      _FP_PACK_CANONICAL (D, 1, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_D(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(D,1,X);		\
-    _FP_PACK_RAW_1(D,val,X);		\
-  } while (0)
+# define FP_PACK_SEMIRAW_D(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (D, 1, X);		\
+      _FP_PACK_RAW_1 (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_PACK_SEMIRAW_DP(val,X)	\
-  do {					\
-    _FP_PACK_SEMIRAW(D,1,X);		\
-    if (!FP_INHIBIT_RESULTS)		\
-      _FP_PACK_RAW_1_P(D,val,X);	\
-  } while (0)
+# define FP_PACK_SEMIRAW_DP(val, X)		\
+  do						\
+    {						\
+      _FP_PACK_SEMIRAW (D, 1, X);		\
+      if (!FP_INHIBIT_RESULTS)			\
+	_FP_PACK_RAW_1_P (D, val, X);		\
+    }						\
+  while (0)
 
-#define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN(D,1,X)
-#define FP_NEG_D(R,X)			_FP_NEG(D,1,R,X)
-#define FP_ADD_D(R,X,Y)			_FP_ADD(D,1,R,X,Y)
-#define FP_SUB_D(R,X,Y)			_FP_SUB(D,1,R,X,Y)
-#define FP_MUL_D(R,X,Y)			_FP_MUL(D,1,R,X,Y)
-#define FP_DIV_D(R,X,Y)			_FP_DIV(D,1,R,X,Y)
-#define FP_SQRT_D(R,X)			_FP_SQRT(D,1,R,X)
-#define _FP_SQRT_MEAT_D(R,S,T,X,Q)	_FP_SQRT_MEAT_1(R,S,T,X,Q)
+# define FP_ISSIGNAN_D(X)		_FP_ISSIGNAN (D, 1, X)
+# define FP_NEG_D(R, X)			_FP_NEG (D, 1, R, X)
+# define FP_ADD_D(R, X, Y)		_FP_ADD (D, 1, R, X, Y)
+# define FP_SUB_D(R, X, Y)		_FP_SUB (D, 1, R, X, Y)
+# define FP_MUL_D(R, X, Y)		_FP_MUL (D, 1, R, X, Y)
+# define FP_DIV_D(R, X, Y)		_FP_DIV (D, 1, R, X, Y)
+# define FP_SQRT_D(R, X)		_FP_SQRT (D, 1, R, X)
+# define _FP_SQRT_MEAT_D(R, S, T, X, Q)	_FP_SQRT_MEAT_1 (R, S, T, X, Q)
+# define FP_FMA_D(R, X, Y, Z)		_FP_FMA (D, 1, 2, R, X, Y, Z)
 
 /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by
    the target machine.  */
 
-#define FP_CMP_D(r,X,Y,un)	_FP_CMP(D,1,r,X,Y,un)
-#define FP_CMP_EQ_D(r,X,Y)	_FP_CMP_EQ(D,1,r,X,Y)
-#define FP_CMP_UNORD_D(r,X,Y)	_FP_CMP_UNORD(D,1,r,X,Y)
+# define FP_CMP_D(r, X, Y, un)		_FP_CMP (D, 1, r, X, Y, un)
+# define FP_CMP_EQ_D(r, X, Y)		_FP_CMP_EQ (D, 1, r, X, Y)
+# define FP_CMP_UNORD_D(r, X, Y)	_FP_CMP_UNORD (D, 1, r, X, Y)
 
-#define FP_TO_INT_D(r,X,rsz,rsg)	_FP_TO_INT(D,1,r,X,rsz,rsg)
-#define FP_FROM_INT_D(X,r,rs,rt)	_FP_FROM_INT(D,1,X,r,rs,rt)
+# define FP_TO_INT_D(r, X, rsz, rsg)	_FP_TO_INT (D, 1, r, X, rsz, rsg)
+# define FP_FROM_INT_D(X, r, rs, rt)	_FP_FROM_INT (D, 1, X, r, rs, rt)
 
-#define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_1(X)
-#define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_1(X)
+# define _FP_FRAC_HIGH_D(X)	_FP_FRAC_HIGH_1 (X)
+# define _FP_FRAC_HIGH_RAW_D(X)	_FP_FRAC_HIGH_1 (X)
 
+# define _FP_FRAC_HIGH_DW_D(X)	_FP_FRAC_HIGH_2 (X)
+
 #endif /* W_TYPE_SIZE < 64 */
Index: libgcc/soft-fp/eqsf2.c
===================================================================
--- libgcc/soft-fp/eqsf2.c	(revision 204460)
+++ libgcc/soft-fp/eqsf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "single.h"
 
-CMPtype __eqsf2(SFtype a, SFtype b)
+CMPtype
+__eqsf2 (SFtype a, SFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_S(A); FP_DECL_S(B);
+  FP_DECL_S (A);
+  FP_DECL_S (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_S(A, a);
-  FP_UNPACK_RAW_S(B, b);
-  FP_CMP_EQ_S(r, A, B);
-  if (r && (FP_ISSIGNAN_S(A) || FP_ISSIGNAN_S(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_S (A, a);
+  FP_UNPACK_RAW_S (B, b);
+  FP_CMP_EQ_S (r, A, B);
+  if (r && (FP_ISSIGNAN_S (A) || FP_ISSIGNAN_S (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__eqsf2, __nesf2);
+strong_alias (__eqsf2, __nesf2);
Index: libgcc/soft-fp/eqtf2.c
===================================================================
--- libgcc/soft-fp/eqtf2.c	(revision 204460)
+++ libgcc/soft-fp/eqtf2.c	(working copy)
@@ -31,20 +31,23 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-CMPtype __eqtf2(TFtype a, TFtype b)
+CMPtype
+__eqtf2 (TFtype a, TFtype b)
 {
   FP_DECL_EX;
-  FP_DECL_Q(A); FP_DECL_Q(B);
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
   CMPtype r;
 
-  FP_UNPACK_RAW_Q(A, a);
-  FP_UNPACK_RAW_Q(B, b);
-  FP_CMP_EQ_Q(r, A, B);
-  if (r && (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)))
-    FP_SET_EXCEPTION(FP_EX_INVALID);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_Q (A, a);
+  FP_UNPACK_RAW_Q (B, b);
+  FP_CMP_EQ_Q (r, A, B);
+  if (r && (FP_ISSIGNAN_Q (A) || FP_ISSIGNAN_Q (B)))
+    FP_SET_EXCEPTION (FP_EX_INVALID);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
 }
 
-strong_alias(__eqtf2, __netf2);
+strong_alias (__eqtf2, __netf2);
Index: libgcc/soft-fp/fixunsdfsi.c
===================================================================
--- libgcc/soft-fp/fixunsdfsi.c	(revision 204460)
+++ libgcc/soft-fp/fixunsdfsi.c	(working copy)
@@ -31,14 +31,16 @@
 #include "soft-fp.h"
 #include "double.h"
 
-USItype __fixunsdfsi(DFtype a)
+USItype
+__fixunsdfsi (DFtype a)
 {
   FP_DECL_EX;
-  FP_DECL_D(A);
+  FP_DECL_D (A);
   USItype r;
 
-  FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, SI_BITS, 0);
+  FP_INIT_EXCEPTIONS;
+  FP_UNPACK_RAW_D (A, a);
+  FP_TO_INT_D (r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;

-- 
Joseph S. Myers
joseph@codesourcery.com

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

end of thread, other threads:[~2015-09-28 21:51 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-08 16:52 Update soft-fp from glibc Uros Bizjak
2013-11-08 21:33 ` Joseph S. Myers
2013-11-10 13:16   ` Uros Bizjak
  -- strict thread matches above, loose matches on Subject: below --
2015-09-28 23:53 Joseph Myers
2014-10-09 18:51 Joseph S. Myers
2014-02-12 23:26 Joseph S. Myers
2013-11-06 22:57 Joseph S. Myers

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).