APX CCMP feature[1] implements conditional compare which executes compare
when EFLAGS matches certain condition.
CCMP introduces default flags value (dfv), when conditional compare does
not execute, it will directly set the flags according to dfv.
From APX assembler recommendation document, the instruction is like
ccmpeq {dfv=sf,of,cf,zf} %rax, %r16
For this instruction, it will test EFLAGS regs if it matches conditional
code EQ, if yes, compare %rax and %r16 like legacy cmp. If no, the
EFLAGS will be updated according to dfv, which means SF,OF,CF,ZF are
set. PF will be set according to CF in dfv, and AF will always be
cleared.
The dfv part can be a combination of sf,of,cf,zf, like {dfv=cf,zf} which
sets CF and ZF only and clear others, or {dfv=} which clears all EFLAGS.
To enable CCMP, we implemented the target hook TARGET_GEN_CCMP_FIRST and
TARGET_GEN_CCMP_NEXT to reuse the current ccmp infrastructure. Also we
extended the cstorem4 optab to support storing different CCmode to fit
current ccmp infrasturcture.
We also adjusted the middle-end ccmp strategy to support fp comi + int
ccmp generation.
All the changes passed bootstrap & regtest on {aarch64/x86-64}-pc-linux-gnu.
We also tested spec with sde and passed the runtime test.
Ok for trunk?
[1].https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-performance-extensions-apx.html
Hongyu Wang (3):
[APX CCMP] Support APX CCMP
[APX CCMP] Adjust startegy for selecting ccmp candidates
[APX CCMP] Support ccmp for float compare
gcc/ccmp.cc | 12 +-
gcc/config/i386/i386-expand.cc | 164 +++++++++++++++++++++
gcc/config/i386/i386-opts.h | 6 +-
gcc/config/i386/i386-protos.h | 5 +
gcc/config/i386/i386.cc | 50 +++++++
gcc/config/i386/i386.h | 1 +
gcc/config/i386/i386.md | 35 ++++-
gcc/config/i386/i386.opt | 3 +
gcc/testsuite/gcc.target/i386/apx-ccmp-1.c | 104 +++++++++++++
gcc/testsuite/gcc.target/i386/apx-ccmp-2.c | 104 +++++++++++++
10 files changed, 479 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/apx-ccmp-1.c
create mode 100644 gcc/testsuite/gcc.target/i386/apx-ccmp-2.c
--
2.31.1