On Mon, 2020-06-15 at 16:38 -0700, Carl Love via Gcc-patches wrote:
> v2 changes:  
> 
>     change log fixes
> 
>     gcc/config/rs6000/altivec changed name of define_insn and define_expand
>     for vxxspltiw... to xxspltiw...   Fixed spaces in 
> gen_xxsplti32dx_v4sf_inst (operands[0], GEN_INT
> 
>     gcc/rs6000-builtin.def propagated name changes above where they are used.
> 
>     Updated definition for S32bit_cint_operand, c32bit_cint_operand,
>     f32bit_const_operand predicate definitions.
> 
>     Changed name of rs6000_constF32toI32 to rs6000_const_f32_to_i32, 
> propagated
>     name change as needed.  Replaced if test with gcc_assert().
> 
>     Fixed description of vec_splatid() in documentation.

Probably easier to read if you place the 'changes from previous patch' 
below the patch introduction.


> -----------------------
> 
> GCC maintainers:
> 
> The following patch adds support for the vec_splati, vec_splatid and
> vec_splati_ins builtins.
> 
> Note, this patch adds support for instructions that take a 32-bit immediate
> value that represents a floating point value.  This support adds new
> predicates and a support function to properly handle the immediate value.

s/Note//.

> 
> The patch has been compiled and tested on
> 
>   powerpc64le-unknown-linux-gnu (Power 9 LE)
> 
> with no regression errors.
> 
> The test case was compiled on a Power 9 system and then tested on
> Mambo.
> 
> Please let me know if this patch is acceptable for the pu
> branch.  Thanks.

Which branch?



> 
>                          Carl Love
> --------------------------------------------------------
> gcc/ChangeLog
> 
> 2020-06-15  Carl Love  <c...@us.ibm.com>
> 
>         * config/rs6000/altivec.h (vec_splati, vec_splatid, vec_splati_ins):
>       Add defines.
>         * config/rs6000/altivec.md (UNSPEC_XXSPLTIW, UNSPEC_XXSPLTID,
>       UNSPEC_XXSPLTI32DX): New.
>         (vxxspltiw_v4si, vxxspltiw_v4sf_inst, vxxspltidp_v2df_inst,
>       vxxsplti32dx_v4si_inst, vxxsplti32dx_v4sf_inst): New define_insn.
>         (vxxspltiw_v4sf, vxxspltidp_v2df, vxxsplti32dx_v4si,
>       vxxsplti32dx_v4sf.): New define_expands.
>         * config/rs6000/predicates (u1bit_cint_operand,
>         s32bit_cint_operand, c32bit_cint_operand,
>       f32bit_const_operand): New predicates.
>         * config/rs6000/rs6000-builtin.def (VXXSPLTIW_V4SI, VXXSPLTIW_V4SF,
>        VXXSPLTID): NewBU_FUTURE_V_1 definitions.

NewBU_FUTURE_V_1 ? 


>         (VXXSPLTI32DX_V4SI, VXXSPLTI32DX_V4SF): New BU_FUTURE_V_3
>       definitions.
>         (XXSPLTIW, XXSPLTID): New BU_FUTURE_OVERLOAD_1 definitions.

seems to be a typo

>         (XXSPLTI32DX): Add BU_FUTURE_OVERLOAD_3 definition.

>         * config/rs6000/rs6000-call.c (FUTURE_BUILTIN_VEC_XXSPLTIW,
>       FUTURE_BUILTIN_VEC_XXSPLTID, FUTURE_BUILTIN_VEC_XXSPLTI32DX):
>       New definitions.
>         * config/rs6000/rs6000-protos.h (rs6000_constF32toI32): New extern
>       declaration.
>         * config/rs6000/rs6000.c (rs6000_constF32toI32): New function.
>         * config/doc/extend.texi: Add documentation for vec_splati,
>       vec_splatid, and vec_splati_ins.

tabs/spaces.



THanks,
-WIll


> gcc/testsuite/ChangeLog
> 
> 2020-06-15  Carl Love  <c...@us.ibm.com>
> 
>         * testsuite/gcc.target/powerpc/vec-splati-runnable: New test.
> ---
>  gcc/config/rs6000/altivec.h                   |   3 +
>  gcc/config/rs6000/altivec.md                  | 109 +++++++++++++
>  gcc/config/rs6000/predicates.md               |  33 ++++
>  gcc/config/rs6000/rs6000-builtin.def          |  13 ++
>  gcc/config/rs6000/rs6000-call.c               |  19 +++
>  gcc/config/rs6000/rs6000-protos.h             |   1 +
>  gcc/config/rs6000/rs6000.c                    |  11 ++
>  gcc/doc/extend.texi                           |  35 +++++
>  .../gcc.target/powerpc/vec-splati-runnable.c  | 145 ++++++++++++++++++
>  9 files changed, 369 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> 
> diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h
> index 0be68892aad..9ed41b1cbf1 100644
> --- a/gcc/config/rs6000/altivec.h
> +++ b/gcc/config/rs6000/altivec.h
> @@ -705,6 +705,9 @@ __altivec_scalar_pred(vec_any_nle,
>  #define vec_replace_unaligned(a, b, c) __builtin_vec_replace_un (a, b, c)
>  #define vec_sldb(a, b, c)      __builtin_vec_sldb (a, b, c)
>  #define vec_srdb(a, b, c)      __builtin_vec_srdb (a, b, c)
> +#define vec_splati(a)  __builtin_vec_xxspltiw (a)
> +#define vec_splatid(a) __builtin_vec_xxspltid (a)
> +#define vec_splati_ins(a, b, c)        __builtin_vec_xxsplti32dx (a, b, c)
> 
>  #define vec_gnb(a, b)        __builtin_vec_gnb (a, b)
>  #define vec_clrl(a, b)       __builtin_vec_clrl (a, b)
> diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
> index 832a35cdaa9..25f6b9b2f07 100644
> --- a/gcc/config/rs6000/altivec.md
> +++ b/gcc/config/rs6000/altivec.md
> @@ -173,6 +173,9 @@
>     UNSPEC_VSTRIL
>     UNSPEC_SLDB
>     UNSPEC_SRDB
> +   UNSPEC_XXSPLTIW
> +   UNSPEC_XXSPLTID
> +   UNSPEC_XXSPLTI32DX
>  ])
> 
>  (define_c_enum "unspecv"
> @@ -799,6 +802,112 @@
>    "vs<SLDB_LR>dbi %0,%1,%2,%3"
>    [(set_attr "type" "vecsimple")])
> 
> +(define_insn "xxspltiw_v4si"
> +  [(set (match_operand:V4SI 0 "register_operand" "=wa")
> +     (unspec:V4SI [(match_operand:SI 1 "s32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTIW))]
> + "TARGET_FUTURE"
> + "xxspltiw %x0,%1"
> + [(set_attr "type" "vecsimple")])
> +
> +(define_expand "xxspltiw_v4sf"
> +  [(set (match_operand:V4SF 0 "register_operand" "=wa")
> +     (unspec:V4SF [(match_operand:SF 1 "f32bit_const_operand" "n")]
> +                  UNSPEC_XXSPLTIW))]
> + "TARGET_FUTURE"
> +{
> +  long long value = rs6000_const_f32_to_i32 (operands[1]);
> +  emit_insn (gen_xxspltiw_v4sf_inst (operands[0], GEN_INT (value)));
> +  DONE;
> +})
> +
> +(define_insn "xxspltiw_v4sf_inst"
> +  [(set (match_operand:V4SF 0 "register_operand" "=wa")
> +     (unspec:V4SF [(match_operand:SI 1 "c32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTIW))]
> + "TARGET_FUTURE"
> + "xxspltiw %x0,%c1"
> + [(set_attr "type" "vecsimple")])
> +
> +(define_expand "xxspltidp_v2df"
> +  [(set (match_operand:V2DF 0 "register_operand" )
> +     (unspec:V2DF [(match_operand:SF 1 "f32bit_const_operand")]
> +                  UNSPEC_XXSPLTID))]
> + "TARGET_FUTURE"
> +{
> +  long value = rs6000_const_f32_to_i32 (operands[1]);
> +  emit_insn (gen_xxspltidp_v2df_inst (operands[0], GEN_INT (value)));
> +  DONE;
> +})
> +
> +(define_insn "xxspltidp_v2df_inst"
> +  [(set (match_operand:V2DF 0 "register_operand" "=wa")
> +     (unspec:V2DF [(match_operand:SI 1 "c32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTID))]
> +  "TARGET_FUTURE"
> +  "xxspltidp %x0,%c1"
> +  [(set_attr "type" "vecsimple")])
> +
> +(define_expand "xxsplti32dx_v4si"
> +  [(set (match_operand:V4SI 0 "register_operand" "=wa")
> +     (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "wa")
> +                   (match_operand:QI 2 "u1bit_cint_operand" "n")
> +                   (match_operand:SI 3 "s32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTI32DX))]
> + "TARGET_FUTURE"
> +{
> +  int index = INTVAL (operands[2]);
> +
> +  if (!BYTES_BIG_ENDIAN)
> +    index = 1 - index;
> +
> +   /* Instruction uses destination as a source.  Do not overwrite source.  */
> +   emit_move_insn (operands[0], operands[1]);
> +
> +   emit_insn (gen_xxsplti32dx_v4si_inst (operands[0], GEN_INT (index),
> +                                       operands[3]));
> +   DONE;
> +}
> + [(set_attr "type" "vecsimple")])
> +
> +(define_insn "xxsplti32dx_v4si_inst"
> +  [(set (match_operand:V4SI 0 "register_operand" "+wa")
> +     (unspec:V4SI [(match_operand:QI 1 "u1bit_cint_operand" "n")
> +                   (match_operand:SI 2 "s32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTI32DX))]
> +  "TARGET_FUTURE"
> +  "xxsplti32dx %x0,%1,%2"
> +  [(set_attr "type" "vecsimple")])
> +
> +(define_expand "xxsplti32dx_v4sf"
> +  [(set (match_operand:V4SF 0 "register_operand" "=wa")
> +     (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "wa")
> +                   (match_operand:QI 2 "u1bit_cint_operand" "n")
> +                   (match_operand:SF 3 "f32bit_const_operand" "n")]
> +                  UNSPEC_XXSPLTI32DX))]
> +  "TARGET_FUTURE"
> +{
> +  int index = INTVAL (operands[2]);
> +  long value = rs6000_const_f32_to_i32 (operands[3]);
> +  if (!BYTES_BIG_ENDIAN)
> +    index = 1 - index;
> +
> +  /* Instruction uses destination as a source.  Do not overwrite source.  */
> +   emit_move_insn (operands[0], operands[1]);
> +   emit_insn (gen_xxsplti32dx_v4sf_inst (operands[0], GEN_INT (index),
> +                                      GEN_INT (value)));
> +   DONE;
> +})
> +
> +(define_insn "xxsplti32dx_v4sf_inst"
> +  [(set (match_operand:V4SF 0 "register_operand" "+wa")
> +     (unspec:V4SF [(match_operand:QI 1 "u1bit_cint_operand" "n")
> +                   (match_operand:SI 2 "s32bit_cint_operand" "n")]
> +                  UNSPEC_XXSPLTI32DX))]
> +  "TARGET_FUTURE"
> +  "xxsplti32dx %x0,%1,%2"
> +   [(set_attr "type" "vecsimple")])
> +
>  (define_expand "vstrir_<mode>"
>    [(set (match_operand:VIshort 0 "altivec_register_operand")
>       (unspec:VIshort [(match_operand:VIshort 1 "altivec_register_operand")]
> diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
> index c3f460face2..48f913c5718 100644
> --- a/gcc/config/rs6000/predicates.md
> +++ b/gcc/config/rs6000/predicates.md
> @@ -214,6 +214,11 @@
>    (and (match_code "const_int")
>         (match_test "INTVAL (op) >= -16 && INTVAL (op) <= 15")))
> 
> +;; Return 1 if op is a unsigned 1-bit constant integer.
> +(define_predicate "u1bit_cint_operand"
> +  (and (match_code "const_int")
> +       (match_test "INTVAL (op) >= 0 && INTVAL (op) <= 1")))
> +
>  ;; Return 1 if op is a unsigned 3-bit constant integer.
>  (define_predicate "u3bit_cint_operand"
>    (and (match_code "const_int")
> @@ -272,6 +277,34 @@
>         (match_test "(unsigned HOST_WIDE_INT)
>                   (INTVAL (op) + 0x8000) >= 0x10000")))
> 
> +;; Return 1 if op is a 32-bit constant signed integer
> +(define_predicate "s32bit_cint_operand"
> +  (and (match_code "const_int")
> +       (match_test "(unsigned HOST_WIDE_INT)
> +                    (0x80000000 + UINTVAL (op)) >> 32 == 0")))
> +
> +;; Return 1 if op is a constant 32-bit unsigned
> +(define_predicate "c32bit_cint_operand"
> +  (and (match_code "const_int")
> +       (match_test "((UINTVAL (op) >> 32) == 0)")))
> +
> +;; Return 1 if op is a constant 32-bit floating point value
> +(define_predicate "f32bit_const_operand"
> +  (match_code "const_double")
> +{
> +  if (GET_MODE (op) == SFmode)
> +    return 1;
> +
> +  else if ((GET_MODE (op) == DFmode) && ((UINTVAL (op) >> 32) == 0))
> +   {
> +    /* Value fits in 32-bits */
> +    return 1;
> +    }
> +  else
> +    /* Not the expected mode.  */
> +    return 0;
> +})
> +
>  ;; Return 1 if op is a positive constant integer that is an exact power of 2.
>  (define_predicate "exact_log2_cint_operand"
>    (and (match_code "const_int")
> diff --git a/gcc/config/rs6000/rs6000-builtin.def 
> b/gcc/config/rs6000/rs6000-builtin.def
> index 2b198177ef0..c85326de7f2 100644
> --- a/gcc/config/rs6000/rs6000-builtin.def
> +++ b/gcc/config/rs6000/rs6000-builtin.def
> @@ -2666,6 +2666,15 @@ BU_FUTURE_V_3 (VSRDB_V16QI, "vsrdb_v16qi", CONST, 
> vsrdb_v16qi)
>  BU_FUTURE_V_3 (VSRDB_V8HI, "vsrdb_v8hi", CONST, vsrdb_v8hi)
>  BU_FUTURE_V_3 (VSRDB_V4SI, "vsrdb_v4si", CONST, vsrdb_v4si)
>  BU_FUTURE_V_3 (VSRDB_V2DI, "vsrdb_v2di", CONST, vsrdb_v2di)
> +
> +BU_FUTURE_V_1 (VXXSPLTIW_V4SI, "vxxspltiw_v4si", CONST, xxspltiw_v4si)
> +BU_FUTURE_V_1 (VXXSPLTIW_V4SF, "vxxspltiw_v4sf", CONST, xxspltiw_v4sf)
> +
> +BU_FUTURE_V_1 (VXXSPLTID, "vxxspltidp", CONST, xxspltidp_v2df)
> +
> +BU_FUTURE_V_3 (VXXSPLTI32DX_V4SI, "vxxsplti32dx_v4si", CONST, 
> xxsplti32dx_v4si)
> +BU_FUTURE_V_3 (VXXSPLTI32DX_V4SF, "vxxsplti32dx_v4sf", CONST, 
> xxsplti32dx_v4sf)
> +
>  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)
> @@ -2697,6 +2706,10 @@ BU_FUTURE_OVERLOAD_1 (VSTRIL, "stril")
> 
>  BU_FUTURE_OVERLOAD_1 (VSTRIR_P, "strir_p")
>  BU_FUTURE_OVERLOAD_1 (VSTRIL_P, "stril_p")
> +
> +BU_FUTURE_OVERLOAD_1 (XXSPLTIW, "xxspltiw")
> +BU_FUTURE_OVERLOAD_1 (XXSPLTID, "xxspltid")
> +BU_FUTURE_OVERLOAD_3 (XXSPLTI32DX, "xxsplti32dx")
>  
>  /* 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 092e6c1cc2c..e36aafaf71c 100644
> --- a/gcc/config/rs6000/rs6000-call.c
> +++ b/gcc/config/rs6000/rs6000-call.c
> @@ -5679,6 +5679,22 @@ const struct altivec_builtin_types 
> altivec_overloaded_builtins[] = {
>      RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI,
>      RS6000_BTI_unsigned_V2DI, RS6000_BTI_UINTQI },
> 
> +  { FUTURE_BUILTIN_VEC_XXSPLTIW, FUTURE_BUILTIN_VXXSPLTIW_V4SI,
> +    RS6000_BTI_V4SI, RS6000_BTI_INTSI, 0, 0 },
> +  { FUTURE_BUILTIN_VEC_XXSPLTIW, FUTURE_BUILTIN_VXXSPLTIW_V4SF,
> +    RS6000_BTI_V4SF, RS6000_BTI_float, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_XXSPLTID, FUTURE_BUILTIN_VXXSPLTID,
> +    RS6000_BTI_V2DF, RS6000_BTI_float, 0, 0 },
> +
> +  { FUTURE_BUILTIN_VEC_XXSPLTI32DX, FUTURE_BUILTIN_VXXSPLTI32DX_V4SI,
> +    RS6000_BTI_V4SI, RS6000_BTI_V4SI, RS6000_BTI_UINTQI, RS6000_BTI_INTSI },
> +  { FUTURE_BUILTIN_VEC_XXSPLTI32DX, FUTURE_BUILTIN_VXXSPLTI32DX_V4SI,
> +    RS6000_BTI_unsigned_V4SI, RS6000_BTI_unsigned_V4SI, RS6000_BTI_UINTQI,
> +    RS6000_BTI_UINTSI },
> +  { FUTURE_BUILTIN_VEC_XXSPLTI32DX, FUTURE_BUILTIN_VXXSPLTI32DX_V4SF,
> +    RS6000_BTI_V4SF, RS6000_BTI_V4SF, RS6000_BTI_UINTQI, RS6000_BTI_float },
> +
>    { FUTURE_BUILTIN_VEC_SRDB, FUTURE_BUILTIN_VSRDB_V16QI,
>      RS6000_BTI_V16QI, RS6000_BTI_V16QI,
>      RS6000_BTI_V16QI, RS6000_BTI_UINTQI },
> @@ -13539,6 +13555,9 @@ builtin_function_type (machine_mode mode_ret, 
> machine_mode mode_arg0,
>      case ALTIVEC_BUILTIN_VSRH:
>      case ALTIVEC_BUILTIN_VSRW:
>      case P8V_BUILTIN_VSRD:
> +    /* Vector splat immediate insert */
> +    case FUTURE_BUILTIN_VXXSPLTI32DX_V4SI:
> +    case FUTURE_BUILTIN_VXXSPLTI32DX_V4SF:
>        h.uns_p[2] = 1;
>        break;
> 
> diff --git a/gcc/config/rs6000/rs6000-protos.h 
> b/gcc/config/rs6000/rs6000-protos.h
> index 5508484ba19..c6158874ce9 100644
> --- a/gcc/config/rs6000/rs6000-protos.h
> +++ b/gcc/config/rs6000/rs6000-protos.h
> @@ -274,6 +274,7 @@ extern void rs6000_asm_output_dwarf_pcrel (FILE *file, 
> int size,
>                                          const char *label);
>  extern void rs6000_asm_output_dwarf_datarel (FILE *file, int size,
>                                            const char *label);
> +extern long long rs6000_const_f32_to_i32 (rtx operand);
> 
>  /* Declare functions in rs6000-c.c */
> 
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index 58f5d780603..89fcc99df0a 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -26494,6 +26494,17 @@ rs6000_cannot_substitute_mem_equiv_p (rtx mem)
>    return false;
>  }
> 
> +long long
> +rs6000_const_f32_to_i32 (rtx operand)
> +{
> +  long long value;
> +  const struct real_value *rv = CONST_DOUBLE_REAL_VALUE (operand);
> +
> +  gcc_assert (GET_MODE (operand) == SFmode);
> +  REAL_VALUE_TO_TARGET_SINGLE (*rv, value);
> +  return value;
> +}
> +
>  struct gcc_target targetm = TARGET_INITIALIZER;
> 
>  #include "gt-rs6000.h"
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 6926c866492..dfdffead903 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -21148,6 +21148,41 @@ this instruction must be endian-aware.
> 
>  @findex vec_srdb
> 
> +Vector Splat
> +
> +@smallexample
> +@exdent vector signed int vec_splati (const signed int);
> +@exdent vector float vec_splati (const float);
> +@end smallexample
> +
> +Splat a 32-bit immediate into a vector of words.
> +
> +@findex vec_splati
> +
> +@smallexample
> +@exdent vector double vec_splatid (const float);
> +@end smallexample
> +
> +Convert a single precision floating-point value to double-precision and splat
> +the result to a vector of double-precision floats.
> +
> +@findex vec_splatid
> +
> +@smallexample
> +@exdent vector signed int vec_splati_ins (vector signed int,
> +const unsigned int, const signed int);
> +@exdent vector unsigned int vec_splati_ins (vector unsigned int,
> +const unsigned int, const unsigned int);
> +@exdent vector float vec_splati_ins (vector float, const unsigned int,
> +const float);
> +@end smallexample
> +
> +Argument 2 must be either 0 or 1.  Splat the value of argument 3 into the 
> word
> +identified by argument 2 of each doubleword of argument 1 and return the
> +result.  The other words of argument 1 are unchanged.
> +
> +@findex vec_splati_ins
> +
>  @smallexample
>  @exdent vector unsigned long long int
>  @exdent vec_pdep (vector unsigned long long int, vector unsigned long long 
> int)
> diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c 
> b/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> new file mode 100644
> index 00000000000..f9fa55ae0d4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> @@ -0,0 +1,145 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_future_hw } */
> +/* { dg-options "-mdejagnu-cpu=future" } */
> +#include <altivec.h>
> +
> +#define DEBUG 0
> +
> +#ifdef DEBUG
> +#include <stdio.h>
> +#endif
> +
> +extern void abort (void);
> +
> +int
> +main (int argc, char *argv [])
> +{
> +  int i;
> +  vector int vsrc_a_int;
> +  vector int vresult_int;
> +  vector int expected_vresult_int;
> +  int src_a_int = 13;
> +
> +  vector unsigned int vsrc_a_uint;
> +  vector unsigned int vresult_uint;
> +  vector unsigned int expected_vresult_uint;
> +  unsigned int src_a_uint = 7;
> +
> +  vector float vresult_f;
> +  vector float expected_vresult_f;
> +  vector float vsrc_a_f;
> +  float src_a_f = 23.0;
> +
> +  vector double vsrc_a_d;
> +  vector double vresult_d;
> +  vector double expected_vresult_d;
> + 
> +  /* Vector splati word */
> +  vresult_int = (vector signed int) { 1, 2, 3, 4 };
> +  expected_vresult_int = (vector signed int) { -13, -13, -13, -13 }; 
> +                                              
> +  vresult_int = vec_splati ( -13 );
> +
> +  if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati (src_a_int)\n");
> +    for(i = 0; i < 4; i++)
> +      printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
> +          i, vresult_int[i], i, expected_vresult_int[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +
> +  vresult_f = (vector float) { 1.0, 2.0, 3.0, 4.0 };
> +  expected_vresult_f = (vector float) { 23.0, 23.0, 23.0, 23.0 };
> +                                              
> +  vresult_f = vec_splati (23.0f);
> +
> +  if (!vec_all_eq (vresult_f,  expected_vresult_f)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati (src_a_f)\n");
> +    for(i = 0; i < 4; i++)
> +      printf(" vresult_f[%d] = %f, expected_vresult_f[%d] = %f\n",
> +          i, vresult_f[i], i, expected_vresult_f[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +
> +  /* Vector splati double */
> +  vresult_d = (vector double) { 2.0, 3.0 };
> +  expected_vresult_d = (vector double) { -31.0, -31.0 };
> +                                              
> +  vresult_d = vec_splatid (-31.0f);
> +
> +  if (!vec_all_eq (vresult_d,  expected_vresult_d)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati (-31.0f)\n");
> +    for(i = 0; i < 2; i++)
> +      printf(" vresult_d[%i] = %f, expected_vresult_d[%i] = %f\n",
> +          i, vresult_d[i], i, expected_vresult_d[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +
> +  /* Vector splat immediate */
> +  vsrc_a_int = (vector int) { 2, 3, 4, 5 };
> +  vresult_int = (vector int) { 1, 1, 1, 1 };
> +  expected_vresult_int = (vector int) { 2, 20, 4, 20 };
> +                                              
> +  vresult_int = vec_splati_ins (vsrc_a_int, 1, 20);
> +
> +  if (!vec_all_eq (vresult_int,  expected_vresult_int)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati_ins (vsrc_a_int, 1, 20)\n");
> +    for(i = 0; i < 4; i++)
> +      printf(" vresult_int[%i] = %d, expected_vresult_int[%i] = %d\n",
> +          i, vresult_int[i], i, expected_vresult_int[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +  
> +  vsrc_a_uint = (vector unsigned int) { 4, 5, 6, 7 };
> +  vresult_uint = (vector unsigned int) { 1, 1, 1, 1 };
> +  expected_vresult_uint = (vector unsigned int) { 4, 40, 6, 40 };
> +                                              
> +  vresult_uint = vec_splati_ins (vsrc_a_uint, 1, 40);
> +
> +  if (!vec_all_eq (vresult_uint,  expected_vresult_uint)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati_ins (vsrc_a_uint, 1, 40)\n");
> +    for(i = 0; i < 4; i++)
> +      printf(" vresult_uint[%i] = %d, expected_vresult_uint[%i] = %d\n",
> +          i, vresult_uint[i], i, expected_vresult_uint[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +  
> +  vsrc_a_f = (vector float) { 2.0, 3.0, 4.0, 5.0 };
> +  vresult_f = (vector float) { 1.0, 1.0, 1.0, 1.0 };
> +  expected_vresult_f = (vector float) { 2.0, 20.1, 4.0, 20.1 };
> +                                              
> +  vresult_f = vec_splati_ins (vsrc_a_f, 1, 20.1f);
> +
> +  if (!vec_all_eq (vresult_f,  expected_vresult_f)) {
> +#if DEBUG
> +    printf("ERROR, vec_splati_ins (vsrc_a_f, 1, 20.1)\n");
> +    for(i = 0; i < 4; i++)
> +      printf(" vresult_f[%i] = %f, expected_vresult_f[%i] = %f\n",
> +          i, vresult_f[i], i, expected_vresult_f[i]);
> +#else
> +    abort();
> +#endif
> +  }
> +  
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler-times {\msplati\M} 6 } } */
> +/* { dg-final { scan-assembler-times {\msrdbi\M} 6 } } */
> +
> +

Reply via email to