On Mon, Dec 2, 2024 at 2:00 AM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> This patch adds a flags field to aarch64-simd-pragma-builtins.def
> and uses it to add attributes to the function declaration.
>
> Bootstrapped & regression-tested on aarch64-linux-gnu.  I'll commit
> tomorrow if there are no comments before then.

This was on my list of things to do so one less thing for myself.

Thanks,
Andrew

>
> Richard
>
>
> gcc/
>         * config/aarch64/aarch64-simd-pragma-builtins.def: Add a flags
>         field to each entry.
>         * config/aarch64/aarch64-builtins.cc: Update includes accordingly.
>         (aarch64_pragma_builtins_data): Add a flags field.
>         (aarch64_init_pragma_builtins): Use the flags field to add attributes
>         to the function declaration.
> ---
>  gcc/config/aarch64/aarch64-builtins.cc        | 12 ++--
>  .../aarch64/aarch64-simd-pragma-builtins.def  | 59 +++++++++++--------
>  2 files changed, 42 insertions(+), 29 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64-builtins.cc 
> b/gcc/config/aarch64/aarch64-builtins.cc
> index 9f578a77888..d58065cdd58 100644
> --- a/gcc/config/aarch64/aarch64-builtins.cc
> +++ b/gcc/config/aarch64/aarch64-builtins.cc
> @@ -782,7 +782,7 @@ typedef struct
>    AARCH64_SIMD_BUILTIN_##T##_##N##A,
>
>  #undef ENTRY
> -#define ENTRY(N, S, T0, T1, T2, U)             \
> +#define ENTRY(N, S, T0, T1, T2, U, F)          \
>    AARCH64_##N,
>
>  enum aarch64_builtins
> @@ -1647,9 +1647,10 @@ namespace simd_types {
>  }
>
>  #undef ENTRY
> -#define ENTRY(N, S, T0, T1, T2, U) \
> +#define ENTRY(N, S, T0, T1, T2, U, F) \
>    {#N, aarch64_builtin_signatures::S, simd_types::T0, simd_types::T1, \
> -   simd_types::T2, U, aarch64_required_extensions::REQUIRED_EXTENSIONS},
> +   simd_types::T2, U, aarch64_required_extensions::REQUIRED_EXTENSIONS, \
> +   FLAG_##F},
>
>  /* Initialize pragma builtins.  */
>
> @@ -1660,6 +1661,7 @@ struct aarch64_pragma_builtins_data
>    simd_type types[3];
>    int unspec;
>    aarch64_required_extensions required_extensions;
> +  unsigned int flags;
>  };
>
>  static aarch64_pragma_builtins_data aarch64_pragma_builtins[] = {
> @@ -1704,8 +1706,10 @@ aarch64_init_pragma_builtins ()
>        auto data = aarch64_pragma_builtins[i];
>        auto fntype = aarch64_fntype (data);
>        auto code = AARCH64_PRAGMA_BUILTIN_START + i + 1;
> +      auto flag_mode = data.types[0].mode;
> +      auto attrs = aarch64_get_attributes (data.flags, flag_mode);
>        aarch64_builtin_decls[code]
> -       = aarch64_general_simulate_builtin (data.name, fntype, code);
> +       = aarch64_general_simulate_builtin (data.name, fntype, code, attrs);
>      }
>  }
>
> diff --git a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def 
> b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
> index db40745e9e3..ae8732bdb31 100644
> --- a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
> +++ b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
> @@ -19,46 +19,55 @@
>     <http://www.gnu.org/licenses/>.  */
>
>  #undef ENTRY_BINARY
> -#define ENTRY_BINARY(N, T0, T1, T2, U)         \
> -  ENTRY (N, binary, T0, T1, T2, U)
> +#define ENTRY_BINARY(N, T0, T1, T2, U, F)      \
> +  ENTRY (N, binary, T0, T1, T2, U, F)
>
>  #undef ENTRY_BINARY_LANE
> -#define ENTRY_BINARY_LANE(N, T0, T1, T2, U)    \
> -  ENTRY (N, binary_lane, T0, T1, T2, U)
> +#define ENTRY_BINARY_LANE(N, T0, T1, T2, U, F) \
> +  ENTRY (N, binary_lane, T0, T1, T2, U, F)
>
>  #undef ENTRY_BINARY_VHSDF
> -#define ENTRY_BINARY_VHSDF(NAME, UNSPEC)              \
> -  ENTRY_BINARY (NAME##_f16, f16, f16, f16, UNSPEC)     \
> -  ENTRY_BINARY (NAME##q_f16, f16q, f16q, f16q, UNSPEC) \
> -  ENTRY_BINARY (NAME##_f32, f32, f32, f32, UNSPEC)     \
> -  ENTRY_BINARY (NAME##q_f32, f32q, f32q, f32q, UNSPEC) \
> -  ENTRY_BINARY (NAME##q_f64, f64q, f64q, f64q, UNSPEC)
> +#define ENTRY_BINARY_VHSDF(NAME, UNSPEC, FLAGS)                        \
> +  ENTRY_BINARY (NAME##_f16, f16, f16, f16, UNSPEC, FLAGS)      \
> +  ENTRY_BINARY (NAME##q_f16, f16q, f16q, f16q, UNSPEC, FLAGS)  \
> +  ENTRY_BINARY (NAME##_f32, f32, f32, f32, UNSPEC, FLAGS)      \
> +  ENTRY_BINARY (NAME##q_f32, f32q, f32q, f32q, UNSPEC, FLAGS)  \
> +  ENTRY_BINARY (NAME##q_f64, f64q, f64q, f64q, UNSPEC, FLAGS)
>
>  #undef ENTRY_TERNARY_VLUT8
> -#define ENTRY_TERNARY_VLUT8(T)                                         \
> -  ENTRY_BINARY_LANE (vluti2_lane_##T##8, T##8q, T##8, u8, UNSPEC_LUTI2)      
>   \
> -  ENTRY_BINARY_LANE (vluti2_laneq_##T##8, T##8q, T##8, u8q, UNSPEC_LUTI2) \
> -  ENTRY_BINARY_LANE (vluti2q_lane_##T##8, T##8q, T##8q, u8, UNSPEC_LUTI2) \
> -  ENTRY_BINARY_LANE (vluti2q_laneq_##T##8, T##8q, T##8q, u8q, UNSPEC_LUTI2) \
> -  ENTRY_BINARY_LANE (vluti4q_lane_##T##8, T##8q, T##8q, u8, UNSPEC_LUTI4) \
> -  ENTRY_BINARY_LANE (vluti4q_laneq_##T##8, T##8q, T##8q, u8q, UNSPEC_LUTI4)
> +#define ENTRY_TERNARY_VLUT8(T)                                 \
> +  ENTRY_BINARY_LANE (vluti2_lane_##T##8, T##8q, T##8, u8,      \
> +                    UNSPEC_LUTI2, NONE)                        \
> +  ENTRY_BINARY_LANE (vluti2_laneq_##T##8, T##8q, T##8, u8q,    \
> +                    UNSPEC_LUTI2, NONE)                        \
> +  ENTRY_BINARY_LANE (vluti2q_lane_##T##8, T##8q, T##8q, u8,    \
> +                    UNSPEC_LUTI2, NONE)                        \
> +  ENTRY_BINARY_LANE (vluti2q_laneq_##T##8, T##8q, T##8q, u8q,  \
> +                    UNSPEC_LUTI2, NONE)                        \
> +  ENTRY_BINARY_LANE (vluti4q_lane_##T##8, T##8q, T##8q, u8,    \
> +                    UNSPEC_LUTI4, NONE)                        \
> +  ENTRY_BINARY_LANE (vluti4q_laneq_##T##8, T##8q, T##8q, u8q,  \
> +                    UNSPEC_LUTI4, NONE)
>
>  #undef ENTRY_TERNARY_VLUT16
>  #define ENTRY_TERNARY_VLUT16(T)                                              
>   \
> -  ENTRY_BINARY_LANE (vluti2_lane_##T##16, T##16q, T##16, u8, UNSPEC_LUTI2) \
> -  ENTRY_BINARY_LANE (vluti2_laneq_##T##16, T##16q, T##16, u8q, UNSPEC_LUTI2) 
> \
> -  ENTRY_BINARY_LANE (vluti2q_lane_##T##16, T##16q, T##16q, u8, UNSPEC_LUTI2) 
> \
> +  ENTRY_BINARY_LANE (vluti2_lane_##T##16, T##16q, T##16, u8,           \
> +                    UNSPEC_LUTI2, NONE)                                \
> +  ENTRY_BINARY_LANE (vluti2_laneq_##T##16, T##16q, T##16, u8q,         \
> +                    UNSPEC_LUTI2, NONE)                                \
> +  ENTRY_BINARY_LANE (vluti2q_lane_##T##16, T##16q, T##16q, u8,         \
> +                    UNSPEC_LUTI2, NONE)                                \
>    ENTRY_BINARY_LANE (vluti2q_laneq_##T##16, T##16q, T##16q, u8q,       \
> -                    UNSPEC_LUTI2)                                      \
> +                    UNSPEC_LUTI2, NONE)                                \
>    ENTRY_BINARY_LANE (vluti4q_lane_##T##16_x2, T##16q, T##16qx2, u8,    \
> -                    UNSPEC_LUTI4)                                      \
> +                    UNSPEC_LUTI4, NONE)                                \
>    ENTRY_BINARY_LANE (vluti4q_laneq_##T##16_x2, T##16q, T##16qx2, u8q,  \
> -                    UNSPEC_LUTI4)
> +                    UNSPEC_LUTI4, NONE)
>
>  // faminmax
>  #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_FAMINMAX)
> -ENTRY_BINARY_VHSDF (vamax, UNSPEC_FAMAX)
> -ENTRY_BINARY_VHSDF (vamin, UNSPEC_FAMIN)
> +ENTRY_BINARY_VHSDF (vamax, UNSPEC_FAMAX, FP)
> +ENTRY_BINARY_VHSDF (vamin, UNSPEC_FAMIN, FP)
>  #undef REQUIRED_EXTENSIONS
>
>  // lut
> --
> 2.25.1
>

Reply via email to