+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
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)
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)
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)
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)
UNSPEC_VEC_VSTRC
UNSPEC_VEC_VSTRCCC
+ UNSPEC_VEC_VSTRS
+ UNSPEC_VEC_VSTRSCC
+
UNSPEC_VEC_VCDGB
UNSPEC_VEC_VCDLGB
#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 */
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")
+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.
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */