aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-11-12 13:15:23 -0800
committerRichard Henderson <rth@gcc.gnu.org>2004-11-12 13:15:23 -0800
commitcc69336f16a0c9c099d3c155c0e382e667d30938 (patch)
treeb18a2a83f99c041666c86ac78b258c2697ec1a13 /gcc
parent690e11b8f57616d1a3d176d869412d8183d65fe9 (diff)
downloadgcc-cc69336f16a0c9c099d3c155c0e382e667d30938.zip
gcc-cc69336f16a0c9c099d3c155c0e382e667d30938.tar.gz
gcc-cc69336f16a0c9c099d3c155c0e382e667d30938.tar.bz2
re PR target/17778 (regression in evaluating long double hexadecimal constants)
PR 17778 * config/i386/i386.h (TARGET_96_ROUND_53_LONG_DOUBLE): New. * config/i386/freebsd.h (SUBTARGET_OVERRIDE_OPTIONS): Remove. (TARGET_96_ROUND_53_LONG_DOUBLE): New. * config/i386/i386-modes.def (XF): Use it. From-SVN: r90543
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/freebsd.h9
-rw-r--r--gcc/config/i386/i386-modes.def2
-rw-r--r--gcc/config/i386/i386.h4
4 files changed, 16 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2b33987..747d9b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2004-11-12 Richard Henderson <rth@redhat.com>
+
+ PR 17778
+ * config/i386/i386.h (TARGET_96_ROUND_53_LONG_DOUBLE): New.
+ * config/i386/freebsd.h (SUBTARGET_OVERRIDE_OPTIONS): Remove.
+ (TARGET_96_ROUND_53_LONG_DOUBLE): New.
+ * config/i386/i386-modes.def (XF): Use it.
+
2004-11-11 Geoffrey Keating <geoffk@apple.com>
* Makefile.in (macro_list): Use move-if-change to avoid spurious
diff --git a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h
index 0437400..08984a3 100644
--- a/gcc/config/i386/freebsd.h
+++ b/gcc/config/i386/freebsd.h
@@ -138,10 +138,5 @@ Boston, MA 02111-1307, USA. */
/* FreeBSD sets the rounding precision of the FPU to 53 bits. Let the
compiler get the contents of <float.h> and std::numeric_limits correct. */
-#define SUBTARGET_OVERRIDE_OPTIONS \
- do { \
- if (!TARGET_64BIT) { \
- REAL_MODE_FORMAT (XFmode) \
- = &ieee_extended_intel_96_round_53_format; \
- } \
- } while (0)
+#undef TARGET_96_ROUND_53_LONG_DOUBLE
+#define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT)
diff --git a/gcc/config/i386/i386-modes.def b/gcc/config/i386/i386-modes.def
index 091c226..ea35a2a 100644
--- a/gcc/config/i386/i386-modes.def
+++ b/gcc/config/i386/i386-modes.def
@@ -29,6 +29,8 @@ FLOAT_MODE (TF, 16, ieee_quad_format);
In LP64 mode, XFmode has size and alignment 16. */
ADJUST_FLOAT_FORMAT (XF, (TARGET_128BIT_LONG_DOUBLE
? &ieee_extended_intel_128_format
+ : TARGET_96_ROUND_53_LONG_DOUBLE
+ ? &ieee_extended_intel_96_round_53_format
: &ieee_extended_intel_96_format));
ADJUST_BYTESIZE (XF, TARGET_128BIT_LONG_DOUBLE ? 16 : 12);
ADJUST_ALIGNMENT (XF, TARGET_128BIT_LONG_DOUBLE ? 16 : 4);
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index e3c6d1b..7da8f51 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -451,6 +451,10 @@ extern int x86_prefetch_sse;
redefines this to 1. */
#define TARGET_MACHO 0
+/* Subtargets may reset this to 1 in order to enable 96-bit long double
+ with the rounding mode forced to 53 bits. */
+#define TARGET_96_ROUND_53_LONG_DOUBLE 0
+
/* This macro is similar to `TARGET_SWITCHES' but defines names of
command options that have values. Its definition is an
initializer with a subgrouping for each command option.