Add instruction veval and builtin vec_evaluate.

gcc/ChangeLog:

        * config/s390/s390-builtins.def (s390_vec_evaluate): Add.
        (s390_veval): Add.
        * config/s390/s390-builtin-types.def: Update accordingly.
        * config/s390/s390.md (UNSPEC_VEC_VEVAL): Add.
        * config/s390/vecintrin.h (vec_evaluate): Define.
        * config/s390/vector.md
        
(*veval<mode>_<logic_op1:logic_op_stringify><logic_op2:logic_op_stringify>):
        Add.
        (veval<mode>): Add.

gcc/testsuite/ChangeLog:

        * gcc.target/s390/vxe3/veval-1.c: New test.
        * gcc.target/s390/vxe3/veval-2.c: New test.
        * gcc.target/s390/vxe3/veval-3.c: New test.
        * gcc.target/s390/vxe3/veval-4.c: New test.
        * gcc.target/s390/vxe3/veval-5.c: New test.
        * gcc.target/s390/vxe3/veval-6.c: New test.
        * gcc.target/s390/vxe3/veval-7.c: New test.
        * gcc.target/s390/vxe3/veval-8.c: New test.
        * gcc.target/s390/vxe3/veval-9.c: New test.
---
 gcc/config/s390/s390-builtin-types.def       | 16 +++++++++
 gcc/config/s390/s390-builtins.def            | 19 +++++++++++
 gcc/config/s390/s390.md                      |  1 +
 gcc/config/s390/vecintrin.h                  |  1 +
 gcc/config/s390/vector.md                    | 36 ++++++++++++++++++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-1.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-2.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-3.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-4.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-5.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-6.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-7.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-8.c |  9 +++++
 gcc/testsuite/gcc.target/s390/vxe3/veval-9.c |  9 +++++
 14 files changed, 154 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-1.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-2.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-3.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-4.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-5.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-6.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-7.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-8.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vxe3/veval-9.c

diff --git a/gcc/config/s390/s390-builtin-types.def 
b/gcc/config/s390/s390-builtin-types.def
index 14f4e92a858..1d361c27f63 100644
--- a/gcc/config/s390/s390-builtin-types.def
+++ b/gcc/config/s390/s390-builtin-types.def
@@ -378,6 +378,7 @@ DEF_FN_TYPE_3 (BT_FN_VOID_OV4SI_INT_VOIDPTR, BT_VOID, 
BT_OV4SI, BT_INT, BT_VOIDP
 DEF_FN_TYPE_3 (BT_FN_VOID_OV4SI_VOIDPTR_UINT, BT_VOID, BT_OV4SI, BT_VOIDPTR, 
BT_UINT)
 DEF_FN_TYPE_3 (BT_FN_VOID_V16QI_UINT_VOIDPTR, BT_VOID, BT_V16QI, BT_UINT, 
BT_VOIDPTR)
 DEF_FN_TYPE_4 (BT_FN_OV4SI_OV4SI_OUV4SI_INTCONSTPTR_UCHAR, BT_OV4SI, BT_OV4SI, 
BT_OUV4SI, BT_INTCONSTPTR, BT_UCHAR)
+DEF_FN_TYPE_4 (BT_FN_OV4SI_OV4SI_OV4SI_OV4SI_INT, BT_OV4SI, BT_OV4SI, 
BT_OV4SI, BT_OV4SI, BT_INT)
 DEF_FN_TYPE_4 (BT_FN_OV4SI_OV4SI_OV4SI_OV4SI_INTPTR, BT_OV4SI, BT_OV4SI, 
BT_OV4SI, BT_OV4SI, BT_INTPTR)
 DEF_FN_TYPE_4 (BT_FN_UINT128_UV2DI_UV2DI_UINT128_INT, BT_UINT128, BT_UV2DI, 
BT_UV2DI, BT_UINT128, BT_INT)
 DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_INT_INTPTR, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_INT, BT_INTPTR)
@@ -403,6 +404,7 @@ DEF_FN_TYPE_5 (BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INT_INTPTR, 
BT_UV8HI, BT_UV8HI, BT_
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI, BT_BV16QI, BT_BV16QI)
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI, BT_BV16QI, BT_BV16QI, BT_BV16QI)
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI_BV16QI, BT_BV16QI, BT_BV16QI, 
BT_BV16QI, BT_BV16QI)
+DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI_BV16QI_INT, BT_BV16QI, BT_BV16QI, 
BT_BV16QI, BT_BV16QI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI_INTPTR, BT_BV16QI, BT_BV16QI, 
BT_BV16QI, BT_INTPTR)
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI_ULONGLONG, BT_BV16QI, BT_BV16QI, 
BT_BV16QI, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_BV16QI_BV16QI_BV16QI_UV16QI, BT_BV16QI, BT_BV16QI, 
BT_BV16QI, BT_UV16QI)
@@ -421,6 +423,7 @@ DEF_OV_TYPE (BT_OV_BV16QI_V16QI_V16QI, BT_BV16QI, BT_V16QI, 
BT_V16QI)
 DEF_OV_TYPE (BT_OV_BV16QI_V16QI_V16QI_INTPTR, BT_BV16QI, BT_V16QI, BT_V16QI, 
BT_INTPTR)
 DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI, BT_BV1TI, BT_BV1TI, BT_BV1TI)
 DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI_BV1TI, BT_BV1TI, BT_BV1TI, BT_BV1TI, 
BT_BV1TI)
+DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI_BV1TI_INT, BT_BV1TI, BT_BV1TI, BT_BV1TI, 
BT_BV1TI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI_UV16QI, BT_BV1TI, BT_BV1TI, BT_BV1TI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI_UV1TI, BT_BV1TI, BT_BV1TI, BT_BV1TI, 
BT_UV1TI)
 DEF_OV_TYPE (BT_OV_BV1TI_BV1TI_BV1TI_V1TI, BT_BV1TI, BT_BV1TI, BT_BV1TI, 
BT_V1TI)
@@ -429,6 +432,7 @@ DEF_OV_TYPE (BT_OV_BV2DI_BV1TI_BV1TI, BT_BV2DI, BT_BV1TI, 
BT_BV1TI)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI, BT_BV2DI, BT_BV2DI)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI, BT_BV2DI, BT_BV2DI, BT_BV2DI)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI_BV2DI, BT_BV2DI, BT_BV2DI, BT_BV2DI, 
BT_BV2DI)
+DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI_BV2DI_INT, BT_BV2DI, BT_BV2DI, BT_BV2DI, 
BT_BV2DI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI_INT, BT_BV2DI, BT_BV2DI, BT_BV2DI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI_ULONGLONG, BT_BV2DI, BT_BV2DI, BT_BV2DI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_BV2DI_BV2DI_BV2DI_UV16QI, BT_BV2DI, BT_BV2DI, BT_BV2DI, 
BT_UV16QI)
@@ -448,6 +452,7 @@ DEF_OV_TYPE (BT_OV_BV4SI_BV2DI_BV2DI, BT_BV4SI, BT_BV2DI, 
BT_BV2DI)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI, BT_BV4SI, BT_BV4SI)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI, BT_BV4SI, BT_BV4SI, BT_BV4SI)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI_BV4SI, BT_BV4SI, BT_BV4SI, BT_BV4SI, 
BT_BV4SI)
+DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI_BV4SI_INT, BT_BV4SI, BT_BV4SI, BT_BV4SI, 
BT_BV4SI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI_INTPTR, BT_BV4SI, BT_BV4SI, BT_BV4SI, 
BT_INTPTR)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI_ULONGLONG, BT_BV4SI, BT_BV4SI, BT_BV4SI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_BV4SI_BV4SI_BV4SI_UV16QI, BT_BV4SI, BT_BV4SI, BT_BV4SI, 
BT_UV16QI)
@@ -473,6 +478,7 @@ DEF_OV_TYPE (BT_OV_BV8HI_BV4SI_BV4SI, BT_BV8HI, BT_BV4SI, 
BT_BV4SI)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI, BT_BV8HI, BT_BV8HI)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI, BT_BV8HI, BT_BV8HI, BT_BV8HI)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI_BV8HI, BT_BV8HI, BT_BV8HI, BT_BV8HI, 
BT_BV8HI)
+DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI_BV8HI_INT, BT_BV8HI, BT_BV8HI, BT_BV8HI, 
BT_BV8HI, BT_INT)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI_INTPTR, BT_BV8HI, BT_BV8HI, BT_BV8HI, 
BT_INTPTR)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI_ULONGLONG, BT_BV8HI, BT_BV8HI, BT_BV8HI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_BV8HI_BV8HI_BV8HI_UV16QI, BT_BV8HI, BT_BV8HI, BT_BV8HI, 
BT_UV16QI)
@@ -568,6 +574,7 @@ DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_UCHAR, BT_UV16QI, 
BT_UV16QI, BT_UV16QI,
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_UINT, BT_UV16QI, BT_UV16QI, BT_UV16QI, 
BT_UINT)
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_ULONGLONG, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_UV16QI, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_UV16QI)
+DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_UV16QI_INT, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_UV16QI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_UV16QI, BT_INTPTR)
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV16QI_V16QI, BT_UV16QI, BT_UV16QI, 
BT_UV16QI, BT_V16QI)
 DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV4SI, BT_UV16QI, BT_UV16QI, BT_UV4SI)
@@ -592,6 +599,7 @@ DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_UV1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_BV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_BV1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV16QI, BT_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_UV1TI)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV1TI_INT, BT_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_UV1TI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_V1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, 
BT_V1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV2DI, BT_UV1TI, BT_UV2DI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV2DI_UV2DI, BT_UV1TI, BT_UV2DI, BT_UV2DI)
@@ -622,6 +630,7 @@ DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_ULONGLONG, BT_UV2DI, 
BT_UV2DI, BT_UV2DI, BT
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_ULONGLONGCONSTPTR_UCHAR, BT_UV2DI, 
BT_UV2DI, BT_UV2DI, BT_ULONGLONGCONSTPTR, BT_UCHAR)
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_UV16QI, BT_UV2DI, BT_UV2DI, BT_UV2DI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_UV2DI, BT_UV2DI, BT_UV2DI, BT_UV2DI, 
BT_UV2DI)
+DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_UV2DI_INT, BT_UV2DI, BT_UV2DI, BT_UV2DI, 
BT_UV2DI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV2DI_V2DI, BT_UV2DI, BT_UV2DI, BT_UV2DI, 
BT_V2DI)
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV4SI, BT_UV2DI, BT_UV2DI, BT_UV4SI)
 DEF_OV_TYPE (BT_OV_UV2DI_UV2DI_UV8HI, BT_UV2DI, BT_UV2DI, BT_UV8HI)
@@ -662,6 +671,7 @@ DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_UINTCONSTPTR_UCHAR, 
BT_UV4SI, BT_UV4SI, BT_
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_ULONGLONG, BT_UV4SI, BT_UV4SI, BT_UV4SI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_UV16QI, BT_UV4SI, BT_UV4SI, BT_UV4SI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_UV4SI, BT_UV4SI, BT_UV4SI, BT_UV4SI, 
BT_UV4SI)
+DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_UV4SI_INT, BT_UV4SI, BT_UV4SI, BT_UV4SI, 
BT_UV4SI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_UV4SI_INTPTR, BT_UV4SI, BT_UV4SI, 
BT_UV4SI, BT_UV4SI, BT_INTPTR)
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV4SI_V4SI, BT_UV4SI, BT_UV4SI, BT_UV4SI, 
BT_V4SI)
 DEF_OV_TYPE (BT_OV_UV4SI_UV4SI_UV8HI, BT_UV4SI, BT_UV4SI, BT_UV8HI)
@@ -704,6 +714,7 @@ DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_UINT, BT_UV8HI, 
BT_UV8HI, BT_UV8HI, BT_UINT
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_ULONGLONG, BT_UV8HI, BT_UV8HI, BT_UV8HI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_UV16QI, BT_UV8HI, BT_UV8HI, BT_UV8HI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_UV8HI, BT_UV8HI, BT_UV8HI, BT_UV8HI, 
BT_UV8HI)
+DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_UV8HI_INT, BT_UV8HI, BT_UV8HI, BT_UV8HI, 
BT_UV8HI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_UV8HI_INTPTR, BT_UV8HI, BT_UV8HI, 
BT_UV8HI, BT_UV8HI, BT_INTPTR)
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_UV8HI_V8HI, BT_UV8HI, BT_UV8HI, BT_UV8HI, 
BT_V8HI)
 DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_V8HI, BT_UV8HI, BT_UV8HI, BT_V8HI)
@@ -736,6 +747,7 @@ DEF_OV_TYPE (BT_OV_V16QI_V16QI_V16QI_UINT, BT_V16QI, 
BT_V16QI, BT_V16QI, BT_UINT
 DEF_OV_TYPE (BT_OV_V16QI_V16QI_V16QI_ULONGLONG, BT_V16QI, BT_V16QI, BT_V16QI, 
BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_V16QI_V16QI_V16QI_UV16QI, BT_V16QI, BT_V16QI, BT_V16QI, 
BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V16QI_V16QI_V16QI_V16QI, BT_V16QI, BT_V16QI, BT_V16QI, 
BT_V16QI)
+DEF_OV_TYPE (BT_OV_V16QI_V16QI_V16QI_V16QI_INT, BT_V16QI, BT_V16QI, BT_V16QI, 
BT_V16QI, BT_INT)
 DEF_OV_TYPE (BT_OV_V16QI_V8HI_V8HI, BT_V16QI, BT_V8HI, BT_V8HI)
 DEF_OV_TYPE (BT_OV_V16QI_V8HI_V8HI_INTPTR, BT_V16QI, BT_V8HI, BT_V8HI, 
BT_INTPTR)
 DEF_OV_TYPE (BT_OV_V1TI_INT128, BT_V1TI, BT_INT128)
@@ -749,6 +761,7 @@ DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_BV1TI, BT_V1TI, BT_V1TI, 
BT_V1TI, BT_BV1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_UV16QI, BT_V1TI, BT_V1TI, BT_V1TI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_UV1TI, BT_V1TI, BT_V1TI, BT_V1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_V1TI, BT_V1TI, BT_V1TI, BT_V1TI, BT_V1TI)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_V1TI_INT, BT_V1TI, BT_V1TI, BT_V1TI, 
BT_V1TI, BT_INT)
 DEF_OV_TYPE (BT_OV_V1TI_V2DI, BT_V1TI, BT_V2DI)
 DEF_OV_TYPE (BT_OV_V1TI_V2DI_V2DI, BT_V1TI, BT_V2DI, BT_V2DI)
 DEF_OV_TYPE (BT_OV_V1TI_V2DI_V2DI_V1TI, BT_V1TI, BT_V2DI, BT_V2DI, BT_V1TI)
@@ -812,6 +825,7 @@ DEF_OV_TYPE (BT_OV_V2DI_V2DI_V2DI_ULONGLONG, BT_V2DI, 
BT_V2DI, BT_V2DI, BT_ULONG
 DEF_OV_TYPE (BT_OV_V2DI_V2DI_V2DI_UV16QI, BT_V2DI, BT_V2DI, BT_V2DI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V2DI_V2DI_V2DI_UV2DI, BT_V2DI, BT_V2DI, BT_V2DI, BT_UV2DI)
 DEF_OV_TYPE (BT_OV_V2DI_V2DI_V2DI_V2DI, BT_V2DI, BT_V2DI, BT_V2DI, BT_V2DI)
+DEF_OV_TYPE (BT_OV_V2DI_V2DI_V2DI_V2DI_INT, BT_V2DI, BT_V2DI, BT_V2DI, 
BT_V2DI, BT_INT)
 DEF_OV_TYPE (BT_OV_V2DI_V4SI, BT_V2DI, BT_V4SI)
 DEF_OV_TYPE (BT_OV_V2DI_V4SI_V4SI, BT_V2DI, BT_V4SI, BT_V4SI)
 DEF_OV_TYPE (BT_OV_V2DI_V4SI_V4SI_V2DI, BT_V2DI, BT_V4SI, BT_V4SI, BT_V2DI)
@@ -873,6 +887,7 @@ DEF_OV_TYPE (BT_OV_V4SI_V4SI_V4SI_ULONGLONG, BT_V4SI, 
BT_V4SI, BT_V4SI, BT_ULONG
 DEF_OV_TYPE (BT_OV_V4SI_V4SI_V4SI_UV16QI, BT_V4SI, BT_V4SI, BT_V4SI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V4SI_V4SI_V4SI_UV4SI, BT_V4SI, BT_V4SI, BT_V4SI, BT_UV4SI)
 DEF_OV_TYPE (BT_OV_V4SI_V4SI_V4SI_V4SI, BT_V4SI, BT_V4SI, BT_V4SI, BT_V4SI)
+DEF_OV_TYPE (BT_OV_V4SI_V4SI_V4SI_V4SI_INT, BT_V4SI, BT_V4SI, BT_V4SI, 
BT_V4SI, BT_INT)
 DEF_OV_TYPE (BT_OV_V4SI_V8HI, BT_V4SI, BT_V8HI)
 DEF_OV_TYPE (BT_OV_V4SI_V8HI_V8HI, BT_V4SI, BT_V8HI, BT_V8HI)
 DEF_OV_TYPE (BT_OV_V4SI_V8HI_V8HI_V4SI, BT_V4SI, BT_V8HI, BT_V8HI, BT_V4SI)
@@ -909,6 +924,7 @@ DEF_OV_TYPE (BT_OV_V8HI_V8HI_V8HI_ULONGLONG, BT_V8HI, 
BT_V8HI, BT_V8HI, BT_ULONG
 DEF_OV_TYPE (BT_OV_V8HI_V8HI_V8HI_UV16QI, BT_V8HI, BT_V8HI, BT_V8HI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V8HI_V8HI_V8HI_UV8HI, BT_V8HI, BT_V8HI, BT_V8HI, BT_UV8HI)
 DEF_OV_TYPE (BT_OV_V8HI_V8HI_V8HI_V8HI, BT_V8HI, BT_V8HI, BT_V8HI, BT_V8HI)
+DEF_OV_TYPE (BT_OV_V8HI_V8HI_V8HI_V8HI_INT, BT_V8HI, BT_V8HI, BT_V8HI, 
BT_V8HI, BT_INT)
 DEF_OV_TYPE (BT_OV_VOID_BV2DI_UV2DI_ULONGLONGPTR_ULONGLONG, BT_VOID, BT_BV2DI, 
BT_UV2DI, BT_ULONGLONGPTR, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_VOID_BV4SI_UV4SI_UINTPTR_ULONGLONG, BT_VOID, BT_BV4SI, 
BT_UV4SI, BT_UINTPTR, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_VOID_UV16QI_LONG_UCHARPTR, BT_VOID, BT_UV16QI, BT_LONG, 
BT_UCHARPTR)
diff --git a/gcc/config/s390/s390-builtins.def 
b/gcc/config/s390/s390-builtins.def
index 4764c43a8fd..9e861b122f3 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -3194,3 +3194,22 @@ B_DEF      (s390_vblendh,               vblendv8hi,      
   0,
 B_DEF      (s390_vblendf,               vblendv4si,         0,                 
 B_VXE3,             0,                  BT_FN_UV4SI_UV4SI_UV4SI_V4SI)
 B_DEF      (s390_vblendg,               vblendv2di,         0,                 
 B_VXE3,             0,                  BT_FN_UV2DI_UV2DI_UV2DI_V2DI)
 B_DEF      (s390_vblendq,               vblendti,           0,                 
 B_VXE3,             0,                  BT_FN_UINT128_UINT128_UINT128_INT128)
+
+OB_DEF     (s390_vec_evaluate,          
s390_vec_evaluate_s8,s390_vec_evaluate_u128,B_VXE3,         
BT_FN_OV4SI_OV4SI_OV4SI_OV4SI_INT)
+OB_DEF_VAR (s390_vec_evaluate_s8,       s390_veval,         0,                 
 O4_U8,              BT_OV_V16QI_V16QI_V16QI_V16QI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_b8,       s390_veval,         0,                 
 O4_U8,              BT_OV_BV16QI_BV16QI_BV16QI_BV16QI_INT)    /* veval */
+OB_DEF_VAR (s390_vec_evaluate_u8,       s390_veval,         0,                 
 O4_U8,              BT_OV_UV16QI_UV16QI_UV16QI_UV16QI_INT)    /* veval */
+OB_DEF_VAR (s390_vec_evaluate_s16,      s390_veval,         0,                 
 O4_U8,              BT_OV_V8HI_V8HI_V8HI_V8HI_INT)            /* veval */
+OB_DEF_VAR (s390_vec_evaluate_b16,      s390_veval,         0,                 
 O4_U8,              BT_OV_BV8HI_BV8HI_BV8HI_BV8HI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_u16,      s390_veval,         0,                 
 O4_U8,              BT_OV_UV8HI_UV8HI_UV8HI_UV8HI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_s32,      s390_veval,         0,                 
 O4_U8,              BT_OV_V4SI_V4SI_V4SI_V4SI_INT)            /* veval */
+OB_DEF_VAR (s390_vec_evaluate_b32,      s390_veval,         0,                 
 O4_U8,              BT_OV_BV4SI_BV4SI_BV4SI_BV4SI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_u32,      s390_veval,         0,                 
 O4_U8,              BT_OV_UV4SI_UV4SI_UV4SI_UV4SI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_s64,      s390_veval,         0,                 
 O4_U8,              BT_OV_V2DI_V2DI_V2DI_V2DI_INT)            /* veval */
+OB_DEF_VAR (s390_vec_evaluate_b64,      s390_veval,         0,                 
 O4_U8,              BT_OV_BV2DI_BV2DI_BV2DI_BV2DI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_u64,      s390_veval,         0,                 
 O4_U8,              BT_OV_UV2DI_UV2DI_UV2DI_UV2DI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_s128,     s390_veval,         0,                 
 O4_U8,              BT_OV_V1TI_V1TI_V1TI_V1TI_INT)            /* veval */
+OB_DEF_VAR (s390_vec_evaluate_b128,     s390_veval,         0,                 
 O4_U8,              BT_OV_BV1TI_BV1TI_BV1TI_BV1TI_INT)        /* veval */
+OB_DEF_VAR (s390_vec_evaluate_u128,     s390_veval,         0,                 
 O4_U8,              BT_OV_UV1TI_UV1TI_UV1TI_UV1TI_INT)        /* veval */
+
+B_DEF      (s390_veval,                 vevalv16qi,         0,                 
 B_VXE3,             O4_U8,              BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INT)
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index dbfc67fd401..53c4170ee46 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -245,6 +245,7 @@
    UNSPEC_VEC_VFMAX
 
    UNSPEC_VEC_VBLEND
+   UNSPEC_VEC_VEVAL
 
    UNSPEC_TF_TO_FPRX2
 
diff --git a/gcc/config/s390/vecintrin.h b/gcc/config/s390/vecintrin.h
index 3f957972c1f..01aedc6f082 100644
--- a/gcc/config/s390/vecintrin.h
+++ b/gcc/config/s390/vecintrin.h
@@ -234,6 +234,7 @@ __lcbb(const void *ptr, int bndry)
 #define vec_ctul __builtin_s390_vec_ctul
 #define vec_double __builtin_s390_vec_double
 #define vec_eqv __builtin_s390_vec_eqv
+#define vec_evaluate __builtin_s390_vec_evaluate
 #define vec_extend_s64 __builtin_s390_vec_extend_s64
 #define vec_extract __builtin_s390_vec_extract
 #define vec_find_any_eq __builtin_s390_vec_find_any_eq
diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index b5941a814c1..06641bfcc7b 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -3256,6 +3256,42 @@
   DONE;
 });;
 
+(define_code_iterator LOGIC_OP1 [and ior xor])
+(define_code_iterator LOGIC_OP2 [and ior xor])
+(define_code_attr logic_op [(and "&") (ior "|") (xor "^")])
+(define_code_attr logic_op_stringify [(and "and") (ior "ior") (xor "xor")])
+
+(define_insn_and_split 
"*veval<mode>_<LOGIC_OP1:logic_op_stringify><LOGIC_OP2:logic_op_stringify>"
+  [(set (match_operand:VIT   0 "register_operand" "=v")
+        (LOGIC_OP1:VIT
+        (LOGIC_OP2:VIT
+         (match_operand:VIT 1 "register_operand"  "v")
+         (match_operand:VIT 2 "register_operand"  "v"))
+        (match_operand:VIT  3 "register_operand"  "v")))]
+  "TARGET_VXE3"
+  "#"
+  "&& true"
+  [(set (match_dup 0)
+       (unspec:VIT [(match_dup 3)
+                    (match_dup 1)
+                    (match_dup 2)
+                    (match_dup 4)]
+                   UNSPEC_VEC_VEVAL))]
+{
+  int op = 15 <LOGIC_OP1:logic_op> (23 <LOGIC_OP2:logic_op> 113);
+  operands[4] = GEN_INT (op);
+})
+
+(define_insn "veval<mode>"
+  [(set (match_operand:VIT              0 "register_operand" "=v")
+       (unspec:VIT [(match_operand:VIT 1 "register_operand"  "v")
+                    (match_operand:VIT 2 "register_operand"  "v")
+                    (match_operand:VIT 3 "register_operand"  "v")
+                    (match_operand:QI  4 "const_int_operand")]
+                   UNSPEC_VEC_VEVAL))]
+  "TARGET_VXE3"
+  "veval\t%v0,%v1,%v2,%v3,%b4"
+  [(set_attr "op_type" "VRI")])
 
 ; reduc_smin
 ; reduc_smax
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-1.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-1.c
new file mode 100644
index 00000000000..a05c999a835
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-1.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,1} 8 } } */
+
+void
+and_and (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = x[i] & y[i] & z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-2.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-2.c
new file mode 100644
index 00000000000..ba75870f7bb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-2.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,31} 8 } } */
+
+void
+and_ior (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] & y[i]) | z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-3.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-3.c
new file mode 100644
index 00000000000..ae2a981ef86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-3.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,30} 8 } } */
+
+void
+and_xor (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] & y[i]) ^ z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-4.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-4.c
new file mode 100644
index 00000000000..d67ee2b05b5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-4.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,127} 8 } } */
+
+void
+ior_ior (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = x[i] | y[i] | z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-5.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-5.c
new file mode 100644
index 00000000000..a892f37f30e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-5.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,7} 8 } } */
+
+void
+ior_and (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] | y[i]) & z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-6.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-6.c
new file mode 100644
index 00000000000..3ffd7cb7969
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-6.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,120} 8 } } */
+
+void
+ior_xor (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] | y[i]) ^ z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-7.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-7.c
new file mode 100644
index 00000000000..c7bbbbfb039
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-7.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,105} 8 } } */
+
+void
+xor_xor (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = x[i] ^ y[i] ^ z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-8.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-8.c
new file mode 100644
index 00000000000..032f7286bc9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-8.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,6} 8 } } */
+
+void
+xor_and (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] ^ y[i]) & z[i];
+}
diff --git a/gcc/testsuite/gcc.target/s390/vxe3/veval-9.c 
b/gcc/testsuite/gcc.target/s390/vxe3/veval-9.c
new file mode 100644
index 00000000000..fa4dce21ac5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vxe3/veval-9.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times 
{\tveval\t%v[0-9]+,%v[0-9]+,%v[0-9]+,%v[0-9]+,111} 8 } } */
+
+void
+xor_ior (char *res, char *x, char *y, char *z)
+{
+  for (int i = 0; i < 128; ++i)
+    res[i] = (x[i] ^ y[i]) | z[i];
+}
-- 
2.47.0

Reply via email to