S/390: arch13: vector string search builtins
authorAndreas Krebbel <krebbel@linux.ibm.com>
Tue, 2 Apr 2019 11:08:54 +0000 (11:08 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Tue, 2 Apr 2019 11:08:54 +0000 (11:08 +0000)
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

gcc/ChangeLog
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/vx-builtins.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/zvector/vec-search-string-cc-compile.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/zvector/vec-search-string-until-zero-cc-compile.c [new file with mode: 0644]

index bfc101f3754ee6dd1a77cf6040eb8596bf408571..149570703aff6b0932a185afc81a1326bf8aced5 100644 (file)
@@ -1,3 +1,19 @@
+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
index c0dd2086cde91fa47a6e64a171407498b0cde74b..fc73d1f673164d121b4bbcf7700792623dc0f0c6 100644 (file)
@@ -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)
index 6ee921d24992d8c2fc94cff5d2199e245f48d7c0..108f997720c6528ec9625fb48e1dbf0efdf052b5 100644 (file)
@@ -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)
index 56ad11fe3d71db0781eff4a80095cd667ee5ac9c..45eff845161d0fa640b56139d063218b8216fe2a 100644 (file)
    UNSPEC_VEC_VSTRC
    UNSPEC_VEC_VSTRCCC
 
+   UNSPEC_VEC_VSTRS
+   UNSPEC_VEC_VSTRSCC
+
    UNSPEC_VEC_VCDGB
    UNSPEC_VEC_VCDLGB
 
index fb60a77ba06dc03044207c547137befe0368d0d4..b2d1c6eab9c4a3310b5279707ddc8f2f219b9166 100644 (file)
@@ -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 */
index 1c42d4e679b0630a531dafb86e594a39f7bfe911..97fd47fdc20eb0e7a36e90f677e509d3b1020a45 100644 (file)
   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")
index 693655b5e5d30a4abff4eb56e85f0162fb03b2cb..0f76782da34c2ed89b1bc35077cb4a54993f06fe 100644 (file)
@@ -1,3 +1,10 @@
+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.
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 (file)
index 0000000..57039f2
--- /dev/null
@@ -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 (file)
index 0000000..f802f92
--- /dev/null
@@ -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 (file)
index 0000000..6ceb764
--- /dev/null
@@ -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 (file)
index 0000000..317035e
--- /dev/null
@@ -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 } } */