On Wed, Oct 21, 2026 at 11:01 AM Kewen Lin <[email protected]> wrote:
>
> Hi,
>
> GCC supports generating vectorized math calls to Intel SVML and the
> AMD ACML and AOCL libraries.  Add equivalent support for the HYGON
> vector math library (HVML) through -mveclibabi=hvml.
>
> The new handler maps 39 scalar math function families to the HVML
> entry-point naming convention, including the seven C23 pi-based
> trigonometric families.  Record the exact single- and double-precision
> vector widths provided by latest HVML alongside their operation
> cases, and translate the log operation to the HVML ln spelling.
> See invoke.texi for the complete list of mapped functions.
>
> Add a testcase that checks all 194 supported operation, precision,
> and vector-width combinations independently using -march=c86-4g-m7.
>
> The latest hvml library can be found via:
> https://github.com/BaoshunFang/binarys/blob/main/hpc/hml.tar.gz
>
> Bootstrapped and regress-tested on one c86-4g-m7 machine.
> Is it ok for trunk?  Also backport to gcc-16 and gcc-15 (with pi-based
> trigonometric functions dropped)?

The patch is isolated, so IMO it is OK to backport, but let's also ask
release managers (CC'd) for approval.

BTW: Even isolated patches need some "soak time" in the mainline (a
week or two), to ensure there are no unknown issues. I see no problems
here, though.

Uros.

>
> BR,
> Kewen
> -----
> gcc/ChangeLog:
>
>         * config/i386/i386-options.cc (ix86_option_override_internal):
>         Handle ix86_veclibabi_type_hvml case.
>         * config/i386/i386-options.h (ix86_veclibabi_hvml): New declare.
>         * config/i386/i386-opts.h (enum ix86_veclibabi): Add
>         ix86_veclibabi_type_hvml into the ix86_veclibabi enum.
>         * config/i386/i386.cc (ix86_veclibabi_hvml): New function.
>         * config/i386/i386.opt: Add the hvml type.
>         * doc/invoke.texi: Document -mveclibabi=hvml.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/i386/vectorize-hvml.c: New test.
>
> Co-authored-by: Zhizheng Yang <[email protected]>
> Co-authored-by: Yushuai Xing <[email protected]>
> Signed-off-by: Kewen Lin <[email protected]>
> Signed-off-by: Zhizheng Yang <[email protected]>
> Signed-off-by: Yushuai Xing <[email protected]>
> ---
>  gcc/config/i386/i386-options.cc               |   4 +
>  gcc/config/i386/i386-options.h                |   1 +
>  gcc/config/i386/i386-opts.h                   |   3 +-
>  gcc/config/i386/i386.cc                       | 202 ++++++++
>  gcc/config/i386/i386.opt                      |   3 +
>  gcc/doc/invoke.texi                           |  80 +++-
>  .../gcc.target/i386/vectorize-hvml.c          | 434 ++++++++++++++++++
>  7 files changed, 722 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/vectorize-hvml.c
>
> diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
> index ebd86f71f93..2d228983c9b 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -2835,6 +2835,10 @@ ix86_option_override_internal (bool main_args_p,
>         ix86_veclib_handler = &ix86_veclibabi_aocl;
>         break;
>
> +      case ix86_veclibabi_type_hvml:
> +       ix86_veclib_handler = &ix86_veclibabi_hvml;
> +       break;
> +
>        default:
>         gcc_unreachable ();
>        }
> diff --git a/gcc/config/i386/i386-options.h b/gcc/config/i386/i386-options.h
> index 463a1d94bd5..def4eb793d6 100644
> --- a/gcc/config/i386/i386-options.h
> +++ b/gcc/config/i386/i386-options.h
> @@ -60,6 +60,7 @@ extern tree (*ix86_veclib_handler) (combined_fn, tree, 
> tree);
>  extern tree ix86_veclibabi_svml (combined_fn, tree, tree);
>  extern tree ix86_veclibabi_acml (combined_fn, tree, tree);
>  extern tree ix86_veclibabi_aocl (combined_fn, tree, tree);
> +extern tree ix86_veclibabi_hvml (combined_fn, tree, tree);
>
>  enum ix86_function_specific_strings
>  {
> diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h
> index 61be2a2aa30..7d790e4b6f4 100644
> --- a/gcc/config/i386/i386-opts.h
> +++ b/gcc/config/i386/i386-opts.h
> @@ -88,7 +88,8 @@ enum ix86_veclibabi {
>    ix86_veclibabi_type_none,
>    ix86_veclibabi_type_svml,
>    ix86_veclibabi_type_acml,
> -  ix86_veclibabi_type_aocl
> +  ix86_veclibabi_type_aocl,
> +  ix86_veclibabi_type_hvml
>  };
>
>  enum stack_protector_guard {
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> index 553fa046fa9..8f063ecfd87 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -20764,6 +20764,208 @@ ix86_veclibabi_aocl (combined_fn fn, tree type_out, 
> tree type_in)
>    return new_fndecl;
>  }
>
> +/* Handler for an HVML-style interface to
> +   a library with vectorized intrinsics.  */
> +
> +tree
> +ix86_veclibabi_hvml (combined_fn fn, tree type_out, tree type_in)
> +{
> +  /* This accommodates the longest current HVML symbol.  The operation-name
> +     append below asserts the bound for future additions.  */
> +  char name[30] = "hvml_v";
> +  /* sizeof includes the trailing NUL, so the prefix length is 6.  */
> +  int name_len = sizeof ("hvml_v") - 1;
> +  tree fntype, new_fndecl, args;
> +  unsigned arity;
> +  machine_mode el_mode, in_mode;
> +  int n, in_n;
> +
> +  /* HVML is 64-bit only and is suitable only for unsafe math, since it
> +     trades off some accuracy for increased performance.  */
> +  if (!TARGET_64BIT || !flag_unsafe_math_optimizations)
> +    return NULL_TREE;
> +
> +  el_mode = TYPE_MODE (TREE_TYPE (type_out));
> +  n = TYPE_VECTOR_SUBPARTS (type_out);
> +  in_mode = TYPE_MODE (TREE_TYPE (type_in));
> +  in_n = TYPE_VECTOR_SUBPARTS (type_in);
> +  if (el_mode != in_mode || n != in_n)
> +    return NULL_TREE;
> +
> +  gcc_checking_assert (n > 0);
> +
> +  /* Decide whether there exists a function for the combination of FN, the
> +     mode and the vector width.  Return early if it doesn't.  */
> +  if (el_mode != DFmode && el_mode != SFmode)
> +    return NULL_TREE;
> +
> +  /* Select supported vector widths for FN in supported_n, with single
> +     precision first and double precision second.  Zeros pad unused widths.
> +     Keep each set with its case so the mapping cannot get out of sync.  */
> +  const int (*supported_n)[3];
> +#define GET_VW_INFO(...) \
> +  { \
> +    static const int widths[2][3] = { __VA_ARGS__ }; \
> +    supported_n = widths; \
> +    break; \
> +  }
> +  switch (fn)
> +    {
> +    CASE_CFN_ACOS:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  8 });
> +    CASE_CFN_ACOSH:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ACOSPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ASIN:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_ASINH:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ASINPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ATAN:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_ATAN2:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_ATAN2PI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ATANH:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_ATANPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_CBRT:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_COS:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_COSH:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_COSPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ERF:
> +      GET_VW_INFO ({  4, 16,  0 }, {  2,  4,  0 });
> +    CASE_CFN_ERFC:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_EXP:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_EXP2:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  8 });
> +    CASE_CFN_EXP10:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_EXPM1:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_FDIM:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_FMOD:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  8 });
> +    CASE_CFN_HYPOT:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_LOG:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_LOG1P:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_LOG2:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  8 });
> +    CASE_CFN_LOG10:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_LOGB:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_NEXTAFTER:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_POW:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_REMAINDER:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_SIN:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_SINH:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_SINPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_TAN:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_TANH:
> +      GET_VW_INFO ({  4,  8, 16 }, {  2,  4,  8 });
> +    CASE_CFN_TANPI:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    CASE_CFN_TGAMMA:
> +      GET_VW_INFO ({  4,  8,  0 }, {  2,  4,  0 });
> +    default: return NULL_TREE;
> +    }
> +#undef GET_VW_INFO
> +
> +  int j = el_mode == DFmode;
> +  bool n_is_supported = false;
> +  for (unsigned k = 0; k < 3; k++)
> +    if (supported_n[j][k] == n)
> +      {
> +       n_is_supported = true;
> +       break;
> +      }
> +  if (!n_is_supported)
> +    return NULL_TREE;
> +
> +  /* Append the precision and vector width to the function name.  */
> +  name[name_len++] = el_mode == DFmode ? 'd' : 's';
> +  switch (n)
> +    {
> +    case 2:
> +    case 4:
> +    case 8:
> +      name[name_len++] = '0' + n;
> +      break;
> +    case 16:
> +      name[name_len++] = '1';
> +      name[name_len++] = '6';
> +      break;
> +    default:
> +      gcc_unreachable ();
> +    }
> +  name[name_len++] = '_';
> +
> +  tree fndecl
> +    = mathfn_built_in (el_mode == DFmode ? double_type_node : 
> float_type_node,
> +                      fn);

Can fndecl be NULL here?

Although other ix86_veclibabi_* functions don't check fndecl for NULL,
mathfn_built_in returns NULL_TREE when the builtin isn’t implicit for
the target. Please also reformat the line to:

  tree fndecl = mathfn_built_in (el_mode == DFmode
                 ? double_type_node : float_type_node, fn);

> +  /* HVML spells the natural logarithm operation "ln".  */
> +  if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_LOGF
> +      || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_LOG)
> +    {
> +      gcc_checking_assert (name_len + sizeof ("ln") <= sizeof (name));
> +      sprintf (name + name_len, "%s", "ln");
> +    }
> +  else
> +    {
> +      /* Append the operation name (steal it from the name of a builtin).  */
> +      const char *bname = IDENTIFIER_POINTER (DECL_NAME (fndecl)) + 10;
> +      size_t bname_len = strlen (bname);
> +      gcc_checking_assert (name_len + bname_len < sizeof (name));
> +      sprintf (name + name_len, "%s", bname);
> +
> +      /* Single-precision scalar builtins end in 'f'; HVML symbols do not.  
> */
> +      if (el_mode == SFmode)
> +       name[name_len + bname_len - 1] = '\0';
> +    }
> +
> +  arity = 0;
> +  for (args = DECL_ARGUMENTS (fndecl); args; args = TREE_CHAIN (args))
> +    arity++;
> +
> +  if (arity == 1)
> +    fntype = build_function_type_list (type_out, type_in, NULL);
> +  else
> +    fntype = build_function_type_list (type_out, type_in, type_in, NULL);
> +
> +  /* Build a function declaration for the vectorized function.  */
> +  new_fndecl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
> +                          get_identifier (name), fntype);
> +  TREE_PUBLIC (new_fndecl) = 1;
> +  DECL_EXTERNAL (new_fndecl) = 1;
> +  DECL_IS_NOVOPS (new_fndecl) = 1;
> +  TREE_READONLY (new_fndecl) = 1;
> +
> +  return new_fndecl;
> +}
> +
>  /* Returns a decl of a function that implements scatter store with
>     register type VECTYPE and index type INDEX_TYPE and SCALE.
>     Return NULL_TREE if it is not available.  */
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index f9aeeac08fa..b4f7e8e3664 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -584,6 +584,9 @@ Enum(ix86_veclibabi) String(acml) 
> Value(ix86_veclibabi_type_acml)
>  EnumValue
>  Enum(ix86_veclibabi) String(aocl) Value(ix86_veclibabi_type_aocl)
>
> +EnumValue
> +Enum(ix86_veclibabi) String(hvml) Value(ix86_veclibabi_type_hvml)
> +
>  mvect8-ret-in-mem
>  Target Mask(VECT8_RETURNS) Save
>  Return 8-byte vectors in memory.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 66d80f17e74..4898b61cddc 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -36982,10 +36982,11 @@ Specifies the ABI type to use for vectorizing 
> intrinsics using an external
>  library.  Supported values for @var{type} are @samp{svml} for the Intel short
>  vector math library, @samp{aocl} for the math library (LibM) from AMD
>  Optimizing CPU Libraries (AOCL) and @samp{acml} for the end-of-life AMD core
> -math library (to which AOCL-LibM is the successor).
> +math library (to which AOCL-LibM is the successor), and @samp{hvml} for the
> +HYGON vector math library (HVML).
>  To use this option, both @option{-ftree-vectorize} and
> -@option{-funsafe-math-optimizations} have to be enabled, and an SVML or ACML
> -ABI-compatible library must be specified at link time.
> +@option{-funsafe-math-optimizations} have to be enabled, and an SVML, ACML,
> +or HVML ABI-compatible library must be specified at link time.
>
>  GCC currently emits calls to @code{vmldExp2}, @code{vmldLn2},
>  @code{vmldLog102}, @code{vmldPow2}, @code{vmldTanh2}, @code{vmldTan2},
> @@ -37028,7 +37029,78 @@ type when @option{-mveclibabi=aocl} is used, and 
> @code{__vrd2_sin},
>  @code{__vrd2_log10}, @code{__vrs4_sinf}, @code{__vrs4_cosf},
>  @code{__vrs4_expf}, @code{__vrs4_logf}, @code{__vrs4_log2f},
>  @code{__vrs4_log10f} and @code{__vrs4_powf} for the corresponding function 
> type
> -when @option{-mveclibabi=acml} is used.
> +when @option{-mveclibabi=acml} is used, and @code{hvml_vs4_acos},
> +@code{hvml_vs8_acos}, @code{hvml_vd2_acos}, @code{hvml_vd4_acos},
> +@code{hvml_vd8_acos}, @code{hvml_vs4_acosh}, @code{hvml_vs8_acosh},
> +@code{hvml_vd2_acosh}, @code{hvml_vd4_acosh},
> +@code{hvml_vs4_acospi}, @code{hvml_vs8_acospi}, @code{hvml_vd2_acospi},
> +@code{hvml_vd4_acospi}, @code{hvml_vs4_asin}, @code{hvml_vs8_asin},
> +@code{hvml_vs16_asin}, @code{hvml_vd2_asin},
> +@code{hvml_vd4_asin}, @code{hvml_vd8_asin}, @code{hvml_vs4_asinh},
> +@code{hvml_vs8_asinh}, @code{hvml_vd2_asinh}, @code{hvml_vd4_asinh},
> +@code{hvml_vs4_asinpi}, @code{hvml_vs8_asinpi},
> +@code{hvml_vd2_asinpi}, @code{hvml_vd4_asinpi}, @code{hvml_vs4_atan},
> +@code{hvml_vs8_atan}, @code{hvml_vs16_atan},
> +@code{hvml_vd2_atan}, @code{hvml_vd4_atan}, @code{hvml_vd8_atan},
> +@code{hvml_vs4_atan2}, @code{hvml_vs8_atan2}, @code{hvml_vs16_atan2},
> +@code{hvml_vd2_atan2}, @code{hvml_vd4_atan2}, @code{hvml_vd8_atan2},
> +@code{hvml_vs4_atan2pi}, @code{hvml_vs8_atan2pi},
> +@code{hvml_vd2_atan2pi}, @code{hvml_vd4_atan2pi},
> +@code{hvml_vs4_atanh}, @code{hvml_vs8_atanh}, @code{hvml_vs16_atanh},
> +@code{hvml_vd2_atanh}, @code{hvml_vd4_atanh}, @code{hvml_vd8_atanh},
> +@code{hvml_vs4_atanpi}, @code{hvml_vs8_atanpi},
> +@code{hvml_vd2_atanpi}, @code{hvml_vd4_atanpi}, @code{hvml_vs4_cbrt},
> +@code{hvml_vs8_cbrt}, @code{hvml_vs16_cbrt},
> +@code{hvml_vd2_cbrt}, @code{hvml_vd4_cbrt}, @code{hvml_vd8_cbrt},
> +@code{hvml_vs4_cos}, @code{hvml_vs8_cos}, @code{hvml_vs16_cos},
> +@code{hvml_vd2_cos}, @code{hvml_vd4_cos}, @code{hvml_vd8_cos},
> +@code{hvml_vs4_cosh}, @code{hvml_vs8_cosh}, @code{hvml_vs16_cosh},
> +@code{hvml_vd2_cosh}, @code{hvml_vd4_cosh}, @code{hvml_vd8_cosh},
> +@code{hvml_vs4_cospi}, @code{hvml_vs8_cospi},
> +@code{hvml_vd2_cospi}, @code{hvml_vd4_cospi}, @code{hvml_vs4_erf},
> +@code{hvml_vs16_erf}, @code{hvml_vd2_erf},
> +@code{hvml_vd4_erf}, @code{hvml_vs4_erfc}, @code{hvml_vs8_erfc},
> +@code{hvml_vd2_erfc}, @code{hvml_vd4_erfc}, @code{hvml_vs4_exp},
> +@code{hvml_vs8_exp}, @code{hvml_vs16_exp}, @code{hvml_vd2_exp},
> +@code{hvml_vd4_exp}, @code{hvml_vd8_exp}, @code{hvml_vs4_exp2},
> +@code{hvml_vs8_exp2}, @code{hvml_vd2_exp2}, @code{hvml_vd4_exp2},
> +@code{hvml_vd8_exp2}, @code{hvml_vs4_exp10}, @code{hvml_vs8_exp10},
> +@code{hvml_vd2_exp10}, @code{hvml_vd4_exp10}, @code{hvml_vs4_expm1},
> +@code{hvml_vs8_expm1}, @code{hvml_vs16_expm1}, @code{hvml_vd2_expm1},
> +@code{hvml_vd4_expm1}, @code{hvml_vd8_expm1}, @code{hvml_vs4_fdim},
> +@code{hvml_vs8_fdim}, @code{hvml_vd2_fdim}, @code{hvml_vd4_fdim},
> +@code{hvml_vs4_fmod}, @code{hvml_vs8_fmod}, @code{hvml_vd2_fmod},
> +@code{hvml_vd4_fmod}, @code{hvml_vd8_fmod}, @code{hvml_vs4_hypot},
> +@code{hvml_vs8_hypot}, @code{hvml_vd2_hypot}, @code{hvml_vd4_hypot},
> +@code{hvml_vs4_ln}, @code{hvml_vs8_ln}, @code{hvml_vs16_ln},
> +@code{hvml_vd2_ln}, @code{hvml_vd4_ln}, @code{hvml_vd8_ln},
> +@code{hvml_vs4_log1p}, @code{hvml_vs8_log1p}, @code{hvml_vs16_log1p},
> +@code{hvml_vd2_log1p}, @code{hvml_vd4_log1p}, @code{hvml_vd8_log1p},
> +@code{hvml_vs4_log2}, @code{hvml_vs8_log2}, @code{hvml_vd2_log2},
> +@code{hvml_vd4_log2}, @code{hvml_vd8_log2}, @code{hvml_vs4_log10},
> +@code{hvml_vs8_log10}, @code{hvml_vs16_log10}, @code{hvml_vd2_log10},
> +@code{hvml_vd4_log10}, @code{hvml_vd8_log10}, @code{hvml_vs4_logb},
> +@code{hvml_vs8_logb}, @code{hvml_vd2_logb}, @code{hvml_vd4_logb},
> +@code{hvml_vs4_nextafter}, @code{hvml_vs8_nextafter},
> +@code{hvml_vd2_nextafter}, @code{hvml_vd4_nextafter}, @code{hvml_vs4_pow},
> +@code{hvml_vs8_pow}, @code{hvml_vs16_pow}, @code{hvml_vd2_pow},
> +@code{hvml_vd4_pow}, @code{hvml_vd8_pow}, @code{hvml_vs4_remainder},
> +@code{hvml_vs8_remainder}, @code{hvml_vd2_remainder},
> +@code{hvml_vd4_remainder}, @code{hvml_vs4_sin}, @code{hvml_vs8_sin},
> +@code{hvml_vs16_sin}, @code{hvml_vd2_sin}, @code{hvml_vd4_sin},
> +@code{hvml_vd8_sin}, @code{hvml_vs4_sinh}, @code{hvml_vs8_sinh},
> +@code{hvml_vs16_sinh}, @code{hvml_vd2_sinh}, @code{hvml_vd4_sinh},
> +@code{hvml_vd8_sinh}, @code{hvml_vs4_sinpi}, @code{hvml_vs8_sinpi},
> +@code{hvml_vd2_sinpi}, @code{hvml_vd4_sinpi},
> +@code{hvml_vs4_tan}, @code{hvml_vs8_tan}, @code{hvml_vs16_tan},
> +@code{hvml_vd2_tan}, @code{hvml_vd4_tan},
> +@code{hvml_vd8_tan}, @code{hvml_vs4_tanh}, @code{hvml_vs8_tanh},
> +@code{hvml_vs16_tanh}, @code{hvml_vd2_tanh}, @code{hvml_vd4_tanh},
> +@code{hvml_vd8_tanh}, @code{hvml_vs4_tanpi}, @code{hvml_vs8_tanpi},
> +@code{hvml_vd2_tanpi}, @code{hvml_vd4_tanpi},
> +@code{hvml_vs4_tgamma}, @code{hvml_vs8_tgamma},
> +@code{hvml_vd2_tgamma} and @code{hvml_vd4_tgamma}
> +for the corresponding function type when @option{-mveclibabi=hvml} is used.

No holes in the list, please. Please put three entries in the row, if
possible (limited by line length limitation).

>  @opindex mabi
>  @item -mabi=@var{name}
> diff --git a/gcc/testsuite/gcc.target/i386/vectorize-hvml.c 
> b/gcc/testsuite/gcc.target/i386/vectorize-hvml.c
> new file mode 100644
> index 00000000000..65403542660
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/vectorize-hvml.c
> @@ -0,0 +1,434 @@
> +/* { dg-do compile { target { { ! ia32 } && glibc } } } */
> +/* { dg-options "-O2 -ftree-vectorize -ffast-math -march=c86-4g-m7 
> -mveclibabi=hvml" } */

512-bit widths depend on tuning. Adding -mprefer-vector-width=512
makes the test deterministic. The test should use
-funsafe-math-optimizations, but please also add negative test without
-funsafe-math-optimizations (no hvml_ calls expected) and one with
-mno-avx (only vs4/vd2 emitted).

> +
> +/* Declare the scalar math functions directly so that this test does not
> +   depend on the target system's math headers.  */
> +float acosf (float);
> +float acoshf (float);
> +float acospif (float);
> +float asinf (float);
> +float asinhf (float);
> +float asinpif (float);
> +float atanf (float);
> +float atan2f (float, float);
> +float atan2pif (float, float);
> +float atanhf (float);
> +float atanpif (float);
> +float cbrtf (float);
> +float cosf (float);
> +float coshf (float);
> +float cospif (float);
> +float erff (float);
> +float erfcf (float);
> +float expf (float);
> +float exp2f (float);
> +float exp10f (float);
> +float expm1f (float);
> +float fdimf (float, float);
> +float fmodf (float, float);
> +float hypotf (float, float);
> +float logf (float);
> +float log1pf (float);
> +float log2f (float);
> +float log10f (float);
> +float logbf (float);
> +float nextafterf (float, float);
> +float powf (float, float);
> +float remainderf (float, float);
> +float sinf (float);
> +float sinhf (float);
> +float sinpif (float);
> +float tanf (float);
> +float tanhf (float);
> +float tanpif (float);
> +float tgammaf (float);
> +
> +double acos (double);
> +double acosh (double);
> +double acospi (double);
> +double asin (double);
> +double asinh (double);
> +double asinpi (double);
> +double atan (double);
> +double atan2 (double, double);
> +double atan2pi (double, double);
> +double atanh (double);
> +double atanpi (double);
> +double cbrt (double);
> +double cos (double);
> +double cosh (double);
> +double cospi (double);
> +double erf (double);
> +double erfc (double);
> +double exp (double);
> +double exp2 (double);
> +double exp10 (double);
> +double expm1 (double);
> +double fdim (double, double);
> +double fmod (double, double);
> +double hypot (double, double);
> +double log (double);
> +double log1p (double);
> +double log2 (double);
> +double log10 (double);
> +double logb (double);
> +double nextafter (double, double);
> +double pow (double, double);
> +double remainder (double, double);
> +double sin (double);
> +double sinh (double);
> +double sinpi (double);
> +double tan (double);
> +double tanh (double);
> +double tanpi (double);
> +double tgamma (double);
> +
> +#define gentest1(FUN, BASE, VF)                                       \
> +  extern BASE s_##FUN##_##BASE##_##VF[VF];                            \
> +  extern BASE d_##FUN##_##BASE##_##VF[VF];                            \
> +  void test_##FUN##_##BASE##_##VF (void)                              \
> +  {                                                                   \
> +    for (int i = 0; i < VF; i++)                                      \
> +      d_##FUN##_##BASE##_##VF[i] = FUN (s_##FUN##_##BASE##_##VF[i]);  \
> +  }
> +
> +#define gentest2(FUN, BASE, VF)                                      \
> +  extern BASE s1_##FUN##_##BASE##_##VF[VF];                          \
> +  extern BASE s2_##FUN##_##BASE##_##VF[VF];                          \
> +  extern BASE d_##FUN##_##BASE##_##VF[VF];                           \
> +  void test_##FUN##_##BASE##_##VF (void)                             \
> +  {                                                                  \
> +    for (int i = 0; i < VF; i++)                                     \
> +      d_##FUN##_##BASE##_##VF[i]                                     \
> +        = FUN (s1_##FUN##_##BASE##_##VF[i],                          \
> +               s2_##FUN##_##BASE##_##VF[i]);                         \
> +  }
> +
> +#define all_widths1(FUNF, FUND)        \
> +  gentest1 (FUNF, float, 4)            \
> +  gentest1 (FUNF, float, 8)            \
> +  gentest1 (FUNF, float, 16)           \
> +  gentest1 (FUND, double, 2)           \
> +  gentest1 (FUND, double, 4)           \
> +  gentest1 (FUND, double, 8)
> +
> +#define all_widths2(FUNF, FUND)        \
> +  gentest2 (FUNF, float, 4)            \
> +  gentest2 (FUNF, float, 8)            \
> +  gentest2 (FUNF, float, 16)           \
> +  gentest2 (FUND, double, 2)           \
> +  gentest2 (FUND, double, 4)           \
> +  gentest2 (FUND, double, 8)
> +
> +#define no_512_width1(FUNF, FUND)      \
> +  gentest1 (FUNF, float, 4)            \
> +  gentest1 (FUNF, float, 8)            \
> +  gentest1 (FUND, double, 2)           \
> +  gentest1 (FUND, double, 4)
> +
> +#define no_512_width2(FUNF, FUND)      \
> +  gentest2 (FUNF, float, 4)            \
> +  gentest2 (FUNF, float, 8)            \
> +  gentest2 (FUND, double, 2)           \
> +  gentest2 (FUND, double, 4)
> +
> +all_widths1 (asinf, asin)
> +all_widths1 (atanf, atan)
> +all_widths1 (atanhf, atanh)
> +all_widths1 (cbrtf, cbrt)
> +all_widths1 (cosf, cos)
> +all_widths1 (coshf, cosh)
> +all_widths1 (expf, exp)
> +all_widths1 (expm1f, expm1)
> +all_widths1 (logf, log)
> +all_widths1 (log1pf, log1p)
> +all_widths1 (log10f, log10)
> +all_widths1 (sinf, sin)
> +all_widths1 (sinhf, sinh)
> +all_widths1 (tanf, tan)
> +all_widths1 (tanhf, tanh)
> +
> +all_widths2 (atan2f, atan2)
> +all_widths2 (powf, pow)
> +
> +no_512_width1 (acoshf, acosh)
> +no_512_width1 (acospif, acospi)
> +no_512_width1 (asinhf, asinh)
> +no_512_width1 (asinpif, asinpi)
> +no_512_width2 (atan2pif, atan2pi)
> +no_512_width1 (atanpif, atanpi)
> +no_512_width1 (cospif, cospi)
> +no_512_width1 (erfcf, erfc)
> +no_512_width1 (exp10f, exp10)
> +no_512_width1 (logbf, logb)
> +no_512_width1 (sinpif, sinpi)
> +no_512_width1 (tanpif, tanpi)
> +no_512_width1 (tgammaf, tgamma)
> +
> +no_512_width2 (fdimf, fdim)
> +no_512_width2 (hypotf, hypot)
> +no_512_width2 (nextafterf, nextafter)
> +no_512_width2 (remainderf, remainder)
> +
> +gentest1 (acosf, float, 4)
> +gentest1 (acosf, float, 8)
> +gentest1 (acos, double, 2)
> +gentest1 (acos, double, 4)
> +gentest1 (acos, double, 8)
> +
> +gentest1 (erff, float, 4)
> +gentest1 (erff, float, 16)
> +gentest1 (erf, double, 2)
> +gentest1 (erf, double, 4)
> +
> +gentest1 (exp2f, float, 4)
> +gentest1 (exp2f, float, 8)
> +gentest1 (exp2, double, 2)
> +gentest1 (exp2, double, 4)
> +gentest1 (exp2, double, 8)
> +
> +gentest1 (log2f, float, 4)
> +gentest1 (log2f, float, 8)
> +gentest1 (log2, double, 2)
> +gentest1 (log2, double, 4)
> +gentest1 (log2, double, 8)
> +
> +gentest2 (fmodf, float, 4)
> +gentest2 (fmodf, float, 8)
> +gentest2 (fmod, double, 2)
> +gentest2 (fmod, double, 4)
> +gentest2 (fmod, double, 8)
> +
> +/* Check every supported operation/precision/width combination separately.  
> */
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_acos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_acos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_acos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_acos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_acos\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_acosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_acosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_acosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_acosh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_acospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_acospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_acospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_acospi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_asin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_asin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_asin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_asin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_asin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_asin\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_asinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_asinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_asinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_asinh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_asinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_asinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_asinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_asinpi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_atan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_atan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_atan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_atan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_atan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_atan\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_atan2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_atan2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_atan2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_atan2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_atan2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_atan2\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_atan2pi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_atan2pi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_atan2pi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_atan2pi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_atanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_atanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_atanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_atanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_atanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_atanh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_atanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_atanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_atanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_atanpi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_cbrt\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_cbrt\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_cbrt\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_cbrt\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_cbrt\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_cbrt\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_cos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_cos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_cos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_cos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_cos\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_cos\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_cosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_cosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_cosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_cosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_cosh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_cosh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_cospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_cospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_cospi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_cospi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_erf\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_erf\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_erf\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_erf\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_erfc\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_erfc\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_erfc\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_erfc\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_exp\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_exp\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_exp\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_exp\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_exp\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_exp\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_exp2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_exp2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_exp2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_exp2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_exp2\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_exp10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_exp10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_exp10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_exp10\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_expm1\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_expm1\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_expm1\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_expm1\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_expm1\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_expm1\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_fdim\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_fdim\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_fdim\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_fdim\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_fmod\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_fmod\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_fmod\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_fmod\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_fmod\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_hypot\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_hypot\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_hypot\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_hypot\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_ln\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_ln\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_ln\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_ln\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_ln\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_ln\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_log1p\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_log1p\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_log1p\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_log1p\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_log1p\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_log1p\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_log2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_log2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_log2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_log2\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_log2\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_log10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_log10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_log10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_log10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_log10\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_log10\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_logb\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_logb\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_logb\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_logb\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_nextafter\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_nextafter\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_nextafter\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_nextafter\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_pow\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_pow\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_pow\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_pow\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_pow\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_pow\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_remainder\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_remainder\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_remainder\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_remainder\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_sin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_sin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_sin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_sin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_sin\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_sin\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_sinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_sinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_sinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_sinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_sinh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_sinh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_sinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_sinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_sinpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_sinpi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_tan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_tan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_tan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_tan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_tan\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_tan\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_tanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_tanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs16_tanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_tanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_tanh\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd8_tanh\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_tanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_tanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_tanpi\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_tanpi\M} 1 } } */
> +
> +/* { dg-final { scan-assembler-times {\mhvml_vs4_tgamma\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vs8_tgamma\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd2_tgamma\M} 1 } } */
> +/* { dg-final { scan-assembler-times {\mhvml_vd4_tgamma\M} 1 } } */
> --
> 2.34.1
>

Reply via email to