]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: arch15: Vector eval
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Mon, 20 Jan 2025 09:01:09 +0000 (10:01 +0100)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Mon, 20 Jan 2025 09:01:09 +0000 (10:01 +0100)
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.

14 files changed:
gcc/config/s390/s390-builtin-types.def
gcc/config/s390/s390-builtins.def
gcc/config/s390/s390.md
gcc/config/s390/vecintrin.h
gcc/config/s390/vector.md
gcc/testsuite/gcc.target/s390/vxe3/veval-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/vxe3/veval-9.c [new file with mode: 0644]

index 14f4e92a858b1715555871bd9b3e71229b5efe6b..1d361c27f63d4a36092cc0629c12c56adb7148e9 100644 (file)
@@ -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)
index 4764c43a8fd60a649bdbdc2eee85e585d9fa97ce..9e861b122f3d23a144aa0ae8a571eb908e9b3909 100644 (file)
@@ -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)
index dbfc67fd4010c667d50511330efbb6f91868dd8e..53c4170ee46ef38bf507d5754b09fdd0dc92e7da 100644 (file)
    UNSPEC_VEC_VFMAX
 
    UNSPEC_VEC_VBLEND
+   UNSPEC_VEC_VEVAL
 
    UNSPEC_TF_TO_FPRX2
 
index 3f957972c1f262a2452575fd3532798b05ab2947..01aedc6f082c09b8ef963c5708c4fc261c74c298 100644 (file)
@@ -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
index b5941a814c17e3b06eb9dd95058ba6acb216a3db..06641bfcc7bf6d87b3c5480f8e9124a209939bb8 100644 (file)
   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 (file)
index 0000000..a05c999
--- /dev/null
@@ -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 (file)
index 0000000..ba75870
--- /dev/null
@@ -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 (file)
index 0000000..ae2a981
--- /dev/null
@@ -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 (file)
index 0000000..d67ee2b
--- /dev/null
@@ -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 (file)
index 0000000..a892f37
--- /dev/null
@@ -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 (file)
index 0000000..3ffd7cb
--- /dev/null
@@ -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 (file)
index 0000000..c7bbbbf
--- /dev/null
@@ -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 (file)
index 0000000..032f728
--- /dev/null
@@ -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 (file)
index 0000000..fa4dce2
--- /dev/null
@@ -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];
+}