From 271421e8aac865ae06806cd4f747d75edad1d6a7 Mon Sep 17 00:00:00 2001 From: geoffk Date: Mon, 11 Sep 2000 06:03:02 +0000 Subject: [PATCH] * config/rs6000/sysv4.h (MASK_LONG_DOUBLE_128): Define. (TARGET_LONG_DOUBLE_128): Define. (SUBTARGET_SWITCHES): Add -mlong-double-64 and -mlong-double-128. (LONG_DOUBLE_TYPE_SIZE): Redefine. (MAX_LONG_DOUBLE_TYPE_SIZE): Define. (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Define depending on definition of __LONG_DOUBLE_128__. (CPP_SYSV_SPEC): Define __LONG_DOUBLE_128__ if -mlong-double-128 passed. (CPP_LONGDOUBLE_DEFAULT_SPEC): Define. (CPP_SYSV_DEFAULT_SPEC): Define. (SUBTARGET_EXTRA_SPECS): Add cpp_longdouble_default. (INIT_TARGET_OPTABS): Define. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36311 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 14 ++++++++ gcc/config/rs6000/sysv4.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 26309fcd105..43f8040ab68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,19 @@ 2000-09-10 Geoff Keating + * config/rs6000/sysv4.h (MASK_LONG_DOUBLE_128): Define. + (TARGET_LONG_DOUBLE_128): Define. + (SUBTARGET_SWITCHES): Add -mlong-double-64 and -mlong-double-128. + (LONG_DOUBLE_TYPE_SIZE): Redefine. + (MAX_LONG_DOUBLE_TYPE_SIZE): Define. + (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Define depending on definition + of __LONG_DOUBLE_128__. + (CPP_SYSV_SPEC): Define __LONG_DOUBLE_128__ if -mlong-double-128 + passed. + (CPP_LONGDOUBLE_DEFAULT_SPEC): Define. + (CPP_SYSV_DEFAULT_SPEC): Define. + (SUBTARGET_EXTRA_SPECS): Add cpp_longdouble_default. + (INIT_TARGET_OPTABS): Define. + * config/rs6000/aix.h (RS6000_ITRUNC): Moved from rs6000.h. (RS6000_UITRUNC): Likewise. (INIT_TARGET_OPTABS): New macro. diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index a7590efa365..d8d963376a4 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -60,6 +60,7 @@ extern enum rs6000_sdata_type rs6000_sdata; #define MASK_LITTLE_ENDIAN 0x04000000 /* Target is little endian. */ #define MASK_REGNAMES 0x02000000 /* Use alternate register names. */ #define MASK_PROTOTYPE 0x01000000 /* Only prototyped fcns pass variable args. */ +#define MASK_LONG_DOUBLE_128 0x00800000 /* Use IEEE quad long double. */ #define TARGET_NO_BITFIELD_TYPE (target_flags & MASK_NO_BITFIELD_TYPE) #define TARGET_STRICT_ALIGN (target_flags & MASK_STRICT_ALIGN) @@ -68,6 +69,7 @@ extern enum rs6000_sdata_type rs6000_sdata; #define TARGET_LITTLE_ENDIAN (target_flags & MASK_LITTLE_ENDIAN) #define TARGET_REGNAMES (target_flags & MASK_REGNAMES) #define TARGET_PROTOTYPE (target_flags & MASK_PROTOTYPE) +#define TARGET_LONG_DOUBLE_128 (target_flags & MASK_LONG_DOUBLE_128) #define TARGET_TOC ((target_flags & MASK_64BIT) \ || ((target_flags & (MASK_RELOCATABLE \ | MASK_MINIMAL_TOC)) \ @@ -126,6 +128,10 @@ extern int g_switch_set; /* Whether -G xx was passed. */ N_("Produce big endian code.") }, \ { "big", -MASK_LITTLE_ENDIAN, \ N_("Produce big endian code.") }, \ + { "long-double-64", -MASK_LONG_DOUBLE_128, \ + N_("Use 64 bit long doubles") }, \ + { "long-double-128", MASK_LONG_DOUBLE_128, \ + N_("Use 128 bit long doubles") }, \ { "no-toc", 0, N_("no description yet") }, \ { "toc", MASK_MINIMAL_TOC, N_("no description yet") }, \ { "full-toc", MASK_MINIMAL_TOC, N_("no description yet") }, \ @@ -350,6 +356,22 @@ do { \ #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 +/* Define for support of TFmode long double and REAL_ARITHMETIC. + PowerPC SVR4 ABI says that long double is 4 words. */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) + +/* Constant which presents upper bound of the above value. */ +#define MAX_LONG_DOUBLE_TYPE_SIZE 128 + +/* Define this to set long double type size to use in libgcc2.c, which can + not depend on target_flags. */ +#ifdef __LONG_DOUBLE_128__ +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 +#else +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 +#endif + /* Make int foo : 8 not cause structures to be aligned to an int boundary. */ /* Override elfos.h definition. */ #undef PCC_BITFIELD_TYPE_MATTERS @@ -1164,6 +1186,8 @@ do { \ "%{mrelocatable*: -D_RELOCATABLE} \ %{fpic: -D__PIC__=1 -D__pic__=1} \ %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} \ +%{mlong-double-128: -D__LONG_DOUBLE_128__=1} \ +%{!mlong-double-64: %(cpp_longdouble_default)} \ %{mcall-sysv: -D_CALL_SYSV} \ %{mcall-aix: -D_CALL_AIX} %{mcall-aixdesc: -D_CALL_AIX -D_CALL_AIXDESC} \ %{!mcall-sysv: %{!mcall-aix: %{!mcall-aixdesc: %(cpp_sysv_default) }}} \ @@ -1181,6 +1205,9 @@ do { \ /* Whether floating point is disabled by default. */ #define CPP_FLOAT_DEFAULT_SPEC "" +/* Whether 'long double' is 128 bits by default. */ +#define CPP_LONGDOUBLE_DEFAULT_SPEC "" + #define CPP_SYSV_DEFAULT_SPEC "-D_CALL_SYSV" #define CPP_ENDIAN_BIG_SPEC "-D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine(bigendian)" @@ -1494,6 +1521,7 @@ do { \ { "cpp_endian_little", CPP_ENDIAN_LITTLE_SPEC }, \ { "cpp_endian_solaris", CPP_ENDIAN_SOLARIS_SPEC }, \ { "cpp_float_default", CPP_FLOAT_DEFAULT_SPEC }, \ + { "cpp_longdouble_default", CPP_LONGDOUBLE_DEFAULT_SPEC }, \ { "cpp_os_ads", CPP_OS_ADS_SPEC }, \ { "cpp_os_yellowknife", CPP_OS_YELLOWKNIFE_SPEC }, \ { "cpp_os_mvme", CPP_OS_MVME_SPEC }, \ @@ -1521,3 +1549,60 @@ do { \ /* Function name to call to do profiling. */ #define RS6000_MCOUNT "_mcount" + +/* Define library calls for quad FP operations. These are all part of the + PowerPC 32bit ABI. */ +#define ADDTF3_LIBCALL "_q_add" +#define DIVTF3_LIBCALL "_q_div" +#define EXTENDDFTF2_LIBCALL "_q_dtoq" +#define EQTF2_LIBCALL "_q_feq" +#define GETF2_LIBCALL "_q_fge" +#define GTTF2_LIBCALL "_q_fgt" +#define LETF2_LIBCALL "_q_fle" +#define LTTF2_LIBCALL "_q_flt" +#define NETF2_LIBCALL "_q_fne" +#define FLOATSITF2_LIBCALL "_q_itoq" +#define MULTF3_LIBCALL "_q_mul" +#define NEGTF2_LIBCALL "_q_neg" +#define TRUNCTFDF2_LIBCALL "_q_qtod" +#define FIX_TRUNCTFSI2_LIBCALL "_q_qtoi" +#define TRUNCTFSF2_LIBCALL "_q_qtos" +#define FIXUNS_TRUNCTFSI2_LIBCALL "_q_qtou" +#define SQRTTF_LIBCALL "_q_sqrt" +#define EXTENDSFTF2_LIBCALL "_q_stoq" +#define SUBTF3_LIBCALL "_q_sub" +#define FLOATUNSSITF2_LIBCALL "_q_utoq" + +#define INIT_TARGET_OPTABS \ + do { \ + if (TARGET_HARD_FLOAT) \ + { \ + add_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (ADDTF3_LIBCALL); \ + sub_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (SUBTF3_LIBCALL); \ + neg_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (NEGTF2_LIBCALL); \ + smul_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (MULTF3_LIBCALL); \ + flodiv_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (DIVTF3_LIBCALL); \ + eqtf2_libfunc = init_one_libfunc (EQTF2_LIBCALL); \ + netf2_libfunc = init_one_libfunc (NETF2_LIBCALL); \ + gttf2_libfunc = init_one_libfunc (GTTF2_LIBCALL); \ + getf2_libfunc = init_one_libfunc (GETF2_LIBCALL); \ + lttf2_libfunc = init_one_libfunc (LTTF2_LIBCALL); \ + letf2_libfunc = init_one_libfunc (LETF2_LIBCALL); \ + trunctfsf2_libfunc = init_one_libfunc (TRUNCTFSF2_LIBCALL); \ + trunctfdf2_libfunc = init_one_libfunc (TRUNCTFDF2_LIBCALL); \ + extendsftf2_libfunc = init_one_libfunc (EXTENDSFTF2_LIBCALL); \ + extenddftf2_libfunc = init_one_libfunc (EXTENDDFTF2_LIBCALL); \ + floatsitf_libfunc = init_one_libfunc (FLOATSITF2_LIBCALL); \ + fixtfsi_libfunc = init_one_libfunc (FIX_TRUNCTFSI2_LIBCALL); \ + fixunstfsi_libfunc \ + = init_one_libfunc (FIXUNS_TRUNCTFSI2_LIBCALL); \ + if (TARGET_PPC_GPOPT || TARGET_POWER2) \ + sqrt_optab->handlers[(int) TFmode].libfunc \ + = init_one_libfunc (SQRTTF_LIBCALL); \ + } \ + } while (0) -- 2.11.0