diff mbox series

[05/18] rs6000: Support for vectorizing built-in functions

Message ID bfdb24b9cde979b4f0626e1661b0dde4d1ed0567.1630511335.git.wschmidt@linux.ibm.com
State New
Headers show
Series Replace the Power target-specific builtin machinery | expand

Commit Message

Bill Schmidt Sept. 1, 2021, 4:13 p.m. UTC
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  <wschmidt@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.
---
 gcc/config/rs6000/rs6000.c | 253 +++++++++++++++++++++++++++++++++++++
 1 file changed, 253 insertions(+)

Comments

will schmidt Sept. 13, 2021, 7:29 p.m. UTC | #1
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  <wschmidt@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
Segher Boessenkool Sept. 17, 2021, 12:17 p.m. UTC | #2
On Wed, Sep 01, 2021 at 11:13:41AM -0500, Bill Schmidt wrote:
> This patch just duplicates a couple of functions and adjusts them to use the
> new builtin names.  There's no logical change otherwise.

> +/* 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;

This is not described in the function comment.  Should it?  Should this
be here at all, should it be an assert instead?

It also should say it implements the
TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION macro?

> +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;

Here it definitely should be an assert, the documentation of this hook
says so.

Other than that this is fine of course (or not worse than what there
already was, anyway ;-) ).  So put this on the big "one day we will
clean this up" list?

Okay for trunk.  Thanks!


Segher
diff mbox series

Patch

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;
+}
+
+/* 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;
+}
+
 /* 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)),