On Sat, May 9, 2020 at 9:16 AM Bill Schmidt <wschm...@linux.ibm.com> wrote:
>
> From: Kelvin Nilsen <kel...@gcc.gnu.org>
>
> Adds new instructions vstribr, vstrihr, vstribl, and vstrihl, with
> overloaded built-in support.
>
> Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
> regressions, using a compiler configured for Power9.  Is this okay
> for master?
>
> Thanks,
> Bill
>
> [gcc]
>
> 2020-05-08  Kelvin Nilsen  <kel...@gcc.gnu.org>
>
>         * config/rs6000/altivec.h (vec_strir): New #define.
>         (vec_stril): Likewise.
>         (vec_strir_p): Likewise.
>         (vec_stril_p): Likewise.
>         * config/rs6000/altivec.md (UNSPEC_VSTRIR): New constant.
>         (UNSPEC_VSTRIL): Likewise.
>         (vstrir_<mode>): New expansion.
>         (vstrir_code_<mode>): New insn.
>         (vstrir_p_<mode>): New expansion.
>         (vstrir_p_code_<mode>): New insn.
>         (vstril_<mode>): New expansion.
>         (vstril_code_<mode>): New insn.
>         (vstril_p_<mode>): New expansion.
>         (vstril_p_code_<mode>): New insn.
>         * config/rs6000/rs6000-builtin.def (__builtin_altivec_vstribr):
>         New built-in function.
>         (__builtin_altivec_vstrihr): Likewise.
>         (__builtin_altivec_vstribl): Likewise.
>         (__builtin_altivec_vstrihl): Likewise.
>         (__builtin_altivec_vstribr_p): Likewise.
>         (__builtin_altivec_vstrihr_p): Likewise.
>         (__builtin_altivec_vstribl_p): Likewise.
>         (__builtin_altivec_vstrihl_p): Likewise.
>         (__builtin_vec_strir): New overloaded built-in function.
>         (__builtin_vec_stril): Likewise.
>         (__builtin_vec_strir_p): Likewise.
>         (__builtin_vec_stril_p): Likewise.
>         * config/rs6000/rs6000-call.c (altivec_overloaded_builtins):
>         Define overloaded forms of __builtin_vec_strir,
>         __builtin_vec_stril, __builtin_vec_strir_p, and
>         __builtin_vec_stril_p.
>         * doc/extend.texi (PowerPC AltiVec Built-in Functions Available
>         for a Future Architecture): Add description of vec_stril,
>         vec_stril_p, vec_strir, and vec_strir_p built-in functions.
>
> [gcc]
>
> 2020-05-08  Kelvin Nilsen  <kel...@gcc.gnu.org>
>
>         * gcc.target/powerpc/vec-stril-0.c: New.
>         * gcc.target/powerpc/vec-stril-1.c: New.
>         * gcc.target/powerpc/vec-stril-10.c: New.
>         * gcc.target/powerpc/vec-stril-11.c: New.
>         * gcc.target/powerpc/vec-stril-12.c: New.
>         * gcc.target/powerpc/vec-stril-13.c: New.
>         * gcc.target/powerpc/vec-stril-14.c: New.
>         * gcc.target/powerpc/vec-stril-15.c: New.
>         * gcc.target/powerpc/vec-stril-16.c: New.
>         * gcc.target/powerpc/vec-stril-17.c: New.
>         * gcc.target/powerpc/vec-stril-18.c: New.
>         * gcc.target/powerpc/vec-stril-19.c: New.
>         * gcc.target/powerpc/vec-stril-2.c: New.
>         * gcc.target/powerpc/vec-stril-20.c: New.
>         * gcc.target/powerpc/vec-stril-21.c: New.
>         * gcc.target/powerpc/vec-stril-22.c: New.
>         * gcc.target/powerpc/vec-stril-23.c: New.
>         * gcc.target/powerpc/vec-stril-3.c: New.
>         * gcc.target/powerpc/vec-stril-4.c: New.
>         * gcc.target/powerpc/vec-stril-5.c: New.
>         * gcc.target/powerpc/vec-stril-6.c: New.
>         * gcc.target/powerpc/vec-stril-7.c: New.
>         * gcc.target/powerpc/vec-stril-8.c: New.
>         * gcc.target/powerpc/vec-stril-9.c: New.
>         * gcc.target/powerpc/vec-stril_p-0.c: New.
>         * gcc.target/powerpc/vec-stril_p-1.c: New.
>         * gcc.target/powerpc/vec-stril_p-10.c: New.
>         * gcc.target/powerpc/vec-stril_p-11.c: New.
>         * gcc.target/powerpc/vec-stril_p-2.c: New.
>         * gcc.target/powerpc/vec-stril_p-3.c: New.
>         * gcc.target/powerpc/vec-stril_p-4.c: New.
>         * gcc.target/powerpc/vec-stril_p-5.c: New.
>         * gcc.target/powerpc/vec-stril_p-6.c: New.
>         * gcc.target/powerpc/vec-stril_p-7.c: New.
>         * gcc.target/powerpc/vec-stril_p-8.c: New.
>         * gcc.target/powerpc/vec-stril_p-9.c: New.
>         * gcc.target/powerpc/vec-strir-0.c: New.
>         * gcc.target/powerpc/vec-strir-1.c: New.
>         * gcc.target/powerpc/vec-strir-10.c: New.
>         * gcc.target/powerpc/vec-strir-11.c: New.
>         * gcc.target/powerpc/vec-strir-12.c: New.
>         * gcc.target/powerpc/vec-strir-13.c: New.
>         * gcc.target/powerpc/vec-strir-14.c: New.
>         * gcc.target/powerpc/vec-strir-15.c: New.
>         * gcc.target/powerpc/vec-strir-16.c: New.
>         * gcc.target/powerpc/vec-strir-17.c: New.
>         * gcc.target/powerpc/vec-strir-18.c: New.
>         * gcc.target/powerpc/vec-strir-19.c: New.
>         * gcc.target/powerpc/vec-strir-2.c: New.
>         * gcc.target/powerpc/vec-strir-20.c: New.
>         * gcc.target/powerpc/vec-strir-21.c: New.
>         * gcc.target/powerpc/vec-strir-22.c: New.
>         * gcc.target/powerpc/vec-strir-23.c: New.
>         * gcc.target/powerpc/vec-strir-3.c: New.
>         * gcc.target/powerpc/vec-strir-4.c: New.
>         * gcc.target/powerpc/vec-strir-5.c: New.
>         * gcc.target/powerpc/vec-strir-6.c: New.
>         * gcc.target/powerpc/vec-strir-7.c: New.
>         * gcc.target/powerpc/vec-strir-8.c: New.
>         * gcc.target/powerpc/vec-strir-9.c: New.
>         * gcc.target/powerpc/vec-strir_p-0.c: New.
>         * gcc.target/powerpc/vec-strir_p-1.c: New.
>         * gcc.target/powerpc/vec-strir_p-10.c: New.
>         * gcc.target/powerpc/vec-strir_p-11.c: New.
>         * gcc.target/powerpc/vec-strir_p-2.c: New.
>         * gcc.target/powerpc/vec-strir_p-3.c: New.
>         * gcc.target/powerpc/vec-strir_p-4.c: New.
>         * gcc.target/powerpc/vec-strir_p-5.c: New.
>         * gcc.target/powerpc/vec-strir_p-6.c: New.
>         * gcc.target/powerpc/vec-strir_p-7.c: New.
>         * gcc.target/powerpc/vec-strir_p-8.c: New.
>         * gcc.target/powerpc/vec-strir_p-9.c: New.

This is okay, modulo any comments from Segher.

Thanks, David

> ---
>  gcc/config/rs6000/altivec.h                   |   6 +
>  gcc/config/rs6000/altivec.md                  | 105 ++++++++++++++++++
>  gcc/config/rs6000/rs6000-builtin.def          |  15 +++
>  gcc/config/rs6000/rs6000-call.c               |  40 +++++++
>  gcc/doc/extend.texi                           |  56 ++++++++++
>  .../gcc.target/powerpc/vec-stril-0.c          |  21 ++++
>  .../gcc.target/powerpc/vec-stril-1.c          |  52 +++++++++
>  .../gcc.target/powerpc/vec-stril-10.c         |  27 +++++
>  .../gcc.target/powerpc/vec-stril-11.c         |  29 +++++
>  .../gcc.target/powerpc/vec-stril-12.c         |  27 +++++
>  .../gcc.target/powerpc/vec-stril-13.c         |  28 +++++
>  .../gcc.target/powerpc/vec-stril-14.c         |  27 +++++
>  .../gcc.target/powerpc/vec-stril-15.c         |  28 +++++
>  .../gcc.target/powerpc/vec-stril-16.c         |  56 ++++++++++
>  .../gcc.target/powerpc/vec-stril-17.c         |  54 +++++++++
>  .../gcc.target/powerpc/vec-stril-18.c         |  56 ++++++++++
>  .../gcc.target/powerpc/vec-stril-19.c         |  54 +++++++++
>  .../gcc.target/powerpc/vec-stril-2.c          |  21 ++++
>  .../gcc.target/powerpc/vec-stril-20.c         |  46 ++++++++
>  .../gcc.target/powerpc/vec-stril-21.c         |  44 ++++++++
>  .../gcc.target/powerpc/vec-stril-22.c         |  44 ++++++++
>  .../gcc.target/powerpc/vec-stril-23.c         |  42 +++++++
>  .../gcc.target/powerpc/vec-stril-3.c          |  52 +++++++++
>  .../gcc.target/powerpc/vec-stril-4.c          |  21 ++++
>  .../gcc.target/powerpc/vec-stril-5.c          |  45 ++++++++
>  .../gcc.target/powerpc/vec-stril-6.c          |  21 ++++
>  .../gcc.target/powerpc/vec-stril-7.c          |  43 +++++++
>  .../gcc.target/powerpc/vec-stril-8.c          |  27 +++++
>  .../gcc.target/powerpc/vec-stril-9.c          |  28 +++++
>  .../gcc.target/powerpc/vec-stril_p-0.c        |  24 ++++
>  .../gcc.target/powerpc/vec-stril_p-1.c        |  41 +++++++
>  .../gcc.target/powerpc/vec-stril_p-10.c       |  37 ++++++
>  .../gcc.target/powerpc/vec-stril_p-11.c       |  37 ++++++
>  .../gcc.target/powerpc/vec-stril_p-2.c        |  23 ++++
>  .../gcc.target/powerpc/vec-stril_p-3.c        |  40 +++++++
>  .../gcc.target/powerpc/vec-stril_p-4.c        |  23 ++++
>  .../gcc.target/powerpc/vec-stril_p-5.c        |  35 ++++++
>  .../gcc.target/powerpc/vec-stril_p-6.c        |  23 ++++
>  .../gcc.target/powerpc/vec-stril_p-7.c        |  36 ++++++
>  .../gcc.target/powerpc/vec-stril_p-8.c        |  42 +++++++
>  .../gcc.target/powerpc/vec-stril_p-9.c        |  42 +++++++
>  .../gcc.target/powerpc/vec-strir-0.c          |  21 ++++
>  .../gcc.target/powerpc/vec-strir-1.c          |  52 +++++++++
>  .../gcc.target/powerpc/vec-strir-10.c         |  27 +++++
>  .../gcc.target/powerpc/vec-strir-11.c         |  28 +++++
>  .../gcc.target/powerpc/vec-strir-12.c         |  28 +++++
>  .../gcc.target/powerpc/vec-strir-13.c         |  29 +++++
>  .../gcc.target/powerpc/vec-strir-14.c         |  27 +++++
>  .../gcc.target/powerpc/vec-strir-15.c         |  28 +++++
>  .../gcc.target/powerpc/vec-strir-16.c         |  56 ++++++++++
>  .../gcc.target/powerpc/vec-strir-17.c         |  54 +++++++++
>  .../gcc.target/powerpc/vec-strir-18.c         |  56 ++++++++++
>  .../gcc.target/powerpc/vec-strir-19.c         |  54 +++++++++
>  .../gcc.target/powerpc/vec-strir-2.c          |  21 ++++
>  .../gcc.target/powerpc/vec-strir-20.c         |  48 ++++++++
>  .../gcc.target/powerpc/vec-strir-21.c         |  46 ++++++++
>  .../gcc.target/powerpc/vec-strir-22.c         |  48 ++++++++
>  .../gcc.target/powerpc/vec-strir-23.c         |  46 ++++++++
>  .../gcc.target/powerpc/vec-strir-3.c          |  52 +++++++++
>  .../gcc.target/powerpc/vec-strir-4.c          |  21 ++++
>  .../gcc.target/powerpc/vec-strir-5.c          |  44 ++++++++
>  .../gcc.target/powerpc/vec-strir-6.c          |  21 ++++
>  .../gcc.target/powerpc/vec-strir-7.c          |  44 ++++++++
>  .../gcc.target/powerpc/vec-strir-8.c          |  27 +++++
>  .../gcc.target/powerpc/vec-strir-9.c          |  28 +++++
>  .../gcc.target/powerpc/vec-strir_p-0.c        |  23 ++++
>  .../gcc.target/powerpc/vec-strir_p-1.c        |  39 +++++++
>  .../gcc.target/powerpc/vec-strir_p-10.c       |  46 ++++++++
>  .../gcc.target/powerpc/vec-strir_p-11.c       |  38 +++++++
>  .../gcc.target/powerpc/vec-strir_p-2.c        |  23 ++++
>  .../gcc.target/powerpc/vec-strir_p-3.c        |  40 +++++++
>  .../gcc.target/powerpc/vec-strir_p-4.c        |  23 ++++
>  .../gcc.target/powerpc/vec-strir_p-5.c        |  44 ++++++++
>  .../gcc.target/powerpc/vec-strir_p-6.c        |  23 ++++
>  .../gcc.target/powerpc/vec-strir_p-7.c        |  36 ++++++
>  .../gcc.target/powerpc/vec-strir_p-8.c        |  43 +++++++
>  .../gcc.target/powerpc/vec-strir_p-9.c        |  42 +++++++
>  77 files changed, 2844 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-0.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-1.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-10.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-11.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-12.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-13.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-14.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-15.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-16.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-17.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-18.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-19.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-2.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-20.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-21.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-22.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-23.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-3.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-4.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-5.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-6.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-7.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-8.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril-9.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-0.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-1.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-10.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-11.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-2.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-3.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-4.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-5.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-6.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-7.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-8.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-stril_p-9.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-0.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-1.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-10.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-11.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-12.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-13.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-14.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-15.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-16.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-17.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-18.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-19.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-2.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-20.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-21.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-22.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-23.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-3.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-4.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-5.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-6.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-7.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-8.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir-9.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-0.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-1.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-10.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-11.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-2.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-3.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-4.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-5.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-6.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-7.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-8.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-strir_p-9.c
>
> diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h
> index addf7d0db52..b29413deb6d 100644
> --- a/gcc/config/rs6000/altivec.h
> +++ b/gcc/config/rs6000/altivec.h
> @@ -700,6 +700,12 @@ __altivec_scalar_pred(vec_any_nle,
>  #define vec_clrl(a, b) __builtin_vec_clrl (a, b)
>  #define vec_clrr(a, b) __builtin_vec_clrr (a, b)
>  #define vec_ternarylogic(a, b, c, d)   __builtin_vec_xxeval (a, b, c, d)
> +
> +#define vec_strir(a)   __builtin_vec_strir (a)
> +#define vec_stril(a)   __builtin_vec_stril (a)
> +
> +#define vec_strir_p(a) __builtin_vec_strir_p (a)
> +#define vec_stril_p(a) __builtin_vec_stril_p (a)
>  #endif
>
>  #endif /* _ALTIVEC_H */
> diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
> index 7382d7c4b44..1c0bbb7527a 100644
> --- a/gcc/config/rs6000/altivec.md
> +++ b/gcc/config/rs6000/altivec.md
> @@ -169,6 +169,8 @@ (define_c_enum "unspec"
>     UNSPEC_VCLRLB
>     UNSPEC_VCLRRB
>     UNSPEC_XXEVAL
> +   UNSPEC_VSTRIR
> +   UNSPEC_VSTRIL
>  ])
>
>  (define_c_enum "unspecv"
> @@ -781,6 +783,109 @@ (define_expand "mulv8hi3"
>    DONE;
>  })
>
> +(define_expand "vstrir_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand")
> +       (unspec:VIshort [(match_operand:VIshort 1 "altivec_register_operand")]
> +                       UNSPEC_VSTRIR))]
> +  "TARGET_FUTURE"
> +{
> +  if (BYTES_BIG_ENDIAN)
> +    emit_insn (gen_vstrir_code_<mode> (operands[0], operands[1]));
> +  else
> +    emit_insn (gen_vstril_code_<mode> (operands[0], operands[1]));
> +  DONE;
> +})
> +
> +(define_insn "vstrir_code_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand" "=v")
> +       (unspec:VIshort
> +          [(match_operand:VIshort 1 "altivec_register_operand" "v")]
> +          UNSPEC_VSTRIR))]
> +  "TARGET_FUTURE"
> +  "vstri<wd>r %0,%1"
> +  [(set_attr "type" "vecsimple")])
> +
> +;; This expands into same code as vstrir_<mode> followed by condition logic
> +;; so that a single vstribr. or vstrihr. or vstribl. or vstrihl. instruction
> +;; can, for example, satisfy the needs of a vec_strir () function paired
> +;; with a vec_strir_p () function if both take the same incoming arguments.
> +(define_expand "vstrir_p_<mode>"
> +  [(match_operand:SI 0 "gpc_reg_operand")
> +   (match_operand:VIshort 1 "altivec_register_operand")]
> +  "TARGET_FUTURE"
> +{
> +  rtx scratch = gen_reg_rtx (<MODE>mode);
> +  if (BYTES_BIG_ENDIAN)
> +    emit_insn (gen_vstrir_p_code_<mode> (scratch, operands[1]));
> +  else
> +    emit_insn (gen_vstril_p_code_<mode> (scratch, operands[1]));
> +  emit_insn (gen_cr6_test_for_zero (operands[0]));
> +  DONE;
> +})
> +
> +(define_insn "vstrir_p_code_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand" "=v")
> +       (unspec:VIshort
> +          [(match_operand:VIshort 1 "altivec_register_operand" "v")]
> +          UNSPEC_VSTRIR))
> +   (set (reg:CC CR6_REGNO)
> +       (unspec:CC [(match_dup 1)]
> +                  UNSPEC_VSTRIR))]
> +  "TARGET_FUTURE"
> +  "vstri<wd>r. %0,%1"
> +  [(set_attr "type" "vecsimple")])
> +
> +(define_expand "vstril_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand")
> +       (unspec:VIshort [(match_operand:VIshort 1 "altivec_register_operand")]
> +                       UNSPEC_VSTRIR))]
> +  "TARGET_FUTURE"
> +{
> +  if (BYTES_BIG_ENDIAN)
> +    emit_insn (gen_vstril_code_<mode> (operands[0], operands[1]));
> +  else
> +    emit_insn (gen_vstrir_code_<mode> (operands[0], operands[1]));
> +  DONE;
> +})
> +
> +(define_insn "vstril_code_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand" "=v")
> +       (unspec:VIshort
> +          [(match_operand:VIshort 1 "altivec_register_operand" "v")]
> +          UNSPEC_VSTRIL))]
> +  "TARGET_FUTURE"
> +  "vstri<wd>l %0,%1"
> +  [(set_attr "type" "vecsimple")])
> +
> +;; This expands into same code as vstril_<mode> followed by condition logic
> +;; so that a single vstribr. or vstrihr. or vstribl. or vstrihl. instruction
> +;; can, for example, satisfy the needs of a vec_stril () function paired
> +;; with a vec_stril_p () function if both take the same incoming arguments.
> +(define_expand "vstril_p_<mode>"
> +  [(match_operand:SI 0 "gpc_reg_operand")
> +   (match_operand:VIshort 1 "altivec_register_operand")]
> +  "TARGET_FUTURE"
> +{
> +  rtx scratch = gen_reg_rtx (<MODE>mode);
> +  if (BYTES_BIG_ENDIAN)
> +    emit_insn (gen_vstril_p_code_<mode> (scratch, operands[1]));
> +  else
> +    emit_insn (gen_vstrir_p_code_<mode> (scratch, operands[1]));
> +  emit_insn (gen_cr6_test_for_zero (operands[0]));
> +  DONE;
> +})
> +
> +(define_insn "vstril_p_code_<mode>"
> +  [(set (match_operand:VIshort 0 "altivec_register_operand" "=v")
> +       (unspec:VIshort
> +          [(match_operand:VIshort 1 "altivec_register_operand" "v")]
> +          UNSPEC_VSTRIL))
> +   (set (reg:CC CR6_REGNO)
> +       (unspec:CC [(match_dup 1)]
> +                  UNSPEC_VSTRIR))]
> +  "TARGET_FUTURE"
> +  "vstri<wd>l. %0,%1"
> +  [(set_attr "type" "vecsimple")])
>
>  ;; Fused multiply subtract
>  (define_insn "*altivec_vnmsubfp"
> diff --git a/gcc/config/rs6000/rs6000-builtin.def 
> b/gcc/config/rs6000/rs6000-builtin.def
> index 7ff8db5dccc..1f86293d0e2 100644
> --- a/gcc/config/rs6000/rs6000-builtin.def
> +++ b/gcc/config/rs6000/rs6000-builtin.def
> @@ -2612,12 +2612,27 @@ BU_FUTURE_V_2 (VPEXTD, "vpextd", CONST, vpextd)
>  BU_FUTURE_V_2 (VGNB, "vgnb", CONST, vgnb)
>  BU_FUTURE_V_4 (XXEVAL, "xxeval", CONST, xxeval)
>
> +BU_FUTURE_V_1 (VSTRIBR, "vstribr", CONST, vstrir_v16qi)
> +BU_FUTURE_V_1 (VSTRIHR, "vstrihr", CONST, vstrir_v8hi)
> +BU_FUTURE_V_1 (VSTRIBL, "vstribl", CONST, vstril_v16qi)
> +BU_FUTURE_V_1 (VSTRIHL, "vstrihl", CONST, vstril_v8hi)
> +
> +BU_FUTURE_V_1 (VSTRIBR_P, "vstribr_p", CONST, vstrir_p_v16qi)
> +BU_FUTURE_V_1 (VSTRIHR_P, "vstrihr_p", CONST, vstrir_p_v8hi)
> +BU_FUTURE_V_1 (VSTRIBL_P, "vstribl_p", CONST, vstril_p_v16qi)
> +BU_FUTURE_V_1 (VSTRIHL_P, "vstrihl_p", CONST, vstril_p_v8hi)
> +
>  /* Future architecture overloaded vector built-ins.  */
>  BU_FUTURE_OVERLOAD_2 (CLRL, "clrl")
>  BU_FUTURE_OVERLOAD_2 (CLRR, "clrr")
>  BU_FUTURE_OVERLOAD_2 (GNB, "gnb")
>  BU_FUTURE_OVERLOAD_4 (XXEVAL, "xxeval")
>
> +BU_FUTURE_OVERLOAD_1 (VSTRIR, "strir")
> +BU_FUTURE_OVERLOAD_1 (VSTRIL, "stril")
> +
> +BU_FUTURE_OVERLOAD_1 (VSTRIR_P, "strir_p")
> +BU_FUTURE_OVERLOAD_1 (VSTRIL_P, "stril_p")
>
>  /* 1 argument crypto functions.  */
>  BU_CRYPTO_1 (VSBOX,            "vsbox",          CONST, crypto_vsbox_v2di)
> diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
> index 9b9562ce4c3..64a9ba2818d 100644
> --- a/gcc/config/rs6000/rs6000-call.c
> +++ b/gcc/config/rs6000/rs6000-call.c
> @@ -5551,6 +5551,46 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_unsigned_V1TI, RS6000_BTI_unsigned_V1TI,
>      RS6000_BTI_unsigned_V1TI, RS6000_BTI_unsigned_V1TI },
>
> +  { FUTURE_BUILTIN_VEC_VSTRIL, FUTURE_BUILTIN_VSTRIBL,
> +    RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIL, FUTURE_BUILTIN_VSTRIBL,
> +    RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIL, FUTURE_BUILTIN_VSTRIHL,
> +    RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIL, FUTURE_BUILTIN_VSTRIHL,
> +    RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIL_P, FUTURE_BUILTIN_VSTRIBL_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_unsigned_V16QI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIL_P, FUTURE_BUILTIN_VSTRIBL_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_V16QI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIL_P, FUTURE_BUILTIN_VSTRIHL_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_unsigned_V8HI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIL_P, FUTURE_BUILTIN_VSTRIHL_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_V8HI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIR, FUTURE_BUILTIN_VSTRIBR,
> +    RS6000_BTI_unsigned_V16QI, RS6000_BTI_unsigned_V16QI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIR, FUTURE_BUILTIN_VSTRIBR,
> +    RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIR, FUTURE_BUILTIN_VSTRIHR,
> +    RS6000_BTI_unsigned_V8HI, RS6000_BTI_unsigned_V8HI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIR, FUTURE_BUILTIN_VSTRIHR,
> +    RS6000_BTI_V8HI, RS6000_BTI_V8HI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIR_P, FUTURE_BUILTIN_VSTRIBR_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_unsigned_V16QI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIR_P, FUTURE_BUILTIN_VSTRIBR_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_V16QI, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_VSTRIR_P, FUTURE_BUILTIN_VSTRIHR_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_unsigned_V8HI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_VSTRIR_P, FUTURE_BUILTIN_VSTRIHR_P,
> +    RS6000_BTI_INTSI, RS6000_BTI_V8HI, 0, 0 },
> +
>    { RS6000_BUILTIN_NONE, RS6000_BUILTIN_NONE, 0, 0, 0, 0 }
>  };
>
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index c66a9ac7c3d..e35db4387dc 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -20833,6 +20833,62 @@ Perform a vector parallel bit extract operation, as 
> if implemented by
>  the Future @code{vpextd} instruction.
>  @findex vec_pext
>
> +@smallexample
> +@exdent vector unsigned char vec_stril (vector unsigned char)
> +@exdent vector signed char vec_stril (vector signed char)
> +@exdent vector unsigned short vec_stril (vector unsigned short)
> +@exdent vector signed short vec_stril (vector signed short)
> +@end smallexample
> +Isolate the left-most non-zero elements of the incoming vector argument,
> +replacing all elements to the right of the left-most zero element
> +found within the argument with zero.  The typical implementation uses
> +the @code{vstribl} or @code{vstrihl} instruction on big-endian targets
> +and uses the @code{vstribr} or @code{vstrihr} instruction on
> +little-endian targets.
> +@findex vec_stril
> +
> +@smallexample
> +@exdent int vec_stril_p (vector unsigned char)
> +@exdent int vec_stril_p (vector signed char)
> +@exdent int short vec_stril_p (vector unsigned short)
> +@exdent int vec_stril_p (vector signed short)
> +@end smallexample
> +Return a non-zero value if and only if the argument contains a zero
> +element.  The typical implementation uses
> +the @code{vstribl.} or @code{vstrihl.} instruction on big-endian targets
> +and uses the @code{vstribr.} or @code{vstrihr.} instruction on
> +little-endian targets.  Choose this built-in to check for presence of
> +zero element if the same argument is also passed to @code{vec_stril}.
> +@findex vec_stril_p
> +
> +@smallexample
> +@exdent vector unsigned char vec_strir (vector unsigned char)
> +@exdent vector signed char vec_strir (vector signed char)
> +@exdent vector unsigned short vec_strir (vector unsigned short)
> +@exdent vector signed short vec_strir (vector signed short)
> +@end smallexample
> +Isolate the right-most non-zero elements of the incoming vector argument,
> +replacing all elements to the left of the right-most zero element
> +found within the argument with zero.  The typical implementation uses
> +the @code{vstribr} or @code{vstrihr} instruction on big-endian targets
> +and uses the @code{vstribl} or @code{vstrihl} instruction on
> +little-endian targets.
> +@findex vec_strir
> +
> +@smallexample
> +@exdent int vec_strir_p (vector unsigned char)
> +@exdent int vec_strir_p (vector signed char)
> +@exdent int short vec_strir_p (vector unsigned short)
> +@exdent int vec_strir_p (vector signed short)
> +@end smallexample
> +Return a non-zero value if and only if the argument contains a zero
> +element.  The typical implementation uses
> +the @code{vstribr.} or @code{vstrihr.} instruction on big-endian targets
> +and uses the @code{vstribl.} or @code{vstrihl.} instruction on
> +little-endian targets.  Choose this built-in to check for presence of
> +zero element if the same argument is also passed to @code{vec_strir}.
> +@findex vec_strir_p
> +
>  @node PowerPC Hardware Transactional Memory Built-in Functions
>  @subsection PowerPC Hardware Transactional Memory Built-in Functions
>  GCC provides two interfaces for accessing the Hardware Transactional
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-0.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-0.c
> new file mode 100644
> index 00000000000..d9ae5e8c39d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-0.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned char.  */
> +vector unsigned char
> +silj (vector unsigned char arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-1.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-1.c
> new file mode 100644
> index 00000000000..a966ddc1699
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-1.c
> @@ -0,0 +1,52 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned char.  */
> +vector unsigned char
> +silj (vector unsigned char arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 00, 0x0 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected3 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected4 =
> +    { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (silj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (silj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (silj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (silj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-10.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-10.c
> new file mode 100644
> index 00000000000..8afa5098fdd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-10.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-11.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } }} 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } }} 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-11.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-11.c
> new file mode 100644
> index 00000000000..7e4ec69371f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-11.c
> @@ -0,0 +1,29 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector signed char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-12.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-12.c
> new file mode 100644
> index 00000000000..097503ea8ce
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-12.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-13.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-13.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-13.c
> new file mode 100644
> index 00000000000..58e91ed5607
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-13.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector unsigned short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-14.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-14.c
> new file mode 100644
> index 00000000000..e0211900171
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-14.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-15.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-15.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-15.c
> new file mode 100644
> index 00000000000..fa38112b255
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-15.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector signed short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-16.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-16.c
> new file mode 100644
> index 00000000000..2c5ea7ecc06
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-16.c
> @@ -0,0 +1,56 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-17.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector unsigned char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 00, 0x0 };
> +  vector unsigned char expected2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector unsigned char expected3 =
> +    { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-17.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-17.c
> new file mode 100644
> index 00000000000..2f82393bf9b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-17.c
> @@ -0,0 +1,54 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Tail recursion replaced with iteration with -O2.  */
> +  vector unsigned char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector unsigned char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 00, 0x0 };
> +  vector unsigned char expected2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector unsigned char expected3 =
> +    { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-18.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-18.c
> new file mode 100644
> index 00000000000..37c18c1ddb3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-18.c
> @@ -0,0 +1,56 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-19.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector signed char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 00, 0x0 };
> +  vector signed char expected2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector signed char expected3 =
> +    { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-19.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-19.c
> new file mode 100644
> index 00000000000..a0bdd64848a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-19.c
> @@ -0,0 +1,54 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Tail recursion replaced with iteration with -O2.  */
> +  vector signed char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector signed char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 00, 0x0 };
> +  vector signed char expected2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector signed char expected3 =
> +    { 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-2.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-2.c
> new file mode 100644
> index 00000000000..baffe92e4ad
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-2.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed char.  */
> +vector signed char
> +silj (vector signed char arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-20.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-20.c
> new file mode 100644
> index 00000000000..879b1aea22f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-20.c
> @@ -0,0 +1,46 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-21.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 }
> +  };
> +
> +  vector unsigned short expected0 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf 
> };
> +  vector unsigned short expected1 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 
> };
> +  vector unsigned short expected2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 
> };
> +  vector unsigned short expected3 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 
> };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> +
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-21.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-21.c
> new file mode 100644
> index 00000000000..430ed0bbe4a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-21.c
> @@ -0,0 +1,44 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Iteration replaces tail recursion with -O2.  */
> +  vector unsigned short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 }
> +  };
> +
> +  vector unsigned short expected0 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf 
> };
> +  vector unsigned short expected1 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 
> };
> +  vector unsigned short expected2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 
> };
> +  vector unsigned short expected3 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 
> };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> +
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-22.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-22.c
> new file mode 100644
> index 00000000000..acc438852fc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-22.c
> @@ -0,0 +1,44 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-stril-23.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 }
> +  };
> +
> +  vector signed short expected0 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected3 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-23.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-23.c
> new file mode 100644
> index 00000000000..75d1e10607a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-23.c
> @@ -0,0 +1,42 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Iteration replaces tail recursion with -O2.  */
> +  vector signed short result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 }
> +  };
> +
> +  vector signed short expected0 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected3 = { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-3.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-3.c
> new file mode 100644
> index 00000000000..50f359b6068
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-3.c
> @@ -0,0 +1,52 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +vector signed char
> +silj (vector signed char arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char expected2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0x0, 0x0 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char expected3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char expected4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (silj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (silj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (silj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (silj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-4.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-4.c
> new file mode 100644
> index 00000000000..35447b96b33
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-4.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned short.  */
> +vector unsigned short
> +silj (vector unsigned short arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-5.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-5.c
> new file mode 100644
> index 00000000000..16f6bcf6400
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-5.c
> @@ -0,0 +1,45 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned short.  */
> +vector unsigned short
> +silj (vector unsigned short arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +
> +  if (!vec_all_eq (silj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (silj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (silj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (silj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-6.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-6.c
> new file mode 100644
> index 00000000000..b40e65b80c5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-6.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed short.  */
> +vector signed short
> +silj (vector signed short arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-7.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-7.c
> new file mode 100644
> index 00000000000..b6f90ce5414
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-7.c
> @@ -0,0 +1,43 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed short.  */
> +vector signed short
> +silj (vector signed short arg)
> +{
> +  return vec_stril (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected2 =
> +    { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short expected3 =
> +    { 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short expected4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (!vec_all_eq (silj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (silj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (silj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (silj (input4), expected4))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-8.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-8.c
> new file mode 100644
> index 00000000000..9f2f3e34a99
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-8.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future -O1" } */
> +/* See vec-stril-9.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril-9.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril-9.c
> new file mode 100644
> index 00000000000..56864f4e477
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril-9.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector unsigned char result = vec_stril (*vp);
> +  if (vec_stril_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-0.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-0.c
> new file mode 100644
> index 00000000000..2ec2e706593
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-0.c
> @@ -0,0 +1,24 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified predicate on array of
> +   unsigned char.  */
> +int
> +silj_p (vector unsigned char arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-1.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-1.c
> new file mode 100644
> index 00000000000..0ec3541d810
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-1.c
> @@ -0,0 +1,41 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified predicate on array of
> +   unsigned char.  */
> +int
> +silj_p (vector unsigned char arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +
> +  if (silj_p (input1))
> +    abort ();
> +  if (!silj_p (input2))
> +    abort ();
> +  if (!silj_p (input3))
> +    abort ();
> +  if (!silj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-10.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-10.c
> new file mode 100644
> index 00000000000..3c4ce86f1fa
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-10.c
> @@ -0,0 +1,37 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (vec_stril_p (input1))
> +    abort ();
> +  if (!vec_stril_p (input2))
> +    abort ();
> +  if (!vec_stril_p (input3))
> +    abort ();
> +  if (!vec_stril_p (input4))
> +    abort ();
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-11.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-11.c
> new file mode 100644
> index 00000000000..60f7ccd8c33
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-11.c
> @@ -0,0 +1,37 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (vec_stril_p (input1))
> +    abort ();
> +  if (!vec_stril_p (input2))
> +    abort ();
> +  if (!vec_stril_p (input3))
> +    abort ();
> +  if (!vec_stril_p (input4))
> +    abort ();
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-2.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-2.c
> new file mode 100644
> index 00000000000..2b0b347c127
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-2.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed char.  */
> +int
> +silj_p (vector signed char arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-3.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-3.c
> new file mode 100644
> index 00000000000..be477398648
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-3.c
> @@ -0,0 +1,40 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +int
> +silj_p (vector signed char arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +
> +  if (silj_p (input1))
> +    abort ();
> +  if (!silj_p (input2))
> +    abort ();
> +  if (!silj_p (input3))
> +    abort ();
> +  if (!silj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-4.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-4.c
> new file mode 100644
> index 00000000000..4be60ac53da
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-4.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned short.  */
> +int
> +silj_p (vector unsigned short arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-5.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-5.c
> new file mode 100644
> index 00000000000..2b520b1745c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-5.c
> @@ -0,0 +1,35 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of unsigned short.  */
> +int
> +silj_p (vector unsigned short arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (silj_p (input1))
> +    abort ();
> +  if (!silj_p (input2))
> +    abort ();
> +  if (!silj_p (input3))
> +    abort ();
> +  if (!silj_p (input4))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-6.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-6.c
> new file mode 100644
> index 00000000000..de719f92b00
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-6.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed short.  */
> +int
> +silj_p (vector signed short arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-7.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-7.c
> new file mode 100644
> index 00000000000..22f394fa6e0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-7.c
> @@ -0,0 +1,36 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate left-justified on array of signed short.  */
> +int
> +silj_p (vector signed short arg)
> +{
> +  return vec_stril_p (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (silj_p (input1))
> +    abort ();
> +  if (!silj_p (input2))
> +    abort ();
> +  if (!silj_p (input3))
> +    abort ();
> +  if (!silj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-8.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-8.c
> new file mode 100644
> index 00000000000..daf322070ef
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-8.c
> @@ -0,0 +1,42 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +
> +  if (vec_stril_p (input1))
> +    abort ();
> +  if (!vec_stril_p (input2))
> +    abort ();
> +  if (!vec_stril_p (input3))
> +    abort ();
> +  if (!vec_stril_p (input4))
> +    abort ();
> +
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-stril_p-9.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-9.c
> new file mode 100644
> index 00000000000..85e8ea750fd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-stril_p-9.c
> @@ -0,0 +1,42 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +
> +  if (vec_stril_p (input1))
> +    abort ();
> +  if (!vec_stril_p (input2))
> +    abort ();
> +  if (!vec_stril_p (input3))
> +    abort ();
> +  if (!vec_stril_p (input4))
> +    abort ();
> +
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-0.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-0.c
> new file mode 100644
> index 00000000000..6e9e944ca6d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-0.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned char.  */
> +vector unsigned char
> +sirj (vector unsigned char arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-1.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-1.c
> new file mode 100644
> index 00000000000..8bf326afbc7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-1.c
> @@ -0,0 +1,52 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned char.  */
> +vector unsigned char
> +sirj (vector unsigned char arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +
> +  if (!vec_all_eq (sirj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (sirj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (sirj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (sirj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-10.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-10.c
> new file mode 100644
> index 00000000000..b129168510f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-10.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-11.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-11.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-11.c
> new file mode 100644
> index 00000000000..12d751a62f2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-11.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector signed char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-12.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-12.c
> new file mode 100644
> index 00000000000..2ee44dabfd9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-12.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-13.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-13.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-13.c
> new file mode 100644
> index 00000000000..91ca59bb826
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-13.c
> @@ -0,0 +1,29 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector unsigned short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-14.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-14.c
> new file mode 100644
> index 00000000000..5f7d4341992
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-14.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-15.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-15.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-15.c
> new file mode 100644
> index 00000000000..0a3d8d02ac1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-15.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector signed short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-16.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-16.c
> new file mode 100644
> index 00000000000..2418b2f40fe
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-16.c
> @@ -0,0 +1,56 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-17.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector unsigned char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-17.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-17.c
> new file mode 100644
> index 00000000000..1404342d4b4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-17.c
> @@ -0,0 +1,54 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Tail recursion replaced with iteration with -O2.  */
> +  vector unsigned char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char composed_string [4] = {
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 }
> +  };
> +
> +  vector unsigned char expected0 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected1 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector unsigned char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-18.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-18.c
> new file mode 100644
> index 00000000000..ab9592f49ee
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-18.c
> @@ -0,0 +1,56 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-19.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char composed_string [4] = {
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 }
> +  };
> +
> +  vector signed char expected0 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector signed char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +  vector signed char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-19.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-19.c
> new file mode 100644
> index 00000000000..b0f78df40b3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-19.c
> @@ -0,0 +1,54 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed char
> +doString(vector signed char *vp)
> +{
> +  /* Tail recursion replaced with iteration with -O2.  */
> +  vector signed char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char composed_string [4] = {
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 },
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 }
> +  };
> +
> +  vector signed char expected0 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector signed char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +  vector signed char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-2.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-2.c
> new file mode 100644
> index 00000000000..a7efde73d56
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-2.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +vector signed char
> +sirj (vector signed char arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-20.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-20.c
> new file mode 100644
> index 00000000000..8ac643e1dbf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-20.c
> @@ -0,0 +1,48 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-21.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0x0, 0xd, 0xe }
> +  };
> +
> +  vector unsigned short expected0 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-21.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-21.c
> new file mode 100644
> index 00000000000..47bf0db8946
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-21.c
> @@ -0,0 +1,46 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector unsigned short
> +doString(vector unsigned short *vp)
> +{
> +  /* Iteration replaces tail recursion with -O2.  */
> +  vector unsigned short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0x0, 0xd, 0xe }
> +  };
> +
> +  vector unsigned short expected0 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-22.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-22.c
> new file mode 100644
> index 00000000000..48a57983860
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-22.c
> @@ -0,0 +1,48 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-23.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector signed short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0x0, 0xd, 0xe }
> +  };
> +
> +  vector signed short expected0 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-23.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-23.c
> new file mode 100644
> index 00000000000..b3b143f3b68
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-23.c
> @@ -0,0 +1,46 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +vector signed short
> +doString(vector signed short *vp)
> +{
> +  /* Iteration replaces tail recursion with -O2.  */
> +  vector signed short result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short composed_string [4] = {
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf },
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 },
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0x0, 0xd, 0xe }
> +  };
> +
> +  vector signed short expected0 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe };
> +
> +  if (!vec_all_eq (doString (&composed_string[0]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[1]), expected1))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[2]), expected2))
> +    abort ();
> +  if (!vec_all_eq (doString (&composed_string[3]), expected3))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-3.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-3.c
> new file mode 100644
> index 00000000000..25db69c52a6
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-3.c
> @@ -0,0 +1,52 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +vector signed char
> +sirj (vector signed char arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char expected1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char expected2 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x11 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
> +      0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11 };
> +
> +  if (!vec_all_eq (sirj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (sirj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (sirj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (sirj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-4.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-4.c
> new file mode 100644
> index 00000000000..85a3f56d24f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-4.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned short.  */
> +vector unsigned short
> +sirj (vector unsigned short arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-5.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-5.c
> new file mode 100644
> index 00000000000..7047039deab
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-5.c
> @@ -0,0 +1,44 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned short.  */
> +vector unsigned short
> +sirj (vector unsigned short arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (sirj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (sirj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (sirj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (sirj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-6.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-6.c
> new file mode 100644
> index 00000000000..56e81812120
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-6.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed short.  */
> +vector signed short
> +sirj (vector signed short arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\M} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-7.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-7.c
> new file mode 100644
> index 00000000000..fddee218759
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-7.c
> @@ -0,0 +1,44 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed short.  */
> +vector signed short
> +sirj (vector signed short arg)
> +{
> +  return vec_strir (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short expected2 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short expected3 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (!vec_all_eq (sirj (input1), expected1))
> +    abort ();
> +  if (!vec_all_eq (sirj (input2), expected2))
> +    abort ();
> +  if (!vec_all_eq (sirj (input3), expected3))
> +    abort ();
> +  if (!vec_all_eq (sirj (input4), expected4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-8.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-8.c
> new file mode 100644
> index 00000000000..211cdeb8e50
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-8.c
> @@ -0,0 +1,27 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -mdejagnu-cpu=future" } */
> +/* See vec-strir-9.c for the same test with -O2 optimization.  */
> +
> +#include <altivec.h>
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both with -O1.  */
> +  vector unsigned char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir-9.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir-9.c
> new file mode 100644
> index 00000000000..b95711c71f4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir-9.c
> @@ -0,0 +1,28 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +vector unsigned char
> +doString(vector unsigned char *vp)
> +{
> +  /* Though two built-in functions are called, the implementation
> +     should use a single instruction to implement both and should
> +     convert tail recursion to iteration with two copies of the "loop
> +     body" when compiled with -O2 or -O3.  */
> +  vector unsigned char result = vec_strir (*vp);
> +  if (vec_strir_p (*vp))
> +    return result;
> +  else
> +    return doString (vp + 1);
> +}
> +
> +/* Enforce that exactly two dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 2 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 2 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-0.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-0.c
> new file mode 100644
> index 00000000000..f94703dfe77
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-0.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned char.  */
> +int
> +sirj_p (vector unsigned char arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-1.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-1.c
> new file mode 100644
> index 00000000000..ce527a7c530
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-1.c
> @@ -0,0 +1,39 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned char.  */
> +int
> +sirj_p (vector unsigned char arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +
> +  if (sirj_p (input1))
> +    abort ();
> +  if (!sirj_p (input2))
> +    abort ();
> +  if (!sirj_p (input3))
> +    abort ();
> +  if (!sirj_p (input4))
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-10.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-10.c
> new file mode 100644
> index 00000000000..5a4c63940e1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-10.c
> @@ -0,0 +1,46 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (vec_strir_p (input1))
> +    abort ();
> +  if (!vec_strir_p (input2))
> +    abort ();
> +  if (!vec_strir_p (input3))
> +    abort ();
> +  if (!vec_strir_p (input4))
> +    abort ();
> +
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-11.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-11.c
> new file mode 100644
> index 00000000000..786b2798a11
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-11.c
> @@ -0,0 +1,38 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (vec_strir_p (input1))
> +    abort ();
> +  if (!vec_strir_p (input2))
> +    abort ();
> +  if (!vec_strir_p (input3))
> +    abort ();
> +  if (!vec_strir_p (input4))
> +    abort ();
> +
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-2.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-2.c
> new file mode 100644
> index 00000000000..becb3220567
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-2.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +int
> +sirj_p (vector signed char arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-3.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-3.c
> new file mode 100644
> index 00000000000..42777702b3a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-3.c
> @@ -0,0 +1,40 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed char.  */
> +int
> +sirj_p (vector signed char arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +
> +  if (sirj_p (input1))
> +    abort ();
> +  if (!sirj_p (input2))
> +    abort ();
> +  if (!sirj_p (input3))
> +    abort ();
> +  if (!sirj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-4.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-4.c
> new file mode 100644
> index 00000000000..f9b214caa29
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-4.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned short.  */
> +int
> +sirj_p (vector unsigned short arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-5.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-5.c
> new file mode 100644
> index 00000000000..337f2d08875
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-5.c
> @@ -0,0 +1,44 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of unsigned short.  */
> +int
> +sirj_p (vector unsigned short arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector unsigned short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short expected2 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector unsigned short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected3 =
> +    { 0x0, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector unsigned short expected4 =
> +    { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
> +
> +  if (sirj_p (input1))
> +    abort ();
> +  if (!sirj_p (input2))
> +    abort ();
> +  if (!sirj_p (input3))
> +    abort ();
> +  if (!sirj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-6.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-6.c
> new file mode 100644
> index 00000000000..d1b79ee1250
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-6.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed short.  */
> +int
> +sirj_p (vector signed short arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +/* Enforce that a single dot-form instruction which is properly biased
> +   for the target's endianness implements this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstrihr\.} 1 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\.} 1 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstrihl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstrihr} 0 { target { le } } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-7.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-7.c
> new file mode 100644
> index 00000000000..a6794d29fd1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-7.c
> @@ -0,0 +1,36 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +/* Vector string isolate right-justified on array of signed short.  */
> +int
> +sirj_p (vector signed short arg)
> +{
> +  return vec_strir_p (arg);
> +}
> +
> +int main (int argc, short *argv [])
> +{
> +  vector signed short input1 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input2 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf };
> +  vector signed short input3 =
> +    { 0x1, 0x0, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +  vector signed short input4 =
> +    { 0x1, 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0x0 };
> +
> +  if (sirj_p (input1))
> +    abort ();
> +  if (!sirj_p (input2))
> +    abort ();
> +  if (!sirj_p (input3))
> +    abort ();
> +  if (!sirj_p (input4))
> +    abort ();
> +
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-8.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-8.c
> new file mode 100644
> index 00000000000..f25528c7b46
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-8.c
> @@ -0,0 +1,43 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, char *argv [])
> +{
> +  vector unsigned char input1 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x11 };
> +  vector unsigned char input2 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input3 =
> +    { 0x1, 0x2, 0x0, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector unsigned char input4 =
> +    { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +
> +  if (!vec_strir_p (input1))
> +    abort ();
> +  if (!vec_strir_p (input2))
> +    abort ();
> +  if (!vec_strir_p (input3))
> +    abort ();
> +  if (!vec_strir_p (input4))
> +    abort ();
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */
> +
> +
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-strir_p-9.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-9.c
> new file mode 100644
> index 00000000000..42831a4cbed
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-strir_p-9.c
> @@ -0,0 +1,42 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +
> +#include <altivec.h>
> +
> +extern void abort (void);
> +
> +int main (int argc, char *argv [])
> +{
> +  vector signed char input1 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0xf, 0x11 };
> +  vector signed char input2 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0x0, 0xf, 0x11 };
> +  vector signed char input3 =
> +    { 0x1, 0x2, 0xf3, 0x0, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +  vector signed char input4 =
> +    { 0x1, 0x2, 0xf3, 0x4, 0x5, 0x6, 0x7, 0x8,
> +      0x9, 0xa, 0xb, 0xc, 0xd, 0xe2, 0x0, 0x11 };
> +
> +  if (vec_strir_p (input1))
> +    abort ();
> +  if (!vec_strir_p (input2))
> +    abort ();
> +  if (!vec_strir_p (input3))
> +    abort ();
> +  if (!vec_strir_p (input4))
> +    abort ();
> +
> +}
> +
> +/* Enforce that exactly four dot-form instructions which are properly biased
> +   for the target's endianness implement this built-in.  */
> +
> +/* { dg-final { scan-assembler-times {\mvstribr\.} 4 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribr\M[^.]} 0 { target { be } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribl} 0 { target { be } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\.} 4 { target { le } } } } */
> +/* { dg-final { scan-assembler-times {\mvstribl\M[^.]} 0 { target { le } } } 
> } */
> +/* { dg-final { scan-assembler-times {\mvstribr} 0 { target { le } } } } */

> --
> 2.17.1
>

Reply via email to