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