From: "Maciej W. Rozycki" <macro@linux-mips.org>
To: Leon Alrae <leon.alrae@imgtec.com>
Cc: qemu-devel@nongnu.org, Aurelien Jarno <aurelien@aurel32.net>,
Thomas Schwinge <thomas@codesourcery.com>
Subject: Re: [Qemu-devel] [PATCH 7/7] target-mips: Add IEEE 754-2008 features support
Date: Tue, 10 Feb 2015 14:30:43 +0000 (GMT) [thread overview]
Message-ID: <alpine.LFD.2.11.1502101402540.22715@eddie.linux-mips.org> (raw)
In-Reply-To: <54D9E116.9060201@imgtec.com>
On Tue, 10 Feb 2015, Leon Alrae wrote:
> > These cases could be addressed by either replacing subtraction from 0.0
> > with multiplication by -1.0, or by tweaking the rounding mode as needed
> > temporarily. Given that the computational cost of multiplication is
> > uncertain and likely higher or at best the same as the cost of addition or
> > subtraction, I'd be leaning towards the latter solution.
>
> My first thought was to treat zero in NEG.fmt as a special case and use
> float32_chs() for it. But tweaking the rounding mode temporarily
> probably is better as we will get consistent behaviour for zero as well
> as input denormals which are squashed in float32_sub() when
> flush_inputs_to_zero flag is set (actually I'm not sure if legacy fp
> instructions should flush input denormals, but according to the spec
> this is implementation dependent so I won't worry about this).
As expected setting CP1.FCSR.FS on a randomly picked R4400 processor:
CPU0 revision is: 00000440 (R4400SC)
FPU revision is: 00000500
does flush a NEG.fmt's input denormal to 0. Given this program:
#include <stdint.h>
#include <stdio.h>
int main(void)
{
union {
double d;
uint64_t i;
} x = { .i = 0x000123456789abcdULL }, y, z;
unsigned long tmp, fcsr;
printf("x: %016lx\n", x.i);
asm volatile(
" cfc1 %1, $31\n"
" or %2, %1, %4\n"
" ctc1 %2, $31\n"
" neg.d %0, %3\n"
" ctc1 %1, $31"
: "=f" (y.d), "=&r" (fcsr), "=&r" (tmp)
: "f" (x.d), "r" (1 << 24));
printf("y: %016lx\n", y.i);
asm volatile(
" neg.d %0, %1"
: "=f" (z.d) : "f" (x.d));
printf("z: %016lx\n", z.i);
x.i = 0;
printf("+: %016lx\n", x.i);
asm volatile(
" neg.d %0, %1"
: "=f" (y.d) : "f" (x.d));
printf("-: %016lx\n", y.i);
return 0;
}
I get this output:
x: 000123456789abcd
y: 8000000000000000
z: 800123456789abcd
+: 0000000000000000
-: 8000000000000000
under Linux. According to R4400 documentation the value of `z' must have
been calculated by the in-kernel emulator in the Unimplemented Operation
handler as for this processor implementation any denormalised operands
cause this exception except for compare instructions. But in any case all
the results are consistent. So we don't actually have to do anything for
the flush-to-zero mode, our calculation should work out as expected (as
long as the `float_round_down' rounding mode is respected that is).
While at it I included the result of the negation of 0 for completeness.
Maciej
next prev parent reply other threads:[~2015-02-10 14:30 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
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 [this message]
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.1502101402540.22715@eddie.linux-mips.org \
--to=macro@linux-mips.org \
--cc=aurelien@aurel32.net \
--cc=leon.alrae@imgtec.com \
--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).