From patchwork Mon Sep 22 23:12:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 392176 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4E31814009C for ; Tue, 23 Sep 2014 09:12:29 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=mtQaTOz5BrfhAY+gM0/CiLau/Asa5OPaagknbVmqkRgQZaeKd9p0u NImXYEZZ7XphfqvP+fwDxgmZLUlZYPnd8ssvi3qytx2dm6GzOtO+CIaNqYiCGbIc ftVIJnnAcHz/o8r/8nOednyf+pi4yFiyr4X3oVJPxESUdL+WAD3SIQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=ClAuV7aQjDRb+yRc/3XbqDJEVy4=; b=aElfaZCdukSyGutAsjzj 3ZtzGII4rUrbd/NO/V40en70NBFeBDczweI7UO6oX5f07hxc18UKNaUgu8J+cg+u x4rjInYM+8mziuxyXA8PuNXP1zoeE+QYYkfbV+NE1FQhd74pENvWl6dq5w2zuW86 EiffuZhzhJzeUuO+sRUJylI= Received: (qmail 32227 invoked by alias); 22 Sep 2014 23:12:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 32216 invoked by uid 89); 22 Sep 2014 23:12:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_00, SUBJ_OBFU_PUNCT_MANY autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 22 Sep 2014 23:12:11 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-FEM-01.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1XWCm7-0005gd-39 from joseph_myers@mentor.com for gcc-patches@gcc.gnu.org; Mon, 22 Sep 2014 16:12:07 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.3.181.6; Tue, 23 Sep 2014 00:12:05 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.82) (envelope-from ) id 1XWCm3-0008Lz-Tr for gcc-patches@gcc.gnu.org; Mon, 22 Sep 2014 23:12:03 +0000 Date: Mon, 22 Sep 2014 23:12:03 +0000 From: "Joseph S. Myers" To: Subject: Remove LIBGCC2_LONG_DOUBLE_TYPE_SIZE target macro Message-ID: MIME-Version: 1.0 This patch removes the target macro LIBGCC2_LONG_DOUBLE_TYPE_SIZE. After recent changes, this macro was used in two ways in libgcc: to determine the mode of long double in dfp-bit.h, and to determine whether a particular mode has excess precision for use in complex multiplication. The former is concerned specifically with long double: it relates to use of strtold for converting between decimal and binary floating point. This is replaced by comparing __LDBL_MANT_DIG__ with the appropriate __LIBGCC_*_MANT_DIG__ macro. The latter is replaced __LIBGCC_*_EXCESS_PRECISION__ predefined macros. Remarks: * Comparing (__LDBL_MANT_DIG__ == __LIBGCC_XF_MANT_DIG__) is more fragile than it looks; it's possible for XFmode to have 53-bit mantissa (TARGET_96_ROUND_53_LONG_DOUBLE, on FreeBSD and DragonFlyBSD 32-bit), in which case such a comparison would not distinguish XFmode and DFmode as possible modes for long double. Fortunately, no target supporting that form of XFmode also supports long double = double (but if some target did, we'd need e.g. an additional macro giving the exponent range of each mode). Furthermore, this code doesn't actually get used for x86 (or any other target with XFmode support), because x86 uses BID not DPD and BID has its own conversion code (which handles conversions for both XFmode and TFmode without needing to go via strtold). And FreeBSD and DragonFlyBSD aren't among the targets with DFP support. So while in principle this code is fragile and it's a deficiency that it can't support both XFmode and TFmode at once (something that can't be solved with the string conversion approach without libc having TS 18661 functions such as strtof128), all these issues should not be a problem in practice. * If other cases of excess precision are supported in future, the code for defining __LIBGCC_*_EXCESS_PRECISION__ may need updating. Although the most likely such cases might not actually involve excess precision for any mode used in libgcc - FLT_EVAL_METHOD being 32 to do _Float16 arithmetic on _Float32 should have the effect of _Complex _Float16 arithmetic using __mulsc3 and __divsc3, rather than currently nonexistent __mulhc3 and __divhc3 as in bug 63250 for ARM. * As has been noted in the context of simultaneous support for __float128 and __ibm128 on Power, the semantics of macros such as LONG_DOUBLE_TYPE_SIZE are problematic because they rely on a poorly-defined precision value for floating-point modes (which seems to be intended as the number of significant bits in the representation, e.g. 80 for XFmode which may be either 12 or 16 bytes) uniquely identifying a mode (although defining an arbitrarily different value for one of the modes you wish to distinguish may work as a hack). It would be cleaner to have a target hook that gives a machine mode directly for float, double and long double, rather than going via these precision values. By eliminating all use of these macros (FLOAT_TYPE_SIZE, DOUBLE_TYPE_SIZE, LONG_DOUBLE_TYPE_SIZE) from code built for the target, this patch facilitates such a conversion to a hook (which I suppose would take some suitable enum as an argument to identify which of the three types to return a mode for). (The issue of multiple type support for DFP conversions would apply in that Power case. doesn't seem to touch on it, but it would seem reasonable to punt on it initially as hard to fix. There would also be the issue of getting functions such as __powikf2, __mulkc3, __divkc3 defined, but that's rather easier to address.) Bootstrapped with no regressions on x86_64-unknown-linux-gnu. OK to commit? gcc: 2014-09-22 Joseph Myers * doc/tm.texi.in (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * doc/tm.texi: Regenerate. * system.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Poison. * config/alpha/alpha.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/i386/i386-interix.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/i386/i386.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/i386/rtemself.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/ia64/ia64.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/m68k/m68k.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/m68k/netbsd-elf.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/mips/mips.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/mips/n32-elf.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/msp430/msp430.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/rl78/rl78.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/rs6000/rs6000.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/rx/rx.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/s390/s390.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/sparc/freebsd.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/sparc/linux.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/sparc/linux64.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. * config/sparc/netbsd-elf.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. gcc/c-family: 2014-09-22 Joseph Myers * c-cppbuiltin.c (c_cpp_builtins): Define __LIBGCC_*_EXCESS_PRECISION__ macros for supported floating-point modes. libgcc: 2014-09-22 Joseph Myers * dfp-bit.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. (__LIBGCC_XF_MANT_DIG__): Define if not already defined. (LONG_DOUBLE_HAS_XF_MODE): Define in terms of __LIBGCC_XF_MANT_DIG__. (__LIBGCC_TF_MANT_DIG__): Define if not already defined. (LONG_DOUBLE_HAS_TF_MODE): Define in terms of __LIBGCC_TF_MANT_DIG__. * libgcc2.c (NOTRUNC): Define in terms of __LIBGCC_*_EXCESS_PRECISION__, not LIBGCC2_LONG_DOUBLE_TYPE_SIZE. * libgcc2.h (LIBGCC2_LONG_DOUBLE_TYPE_SIZE): Remove. Index: gcc/c-family/c-cppbuiltin.c =================================================================== --- gcc/c-family/c-cppbuiltin.c (revision 215458) +++ gcc/c-family/c-cppbuiltin.c (working copy) @@ -978,6 +978,30 @@ c_cpp_builtins (cpp_reader *pfile) else gcc_unreachable (); builtin_define_with_value (macro_name, suffix, 0); + bool excess_precision = false; + if (TARGET_FLT_EVAL_METHOD != 0 + && mode != TYPE_MODE (long_double_type_node) + && (mode == TYPE_MODE (float_type_node) + || mode == TYPE_MODE (double_type_node))) + switch (TARGET_FLT_EVAL_METHOD) + { + case -1: + case 2: + excess_precision = true; + break; + + case 1: + excess_precision = mode == TYPE_MODE (float_type_node); + break; + + default: + gcc_unreachable (); + } + macro_name = (char *) alloca (strlen (name) + + sizeof ("__LIBGCC__EXCESS_" + "PRECISION__")); + sprintf (macro_name, "__LIBGCC_%s_EXCESS_PRECISION__", name); + builtin_define_with_int_value (macro_name, excess_precision); } /* For libgcc crtstuff.c and libgcc2.c. */ Index: gcc/config/alpha/alpha.h =================================================================== --- gcc/config/alpha/alpha.h (revision 215458) +++ gcc/config/alpha/alpha.h (working copy) @@ -203,14 +203,6 @@ extern enum alpha_fp_trap_mode alpha_fptm; #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -/* 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 - /* Work around target_flags dependency in ada/targtyps.c. */ #define WIDEST_HARDWARE_FP_SIZE 64 Index: gcc/config/i386/i386-interix.h =================================================================== --- gcc/config/i386/i386-interix.h (revision 215458) +++ gcc/config/i386/i386-interix.h (working copy) @@ -140,8 +140,6 @@ do { \ /* Turn off long double being 96 bits. */ #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE 64 -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 #define IX86_NO_LIBGCC_TFMODE Index: gcc/config/i386/i386.h =================================================================== --- gcc/config/i386/i386.h (revision 215458) +++ gcc/config/i386/i386.h (working copy) @@ -694,16 +694,6 @@ extern const char *host_detect_local_cpu (int argc #define LONG_DOUBLE_TYPE_SIZE \ (TARGET_LONG_DOUBLE_64 ? 64 : (TARGET_LONG_DOUBLE_128 ? 128 : 80)) -/* Define this to set long double type size to use in libgcc2.c, which can - not depend on target_flags. */ -#ifdef __LONG_DOUBLE_64__ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#elif defined (__LONG_DOUBLE_128__) -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 -#endif - #define WIDEST_HARDWARE_FP_SIZE 80 #if defined (TARGET_BI_ARCH) || TARGET_64BIT_DEFAULT Index: gcc/config/i386/rtemself.h =================================================================== --- gcc/config/i386/rtemself.h (revision 215458) +++ gcc/config/i386/rtemself.h (working copy) @@ -32,11 +32,4 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE (TARGET_80387 ? 80 : 64) -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#ifdef _SOFT_FLOAT -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 -#endif - #define IX86_NO_LIBGCC_TFMODE Index: gcc/config/ia64/ia64.h =================================================================== --- gcc/config/ia64/ia64.h (revision 215458) +++ gcc/config/ia64/ia64.h (working copy) @@ -253,11 +253,7 @@ while (0) : TARGET_ABI_OPEN_VMS ? 64 \ : 80) -/* We always want the XFmode operations from libgcc2.c, except on VMS - where this yields references to unimplemented "insns". */ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE (TARGET_ABI_OPEN_VMS ? 64 : 80) - #define DEFAULT_SIGNED_CHAR 1 /* A C expression for a string describing the name of the data type to use for Index: gcc/config/m68k/m68k.h =================================================================== --- gcc/config/m68k/m68k.h (revision 215458) +++ gcc/config/m68k/m68k.h (working copy) @@ -280,14 +280,6 @@ along with GCC; see the file COPYING3. If not see #define LONG_DOUBLE_TYPE_SIZE \ ((TARGET_COLDFIRE || TARGET_FIDOA) ? 64 : 80) -/* We need to know the size of long double at compile-time in libgcc2. */ - -#if defined(__mcoldfire__) || defined(__mfido__) -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 -#endif - /* Set the value of FLT_EVAL_METHOD in float.h. When using 68040 fp instructions, we get proper intermediate rounding, otherwise we get extended precision results. */ Index: gcc/config/m68k/netbsd-elf.h =================================================================== --- gcc/config/m68k/netbsd-elf.h (revision 215458) +++ gcc/config/m68k/netbsd-elf.h (working copy) @@ -39,13 +39,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE (TARGET_68020 ? 80 : 64) -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#ifdef __mc68010__ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 -#endif - #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ { "netbsd_entry_point", NETBSD_ENTRY_POINT }, Index: gcc/config/mips/mips.h =================================================================== --- gcc/config/mips/mips.h (revision 215458) +++ gcc/config/mips/mips.h (working copy) @@ -1399,15 +1399,6 @@ struct mips_cpu_info { support long double, we also want a 128-bit integer type. */ #define MAX_FIXED_MODE_SIZE LONG_DOUBLE_TYPE_SIZE -#ifdef IN_LIBGCC2 -#if ((defined _ABIN32 && _MIPS_SIM == _ABIN32) \ - || (defined _ABI64 && _MIPS_SIM == _ABI64)) -# define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 -# else -# define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -# endif -#endif - /* Width in bits of a pointer. */ #ifndef POINTER_SIZE #define POINTER_SIZE ((TARGET_LONG64 && TARGET_64BIT) ? 64 : 32) Index: gcc/config/mips/n32-elf.h =================================================================== --- gcc/config/mips/n32-elf.h (revision 215458) +++ gcc/config/mips/n32-elf.h (working copy) @@ -28,8 +28,3 @@ along with GCC; see the file COPYING3. If not see /* Force n32 to use 64-bit long doubles. */ #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE 64 - -#ifdef IN_LIBGCC2 -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif Index: gcc/config/msp430/msp430.h =================================================================== --- gcc/config/msp430/msp430.h (revision 215458) +++ gcc/config/msp430/msp430.h (working copy) @@ -112,8 +112,6 @@ extern bool msp430x; #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE 64 /*DOUBLE_TYPE_SIZE*/ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 - #define DEFAULT_SIGNED_CHAR 0 #define STRICT_ALIGNMENT 1 Index: gcc/config/rl78/rl78.h =================================================================== --- gcc/config/rl78/rl78.h (revision 215458) +++ gcc/config/rl78/rl78.h (working copy) @@ -98,8 +98,6 @@ #define DOUBLE_TYPE_SIZE 32 /*64*/ #define LONG_DOUBLE_TYPE_SIZE 64 /*DOUBLE_TYPE_SIZE*/ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 - #define DEFAULT_SIGNED_CHAR 0 #define STRICT_ALIGNMENT 1 Index: gcc/config/rs6000/rs6000.h =================================================================== --- gcc/config/rs6000/rs6000.h (revision 215458) +++ gcc/config/rs6000/rs6000.h (working copy) @@ -820,14 +820,6 @@ extern unsigned char rs6000_recip_bits[]; words. */ #define LONG_DOUBLE_TYPE_SIZE rs6000_long_double_type_size -/* 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 - /* Work around rs6000_long_double_type_size dependency in ada/targtyps.c. */ #define WIDEST_HARDWARE_FP_SIZE 64 Index: gcc/config/rx/rx.h =================================================================== --- gcc/config/rx/rx.h (revision 215458) +++ gcc/config/rx/rx.h (working copy) @@ -130,12 +130,6 @@ #define DOUBLE_TYPE_SIZE (TARGET_64BIT_DOUBLES ? 64 : 32) #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE -#ifdef __RX_32BIT_DOUBLES__ -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 32 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif - #define DEFAULT_SIGNED_CHAR 0 /* RX load/store instructions can handle unaligned addresses. */ Index: gcc/config/s390/s390.h =================================================================== --- gcc/config/s390/s390.h (revision 215458) +++ gcc/config/s390/s390.h (working copy) @@ -252,14 +252,6 @@ enum processor_flags #define DOUBLE_TYPE_SIZE 64 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -/* 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 - /* Work around target_flags dependency in ada/targtyps.c. */ #define WIDEST_HARDWARE_FP_SIZE 64 Index: gcc/config/sparc/freebsd.h =================================================================== --- gcc/config/sparc/freebsd.h (revision 215458) +++ gcc/config/sparc/freebsd.h (working copy) @@ -71,14 +71,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -/* Define this to set long double type size to use in libgcc2.c, which can - not depend on target_flags. */ -#if defined(__arch64__) || defined(__LONG_DOUBLE_128__) -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif - /* Definitions for 64-bit SPARC running systems with ELF. */ #define TARGET_ELF 1 Index: gcc/config/sparc/linux.h =================================================================== --- gcc/config/sparc/linux.h (revision 215458) +++ gcc/config/sparc/linux.h (working copy) @@ -122,14 +122,6 @@ do { \ SPARC ABI says that long double is 4 words. */ #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -/* 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 - #undef DITF_CONVERSION_LIBFUNCS #define DITF_CONVERSION_LIBFUNCS 1 Index: gcc/config/sparc/linux64.h =================================================================== --- gcc/config/sparc/linux64.h (revision 215458) +++ gcc/config/sparc/linux64.h (working copy) @@ -70,14 +70,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -/* Define this to set long double type size to use in libgcc2.c, which can - not depend on target_flags. */ -#if defined(__arch64__) || defined(__LONG_DOUBLE_128__) -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif - #undef CPP_SUBTARGET_SPEC #define CPP_SUBTARGET_SPEC "\ %{posix:-D_POSIX_SOURCE} \ Index: gcc/config/sparc/netbsd-elf.h =================================================================== --- gcc/config/sparc/netbsd-elf.h (revision 215458) +++ gcc/config/sparc/netbsd-elf.h (working copy) @@ -168,12 +168,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) -#if defined(__arch64__) || defined(__LONG_DOUBLE_128__) -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 -#else -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 -#endif - #undef CC1_SPEC #if DEFAULT_ARCH32_P #define CC1_SPEC CC1_SPEC32 @@ -195,9 +189,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE 128 -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 - #undef CC1_SPEC #define CC1_SPEC CC1_SPEC64 @@ -210,9 +201,6 @@ along with GCC; see the file COPYING3. If not see #undef LONG_DOUBLE_TYPE_SIZE #define LONG_DOUBLE_TYPE_SIZE 64 -#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 - #undef CC1_SPEC #define CC1_SPEC CC1_SPEC32 Index: gcc/doc/tm.texi =================================================================== --- gcc/doc/tm.texi (revision 215458) +++ gcc/doc/tm.texi (working copy) @@ -1542,13 +1542,6 @@ the target machine. If you don't define this, the @code{BITS_PER_UNIT * 16}. @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_GNU_PREFIX This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target hook and should be defined if that hook is overriden to be true. It Index: gcc/doc/tm.texi.in =================================================================== --- gcc/doc/tm.texi.in (revision 215458) +++ gcc/doc/tm.texi.in (working copy) @@ -1384,13 +1384,6 @@ the target machine. If you don't define this, the @code{BITS_PER_UNIT * 16}. @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_GNU_PREFIX This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target hook and should be defined if that hook is overriden to be true. It Index: gcc/system.h =================================================================== --- gcc/system.h (revision 215458) +++ gcc/system.h (working copy) @@ -936,7 +936,8 @@ extern void fancy_abort (const char *, int, const EXTRA_CONSTRAINT_STR EXTRA_MEMORY_CONSTRAINT \ EXTRA_ADDRESS_CONSTRAINT CONST_DOUBLE_OK_FOR_CONSTRAINT_P \ CALLER_SAVE_PROFITABLE LARGEST_EXPONENT_IS_NORMAL \ - ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT + ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT \ + LIBGCC2_LONG_DOUBLE_TYPE_SIZE /* Hooks that are no longer used. */ #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ Index: libgcc/dfp-bit.h =================================================================== --- libgcc/dfp-bit.h (revision 215458) +++ libgcc/dfp-bit.h (working copy) @@ -34,19 +34,21 @@ see the files COPYING3 and COPYING.RUNTIME respect #include "tm.h" #include "libgcc_tm.h" -#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE -#endif - /* We need to know the size of long double that the C library supports. Don't use LIBGCC2_HAS_XF_MODE or LIBGCC2_HAS_TF_MODE here because some targets set both of those. */ +#ifndef __LIBGCC_XF_MANT_DIG__ +#define __LIBGCC_XF_MANT_DIG__ 0 +#endif #define LONG_DOUBLE_HAS_XF_MODE \ - (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 80) + (__LDBL_MANT_DIG__ == __LIBGCC_XF_MANT_DIG__) +#ifndef __LIBGCC_TF_MANT_DIG__ +#define __LIBGCC_TF_MANT_DIG__ 0 +#endif #define LONG_DOUBLE_HAS_TF_MODE \ - (BITS_PER_UNIT == 8 && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128) + (__LDBL_MANT_DIG__ == __LIBGCC_TF_MANT_DIG__) /* Depending on WIDTH, define a number of macros: Index: libgcc/libgcc2.c =================================================================== --- libgcc/libgcc2.c (revision 215458) +++ libgcc/libgcc2.c (working copy) @@ -1866,29 +1866,25 @@ NAME (TYPE x, int m) # define CTYPE SCtype # define MODE sc # define CEXT __LIBGCC_SF_FUNC_EXT__ -# define NOTRUNC __FLT_EVAL_METHOD__ == 0 +# define NOTRUNC __LIBGCC_SF_EXCESS_PRECISION__ #elif defined(L_muldc3) || defined(L_divdc3) # define MTYPE DFtype # define CTYPE DCtype # define MODE dc # define CEXT __LIBGCC_DF_FUNC_EXT__ -# if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64 -# define NOTRUNC 1 -# else -# define NOTRUNC __FLT_EVAL_METHOD__ == 0 || __FLT_EVAL_METHOD__ == 1 -# endif +# define NOTRUNC __LIBGCC_DF_EXCESS_PRECISION__ #elif defined(L_mulxc3) || defined(L_divxc3) # define MTYPE XFtype # define CTYPE XCtype # define MODE xc # define CEXT __LIBGCC_XF_FUNC_EXT__ -# define NOTRUNC 1 +# define NOTRUNC __LIBGCC_XF_EXCESS_PRECISION__ #elif defined(L_multc3) || defined(L_divtc3) # define MTYPE TFtype # define CTYPE TCtype # define MODE tc # define CEXT __LIBGCC_TF_FUNC_EXT__ -# define NOTRUNC 1 +# define NOTRUNC __LIBGCC_TF_EXCESS_PRECISION__ #else # error #endif Index: libgcc/libgcc2.h =================================================================== --- libgcc/libgcc2.h (revision 215458) +++ libgcc/libgcc2.h (working copy) @@ -34,10 +34,6 @@ extern void __clear_cache (char *, char *); extern void __eprintf (const char *, const char *, unsigned int, const char *) __attribute__ ((__noreturn__)); -#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE -#endif - #ifdef __LIBGCC_HAS_SF_MODE__ #define LIBGCC2_HAS_SF_MODE 1 #else