On Wed, 2021-09-01 at 11:13 -0500, Bill Schmidt via Gcc-patches wrote: > This patch just duplicates a couple of functions and adjusts them to use the > new builtin names. There's no logical change otherwise. > > 2021-08-31 Bill Schmidt <wschm...@linux.ibm.com> > > gcc/ > * config/rs6000/rs6000.c (rs6000-builtins.h): New include. > (rs6000_new_builtin_vectorized_function): New function. > (rs6000_new_builtin_md_vectorized_function): Likewise. > (rs6000_builtin_vectorized_function): Call > rs6000_new_builtin_vectorized_function. > (rs6000_builtin_md_vectorized_function): Call > rs6000_new_builtin_md_vectorized_function.
ok > --- > gcc/config/rs6000/rs6000.c | 253 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 253 insertions(+) > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > index b7ea1483da5..52c78c7500c 100644 > --- a/gcc/config/rs6000/rs6000.c > +++ b/gcc/config/rs6000/rs6000.c > @@ -78,6 +78,7 @@ > #include "case-cfn-macros.h" > #include "ppc-auxv.h" > #include "rs6000-internal.h" > +#include "rs6000-builtins.h" > #include "opts.h" > > /* This file should be included last. */ > @@ -5501,6 +5502,251 @@ rs6000_loop_unroll_adjust (unsigned nunroll, struct > loop *loop) > return nunroll; > } > > +/* Returns a function decl for a vectorized version of the builtin function > + with builtin function code FN and the result vector type TYPE, or > NULL_TREE > + if it is not available. */ > + > +static tree > +rs6000_new_builtin_vectorized_function (unsigned int fn, tree type_out, > + tree type_in) > +{ > + machine_mode in_mode, out_mode; > + int in_n, out_n; > + > + if (TARGET_DEBUG_BUILTIN) > + fprintf (stderr, "rs6000_new_builtin_vectorized_function (%s, %s, %s)\n", > + combined_fn_name (combined_fn (fn)), > + GET_MODE_NAME (TYPE_MODE (type_out)), > + GET_MODE_NAME (TYPE_MODE (type_in))); > + > + if (TREE_CODE (type_out) != VECTOR_TYPE > + || TREE_CODE (type_in) != VECTOR_TYPE) > + return NULL_TREE; > + > + out_mode = TYPE_MODE (TREE_TYPE (type_out)); > + out_n = TYPE_VECTOR_SUBPARTS (type_out); > + in_mode = TYPE_MODE (TREE_TYPE (type_in)); > + in_n = TYPE_VECTOR_SUBPARTS (type_in); > + > + switch (fn) > + { > + CASE_CFN_COPYSIGN: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_CPSGNDP]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_CPSGNSP]; > + if (VECTOR_UNIT_ALTIVEC_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_COPYSIGN_V4SF]; > + break; > + CASE_CFN_CEIL: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRDPIP]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRSPIP]; > + if (VECTOR_UNIT_ALTIVEC_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VRFIP]; > + break; > + CASE_CFN_FLOOR: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRDPIM]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRSPIM]; > + if (VECTOR_UNIT_ALTIVEC_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VRFIM]; > + break; > + CASE_CFN_FMA: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVMADDDP]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVMADDSP]; > + if (VECTOR_UNIT_ALTIVEC_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VMADDFP]; > + break; > + CASE_CFN_TRUNC: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRDPIZ]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRSPIZ]; > + if (VECTOR_UNIT_ALTIVEC_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VRFIZ]; > + break; > + CASE_CFN_NEARBYINT: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && flag_unsafe_math_optimizations > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRDPI]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && flag_unsafe_math_optimizations > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRSPI]; > + break; > + CASE_CFN_RINT: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && !flag_trapping_math > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRDPIC]; > + if (VECTOR_UNIT_VSX_P (V4SFmode) > + && !flag_trapping_math > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_XVRSPIC]; > + break; > + default: > + break; > + } > + > + /* Generate calls to libmass if appropriate. */ > + if (rs6000_veclib_handler) > + return rs6000_veclib_handler (combined_fn (fn), type_out, type_in); > + > + return NULL_TREE; > +} > + ok > +/* Implement TARGET_VECTORIZE_BUILTIN_MD_VECTORIZED_FUNCTION. */ > + > +static tree > +rs6000_new_builtin_md_vectorized_function (tree fndecl, tree type_out, > + tree type_in) > +{ > + machine_mode in_mode, out_mode; > + int in_n, out_n; > + > + if (TARGET_DEBUG_BUILTIN) > + fprintf (stderr, > + "rs6000_new_builtin_md_vectorized_function (%s, %s, %s)\n", > + IDENTIFIER_POINTER (DECL_NAME (fndecl)), > + GET_MODE_NAME (TYPE_MODE (type_out)), > + GET_MODE_NAME (TYPE_MODE (type_in))); > + > + if (TREE_CODE (type_out) != VECTOR_TYPE > + || TREE_CODE (type_in) != VECTOR_TYPE) > + return NULL_TREE; > + > + out_mode = TYPE_MODE (TREE_TYPE (type_out)); > + out_n = TYPE_VECTOR_SUBPARTS (type_out); > + in_mode = TYPE_MODE (TREE_TYPE (type_in)); > + in_n = TYPE_VECTOR_SUBPARTS (type_in); > + > + enum rs6000_gen_builtins fn > + = (enum rs6000_gen_builtins) DECL_MD_FUNCTION_CODE (fndecl); > + switch (fn) > + { > + case RS6000_BIF_RSQRTF: > + if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VRSQRTFP]; > + break; > + case RS6000_BIF_RSQRT: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_RSQRT_2DF]; > + break; > + case RS6000_BIF_RECIPF: > + if (VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode) > + && out_mode == SFmode && out_n == 4 > + && in_mode == SFmode && in_n == 4) > + return rs6000_builtin_decls_x[RS6000_BIF_VRECIPFP]; > + break; > + case RS6000_BIF_RECIP: > + if (VECTOR_UNIT_VSX_P (V2DFmode) > + && out_mode == DFmode && out_n == 2 > + && in_mode == DFmode && in_n == 2) > + return rs6000_builtin_decls_x[RS6000_BIF_RECIP_V2DF]; > + break; > + default: > + break; > + } > + > + machine_mode in_vmode = TYPE_MODE (type_in); > + machine_mode out_vmode = TYPE_MODE (type_out); > + > + /* Power10 supported vectorized built-in functions. */ > + if (TARGET_POWER10 > + && in_vmode == out_vmode > + && VECTOR_UNIT_ALTIVEC_OR_VSX_P (in_vmode)) > + { > + machine_mode exp_mode = DImode; > + machine_mode exp_vmode = V2DImode; > + enum rs6000_gen_builtins bif; > + switch (fn) > + { > + case RS6000_BIF_DIVWE: > + case RS6000_BIF_DIVWEU: > + exp_mode = SImode; > + exp_vmode = V4SImode; > + if (fn == RS6000_BIF_DIVWE) > + bif = RS6000_BIF_VDIVESW; > + else > + bif = RS6000_BIF_VDIVEUW; > + break; > + case RS6000_BIF_DIVDE: > + case RS6000_BIF_DIVDEU: > + if (fn == RS6000_BIF_DIVDE) > + bif = RS6000_BIF_VDIVESD; > + else > + bif = RS6000_BIF_VDIVEUD; > + break; > + case RS6000_BIF_CFUGED: > + bif = RS6000_BIF_VCFUGED; > + break; > + case RS6000_BIF_CNTLZDM: > + bif = RS6000_BIF_VCLZDM; > + break; > + case RS6000_BIF_CNTTZDM: > + bif = RS6000_BIF_VCTZDM; > + break; > + case RS6000_BIF_PDEPD: > + bif = RS6000_BIF_VPDEPD; > + break; > + case RS6000_BIF_PEXTD: > + bif = RS6000_BIF_VPEXTD; > + break; > + default: > + return NULL_TREE; > + } > + > + if (in_mode == exp_mode && in_vmode == exp_vmode) > + return rs6000_builtin_decls_x[bif]; > + } > + > + return NULL_TREE; > +} ok > + > /* Handler for the Mathematical Acceleration Subsystem (mass) interface to a > library with vectorized intrinsics. */ > > @@ -5620,6 +5866,9 @@ rs6000_builtin_vectorized_function (unsigned int fn, > tree type_out, > machine_mode in_mode, out_mode; > int in_n, out_n; > > + if (new_builtins_are_live) > + return rs6000_new_builtin_vectorized_function (fn, type_out, type_in); > + > if (TARGET_DEBUG_BUILTIN) > fprintf (stderr, "rs6000_builtin_vectorized_function (%s, %s, %s)\n", > combined_fn_name (combined_fn (fn)), > @@ -5751,6 +6000,10 @@ rs6000_builtin_md_vectorized_function (tree fndecl, > tree type_out, > machine_mode in_mode, out_mode; > int in_n, out_n; > > + if (new_builtins_are_live) > + return rs6000_new_builtin_md_vectorized_function (fndecl, type_out, > + type_in); > + > if (TARGET_DEBUG_BUILTIN) > fprintf (stderr, "rs6000_builtin_md_vectorized_function (%s, %s, %s)\n", > IDENTIFIER_POINTER (DECL_NAME (fndecl)), ok. lgtm, thanks -Will