From b04c90638b1b3042078fda9582f3b3008ce51bc1 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 20 Jan 2006 00:42:29 +0000 Subject: 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 --- gcc/ChangeLog | 7 +++++++ gcc/libgcc2.c | 18 ++++++++++++++++-- gcc/libgcc2.h | 8 ++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) (limited to 'gcc') 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 + + * 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 * 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 -- cgit v1.1