diff mbox series

[v4,7/7] S/390: Test signaling FP comparison instructions

Message ID 20191001132709.87257-8-iii@linux.ibm.com
State New
Headers show
Series S/390: Use signaling FP comparison instructions | expand

Commit Message

Ilya Leoshkevich Oct. 1, 2019, 1:27 p.m. UTC
gcc/testsuite/ChangeLog:

2019-08-09  Ilya Leoshkevich  <iii@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.
---
 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

Comments

Andreas Krebbel Oct. 7, 2019, 4:27 p.m. UTC | #1
On 01.10.19 15:27,  wrote:
> gcc/testsuite/ChangeLog:
> 
> 2019-08-09  Ilya Leoshkevich  <iii@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
>
Ilya Leoshkevich Oct. 11, 2019, 9:05 a.m. UTC | #2
> Am 07.10.2019 um 18:27 schrieb Andreas Krebbel <krebbel@linux.ibm.com>:
> 
> On 01.10.19 15:27,  wrote:
>> gcc/testsuite/ChangeLog:
>> 
>> 2019-08-09  Ilya Leoshkevich  <iii@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.

I've added -mzarch, tweaked a few expectations, and committed this as

https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=276872
diff mbox series

Patch

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