On 01.10.19 15:27, wrote: > gcc/testsuite/ChangeLog: > > 2019-08-09 Ilya Leoshkevich <i...@linux.ibm.com> > > PR target/77918 > * gcc.target/s390/s390.exp: Enable Fortran tests. > * gcc.target/s390/zvector/autovec-double-quiet-eq.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-ge.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-gt.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-le.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-lt.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-ordered.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-uneq.c: New test. > * gcc.target/s390/zvector/autovec-double-quiet-unordered.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-eq-z13-finite.c: New > test. > * gcc.target/s390/zvector/autovec-double-signaling-eq-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-eq.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-ge-z13-finite.c: New > test. > * gcc.target/s390/zvector/autovec-double-signaling-ge-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-ge.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-gt-z13-finite.c: New > test. > * gcc.target/s390/zvector/autovec-double-signaling-gt-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-gt.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-le-z13-finite.c: New > test. > * gcc.target/s390/zvector/autovec-double-signaling-le-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-le.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-lt-z13-finite.c: New > test. > * gcc.target/s390/zvector/autovec-double-signaling-lt-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-lt.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13-finite.c: > New test. > * gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13.c: New test. > * gcc.target/s390/zvector/autovec-double-signaling-ltgt.c: New test. > * gcc.target/s390/zvector/autovec-double-smax-z13.F90: New test. > * gcc.target/s390/zvector/autovec-double-smax.F90: New test. > * gcc.target/s390/zvector/autovec-double-smin-z13.F90: New test. > * gcc.target/s390/zvector/autovec-double-smin.F90: New test. > * gcc.target/s390/zvector/autovec-float-quiet-eq.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-ge.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-gt.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-le.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-lt.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-ordered.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-uneq.c: New test. > * gcc.target/s390/zvector/autovec-float-quiet-unordered.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-eq.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-ge.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-gt.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-le.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-lt.c: New test. > * gcc.target/s390/zvector/autovec-float-signaling-ltgt.c: New test. > * gcc.target/s390/zvector/autovec-fortran.h: New test. > * gcc.target/s390/zvector/autovec-long-double-signaling-ge.c: New test. > * gcc.target/s390/zvector/autovec-long-double-signaling-gt.c: New test. > * gcc.target/s390/zvector/autovec-long-double-signaling-le.c: New test. > * gcc.target/s390/zvector/autovec-long-double-signaling-lt.c: New test. > * gcc.target/s390/zvector/autovec.h: New test.
Do these tests work on 32 bit? We need -mzarch to make the vector instructions available there. Ok, if clean on 32 and 64 bit. Thanks! Andreas > --- > gcc/testsuite/gcc.target/s390/s390.exp | 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-eq-z13-finite.c | 10 +++++ > .../zvector/autovec-double-signaling-eq-z13.c | 9 ++++ > .../zvector/autovec-double-signaling-eq.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-eq.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 | 41 +++++++++++++++++++ > 51 files changed, 485 insertions(+) > 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-eq-z13-finite.c > create mode 100644 > gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13.c > create mode 100644 > gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq.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-eq.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 > > diff --git a/gcc/testsuite/gcc.target/s390/s390.exp > b/gcc/testsuite/gcc.target/s390/s390.exp > index 86f7e4398eb..925eb568832 100644 > --- a/gcc/testsuite/gcc.target/s390/s390.exp > +++ b/gcc/testsuite/gcc.target/s390/s390.exp > @@ -27,6 +27,7 @@ if ![istarget s390*-*-*] then { > # Load support procs. > load_lib gcc-dg.exp > load_lib target-supports.exp > +load_lib gfortran-dg.exp > > # Return 1 if the the assembler understands .machine and .machinemode. The > # target attribute needs that feature to work. > @@ -193,6 +194,10 @@ global DEFAULT_CFLAGS > if ![info exists DEFAULT_CFLAGS] then { > set DEFAULT_CFLAGS " -ansi -pedantic-errors" > } > +global DEFAULT_FFLAGS > +if ![info exists DEFAULT_FFLAGS] then { > + set DEFAULT_FFLAGS " -pedantic-errors" > +} > > # Initialize `dg'. > dg-init > @@ -209,6 +214,9 @@ dg-runtest [lsort [prune [glob -nocomplain > $srcdir/$subdir/*.{c,S}] \ > dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*vector*/*.{c,S}]] \ > "" $DEFAULT_CFLAGS > > +gfortran-dg-runtest [lsort [glob -nocomplain > $srcdir/$subdir/*vector*/*.F90]] \ > + "" $DEFAULT_FFLAGS > + > dg-runtest [lsort [glob -nocomplain > $srcdir/$subdir/target-attribute/*.{c,S}]] \ > "" $DEFAULT_CFLAGS > > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-eq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-eq.c > new file mode 100644 > index 00000000000..dad138770c8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-eq.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_EQ); > + > +/* { dg-final { scan-assembler {\n\tvfcedb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ge.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ge.c > new file mode 100644 > index 00000000000..9fddb62573f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ge.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_GE); > + > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-gt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-gt.c > new file mode 100644 > index 00000000000..eb512f84c47 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-gt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_GT); > + > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-le.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-le.c > new file mode 100644 > index 00000000000..c049f8b7dee > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-le.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_LE); > + > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-lt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-lt.c > new file mode 100644 > index 00000000000..b6f7702ecd0 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-lt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_LT); > + > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ordered.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ordered.c > new file mode 100644 > index 00000000000..bf8ebd4ab6a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-ordered.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_ORDERED); > + > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c > new file mode 100644 > index 00000000000..421fb5e7ba5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-uneq.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_UNEQ); > + > +/* { dg-final { scan-assembler-times {\n\tvfchdb\t} 2 } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > +/* { dg-final { scan-assembler {\n\tvx\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-unordered.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-unordered.c > new file mode 100644 > index 00000000000..c42f7930ad8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-quiet-unordered.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (QUIET_UNORDERED); > + > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > +/* combine prefers to reorder vsel args instead of using vno. */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13-finite.c > new file mode 100644 > index 00000000000..e3d42eaf3ad > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13-finite.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_EQ); > + > +/* We can use non-signaling vector comparison instructions with > + -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfcedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13.c > new file mode 100644 > index 00000000000..f6110328891 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_EQ); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdbr\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq.c > new file mode 100644 > index 00000000000..32088cb55b4 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-eq.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_EQ); > + > +/* The vectorizer produces <= and ==, which rtl passes cannot turn into > vfkedb > + yet. */ > +/* { dg-final { scan-assembler {\n\tvfcedb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfkhedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13-finite.c > new file mode 100644 > index 00000000000..b301d1b739b > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13-finite.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GE); > + > +/* We can use non-signaling vector comparison instructions with > + -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13.c > new file mode 100644 > index 00000000000..ee83f3405c8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GE); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge.c > new file mode 100644 > index 00000000000..bcb4c868a15 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ge.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GE); > + > +/* { dg-final { scan-assembler {\n\tvfkhedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13-finite.c > new file mode 100644 > index 00000000000..c49764447f3 > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13-finite.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GT); > + > +/* We can use non-signaling vector comparison instructions with > + -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13.c > new file mode 100644 > index 00000000000..6b9c11997a6 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GT); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt.c > new file mode 100644 > index 00000000000..e423ed0f78c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-gt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_GT); > + > +/* { dg-final { scan-assembler {\n\tvfkhdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13-finite.c > new file mode 100644 > index 00000000000..7fa559b5701 > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13-finite.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LE); > + > +/* We can use non-signaling vector comparison instructions with > + -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfchedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13.c > new file mode 100644 > index 00000000000..a80ac20b905 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LE); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le.c > new file mode 100644 > index 00000000000..b97bebaaf8f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-le.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LE); > + > +/* { dg-final { scan-assembler {\n\tvfkhedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13-finite.c > new file mode 100644 > index 00000000000..3305a98379c > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13-finite.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LT); > + > +/* We can use non-signaling vector comparison instructions with > + -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfchdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13.c > new file mode 100644 > index 00000000000..8b398a28c37 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LT); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt.c > new file mode 100644 > index 00000000000..b01272d00a5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-lt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LT); > + > +/* { dg-final { scan-assembler {\n\tvfkhdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13-finite.c > > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13-finite.c > new file mode 100644 > index 00000000000..76730d70968 > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13-finite.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector -ffinite-math-only" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LTGT); > + > +/* ltgt is the same as eq with -ffinite-math-only. */ > +/* { dg-final { scan-assembler {\n\tvfcedb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13.c > new file mode 100644 > index 00000000000..d466697499a > --- /dev/null > +++ > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt-z13.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z13 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LTGT); > + > +/* z13 does not have signaling vector comparison instructions. */ > +/* { dg-final { scan-assembler {\n\tkdb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c > new file mode 100644 > index 00000000000..645f299a9fc > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-signaling-ltgt.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_DOUBLE (SIGNALING_LTGT); > + > +/* { dg-final { scan-assembler-times {\n\tvfkhdb\t} 2 } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax-z13.F90 > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax-z13.F90 > new file mode 100644 > index 00000000000..b114082df59 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax-z13.F90 > @@ -0,0 +1,11 @@ > +! { dg-do compile } > +! { dg-options "-ffree-line-length-256 -O3 -march=z13 -mzvector" } > + > +#include "autovec-fortran.h" > + > +AUTOVEC_FORTRAN (max) > + > +! Fortran's max does not specify whether or not an exception should be > raised in > +! face of qNaNs, and neither does gcc's smax. Vectorize max using quiet > +! comparison, because that's the only one we have on z13. > +! { dg-final { scan-assembler {\n\tvfchdb\t} } } > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax.F90 > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax.F90 > new file mode 100644 > index 00000000000..1698ec4f4db > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smax.F90 > @@ -0,0 +1,8 @@ > +! { dg-do compile } > +! { dg-options "-ffree-line-length-256 -O3 -march=z14 -mzvector" } > + > +#include "autovec-fortran.h" > + > +AUTOVEC_FORTRAN (max) > + > +! { dg-final { scan-assembler {\n\tvfmaxdb\t} } } > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin-z13.F90 > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin-z13.F90 > new file mode 100644 > index 00000000000..fc56e9d6879 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin-z13.F90 > @@ -0,0 +1,11 @@ > +! { dg-do compile } > +! { dg-options "-ffree-line-length-256 -O3 -march=z13 -mzvector" } > + > +#include "autovec-fortran.h" > + > +AUTOVEC_FORTRAN (min) > + > +! Fortran's min does not specify whether or not an exception should be > raised in > +! face of qNaNs, and neither does gcc's smin. Vectorize min using quiet > +! comparison, because that's the only one we have on z13. > +! { dg-final { scan-assembler {\n\tvfchdb\t} } } > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin.F90 > b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin.F90 > new file mode 100644 > index 00000000000..0dd1a33bb84 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-double-smin.F90 > @@ -0,0 +1,8 @@ > +! { dg-do compile } > +! { dg-options "-ffree-line-length-256 -O3 -march=z14 -mzvector" } > + > +#include "autovec-fortran.h" > + > +AUTOVEC_FORTRAN (min) > + > +! { dg-final { scan-assembler {\n\tvfmindb\t} } } > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-eq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-eq.c > new file mode 100644 > index 00000000000..c74927dd028 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-eq.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_EQ); > + > +/* { dg-final { scan-assembler {\n\tvfcesb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ge.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ge.c > new file mode 100644 > index 00000000000..4c7cb09eed5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ge.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_GE); > + > +/* { dg-final { scan-assembler {\n\tvfchesb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-gt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-gt.c > new file mode 100644 > index 00000000000..dd787929b9f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-gt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_GT); > + > +/* { dg-final { scan-assembler {\n\tvfchsb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-le.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-le.c > new file mode 100644 > index 00000000000..5bd1e3e98e7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-le.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_LE); > + > +/* { dg-final { scan-assembler {\n\tvfchesb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-lt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-lt.c > new file mode 100644 > index 00000000000..4938dcfb430 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-lt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_LT); > + > +/* { dg-final { scan-assembler {\n\tvfchsb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ordered.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ordered.c > new file mode 100644 > index 00000000000..222e9efb5f5 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-ordered.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_UNORDERED); > + > +/* { dg-final { scan-assembler {\n\tvfchesb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfchsb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c > new file mode 100644 > index 00000000000..ab5dcac9c34 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-uneq.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_UNEQ); > + > +/* { dg-final { scan-assembler-times {\n\tvfchsb\t} 2 } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > +/* { dg-final { scan-assembler {\n\tvx\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-unordered.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-unordered.c > new file mode 100644 > index 00000000000..c800dce2d7b > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-quiet-unordered.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (QUIET_UNORDERED); > + > +/* { dg-final { scan-assembler {\n\tvfchesb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfchsb\t} } } */ > +/* combine prefers to reorder vsel args instead of using vno. */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-eq.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-eq.c > new file mode 100644 > index 00000000000..ce3271c918c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-eq.c > @@ -0,0 +1,11 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_EQ); > + > +/* The vectorizer produces <= and ==, which rtl passes cannot turn into > vfkesb > + yet. */ > +/* { dg-final { scan-assembler {\n\tvfcesb\t} } } */ > +/* { dg-final { scan-assembler {\n\tvfkhesb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ge.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ge.c > new file mode 100644 > index 00000000000..0f98c5467e8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ge.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_GE); > + > +/* { dg-final { scan-assembler {\n\tvfkhesb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-gt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-gt.c > new file mode 100644 > index 00000000000..762c4c2030c > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-gt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_GT); > + > +/* { dg-final { scan-assembler {\n\tvfkhsb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-le.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-le.c > new file mode 100644 > index 00000000000..ccf0c5c24d1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-le.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_LE); > + > +/* { dg-final { scan-assembler {\n\tvfkhesb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-lt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-lt.c > new file mode 100644 > index 00000000000..b428e5fc52e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-lt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_LT); > + > +/* { dg-final { scan-assembler {\n\tvfkhsb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c > new file mode 100644 > index 00000000000..bf15242a4d7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-float-signaling-ltgt.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_FLOAT (SIGNALING_LTGT); > + > +/* { dg-final { scan-assembler-times {\n\tvfkhsb\t} 2 } } */ > +/* { dg-final { scan-assembler {\n\tvo\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec-fortran.h > b/gcc/testsuite/gcc.target/s390/zvector/autovec-fortran.h > new file mode 100644 > index 00000000000..8e44cb2dd31 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-fortran.h > @@ -0,0 +1,7 @@ > +#define AUTOVEC_FORTRAN(OP) subroutine f (r, x, y); \ > + real(kind=kind (1.0d0)) :: r(1000000), x(1000000), y(1000000); \ > + integer :: i; \ > + do i = 1, 1000000; \ > + r(i) = OP (x(i), y(i)); \ > + end do; \ > +end > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-ge.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-ge.c > new file mode 100644 > index 00000000000..684a6a9b2e2 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-ge.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_LONG_DOUBLE (SIGNALING_GE); > + > +/* { dg-final { scan-assembler {\n\twfkhexb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-gt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-gt.c > new file mode 100644 > index 00000000000..76ade12c7f8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-gt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_LONG_DOUBLE (SIGNALING_GT); > + > +/* { dg-final { scan-assembler {\n\twfkhxb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-le.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-le.c > new file mode 100644 > index 00000000000..a15960ec86a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-le.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_LONG_DOUBLE (SIGNALING_LE); > + > +/* { dg-final { scan-assembler {\n\twfkhexb\t} } } */ > diff --git > a/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-lt.c > b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-lt.c > new file mode 100644 > index 00000000000..046d5487af8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec-long-double-signaling-lt.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -march=z14 -mzvector" } */ > + > +#include "autovec.h" > + > +AUTOVEC_LONG_DOUBLE (SIGNALING_LT); > + > +/* { dg-final { scan-assembler {\n\twfkhxb\t} } } */ > diff --git a/gcc/testsuite/gcc.target/s390/zvector/autovec.h > b/gcc/testsuite/gcc.target/s390/zvector/autovec.h > new file mode 100644 > index 00000000000..d04e5d7e00e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/s390/zvector/autovec.h > @@ -0,0 +1,41 @@ > +#ifndef AUTOVEC_H > +#define AUTOVEC_H 1 > + > +#define QUIET_EQ(x, y) ((x) == (y)) > +#define QUIET_GE __builtin_isgreaterequal > +#define QUIET_GT __builtin_isgreater > +#define QUIET_LE __builtin_islessequal > +#define QUIET_LT __builtin_isless > +#define QUIET_ORDERED(x, y) (!__builtin_isunordered ((x), (y))) > +#define QUIET_UNEQ(x, y) (__builtin_isless ((x), (y)) \ > + || __builtin_isgreater ((x), (y))) > +#define QUIET_UNORDERED __builtin_isunordered > +#define SIGNALING_EQ(x, y) (((x) <= (y)) && ((x) >= (y))) > +#define SIGNALING_GE(x, y) ((x) >= (y)) > +#define SIGNALING_GT(x, y) ((x) > (y)) > +#define SIGNALING_LE(x, y) ((x) <= (y)) > +#define SIGNALING_LT(x, y) ((x) < (y)) > +#define SIGNALING_LTGT(x, y) (((x) < (y)) || ((x) > (y))) > + > +#define AUTOVEC(RESULT_TYPE, OP_TYPE, OP) void \ > +f (RESULT_TYPE *r, const OP_TYPE *x, const OP_TYPE *y) \ > +{ \ > + int i; \ > +\ > + for (i = 0; i < 1000000; i++) \ > + { \ > + OP_TYPE xi = x[i], yi = y[i]; \ > +\ > + r[i] = OP (xi, yi); \ > + } \ > +} > + > +#define AUTOVEC_DOUBLE(OP) AUTOVEC (long, double, OP) > + > +#define AUTOVEC_FLOAT(OP) AUTOVEC (int, float, OP) > + > +typedef __int128 v1ti __attribute__ ((vector_size (16))); > +typedef long double v1tf __attribute__ ((vector_size (16))); > +#define AUTOVEC_LONG_DOUBLE(OP) AUTOVEC (v1ti, v1tf, OP) > + > +#endif >