Port the following families of NEON intrinsics to the pragma-based
framework, and adds assembly tests for them:

* vcage
* vcagt
* vcale
* vcalt
* vceq
* vceqz
* vcge
* vcgez
* vcgt
* vcgtz
* vcle
* vclez
* vclt
* vcltz
* vtst


There is a slight regression in the 
`vcage_f64.c`/`vcagt_f64.c`/`vcale_f64.c`/`vcalt_f64.c` tests:
I believe it is because `vcage_f64` now expands to GIMPLE rather than a call to
`__builtin_aarch64_fcage`, and then the conversion of a 0-or-1 bool to a 
0-or-minus-1 bool is undone.
I think it is a minor regression, but I would be grateful if anyone has any 
suggestions to fix it.

ChangeLog:
* V1: Initial revision.
* V2: 
  * Restore original definitions of the comparison functions in arm_fp16.h 
rather than open-coding them
  * Use `nonnegative_constant_operand` rather than 
`aarch64_nonnegative_vector_p` in `aarch64_fac<optab><mode><vczle><vczbe>_const`
* V3:
  * Rebase against master
  * Add a FIXME to `facgt_constpool_1.c` to recognise more cases of nonnegative 
arguments
  * Add a FIXME to `vcage_f64.c` to use `FACGE` even when the result is a 
0-or-1 bool rather than a 0-or-minus-1 bool

Karl Meakin (1):
  aarch64: Port NEON comparison intrinsics to pragma-based framework

 gcc/config/aarch64/aarch64-acle-builtins.h    |   28 +
 .../aarch64/aarch64-neon-builtins-base.cc     |   80 +
 .../aarch64/aarch64-neon-builtins-base.def    |  154 +-
 gcc/config/aarch64/aarch64-protos.h           |    1 +
 gcc/config/aarch64/aarch64-simd.md            |   22 +-
 gcc/config/aarch64/aarch64.cc                 |   31 +
 gcc/config/aarch64/arm_neon.h                 | 2111 +----------------
 gcc/config/aarch64/predicates.md              |    3 +
 gcc/testsuite/gcc.target/aarch64/neon/vcage.c |   62 +
 gcc/testsuite/gcc.target/aarch64/neon/vcagt.c |   62 +
 gcc/testsuite/gcc.target/aarch64/neon/vcale.c |   62 +
 gcc/testsuite/gcc.target/aarch64/neon/vcalt.c |   62 +
 gcc/testsuite/gcc.target/aarch64/neon/vceq.c  |  218 ++
 gcc/testsuite/gcc.target/aarch64/neon/vceqz.c |  218 ++
 gcc/testsuite/gcc.target/aarch64/neon/vcge.c  |  190 ++
 gcc/testsuite/gcc.target/aarch64/neon/vcgez.c |  126 +
 gcc/testsuite/gcc.target/aarch64/neon/vcgt.c  |  190 ++
 gcc/testsuite/gcc.target/aarch64/neon/vcgtz.c |  126 +
 gcc/testsuite/gcc.target/aarch64/neon/vcle.c  |  190 ++
 gcc/testsuite/gcc.target/aarch64/neon/vclez.c |  126 +
 gcc/testsuite/gcc.target/aarch64/neon/vclt.c  |  190 ++
 gcc/testsuite/gcc.target/aarch64/neon/vcltz.c |  125 +
 gcc/testsuite/gcc.target/aarch64/neon/vtst.c  |  160 ++
 .../aarch64/simd/facgt_constpool_1.c          |   16 +-
 .../gcc.target/aarch64/simd/vcage_f64.c       |    5 +-
 .../gcc.target/aarch64/simd/vcagt_f64.c       |    2 +-
 .../gcc.target/aarch64/simd/vcale_f64.c       |    2 +-
 .../gcc.target/aarch64/simd/vcalt_f64.c       |    2 +-
 28 files changed, 2456 insertions(+), 2108 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcage.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcagt.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcale.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcalt.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vceq.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vceqz.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcge.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcgez.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcgt.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcgtz.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcle.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vclez.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vclt.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcltz.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vtst.c

-- 
2.51.0

Reply via email to