Commit 49adc461 by Andreas Krebbel Committed by Andreas Krebbel

S/390: arch13: vector string search builtins

gcc/ChangeLog:

2019-04-02  Andreas Krebbel  <krebbel@linux.ibm.com>

	* config/s390/s390-builtin-types.def: New builtin function type
	definitions.
	* config/s390/s390-builtins.def (s390_vec_search_string_cc)
	(s390_vec_search_string_until_zero_cc): New overloaded builtins.
	(s390_vstrsb, s390_vstrsh, s390_vstrsf, s390_vstrszb)
	(s390_vstrszh, s390_vstrszf): New low-level builtins.
	* config/s390/s390.md (UNSPEC_VEC_VSTRS, UNSPEC_VEC_VSTRSCC): New
	constant definitions.
	* config/s390/vecintrin.h (vec_search_string_cc)
	(vec_search_string_until_zero_cc): New builtin name definitions.
	* config/s390/vx-builtins.md ("vstrs<mode>", "vstrsz<mode>"): New
	expanders.
	("vec_vstrs<mode>"): New insn definition.

gcc/testsuite/ChangeLog:

2019-04-02  Andreas Krebbel  <krebbel@linux.ibm.com>

	* gcc.target/s390/zvector/vec-search-string-cc-1.c: New test.
	* gcc.target/s390/zvector/vec-search-string-cc-compile.c: New test.
	* gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c: New test.
	* gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c: New test.

From-SVN: r270090
parent ad7a3e39
2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com> 2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com>
* config/s390/s390-builtin-types.def: New builtin function type
definitions.
* config/s390/s390-builtins.def (s390_vec_search_string_cc)
(s390_vec_search_string_until_zero_cc): New overloaded builtins.
(s390_vstrsb, s390_vstrsh, s390_vstrsf, s390_vstrszb)
(s390_vstrszh, s390_vstrszf): New low-level builtins.
* config/s390/s390.md (UNSPEC_VEC_VSTRS, UNSPEC_VEC_VSTRSCC): New
constant definitions.
* config/s390/vecintrin.h (vec_search_string_cc)
(vec_search_string_until_zero_cc): New builtin name definitions.
* config/s390/vx-builtins.md ("vstrs<mode>", "vstrsz<mode>"): New
expanders.
("vec_vstrs<mode>"): New insn definition.
2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com>
* config/s390/s390-builtin-types.def: Add new builtin function * config/s390/s390-builtin-types.def: Add new builtin function
types. types.
* config/s390/s390-builtins.def (s390_vec_sldb, s390_vec_srdb): * config/s390/s390-builtins.def (s390_vec_sldb, s390_vec_srdb):
......
...@@ -351,14 +351,17 @@ DEF_FN_TYPE_4 (BT_FN_OV4SI_OV4SI_OUV4SI_INTCONSTPTR_UCHAR, BT_OV4SI, BT_OV4SI, B ...@@ -351,14 +351,17 @@ DEF_FN_TYPE_4 (BT_FN_OV4SI_OV4SI_OUV4SI_INTCONSTPTR_UCHAR, BT_OV4SI, BT_OV4SI, B
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_OV4SI_OV4SI_OV4SI_OV4SI_INTPTR, BT_OV4SI, BT_OV4SI, BT_OV4SI, BT_OV4SI, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_INT_INTPTR, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_INT, BT_INTPTR) DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_INT_INTPTR, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_INT, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INT, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_INT) DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INT, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_INT)
DEF_FN_TYPE_4 (BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_UV16QI, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV16QI_UV2DI_UV2DI_UV16QI_INT, BT_UV16QI, BT_UV2DI, BT_UV2DI, BT_UV16QI, BT_INT) DEF_FN_TYPE_4 (BT_FN_UV16QI_UV2DI_UV2DI_UV16QI_INT, BT_UV16QI, BT_UV2DI, BT_UV2DI, BT_UV16QI, BT_INT)
DEF_FN_TYPE_4 (BT_FN_UV2DI_UV2DI_UV2DI_ULONGLONGCONSTPTR_UCHAR, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_ULONGLONGCONSTPTR, BT_UCHAR) DEF_FN_TYPE_4 (BT_FN_UV2DI_UV2DI_UV2DI_ULONGLONGCONSTPTR_UCHAR, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_ULONGLONGCONSTPTR, BT_UCHAR)
DEF_FN_TYPE_4 (BT_FN_UV2DI_UV2DI_UV2DI_UV2DI_INT, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_INT) DEF_FN_TYPE_4 (BT_FN_UV2DI_UV2DI_UV2DI_UV2DI_INT, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_UV2DI, BT_INT)
DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_INT_INTPTR, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_INT, BT_INTPTR) DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_INT_INTPTR, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_INT, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_UINTCONSTPTR_UCHAR, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_UINTCONSTPTR, BT_UCHAR) DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_UINTCONSTPTR_UCHAR, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_UINTCONSTPTR, BT_UCHAR)
DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_UV4SI_INT, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_INT) DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_UV4SI_INT, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_INT)
DEF_FN_TYPE_4 (BT_FN_UV4SI_UV4SI_UV4SI_UV8HI_INTPTR, BT_UV4SI, BT_UV4SI, BT_UV4SI, BT_UV8HI, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV8HI_UV8HI_UV8HI_INT_INTPTR, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_INT, BT_INTPTR) DEF_FN_TYPE_4 (BT_FN_UV8HI_UV8HI_UV8HI_INT_INTPTR, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_INT, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INT, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_INT) DEF_FN_TYPE_4 (BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INT, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_INT)
DEF_FN_TYPE_4 (BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INTPTR, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_UV8HI, BT_INTPTR)
DEF_FN_TYPE_4 (BT_FN_VOID_UV2DI_UV2DI_ULONGLONGPTR_ULONGLONG, BT_VOID, BT_UV2DI, BT_UV2DI, BT_ULONGLONGPTR, BT_ULONGLONG) DEF_FN_TYPE_4 (BT_FN_VOID_UV2DI_UV2DI_ULONGLONGPTR_ULONGLONG, BT_VOID, BT_UV2DI, BT_UV2DI, BT_ULONGLONGPTR, BT_ULONGLONG)
DEF_FN_TYPE_4 (BT_FN_VOID_UV4SI_UV4SI_UINTPTR_ULONGLONG, BT_VOID, BT_UV4SI, BT_UV4SI, BT_UINTPTR, BT_ULONGLONG) DEF_FN_TYPE_4 (BT_FN_VOID_UV4SI_UV4SI_UINTPTR_ULONGLONG, BT_VOID, BT_UV4SI, BT_UV4SI, BT_UINTPTR, BT_ULONGLONG)
DEF_FN_TYPE_4 (BT_FN_VOID_V4SI_V4SI_INTPTR_ULONGLONG, BT_VOID, BT_V4SI, BT_V4SI, BT_INTPTR, BT_ULONGLONG) DEF_FN_TYPE_4 (BT_FN_VOID_V4SI_V4SI_INTPTR_ULONGLONG, BT_VOID, BT_V4SI, BT_V4SI, BT_INTPTR, BT_ULONGLONG)
...@@ -495,7 +498,10 @@ DEF_OV_TYPE (BT_OV_USHORT_BV8HI_INT, BT_USHORT, BT_BV8HI, BT_INT) ...@@ -495,7 +498,10 @@ DEF_OV_TYPE (BT_OV_USHORT_BV8HI_INT, BT_USHORT, BT_BV8HI, BT_INT)
DEF_OV_TYPE (BT_OV_USHORT_UV8HI_INT, BT_USHORT, BT_UV8HI, BT_INT) DEF_OV_TYPE (BT_OV_USHORT_UV8HI_INT, BT_USHORT, BT_UV8HI, BT_INT)
DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI, BT_UV16QI, BT_BV16QI, BT_BV16QI) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI, BT_UV16QI, BT_BV16QI, BT_BV16QI)
DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI_INTPTR, BT_UV16QI, BT_BV16QI, BT_BV16QI, BT_INTPTR) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI_INTPTR, BT_UV16QI, BT_BV16QI, BT_BV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI_UV16QI_INTPTR, BT_UV16QI, BT_BV16QI, BT_BV16QI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_UV16QI, BT_UV16QI, BT_BV16QI, BT_UV16QI) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_UV16QI, BT_UV16QI, BT_BV16QI, BT_UV16QI)
DEF_OV_TYPE (BT_OV_UV16QI_BV4SI_BV4SI_UV16QI_INTPTR, BT_UV16QI, BT_BV4SI, BT_BV4SI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_BV8HI_BV8HI_UV16QI_INTPTR, BT_UV16QI, BT_BV8HI, BT_BV8HI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_LONG_UCHARCONSTPTR, BT_UV16QI, BT_LONG, BT_UCHARCONSTPTR) DEF_OV_TYPE (BT_OV_UV16QI_LONG_UCHARCONSTPTR, BT_UV16QI, BT_LONG, BT_UCHARCONSTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_UCHAR, BT_UV16QI, BT_UCHAR) DEF_OV_TYPE (BT_OV_UV16QI_UCHAR, BT_UV16QI, BT_UCHAR)
DEF_OV_TYPE (BT_OV_UV16QI_UCHARCONSTPTR, BT_UV16QI, BT_UCHARCONSTPTR) DEF_OV_TYPE (BT_OV_UV16QI_UCHARCONSTPTR, BT_UV16QI, BT_UCHARCONSTPTR)
...@@ -523,10 +529,15 @@ DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV8HI, BT_UV16QI, BT_UV16QI, BT_UV8HI) ...@@ -523,10 +529,15 @@ DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_UV8HI, BT_UV16QI, BT_UV16QI, BT_UV8HI)
DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_V16QI, BT_UV16QI, BT_UV16QI, BT_V16QI) DEF_OV_TYPE (BT_OV_UV16QI_UV16QI_V16QI, BT_UV16QI, BT_UV16QI, BT_V16QI)
DEF_OV_TYPE (BT_OV_UV16QI_UV2DI_UV2DI, BT_UV16QI, BT_UV2DI, BT_UV2DI) DEF_OV_TYPE (BT_OV_UV16QI_UV2DI_UV2DI, BT_UV16QI, BT_UV2DI, BT_UV2DI)
DEF_OV_TYPE (BT_OV_UV16QI_UV4SI_UV4SI, BT_UV16QI, BT_UV4SI, BT_UV4SI) DEF_OV_TYPE (BT_OV_UV16QI_UV4SI_UV4SI, BT_UV16QI, BT_UV4SI, BT_UV4SI)
DEF_OV_TYPE (BT_OV_UV16QI_UV4SI_UV4SI_UV16QI_INTPTR, BT_UV16QI, BT_UV4SI, BT_UV4SI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI, BT_UV16QI, BT_UV8HI, BT_UV8HI) DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI, BT_UV16QI, BT_UV8HI, BT_UV8HI)
DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI_INTPTR, BT_UV16QI, BT_UV8HI, BT_UV8HI, BT_INTPTR) DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI_INTPTR, BT_UV16QI, BT_UV8HI, BT_UV8HI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI_UV16QI_INTPTR, BT_UV16QI, BT_UV8HI, BT_UV8HI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_V16QI, BT_UV16QI, BT_V16QI) DEF_OV_TYPE (BT_OV_UV16QI_V16QI, BT_UV16QI, BT_V16QI)
DEF_OV_TYPE (BT_OV_UV16QI_V16QI_V16QI_UV16QI_INTPTR, BT_UV16QI, BT_V16QI, BT_V16QI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_V4SI_V4SI_UV16QI_INTPTR, BT_UV16QI, BT_V4SI, BT_V4SI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV16QI_V8HI_V8HI, BT_UV16QI, BT_V8HI, BT_V8HI) DEF_OV_TYPE (BT_OV_UV16QI_V8HI_V8HI, BT_UV16QI, BT_V8HI, BT_V8HI)
DEF_OV_TYPE (BT_OV_UV16QI_V8HI_V8HI_UV16QI_INTPTR, BT_UV16QI, BT_V8HI, BT_V8HI, BT_UV16QI, BT_INTPTR)
DEF_OV_TYPE (BT_OV_UV2DI_BV2DI_UV2DI, BT_UV2DI, BT_BV2DI, BT_UV2DI) DEF_OV_TYPE (BT_OV_UV2DI_BV2DI_UV2DI, BT_UV2DI, BT_BV2DI, BT_UV2DI)
DEF_OV_TYPE (BT_OV_UV2DI_LONG_ULONGLONGCONSTPTR, BT_UV2DI, BT_LONG, BT_ULONGLONGCONSTPTR) DEF_OV_TYPE (BT_OV_UV2DI_LONG_ULONGLONGCONSTPTR, BT_UV2DI, BT_LONG, BT_ULONGLONGCONSTPTR)
DEF_OV_TYPE (BT_OV_UV2DI_ULONGLONG, BT_UV2DI, BT_ULONGLONG) DEF_OV_TYPE (BT_OV_UV2DI_ULONGLONG, BT_UV2DI, BT_ULONGLONG)
......
...@@ -2951,3 +2951,33 @@ OB_DEF_VAR (s390_vec_srdb_flt, s390_vsrd, 0, ...@@ -2951,3 +2951,33 @@ OB_DEF_VAR (s390_vec_srdb_flt, s390_vsrd, 0,
OB_DEF_VAR (s390_vec_srdb_dbl, s390_vsrd, 0, O3_U3, BT_OV_V2DF_V2DF_V2DF_UINT) OB_DEF_VAR (s390_vec_srdb_dbl, s390_vsrd, 0, O3_U3, BT_OV_V2DF_V2DF_V2DF_UINT)
B_DEF (s390_vsrd, vec_srdbv16qi, 0, B_VXE2, O3_U3, BT_FN_UV16QI_UV16QI_UV16QI_INT) B_DEF (s390_vsrd, vec_srdbv16qi, 0, B_VXE2, O3_U3, BT_FN_UV16QI_UV16QI_UV16QI_INT)
OB_DEF (s390_vec_search_string_cc, s390_vstrs_s8, s390_vstrs_u32, B_VXE2, BT_FN_OV4SI_OV4SI_OV4SI_OV4SI_INTPTR)
OB_DEF_VAR (s390_vstrs_s8, s390_vstrsb, 0, 0, BT_OV_UV16QI_V16QI_V16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_b8, s390_vstrsb, 0, 0, BT_OV_UV16QI_BV16QI_BV16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_u8, s390_vstrsb, 0, 0, BT_OV_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_s16, s390_vstrsh, 0, 0, BT_OV_UV16QI_V8HI_V8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_b16, s390_vstrsh, 0, 0, BT_OV_UV16QI_BV8HI_BV8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_u16, s390_vstrsh, 0, 0, BT_OV_UV16QI_UV8HI_UV8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_s32, s390_vstrsf, 0, 0, BT_OV_UV16QI_V4SI_V4SI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_b32, s390_vstrsf, 0, 0, BT_OV_UV16QI_BV4SI_BV4SI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrs_u32, s390_vstrsf, 0, 0, BT_OV_UV16QI_UV4SI_UV4SI_UV16QI_INTPTR)
B_DEF (s390_vstrsb, vstrsv16qi, 0, B_VXE2, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR)
B_DEF (s390_vstrsh, vstrsv8hi, 0, B_VXE2, 0, BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INTPTR)
B_DEF (s390_vstrsf, vstrsv4si, 0, B_VXE2, 0, BT_FN_UV4SI_UV4SI_UV4SI_UV8HI_INTPTR)
OB_DEF (s390_vec_search_string_until_zero_cc, s390_vstrsz_s8, s390_vstrsz_u32, B_VXE2, BT_FN_OV4SI_OV4SI_OV4SI_OV4SI_INTPTR)
OB_DEF_VAR (s390_vstrsz_s8, s390_vstrszb, 0, 0, BT_OV_UV16QI_V16QI_V16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_b8, s390_vstrszb, 0, 0, BT_OV_UV16QI_BV16QI_BV16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_u8, s390_vstrszb, 0, 0, BT_OV_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_s16, s390_vstrszh, 0, 0, BT_OV_UV16QI_V8HI_V8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_b16, s390_vstrszh, 0, 0, BT_OV_UV16QI_BV8HI_BV8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_u16, s390_vstrszh, 0, 0, BT_OV_UV16QI_UV8HI_UV8HI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_s32, s390_vstrszf, 0, 0, BT_OV_UV16QI_V4SI_V4SI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_b32, s390_vstrszf, 0, 0, BT_OV_UV16QI_BV4SI_BV4SI_UV16QI_INTPTR)
OB_DEF_VAR (s390_vstrsz_u32, s390_vstrszf, 0, 0, BT_OV_UV16QI_UV4SI_UV4SI_UV16QI_INTPTR)
B_DEF (s390_vstrszb, vstrszv16qi, 0, B_VXE2, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI_INTPTR)
B_DEF (s390_vstrszh, vstrszv8hi, 0, B_VXE2, 0, BT_FN_UV8HI_UV8HI_UV8HI_UV8HI_INTPTR)
B_DEF (s390_vstrszf, vstrszv4si, 0, B_VXE2, 0, BT_FN_UV4SI_UV4SI_UV4SI_UV8HI_INTPTR)
...@@ -222,6 +222,9 @@ ...@@ -222,6 +222,9 @@
UNSPEC_VEC_VSTRC UNSPEC_VEC_VSTRC
UNSPEC_VEC_VSTRCCC UNSPEC_VEC_VSTRCCC
UNSPEC_VEC_VSTRS
UNSPEC_VEC_VSTRSCC
UNSPEC_VEC_VCDGB UNSPEC_VEC_VCDGB
UNSPEC_VEC_VCDLGB UNSPEC_VEC_VCDLGB
......
...@@ -329,4 +329,6 @@ __lcbb(const void *ptr, int bndry) ...@@ -329,4 +329,6 @@ __lcbb(const void *ptr, int bndry)
#define vec_reve __builtin_s390_vec_reve #define vec_reve __builtin_s390_vec_reve
#define vec_sldb __builtin_s390_vec_sldb #define vec_sldb __builtin_s390_vec_sldb
#define vec_srdb __builtin_s390_vec_srdb #define vec_srdb __builtin_s390_vec_srdb
#define vec_search_string_cc __builtin_s390_vec_search_string_cc
#define vec_search_string_until_zero_cc __builtin_s390_vec_search_string_until_zero_cc
#endif /* _VECINTRIN_H */ #endif /* _VECINTRIN_H */
...@@ -1626,6 +1626,74 @@ ...@@ -1626,6 +1626,74 @@
operands[4] = GEN_INT (INTVAL (operands[4]) | VSTRING_FLAG_CS | VSTRING_FLAG_ZS); operands[4] = GEN_INT (INTVAL (operands[4]) | VSTRING_FLAG_CS | VSTRING_FLAG_ZS);
}) })
; Vector string search
(define_expand "vstrs<mode>"
[(parallel
[(set (match_operand:V16QI 0 "register_operand" "")
(unspec:V16QI [(match_operand:VI_HW_QHS 1 "register_operand" "")
(match_operand:VI_HW_QHS 2 "register_operand" "")
(match_operand:V16QI 3 "register_operand" "")
(const_int 0)]
UNSPEC_VEC_VSTRS))
(set (reg:CCRAW CC_REGNUM)
(unspec:CCRAW [(match_dup 1)
(match_dup 2)
(match_dup 3)
(const_int 0)]
UNSPEC_VEC_VSTRSCC))])
(set (match_operand:SI 4 "memory_operand" "")
(unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
"TARGET_VXE2")
(define_expand "vstrsz<mode>"
[(parallel
[(set (match_operand:V16QI 0 "register_operand" "")
(unspec:V16QI [(match_operand:VI_HW_QHS 1 "register_operand" "")
(match_operand:VI_HW_QHS 2 "register_operand" "")
(match_operand:V16QI 3 "register_operand" "")
(const_int VSTRING_FLAG_ZS)]
UNSPEC_VEC_VSTRS))
(set (reg:CCRAW CC_REGNUM)
(unspec:CCRAW [(match_dup 1)
(match_dup 2)
(match_dup 3)
(const_int VSTRING_FLAG_ZS)]
UNSPEC_VEC_VSTRSCC))])
(set (match_operand:SI 4 "memory_operand" "")
(unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
"TARGET_VXE2")
; vstrsb, vstrsh, vstrsf
; vstrszb, vstrszh, vstrszf
(define_insn "vec_vstrs<mode>"
[(set (match_operand:V16QI 0 "register_operand" "=v")
(unspec:V16QI [(match_operand:VI_HW_QHS 1 "register_operand" "v")
(match_operand:VI_HW_QHS 2 "register_operand" "v")
(match_operand:V16QI 3 "register_operand" "v")
(match_operand:QI 4 "const_mask_operand" "C")]
UNSPEC_VEC_VSTRS))
(set (reg:CCRAW CC_REGNUM)
(unspec:CCRAW [(match_dup 1)
(match_dup 2)
(match_dup 3)
(match_dup 4)]
UNSPEC_VEC_VSTRSCC))]
"TARGET_VXE2"
{
unsigned HOST_WIDE_INT flags = UINTVAL (operands[4]);
gcc_assert (!(flags & ~VSTRING_FLAG_ZS));
if (flags == VSTRING_FLAG_ZS)
return "vstrsz<bhfgq>\t%v0,%v1,%v2,%v3";
return "vstrs<bhfgq>\t%v0,%v1,%v2,%v3";
}
[(set_attr "op_type" "VRR")])
; Vector convert int<->float
(define_insn "vcdgb" (define_insn "vcdgb"
[(set (match_operand:V2DF 0 "register_operand" "=v") [(set (match_operand:V2DF 0 "register_operand" "=v")
(unspec:V2DF [(match_operand:V2DI 1 "register_operand" "v") (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "v")
......
2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com> 2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com>
* gcc.target/s390/zvector/vec-search-string-cc-1.c: New test.
* gcc.target/s390/zvector/vec-search-string-cc-compile.c: New test.
* gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c: New test.
* gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c: New test.
2019-04-02 Andreas Krebbel <krebbel@linux.ibm.com>
* gcc.target/s390/zvector/vec-shift-left-double-by-bit-1.c: New test. * gcc.target/s390/zvector/vec-shift-left-double-by-bit-1.c: New test.
* gcc.target/s390/zvector/vec-shift-right-double-by-bit-1.c: New test. * gcc.target/s390/zvector/vec-shift-right-double-by-bit-1.c: New test.
......
/* { dg-do run } */
/* { dg-require-effective-target s390_vxe2 } */
/* { dg-options "-O3 -mzarch -march=arch13 -mzvector --save-temps" } */
#include <vecintrin.h>
void __attribute__((noinline,noclone))
vstrs1 ()
{
int cc;
vector signed char haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o',
'h', 'i', 'h', 'o' };
vector signed char needle = { 'h', 'i', 'h', 'o' };
vector unsigned char length = { 0 };
length[7] = 4;
vector unsigned char result = vec_search_string_cc (haystack, needle,
length, &cc);
if (result[7] != 4)
__builtin_abort ();
/* CC2 indicates a full match. */
if (cc != 2)
__builtin_abort ();
}
int
main ()
{
vstrs1 ();
return 0;
}
/* { dg-final { scan-assembler-times "vstrsb\t" 1 } } */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -march=arch13 -mzvector" } */
#include <vecintrin.h>
unsigned char
vstrsb ()
{
int cc;
vector signed char haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o',
'h', 'i', 'h', 'o' };
vector signed char needle = { 'h', 'i', 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result = vec_search_string_cc (haystack, needle,
length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrsb\t" 1 } } */
unsigned char
vstrsh ()
{
int cc;
vector signed short haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o' };
vector signed short needle = { 'h', 'i', 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result = vec_search_string_cc (haystack, needle,
length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrsh\t" 1 } } */
unsigned char
vstrsf ()
{
int cc;
vector signed int haystack = { 'h', 'i', 'h', 'o' };
vector signed int needle = { 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result = vec_search_string_cc (haystack, needle,
length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrsf\t" 1 } } */
/* { dg-do run } */
/* { dg-require-effective-target s390_vxe2 } */
/* { dg-options "-O3 -mzarch -march=arch13 -mzvector --save-temps" } */
#include <vecintrin.h>
void __attribute__((noinline,noclone))
vstrs1 ()
{
int cc;
vector signed char haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o',
'h', 'i', 'h', 'o' };
vector signed char needle = { 'h', 'i', 'h', 'o', 0 };
vector unsigned char length = { 0 };
length[7] = 16;
vector unsigned char result
= vec_search_string_until_zero_cc (haystack, needle,
length, &cc);
if (result[7] != 4)
__builtin_abort ();
/* CC2 indicates a full match. */
if (cc != 2)
__builtin_abort ();
}
int
main ()
{
vstrs1 ();
return 0;
}
/* { dg-final { scan-assembler-times "vstrszb\t" 1 } } */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -march=arch13 -mzvector" } */
#include <vecintrin.h>
unsigned char
vstrszb ()
{
int cc;
vector signed char haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o',
'h', 'i', 'h', 'o' };
vector signed char needle = { 'h', 'i', 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result
= vec_search_string_until_zero_cc (haystack, needle, length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrszb\t" 1 } } */
unsigned char
vstrszh ()
{
int cc;
vector signed short haystack = { 'h', 'o', 'l', 'a', 'h', 'i', 'h', 'o' };
vector signed short needle = { 'h', 'i', 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result
= vec_search_string_until_zero_cc (haystack, needle, length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrszh\t" 1 } } */
unsigned char
vstrszf ()
{
int cc;
vector signed int haystack = { 'h', 'i', 'h', 'o' };
vector signed int needle = { 'h', 'o' };
vector unsigned char length = { 0 };
vector unsigned char result
= vec_search_string_until_zero_cc (haystack, needle, length, &cc);
return result[7];
}
/* { dg-final { scan-assembler-times "vstrszf\t" 1 } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment