[aarch64] PR target/87369 Prefer bsl/bit/bif for copysign
authorRichard Earnshaw <rearnsha@arm.com>
Tue, 11 Dec 2018 11:26:15 +0000 (11:26 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Tue, 11 Dec 2018 11:26:15 +0000 (11:26 +0000)
commit315fdae8f965045f86e966953f3c010a61072729
treeb35e794e0e70ebf4e05cdb4ec893ed5e765844d5
parentc47fb5d9da9b60987babba6d05d5f97d03d0246b
[aarch64] PR target/87369 Prefer bsl/bit/bif for copysign

The copysign operations will almost always be performed on values in
floating-point registers.  As such, we do not want the compiler to
simplify the operations into code sequences that can only be done
using the general-purpose register set.  Unfortunately, this is what
is currently happening.

Fortunately, it seems quite unlikely that copysign() will be
subsequently followed by other logical operations on the values
involved, so I think it is acceptable to use an unspec here.  This
allows us to preserve the operation in a form that allows the register
allocator to make the right choice later on, without limitation on the
final form of the operation (well, if we do end up using the gp
register bank, we get a dead constant load that we cannot easily
eliminate at a late stage).

PR target/37369
* config/aarch64/iterators.md (sizem1): Add sizes for SFmode and DFmode.
(Vbtype): Add SFmode mapping.
* config/aarch64/aarch64.md (copysigndf3, copysignsf3): Delete.
(copysign<GPF:mode>3): New expand pattern.
(copysign<GPF:mode>3_insn): New insn pattern.

From-SVN: r267019
gcc/ChangeLog
gcc/config/aarch64/aarch64.md
gcc/config/aarch64/iterators.md