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
This commit is contained in:
Andreas Krebbel 2007-05-21 12:53:08 +00:00 committed by Andreas Krebbel
parent 740aeb384d
commit 4d8a8a0a22
6 changed files with 38 additions and 279 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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;