aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/config/ia64/hpux.h8
-rw-r--r--gcc/config/ia64/lib1funcs.asm10
-rw-r--r--gcc/config/ia64/t-ia643
-rw-r--r--gcc/doc/tm.texi30
-rw-r--r--gcc/libgcc2.c38
-rw-r--r--gcc/libgcc2.h28
7 files changed, 102 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b45dc87..ab87033 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,22 @@
+2005-02-25 Steve Ellcey <sje@cup.hp.com>
+
+ PR target/19930
+ * doc/tm.texi (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Document.
+ (LIBGCC2_HAS_DF_MODE): New.
+ (LIBGCC2_HAS_XF_MODE): New.
+ (LIBGCC2_HAS_TF_MODE): New.
+ * libgcc2.h (LIBGCC2_HAS_XF_MODE): New name for HAVE_XFMODE.
+ (LIBGCC2_HAS_TF_MODE): New name for HAVE_TFMODE.
+ * libgcc2.c (LIBGCC2_HAS_XF_MODE): New name for HAVE_XFMODE.
+ (LIBGCC2_HAS_TF_MODE): New name for HAVE_TFMODE.
+ (LIBGCC2_HAS_DF_MODE): New name for HAVE_DFMODE.
+ * config/ia64/t-ia64 (LIB1ASMFUNCS): Remove __compat
+ and add _fixtfdi, _fixunstfdi, _floatditf
+ * lib1funcs.asm: Remove L__compat. Add L_fixtfdi,
+ L_fixunstfdi, L_floatditf.
+ * config/ia64/hpux.h (LIBGCC2_HAS_XF_MODE): Define.
+ (LIBGCC2_HAS_TF_MODE): Define.
+
2005-02-25 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/20204
diff --git a/gcc/config/ia64/hpux.h b/gcc/config/ia64/hpux.h
index 9b66a63..5b4f047 100644
--- a/gcc/config/ia64/hpux.h
+++ b/gcc/config/ia64/hpux.h
@@ -202,3 +202,11 @@ do { \
#define TARGET_INIT_LIBFUNCS ia64_hpux_init_libfuncs
#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) ((MODE) == TFmode)
+
+/* Put all *xf routines in libgcc, regardless of long double size. */
+#undef LIBGCC2_HAS_XF_MODE
+#define LIBGCC2_HAS_XF_MODE 1
+
+/* Put all *tf routines in libgcc, regardless of long double size. */
+#undef LIBGCC2_HAS_TF_MODE
+#define LIBGCC2_HAS_TF_MODE 1
diff --git a/gcc/config/ia64/lib1funcs.asm b/gcc/config/ia64/lib1funcs.asm
index e3d348b..68ee421 100644
--- a/gcc/config/ia64/lib1funcs.asm
+++ b/gcc/config/ia64/lib1funcs.asm
@@ -706,9 +706,8 @@ __ia64_trampoline:
.endp __ia64_trampoline
#endif
-#ifdef L__compat
// Thunks for backward compatibility.
-
+#ifdef L_fixtfdi
.text
.align 16
.global __fixtfti
@@ -719,7 +718,8 @@ __fixtfti:
;;
}
.endp __fixtfti
-
+#endif
+#ifdef L_fixunstfdi
.align 16
.global __fixunstfti
.proc __fixunstfti
@@ -729,7 +729,8 @@ __fixunstfti:
;;
}
.endp __fixunstfti
-
+#endif
+#if L_floatditf
.align 16
.global __floattitf
.proc __floattitf
@@ -739,5 +740,4 @@ __floattitf:
;;
}
.endp __floattitf
-
#endif
diff --git a/gcc/config/ia64/t-ia64 b/gcc/config/ia64/t-ia64
index 04cfc21..824cc41 100644
--- a/gcc/config/ia64/t-ia64
+++ b/gcc/config/ia64/t-ia64
@@ -8,7 +8,8 @@ LIB1ASMSRC = ia64/lib1funcs.asm
LIB1ASMFUNCS = __divxf3 __divdf3 __divsf3 \
__divdi3 __moddi3 __udivdi3 __umoddi3 \
__divsi3 __modsi3 __udivsi3 __umodsi3 __save_stack_nonlocal \
- __nonlocal_goto __restore_stack_nonlocal __trampoline __compat
+ __nonlocal_goto __restore_stack_nonlocal __trampoline \
+ _fixtfdi _fixunstfdi _floatditf
# ??? Hack to get -P option used when compiling lib1funcs.asm, because Intel
# assembler does not accept # line number as a comment.
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index b6102e5..625af4b 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -1635,6 +1635,36 @@ the target machine. If you don't define this, the default is two
words.
@end defmac
+@defmac LIBGCC2_LONG_DOUBLE_TYPE_SIZE
+Define this macro if @code{LONG_DOUBLE_TYPE_SIZE} is not constant or
+if you want routines in @file{libgcc2.a} for a size other than
+@code{LONG_DOUBLE_TYPE_SIZE}. If you don't define this, the
+default is @code{LONG_DOUBLE_TYPE_SIZE}.
+@end defmac
+
+@defmac LIBGCC2_HAS_DF_MODE
+Define this macro if neither @code{LIBGCC2_DOUBLE_TYPE_SIZE} nor
+@code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is
+@code{DFmode} but you want @code{DFmode} routines in @file{libgcc2.a}
+anyway. If you don't define this and either @code{LIBGCC2_DOUBLE_TYPE_SIZE}
+or @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is 64 then the default is 1,
+otherwise it is 0.
+@end defmac
+
+@defmac LIBGCC2_HAS_XF_MODE
+Define this macro if @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is not
+@code{XFmode} but you want @code{XFmode} routines in @file{libgcc2.a}
+anyway. If you don't define this and @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE}
+is 80 then the default is 1, otherwise it is 0.
+@end defmac
+
+@defmac LIBGCC2_HAS_TF_MODE
+Define this macro if @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE} is not
+@code{TFmode} but you want @code{TFmode} routines in @file{libgcc2.a}
+anyway. If you don't define this and @code{LIBGCC2_LONG_DOUBLE_TYPE_SIZE}
+is 128 then the default is 1, otherwise it is 0.
+@end defmac
+
@defmac TARGET_FLT_EVAL_METHOD
A C expression for the value for @code{FLT_EVAL_METHOD} in @file{float.h},
assuming, if applicable, that the floating-point control word is in its
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 1109c5c..68623c3 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -1155,7 +1155,7 @@ __ucmpdi2 (DWtype a, DWtype b)
}
#endif
-#if defined(L_fixunstfdi) && defined(HAVE_TFMODE)
+#if defined(L_fixunstfdi) && LIBGCC2_HAS_TF_MODE
DWtype
__fixunstfDI (TFtype a)
{
@@ -1181,7 +1181,7 @@ __fixunstfDI (TFtype a)
}
#endif
-#if defined(L_fixtfdi) && defined(HAVE_TFMODE)
+#if defined(L_fixtfdi) && LIBGCC2_HAS_TF_MODE
DWtype
__fixtfdi (TFtype a)
{
@@ -1191,7 +1191,7 @@ __fixtfdi (TFtype a)
}
#endif
-#if defined(L_fixunsxfdi) && defined(HAVE_XFMODE)
+#if defined(L_fixunsxfdi) && LIBGCC2_HAS_XF_MODE
DWtype
__fixunsxfDI (XFtype a)
{
@@ -1217,7 +1217,7 @@ __fixunsxfDI (XFtype a)
}
#endif
-#if defined(L_fixxfdi) && defined(HAVE_XFMODE)
+#if defined(L_fixxfdi) && LIBGCC2_HAS_XF_MODE
DWtype
__fixxfdi (XFtype a)
{
@@ -1227,7 +1227,7 @@ __fixxfdi (XFtype a)
}
#endif
-#if defined(L_fixunsdfdi) && defined(HAVE_DFMODE)
+#if defined(L_fixunsdfdi) && LIBGCC2_HAS_DF_MODE
DWtype
__fixunsdfDI (DFtype a)
{
@@ -1246,7 +1246,7 @@ __fixunsdfDI (DFtype a)
}
#endif
-#if defined(L_fixdfdi) && defined(HAVE_DFMODE)
+#if defined(L_fixdfdi) && LIBGCC2_HAS_DF_MODE
DWtype
__fixdfdi (DFtype a)
{
@@ -1260,7 +1260,7 @@ __fixdfdi (DFtype a)
DWtype
__fixunssfDI (SFtype a)
{
-#if defined(HAVE_DFMODE)
+#if LIBGCC2_HAS_DF_MODE
/* Convert the SFtype to a DFtype, because that is surely not going
to lose any bits. Some day someone else can write a faster version
that avoids converting to DFtype, and verify it really works right. */
@@ -1330,7 +1330,7 @@ __fixsfdi (SFtype a)
}
#endif
-#if defined(L_floatdixf) && defined(HAVE_XFMODE)
+#if defined(L_floatdixf) && LIBGCC2_HAS_XF_MODE
XFtype
__floatdixf (DWtype u)
{
@@ -1341,7 +1341,7 @@ __floatdixf (DWtype u)
}
#endif
-#if defined(L_floatditf) && defined(HAVE_TFMODE)
+#if defined(L_floatditf) && LIBGCC2_HAS_TF_MODE
TFtype
__floatditf (DWtype u)
{
@@ -1352,7 +1352,7 @@ __floatditf (DWtype u)
}
#endif
-#if defined(L_floatdidf) && defined(HAVE_DFMODE)
+#if defined(L_floatdidf) && LIBGCC2_HAS_DF_MODE
DFtype
__floatdidf (DWtype u)
{
@@ -1376,7 +1376,7 @@ __floatdisf (DWtype u)
f *= Wtype_MAXp1_F;
f += (UWtype)u;
return f;
-#elif defined(HAVE_DFMODE)
+#elif LIBGCC2_HAS_DF_MODE
#if LIBGCC2_DOUBLE_TYPE_SIZE == 64
#define DF_SIZE DBL_MANT_DIG
@@ -1451,7 +1451,7 @@ __floatdisf (DWtype u)
}
#endif
-#if defined(L_fixunsxfsi) && defined(HAVE_XFMODE)
+#if defined(L_fixunsxfsi) && LIBGCC2_HAS_XF_MODE
/* Reenable the normal types, in case limits.h needs them. */
#undef char
#undef short
@@ -1473,7 +1473,7 @@ __fixunsxfSI (XFtype a)
}
#endif
-#if defined(L_fixunsdfsi) && defined(HAVE_DFMODE)
+#if defined(L_fixunsdfsi) && LIBGCC2_HAS_DF_MODE
/* Reenable the normal types, in case limits.h needs them. */
#undef char
#undef short
@@ -1521,9 +1521,9 @@ __fixunssfSI (SFtype a)
exponents. */
#if defined(L_powisf2) \
- || (defined(L_powidf2) && defined(HAVE_DFMODE)) \
- || (defined(L_powixf2) && defined(HAVE_XFMODE)) \
- || (defined(L_powitf2) && defined(HAVE_TFMODE))
+ || (defined(L_powidf2) && LIBGCC2_HAS_DF_MODE) \
+ || (defined(L_powixf2) && LIBGCC2_HAS_XF_MODE) \
+ || (defined(L_powitf2) && LIBGCC2_HAS_TF_MODE)
# if defined(L_powisf2)
# define TYPE SFtype
# define NAME __powisf2
@@ -1555,9 +1555,9 @@ NAME (TYPE x, Wtype m)
#endif
#if defined(L_mulsc3) || defined(L_divsc3) \
- || ((defined(L_muldc3) || defined(L_divdc3)) && defined(HAVE_DFMODE)) \
- || ((defined(L_mulxc3) || defined(L_divxc3)) && defined(HAVE_XFMODE)) \
- || ((defined(L_multc3) || defined(L_divtc3)) && defined(HAVE_TFMODE))
+ || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
+ || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
+ || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
#undef float
#undef double
diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h
index 0a08f51..d1df220 100644
--- a/gcc/libgcc2.h
+++ b/gcc/libgcc2.h
@@ -58,6 +58,19 @@ extern short int __get_eh_table_version (struct exception_descriptor *);
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
#endif
+#ifndef LIBGCC2_HAS_DF_MODE
+#define LIBGCC2_HAS_DF_MODE \
+ (LIBGCC2_DOUBLE_TYPE_SIZE == 64 || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64)
+#endif
+
+#ifndef LIBGCC2_HAS_XF_MODE
+#define LIBGCC2_HAS_XF_MODE (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80)
+#endif
+
+#ifndef LIBGCC2_HAS_TF_MODE
+#define LIBGCC2_HAS_TF_MODE (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128)
+#endif
+
#ifndef MIN_UNITS_PER_WORD
#define MIN_UNITS_PER_WORD UNITS_PER_WORD
#endif
@@ -96,18 +109,15 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
typedef float SFtype __attribute__ ((mode (SF)));
typedef _Complex float SCtype __attribute__ ((mode (SC)));
-#if LIBGCC2_DOUBLE_TYPE_SIZE == 64 || LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
-#define HAVE_DFMODE
+#if LIBGCC2_HAS_DF_MODE
typedef float DFtype __attribute__ ((mode (DF)));
typedef _Complex float DCtype __attribute__ ((mode (DC)));
#endif
-#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80
-#define HAVE_XFMODE
+#if LIBGCC2_HAS_XF_MODE
typedef float XFtype __attribute__ ((mode (XF)));
typedef _Complex float XCtype __attribute__ ((mode (XC)));
#endif
-#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128
-#define HAVE_TFMODE
+#if LIBGCC2_HAS_TF_MODE
typedef float TFtype __attribute__ ((mode (TF)));
typedef _Complex float TCtype __attribute__ ((mode (TC)));
#endif
@@ -329,7 +339,7 @@ extern SFtype __powisf2 (SFtype, Wtype);
extern SCtype __divsc3 (SFtype, SFtype, SFtype, SFtype);
extern SCtype __mulsc3 (SFtype, SFtype, SFtype, SFtype);
-#ifdef HAVE_DFMODE
+#if LIBGCC2_HAS_DF_MODE
extern DWtype __fixdfdi (DFtype);
extern DFtype __floatdidf (DWtype);
extern UWtype __fixunsdfSI (DFtype);
@@ -339,7 +349,7 @@ extern DCtype __divdc3 (DFtype, DFtype, DFtype, DFtype);
extern DCtype __muldc3 (DFtype, DFtype, DFtype, DFtype);
#endif
-#ifdef HAVE_XFMODE
+#if LIBGCC2_HAS_XF_MODE
extern DWtype __fixxfdi (XFtype);
extern DWtype __fixunsxfDI (XFtype);
extern XFtype __floatdixf (DWtype);
@@ -349,7 +359,7 @@ extern XCtype __divxc3 (XFtype, XFtype, XFtype, XFtype);
extern XCtype __mulxc3 (XFtype, XFtype, XFtype, XFtype);
#endif
-#ifdef HAVE_TFMODE
+#if LIBGCC2_HAS_TF_MODE
extern DWtype __fixunstfDI (TFtype);
extern DWtype __fixtfdi (TFtype);
extern TFtype __floatditf (DWtype);