summaryrefslogtreecommitdiff
path: root/gcc/real.c
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-08 20:00:30 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-08 20:00:30 +0000
commit0d8bfd85942c83229704d2570b2fb73353c92ac1 (patch)
tree552097bec08beca4ae6f4b3379ee0a4735807d29 /gcc/real.c
parent069eea2607b7a8acf9cb6362f300f2e18b20454b (diff)
downloadgcc-0d8bfd85942c83229704d2570b2fb73353c92ac1.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77498 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/real.c')
-rw-r--r--gcc/real.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/real.c b/gcc/real.c
index cd27d3e0501..474da31df6c 100644
--- a/gcc/real.c
+++ b/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);
}