From: Alexandre Oliva <aoliva@redhat.com>
To: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>
Cc: gcc-bugs@gcc.gnu.org, gcc-patches@gcc.gnu.org, gcc@gcc.gnu.org,
libstdc++@gcc.gnu.org, oldham@codesourcery.com,
ro@TechFak.Uni-Bielefeld.DE, rth@redhat.com
Subject: Re: Irix6 long doubles implemented wrong? (27_io/ostream_inserter_arith)
Date: Sun, 26 Jan 2003 13:00:00 -0000 [thread overview]
Message-ID: <or7kcsjkdu.fsf@free.redhat.lsd.ic.unicamp.br> (raw)
In-Reply-To: <or65slezv7.fsf@free.redhat.lsd.ic.unicamp.br>
[-- Attachment #1: Type: text/plain, Size: 571 bytes --]
On Jan 19, 2003, Alexandre Oliva <aoliva@redhat.com> wrote:
> the minimum normal exponent should be set such that all 107
> significant bits are available (and it's 107, not 106, as I
> implemented it) for normals.
It can't possibly be 107. IRIX must be doing something wrong in
setting LDBL_MANT_DIG to 107, since there are only 53 bits of
precision in each double, even if you count the implicit 1s. Besides,
the emulation I implemented worked correctly down to the least
significant bits with IRIX's printf, so I'm checking these bits in
too, per rth's approval.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: gcc-mips-tfmode-fp-bit-ibmext.patch --]
[-- Type: text/x-patch, Size: 4851 bytes --]
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* fp-bit.h: Define macros for TFmode floating-point constants
in IBM-extended TFmode types.
(TMODES): Define if __LDBL_MANT_DIG__ has the newly-supported
widths.
* config/fp-bit.c (pack_d, unpack_d): Support IBM-extended
TFmode type.
Index: gcc/config/fp-bit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/fp-bit.c,v
retrieving revision 1.36.4.1
diff -u -p -r1.36.4.1 fp-bit.c
--- gcc/config/fp-bit.c 26 Jan 2003 09:30:38 -0000 1.36.4.1
+++ gcc/config/fp-bit.c 26 Jan 2003 10:01:20 -0000
@@ -322,9 +322,66 @@ pack_d ( fp_number_type * src)
dst.bits.exp = exp;
dst.bits.sign = sign;
#else
+# if defined TFLOAT && defined HALFFRACBITS
+ {
+ halffractype high, low;
+
+ high = (fraction >> (FRACBITS - HALFFRACBITS));
+ high &= (((fractype)1) << HALFFRACBITS) - 1;
+ high |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << HALFFRACBITS;
+ high |= ((fractype) (sign & 1)) << (HALFFRACBITS | EXPBITS);
+
+ low = (halffractype)fraction &
+ ((((halffractype)1) << (FRACBITS - HALFFRACBITS)) - 1);
+
+ if (exp == EXPMAX || exp == 0 || low == 0)
+ low = 0;
+ else
+ {
+ exp -= HALFFRACBITS + 1;
+
+ while (exp > 0
+ && low < ((halffractype)1 << HALFFRACBITS))
+ {
+ low <<= 1;
+ exp--;
+ }
+
+ if (exp <= 0)
+ {
+ halffractype roundmsb, round;
+
+ exp = -exp + 1;
+
+ roundmsb = (1 << (exp - 1));
+ round = low & ((roundmsb << 1) - 1);
+
+ low >>= exp;
+ exp = 0;
+
+ if (round > roundmsb || (round == roundmsb && (low & 1)))
+ {
+ low++;
+ if (low >= ((halffractype)1 << HALFFRACBITS))
+ /* We don't shift left, since it has just become the
+ smallest normal number, whose implicit 1 bit is
+ now indicated by the non-zero exponent. */
+ exp++;
+ }
+ }
+
+ low &= ((halffractype)1 << HALFFRACBITS) - 1;
+ low |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << HALFFRACBITS;
+ low |= ((fractype) (sign & 1)) << (HALFFRACBITS | EXPBITS);
+ }
+
+ dst.value_raw = (((fractype) high) << HALFSHIFT) | low;
+ }
+# else
dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
+# endif
#endif
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
@@ -381,9 +438,42 @@ unpack_d (FLO_union_type * src, fp_numbe
exp = src->bits.exp;
sign = src->bits.sign;
#else
+# if defined TFLOAT && defined HALFFRACBITS
+ {
+ halffractype high, low;
+
+ high = src->value_raw >> HALFSHIFT;
+ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
+
+ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
+ fraction <<= FRACBITS - HALFFRACBITS;
+ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
+ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
+
+ if (exp != EXPMAX && exp != 0 && low != 0)
+ {
+ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
+ int shift;
+ fractype xlow;
+
+ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
+ if (lowexp)
+ xlow |= (((halffractype)1) << HALFFRACBITS);
+ else
+ lowexp = 1;
+ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
+ if (shift > 0)
+ xlow <<= shift;
+ else if (shift < 0)
+ xlow >>= -shift;
+ fraction += xlow;
+ }
+ }
+# else
fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
+# endif
#endif
dst->sign = sign;
Index: gcc/config/fp-bit.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/fp-bit.h,v
retrieving revision 1.7.18.1
diff -u -p -r1.7.18.1 fp-bit.h
--- gcc/config/fp-bit.h 26 Jan 2003 09:30:38 -0000 1.7.18.1
+++ gcc/config/fp-bit.h 26 Jan 2003 10:01:20 -0000
@@ -87,7 +87,7 @@ Boston, MA 02111-1307, USA. */
#endif
#endif /* ! FINE_GRAINED_LIBRARIES */
-#if __LDBL_MANT_DIG__ == 113
+#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
# define TMODES
#endif
@@ -150,6 +150,18 @@ typedef unsigned int UTItype __attribute
# define FRACHIGH ((TItype)0x8 << 124)
# define FRACHIGH2 ((TItype)0xc << 124)
# define FRACBITS 112
+# endif
+
+# if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */
+# define EXPBITS 11
+# define EXPBIAS 1023
+# define EXPMAX (0x7ff)
+# define QUIET_NAN ((TItype)0x8 << (48 + 64))
+# define FRACHIGH ((TItype)0x8 << 124)
+# define FRACHIGH2 ((TItype)0xc << 124)
+# define FRACBITS 105
+# define HALFFRACBITS 52
+# define HALFSHIFT 64
# endif
# define pack_d __pack_t
[-- Attachment #3: Type: text/plain, Size: 289 bytes --]
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{redhat.com, gcc.gnu.org}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist Professional serial bug killer
next prev parent reply other threads:[~2003-01-26 10:07 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-14 14:09 Kaveh R. Ghazi
2002-12-16 9:24 ` Rainer Orth
2002-12-16 9:51 ` Alexandre Oliva
2002-12-16 9:52 ` Rainer Orth
2002-12-16 12:23 ` Eric Christopher
2002-12-16 21:58 ` Kaveh R. Ghazi
2002-12-21 10:45 ` Alexandre Oliva
2002-12-22 6:02 ` Kaveh R. Ghazi
2002-12-22 10:24 ` Alexandre Oliva
2002-12-22 10:35 ` Alexandre Oliva
2002-12-23 9:46 ` Alexandre Oliva
2002-12-24 11:07 ` Kaveh R. Ghazi
2002-12-25 8:04 ` Alexandre Oliva
2002-12-26 13:48 ` Alexandre Oliva
2002-12-27 7:06 ` Alexandre Oliva
2002-12-29 0:22 ` Kaveh R. Ghazi
2002-12-29 6:06 ` Alexandre Oliva
2003-01-07 22:57 ` Richard Henderson
2003-01-08 18:16 ` Alexandre Oliva
2003-01-08 22:19 ` Richard Henderson
2003-01-09 9:29 ` Alexandre Oliva
2003-01-09 9:38 ` Alexandre Oliva
2003-01-10 1:18 ` Alexandre Oliva
2003-01-10 2:29 ` Richard Henderson
2003-01-19 21:02 ` Kaveh R. Ghazi
2003-01-19 22:15 ` Alexandre Oliva
2003-01-26 13:00 ` Alexandre Oliva [this message]
2003-01-28 17:32 ` Alexandre Oliva
2003-01-28 23:38 ` Alexandre Oliva
2003-01-26 15:20 ` Alexandre Oliva
2003-01-26 16:14 ` Alexandre Oliva
2003-01-26 18:40 ` Kaveh R. Ghazi
2003-01-26 21:24 ` Kaveh R. Ghazi
2003-01-26 21:25 ` Alexandre Oliva
2003-01-27 9:17 ` Kaveh R. Ghazi
2003-01-27 10:40 ` Alexandre Oliva
2003-01-28 4:52 ` Kaveh R. Ghazi
2003-01-28 17:31 ` Alexandre Oliva
2003-01-28 19:11 ` Kaveh R. Ghazi
2003-01-28 19:23 ` Kaveh R. Ghazi
2003-01-28 19:47 ` Rainer Orth
[not found] ` <15926.49701.3! 59482.666471@xayide.TechFak.Uni-Bielefeld.DE>
2003-01-29 6:56 ` Kaveh R. Ghazi
2003-01-29 10:07 ` Richard Henderson
2003-01-29 13:39 ` Alexandre Oliva
2003-01-29 17:26 ` Kaveh R. Ghazi
2003-01-29 18:10 ` Richard Henderson
2003-01-30 23:31 ` Irix6 native long double libcalls progress report (and problem) Kaveh R. Ghazi
2003-01-30 23:49 ` Richard Henderson
2003-02-03 13:22 ` Alexandre Oliva
2003-01-30 8:05 ` Irix6 long doubles implemented wrong? (27_io/ostream_inserter_arith) Kaveh R. Ghazi
2003-02-03 13:07 ` Alexandre Oliva
2003-02-03 15:18 ` Kaveh R. Ghazi
2003-02-03 16:37 ` Alexandre Oliva
2003-01-27 10:41 ` Alexandre Oliva
2003-01-26 21:54 ` Richard Henderson
2003-01-10 1:37 ` Alexandre Oliva
2003-01-26 10:07 ` Alexandre Oliva
2003-01-26 10:42 ` Alexandre Oliva
2003-01-26 10:45 ` Alexandre Oliva
2003-01-26 10:53 ` Alexandre Oliva
2003-01-26 12:07 ` Alexandre Oliva
2003-01-26 12:20 ` Alexandre Oliva
2003-01-26 12:50 ` Alexandre Oliva
2002-12-24 18:15 ` Kaveh R. Ghazi
2003-01-07 22:16 ` Richard Henderson
2003-01-07 22:40 ` Richard Henderson
2003-01-08 18:04 ` Alexandre Oliva
2003-01-08 22:29 ` Richard Henderson
2003-01-08 22:46 ` Zack Weinberg
2003-01-08 23:13 ` Richard Henderson
2003-01-09 7:27 ` Alexandre Oliva
2002-12-17 0:18 Billinghurst, David (CRTS)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=or7kcsjkdu.fsf@free.redhat.lsd.ic.unicamp.br \
--to=aoliva@redhat.com \
--cc=gcc-bugs@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=gcc@gcc.gnu.org \
--cc=ghazi@caip.rutgers.edu \
--cc=libstdc++@gcc.gnu.org \
--cc=oldham@codesourcery.com \
--cc=ro@TechFak.Uni-Bielefeld.DE \
--cc=rth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).