aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2006-01-20 00:42:29 +0000
committerAlan Modra <amodra@gcc.gnu.org>2006-01-20 11:12:29 +1030
commitb04c90638b1b3042078fda9582f3b3008ce51bc1 (patch)
treef6f5efb500cbb0ac5e1911492d4637b9e6fd58d5 /gcc
parente9a8eb89de4a63575154ba3fe25a2597b5552f9c (diff)
downloadgcc-b04c90638b1b3042078fda9582f3b3008ce51bc1.zip
gcc-b04c90638b1b3042078fda9582f3b3008ce51bc1.tar.gz
gcc-b04c90638b1b3042078fda9582f3b3008ce51bc1.tar.bz2
libgcc2.c (__floatdisf, [...]): Don't use IBM Extended Double TFmode.
* libgcc2.c (__floatdisf, __floatdidf): Don't use IBM Extended Double TFmode. (__floatundisf, __floatundidf): Likewise. * libgcc2.h (IS_IBM_EXTENDED): Define. From-SVN: r110004
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/libgcc2.c18
-rw-r--r--gcc/libgcc2.h8
3 files changed, 31 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b434a9c..8aaec41 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-20 Alan Modra <amodra@bigpond.net.au>
+
+ * libgcc2.c (__floatdisf, __floatdidf): Don't use IBM Extended
+ Double TFmode.
+ (__floatundisf, __floatundidf): Likewise.
+ * libgcc2.h (IS_IBM_EXTENDED): Define.
+
2006-01-19 DJ Delorie <dj@redhat.com>
* config/m32c/m32c.h (REG_ALLOC_ORDER): Define.
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 03cc448..97717a4 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -1371,7 +1371,14 @@ __floatunditf (UDWtype u)
#if (defined(L_floatdisf) && LIBGCC2_HAS_SF_MODE) \
|| (defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE)
#define DI_SIZE (W_TYPE_SIZE * 2)
-#define F_MODE_OK(SIZE) (SIZE < DI_SIZE && SIZE > (DI_SIZE - SIZE + FSSIZE))
+#define F_MODE_OK(SIZE) \
+ (SIZE < DI_SIZE \
+ && SIZE > (DI_SIZE - SIZE + FSSIZE) \
+ /* Don't use IBM Extended Double TFmode for TI->SF calculations. \
+ The conversion from long double to float suffers from double \
+ rounding, because we convert via double. In any case, the \
+ fallback code is faster. */ \
+ && !IS_IBM_EXTENDED (SIZE))
#if defined(L_floatdisf)
#define FUNC __floatdisf
#define FSTYPE SFtype
@@ -1476,7 +1483,14 @@ FUNC (DWtype u)
#if (defined(L_floatundisf) && LIBGCC2_HAS_SF_MODE) \
|| (defined(L_floatundidf) && LIBGCC2_HAS_DF_MODE)
#define DI_SIZE (W_TYPE_SIZE * 2)
-#define F_MODE_OK(SIZE) (SIZE < DI_SIZE && SIZE > (DI_SIZE - SIZE + FSSIZE))
+#define F_MODE_OK(SIZE) \
+ (SIZE < DI_SIZE \
+ && SIZE > (DI_SIZE - SIZE + FSSIZE) \
+ /* Don't use IBM Extended Double TFmode for TI->SF calculations. \
+ The conversion from long double to float suffers from double \
+ rounding, because we convert via double. In any case, the \
+ fallback code is faster. */ \
+ && !IS_IBM_EXTENDED (SIZE))
#if defined(L_floatundisf)
#define FUNC __floatundisf
#define FSTYPE SFtype
diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h
index f8056d6..f24854f 100644
--- a/gcc/libgcc2.h
+++ b/gcc/libgcc2.h
@@ -117,6 +117,14 @@ extern short int __get_eh_table_version (struct exception_descriptor *);
#endif
#endif
+/* FIXME: This #ifdef probably should be removed, ie. enable the test
+ for mips too. */
+#ifdef __powerpc__
+#define IS_IBM_EXTENDED(SIZE) (SIZE == 106)
+#else
+#define IS_IBM_EXTENDED(SIZE) 0
+#endif
+
#ifndef MIN_UNITS_PER_WORD
#define MIN_UNITS_PER_WORD UNITS_PER_WORD
#endif