]> git.ipfire.org Git - thirdparty/gcc.git/commit
Optimize (a & b) | (c & ~b) to vpternlog instruction.
authorliuhongt <hongtao.liu@intel.com>
Fri, 20 Aug 2021 07:30:40 +0000 (15:30 +0800)
committerliuhongt <hongtao.liu@intel.com>
Tue, 24 Aug 2021 09:45:33 +0000 (17:45 +0800)
commit6ddb30f941a44bd528904558673ab35394565f08
tree93e9d42f77d3b3ea0aebc3b0ae64345c5be60947
parent8571ff0ae0922bee292161c7fd61dd127d26a4ed
Optimize (a & b) | (c & ~b) to vpternlog instruction.

Also optimize below 3 forms to vpternlog, op1, op2, op3 are
register_operand or unary_p as (not reg)

A: (any_logic (any_logic op1 op2) op3)
B: (any_logic (any_logic op1 op2) (any_logic op3 op4)) op3/op4 should
be equal to op1/op2
C: (any_logic (any_logic (any_logic:op1 op2) op3) op4) op3/op4 should
be equal to op1/op2

gcc/ChangeLog:

PR target/101989
* config/i386/i386.c (ix86_rtx_costs): Define cost for
UNSPEC_VTERNLOG.
* config/i386/i386.h (STRIP_UNARY): New macro.
* config/i386/predicates.md (reg_or_notreg_operand): New
predicate.
* config/i386/sse.md (*<avx512>_vternlog<mode>_all): New define_insn.
(*<avx512>_vternlog<mode>_1): New pre_reload
define_insn_and_split.
(*<avx512>_vternlog<mode>_2): Ditto.
(*<avx512>_vternlog<mode>_3): Ditto.
(any_logic1,any_logic2): New code iterator.
(logic_op): New code attribute.
(ternlogsuffix): Extend to VNxDF and VNxSF.

gcc/testsuite/ChangeLog:

PR target/101989
* gcc.target/i386/pr101989-1.c: New test.
* gcc.target/i386/pr101989-2.c: New test.
* gcc.target/i386/avx512bw-shiftqihi-constant-1.c: Adjust testcase.
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/predicates.md
gcc/config/i386/sse.md
gcc/testsuite/gcc.target/i386/avx512bw-shiftqihi-constant-1.c
gcc/testsuite/gcc.target/i386/pr101989-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr101989-2.c [new file with mode: 0644]