]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86: Optimize copysign (x, const_double)
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 19 Oct 2025 01:13:52 +0000 (09:13 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 20 Oct 2025 06:20:43 +0000 (14:20 +0800)
commitc3b0ecf04f8c14360cc02c737446c029038a95f7
tree51da06e59dafbb0b7e4b6153257c4988d3d09f0c
parent1d8272d4d86c45bdaeb2a84d0a235db13f03540b
x86: Optimize copysign (x, const_double)

After

commit 3f176e1adc6bc9cc2c21222d776b51d9f43cb66b
Author: Tamar Christina <tamar.christina@arm.com>
Date:   Thu Nov 9 13:59:39 2023 +0000

    middle-end: optimize fneg (fabs (x)) to copysign (x, -1) [PR109154]

fneg (fabs (x)) is expanded to copysign (x, -1).  Swap constraints for
operands[1] and operands[2] in copysign<mode>3 pattern to optimize

  y = copysign (x, const_double)

instead of

  y = copysign (const_double, x)

Simplify

  y = copysign (x, positive_const_double)

to

  y = ~signbit_mask & x

and

  y = copysign (x, negative_const_double)

to

  y = signbit_mask | x

gcc/

PR target/99930
PR target/122323
* config/i386/i386-expand.cc (ix86_expand_copysign): Swap
operands[1] with operands[2].  Optimize copysign (x, const_double)
instead of copysign (const_double, x).
* config/i386/i386.md (copysign<mode>3): Swap constraints for
operands[1] and operands[2].

gcc/testsuite/

PR target/99930
PR target/122323
* gcc.target/i386/builtin-copysign-2.c: New test.
* gcc.target/i386/builtin-copysign-3.c: Likewise.
* gcc.target/i386/builtin-copysign-4.c: Likewise.
* gcc.target/i386/builtin-copysign-5.c: Likewise.
* gcc.target/i386/builtin-copysign-6.c: Likewise.
* gcc.target/i386/builtin-copysign-7.c: Likewise.
* gcc.target/i386/builtin-copysign-8a.c: Likewise.
* gcc.target/i386/builtin-copysign-8b.c: Likewise.
* gcc.target/i386/builtin-fabs-1.c: Likewise.
* gcc.target/i386/builtin-fabs-2.c: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
12 files changed:
gcc/config/i386/i386-expand.cc
gcc/config/i386/i386.md
gcc/testsuite/gcc.target/i386/builtin-copysign-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-8a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-copysign-8b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-fabs-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/builtin-fabs-2.c [new file with mode: 0644]