diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-08 20:00:30 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-08 20:00:30 +0000 |
commit | 0d8bfd85942c83229704d2570b2fb73353c92ac1 (patch) | |
tree | 552097bec08beca4ae6f4b3379ee0a4735807d29 /gcc/real.c | |
parent | 069eea2607b7a8acf9cb6362f300f2e18b20454b (diff) | |
download | gcc-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.c | 13 |
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); } |