real.c (encode_ibm_extended): Normalize the input value before converting it to a double.
* real.c (encode_ibm_extended): Normalize the input value before converting it to a double. Handle the case where a normal value rounds to infinity. From-SVN: r77498
This commit is contained in:
parent
56ae04afa2
commit
7c476bdec6
5 changed files with 40 additions and 4 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-02-08 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* real.c (encode_ibm_extended): Normalize the input value before
|
||||
converting it to a double. Handle the case where a normal value
|
||||
rounds to infinity.
|
||||
|
||||
2004-02-08 Kazu Hirata <kazu@cs.umass.edu>
|
||||
|
||||
* c-objc-common.c (): Fix a typo in a warning.
|
||||
|
|
13
gcc/real.c
13
gcc/real.c
|
@ -3230,19 +3230,24 @@ static void
|
|||
encode_ibm_extended (const struct real_format *fmt, long *buf,
|
||||
const REAL_VALUE_TYPE *r)
|
||||
{
|
||||
REAL_VALUE_TYPE u, v;
|
||||
REAL_VALUE_TYPE u, normr, v;
|
||||
const struct real_format *base_fmt;
|
||||
|
||||
base_fmt = fmt->qnan_msb_set ? &ieee_double_format : &mips_double_format;
|
||||
|
||||
/* Renormlize R before doing any arithmetic on it. */
|
||||
normr = *r;
|
||||
if (normr.class == rvc_normal)
|
||||
normalize (&normr);
|
||||
|
||||
/* u = IEEE double precision portion of significand. */
|
||||
u = *r;
|
||||
u = normr;
|
||||
round_for_format (base_fmt, &u);
|
||||
encode_ieee_double (base_fmt, &buf[0], &u);
|
||||
|
||||
if (r->class == rvc_normal)
|
||||
if (u.class == rvc_normal)
|
||||
{
|
||||
do_add (&v, r, &u, 1);
|
||||
do_add (&v, &normr, &u, 1);
|
||||
round_for_format (base_fmt, &v);
|
||||
encode_ieee_double (base_fmt, &buf[2], &v);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2004-02-08 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20040208-[12].c: New tests.
|
||||
|
||||
2004-02-08 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||
|
||||
* g++.dg/eh/simd-2.C: Adjust line numbers for SPARC.
|
||||
|
|
10
gcc/testsuite/gcc.c-torture/execute/20040208-1.c
Normal file
10
gcc/testsuite/gcc.c-torture/execute/20040208-1.c
Normal file
|
@ -0,0 +1,10 @@
|
|||
int main ()
|
||||
{
|
||||
long double x;
|
||||
|
||||
x = 0x1.0p-500L;
|
||||
x *= 0x1.0p-522L;
|
||||
if (x != 0x1.0p-1022L)
|
||||
abort ();
|
||||
exit (0);
|
||||
}
|
11
gcc/testsuite/gcc.c-torture/execute/20040208-2.c
Normal file
11
gcc/testsuite/gcc.c-torture/execute/20040208-2.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
int main ()
|
||||
{
|
||||
long double x, y;
|
||||
|
||||
x = 0x1.fffffffffffff8p1022L;
|
||||
x *= 2;
|
||||
y = 0x1.fffffffffffff8p1023L;
|
||||
if (memcmp (&x, &y, sizeof (x)) != 0)
|
||||
abort ();
|
||||
exit (0);
|
||||
}
|
Loading…
Add table
Reference in a new issue