rs6000: Fix extendsfdf2 for signaling NaNs
commit6ed5880917b30420fa45530a3832366c17d481d4
authorsegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Feb 2017 15:00:37 +0000 (17 15:00 +0000)
committersegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Feb 2017 15:00:37 +0000 (17 15:00 +0000)
treec24026ef6a29900599fb94c54cebfb9bcba423b2
parent873a9b6435c774638586abbfbeca08bd4c9cb48d
rs6000: Fix extendsfdf2 for signaling NaNs

A cast from float to double should turn a signaling NaN into a quiet
NaN, if using -fsignaling-nans.  On PowerPC single-precision floats are
stored as double precision in registers, and so, the cast normally does
nothing.  This causes gcc.dg/pr59833.c to fail (it does such a cast,
and expects a quiet NaN as output).

This patch adds a new pattern, used with -fsignaling-nans in effect,
that creates an frsp instruction (or xsrsp) in this case.  Since the
input already is SFmode, that instruction turns signaling NaNs into
quiet NaNs and does nothing more.

* config/rs6000/rs6000.md (extendsfdf2): Remove default arguments.
If HONOR_SNANS (SFmode) force the input to a register.
(*extendsfdf2_fpr): Add !HONOR_SNANS (SFmode) condition.
(*extendsfdf2_snan): New pattern, used when using SNaNs; it generates
an frsp or similar insn.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@245534 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/config/rs6000/rs6000.md