Bootstrapped and regtested on x86_64-redhat-linux and s390x-redhat-linux. This patch series adds signaling FP comparison support (both scalar and vector) to s390 backend.
The first patch documents the current behavior of MIN, MAX and LTGT operations with respect to signaling. The second patch adds a hook in order to make it possible to support only a subset of comparison rtxes in vcond, and the third patch makes use of it for z13. Patches 4-6 are preparation cleanups. The seventh patch is an actual implementation. The eighth patch contains new tests, that make sure autovectorized comparisons use proper instructions. Ilya Leoshkevich (8): Document signaling for min, max and ltgt operations Introduce vcond_supported_p hook S/390: Implement vcond_supported_p hook S/390: Implement vcond expander for V1TI,V1TF S/390: Remove code duplication in vec_unordered<mode> S/390: Remove code duplication in vec_* comparison expanders S/390: Use signaling FP comparison instructions S/390: Test signaling FP comparison instructions gcc/config/s390/2827.md | 14 +- gcc/config/s390/2964.md | 13 +- gcc/config/s390/3906.md | 17 +- gcc/config/s390/8561.md | 19 +- gcc/config/s390/s390-builtins.def | 16 +- gcc/config/s390/s390-modes.def | 8 + gcc/config/s390/s390.c | 62 ++++- gcc/config/s390/s390.md | 14 + gcc/config/s390/vector.md | 261 ++++++++++++------ gcc/doc/generic.texi | 16 +- gcc/doc/md.texi | 3 +- gcc/doc/rtl.texi | 3 +- gcc/doc/tm.texi | 9 + gcc/doc/tm.texi.in | 2 + gcc/optabs-tree.c | 6 +- gcc/target.def | 11 + gcc/targhooks.c | 12 + gcc/targhooks.h | 1 + gcc/testsuite/gcc.target/s390/s390.exp | 8 + .../gcc.target/s390/vector/vec-scalar-cmp-1.c | 8 +- .../s390/zvector/autovec-double-quiet-eq.c | 8 + .../s390/zvector/autovec-double-quiet-ge.c | 8 + .../s390/zvector/autovec-double-quiet-gt.c | 8 + .../s390/zvector/autovec-double-quiet-le.c | 8 + .../s390/zvector/autovec-double-quiet-lt.c | 8 + .../zvector/autovec-double-quiet-ordered.c | 10 + .../s390/zvector/autovec-double-quiet-uneq.c | 10 + .../zvector/autovec-double-quiet-unordered.c | 11 + .../autovec-double-signaling-ge-z13-finite.c | 10 + .../zvector/autovec-double-signaling-ge-z13.c | 9 + .../zvector/autovec-double-signaling-ge.c | 8 + .../autovec-double-signaling-gt-z13-finite.c | 10 + .../zvector/autovec-double-signaling-gt-z13.c | 9 + .../zvector/autovec-double-signaling-gt.c | 8 + .../autovec-double-signaling-le-z13-finite.c | 10 + .../zvector/autovec-double-signaling-le-z13.c | 9 + .../zvector/autovec-double-signaling-le.c | 8 + .../autovec-double-signaling-lt-z13-finite.c | 10 + .../zvector/autovec-double-signaling-lt-z13.c | 9 + .../zvector/autovec-double-signaling-lt.c | 8 + ...autovec-double-signaling-ltgt-z13-finite.c | 9 + .../autovec-double-signaling-ltgt-z13.c | 9 + .../zvector/autovec-double-signaling-ltgt.c | 9 + .../s390/zvector/autovec-double-smax-z13.F90 | 11 + .../s390/zvector/autovec-double-smax.F90 | 8 + .../s390/zvector/autovec-double-smin-z13.F90 | 11 + .../s390/zvector/autovec-double-smin.F90 | 8 + .../s390/zvector/autovec-float-quiet-eq.c | 8 + .../s390/zvector/autovec-float-quiet-ge.c | 8 + .../s390/zvector/autovec-float-quiet-gt.c | 8 + .../s390/zvector/autovec-float-quiet-le.c | 8 + .../s390/zvector/autovec-float-quiet-lt.c | 8 + .../zvector/autovec-float-quiet-ordered.c | 10 + .../s390/zvector/autovec-float-quiet-uneq.c | 10 + .../zvector/autovec-float-quiet-unordered.c | 11 + .../s390/zvector/autovec-float-signaling-ge.c | 8 + .../s390/zvector/autovec-float-signaling-gt.c | 8 + .../s390/zvector/autovec-float-signaling-le.c | 8 + .../s390/zvector/autovec-float-signaling-lt.c | 8 + .../zvector/autovec-float-signaling-ltgt.c | 9 + .../gcc.target/s390/zvector/autovec-fortran.h | 7 + .../autovec-long-double-signaling-ge.c | 8 + .../autovec-long-double-signaling-gt.c | 8 + .../autovec-long-double-signaling-le.c | 8 + .../autovec-long-double-signaling-lt.c | 8 + .../gcc.target/s390/zvector/autovec.h | 40 +++ 66 files changed, 795 insertions(+), 143 deletions(-) create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-eq.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ge.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-gt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-le.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-lt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ordered.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-unordered.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13-finite.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13-finite.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13-finite.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13-finite.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13-finite.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax-z13.F90 create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax.F90 create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin-z13.F90 create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin.F90 create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-eq.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ge.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-gt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-le.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-lt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ordered.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-unordered.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ge.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-gt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-le.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-lt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-fortran.h create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-ge.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-gt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-le.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-lt.c create mode 100644 gcc/testsuite/gcc.target/s390/zvector/autovec.h -- 2.21.0