From: "Maciej W. Rozycki" <macro@linux-mips.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Leon Alrae <leon.alrae@imgtec.com>,
QEMU Developers <qemu-devel@nongnu.org>,
Aurelien Jarno <aurelien@aurel32.net>,
Thomas Schwinge <thomas@codesourcery.com>
Subject: Re: [Qemu-devel] [PATCH 1/7] softfloat: Fix sNaN handling in FP conversion operations
Date: Sun, 8 Feb 2015 12:12:39 +0000 (GMT) [thread overview]
Message-ID: <alpine.LFD.2.11.1502071713370.22715@eddie.linux-mips.org> (raw)
In-Reply-To: <alpine.LFD.2.11.1502061752380.22715@eddie.linux-mips.org>
On Fri, 6 Feb 2015, Maciej W. Rozycki wrote:
> > >> I think this means that:
> > >> (1) we want to put handling of silencing the signaling NaNs
> > >> into the NaN conversion functions themselves (since it's
> > >> too late to do it correctly once the commonNaNtoFloat16
> > >> function has thrown away data)
> > >> (2) that handling needs to be target specific, as most details
> > >> of quiet vs signaling NaNs are
> > >>
> > >> I note in passing that the float*ToCommonNaN and commonNaNToFloat*
> > >> functions are used only in the back-to-back call sequence of
> > >> return commonNaNToFloatX(floatYToCommonNaN(...))
> > >> for handling the NaN inputs on FP-to-FP conversion.
> > >
> > > I believe my proposal addresses your concerns in a burden-free way for
> > > target maintainers who look after processors that implement the IEEE 754
> > > standard as it stands.
> >
> > I don't, which is why I made the comment above. If you're going to
> > fix up NaN handling in the float-to-float conversion routines we
> > should do it in a way that lets us handle the behaviour of
> > target CPUs we care about.
>
> No argument about maintaining correct emulation where it already is such,
> sure. Please note that `float64_maybe_silence_nan' and friends are
> already target-specific, which should generally let us deal with things,
> and I am sort of surprised ARM sets certain rules for sNaN silencing for
> conversions and different ones for other arithmetic operations. Or is it
> really that an input sNaN's sign bit is propagated in the single weird
> corner case only?
OK, I see where the issue is -- this is specifically about the case where
dropping trailing significand bits of an sNaN in the process of format
conversion would result in an infinity being produced. This is handled by
`commonNaNToFloat*' functions, but not in a way the ARM architecture
requires. As a preexisting problem this has nothing to do with my
proposal and neither my proposal makes things worse, though I indeed
missed the opportunity to correct it.
I've thought of two general solutions:
1. Given that `*_default_nan' are now functions make them accept the sign
bit as input and propagate it to output if required by a given
implementation. Conversions would pass the input sign bit while
arithmetic operations would hardcode it to 0.
2. Quieten an sNaN being converted in the wider format operated on. For a
widening conversion it would be the output format just as in the
original patch proposed. For a narrowing conversion it would be the
input format.
I'm leaning towards the second option as being more elegant and robust.
So to give a specific example, `float32_to_float64' would have:
if (aSig) {
float64 nan;
nan = commonNaNToFloat64(float32ToCommonNaN(a, status), status);
return float64_maybe_silence_nan(nan);
}
but `float64_to_float32' would have:
if (aSig) {
float64 nan;
nan = float64_maybe_silence_nan(a);
return commonNaNToFloat32(float64ToCommonNaN(nan, status), status);
}
instead. This does the right thing as far as NaN quietening is concerned
and avoids the `!mantissa' case triggering in `commonNaNToFloat32'.
Based on the lone contents of fpu/softfloat-specialize.h this solution
looks correct to me, in particular for the SNAN_BIT_IS_ONE case -- are you
aware of any processor architectures for which this approach would not
produce the result required?
I've had a look at target-arm/helper.c and target-arm/helper-a64.c and
AFAICT the hacks they do for NaN quietening do not follow the architecture
specification in narrowing conversions (they merely reproduce what I
proposed with the original patch and therefore do not preserve the sign
bit in the case concerned), so the approach I outlined above will actually
progress these targets as well, and these hacks can then be removed.
This solution also meets the IEEE 754-2008 requirement for the way NaN
quietening is done where the preferred NaN encoding is implemented.
Maciej
next prev parent reply other threads:[~2015-02-08 12:12 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-09 1:54 [Qemu-devel] [PATCH 0/7] MIPS: IEEE 754-2008 features support Maciej W. Rozycki
2014-12-09 1:54 ` [Qemu-devel] [PATCH 1/7] softfloat: Fix sNaN handling in FP conversion operations Maciej W. Rozycki
2015-01-29 14:51 ` Leon Alrae
2015-02-05 16:37 ` Peter Maydell
2015-02-05 16:38 ` Peter Maydell
2015-02-06 14:37 ` Maciej W. Rozycki
2015-02-06 14:45 ` Peter Maydell
2015-02-06 19:35 ` Maciej W. Rozycki
2015-02-08 12:12 ` Maciej W. Rozycki [this message]
2014-12-09 1:54 ` [Qemu-devel] [PATCH 2/7] softfloat: Simplify `floatx80ToCommonNaN' function Maciej W. Rozycki
2015-01-28 16:15 ` Leon Alrae
2014-12-09 1:55 ` [Qemu-devel] [PATCH 3/7] softfloat: Convert `*_default_nan' variables into inline functions Maciej W. Rozycki
2014-12-12 19:34 ` [Qemu-devel] [PATCH v2 " Maciej W. Rozycki
2015-01-30 14:09 ` Leon Alrae
2015-01-30 16:02 ` Maciej W. Rozycki
2015-01-30 16:55 ` Peter Maydell
2015-01-31 11:56 ` Maciej W. Rozycki
2015-01-31 12:52 ` Peter Maydell
2015-01-31 14:58 ` Maciej W. Rozycki
2015-02-03 15:43 ` Richard Henderson
2014-12-09 1:55 ` [Qemu-devel] [PATCH 4/7] softfloat: Add SoftFloat status parameter to `*_nan' functions Maciej W. Rozycki
2014-12-09 1:55 ` [Qemu-devel] [PATCH 5/7] softfloat: Rework `*_is_*_nan' functions Maciej W. Rozycki
2014-12-12 19:35 ` [Qemu-devel] [PATCH v2 " Maciej W. Rozycki
2015-02-05 16:42 ` Peter Maydell
2014-12-09 1:55 ` [Qemu-devel] [PATCH 6/7] softfloat: Add SoftFloat status `nan2008_mode' flag Maciej W. Rozycki
2014-12-12 19:35 ` [Qemu-devel] [PATCH v2 " Maciej W. Rozycki
2015-02-05 17:00 ` Peter Maydell
2015-02-05 19:07 ` Maciej W. Rozycki
2014-12-09 1:56 ` [Qemu-devel] [PATCH 7/7] target-mips: Add IEEE 754-2008 features support Maciej W. Rozycki
2015-02-09 17:10 ` Leon Alrae
2015-02-09 20:55 ` Maciej W. Rozycki
2015-02-10 10:44 ` Leon Alrae
2015-02-10 14:30 ` Maciej W. Rozycki
2015-02-10 17:21 ` Leon Alrae
2015-02-17 13:55 ` Maciej W. Rozycki
2014-12-09 9:20 ` [Qemu-devel] [PATCH 0/7] MIPS: " Peter Maydell
2014-12-09 12:28 ` Maciej W. Rozycki
2014-12-09 12:41 ` Peter Maydell
2014-12-09 18:16 ` Maciej W. Rozycki
2015-01-30 11:59 ` Peter Maydell
2015-01-30 13:47 ` Maciej W. Rozycki
[not found] ` <54CE9614.2060805@codesourcery.com>
2015-02-03 16:28 ` Thomas Schwinge
2015-02-03 22:30 ` Maciej W. Rozycki
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=alpine.LFD.2.11.1502071713370.22715@eddie.linux-mips.org \
--to=macro@linux-mips.org \
--cc=aurelien@aurel32.net \
--cc=leon.alrae@imgtec.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thomas@codesourcery.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 NNTP newsgroup(s).