From: Joseph Myers <joseph@codesourcery.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: Ian Lance Taylor <ian@airs.com>, <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH 9/12] libgcc _BitInt support [PR102989]
Date: Fri, 1 Sep 2023 21:48:22 +0000 [thread overview]
Message-ID: <18ed8557-5c75-4f3-e9a9-3cba6ab0a5b1@codesourcery.com> (raw)
In-Reply-To: <ZNPZiZWAGWi3IT3f@tucnak>
On Wed, 9 Aug 2023, Jakub Jelinek via Gcc-patches wrote:
> I know that soft-fp is owned by glibc and I think the op-common.h change
> should be propagated there, but the bitint stuff is really GCC specific
> and IMHO doesn't belong into the glibc copy.
The op-common.h change is OK for glibc.
Some additional tests I think should be added to the testsuite for
floating-point functionality in this patch, that I didn't spot in the
testsuite patches - if any of these aren't included initially, there
should at least be bugs filed in Bugzilla for the omissions:
1. Test overflowing conversions to integers (including from inf or NaN)
raise FE_INVALID. (Note: it's not specified in the standard whether
inexact conversions to integers raise FE_INEXACT or not, so testing that
seems less important.)
2. Test conversions from integers to floating point raise FE_INEXACT when
inexact, together with FE_OVERFLOW when overflowing (while exact
conversions don't raise exceptions).
3. Test conversions from integers to floating point respect the rounding
mode.
4. Test converting floating-point values in the range (-1.0, 0.0] to both
unsigned and signed _BitInt; I didn't see such tests for binary floating
types, only for decimal types, and the decimal tests didn't include tests
of negative zero itself as the value converted to _BitInt.
5. Test conversions of noncanonical BID zero to integers (these tests
would be specific to BID). See below for a bug in this area.
For points 2 and 3 above, it's probably appropriate to test only for
binary floating point, to avoid any issues with the separate DFP rounding
mode and with DFP arithmetic operations not necessarily working correctly
with exceptions - but then a bug should be filed in Bugzilla noting the
omission of such tests for DFP.
For points 1, 2 and 3 above, if the conversions for types such as
_BitInt(32) might end up using the same conversions as for types such as
int, then tests for such types should probably be omitted (again with a
bug filed) given the range of known bugs about exceptions from such
operations with types such as int.
> +__bid_fixtdbitint (UBILtype *r, SItype rprec, _Decimal128 a)
> +{
> + FP_DECL_EX;
> + USItype arprec = rprec < 0 ? -rprec : rprec;
> + USItype rn = (arprec + BIL_TYPE_SIZE - 1) / BIL_TYPE_SIZE;
> + union { _Decimal128 d; UDItype u[2]; } u;
> + UDItype mantissahi, mantissalo, t;
> + SItype sgn;
> + SItype exponent;
> + USItype exp_bits, mant_bits;
> + UBILtype *pow10v, *resv;
> + USItype pow10_limbs, res_limbs, min_limbs, mant_limbs, low_zeros;
> +
> + FP_INIT_EXCEPTIONS;
> + u.d = a;
> + mantissahi = u.u[__FLOAT_WORD_ORDER__ != __ORDER_BIG_ENDIAN__];
> + mantissalo = u.u[__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__];
> + t = mantissahi >> 47;
> + sgn = (DItype) mantissahi < 0;
> + if ((t & (3 << 14)) != (3 << 14))
> + {
> + mantissahi &= ((((UDItype) 1) << 49) - 1);
> + exponent = (t >> 2) & 0x3fff;
Overflow (thus producing a noncanonical zero) is possible in this case for
TDmode. An appropriate test of a noncanonical zero that goes through this
case should thus be added to the testsuite.
> + }
> + else if ((t & (3 << 12)) != (3 << 12))
> + {
> + mantissahi &= ((((UDItype) 1) << 47) - 1);
> + mantissahi |= ((UDItype) 1) << 49;
> + exponent = t & 0x3fff;
> + if (mantissahi > (UDItype) 0x1ed09bead87c0
> + || (mantissahi == (UDItype) 0x1ed09bead87c0
> + && mantissalo > 0x378d8e63ffffffff))
> + {
> + mantissahi = 0;
> + mantissalo = 0;
> + }
And in this case, overflow is guaranteed; the check for the overflow
threshold should thus move to the previous case.
This patch is OK with these fixes.
Note for powerpc architecture maintainers: adding _BitInt support on that
architecture will mean, as well as adding support for the conversions
to/from DPD (if S/390 doesn't get there first), also adding support for
conversions to/from IBM long double.
--
Joseph S. Myers
joseph@codesourcery.com
next prev parent reply other threads:[~2023-09-01 21:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-09 18:23 Jakub Jelinek
2023-09-01 21:48 ` Joseph Myers [this message]
2023-09-02 11:42 ` Jakub Jelinek
2023-09-04 19:42 ` [PATCH 15/12] Add further _BitInt <-> floating point tests [PR102989] Jakub Jelinek
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=18ed8557-5c75-4f3-e9a9-3cba6ab0a5b1@codesourcery.com \
--to=joseph@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=ian@airs.com \
--cc=jakub@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).