aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2019-04-02 11:08:54 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2019-04-02 11:08:54 +0000
commit49adc4618014f627ea2420de215899c038c976ec (patch)
tree8ffc7b4c9ea6a658c15ebd0c846e9c2153e07a8a /gcc
parentad7a3e3997ec96cdb8b0e7bd3fe3b7d74061700b (diff)
downloadgcc-49adc4618014f627ea2420de215899c038c976ec.zip
gcc-49adc4618014f627ea2420de215899c038c976ec.tar.gz
gcc-49adc4618014f627ea2420de215899c038c976ec.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/config/s390/s390-builtin-types.def11
-rw-r--r--gcc/config/s390/s390-builtins.def30
-rw-r--r--gcc/config/s390/s390.md3
-rw-r--r--gcc/config/s390/vecintrin.h2
-rw-r--r--gcc/config/s390/vx-builtins.md68
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-1.c36
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-compile.c47
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c37
-rw-r--r--gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c47
11 files changed, 304 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bfc101f..1495707 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,21 @@
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
types.
* config/s390/s390-builtins.def (s390_vec_sldb, s390_vec_srdb):
diff --git a/gcc/config/s390/s390-builtin-types.def b/gcc/config/s390/s390-builtin-types.def
index c0dd208..fc73d1f 100644
--- a/gcc/config/s390/s390-builtin-types.def
+++ b/gcc/config/s390/s390-builtin-types.def
@@ -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_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_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_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_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_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_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_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)
@@ -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_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_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_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_UCHAR, BT_UV16QI, BT_UCHAR)
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)
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_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_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_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_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_LONG_ULONGLONGCONSTPTR, BT_UV2DI, BT_LONG, BT_ULONGLONGCONSTPTR)
DEF_OV_TYPE (BT_OV_UV2DI_ULONGLONG, BT_UV2DI, BT_ULONGLONG)
diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def
index 6ee921d..108f997 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -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)
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)
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 56ad11f..45eff84 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -222,6 +222,9 @@
UNSPEC_VEC_VSTRC
UNSPEC_VEC_VSTRCCC
+ UNSPEC_VEC_VSTRS
+ UNSPEC_VEC_VSTRSCC
+
UNSPEC_VEC_VCDGB
UNSPEC_VEC_VCDLGB
diff --git a/gcc/config/s390/vecintrin.h b/gcc/config/s390/vecintrin.h
index fb60a77..b2d1c6e 100644
--- a/gcc/config/s390/vecintrin.h
+++ b/gcc/config/s390/vecintrin.h
@@ -329,4 +329,6 @@ __lcbb(const void *ptr, int bndry)
#define vec_reve __builtin_s390_vec_reve
#define vec_sldb __builtin_s390_vec_sldb
#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 */
diff --git a/gcc/config/s390/vx-builtins.md b/gcc/config/s390/vx-builtins.md
index 1c42d4e..97fd47f 100644
--- a/gcc/config/s390/vx-builtins.md
+++ b/gcc/config/s390/vx-builtins.md
@@ -1626,6 +1626,74 @@
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"
[(set (match_operand:V2DF 0 "register_operand" "=v")
(unspec:V2DF [(match_operand:V2DI 1 "register_operand" "v")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 693655b..0f76782 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
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-right-double-by-bit-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-1.c b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-1.c
new file mode 100644
index 0000000..57039f2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-1.c
@@ -0,0 +1,36 @@
+/* { 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 } } */
diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-compile.c b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-compile.c
new file mode 100644
index 0000000..f802f92
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-compile.c
@@ -0,0 +1,47 @@
+/* { 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 } } */
diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c
new file mode 100644
index 0000000..6ceb764
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c
@@ -0,0 +1,37 @@
+/* { 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 } } */
diff --git a/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c
new file mode 100644
index 0000000..317035e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c
@@ -0,0 +1,47 @@
+/* { 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 } } */