soft-fp speedup patch

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

soft-fp speedup patch

Joseph Myers
This patch speeds up the soft-fp code in glibc, and fixes several bugs in
the process.

The motivation is to be able to replace the existing code in libgcc
(gcc/config/fp-bit.c) with soft-fp, which is faster and provides features
missing from the other available software floating point support code
(exception and rounding mode support).  There is however another
implementation available, Torbjorn Granlund's ieeelib
<http://gcc.gnu.org/ml/gcc/1999-07n/msg00553.html>, which is smaller and
faster than soft-fp but has less maintainable code and more source code
duplication (and doesn't have any exception or rounding mode support).  I
examined the code of the various implementations and concluded that the
best approach would be to take the ideas and carefully tuned algorithms of
ieeelib and put them in the macro structure of soft-fp to get (most of)
the speed of ieeelib but in a more maintainable structure.

This patch uses ideas from ieeelib to speed up addition/subtraction and
conversion operations in soft-fp (based on profiling indicating these as
the most promising operations to speed up).  As measured with EEMBC it
gains two thirds of the former difference in performance from ieeelib (was
2% worse, now 0.7% worse), and I expect further fine tuning could speed it
up further.

More operations that previously worked on cooked (fully unpacked) floating
point values now operate on raw values (comparisons already did so).  An
intermediate form of unpacking, where numbers are shifted to allow for
guard bits but no other classification is done, is also added; this is
very similar to the form used in ieeelib.

As well as being benchmarked with EEMBC, the new code has been tested with
the GCC testsuite, with paranoia and with ucbtest.  Several bugs were
found in the old implementations of conversions between floating-point and
integers, and fixed in the course of this work:

* Floating-to-signed conversions which overflow could have undefined
behavior in the soft-fp implementation, subtracting 1 from the most
negative integer.  Fixed by always using unsigned integers for the
relevant temporary variable.

* Conversion of the most negative integer from floating would wrongly set
the "invalid" exception.  Converting (double)INT_MIN to int shouldn't set
INVALID; converting (double)INT_MIN-0.1 should set INEXACT but not
INVALID.

* Converting to a wider integer (float -> long long, __fixsfdi) would
always try to left-shift, sometimes by a negative amount, which is
undefined and doesn't work.

* When converting to floating point an integer using exactly one more bits
than (mantissa + guard) bits for the floating point format, it didn't get
shifted correctly.  For example, converting (1<<26) + (1<<27) to float
gave the wrong result (namely 1<<28) because float has 24 mantissa bits,
soft-fp uses 3 guard bits and an off-by-one error meant the number didn't
get shifted right.

* Conversions from long long to float were broken because they used
__FP_FRAC_SRS_1 on long long values, but that macro only works for
arguments of size _FP_W_TYPE_SIZE.

I have I hope updated all the target-specific soft-fp code using the
soft-fp macros whose semantics have changed, although I haven't tested
those parts of the patch.

2006-02-09  Joseph S. Myers  <[hidden email]>

        * soft-fp/op-common.h (_FP_UNPACK_SEMIRAW): Define.
        (_FP_OVERFLOW_SEMIRAW): Likewise.
        (_FP_CHECK_SIGNAN_SEMIRAW): Likewise.
        (_FP_CHOOSENAN_SEMIRAW): Likewise.
        (_FP_EXP_NORMAL): Likewise.
        (_FP_PACK_SEMIRAW): Likewise.
        (_FP_ADD_INTERNAL): Rewrite to operate on semi-raw value.
        (_FP_SUB): Likewise.
        (_FP_TO_INT): Rewrite to operate on raw values.  Don't set INVALID
        exception for conversions where most negative representable
        integer is correct truncated value, but do set INEXACT for such
        conversions where appropriate.  Don't always left-shift for
        converting to a wider integer.
        (_FP_FROM_INT): Rewrite to yield raw value.  Correct shift for
        integers with one more bits than (mantissa + guard) bits for the
        floating point format.  Don't use __FP_FRAC_SRS_1 for shifting
        integers that may be wider than _FP_W_TYPE_SIZE.
        (FP_CONV): Don't define.
        (FP_EXTEND): Define.
        (FP_TRUNC): Likewise.
        * soft-fp/op-1.h (_FP_FRAC_SRST_1, __FP_FRAC_SRST_1): Define.
        (_FP_FRAC_CONV_1_1): Don't define.
        (_FP_FRAC_COPY_1_1): Define.
        * soft-fp/op-2.h (_FP_FRAC_SRST_2): Define.
        (_FP_FRAC_CONV_1_2, _FP_FRAC_CONV_2_1): Don't define.
        (_FP_FRAC_COPY_1_2, _FP_FRAC_COPY_2_1): Define.
        * soft-fp/op-4.h (_FP_FRAC_SRST_4): Define.
        (_FP_FRAC_SRS_4): Define based on _FP_FRAC_SRST_4.
        (_FP_FRAC_CONV_1_4, _FP_FRAC_CONV_2_4): Don't define.
        (_FP_FRAC_COPY_1_4, _FP_FRAC_COPY_2_4): Define.
        (_FP_FRAC_CONV_4_1, _FP_FRAC_CONV_4_2): Don't define.
        (_FP_FRAC_COPY_4_1, _FP_FRAC_COPY_4_2): Define.
        * soft-fp/single.h (_FP_FRACTBITS_S): Define.
        (_FP_FRACXBITS_S): Define in terms of _FP_FRACXBITS_S.
        (_FP_WFRACXBITS_S): Likewise.
        (_FP_QNANBIT_SH_S, _FP_IMPLBIT_SH_S): Define.
        (FP_UNPACK_SEMIRAW_S, FP_UNPACK_SEMIRAW_SP): Define.
        (FP_PACK_SEMIRAW_S, FP_PACK_SEMIRAW_SP): Define.
        * soft-fp/double.h (_FP_QNANBIT_SH_D, _FP_IMPLBIT_SH_D): Define.
        (FP_UNPACK_SEMIRAW_D, FP_UNPACK_SEMIRAW_D): Define
        (FP_PACK_SEMIRAW_D, FP_PACK_SEMIRAW_DP): Define.
        * soft-fp/extended.h (_FP_QNANBIT_SH_E, _FP_IMPLBIT_SH_E): Define.
        (FP_UNPACK_EP): Correct typo.
        (FP_UNPACK_SEMIRAW_E, FP_UNPACK_SEMIRAW_EP): Define.
        (FP_PACK_SEMIRAW_E, FP_PACK_SEMIRAW_EP): Define.
        * soft-fp/quad.h (_FP_QNANBIT_SH_Q, _FP_IMPLBIT_SH_Q): Define.
        (FP_UNPACK_SEMIRAW_Q, FP_UNPACK_SEMIRAW_QP): Define.
        (FP_PACK_SEMIRAW_Q, FP_PACK_SEMIRAW_QP): Define.
        * soft-fp/fixdfdi.c: Use unsigned type for result of conversion.
        * soft-fp/fixdfsi.c: Likewise.
        * soft-fp/fixsfdi.c: Likewise.
        * soft-fp/fixsfsi.c: Likewise.
        * soft-fp/fixtfdi.c: Likewise.
        * soft-fp/fixtfsi.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtxq.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_nintxq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtoi.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtoll.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtoi.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtoll.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtox.c: Likewise.
        * soft-fp/adddf3.c: Update for changed soft-fp interfaces.
        * soft-fp/addsf3.c: Likewise.
        * soft-fp/addtf3.c: Likewise.
        * soft-fp/extenddftf2.c: Likewise.
        * soft-fp/extendsfdf2.c: Likewise.
        * soft-fp/extendsftf2.c: Likewise.
        * soft-fp/fixdfdi.c: Likewise.
        * soft-fp/fixdfsi.c: Likewise.
        * soft-fp/fixsfdi.c: Likewise.
        * soft-fp/fixsfsi.c: Likewise.
        * soft-fp/fixtfdi.c: Likewise.
        * soft-fp/fixtfsi.c: Likewise.
        * soft-fp/fixunsdfdi.c: Likewise.
        * soft-fp/fixunsdfsi.c: Likewise.
        * soft-fp/fixunssfdi.c: Likewise.
        * soft-fp/fixunssfsi.c: Likewise.
        * soft-fp/fixunstfdi.c: Likewise.
        * soft-fp/fixunstfsi.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/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/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.
        * sysdeps/alpha/soft-fp/ots_add.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtqux.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtqx.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvttx.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtxq.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtxt.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_nintxq.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_sub.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_add.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_dtoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_itoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_lltoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtod.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtoi.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtoll.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtos.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtou.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_qtoull.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_stoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_sub.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_ulltoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_utoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_add.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_dtoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_itoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_lltoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtod.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtoi.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtoll.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtos.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtou.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_qtoull.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_stoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_sub.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_ulltoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_utoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_add.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_dtoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_itoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtod.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtos.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_qtox.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_stoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_sub.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c: Likewise.

Index: soft-fp/adddf3.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/adddf3.c,v
retrieving revision 1.2
diff -u -p -r1.2 adddf3.c
--- soft-fp/adddf3.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/adddf3.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,10 +30,10 @@ double __adddf3(double a, double b)
   double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
-  FP_UNPACK_D(B, b);
+  FP_UNPACK_SEMIRAW_D(A, a);
+  FP_UNPACK_SEMIRAW_D(B, b);
   FP_ADD_D(R, A, B);
-  FP_PACK_D(r, R);
+  FP_PACK_SEMIRAW_D(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/addsf3.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/addsf3.c,v
retrieving revision 1.2
diff -u -p -r1.2 addsf3.c
--- soft-fp/addsf3.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/addsf3.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,10 +30,10 @@ float __addsf3(float a, float b)
   float r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
-  FP_UNPACK_S(B, b);
+  FP_UNPACK_SEMIRAW_S(A, a);
+  FP_UNPACK_SEMIRAW_S(B, b);
   FP_ADD_S(R, A, B);
-  FP_PACK_S(r, R);
+  FP_PACK_SEMIRAW_S(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/addtf3.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/addtf3.c,v
retrieving revision 1.2
diff -u -p -r1.2 addtf3.c
--- soft-fp/addtf3.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/addtf3.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a + b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,10 +30,10 @@ long double __addtf3(long double a, long
   long double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q(A, a);
-  FP_UNPACK_Q(B, b);
+  FP_UNPACK_SEMIRAW_Q(A, a);
+  FP_UNPACK_SEMIRAW_Q(B, b);
   FP_ADD_Q(R, A, B);
-  FP_PACK_Q(r, R);
+  FP_PACK_SEMIRAW_Q(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/double.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/double.h,v
retrieving revision 1.4
diff -u -p -r1.4 double.h
--- soft-fp/double.h 30 Jan 2006 22:27:21 -0000 1.4
+++ soft-fp/double.h 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Double Precision
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
   Jakub Jelinek ([hidden email]),
@@ -42,8 +42,12 @@
 
 #define _FP_QNANBIT_D \
  ((_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)
 #define _FP_IMPLBIT_D \
  ((_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)
 #define _FP_OVERFLOW_D \
  ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
 
@@ -89,6 +93,18 @@ union _FP_UNION_D
     _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_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); \
@@ -102,6 +118,19 @@ union _FP_UNION_D
       _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_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)
@@ -161,6 +190,18 @@ union _FP_UNION_D
     _FP_UNPACK_CANONICAL(D,1,X); \
   } while (0)
 
+#define FP_UNPACK_SEMIRAW_D(X,val) \
+  do { \
+    _FP_UNPACK_RAW_2(1,X,val); \
+    _FP_UNPACK_SEMIRAW(D,1,X); \
+  } while (0)
+
+#define FP_UNPACK_SEMIRAW_DP(X,val) \
+  do { \
+    _FP_UNPACK_RAW_2_P(1,X,val); \
+    _FP_UNPACK_SEMIRAW(D,1,X); \
+  } while (0)
+
 #define FP_PACK_D(val,X) \
   do { \
     _FP_PACK_CANONICAL(D,1,X); \
@@ -174,6 +215,19 @@ union _FP_UNION_D
       _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_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)
Index: soft-fp/extenddftf2.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/extenddftf2.c,v
retrieving revision 1.2
diff -u -p -r1.2 extenddftf2.c
--- soft-fp/extenddftf2.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/extenddftf2.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -32,13 +32,13 @@ long double __extenddftf2(double a)
   long double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_D(A, a);
+  FP_UNPACK_RAW_D(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_CONV(Q,D,4,2,R,A);
+  FP_EXTEND(Q,D,4,2,R,A);
 #else
-  FP_CONV(Q,D,2,1,R,A);
+  FP_EXTEND(Q,D,2,1,R,A);
 #endif
-  FP_PACK_Q(r, R);
+  FP_PACK_RAW_Q(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/extended.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/extended.h,v
retrieving revision 1.4
diff -u -p -r1.4 extended.h
--- soft-fp/extended.h 30 Jan 2006 22:27:21 -0000 1.4
+++ soft-fp/extended.h 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Definitions for IEEE Extended Precision.
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek ([hidden email]).
 
@@ -39,8 +39,12 @@
 
 #define _FP_QNANBIT_E \
  ((_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)
 #define _FP_IMPLBIT_E \
  ((_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)
 #define _FP_OVERFLOW_E \
  ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
 
@@ -143,10 +147,22 @@ union _FP_UNION_E
 
 #define FP_UNPACK_EP(X,val) \
   do { \
-    FP_UNPACK_RAW_2_P(X,val); \
+    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_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); \
@@ -159,6 +175,18 @@ union _FP_UNION_E
     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_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)
@@ -324,6 +352,18 @@ union _FP_UNION_E
     _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_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); \
@@ -336,6 +376,18 @@ union _FP_UNION_E
     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_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)
Index: soft-fp/extendsfdf2.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/extendsfdf2.c,v
retrieving revision 1.2
diff -u -p -r1.2 extendsfdf2.c
--- soft-fp/extendsfdf2.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/extendsfdf2.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE double
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -32,13 +32,13 @@ double __extendsfdf2(float a)
   double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
 #if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
-  FP_CONV(D,S,2,1,R,A);
+  FP_EXTEND(D,S,2,1,R,A);
 #else
-  FP_CONV(D,S,1,1,R,A);
+  FP_EXTEND(D,S,1,1,R,A);
 #endif
-  FP_PACK_D(r, R);
+  FP_PACK_RAW_D(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/extendsftf2.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/extendsftf2.c,v
retrieving revision 1.2
diff -u -p -r1.2 extendsftf2.c
--- soft-fp/extendsftf2.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/extendsftf2.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a converted to IEEE quad
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -32,13 +32,13 @@ long double __extendsftf2(float a)
   long double r;
 
   FP_INIT_ROUNDMODE;
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
 #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
-  FP_CONV(Q,S,4,1,R,A);
+  FP_EXTEND(Q,S,4,1,R,A);
 #else
-  FP_CONV(Q,S,2,1,R,A);
+  FP_EXTEND(Q,S,2,1,R,A);
 #endif
-  FP_PACK_Q(r, R);
+  FP_PACK_RAW_Q(r, R);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
Index: soft-fp/fixdfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixdfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixdfdi.c
--- soft-fp/fixdfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixdfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ DItype __fixdfdi(double a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  DItype r;
+  UDItype r;
 
-  FP_UNPACK_D(A, a);
+  FP_UNPACK_RAW_D(A, a);
   FP_TO_INT_D(r, A, 64, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixdfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixdfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixdfsi.c
--- soft-fp/fixdfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixdfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ SItype __fixdfsi(double a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  SItype r;
+  USItype r;
 
-  FP_UNPACK_D(A, a);
+  FP_UNPACK_RAW_D(A, a);
   FP_TO_INT_D(r, A, 32, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixsfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixsfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixsfdi.c
--- soft-fp/fixsfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixsfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ DItype __fixsfdi(float a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  DItype r;
+  UDItype r;
 
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
   FP_TO_INT_S(r, A, 64, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixsfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixsfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixsfsi.c
--- soft-fp/fixsfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixsfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ SItype __fixsfsi(float a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  SItype r;
+  USItype r;
 
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
   FP_TO_INT_S(r, A, 32, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixtfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixtfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixtfdi.c
--- soft-fp/fixtfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixtfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ DItype __fixtfdi(long double a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  DItype r;
+  UDItype r;
 
-  FP_UNPACK_Q(A, a);
+  FP_UNPACK_RAW_Q(A, a);
   FP_TO_INT_Q(r, A, 64, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixtfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixtfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixtfsi.c
--- soft-fp/fixtfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixtfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit signed integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -27,9 +27,9 @@ SItype __fixtfsi(long double a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  SItype r;
+  USItype r;
 
-  FP_UNPACK_Q(A, a);
+  FP_UNPACK_RAW_Q(A, a);
   FP_TO_INT_Q(r, A, 32, 1);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunsdfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunsdfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunsdfdi.c
--- soft-fp/fixunsdfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunsdfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ UDItype __fixunsdfdi(double a)
   FP_DECL_D(A);
   UDItype r;
 
-  FP_UNPACK_D(A, a);
+  FP_UNPACK_RAW_D(A, a);
   FP_TO_INT_D(r, A, 64, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunsdfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunsdfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunsdfsi.c
--- soft-fp/fixunsdfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunsdfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ USItype __fixunsdfsi(double a)
   FP_DECL_D(A);
   USItype r;
 
-  FP_UNPACK_D(A, a);
+  FP_UNPACK_RAW_D(A, a);
   FP_TO_INT_D(r, A, 32, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunssfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunssfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunssfdi.c
--- soft-fp/fixunssfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunssfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ UDItype __fixunssfdi(float a)
   FP_DECL_S(A);
   UDItype r;
 
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
   FP_TO_INT_S(r, A, 64, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunssfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunssfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunssfsi.c
--- soft-fp/fixunssfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunssfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ USItype __fixunssfsi(float a)
   FP_DECL_S(A);
   USItype r;
 
-  FP_UNPACK_S(A, a);
+  FP_UNPACK_RAW_S(A, a);
   FP_TO_INT_S(r, A, 32, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunstfdi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunstfdi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunstfdi.c
--- soft-fp/fixunstfdi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunstfdi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 64bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ UDItype __fixunstfdi(long double a)
   FP_DECL_Q(A);
   UDItype r;
 
-  FP_UNPACK_Q(A, a);
+  FP_UNPACK_RAW_Q(A, a);
   FP_TO_INT_Q(r, A, 64, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/fixunstfsi.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/fixunstfsi.c,v
retrieving revision 1.2
diff -u -p -r1.2 fixunstfsi.c
--- soft-fp/fixunstfsi.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/fixunstfsi.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a to 32bit unsigned integer
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -29,7 +29,7 @@ USItype __fixunstfsi(long double a)
   FP_DECL_Q(A);
   USItype r;
 
-  FP_UNPACK_Q(A, a);
+  FP_UNPACK_RAW_Q(A, a);
   FP_TO_INT_Q(r, A, 32, 0);
   FP_HANDLE_EXCEPTIONS;
 
Index: soft-fp/floatdidf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatdidf.c,v
retrieving revision 1.2
diff -u -p -r1.2 floatdidf.c
--- soft-fp/floatdidf.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/floatdidf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE double
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ double __floatdidf(DItype i)
   double a;
 
   FP_FROM_INT_D(A, i, 64, long long);
-  FP_PACK_D(a, A);
+  FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatdisf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatdisf.c,v
retrieving revision 1.3
diff -u -p -r1.3 floatdisf.c
--- soft-fp/floatdisf.c 6 Dec 2005 00:38:31 -0000 1.3
+++ soft-fp/floatdisf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE single
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ float __floatdisf(DItype i)
   float a;
 
   FP_FROM_INT_S(A, i, 64, long long);
-  FP_PACK_S(a, A);
+  FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatditf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatditf.c,v
retrieving revision 1.2
diff -u -p -r1.2 floatditf.c
--- soft-fp/floatditf.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/floatditf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 64bit signed integer to IEEE quad
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ long double __floatditf(DItype i)
   long double a;
 
   FP_FROM_INT_Q(A, i, 64, long long);
-  FP_PACK_Q(a, A);
+  FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatsidf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatsidf.c,v
retrieving revision 1.2
diff -u -p -r1.2 floatsidf.c
--- soft-fp/floatsidf.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/floatsidf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE double
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ double __floatsidf(SItype i)
   double a;
 
   FP_FROM_INT_D(A, i, 32, int);
-  FP_PACK_D(a, A);
+  FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatsisf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatsisf.c,v
retrieving revision 1.2
diff -u -p -r1.2 floatsisf.c
--- soft-fp/floatsisf.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/floatsisf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE single
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ float __floatsisf(SItype i)
   float a;
 
   FP_FROM_INT_S(A, i, 32, int);
-  FP_PACK_S(a, A);
+  FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatsitf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatsitf.c,v
retrieving revision 1.2
diff -u -p -r1.2 floatsitf.c
--- soft-fp/floatsitf.c 6 Jul 2001 04:55:40 -0000 1.2
+++ soft-fp/floatsitf.c 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Convert a 32bit signed integer to IEEE quad
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -30,7 +30,7 @@ long double __floatsitf(SItype i)
   long double a;
 
   FP_FROM_INT_Q(A, i, 32, int);
-  FP_PACK_Q(a, A);
+  FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatundidf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatundidf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatundidf.c
--- soft-fp/floatundidf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatundidf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatundidf(UDItype i)
   double a;
 
   FP_FROM_INT_D(A, i, 64, long long);
-  FP_PACK_D(a, A);
+  FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatundisf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatundisf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatundisf.c
--- soft-fp/floatundisf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatundisf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatundisf(UDItype i)
   float a;
 
   FP_FROM_INT_S(A, i, 64, long long);
-  FP_PACK_S(a, A);
+  FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatunditf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatunditf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatunditf.c
--- soft-fp/floatunditf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatunditf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatunditf(UDItype i)
   long double a;
 
   FP_FROM_INT_Q(A, i, 64, long long);
-  FP_PACK_Q(a, A);
+  FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatunsidf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatunsidf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatunsidf.c
--- soft-fp/floatunsidf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatunsidf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatunsidf(USItype i)
   double a;
 
   FP_FROM_INT_D(A, i, 32, int);
-  FP_PACK_D(a, A);
+  FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatunsisf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatunsisf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatunsisf.c
--- soft-fp/floatunsisf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatunsisf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatunsisf(USItype i)
   float a;
 
   FP_FROM_INT_S(A, i, 32, int);
-  FP_PACK_S(a, A);
+  FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/floatunsitf.c
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/floatunsitf.c,v
retrieving revision 1.1
diff -u -p -r1.1 floatunsitf.c
--- soft-fp/floatunsitf.c 6 Jan 2006 10:47:45 -0000 1.1
+++ soft-fp/floatunsitf.c 9 Feb 2006 22:05:31 -0000
@@ -31,7 +31,7 @@ __floatunsitf(USItype i)
   long double a;
 
   FP_FROM_INT_Q(A, i, 32, int);
-  FP_PACK_Q(a, A);
+  FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
   return a;
Index: soft-fp/op-1.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/op-1.h,v
retrieving revision 1.4
diff -u -p -r1.4 op-1.h
--- soft-fp/op-1.h 21 May 2002 02:10:25 -0000 1.4
+++ soft-fp/op-1.h 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic one-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
   Jakub Jelinek ([hidden email]),
@@ -40,8 +40,16 @@
 #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) \
+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)))
@@ -282,17 +290,4 @@
  * Convert FP values between word sizes
  */
 
-#define _FP_FRAC_CONV_1_1(dfs, sfs, D, S) \
-  do { \
-    D##_f = S##_f; \
-    if (_FP_WFRACBITS_##sfs > _FP_WFRACBITS_##dfs) \
-      { \
- if (S##_c != FP_CLS_NAN) \
-  _FP_FRAC_SRS_1(D, (_FP_WFRACBITS_##sfs-_FP_WFRACBITS_##dfs), \
- _FP_WFRACBITS_##sfs); \
- else \
-  _FP_FRAC_SRL_1(D, (_FP_WFRACBITS_##sfs-_FP_WFRACBITS_##dfs)); \
-      } \
-    else \
-      D##_f <<= _FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs; \
-  } while (0)
+#define _FP_FRAC_COPY_1_1(D, S) (D##_f = S##_f)
Index: soft-fp/op-2.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/op-2.h,v
retrieving revision 1.4
diff -u -p -r1.4 op-2.h
--- soft-fp/op-2.h 21 May 2002 02:11:05 -0000 1.4
+++ soft-fp/op-2.h 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic two-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
   Jakub Jelinek ([hidden email]),
@@ -66,6 +66,24 @@
   } while (0)
 
 /* Right shift with sticky-lsb.  */
+#define _FP_FRAC_SRST_2(X,S, N,sz) \
+  do { \
+    if ((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); \
+      } \
+    else \
+      { \
+ S = (((X##_f1 << (2*_FP_W_TYPE_SIZE - (N))) | X##_f0) != 0); \
+ X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE)); \
+ X##_f1 = 0; \
+      } \
+  } while (0)
+
 #define _FP_FRAC_SRS_2(X,N,sz) \
   do { \
     if ((N) < _FP_W_TYPE_SIZE) \
@@ -591,20 +609,6 @@
  * Convert FP values between word sizes
  */
 
-#define _FP_FRAC_CONV_1_2(dfs, sfs, D, S) \
-  do { \
-    if (S##_c != FP_CLS_NAN) \
-      _FP_FRAC_SRS_2(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \
-     _FP_WFRACBITS_##sfs); \
-    else \
-      _FP_FRAC_SRL_2(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs)); \
-    D##_f = S##_f0; \
-  } while (0)
-
-#define _FP_FRAC_CONV_2_1(dfs, sfs, D, S) \
-  do { \
-    D##_f0 = S##_f; \
-    D##_f1 = 0; \
-    _FP_FRAC_SLL_2(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \
-  } while (0)
+#define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0)
 
+#define _FP_FRAC_COPY_2_1(D, S) ((D##_f0 = S##_f), (D##_f1 = 0))
Index: soft-fp/op-4.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/op-4.h,v
retrieving revision 1.5
diff -u -p -r1.5 op-4.h
--- soft-fp/op-4.h 17 Oct 2002 23:15:54 -0000 1.5
+++ soft-fp/op-4.h 9 Feb 2006 22:05:31 -0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic four-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
   Jakub Jelinek ([hidden email]),
@@ -78,31 +78,37 @@
  * 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_4(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]; \
-    _s |= X##_f[_i] << _up; \
-/* s is now != 0 if we want to set the LSbit */ \
-    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; \
-    /* don't fix the LSB until the very end when we're sure f[0] is stable */ \
-    X##_f[0] |= (_s != 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]; \
+    _s |= X##_f[_i] << _up; \
+/* s is now != 0 if we want to set the LSbit */ \
+    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; \
+    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_ADD_4(R,X,Y) \
@@ -609,26 +615,13 @@
  * 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_CONV_1_4(dfs, sfs, D, S) \
-   do { \
-     if (S##_c != FP_CLS_NAN) \
-       _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \
-  _FP_WFRACBITS_##sfs); \
-     else \
-       _FP_FRAC_SRL_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs)); \
-     D##_f = S##_f[0]; \
-  } while (0)
-
-#define _FP_FRAC_CONV_2_4(dfs, sfs, D, S) \
-   do { \
-     if (S##_c != FP_CLS_NAN) \
-       _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \
-      _FP_WFRACBITS_##sfs); \
-     else \
-       _FP_FRAC_SRL_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs)); \
-     D##_f0 = S##_f[0]; \
-     D##_f1 = S##_f[1]; \
-  } while (0)
+#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)
 
 /* Assembly/disassembly for converting to/from integral types.  
  * No shifting or overflow handled here.
@@ -671,18 +664,15 @@
     X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
   } while (0);
 
-#define _FP_FRAC_CONV_4_1(dfs, sfs, D, S) \
-   do { \
-     D##_f[0] = S##_f; \
-     D##_f[1] = D##_f[2] = D##_f[3] = 0; \
-     _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \
-   } while (0)
-
-#define _FP_FRAC_CONV_4_2(dfs, sfs, D, S) \
-   do { \
-     D##_f[0] = S##_f0; \
-     D##_f[1] = S##_f1; \
-     D##_f[2] = D##_f[3] = 0; \
-     _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \
-   } 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)
+
+#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)
Index: soft-fp/op-common.h
===================================================================
RCS file: /cvs/glibc/libc/soft-fp/op-common.h,v
retrieving revision 1.6
diff -u -p -r1.6 op-common.h
--- soft-fp/op-common.h 6 Jan 2006 10:47:45 -0000 1.6
+++ soft-fp/op-common.h 9 Feb 2006 22:05:32 -0000
@@ -71,6 +71,87 @@ do { \
   } \
 } 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)
+
+/* 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)) \
+    { \
+      X##_e = _FP_EXPMAX_##fs; \
+      _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \
+    } \
+  else \
+    { \
+      X##_e = _FP_EXPMAX_##fs - 1; \
+      FP_SET_EXCEPTION(FP_EX_OVERFLOW); \
+      FP_SET_EXCEPTION(FP_EX_INEXACT); \
+      _FP_FRAC_SET_##wc(X, _FP_MAXFRAC_##wc); \
+    } \
+} 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_HIGH_##fs(X) & _FP_QNANBIT_SH_##fs)) \
+    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)
+
+/* 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)
+
+/* Prepare to pack an fp value in semi-raw mode: the mantissa is
+   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 (_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 (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X)) \
+    { \
+      if (X##_e == 0) \
+ FP_SET_EXCEPTION(FP_EX_UNDERFLOW); \
+      else \
+ { \
+  if (!_FP_KEEPNANFRACP) \
+    { \
+      _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \
+      X##_s = _FP_NANSIGN_##fs; \
+    } \
+  else \
+    _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs; \
+ } \
+    } \
+} 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
@@ -202,153 +283,433 @@ do { \
 
 
 
-/*
- * Main addition routine.  The input values should be cooked.
- */
-
-#define _FP_ADD_INTERNAL(fs, wc, R, X, Y, OP)     \
-do {     \
-  switch (_FP_CLS_COMBINE(X##_c, Y##_c))     \
-  {     \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):     \
-    {     \
-      /* shift the smaller number so that its exponent matches the larger */ \
-      _FP_I_TYPE diff = X##_e - Y##_e;     \
-     \
-      if (diff < 0)     \
- {     \
-  diff = -diff;     \
-  if (diff <= _FP_WFRACBITS_##fs)     \
-    _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs);     \
-  else if (!_FP_FRAC_ZEROP_##wc(X))     \
-    _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc);     \
-  R##_e = Y##_e;     \
- }     \
-      else     \
- {     \
-  if (diff > 0)     \
-    {     \
-      if (diff <= _FP_WFRACBITS_##fs)     \
-        _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs);     \
-      else if (!_FP_FRAC_ZEROP_##wc(Y))     \
-        _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc);     \
-    }     \
-  R##_e = X##_e;     \
- }     \
-     \
-      R##_c = FP_CLS_NORMAL;     \
-     \
-      if (X##_s == Y##_s)     \
- {     \
-  R##_s = X##_s;     \
-  _FP_FRAC_ADD_##wc(R, X, Y);     \
-  if (_FP_FRAC_OVERP_##wc(fs, R))     \
-    {     \
-      _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs);     \
-      R##_e++;     \
-    }     \
- }     \
-      else     \
- {     \
-  R##_s = X##_s;     \
-  _FP_FRAC_SUB_##wc(R, X, Y);     \
-  if (_FP_FRAC_ZEROP_##wc(R))     \
-    {     \
-      /* return an exact zero */     \
-      if (FP_ROUNDMODE == FP_RND_MINF)     \
- R##_s |= Y##_s;     \
-      else     \
- R##_s &= Y##_s;     \
-      R##_c = FP_CLS_ZERO;     \
-    }     \
-  else     \
-    {     \
-      if (_FP_FRAC_NEGP_##wc(R))     \
- {     \
-  _FP_FRAC_SUB_##wc(R, Y, X);     \
-  R##_s = Y##_s;     \
- }     \
-     \
-      /* renormalize after subtraction */     \
-      _FP_FRAC_CLZ_##wc(diff, R);     \
-      diff -= _FP_WFRACXBITS_##fs;     \
-      if (diff)     \
- {     \
-  R##_e -= diff;     \
-  _FP_FRAC_SLL_##wc(R, diff);     \
- }     \
-    }     \
- }     \
-      break;     \
-    }     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN):     \
-    _FP_CHOOSENAN(fs, wc, R, X, Y, OP);     \
-    break;     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO):     \
-    R##_e = X##_e;     \
-  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):     \
-    _FP_FRAC_COPY_##wc(R, X);     \
-    R##_s = X##_s;     \
-    R##_c = X##_c;     \
-    break;     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL):     \
-    R##_e = Y##_e;     \
-  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):     \
-    _FP_FRAC_COPY_##wc(R, Y);     \
-    R##_s = Y##_s;     \
-    R##_c = Y##_c;     \
-    break;     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF):     \
-    if (X##_s != Y##_s)     \
-      {     \
- /* +INF + -INF => NAN */     \
- _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs);     \
- R##_s = _FP_NANSIGN_##fs;     \
- R##_c = FP_CLS_NAN;     \
- FP_SET_EXCEPTION(FP_EX_INVALID);     \
- break;     \
-      }     \
-    /* FALLTHRU */     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL):     \
-  case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO):     \
-    R##_s = X##_s;     \
-    R##_c = FP_CLS_INF;     \
-    break;     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF):     \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF):     \
-    R##_s = Y##_s;     \
-    R##_c = FP_CLS_INF;     \
-    break;     \
-     \
-  case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO):     \
-    /* make sure the sign is correct */     \
-    if (FP_ROUNDMODE == FP_RND_MINF)     \
-      R##_s = X##_s | Y##_s;     \
-    else     \
-      R##_s = X##_s & Y##_s;     \
-    R##_c = FP_CLS_ZERO;     \
-    break;     \
-     \
-  default:     \
-    abort();     \
-  }     \
+/* 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); \
+  
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Joseph Myers
As a followup to my previous patch
<http://sources.redhat.com/ml/libc-alpha/2006-02/msg00028.html>, and
relative to glibc with that patch applied, this patch makes further
cleanups in preparation for using this code in libgcc.  The form of the
code after this patch is exactly the form I intend to import into GCC
apart from using GPL plus libgcc exception instead of LGPL for the libgcc
copy (as approved by RMS).

There is one soft-fp interface changes in this patch (with consequent
changes to sysdeps code): _FP_FROM_INT now takes an unsigned type as an
argument, instead of a signed type to which "unsigned " is prepended; this
allows the argument to be a typedef.  Apart from this, the code is cleaned
up.  Function arguments and returns are defined using typedefs defined
with __attribute__((mode(...))), as these are how the interfaces to these
functions are defined by GCC.  Many compilation warnings are avoided.  In
particular, warnings for shifts out of range in conditional code are
avoided by using ? : and statement expressions in place of if ... else
....  Some _LIBC conditionals are added to facilitate using the same code
in GCC and glibc.

As with the previous patch, this one fixes newly discovered bugs in the
original code.  The *_SRS* macros in op-2.h, op-4.h and op-8.h could, when
shifting by a multiple of _FP_W_TYPE_SIZE, shift a word left by exactly
_FP_W_TYPE_SIZE, which is undefined behavior in C.  Depending on the code
generated for such shifts this could lead to incorrect setting of the
sticky bit on some processors (where such a shift returns the original
value, say, instead of 0).

2006-02-18  Joseph S. Myers  <[hidden email]>

        * soft-fp/single.h (SFtype): Define.
        (union _FP_UNION_S): Use it.
        * soft-fp/double.h (DFtype): Define.
        (union _FP_UNION_D): Use it.
        * soft-fp/extended.h (XFtype): Define.
        (union _FP_UNION_E): Use it.
        * soft-fp/quad.h (TFtype): Define.
        (union _FP_UNION_Q): Use it.
        * soft-fp/soft-fp.h: Add _LIBC conditionals.
        (SI_BITS, DI_BITS): Define.
        * soft-fp/op-common.h (_FP_DECL): Add __attribute__((unused)) for
        X##_c.
        (_FP_CMP_EQ): Use parentheses for && inside ||.
        (_FP_TO_INT): Use statement expressions in conditional controlling
        constant shift.
        (_FP_FROM_INT): Likewise.  Take unsigned type as argument.
        * soft-fp/op-2.h (_FP_FRAC_SLL_2, _FP_FRAC_SRL_2, _FP_FRAC_SRST_2,
        _FP_FRAC_SRS_2, _FP_FRAC_ASSEMBLE_2): Use statement expressions in
        conditional controlling possibly constant shift.
        (_FP_FRAC_SRST_2, _FP_FRAC_SRS_2): Avoid left shift by exactly
        _FP_W_TYPE_SIZE.
        (_FP_FRAC_GT_2, _FP_FRAC_GE_2): Use parentheses for && inside ||.
        * soft-fp/op-4.h (_FP_FRAC_SRST_4): Avoid left shift by exactly
        _FP_W_TYPE_SIZE.
        (__FP_FRAC_ADD_3, __FP_FRAC_ADD_4, __FP_FRAC_SUB_3,
        __FP_FRAC_SUB_4): Use _FP_W_TYPE for carry flags.
        * soft-fp/op-8.h (_FP_FRAC_SRS_8): Avoid left shift by exactly
        _FP_W_TYPE_SIZE.
        * soft-fp/floatdidf.c: Pass unsigned type and macro for type size.
        * 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/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/fixdfdi.c: Pass macro for type size.
        * soft-fp/fixdfsi.c: Likewise.
        * soft-fp/fixsfdi.c: Likewise.
        * soft-fp/fixsfsi.c: Likewise.
        * soft-fp/fixtfdi.c: Likewise.
        * soft-fp/fixtfsi.c: Likewise.
        * soft-fp/fixunsdfdi.c: Likewise.
        * soft-fp/fixunsdfsi.c: Likewise.
        * soft-fp/fixunssfdi.c: Likewise.
        * soft-fp/fixunssfsi.c: Likewise.
        * soft-fp/fixunstfdi.c: Likewise.
        * soft-fp/fixunstfsi.c: Likewise.
        * sysdeps/alpha/soft-fp/ots_cvtqux.c: Pass unsigned type.
        * sysdeps/alpha/soft-fp/ots_cvtqx.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_itoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_lltoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_ulltoq.c: Likewise.
        * sysdeps/powerpc/soft-fp/q_utoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_itoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_lltoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_ulltoq.c: Likewise.
        * sysdeps/sparc/sparc32/soft-fp/q_utoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_itoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_uitoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_uxtoq.c: Likewise.
        * sysdeps/sparc/sparc64/soft-fp/qp_xtoq.c: Likewise.
        * soft-fp/adddf3.c: Use typedefs for argument and return types.
        * 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/eqdf2.c: Likewise.
        * soft-fp/eqsf2.c: Likewise.
        * soft-fp/eqtf2.c: Likewise.
        * soft-fp/extenddftf2.c: Likewise.
        * soft-fp/extendsfdf2.c: Likewise.
        * soft-fp/extendsftf2.c: Likewise.
        * soft-fp/fixdfdi.c: Likewise.
        * soft-fp/fixdfsi.c: Likewise.
        * soft-fp/fixsfdi.c: Likewise.
        * soft-fp/fixsfsi.c: Likewise.
        * soft-fp/fixtfdi.c: Likewise.
        * soft-fp/fixtfsi.c: Likewise.
        * soft-fp/fixunsdfdi.c: Likewise.
        * soft-fp/fixunsdfsi.c: Likewise.
        * soft-fp/fixunssfdi.c: Likewise.
        * soft-fp/fixunssfsi.c: Likewise.
        * soft-fp/fixunstfdi.c: Likewise.
        * soft-fp/fixunstfsi.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/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/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/sqrtdf2.c: Likewise.
        * soft-fp/sqrtsf2.c: Likewise.
        * soft-fp/sqrttf2.c: 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/unorddf2.c: Likewise.
        * soft-fp/unordsf2.c: Likewise.
        * soft-fp/unordtf2.c: Likewise.

diff -rupN libc.softfp/soft-fp/adddf3.c libc.softfp2/soft-fp/adddf3.c
--- libc.softfp/soft-fp/adddf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/adddf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __adddf3(double a, double b)
+DFtype __adddf3(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_D(A, a);
diff -rupN libc.softfp/soft-fp/addsf3.c libc.softfp2/soft-fp/addsf3.c
--- libc.softfp/soft-fp/addsf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/addsf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __addsf3(float a, float b)
+SFtype __addsf3(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_S(A, a);
diff -rupN libc.softfp/soft-fp/addtf3.c libc.softfp2/soft-fp/addtf3.c
--- libc.softfp/soft-fp/addtf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/addtf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __addtf3(long double a, long double b)
+TFtype __addtf3(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_Q(A, a);
diff -rupN libc.softfp/soft-fp/divdf3.c libc.softfp2/soft-fp/divdf3.c
--- libc.softfp/soft-fp/divdf3.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/divdf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __divdf3(double a, double b)
+DFtype __divdf3(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_D(A, a);
diff -rupN libc.softfp/soft-fp/divsf3.c libc.softfp2/soft-fp/divsf3.c
--- libc.softfp/soft-fp/divsf3.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/divsf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __divsf3(float a, float b)
+SFtype __divsf3(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_S(A, a);
diff -rupN libc.softfp/soft-fp/divtf3.c libc.softfp2/soft-fp/divtf3.c
--- libc.softfp/soft-fp/divtf3.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/divtf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a / b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __divtf3(long double a, long double b)
+TFtype __divtf3(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_Q(A, a);
diff -rupN libc.softfp/soft-fp/double.h libc.softfp2/soft-fp/double.h
--- libc.softfp/soft-fp/double.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/double.h 2006-02-18 01:32:32.000000000 +0000
@@ -51,11 +51,13 @@
 #define _FP_OVERFLOW_D \
  ((_FP_W_TYPE)1 << _FP_WFRACBITS_D % _FP_W_TYPE_SIZE)
 
+typedef float DFtype __attribute__((mode(DF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_D
 {
-  double flt;
+  DFtype flt;
   struct {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign  : 1;
@@ -154,7 +156,7 @@ union _FP_UNION_D
 
 union _FP_UNION_D
 {
-  double flt;
+  DFtype flt;
   struct {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign : 1;
diff -rupN libc.softfp/soft-fp/eqdf2.c libc.softfp2/soft-fp/eqdf2.c
--- libc.softfp/soft-fp/eqdf2.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/eqdf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "double.h"
 
-int __eqdf2(double a, double b)
+int __eqdf2(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B);
diff -rupN libc.softfp/soft-fp/eqsf2.c libc.softfp2/soft-fp/eqsf2.c
--- libc.softfp/soft-fp/eqsf2.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/eqsf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "single.h"
 
-int __eqsf2(float a, float b)
+int __eqsf2(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B);
diff -rupN libc.softfp/soft-fp/eqtf2.c libc.softfp2/soft-fp/eqtf2.c
--- libc.softfp/soft-fp/eqtf2.c 2001-07-06 10:53:02.000000000 +0000
+++ libc.softfp2/soft-fp/eqtf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return 0 iff a == b, 1 otherwise
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-int __eqtf2(long double a, long double b)
+int __eqtf2(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B);
diff -rupN libc.softfp/soft-fp/extenddftf2.c libc.softfp2/soft-fp/extenddftf2.c
--- libc.softfp/soft-fp/extenddftf2.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/extenddftf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -24,12 +24,12 @@
 #include "double.h"
 #include "quad.h"
 
-long double __extenddftf2(double a)
+TFtype __extenddftf2(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_RAW_D(A, a);
diff -rupN libc.softfp/soft-fp/extended.h libc.softfp2/soft-fp/extended.h
--- libc.softfp/soft-fp/extended.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/extended.h 2006-02-18 01:32:32.000000000 +0000
@@ -48,11 +48,13 @@
 #define _FP_OVERFLOW_E \
  ((_FP_W_TYPE)1 << (_FP_WFRACBITS_E % _FP_W_TYPE_SIZE))
 
+typedef float XFtype __attribute__((mode(XF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_E
 {
-   long double flt;
+   XFtype flt;
    struct
    {
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -263,7 +265,7 @@ union _FP_UNION_E
 #else   /* not _FP_W_TYPE_SIZE < 64 */
 union _FP_UNION_E
 {
-  long double flt /* __attribute__((mode(TF))) */ ;
+  XFtype flt;
   struct {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned long pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
diff -rupN libc.softfp/soft-fp/extendsfdf2.c libc.softfp2/soft-fp/extendsfdf2.c
--- libc.softfp/soft-fp/extendsfdf2.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/extendsfdf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -24,12 +24,12 @@
 #include "single.h"
 #include "double.h"
 
-double __extendsfdf2(float a)
+DFtype __extendsfdf2(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_RAW_S(A, a);
diff -rupN libc.softfp/soft-fp/extendsftf2.c libc.softfp2/soft-fp/extendsftf2.c
--- libc.softfp/soft-fp/extendsftf2.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/extendsftf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -24,12 +24,12 @@
 #include "single.h"
 #include "quad.h"
 
-long double __extendsftf2(float a)
+TFtype __extendsftf2(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_RAW_S(A, a);
diff -rupN libc.softfp/soft-fp/fixdfdi.c libc.softfp2/soft-fp/fixdfdi.c
--- libc.softfp/soft-fp/fixdfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixdfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "double.h"
 
-DItype __fixdfdi(double a)
+DItype __fixdfdi(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   UDItype r;
 
   FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, 64, 1);
+  FP_TO_INT_D(r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixdfsi.c libc.softfp2/soft-fp/fixdfsi.c
--- libc.softfp/soft-fp/fixdfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixdfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "double.h"
 
-SItype __fixdfsi(double a)
+SItype __fixdfsi(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   USItype r;
 
   FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, 32, 1);
+  FP_TO_INT_D(r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixsfdi.c libc.softfp2/soft-fp/fixsfdi.c
--- libc.softfp/soft-fp/fixsfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixsfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "single.h"
 
-DItype __fixsfdi(float a)
+DItype __fixsfdi(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   UDItype r;
 
   FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, 64, 1);
+  FP_TO_INT_S(r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixsfsi.c libc.softfp2/soft-fp/fixsfsi.c
--- libc.softfp/soft-fp/fixsfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixsfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "single.h"
 
-SItype __fixsfsi(float a)
+SItype __fixsfsi(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   USItype r;
 
   FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, 32, 1);
+  FP_TO_INT_S(r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixtfdi.c libc.softfp2/soft-fp/fixtfdi.c
--- libc.softfp/soft-fp/fixtfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixtfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-DItype __fixtfdi(long double a)
+DItype __fixtfdi(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
   UDItype r;
 
   FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, 64, 1);
+  FP_TO_INT_Q(r, A, DI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixtfsi.c libc.softfp2/soft-fp/fixtfsi.c
--- libc.softfp/soft-fp/fixtfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixtfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-SItype __fixtfsi(long double a)
+SItype __fixtfsi(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
   USItype r;
 
   FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, 32, 1);
+  FP_TO_INT_Q(r, A, SI_BITS, 1);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunsdfdi.c libc.softfp2/soft-fp/fixunsdfdi.c
--- libc.softfp/soft-fp/fixunsdfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunsdfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "double.h"
 
-UDItype __fixunsdfdi(double a)
+UDItype __fixunsdfdi(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   UDItype r;
 
   FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, 64, 0);
+  FP_TO_INT_D(r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunsdfsi.c libc.softfp2/soft-fp/fixunsdfsi.c
--- libc.softfp/soft-fp/fixunsdfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunsdfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "double.h"
 
-USItype __fixunsdfsi(double a)
+USItype __fixunsdfsi(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   USItype r;
 
   FP_UNPACK_RAW_D(A, a);
-  FP_TO_INT_D(r, A, 32, 0);
+  FP_TO_INT_D(r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunssfdi.c libc.softfp2/soft-fp/fixunssfdi.c
--- libc.softfp/soft-fp/fixunssfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunssfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "single.h"
 
-UDItype __fixunssfdi(float a)
+UDItype __fixunssfdi(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   UDItype r;
 
   FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, 64, 0);
+  FP_TO_INT_S(r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunssfsi.c libc.softfp2/soft-fp/fixunssfsi.c
--- libc.softfp/soft-fp/fixunssfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunssfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "single.h"
 
-USItype __fixunssfsi(float a)
+USItype __fixunssfsi(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
   USItype r;
 
   FP_UNPACK_RAW_S(A, a);
-  FP_TO_INT_S(r, A, 32, 0);
+  FP_TO_INT_S(r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunstfdi.c libc.softfp2/soft-fp/fixunstfdi.c
--- libc.softfp/soft-fp/fixunstfdi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunstfdi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-UDItype __fixunstfdi(long double a)
+UDItype __fixunstfdi(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
   UDItype r;
 
   FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, 64, 0);
+  FP_TO_INT_Q(r, A, DI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/fixunstfsi.c libc.softfp2/soft-fp/fixunstfsi.c
--- libc.softfp/soft-fp/fixunstfsi.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/fixunstfsi.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-USItype __fixunstfsi(long double a)
+USItype __fixunstfsi(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
   USItype r;
 
   FP_UNPACK_RAW_Q(A, a);
-  FP_TO_INT_Q(r, A, 32, 0);
+  FP_TO_INT_Q(r, A, SI_BITS, 0);
   FP_HANDLE_EXCEPTIONS;
 
   return r;
diff -rupN libc.softfp/soft-fp/floatdidf.c libc.softfp2/soft-fp/floatdidf.c
--- libc.softfp/soft-fp/floatdidf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatdidf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __floatdidf(DItype i)
+DFtype __floatdidf(DItype i)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  double a;
+  DFtype a;
 
-  FP_FROM_INT_D(A, i, 64, long long);
+  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatdisf.c libc.softfp2/soft-fp/floatdisf.c
--- libc.softfp/soft-fp/floatdisf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatdisf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __floatdisf(DItype i)
+SFtype __floatdisf(DItype i)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  float a;
+  SFtype a;
 
-  FP_FROM_INT_S(A, i, 64, long long);
+  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatditf.c libc.softfp2/soft-fp/floatditf.c
--- libc.softfp/soft-fp/floatditf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatditf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __floatditf(DItype i)
+TFtype __floatditf(DItype i)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  long double a;
+  TFtype a;
 
-  FP_FROM_INT_Q(A, i, 64, long long);
+  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatsidf.c libc.softfp2/soft-fp/floatsidf.c
--- libc.softfp/soft-fp/floatsidf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatsidf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __floatsidf(SItype i)
+DFtype __floatsidf(SItype i)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  double a;
+  DFtype a;
 
-  FP_FROM_INT_D(A, i, 32, int);
+  FP_FROM_INT_D(A, i, SI_BITS, USItype);
   FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatsisf.c libc.softfp2/soft-fp/floatsisf.c
--- libc.softfp/soft-fp/floatsisf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatsisf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __floatsisf(SItype i)
+SFtype __floatsisf(SItype i)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  float a;
+  SFtype a;
 
-  FP_FROM_INT_S(A, i, 32, int);
+  FP_FROM_INT_S(A, i, SI_BITS, USItype);
   FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatsitf.c libc.softfp2/soft-fp/floatsitf.c
--- libc.softfp/soft-fp/floatsitf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatsitf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,13 +23,13 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __floatsitf(SItype i)
+TFtype __floatsitf(SItype i)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  long double a;
+  TFtype a;
 
-  FP_FROM_INT_Q(A, i, 32, int);
+  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
   FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatundidf.c libc.softfp2/soft-fp/floatundidf.c
--- libc.softfp/soft-fp/floatundidf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatundidf.c 2006-02-18 01:32:32.000000000 +0000
@@ -28,9 +28,9 @@ __floatundidf(UDItype i)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  double a;
+  DFtype a;
 
-  FP_FROM_INT_D(A, i, 64, long long);
+  FP_FROM_INT_D(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatundisf.c libc.softfp2/soft-fp/floatundisf.c
--- libc.softfp/soft-fp/floatundisf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatundisf.c 2006-02-18 01:32:32.000000000 +0000
@@ -28,9 +28,9 @@ __floatundisf(UDItype i)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  float a;
+  SFtype a;
 
-  FP_FROM_INT_S(A, i, 64, long long);
+  FP_FROM_INT_S(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatunditf.c libc.softfp2/soft-fp/floatunditf.c
--- libc.softfp/soft-fp/floatunditf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatunditf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double
+TFtype
 __floatunditf(UDItype i)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  long double a;
+  TFtype a;
 
-  FP_FROM_INT_Q(A, i, 64, long long);
+  FP_FROM_INT_Q(A, i, DI_BITS, UDItype);
   FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatunsidf.c libc.softfp2/soft-fp/floatunsidf.c
--- libc.softfp/soft-fp/floatunsidf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatunsidf.c 2006-02-18 01:32:32.000000000 +0000
@@ -28,9 +28,9 @@ __floatunsidf(USItype i)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
-  double a;
+  DFtype a;
 
-  FP_FROM_INT_D(A, i, 32, int);
+  FP_FROM_INT_D(A, i, SI_BITS, USItype);
   FP_PACK_RAW_D(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatunsisf.c libc.softfp2/soft-fp/floatunsisf.c
--- libc.softfp/soft-fp/floatunsisf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatunsisf.c 2006-02-18 01:32:32.000000000 +0000
@@ -28,9 +28,9 @@ __floatunsisf(USItype i)
 {
   FP_DECL_EX;
   FP_DECL_S(A);
-  float a;
+  SFtype a;
 
-  FP_FROM_INT_S(A, i, 32, int);
+  FP_FROM_INT_S(A, i, SI_BITS, USItype);
   FP_PACK_RAW_S(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/floatunsitf.c libc.softfp2/soft-fp/floatunsitf.c
--- libc.softfp/soft-fp/floatunsitf.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/floatunsitf.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,14 +23,14 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double
+TFtype
 __floatunsitf(USItype i)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
-  long double a;
+  TFtype a;
 
-  FP_FROM_INT_Q(A, i, 32, int);
+  FP_FROM_INT_Q(A, i, SI_BITS, USItype);
   FP_PACK_RAW_Q(a, A);
   FP_HANDLE_EXCEPTIONS;
 
diff -rupN libc.softfp/soft-fp/gedf2.c libc.softfp2/soft-fp/gedf2.c
--- libc.softfp/soft-fp/gedf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/gedf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "double.h"
 
-int __gedf2(double a, double b)
+int __gedf2(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B);
diff -rupN libc.softfp/soft-fp/gesf2.c libc.softfp2/soft-fp/gesf2.c
--- libc.softfp/soft-fp/gesf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/gesf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "single.h"
 
-int __gesf2(float a, float b)
+int __gesf2(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B);
diff -rupN libc.softfp/soft-fp/getf2.c libc.softfp2/soft-fp/getf2.c
--- libc.softfp/soft-fp/getf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/getf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-int __getf2(long double a, long double b)
+int __getf2(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B);
diff -rupN libc.softfp/soft-fp/ledf2.c libc.softfp2/soft-fp/ledf2.c
--- libc.softfp/soft-fp/ledf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/ledf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "double.h"
 
-int __ledf2(double a, double b)
+int __ledf2(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B);
diff -rupN libc.softfp/soft-fp/lesf2.c libc.softfp2/soft-fp/lesf2.c
--- libc.softfp/soft-fp/lesf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/lesf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "single.h"
 
-int __lesf2(float a, float b)
+int __lesf2(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B);
diff -rupN libc.softfp/soft-fp/letf2.c libc.softfp2/soft-fp/letf2.c
--- libc.softfp/soft-fp/letf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/letf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -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,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,7 +23,7 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-int __letf2(long double a, long double b)
+int __letf2(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B);
diff -rupN libc.softfp/soft-fp/muldf3.c libc.softfp2/soft-fp/muldf3.c
--- libc.softfp/soft-fp/muldf3.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/muldf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __muldf3(double a, double b)
+DFtype __muldf3(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_D(A, a);
diff -rupN libc.softfp/soft-fp/mulsf3.c libc.softfp2/soft-fp/mulsf3.c
--- libc.softfp/soft-fp/mulsf3.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/mulsf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __mulsf3(float a, float b)
+SFtype __mulsf3(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_S(A, a);
diff -rupN libc.softfp/soft-fp/multf3.c libc.softfp2/soft-fp/multf3.c
--- libc.softfp/soft-fp/multf3.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/multf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return a * b
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __multf3(long double a, long double b)
+TFtype __multf3(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_Q(A, a);
diff -rupN libc.softfp/soft-fp/negdf2.c libc.softfp2/soft-fp/negdf2.c
--- libc.softfp/soft-fp/negdf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/negdf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __negdf2(double a)
+DFtype __negdf2(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_UNPACK_D(A, a);
   FP_NEG_D(R, A);
diff -rupN libc.softfp/soft-fp/negsf2.c libc.softfp2/soft-fp/negsf2.c
--- libc.softfp/soft-fp/negsf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/negsf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __negsf2(float a)
+SFtype __negsf2(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_UNPACK_S(A, a);
   FP_NEG_S(R, A);
diff -rupN libc.softfp/soft-fp/negtf2.c libc.softfp2/soft-fp/negtf2.c
--- libc.softfp/soft-fp/negtf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/negtf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return -a
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __negtf2(long double a)
+TFtype __negtf2(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_UNPACK_Q(A, a);
   FP_NEG_Q(R, A);
diff -rupN libc.softfp/soft-fp/op-2.h libc.softfp2/soft-fp/op-2.h
--- libc.softfp/soft-fp/op-2.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/op-2.h 2006-02-18 01:32:32.000000000 +0000
@@ -29,79 +29,74 @@
 #define _FP_FRAC_LOW_2(X) (X##_f0)
 #define _FP_FRAC_WORD_2(X,w) (X##_f##w)
 
-#define _FP_FRAC_SLL_2(X,N) \
-  do { \
-    if ((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); \
-  } \
-      } \
-    else \
-      { \
- X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \
- X##_f0 = 0; \
-      } \
-  } while (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) \
-  do { \
-    if ((N) < _FP_W_TYPE_SIZE) \
-      { \
- X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \
- X##_f1 >>= (N); \
-      } \
-    else \
-      { \
- X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \
- X##_f1 = 0; \
-      } \
-  } while (0)
+(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) \
-  do { \
-    if ((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); \
-      } \
-    else \
-      { \
- S = (((X##_f1 << (2*_FP_W_TYPE_SIZE - (N))) | X##_f0) != 0); \
- X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE)); \
- X##_f1 = 0; \
-      } \
-  } while (0)
-
-#define _FP_FRAC_SRS_2(X,N,sz) \
-  do { \
-    if ((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); \
-      } \
-    else \
-      { \
- X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \
-  (((X##_f1 << (2*_FP_W_TYPE_SIZE - (N))) | \
-    X##_f0) != 0)); \
- X##_f1 = 0; \
-      } \
-  } while (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_ADDI_2(X,I) \
   __FP_FRAC_ADDI_2(X##_f1, X##_f0, I)
@@ -133,9 +128,9 @@
 #define _FP_FRAC_CLEAR_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##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)
+  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
 #define _FP_FRAC_GE_2(X, Y) \
-  (X##_f1 > Y##_f1 || X##_f1 == Y##_f1 && X##_f0 >= Y##_f0)
+  (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0))
 
 #define _FP_ZEROFRAC_2 0, 0
 #define _FP_MINFRAC_2 0, 1
@@ -588,16 +583,13 @@
  */
 
 #define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \
-  do { \
-    if (rsize <= _FP_W_TYPE_SIZE) \
-      r = X##_f0; \
-    else \
-      { \
- r = X##_f1; \
- r <<= _FP_W_TYPE_SIZE; \
- r += X##_f0; \
-      } \
-  } while (0)
+(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 { \
diff -rupN libc.softfp/soft-fp/op-4.h libc.softfp2/soft-fp/op-4.h
--- libc.softfp/soft-fp/op-4.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/op-4.h 2006-02-18 01:32:32.000000000 +0000
@@ -87,13 +87,12 @@
     _up = _FP_W_TYPE_SIZE - _down; \
     for (_s = _i = 0; _i < _skip; ++_i) \
       _s |= X##_f[_i]; \
-    _s |= X##_f[_i] << _up; \
-/* s is now != 0 if we want to set the LSbit */ \
     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; \
@@ -518,7 +517,7 @@
 #ifndef __FP_FRAC_ADD_3
 #define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
   do { \
-    int _c1, _c2; \
+    _FP_W_TYPE _c1, _c2; \
     r0 = x0 + y0; \
     _c1 = r0 < x0; \
     r1 = x1 + y1; \
@@ -532,7 +531,7 @@
 #ifndef __FP_FRAC_ADD_4
 #define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
   do { \
-    int _c1, _c2, _c3; \
+    _FP_W_TYPE _c1, _c2, _c3; \
     r0 = x0 + y0; \
     _c1 = r0 < x0; \
     r1 = x1 + y1; \
@@ -550,7 +549,7 @@
 #ifndef __FP_FRAC_SUB_3
 #define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
   do { \
-    int _c1, _c2; \
+    _FP_W_TYPE _c1, _c2; \
     r0 = x0 - y0; \
     _c1 = r0 > x0; \
     r1 = x1 - y1; \
@@ -564,7 +563,7 @@
 #ifndef __FP_FRAC_SUB_4
 #define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
   do { \
-    int _c1, _c2, _c3; \
+    _FP_W_TYPE _c1, _c2, _c3; \
     r0 = x0 - y0; \
     _c1 = r0 > x0; \
     r1 = x1 - y1; \
diff -rupN libc.softfp/soft-fp/op-8.h libc.softfp2/soft-fp/op-8.h
--- libc.softfp/soft-fp/op-8.h 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/op-8.h 2006-02-18 01:32:32.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic eight-word fraction declaration and manipulation.
-   Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
   Jakub Jelinek ([hidden email]) and
@@ -83,13 +83,12 @@
     _up = _FP_W_TYPE_SIZE - _down; \
     for (_s = _i = 0; _i < _skip; ++_i) \
       _s |= X##_f[_i]; \
-    _s |= X##_f[_i] << _up; \
-/* s is now != 0 if we want to set the LSbit */ \
     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; \
diff -rupN libc.softfp/soft-fp/op-common.h libc.softfp2/soft-fp/op-common.h
--- libc.softfp/soft-fp/op-common.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/op-common.h 2006-02-18 01:32:32.000000000 +0000
@@ -21,8 +21,8 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#define _FP_DECL(wc, X) \
-  _FP_I_TYPE X##_c, X##_s, X##_e; \
+#define _FP_DECL(wc, X) \
+  _FP_I_TYPE X##_c __attribute__((unused)), X##_s, X##_e; \
   _FP_FRAC_DECL_##wc(X)
 
 /*
@@ -898,20 +898,20 @@ do { \
 
 /* 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))); \
-      }  \
+#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.  */
@@ -1027,9 +1027,11 @@ do { \
   /* Possibly converting to most negative integer; check the \
      mantissa.  */ \
   int inexact = 0; \
-  if (_FP_FRACBITS_##fs > rsize) \
-    _FP_FRAC_SRST_##wc(X, inexact, _FP_FRACBITS_##fs - rsize, \
-       _FP_FRACBITS_##fs); \
+  (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) \
@@ -1062,76 +1064,76 @@ do { \
     } \
 } while (0)
 
-/* Convert integer to fp.  Output is raw.  RTYPE is signed even if
-   input is unsigned.  */
-#define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \
-  do { \
-    if (r) \
-      { \
- unsigned rtype ur_; \
- \
- if ((X##_s = (r < 0))) \
-  r = -(unsigned rtype)r; \
- \
- ur_ = (unsigned rtype) r; \
- if (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_; \
-  } \
- else if (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_; \
-  } \
- else \
-  abort(); \
- \
- 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); \
-    _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); \
-      } \
+/* 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);     \
+    _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)
 
 
diff -rupN libc.softfp/soft-fp/quad.h libc.softfp2/soft-fp/quad.h
--- libc.softfp/soft-fp/quad.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/quad.h 2006-02-18 01:32:32.000000000 +0000
@@ -51,11 +51,13 @@
 #define _FP_OVERFLOW_Q \
  ((_FP_W_TYPE)1 << (_FP_WFRACBITS_Q % _FP_W_TYPE_SIZE))
 
+typedef float TFtype __attribute__((mode(TF)));
+
 #if _FP_W_TYPE_SIZE < 64
 
 union _FP_UNION_Q
 {
-   long double flt;
+   TFtype flt;
    struct
    {
 #if __BYTE_ORDER == __BIG_ENDIAN
@@ -159,7 +161,7 @@ union _FP_UNION_Q
 #else   /* not _FP_W_TYPE_SIZE < 64 */
 union _FP_UNION_Q
 {
-  long double flt /* __attribute__((mode(TF))) */ ;
+  TFtype flt /* __attribute__((mode(TF))) */ ;
   struct {
     _FP_W_TYPE a, b;
   } longs;
diff -rupN libc.softfp/soft-fp/single.h libc.softfp2/soft-fp/single.h
--- libc.softfp/soft-fp/single.h 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/single.h 2006-02-18 01:32:32.000000000 +0000
@@ -44,9 +44,11 @@
 /* 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)));
+
 union _FP_UNION_S
 {
-  float flt;
+  SFtype flt;
   struct {
 #if __BYTE_ORDER == __BIG_ENDIAN
     unsigned sign : 1;
diff -rupN libc.softfp/soft-fp/soft-fp.h libc.softfp2/soft-fp/soft-fp.h
--- libc.softfp/soft-fp/soft-fp.h 2005-12-23 11:49:50.000000000 +0000
+++ libc.softfp2/soft-fp/soft-fp.h 2006-02-18 01:32:32.000000000 +0000
@@ -1,5 +1,5 @@
 /* Software floating-point emulation.
-   Copyright (C) 1997,1998,1999,2000,2002,2003,2005
+   Copyright (C) 1997,1998,1999,2000,2002,2003,2005,2006
  Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]),
@@ -25,11 +25,19 @@
 #ifndef SOFT_FP_H
 #define SOFT_FP_H
 
+#ifdef _LIBC
 #include <sfp-machine.h>
+#else
+#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"
+#endif
 #endif
 
 #define _FP_WORKBITS 3
@@ -172,10 +180,21 @@ typedef unsigned int UHWtype __attribute
 typedef USItype UHWtype;
 #endif
 
+#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"
+#endif
 #endif
 
+#ifdef _LIBC
 #include <stdlib.h>
+#else
+extern void abort (void);
+#endif
 
 #endif
diff -rupN libc.softfp/soft-fp/sqrtdf2.c libc.softfp2/soft-fp/sqrtdf2.c
--- libc.softfp/soft-fp/sqrtdf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/sqrtdf2.c 2006-02-18 01:33:14.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return sqrt(a)
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __sqrtdf2(double a)
+DFtype __sqrtdf2(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_D(A, a);
diff -rupN libc.softfp/soft-fp/sqrtsf2.c libc.softfp2/soft-fp/sqrtsf2.c
--- libc.softfp/soft-fp/sqrtsf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/sqrtsf2.c 2006-02-18 01:33:01.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return sqrt(a)
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __sqrtsf2(float a)
+SFtype __sqrtsf2(SFtype a)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_S(A, a);
diff -rupN libc.softfp/soft-fp/sqrttf2.c libc.softfp2/soft-fp/sqrttf2.c
--- libc.softfp/soft-fp/sqrttf2.c 2001-07-06 10:53:04.000000000 +0000
+++ libc.softfp2/soft-fp/sqrttf2.c 2006-02-18 01:33:37.000000000 +0000
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Return sqrt(a)
-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
+   Copyright (C) 1997,1999,2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson ([hidden email]) and
   Jakub Jelinek ([hidden email]).
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __sqrttf2(long double a)
+TFtype __sqrttf2(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_Q(A, a);
diff -rupN libc.softfp/soft-fp/subdf3.c libc.softfp2/soft-fp/subdf3.c
--- libc.softfp/soft-fp/subdf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/subdf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "double.h"
 
-double __subdf3(double a, double b)
+DFtype __subdf3(DFtype a, DFtype b)
 {
   FP_DECL_EX;
   FP_DECL_D(A); FP_DECL_D(B); FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_D(A, a);
diff -rupN libc.softfp/soft-fp/subsf3.c libc.softfp2/soft-fp/subsf3.c
--- libc.softfp/soft-fp/subsf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/subsf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "single.h"
 
-float __subsf3(float a, float b)
+SFtype __subsf3(SFtype a, SFtype b)
 {
   FP_DECL_EX;
   FP_DECL_S(A); FP_DECL_S(B); FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_S(A, a);
diff -rupN libc.softfp/soft-fp/subtf3.c libc.softfp2/soft-fp/subtf3.c
--- libc.softfp/soft-fp/subtf3.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/subtf3.c 2006-02-18 01:32:32.000000000 +0000
@@ -23,11 +23,11 @@
 #include "soft-fp.h"
 #include "quad.h"
 
-long double __subtf3(long double a, long double b)
+TFtype __subtf3(TFtype a, TFtype b)
 {
   FP_DECL_EX;
   FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(R);
-  long double r;
+  TFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_Q(A, a);
diff -rupN libc.softfp/soft-fp/truncdfsf2.c libc.softfp2/soft-fp/truncdfsf2.c
--- libc.softfp/soft-fp/truncdfsf2.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/truncdfsf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -24,12 +24,12 @@
 #include "single.h"
 #include "double.h"
 
-float __truncdfsf2(double a)
+SFtype __truncdfsf2(DFtype a)
 {
   FP_DECL_EX;
   FP_DECL_D(A);
   FP_DECL_S(R);
-  float r;
+  SFtype r;
 
   FP_INIT_ROUNDMODE;
   FP_UNPACK_SEMIRAW_D(A, a);
diff -rupN libc.softfp/soft-fp/trunctfdf2.c libc.softfp2/soft-fp/trunctfdf2.c
--- libc.softfp/soft-fp/trunctfdf2.c 2006-02-18 01:30:20.000000000 +0000
+++ libc.softfp2/soft-fp/trunctfdf2.c 2006-02-18 01:32:32.000000000 +0000
@@ -24,12 +24,12 @@
 #include "double.h"
 #include "quad.h"
 
-double __trunctfdf2(long double a)
+DFtype __trunctfdf2(TFtype a)
 {
   FP_DECL_EX;
   FP_DECL_Q(A);
   FP_DECL_D(R);
-  double r;
+  DFtype r;
 
   FP
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Richard Henderson
In reply to this post by Joseph Myers
I've generally looked over the code and it the changes look good.
I'm willing to let this go in on the strength of the testing you've
done.

Each of the specific bug fixes you mention are genuine problems;
after your series of patches has stabilized, we'll need to merge
this into the linux kernel sources to fix the same problems there.


r~
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Daniel Jacobowitz-2
On Fri, Feb 24, 2006 at 08:13:11AM -0800, Richard Henderson wrote:
> Each of the specific bug fixes you mention are genuine problems;
> after your series of patches has stabilized, we'll need to merge
> this into the linux kernel sources to fix the same problems there.

Are these actually still used in the Linux kernel?  I can find no trace
of them.

--
Daniel Jacobowitz
CodeSourcery
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Jakub Jelinek
On Fri, Feb 24, 2006 at 11:23:39AM -0500, Daniel Jacobowitz wrote:
> On Fri, Feb 24, 2006 at 08:13:11AM -0800, Richard Henderson wrote:
> > Each of the specific bug fixes you mention are genuine problems;
> > after your series of patches has stabilized, we'll need to merge
> > this into the linux kernel sources to fix the same problems there.
>
> Are these actually still used in the Linux kernel?

Yes.

>  I can find no trace of them.

E.g.

linux-2.6.15/include/math-emu/
linux-2.6.15/arch/{sparc,sparc64,s390,alpha,parisc}/math-emu/

        Jakub
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Daniel Jacobowitz-2
On Fri, Feb 24, 2006 at 09:02:57PM +0100, Jakub Jelinek wrote:

> On Fri, Feb 24, 2006 at 11:23:39AM -0500, Daniel Jacobowitz wrote:
> > On Fri, Feb 24, 2006 at 08:13:11AM -0800, Richard Henderson wrote:
> > > Each of the specific bug fixes you mention are genuine problems;
> > > after your series of patches has stabilized, we'll need to merge
> > > this into the linux kernel sources to fix the same problems there.
> >
> > Are these actually still used in the Linux kernel?
>
> Yes.
>
> >  I can find no trace of them.
>
> E.g.
>
> linux-2.6.15/include/math-emu/
> linux-2.6.15/arch/{sparc,sparc64,s390,alpha,parisc}/math-emu/

Ah, I see.  Most of that seems to bear no relation to this code.  The
ones that do are include/math-emu/ (with glibc copyrights) and
arch/ppc/math-emu (without - hasn't been merged in a long time I'd
wager).  For instance, the parisc/math-emu code comes from HP-UX :-)

--
Daniel Jacobowitz
CodeSourcery
Reply | Threaded
Open this post in threaded view
|

Re: soft-fp speedup patch

Roland McGrath
In reply to this post by Joseph Myers
I've put both soft-fp patches in.


Thanks,
Roland