aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel1@de.ibm.com>2007-05-21 12:53:08 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2007-05-21 12:53:08 +0000
commit4d8a8a0a223f8e65a810bdb4ec3fe7496a964699 (patch)
tree93f3471f9ba54489407fddb33fb8858923ba89bc
parent740aeb384d7e15ac53e40559852903a160b4541d (diff)
downloadgcc-4d8a8a0a223f8e65a810bdb4ec3fe7496a964699.zip
gcc-4d8a8a0a223f8e65a810bdb4ec3fe7496a964699.tar.gz
gcc-4d8a8a0a223f8e65a810bdb4ec3fe7496a964699.tar.bz2
defaults.h (IBM_FLOAT_FORMAT): Macro definition removed.
2007-05-21 Andreas Krebbel <krebbel1@de.ibm.com> * defaults.h (IBM_FLOAT_FORMAT): Macro definition removed. * doc/tm.texi (IBM_FLOAT_FORMAT): Documentation entry removed. * real.c (encode_i370_single, decode_i370_single, encode_i370_double, decode_i370_double): Functions removed. (i370_single_format, i370_double_format): Initializations removed. (real_maxval, round_for_format, exact_real_truncate, significand_size): Consider the log2_b field to always be one. (ieee_single_format, mips_single_format, coldfire_single_format, ieee_double_format, mips_double_format, coldfire_double_format, ieee_extended_motorola_format, ieee_extended_intel_96_format, ieee_extended_intel_128_format, ieee_extended_intel_96_round_53_format, ibm_extended_format, mips_extended_format, ieee_quad_format, mips_quad_format, vax_f_format, vax_d_format, vax_g_format, decimal_single_format, decimal_double_format, decimal_quad_format, c4x_single_format, c4x_extended_format, real_internal_format): Remove initialization of log2_b. * real.h (i370_single_format, i370_double_format): Declarations removed. * c-cppbuiltin.c (builtin_define_float_constants): Consider the log2_b field to always be one. From-SVN: r124901
-rw-r--r--gcc/ChangeLog22
-rw-r--r--gcc/c-cppbuiltin.c14
-rw-r--r--gcc/defaults.h3
-rw-r--r--gcc/doc/tm.texi3
-rw-r--r--gcc/real.c270
-rw-r--r--gcc/real.h5
6 files changed, 38 insertions, 279 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1943359..32ff87b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,25 @@
+2007-05-21 Andreas Krebbel <krebbel1@de.ibm.com>
+
+ * defaults.h (IBM_FLOAT_FORMAT): Macro definition removed.
+ * doc/tm.texi (IBM_FLOAT_FORMAT): Documentation entry removed.
+ * real.c (encode_i370_single, decode_i370_single,
+ encode_i370_double, decode_i370_double): Functions removed.
+ (i370_single_format, i370_double_format): Initializations removed.
+ (real_maxval, round_for_format, exact_real_truncate, significand_size):
+ Consider the log2_b field to always be one.
+ (ieee_single_format, mips_single_format, coldfire_single_format,
+ ieee_double_format, mips_double_format, coldfire_double_format,
+ ieee_extended_motorola_format, ieee_extended_intel_96_format,
+ ieee_extended_intel_128_format, ieee_extended_intel_96_round_53_format,
+ ibm_extended_format, mips_extended_format, ieee_quad_format,
+ mips_quad_format, vax_f_format, vax_d_format, vax_g_format,
+ decimal_single_format, decimal_double_format, decimal_quad_format,
+ c4x_single_format, c4x_extended_format, real_internal_format): Remove
+ initialization of log2_b.
+ * real.h (i370_single_format, i370_double_format): Declarations removed.
+ * c-cppbuiltin.c (builtin_define_float_constants): Consider the log2_b
+ field to always be one.
+
2007-05-21 Andreas Schwab <schwab@suse.de>
* config/ia64/ia64.c (emit_predicate_relation_info): Fix use of
diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c
index cc19ce5..544050a 100644
--- a/gcc/c-cppbuiltin.c
+++ b/gcc/c-cppbuiltin.c
@@ -111,7 +111,7 @@ builtin_define_float_constants (const char *name_prefix,
/* The radix of the exponent representation. */
if (type == float_type_node)
builtin_define_with_int_value ("__FLT_RADIX__", fmt->b);
- log10_b = log10_2 * fmt->log2_b;
+ log10_b = log10_2;
/* The number of radix digits, p, in the floating-point significand. */
sprintf (name, "__%s_MANT_DIG__", name_prefix);
@@ -208,12 +208,12 @@ builtin_define_float_constants (const char *name_prefix,
char *p;
strcpy (buf, "0x0.");
- n = fmt->p * fmt->log2_b;
+ n = fmt->p;
for (i = 0, p = buf + 4; i + 3 < n; i += 4)
*p++ = 'f';
if (i < n)
*p++ = "08ce"[n - i];
- sprintf (p, "p%d", fmt->emax * fmt->log2_b);
+ sprintf (p, "p%d", fmt->emax);
if (fmt->pnan < fmt->p)
{
/* This is an IBM extended double format made up of two IEEE
@@ -231,7 +231,7 @@ builtin_define_float_constants (const char *name_prefix,
/* The minimum normalized positive floating-point number,
b**(emin-1). */
sprintf (name, "__%s_MIN__", name_prefix);
- sprintf (buf, "0x1p%d", (fmt->emin - 1) * fmt->log2_b);
+ sprintf (buf, "0x1p%d", fmt->emin - 1);
builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
/* The difference between 1 and the least value greater than 1 that is
@@ -240,9 +240,9 @@ builtin_define_float_constants (const char *name_prefix,
if (fmt->pnan < fmt->p)
/* This is an IBM extended double format, so 1.0 + any double is
representable precisely. */
- sprintf (buf, "0x1p%d", (fmt->emin - fmt->p) * fmt->log2_b);
+ sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
else
- sprintf (buf, "0x1p%d", (1 - fmt->p) * fmt->log2_b);
+ sprintf (buf, "0x1p%d", 1 - fmt->p);
builtin_define_with_hex_fp_value (name, type, decimal_dig, buf, fp_suffix, fp_cast);
/* For C++ std::numeric_limits<T>::denorm_min. The minimum denormalized
@@ -251,7 +251,7 @@ builtin_define_float_constants (const char *name_prefix,
sprintf (name, "__%s_DENORM_MIN__", name_prefix);
if (fmt->has_denorm)
{
- sprintf (buf, "0x1p%d", (fmt->emin - fmt->p) * fmt->log2_b);
+ sprintf (buf, "0x1p%d", fmt->emin - fmt->p);
builtin_define_with_hex_fp_value (name, type, decimal_dig,
buf, fp_suffix, fp_cast);
}
diff --git a/gcc/defaults.h b/gcc/defaults.h
index ed1ae39..e3de82a 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -623,8 +623,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#define UNKNOWN_FLOAT_FORMAT 0
#define IEEE_FLOAT_FORMAT 1
#define VAX_FLOAT_FORMAT 2
-#define IBM_FLOAT_FORMAT 3
-#define C4X_FLOAT_FORMAT 4
+#define C4X_FLOAT_FORMAT 3
/* Default to IEEE float if not specified. Nearly all machines use it. */
#ifndef TARGET_FLOAT_FORMAT
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 7129118..98fe8bb 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -1340,9 +1340,6 @@ need to define @code{TARGET_FLOAT_FORMAT} when the format is IEEE@.
This code indicates the ``F float'' (for @code{float}) and ``D float''
or ``G float'' formats (for @code{double}) used on the VAX and PDP-11@.
-@item IBM_FLOAT_FORMAT
-This code indicates the format used on the IBM System/370.
-
@item C4X_FLOAT_FORMAT
This code indicates the format used on the TMS320C3x/C4x.
@end ftable
diff --git a/gcc/real.c b/gcc/real.c
index 48d9e9e..f5d842e 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -65,12 +65,7 @@
have guard digits or rounding, the computation of 10**exp can
accumulate more than a few digits of error. The previous incarnation
of real.c successfully used a 144-bit fraction; given the current
- layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits.
-
- Target floating point models that use base 16 instead of base 2
- (i.e. IBM 370), are handled during round_for_format, in which we
- canonicalize the exponent to be a multiple of 4 (log2(16)), and
- adjust the significand to match. */
+ layout of REAL_VALUE_TYPE we're forced to expand to at least 160 bits. */
/* Used to classify two numbers simultaneously. */
@@ -2282,9 +2277,9 @@ real_maxval (REAL_VALUE_TYPE *r, int sign, enum machine_mode mode)
{
r->cl = rvc_normal;
r->sign = sign;
- SET_REAL_EXP (r, fmt->emax * fmt->log2_b);
+ SET_REAL_EXP (r, fmt->emax);
- np2 = SIGNIFICAND_BITS - fmt->p * fmt->log2_b;
+ np2 = SIGNIFICAND_BITS - fmt->p;
memset (r->sig, -1, SIGSZ * sizeof (unsigned long));
clear_significand_below (r, np2);
@@ -2342,9 +2337,9 @@ round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
decimal_real_convert (r, DFmode, r);
}
- p2 = fmt->p * fmt->log2_b;
- emin2m1 = (fmt->emin - 1) * fmt->log2_b;
- emax2 = fmt->emax * fmt->log2_b;
+ p2 = fmt->p;
+ emin2m1 = fmt->emin - 1;
+ emax2 = fmt->emax;
np2 = SIGNIFICAND_BITS - p2;
switch (r->cl)
@@ -2372,22 +2367,6 @@ round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
gcc_unreachable ();
}
- /* If we're not base2, normalize the exponent to a multiple of
- the true base. */
- if (fmt->log2_b != 1)
- {
- int shift;
-
- gcc_assert (fmt->b != 10);
- shift = REAL_EXP (r) & (fmt->log2_b - 1);
- if (shift)
- {
- shift = fmt->log2_b - shift;
- r->sig[0] |= sticky_rshift_significand (r, r, shift);
- SET_REAL_EXP (r, REAL_EXP (r) + shift);
- }
- }
-
/* Check the range of the exponent. If we're out of range,
either underflow or overflow. */
if (REAL_EXP (r) > emax2)
@@ -2443,19 +2422,6 @@ round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
if (REAL_EXP (r) > emax2)
goto overflow;
r->sig[SIGSZ-1] = SIG_MSB;
-
- if (fmt->log2_b != 1)
- {
- int shift = REAL_EXP (r) & (fmt->log2_b - 1);
- if (shift)
- {
- shift = fmt->log2_b - shift;
- rshift_significand (r, r, shift);
- SET_REAL_EXP (r, REAL_EXP (r) + shift);
- if (REAL_EXP (r) > emax2)
- goto overflow;
- }
- }
}
}
@@ -2513,7 +2479,7 @@ exact_real_truncate (enum machine_mode mode, const REAL_VALUE_TYPE *a)
gcc_assert (fmt);
/* Don't allow conversion to denormals. */
- emin2m1 = (fmt->emin - 1) * fmt->log2_b;
+ emin2m1 = fmt->emin - 1;
if (REAL_EXP (a) <= emin2m1)
return false;
@@ -2604,7 +2570,7 @@ significand_size (enum machine_mode mode)
double log2_10 = 3.3219281;
return fmt->p * log2_10;
}
- return fmt->p * fmt->log2_b;
+ return fmt->p;
}
/* Return a hash value for the given real value. */
@@ -2775,7 +2741,6 @@ const struct real_format ieee_single_format =
encode_ieee_single,
decode_ieee_single,
2,
- 1,
24,
24,
-125,
@@ -2795,7 +2760,6 @@ const struct real_format mips_single_format =
encode_ieee_single,
decode_ieee_single,
2,
- 1,
24,
24,
-125,
@@ -2815,7 +2779,6 @@ const struct real_format coldfire_single_format =
encode_ieee_single,
decode_ieee_single,
2,
- 1,
24,
24,
-125,
@@ -3023,7 +2986,6 @@ const struct real_format ieee_double_format =
encode_ieee_double,
decode_ieee_double,
2,
- 1,
53,
53,
-1021,
@@ -3043,7 +3005,6 @@ const struct real_format mips_double_format =
encode_ieee_double,
decode_ieee_double,
2,
- 1,
53,
53,
-1021,
@@ -3063,7 +3024,6 @@ const struct real_format coldfire_double_format =
encode_ieee_double,
decode_ieee_double,
2,
- 1,
53,
53,
-1021,
@@ -3393,7 +3353,6 @@ const struct real_format ieee_extended_motorola_format =
encode_ieee_extended_motorola,
decode_ieee_extended_motorola,
2,
- 1,
64,
64,
-16382,
@@ -3413,7 +3372,6 @@ const struct real_format ieee_extended_intel_96_format =
encode_ieee_extended_intel_96,
decode_ieee_extended_intel_96,
2,
- 1,
64,
64,
-16381,
@@ -3433,7 +3391,6 @@ const struct real_format ieee_extended_intel_128_format =
encode_ieee_extended_intel_128,
decode_ieee_extended_intel_128,
2,
- 1,
64,
64,
-16381,
@@ -3455,7 +3412,6 @@ const struct real_format ieee_extended_intel_96_round_53_format =
encode_ieee_extended_intel_96,
decode_ieee_extended_intel_96,
2,
- 1,
53,
53,
-16381,
@@ -3542,7 +3498,6 @@ const struct real_format ibm_extended_format =
encode_ibm_extended,
decode_ibm_extended,
2,
- 1,
53 + 53,
53,
-1021 + 53,
@@ -3562,7 +3517,6 @@ const struct real_format mips_extended_format =
encode_ibm_extended,
decode_ibm_extended,
2,
- 1,
53 + 53,
53,
-1021 + 53,
@@ -3824,7 +3778,6 @@ const struct real_format ieee_quad_format =
encode_ieee_quad,
decode_ieee_quad,
2,
- 1,
113,
113,
-16381,
@@ -3844,7 +3797,6 @@ const struct real_format mips_quad_format =
encode_ieee_quad,
decode_ieee_quad,
2,
- 1,
113,
113,
-16381,
@@ -4143,7 +4095,6 @@ const struct real_format vax_f_format =
encode_vax_f,
decode_vax_f,
2,
- 1,
24,
24,
-127,
@@ -4163,7 +4114,6 @@ const struct real_format vax_d_format =
encode_vax_d,
decode_vax_d,
2,
- 1,
56,
56,
-127,
@@ -4183,7 +4133,6 @@ const struct real_format vax_g_format =
encode_vax_g,
decode_vax_g,
2,
- 1,
53,
53,
-1023,
@@ -4198,203 +4147,6 @@ const struct real_format vax_g_format =
false
};
-/* A good reference for these can be found in chapter 9 of
- "ESA/390 Principles of Operation", IBM document number SA22-7201-01.
- An on-line version can be found here:
-
- http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9AR001/9.1?DT=19930923083613
-*/
-
-static void encode_i370_single (const struct real_format *fmt,
- long *, const REAL_VALUE_TYPE *);
-static void decode_i370_single (const struct real_format *,
- REAL_VALUE_TYPE *, const long *);
-static void encode_i370_double (const struct real_format *fmt,
- long *, const REAL_VALUE_TYPE *);
-static void decode_i370_double (const struct real_format *,
- REAL_VALUE_TYPE *, const long *);
-
-static void
-encode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
- long *buf, const REAL_VALUE_TYPE *r)
-{
- unsigned long sign, exp, sig, image;
-
- sign = r->sign << 31;
-
- switch (r->cl)
- {
- case rvc_zero:
- image = 0;
- break;
-
- case rvc_inf:
- case rvc_nan:
- image = 0x7fffffff | sign;
- break;
-
- case rvc_normal:
- sig = (r->sig[SIGSZ-1] >> (HOST_BITS_PER_LONG - 24)) & 0xffffff;
- exp = ((REAL_EXP (r) / 4) + 64) << 24;
- image = sign | exp | sig;
- break;
-
- default:
- gcc_unreachable ();
- }
-
- buf[0] = image;
-}
-
-static void
-decode_i370_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
- REAL_VALUE_TYPE *r, const long *buf)
-{
- unsigned long sign, sig, image = buf[0];
- int exp;
-
- sign = (image >> 31) & 1;
- exp = (image >> 24) & 0x7f;
- sig = image & 0xffffff;
-
- memset (r, 0, sizeof (*r));
-
- if (exp || sig)
- {
- r->cl = rvc_normal;
- r->sign = sign;
- SET_REAL_EXP (r, (exp - 64) * 4);
- r->sig[SIGSZ-1] = sig << (HOST_BITS_PER_LONG - 24);
- normalize (r);
- }
-}
-
-static void
-encode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
- long *buf, const REAL_VALUE_TYPE *r)
-{
- unsigned long sign, exp, image_hi, image_lo;
-
- sign = r->sign << 31;
-
- switch (r->cl)
- {
- case rvc_zero:
- image_hi = image_lo = 0;
- break;
-
- case rvc_inf:
- case rvc_nan:
- image_hi = 0x7fffffff | sign;
- image_lo = 0xffffffff;
- break;
-
- case rvc_normal:
- if (HOST_BITS_PER_LONG == 64)
- {
- image_hi = r->sig[SIGSZ-1];
- image_lo = (image_hi >> (64 - 56)) & 0xffffffff;
- image_hi = (image_hi >> (64 - 56 + 1) >> 31) & 0xffffff;
- }
- else
- {
- image_hi = r->sig[SIGSZ-1];
- image_lo = r->sig[SIGSZ-2];
- image_lo = (image_lo >> 8) | (image_hi << 24);
- image_hi >>= 8;
- }
-
- exp = ((REAL_EXP (r) / 4) + 64) << 24;
- image_hi |= sign | exp;
- break;
-
- default:
- gcc_unreachable ();
- }
-
- if (FLOAT_WORDS_BIG_ENDIAN)
- buf[0] = image_hi, buf[1] = image_lo;
- else
- buf[0] = image_lo, buf[1] = image_hi;
-}
-
-static void
-decode_i370_double (const struct real_format *fmt ATTRIBUTE_UNUSED,
- REAL_VALUE_TYPE *r, const long *buf)
-{
- unsigned long sign, image_hi, image_lo;
- int exp;
-
- if (FLOAT_WORDS_BIG_ENDIAN)
- image_hi = buf[0], image_lo = buf[1];
- else
- image_lo = buf[0], image_hi = buf[1];
-
- sign = (image_hi >> 31) & 1;
- exp = (image_hi >> 24) & 0x7f;
- image_hi &= 0xffffff;
- image_lo &= 0xffffffff;
-
- memset (r, 0, sizeof (*r));
-
- if (exp || image_hi || image_lo)
- {
- r->cl = rvc_normal;
- r->sign = sign;
- SET_REAL_EXP (r, (exp - 64) * 4 + (SIGNIFICAND_BITS - 56));
-
- if (HOST_BITS_PER_LONG == 32)
- {
- r->sig[0] = image_lo;
- r->sig[1] = image_hi;
- }
- else
- r->sig[0] = image_lo | (image_hi << 31 << 1);
-
- normalize (r);
- }
-}
-
-const struct real_format i370_single_format =
- {
- encode_i370_single,
- decode_i370_single,
- 16,
- 4,
- 6,
- 6,
- -64,
- 63,
- 31,
- 31,
- false,
- false,
- false, /* ??? The encoding does allow for "unnormals". */
- false, /* ??? The encoding does allow for "unnormals". */
- false,
- false
- };
-
-const struct real_format i370_double_format =
- {
- encode_i370_double,
- decode_i370_double,
- 16,
- 4,
- 14,
- 14,
- -64,
- 63,
- 63,
- 63,
- false,
- false,
- false, /* ??? The encoding does allow for "unnormals". */
- false, /* ??? The encoding does allow for "unnormals". */
- false,
- false
- };
-
/* Encode real R into a single precision DFP value in BUF. */
static void
encode_decimal_single (const struct real_format *fmt ATTRIBUTE_UNUSED,
@@ -4455,7 +4207,6 @@ const struct real_format decimal_single_format =
encode_decimal_single,
decode_decimal_single,
10,
- 1, /* log10 */
7,
7,
-95,
@@ -4476,7 +4227,6 @@ const struct real_format decimal_double_format =
encode_decimal_double,
decode_decimal_double,
10,
- 1, /* log10 */
16,
16,
-383,
@@ -4497,7 +4247,6 @@ const struct real_format decimal_quad_format =
encode_decimal_quad,
decode_decimal_quad,
10,
- 1, /* log10 */
34,
34,
-6143,
@@ -4707,7 +4456,6 @@ const struct real_format c4x_single_format =
encode_c4x_single,
decode_c4x_single,
2,
- 1,
24,
24,
-126,
@@ -4727,7 +4475,6 @@ const struct real_format c4x_extended_format =
encode_c4x_extended,
decode_c4x_extended,
2,
- 1,
32,
32,
-126,
@@ -4772,7 +4519,6 @@ const struct real_format real_internal_format =
encode_internal,
decode_internal,
2,
- 1,
SIGNIFICAND_BITS - 2,
SIGNIFICAND_BITS - 2,
-MAX_EXP,
diff --git a/gcc/real.h b/gcc/real.h
index 6fae225..f050daf 100644
--- a/gcc/real.h
+++ b/gcc/real.h
@@ -126,9 +126,6 @@ struct real_format
/* The radix of the exponent and digits of the significand. */
int b;
- /* log2(b). */
- int log2_b;
-
/* Size of the significand in digits of radix B. */
int p;
@@ -272,8 +269,6 @@ extern const struct real_format mips_quad_format;
extern const struct real_format vax_f_format;
extern const struct real_format vax_d_format;
extern const struct real_format vax_g_format;
-extern const struct real_format i370_single_format;
-extern const struct real_format i370_double_format;
extern const struct real_format c4x_single_format;
extern const struct real_format c4x_extended_format;
extern const struct real_format real_internal_format;