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