* real.h (real_format): Add a canonical_nan_lsbs_set field.
(coldfire_single_format): Declare.
(coldfire_double_format): Likewise.
* real.c (encode_ieee_single): Use canonical_nan_lsbs_set instead
of qnan_msb_set to determine the lower bits of a canonical
NaN significand.
(encode_ieee_double): Likewise.
(encode_ieee_quad): Likewise.
(ieee_single_format): Initialize canonical_nan_lsbs_set.
(mips_single_format): Likewise.
(ieee_double_format): Likewise.
(mips_double_format): Likewise.
(ieee_extended_motorola_format): Likewise.
(ieee_extended_intel_96_format): Likewise.
(ieee_extended_intel_128_format): Likewise.
(ieee_extended_intel_96_round_53_format): Likewise.
(ibm_extended_format): Likewise.
(mips_extended_format): Likewise.
(ieee_quad_format): Likewise.
(mips_quad_format): Likewise.
(vax_f_format): Likewise.
(vax_d_format): Likewise.
(vax_g_format): Likewise.
(i370_single_format): Likewise.
(i370_double_format): Likewise.
(decimal_single_format): Likewise.
(decimal_double_format): Likewise.
(decimal_quad_format): Likewise.
(c4x_single_format): Likewise.
(c4x_extended_format): Likewise.
(real_internal_format): Likewise.
(coldfire_single_format): New real_format.
(coldfire_double_format): Likewise.
* config/pdp11/pdp11.c (pdp11_f_format): Initialize
canonical_nan_lsbs_set.
(pdp11_d_format): Likewise.
* config/m68k/m68k.c (override_options): Override REAL_FORMAT_MODE
if TARGET_COLDFIRE_CPU.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120922
138bc75d-0d04-0410-961f-
82ee72b054a4
2007-01-18 Richard Sandiford <richard@codesourcery.com>
+ * real.h (real_format): Add a canonical_nan_lsbs_set field.
+ (coldfire_single_format): Declare.
+ (coldfire_double_format): Likewise.
+ * real.c (encode_ieee_single): Use canonical_nan_lsbs_set instead
+ of qnan_msb_set to determine the lower bits of a canonical
+ NaN significand.
+ (encode_ieee_double): Likewise.
+ (encode_ieee_quad): Likewise.
+ (ieee_single_format): Initialize canonical_nan_lsbs_set.
+ (mips_single_format): Likewise.
+ (ieee_double_format): Likewise.
+ (mips_double_format): Likewise.
+ (ieee_extended_motorola_format): Likewise.
+ (ieee_extended_intel_96_format): Likewise.
+ (ieee_extended_intel_128_format): Likewise.
+ (ieee_extended_intel_96_round_53_format): Likewise.
+ (ibm_extended_format): Likewise.
+ (mips_extended_format): Likewise.
+ (ieee_quad_format): Likewise.
+ (mips_quad_format): Likewise.
+ (vax_f_format): Likewise.
+ (vax_d_format): Likewise.
+ (vax_g_format): Likewise.
+ (i370_single_format): Likewise.
+ (i370_double_format): Likewise.
+ (decimal_single_format): Likewise.
+ (decimal_double_format): Likewise.
+ (decimal_quad_format): Likewise.
+ (c4x_single_format): Likewise.
+ (c4x_extended_format): Likewise.
+ (real_internal_format): Likewise.
+ (coldfire_single_format): New real_format.
+ (coldfire_double_format): Likewise.
+ * config/pdp11/pdp11.c (pdp11_f_format): Initialize
+ canonical_nan_lsbs_set.
+ (pdp11_d_format): Likewise.
+ * config/m68k/m68k.c (override_options): Override REAL_FORMAT_MODE
+ if TARGET_COLDFIRE_CPU.
+
+2007-01-18 Richard Sandiford <richard@codesourcery.com>
+
* config/m68k/m68k-protos.h (m68k_output_pic_call): Delete.
(output_call, m68k_legitimize_call_address): Declare.
* config/m68k/m68k.h (EXTRA_CONSTRAINT): Remove unnecessary
: (m68k_cpu_flags & FL_COLDFIRE) != 0 ? FPUTYPE_COLDFIRE
: FPUTYPE_68881);
+ if (TARGET_COLDFIRE_FPU)
+ {
+ REAL_MODE_FORMAT (SFmode) = &coldfire_single_format;
+ REAL_MODE_FORMAT (DFmode) = &coldfire_double_format;
+ }
+
/* Sanity check to ensure that msep-data and mid-sahred-library are not
* both specified together. Doing so simply doesn't make sense.
*/
false,
false,
false,
+ false,
false
};
false,
false,
false,
+ false,
false
};
if (fmt->has_nans)
{
if (r->canonical)
- sig = 0;
+ sig = (fmt->canonical_nan_lsbs_set ? (1 << 22) - 1 : 0);
if (r->signalling == fmt->qnan_msb_set)
sig &= ~(1 << 22);
else
sig |= 1 << 22;
- /* We overload qnan_msb_set here: it's only clear for
- mips_ieee_single, which wants all mantissa bits but the
- quiet/signalling one set in canonical NaNs (at least
- Quiet ones). */
- if (r->canonical && !fmt->qnan_msb_set)
- sig |= (1 << 22) - 1;
- else if (sig == 0)
+ if (sig == 0)
sig = 1 << 21;
image |= 255 << 23;
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format mips_single_format =
true,
true,
true,
- false
+ false,
+ true
};
+const struct real_format coldfire_single_format =
+ {
+ encode_ieee_single,
+ decode_ieee_single,
+ 2,
+ 1,
+ 24,
+ 24,
+ -125,
+ 128,
+ 31,
+ 31,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
\f
/* IEEE double-precision format. */
if (fmt->has_nans)
{
if (r->canonical)
- sig_hi = sig_lo = 0;
+ {
+ if (fmt->canonical_nan_lsbs_set)
+ {
+ sig_hi = (1 << 19) - 1;
+ sig_lo = 0xffffffff;
+ }
+ else
+ {
+ sig_hi = 0;
+ sig_lo = 0;
+ }
+ }
if (r->signalling == fmt->qnan_msb_set)
sig_hi &= ~(1 << 19);
else
sig_hi |= 1 << 19;
- /* We overload qnan_msb_set here: it's only clear for
- mips_ieee_single, which wants all mantissa bits but the
- quiet/signalling one set in canonical NaNs (at least
- Quiet ones). */
- if (r->canonical && !fmt->qnan_msb_set)
- {
- sig_hi |= (1 << 19) - 1;
- sig_lo = 0xffffffff;
- }
- else if (sig_hi == 0 && sig_lo == 0)
+ if (sig_hi == 0 && sig_lo == 0)
sig_hi = 1 << 18;
image_hi |= 2047 << 20;
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format mips_double_format =
true,
true,
true,
- false
+ false,
+ true
};
+const struct real_format coldfire_double_format =
+ {
+ encode_ieee_double,
+ decode_ieee_double,
+ 2,
+ 1,
+ 53,
+ 53,
+ -1021,
+ 1024,
+ 63,
+ 63,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
\f
/* IEEE extended real format. This comes in three flavors: Intel's as
a 12 byte image, Intel's as a 16 byte image, and Motorola's. Intel
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format ieee_extended_intel_96_format =
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format ieee_extended_intel_128_format =
true,
true,
true,
- true
+ true,
+ false
};
/* The following caters to i386 systems that set the rounding precision
true,
true,
true,
- true
+ true,
+ false
};
\f
/* IBM 128-bit extended precision format: a pair of IEEE double precision
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format mips_extended_format =
true,
true,
true,
- false
+ false,
+ true
};
\f
if (r->canonical)
{
- /* Don't use bits from the significand. The
- initialization above is right. */
+ if (fmt->canonical_nan_lsbs_set)
+ {
+ image3 |= 0x7fff;
+ image2 = image1 = image0 = 0xffffffff;
+ }
}
else if (HOST_BITS_PER_LONG == 32)
{
image3 &= ~0x8000;
else
image3 |= 0x8000;
- /* We overload qnan_msb_set here: it's only clear for
- mips_ieee_single, which wants all mantissa bits but the
- quiet/signalling one set in canonical NaNs (at least
- Quiet ones). */
- if (r->canonical && !fmt->qnan_msb_set)
- {
- image3 |= 0x7fff;
- image2 = image1 = image0 = 0xffffffff;
- }
- else if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
+ if (((image3 & 0xffff) | image2 | image1 | image0) == 0)
image3 |= 0x4000;
}
else
true,
true,
true,
- true
+ true,
+ false
};
const struct real_format mips_quad_format =
true,
true,
true,
- false
+ false,
+ true
};
\f
/* Descriptions of VAX floating point formats can be found beginning at
false,
false,
false,
+ false,
false
};
false,
false,
false,
+ false,
false
};
false,
false,
false,
+ false,
false
};
\f
false,
false, /* ??? The encoding does allow for "unnormals". */
false, /* ??? The encoding does allow for "unnormals". */
+ false,
false
};
false,
false, /* ??? The encoding does allow for "unnormals". */
false, /* ??? The encoding does allow for "unnormals". */
+ false,
false
};
\f
true,
true,
true,
- true
+ true,
+ false
};
/* Double precision decimal floating point (IEEE 754R). */
true,
true,
true,
- true
+ true,
+ false
};
/* Quad precision decimal floating point (IEEE 754R). */
true,
true,
true,
- true
+ true,
+ false
};
\f
/* The "twos-complement" c4x format is officially defined as
false,
false,
false,
+ false,
false
};
false,
false,
false,
+ false,
false
};
true,
false,
true,
- true
+ true,
+ false
};
\f
/* Calculate the square root of X in mode MODE, and store the result
bool has_denorm;
bool has_signed_zero;
bool qnan_msb_set;
+ bool canonical_nan_lsbs_set;
};
/* Target formats defined in real.c. */
extern const struct real_format ieee_single_format;
extern const struct real_format mips_single_format;
+extern const struct real_format coldfire_single_format;
extern const struct real_format ieee_double_format;
extern const struct real_format mips_double_format;
+extern const struct real_format coldfire_double_format;
extern const struct real_format ieee_extended_motorola_format;
extern const struct real_format ieee_extended_intel_96_format;
extern const struct real_format ieee_extended_intel_96_round_53_format;