From 4d8a8a0a223f8e65a810bdb4ec3fe7496a964699 Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Mon, 21 May 2007 12:53:08 +0000 Subject: [PATCH] defaults.h (IBM_FLOAT_FORMAT): Macro definition removed. 2007-05-21 Andreas Krebbel * 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 --- gcc/ChangeLog | 22 ++++ gcc/c-cppbuiltin.c | 14 +-- gcc/defaults.h | 3 +- gcc/doc/tm.texi | 3 - gcc/real.c | 270 ++------------------------------------------- gcc/real.h | 5 - 6 files changed, 38 insertions(+), 279 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1943359f907..32ff87bdb89 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2007-05-21 Andreas Krebbel + + * 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 * config/ia64/ia64.c (emit_predicate_relation_info): Fix use of diff --git a/gcc/c-cppbuiltin.c b/gcc/c-cppbuiltin.c index cc19ce5dd7d..544050a4878 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::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 ed1ae39b9d1..e3de82a5aac 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 71291185b72..98fe8bbc54d 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 48d9e9e23fa..f5d842e24b5 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 6fae2254a8e..f050dafd48c 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;