Re: [PATCH] RS6000, add VSX mask manipulation support

2020-05-26 Thread will schmidt via Gcc-patches
On Fri, 2020-05-22 at 13:27 -0700, Carl Love wrote:
> GCC maintainers:
> 
> The following patch adds support for builtins
> vec_genbm(),  vec_genhm(),
> vec_genwm(), vec_gendm(), vec_genqm(), vec_cntm(), vec_expandm(),
> vec_extractm().  Support for instructions mtvsrbm, mtvsrhm, mtvsrwm,
> mtvsrdm, mtvsrqm, cntm, vexpandm, vextractm.
> 
> The test has been tested on:
> 
>   powerpc64le-unknown-linux-gnu (Power 9 LE)
> 
> and mambo with no regression errors.
> 
> Please let me know if this patch is acceptable for mainline.
> 
> Thanks.
> 
>Carl Love
> ---
> 
> RS6000 RFC 2629, add VSX mask manipulation support
> 
> gcc/ChangeLog
> 
> 2020-05-22  Carl Love  
> 
>   * config/rs6000/vsx.md  (VSX_MM): New define_mode_iterator.
>   (VSX_MM4): New define_mode_iterator.
>   (VSX_MM_SUFFIX4): New define_mode_attr.
>   (vec_mtvsrbm): New define_expand.
>   (vec_mtvsrbmi): New define_insn.
>   (vec_mtvsr_): New define_insn.
>   (vec_cntmb_): New define_insn.
>   (vec_extract_): New define_insn.
>   (vec_expand_): New define_insn.
>   (define_c_enum unspec): Add entries UNSPEC_MTVSBM, UNSPEC_VCNTMB,
>   UNSPEC_VEXTRACT, UNSPEC_VEXPAND.
>   * config/rs6000/altivec.h: Add defines vec_genbm, vec_genhm, vec_genwm,
>   vec_gendm, vec_genqm, vec_cntm, vec_expandm, vec_extractm.

Nit (?)  Name/symbol first.  i.e. 
(vec_genbm, vec_genhm,...) Add definitions.

>   * config/rs6000/rs6000-builtin.c: Add defines BU_FUTURE_2, BU_FUTURE_1.
>   (BU_FUTURE_1): Add definitions for mtvsrbm, mtvsrhm, mtvsrwm,
>   mtvsrdm, mtvsrqm, vexpandmb, vexpandmh, vexpandmw, vexpandmd, vexpandmq,
>   vextractmb, vextractmh, vextractmw, vextractmd, vextractmq.
>   (BU_FUTURE_2): Add definitions for cntmbb, cntmbh, cntmbw, cntmbd.
>   (BU_FUTURE_OVERLOAD_1): Add definitions for mtvsrbm, mtvsrhm,
>   mtvsrwm, mtvsrdm, mtvsrqm, vexpandm, vextractm.
>   (BU_FUTURE_OVERLOAD_2): Add defition for cntm.
>   * config/rs6000/rs6000-call.c (rs6000_expand_binop_builtin): Add
>   checks for CODE_FOR_vec_cntmbb_v16qi, CODE_FOR_vec_cntmb_v8hi,
>   CODE_FOR_vec_cntmb_v4si, CODE_FOR_vec_cntmb_v2di.
>   (altivec_overloaded_builtins): Add overloaded argument entries for
>   FUTURE_BUILTIN_VEC_MTVSRBM, FUTURE_BUILTIN_VEC_MTVSRHM, 
> FUTURE_BUILTIN_VEC_MTVSRWM,
>   FUTURE_BUILTIN_VEC_MTVSRDM, FUTURE_BUILTIN_VEC_MTVSRQM, 
> FUTURE_BUILTIN_VEC_VCNTMBB,
>   FUTURE_BUILTIN_VCNTMBB, FUTURE_BUILTIN_VCNTMBH, FUTURE_BUILTIN_VCNTMBW,
>   FUTURE_BUILTIN_VCNTMBD, FUTURE_BUILTIN_VEXPANDMB, 
> FUTURE_BUILTIN_VEXPANDMH,
>   FUTURE_BUILTIN_VEXPANDMW, FUTURE_BUILTIN_VEXPANDMD, 
> FUTURE_BUILTIN_VEXPANDMQ,

>   FUTURE_BUILTIN_VEXTRACTMB, FUTURE_BUILTIN_VEXTRACTMH, 
> FUTURE_BUILTIN_VEXTRACTMW,
>   FUTURE_BUILTIN_VEXTRACTMD, FUTURE_BUILTIN_VEXTRACTMQ.

>   (builtin_function_type): Add case entries for FUTURE_BUILTIN_MTVSRBM,
>   FUTURE_BUILTIN_MTVSRHM, FUTURE_BUILTIN_MTVSRWM, FUTURE_BUILTIN_MTVSRDM,
>   FUTURE_BUILTIN_MTVSRQM, FUTURE_BUILTIN_VCNTMBB, FUTURE_BUILTIN_VCNTMBH,
>   FUTURE_BUILTIN_VCNTMBW, FUTURE_BUILTIN_VCNTMBD, 
> FUTURE_BUILTIN_VEXPANDMB,
>   FUTURE_BUILTIN_VEXPANDMH, FUTURE_BUILTIN_VEXPANDMW, 
> FUTURE_BUILTIN_VEXPANDMD,
>   FUTURE_BUILTIN_VEXPANDMQ.
>   * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add entries
>   for MTVSRBM, MTVSRHM, MTVSRWM, MTVSRDM, MTVSRQM, VCNTM, VEXPANDM, 
> VEXTRACTM.

The rs6000-c.c reference here ^ doesn't exist below.  Looks like that
was moved to rs6000-builtin.def.



>   * testsuite/gcc.target/powerpc/vsx_mask-runnable.c:  Add runnable test 
> case.


> ---
>  gcc/config/rs6000/altivec.h   |  10 +
>  gcc/config/rs6000/rs6000-builtin.def  |  45 ++
>  gcc/config/rs6000/rs6000-call.c   |  66 +-
>  gcc/config/rs6000/vsx.md  |  67 ++
>  .../gcc.target/powerpc/vsx_mask-runnable.c| 614 ++



>  5 files changed, 801 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx_mask-runnable.c
> 
> diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h
> index 0a7e8ab3647..5917d3a2b76 100644
> --- a/gcc/config/rs6000/altivec.h
> +++ b/gcc/config/rs6000/altivec.h
> @@ -710,6 +710,16 @@ __altivec_scalar_pred(vec_any_nle,
> 
>  #define vec_strir_p(a)   __builtin_vec_strir_p (a)
>  #define vec_stril_p(a)   __builtin_vec_stril_p (a)
> +
> +/* VSX Mask Manipulation builtin. */
> +#define vec_genbm __builtin_vec_mtvsrbm
> +#define vec_genhm __builtin_vec_mtvsrhm
> +#define vec_genwm __builtin_vec_mtvsrwm
> +#define vec_gendm __builtin_vec_mtvsrdm
> +#define vec_genqm __builtin_vec_mtvsrqm
> +#define vec_cntm __builtin_vec_cntm
> +#define vec_expandm __builtin_vec_vexpandm
> +#define vec_extractm __builtin_vec_vextractm
>  #endif

ok

> 
>  #endif /* _ALTIVEC_H */
> diff --git 

[PATCH] RS6000, add VSX mask manipulation support

2020-05-22 Thread Carl Love via Gcc-patches
GCC maintainers:

The following patch adds support for builtins vec_genbm(),  vec_genhm(),
vec_genwm(), vec_gendm(), vec_genqm(), vec_cntm(), vec_expandm(),
vec_extractm().  Support for instructions mtvsrbm, mtvsrhm, mtvsrwm,
mtvsrdm, mtvsrqm, cntm, vexpandm, vextractm.

The test has been tested on:

  powerpc64le-unknown-linux-gnu (Power 9 LE)

and mambo with no regression errors.

Please let me know if this patch is acceptable for mainline.

Thanks.

   Carl Love
---

RS6000 RFC 2629, add VSX mask manipulation support

gcc/ChangeLog

2020-05-22  Carl Love  

* config/rs6000/vsx.md  (VSX_MM): New define_mode_iterator.
(VSX_MM4): New define_mode_iterator.
(VSX_MM_SUFFIX4): New define_mode_attr.
(vec_mtvsrbm): New define_expand.
(vec_mtvsrbmi): New define_insn.
(vec_mtvsr_): New define_insn.
(vec_cntmb_): New define_insn.
(vec_extract_): New define_insn.
(vec_expand_): New define_insn.
(define_c_enum unspec): Add entries UNSPEC_MTVSBM, UNSPEC_VCNTMB,
UNSPEC_VEXTRACT, UNSPEC_VEXPAND.
* config/rs6000/altivec.h: Add defines vec_genbm, vec_genhm, vec_genwm,
vec_gendm, vec_genqm, vec_cntm, vec_expandm, vec_extractm.
* config/rs6000/rs6000-builtin.c: Add defines BU_FUTURE_2, BU_FUTURE_1.
(BU_FUTURE_1): Add definitions for mtvsrbm, mtvsrhm, mtvsrwm,
mtvsrdm, mtvsrqm, vexpandmb, vexpandmh, vexpandmw, vexpandmd, vexpandmq,
vextractmb, vextractmh, vextractmw, vextractmd, vextractmq.
(BU_FUTURE_2): Add definitions for cntmbb, cntmbh, cntmbw, cntmbd.
(BU_FUTURE_OVERLOAD_1): Add definitions for mtvsrbm, mtvsrhm,
mtvsrwm, mtvsrdm, mtvsrqm, vexpandm, vextractm.
(BU_FUTURE_OVERLOAD_2): Add defition for cntm.
* config/rs6000/rs6000-call.c (rs6000_expand_binop_builtin): Add
checks for CODE_FOR_vec_cntmbb_v16qi, CODE_FOR_vec_cntmb_v8hi,
CODE_FOR_vec_cntmb_v4si, CODE_FOR_vec_cntmb_v2di.
(altivec_overloaded_builtins): Add overloaded argument entries for
FUTURE_BUILTIN_VEC_MTVSRBM, FUTURE_BUILTIN_VEC_MTVSRHM, 
FUTURE_BUILTIN_VEC_MTVSRWM,
FUTURE_BUILTIN_VEC_MTVSRDM, FUTURE_BUILTIN_VEC_MTVSRQM, 
FUTURE_BUILTIN_VEC_VCNTMBB,
FUTURE_BUILTIN_VCNTMBB, FUTURE_BUILTIN_VCNTMBH, FUTURE_BUILTIN_VCNTMBW,
FUTURE_BUILTIN_VCNTMBD, FUTURE_BUILTIN_VEXPANDMB, 
FUTURE_BUILTIN_VEXPANDMH,
FUTURE_BUILTIN_VEXPANDMW, FUTURE_BUILTIN_VEXPANDMD, 
FUTURE_BUILTIN_VEXPANDMQ,
FUTURE_BUILTIN_VEXTRACTMB, FUTURE_BUILTIN_VEXTRACTMH, 
FUTURE_BUILTIN_VEXTRACTMW,
FUTURE_BUILTIN_VEXTRACTMD, FUTURE_BUILTIN_VEXTRACTMQ.
(builtin_function_type): Add case entries for FUTURE_BUILTIN_MTVSRBM,
FUTURE_BUILTIN_MTVSRHM, FUTURE_BUILTIN_MTVSRWM, FUTURE_BUILTIN_MTVSRDM,
FUTURE_BUILTIN_MTVSRQM, FUTURE_BUILTIN_VCNTMBB, FUTURE_BUILTIN_VCNTMBH,
FUTURE_BUILTIN_VCNTMBW, FUTURE_BUILTIN_VCNTMBD, 
FUTURE_BUILTIN_VEXPANDMB,
FUTURE_BUILTIN_VEXPANDMH, FUTURE_BUILTIN_VEXPANDMW, 
FUTURE_BUILTIN_VEXPANDMD,
FUTURE_BUILTIN_VEXPANDMQ.
* config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add entries
for MTVSRBM, MTVSRHM, MTVSRWM, MTVSRDM, MTVSRQM, VCNTM, VEXPANDM, 
VEXTRACTM.
* testsuite/gcc.target/powerpc/vsx_mask-runnable.c:  Add runnable test 
case.
---
 gcc/config/rs6000/altivec.h   |  10 +
 gcc/config/rs6000/rs6000-builtin.def  |  45 ++
 gcc/config/rs6000/rs6000-call.c   |  66 +-
 gcc/config/rs6000/vsx.md  |  67 ++
 .../gcc.target/powerpc/vsx_mask-runnable.c| 614 ++
 5 files changed, 801 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx_mask-runnable.c

diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h
index 0a7e8ab3647..5917d3a2b76 100644
--- a/gcc/config/rs6000/altivec.h
+++ b/gcc/config/rs6000/altivec.h
@@ -710,6 +710,16 @@ __altivec_scalar_pred(vec_any_nle,
 
 #define vec_strir_p(a) __builtin_vec_strir_p (a)
 #define vec_stril_p(a) __builtin_vec_stril_p (a)
+
+/* VSX Mask Manipulation builtin. */
+#define vec_genbm __builtin_vec_mtvsrbm
+#define vec_genhm __builtin_vec_mtvsrhm
+#define vec_genwm __builtin_vec_mtvsrwm
+#define vec_gendm __builtin_vec_mtvsrdm
+#define vec_genqm __builtin_vec_mtvsrqm
+#define vec_cntm __builtin_vec_cntm
+#define vec_expandm __builtin_vec_vexpandm
+#define vec_extractm __builtin_vec_vextractm
 #endif
 
 #endif /* _ALTIVEC_H */
diff --git a/gcc/config/rs6000/rs6000-builtin.def 
b/gcc/config/rs6000/rs6000-builtin.def
index 8b1ddb00045..7cab5097aeb 100644
--- a/gcc/config/rs6000/rs6000-builtin.def
+++ b/gcc/config/rs6000/rs6000-builtin.def
@@ -1049,6 +1049,22 @@
(RS6000_BTC_ ## ATTR/* ATTR */  \
 | RS6000_BTC_TERNARY), \