From: Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>
To: Christophe Lyon <Christophe.Lyon@arm.com>,
"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>,
Richard Earnshaw <Richard.Earnshaw@arm.com>,
Richard Sandiford <Richard.Sandiford@arm.com>
Cc: Christophe Lyon <Christophe.Lyon@arm.com>
Subject: RE: [PATCH 01/22] arm: move builtin function codes into general numberspace
Date: Tue, 2 May 2023 09:24:48 +0000 [thread overview]
Message-ID: <PAXPR08MB6926AD61E4D1DC1E4CEA87E9936F9@PAXPR08MB6926.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <20230418134608.244751-2-christophe.lyon@arm.com>
Hi Christophe,
> -----Original Message-----
> From: Christophe Lyon <christophe.lyon@arm.com>
> Sent: Tuesday, April 18, 2023 2:46 PM
> To: gcc-patches@gcc.gnu.org; Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>;
> Richard Earnshaw <Richard.Earnshaw@arm.com>; Richard Sandiford
> <Richard.Sandiford@arm.com>
> Cc: Christophe Lyon <Christophe.Lyon@arm.com>
> Subject: [PATCH 01/22] arm: move builtin function codes into general
> numberspace
>
> This patch introduces a separate numberspace for general arm builtin
> function codes. The intent of this patch is to separate the space of
> function codes that may be assigned to general builtins and future
> MVE intrinsic functions by using the first bit of each function code
> to differentiate them. This is identical to how SVE intrinsic functions
> are currently differentiated from general aarch64 builtins.
>
> Future intrinsics implementations may also make use of numberspacing by
> changing the values of ARM_BUILTIN_SHIFT and ARM_BUILTIN_CLASS, and
> adding themselves to the arm_builtin_class enum.
Ok.
Thanks,
Kyrill
>
> 2022-09-08 Murray Steele <murray.steele@arm.com>
> Christophe Lyon <christophe.lyon@arm.com>
>
> gcc/ChangeLog:
>
> * config/arm/arm-builtins.cc (arm_general_add_builtin_function):
> New function.
> (arm_init_builtin): Use arm_general_add_builtin_function instead
> of arm_add_builtin_function.
> (arm_init_acle_builtins): Likewise.
> (arm_init_mve_builtins): Likewise.
> (arm_init_crypto_builtins): Likewise.
> (arm_init_builtins): Likewise.
> (arm_general_builtin_decl): New function.
> (arm_builtin_decl): Defer to numberspace-specialized functions.
> (arm_expand_builtin_args): Rename into
> arm_general_expand_builtin_args.
> (arm_expand_builtin_1): Rename into
> arm_general_expand_builtin_1 and ...
> (arm_general_expand_builtin_1): ... specialize for general builtins.
> (arm_expand_acle_builtin): Use arm_general_expand_builtin
> instead of arm_expand_builtin.
> (arm_expand_mve_builtin): Likewise.
> (arm_expand_neon_builtin): Likewise.
> (arm_expand_vfp_builtin): Likewise.
> (arm_general_expand_builtin): New function.
> (arm_expand_builtin): Specialize for general builtins.
> (arm_general_check_builtin_call): New function.
> (arm_check_builtin_call): Specialize for general builtins.
> (arm_describe_resolver): Validate numberspace.
> (arm_cde_end_args): Likewise.
> * config/arm/arm-protos.h (enum arm_builtin_class): New enum.
> (ARM_BUILTIN_SHIFT, ARM_BUILTIN_CLASS): New constants.
>
> Co-authored-by: Christophe Lyon <christophe.lyon@arm.com>
> ---
> gcc/config/arm/arm-builtins.cc | 226 ++++++++++++++++++++++-----------
> gcc/config/arm/arm-protos.h | 16 +++
> 2 files changed, 165 insertions(+), 77 deletions(-)
>
> diff --git a/gcc/config/arm/arm-builtins.cc b/gcc/config/arm/arm-builtins.cc
> index 9f5c568cbc3..adcb50d2185 100644
> --- a/gcc/config/arm/arm-builtins.cc
> +++ b/gcc/config/arm/arm-builtins.cc
> @@ -1405,6 +1405,18 @@ static tree arm_simd_polyHI_type_node =
> NULL_TREE;
> static tree arm_simd_polyDI_type_node = NULL_TREE;
> static tree arm_simd_polyTI_type_node = NULL_TREE;
>
> +/* Wrapper around add_builtin_function. NAME is the name of the built-in
> + function, TYPE is the function type, CODE is the function subcode
> + (relative to ARM_BUILTIN_GENERAL), and ATTRS is the function
> + attributes. */
> +static tree
> +arm_general_add_builtin_function (const char* name, tree type,
> + unsigned int code, tree attrs = NULL_TREE)
> +{
> + code = (code << ARM_BUILTIN_SHIFT) | ARM_BUILTIN_GENERAL;
> + return add_builtin_function (name, type, code, BUILT_IN_MD, NULL, attrs);
> +}
> +
> static const char *
> arm_mangle_builtin_scalar_type (const_tree type)
> {
> @@ -1811,8 +1823,7 @@ arm_init_builtin (unsigned int fcode,
> arm_builtin_datum *d,
> snprintf (namebuf, sizeof (namebuf), "%s_%s",
> prefix, d->name);
>
> - fndecl = add_builtin_function (namebuf, ftype, fcode, BUILT_IN_MD,
> - NULL, NULL_TREE);
> + fndecl = arm_general_add_builtin_function (namebuf, ftype, fcode);
> arm_builtin_decls[fcode] = fndecl;
> }
>
> @@ -1832,7 +1843,7 @@ arm_init_bf16_types (void)
> /* Set up ACLE builtins, even builtins for instructions that are not
> in the current target ISA to allow the user to compile particular modules
> with different target specific options that differ from the command line
> - options. Such builtins will be rejected in arm_expand_builtin. */
> + options. Such builtins will be rejected in arm_general_expand_builtin. */
>
> static void
> arm_init_acle_builtins (void)
> @@ -1845,9 +1856,9 @@ arm_init_acle_builtins (void)
> intSI_type_node,
> NULL);
> arm_builtin_decls[ARM_BUILTIN_SAT_IMM_CHECK]
> - = add_builtin_function ("__builtin_sat_imm_check", sat_check_fpr,
> - ARM_BUILTIN_SAT_IMM_CHECK, BUILT_IN_MD,
> - NULL, NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_sat_imm_check",
> + sat_check_fpr,
> + ARM_BUILTIN_SAT_IMM_CHECK);
>
> for (i = 0; i < ARRAY_SIZE (acle_builtin_data); i++, fcode++)
> {
> @@ -1894,13 +1905,13 @@ arm_init_mve_builtins (void)
> intSI_type_node,
> NULL);
> arm_builtin_decls[ARM_BUILTIN_GET_FPSCR_NZCVQC]
> - = add_builtin_function ("__builtin_arm_get_fpscr_nzcvqc",
> get_fpscr_nzcvqc,
> - ARM_BUILTIN_GET_FPSCR_NZCVQC, BUILT_IN_MD,
> NULL,
> - NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_arm_get_fpscr_nzcvqc",
> + get_fpscr_nzcvqc,
> + ARM_BUILTIN_GET_FPSCR_NZCVQC);
> arm_builtin_decls[ARM_BUILTIN_SET_FPSCR_NZCVQC]
> - = add_builtin_function ("__builtin_arm_set_fpscr_nzcvqc",
> set_fpscr_nzcvqc,
> - ARM_BUILTIN_SET_FPSCR_NZCVQC, BUILT_IN_MD,
> NULL,
> - NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_arm_set_fpscr_nzcvqc",
> + set_fpscr_nzcvqc,
> + ARM_BUILTIN_SET_FPSCR_NZCVQC);
>
> for (i = 0; i < ARRAY_SIZE (mve_builtin_data); i++, fcode++)
> {
> @@ -1912,7 +1923,7 @@ arm_init_mve_builtins (void)
> /* Set up all the NEON builtins, even builtins for instructions that are not
> in the current target ISA to allow the user to compile particular modules
> with different target specific options that differ from the command line
> - options. Such builtins will be rejected in arm_expand_builtin. */
> + options. Such builtins will be rejected in arm_general_expand_builtin. */
>
> static void
> arm_init_neon_builtins (void)
> @@ -2006,17 +2017,14 @@ arm_init_crypto_builtins (void)
> R##_ftype_##A1##_##A2##_##A3
> #define CRYPTO1(L, U, R, A) \
> arm_builtin_decls[C (U)] \
> - = add_builtin_function (N (L), FT1 (R, A), \
> - C (U), BUILT_IN_MD, NULL, NULL_TREE);
> + = arm_general_add_builtin_function (N (L), FT1 (R, A), C (U));
> #define CRYPTO2(L, U, R, A1, A2) \
> arm_builtin_decls[C (U)] \
> - = add_builtin_function (N (L), FT2 (R, A1, A2), \
> - C (U), BUILT_IN_MD, NULL, NULL_TREE);
> + = arm_general_add_builtin_function (N (L), FT2 (R, A1, A2), C (U));
>
> #define CRYPTO3(L, U, R, A1, A2, A3) \
> arm_builtin_decls[C (U)] \
> - = add_builtin_function (N (L), FT3 (R, A1, A2, A3), \
> - C (U), BUILT_IN_MD, NULL, NULL_TREE);
> + = arm_general_add_builtin_function (N (L), FT3 (R, A1, A2, A3), C (U));
> #include "crypto.def"
>
> #undef CRYPTO1
> @@ -2039,8 +2047,8 @@ arm_init_crypto_builtins (void)
> || bitmap_bit_p (arm_active_target.isa, FLAG)) \
> { \
> tree bdecl; \
> - bdecl = add_builtin_function ((NAME), (TYPE), (CODE),
> \
> - BUILT_IN_MD, NULL, NULL_TREE);
> \
> + bdecl = arm_general_add_builtin_function ((NAME), (TYPE), \
> + (CODE)); \
> arm_builtin_decls[CODE] = bdecl; \
> } \
> } \
> @@ -2650,9 +2658,9 @@ arm_init_builtins (void)
> intSI_type_node,
> NULL);
> arm_builtin_decls[ARM_BUILTIN_SIMD_LANE_CHECK]
> - = add_builtin_function ("__builtin_arm_lane_check", lane_check_fpr,
> - ARM_BUILTIN_SIMD_LANE_CHECK, BUILT_IN_MD,
> - NULL, NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_arm_lane_check",
> + lane_check_fpr,
> + ARM_BUILTIN_SIMD_LANE_CHECK);
> if (TARGET_HAVE_MVE)
> arm_init_mve_builtins ();
> else
> @@ -2674,11 +2682,13 @@ arm_init_builtins (void)
> = build_function_type_list (unsigned_type_node, NULL);
>
> arm_builtin_decls[ARM_BUILTIN_GET_FPSCR]
> - = add_builtin_function ("__builtin_arm_get_fpscr", ftype_get_fpscr,
> - ARM_BUILTIN_GET_FPSCR, BUILT_IN_MD,
> NULL, NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_arm_get_fpscr",
> + ftype_get_fpscr,
> + ARM_BUILTIN_GET_FPSCR);
> arm_builtin_decls[ARM_BUILTIN_SET_FPSCR]
> - = add_builtin_function ("__builtin_arm_set_fpscr", ftype_set_fpscr,
> - ARM_BUILTIN_SET_FPSCR, BUILT_IN_MD,
> NULL, NULL_TREE);
> + = arm_general_add_builtin_function ("__builtin_arm_set_fpscr",
> + ftype_set_fpscr,
> + ARM_BUILTIN_SET_FPSCR);
> }
>
> if (use_cmse)
> @@ -2686,17 +2696,15 @@ arm_init_builtins (void)
> tree ftype_cmse_nonsecure_caller
> = build_function_type_list (unsigned_type_node, NULL);
> arm_builtin_decls[ARM_BUILTIN_CMSE_NONSECURE_CALLER]
> - = add_builtin_function ("__builtin_arm_cmse_nonsecure_caller",
> - ftype_cmse_nonsecure_caller,
> - ARM_BUILTIN_CMSE_NONSECURE_CALLER,
> BUILT_IN_MD,
> - NULL, NULL_TREE);
> + = arm_general_add_builtin_function
> ("__builtin_arm_cmse_nonsecure_caller",
> + ftype_cmse_nonsecure_caller,
> +
> ARM_BUILTIN_CMSE_NONSECURE_CALLER);
> }
> }
>
> -/* Return the ARM builtin for CODE. */
> -
> +/* Implement TARGET_BUILTIN_DECL for general builtins. */
> tree
> -arm_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
> +arm_general_builtin_decl (unsigned code)
> {
> if (code >= ARM_BUILTIN_MAX)
> return error_mark_node;
> @@ -2704,6 +2712,20 @@ arm_builtin_decl (unsigned code, bool initialize_p
> ATTRIBUTE_UNUSED)
> return arm_builtin_decls[code];
> }
>
> +/* Return the ARM builtin for CODE. */
> +tree
> +arm_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
> +{
> + unsigned subcode = code >> ARM_BUILTIN_SHIFT;
> + switch (code & ARM_BUILTIN_CLASS)
> + {
> + case ARM_BUILTIN_GENERAL:
> + return arm_general_builtin_decl (subcode);
> + default:
> + gcc_unreachable ();
> + }
> +}
> +
> /* Errors in the source file can cause expand_expr to return const0_rtx
> where we expect a vector. To avoid crashing, use one of the vector
> clear instructions. */
> @@ -2769,7 +2791,7 @@ arm_expand_ternop_builtin (enum insn_code
> icode,
> return target;
> }
>
> -/* Subroutine of arm_expand_builtin to take care of binop insns. */
> +/* Subroutine of arm_general_expand_builtin to take care of binop insns.
> */
>
> static rtx
> arm_expand_binop_builtin (enum insn_code icode,
> @@ -2809,7 +2831,7 @@ arm_expand_binop_builtin (enum insn_code
> icode,
> return target;
> }
>
> -/* Subroutine of arm_expand_builtin to take care of unop insns. */
> +/* Subroutine of arm_general_expand_builtin to take care of unop insns. */
>
> static rtx
> arm_expand_unop_builtin (enum insn_code icode,
> @@ -2946,11 +2968,11 @@ mve_dereference_pointer (tree exp, tree type,
> machine_mode reg_mode,
> build_int_cst (build_pointer_type (array_type), 0));
> }
>
> -/* Expand a builtin. */
> +/* Implement TARGET_EXPAND_BUILTIN for general builtins. */
> static rtx
> -arm_expand_builtin_args (rtx target, machine_mode map_mode, int fcode,
> - int icode, int have_retval, tree exp,
> - builtin_arg *args)
> +arm_general_expand_builtin_args (rtx target, machine_mode map_mode,
> int fcode,
> + int icode, int have_retval, tree exp,
> + builtin_arg *args)
> {
> rtx pat;
> tree arg[SIMD_MAX_BUILTIN_ARGS];
> @@ -3234,13 +3256,13 @@ constant_arg:
> return target;
> }
>
> -/* Expand a builtin. These builtins are "special" because they don't have
> - symbolic constants defined per-instruction or per instruction-variant.
> +/* Expand a general builtin. These builtins are "special" because they don't
> + have symbolic constants defined per-instruction or per instruction-variant.
> Instead, the required info is looked up in the ARM_BUILTIN_DATA record
> that
> is passed into the function. */
>
> static rtx
> -arm_expand_builtin_1 (int fcode, tree exp, rtx target,
> +arm_general_expand_builtin_1 (int fcode, tree exp, rtx target,
> arm_builtin_datum *d)
> {
> enum insn_code icode = d->code;
> @@ -3308,16 +3330,16 @@ arm_expand_builtin_1 (int fcode, tree exp, rtx
> target,
> }
> args[k] = ARG_BUILTIN_STOP;
>
> - /* The interface to arm_expand_builtin_args expects a 0 if
> + /* The interface to arm_general_expand_builtin_args expects a 0 if
> the function is void, and a 1 if it is not. */
> - return arm_expand_builtin_args
> + return arm_general_expand_builtin_args
> (target, d->mode, fcode, icode, !is_void, exp,
> &args[1]);
> }
>
> /* Expand an ACLE builtin, i.e. those registered only if their respective
> target constraints are met. This check happens within
> - arm_expand_builtin_args. */
> + arm_general_expand_builtin_args. */
>
> static rtx
> arm_expand_acle_builtin (int fcode, tree exp, rtx target)
> @@ -3351,11 +3373,12 @@ arm_expand_acle_builtin (int fcode, tree exp, rtx
> target)
> ? &acle_builtin_data[fcode - ARM_BUILTIN_ACLE_PATTERN_START]
> : &cde_builtin_data[fcode - ARM_BUILTIN_CDE_PATTERN_START].base;
>
> - return arm_expand_builtin_1 (fcode, exp, target, d);
> + return arm_general_expand_builtin_1 (fcode, exp, target, d);
> }
>
> -/* Expand an MVE builtin, i.e. those registered only if their respective target
> - constraints are met. This check happens within arm_expand_builtin. */
> +/* Expand an MVE builtin, i.e. those registered only if their respective
> + target constraints are met. This check happens within
> + arm_general_expand_builtin. */
>
> static rtx
> arm_expand_mve_builtin (int fcode, tree exp, rtx target)
> @@ -3371,7 +3394,7 @@ arm_expand_mve_builtin (int fcode, tree exp, rtx
> target)
> arm_builtin_datum *d
> = &mve_builtin_data[fcode - ARM_BUILTIN_MVE_PATTERN_START];
>
> - return arm_expand_builtin_1 (fcode, exp, target, d);
> + return arm_general_expand_builtin_1 (fcode, exp, target, d);
> }
>
> /* Expand a Neon builtin, i.e. those registered only if TARGET_NEON holds.
> @@ -3394,7 +3417,7 @@ arm_expand_neon_builtin (int fcode, tree exp, rtx
> target)
> arm_builtin_datum *d
> = &neon_builtin_data[fcode - ARM_BUILTIN_NEON_PATTERN_START];
>
> - return arm_expand_builtin_1 (fcode, exp, target, d);
> + return arm_general_expand_builtin_1 (fcode, exp, target, d);
> }
>
> /* Expand a VFP builtin. These builtins are treated like
> @@ -3415,25 +3438,18 @@ arm_expand_vfp_builtin (int fcode, tree exp, rtx
> target)
> arm_builtin_datum *d
> = &vfp_builtin_data[fcode - ARM_BUILTIN_VFP_PATTERN_START];
>
> - return arm_expand_builtin_1 (fcode, exp, target, d);
> + return arm_general_expand_builtin_1 (fcode, exp, target, d);
> }
>
> -/* Expand an expression EXP that calls a built-in function,
> - with result going to TARGET if that's convenient
> - (and in mode MODE if that's convenient).
> - SUBTARGET may be used as the target for computing one of EXP's
> operands.
> - IGNORE is nonzero if the value is to be ignored. */
> -
> +/* Implement TARGET_EXPAND_BUILTIN for general builtins. */
> rtx
> -arm_expand_builtin (tree exp,
> +arm_general_expand_builtin (unsigned int fcode,
> + tree exp,
> rtx target,
> - rtx subtarget ATTRIBUTE_UNUSED,
> - machine_mode mode ATTRIBUTE_UNUSED,
> int ignore ATTRIBUTE_UNUSED)
> {
> const struct builtin_description * d;
> enum insn_code icode;
> - tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
> tree arg0;
> tree arg1;
> tree arg2;
> @@ -3441,7 +3457,6 @@ arm_expand_builtin (tree exp,
> rtx op1;
> rtx op2;
> rtx pat;
> - unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
> size_t i;
> machine_mode tmode;
> machine_mode mode0;
> @@ -4052,6 +4067,31 @@ arm_expand_builtin (tree exp,
> return NULL_RTX;
> }
>
> +/* Expand an expression EXP that calls a built-in function,
> + with result going to TARGET if that's convenient
> + (and in mode MODE if that's convenient).
> + SUBTARGET may be used as the target for computing one of EXP's
> operands.
> + IGNORE is nonzero if the value is to be ignored. */
> +
> +rtx
> +arm_expand_builtin (tree exp,
> + rtx target,
> + rtx subtarget ATTRIBUTE_UNUSED,
> + machine_mode mode ATTRIBUTE_UNUSED,
> + int ignore ATTRIBUTE_UNUSED)
> +{
> + tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
> + unsigned int code = DECL_MD_FUNCTION_CODE (fndecl);
> + unsigned int subcode = code >> ARM_BUILTIN_SHIFT;
> + switch (code & ARM_BUILTIN_CLASS)
> + {
> + case ARM_BUILTIN_GENERAL:
> + return arm_general_expand_builtin (subcode, exp, target, ignore);
> + default:
> + gcc_unreachable ();
> + }
> +}
> +
> void
> arm_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
> {
> @@ -4122,22 +4162,21 @@ arm_atomic_assign_expand_fenv (tree *hold,
> tree *clear, tree *update)
> reload_fenv, restore_fnenv), update_call);
> }
>
> -/* Implement TARGET_CHECK_BUILTIN_CALL. Record a read of the Q bit
> through
> - intrinsics in the machine function. */
> +/* Implement TARGET_CHECK_BUILTIN_CALL for general builtins. Record a
> read of
> + the Q bit through intrinsics in the machine function for general built-in
> + functions. */
> bool
> -arm_check_builtin_call (location_t , vec<location_t> , tree fndecl,
> - tree, unsigned int, tree *)
> +arm_general_check_builtin_call (unsigned int code)
> {
> - int fcode = DECL_MD_FUNCTION_CODE (fndecl);
> - if (fcode == ARM_BUILTIN_saturation_occurred
> - || fcode == ARM_BUILTIN_set_saturation)
> + if (code == ARM_BUILTIN_saturation_occurred
> + || code == ARM_BUILTIN_set_saturation)
> {
> if (cfun && cfun->decl)
> DECL_ATTRIBUTES (cfun->decl)
> = tree_cons (get_identifier ("acle qbit"), NULL_TREE,
> DECL_ATTRIBUTES (cfun->decl));
> }
> - if (fcode == ARM_BUILTIN_sel)
> + else if (code == ARM_BUILTIN_sel)
> {
> if (cfun && cfun->decl)
> DECL_ATTRIBUTES (cfun->decl)
> @@ -4147,19 +4186,52 @@ arm_check_builtin_call (location_t ,
> vec<location_t> , tree fndecl,
> return true;
> }
>
> +/* Implement TARGET_CHECK_BUILTIN_CALL. */
> +bool
> +arm_check_builtin_call (location_t, vec<location_t>, tree fndecl, tree,
> + unsigned int, tree *)
> +{
> + unsigned int code = DECL_MD_FUNCTION_CODE (fndecl);
> + unsigned int subcode = code >> ARM_BUILTIN_SHIFT;
> + switch (code & ARM_BUILTIN_CLASS)
> + {
> + case ARM_BUILTIN_GENERAL:
> + return arm_general_check_builtin_call (subcode);
> + default:
> + gcc_unreachable ();
> + }
> +
> +}
> +
> enum resolver_ident
> arm_describe_resolver (tree fndecl)
> {
> - if (DECL_MD_FUNCTION_CODE (fndecl) >= ARM_BUILTIN_vcx1qv16qi
> - && DECL_MD_FUNCTION_CODE (fndecl) < ARM_BUILTIN_MVE_BASE)
> - return arm_cde_resolver;
> - return arm_no_resolver;
> + unsigned int code = DECL_MD_FUNCTION_CODE (fndecl);
> + unsigned int subcode = code >> ARM_BUILTIN_SHIFT;
> + switch (code & ARM_BUILTIN_CLASS)
> + {
> + case ARM_BUILTIN_GENERAL:
> + if (subcode >= ARM_BUILTIN_vcx1qv16qi
> + && subcode < ARM_BUILTIN_MVE_BASE)
> + return arm_cde_resolver;
> + return arm_no_resolver;
> + default:
> + gcc_unreachable ();
> + }
> }
>
> unsigned
> arm_cde_end_args (tree fndecl)
> {
> - return DECL_MD_FUNCTION_CODE (fndecl) >=
> ARM_BUILTIN_vcx1q_p_v16qi ? 2 : 1;
> + unsigned int code = DECL_MD_FUNCTION_CODE (fndecl);
> + unsigned int subcode = code >> ARM_BUILTIN_SHIFT;
> + switch (code & ARM_BUILTIN_CLASS)
> + {
> + case ARM_BUILTIN_GENERAL:
> + return subcode >= ARM_BUILTIN_vcx1q_p_v16qi ? 2 : 1;
> + default:
> + gcc_unreachable ();
> + }
> }
>
> #include "gt-arm-builtins.h"
> diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
> index c8ae5e1e9c1..1bdbd3b8ab3 100644
> --- a/gcc/config/arm/arm-protos.h
> +++ b/gcc/config/arm/arm-protos.h
> @@ -210,6 +210,22 @@ extern opt_machine_mode arm_get_mask_mode
> (machine_mode mode);
>
> #endif /* RTX_CODE */
>
> +/* It's convenient to divide the built-in function codes into groups,
> + rather than having everything in a single enum. This type enumerates
> + those groups. */
> +enum arm_builtin_class
> +{
> + ARM_BUILTIN_GENERAL
> +};
> +
> +/* Built-in function codes are structured so that the low
> + ARM_BUILTIN_SHIFT bits contain the arm_builtin_class
> + and the upper bits contain a group-specific subcode. */
> +const unsigned int ARM_BUILTIN_SHIFT = 1;
> +
> +/* Mask that selects the arm part of a function code. */
> +const unsigned int ARM_BUILTIN_CLASS = (1 << ARM_BUILTIN_SHIFT) - 1;
> +
> /* MVE functions. */
> namespace arm_mve {
> void handle_arm_mve_types_h ();
> --
> 2.34.1
next prev parent reply other threads:[~2023-05-02 9:25 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-18 13:45 [PATCH 00/22] arm: New framework for MVE intrinsics Christophe Lyon
2023-04-18 13:45 ` [PATCH 01/22] arm: move builtin function codes into general numberspace Christophe Lyon
2023-05-02 9:24 ` Kyrylo Tkachov [this message]
2023-04-18 13:45 ` [PATCH 02/22] arm: [MVE intrinsics] Add new framework Christophe Lyon
2023-05-02 10:17 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 03/22] arm: [MVE intrinsics] Rework vreinterpretq Christophe Lyon
2023-05-02 10:26 ` Kyrylo Tkachov
2023-05-02 14:05 ` Christophe Lyon
2023-05-02 15:28 ` Kyrylo Tkachov
2023-05-02 15:49 ` Christophe Lyon
2023-05-03 14:37 ` [PATCH v2 " Christophe Lyon
2023-05-03 14:52 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 04/22] arm: [MVE intrinsics] Rework vuninitialized Christophe Lyon
2023-05-02 16:13 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 05/22] arm: [MVE intrinsics] add binary_opt_n shape Christophe Lyon
2023-05-02 16:16 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 06/22] arm: [MVE intrinsics] add unspec_based_mve_function_exact_insn Christophe Lyon
2023-05-02 16:17 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 07/22] arm: [MVE intrinsics] factorize vadd vsubq vmulq Christophe Lyon
2023-05-02 16:19 ` Kyrylo Tkachov
2023-05-02 16:22 ` Christophe Lyon
2023-04-18 13:45 ` [PATCH 08/22] arm: [MVE intrinsics] rework vaddq vmulq vsubq Christophe Lyon
2023-05-02 16:31 ` Kyrylo Tkachov
2023-05-03 9:06 ` Christophe Lyon
2023-04-18 13:45 ` [PATCH 09/22] arm: [MVE intrinsics] add binary shape Christophe Lyon
2023-05-02 16:32 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 10/22] arm: [MVE intrinsics] factorize vandq veorq vorrq vbicq Christophe Lyon
2023-05-02 16:36 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 11/22] arm: [MVE intrinsics] rework vandq veorq Christophe Lyon
2023-05-02 16:37 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 12/22] arm: [MVE intrinsics] add binary_orrq shape Christophe Lyon
2023-05-02 16:39 ` Kyrylo Tkachov
2023-04-18 13:45 ` [PATCH 13/22] arm: [MVE intrinsics] rework vorrq Christophe Lyon
2023-05-02 16:41 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 14/22] arm: [MVE intrinsics] add unspec_mve_function_exact_insn Christophe Lyon
2023-05-03 8:40 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 15/22] arm: [MVE intrinsics] add create shape Christophe Lyon
2023-05-03 8:40 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 16/22] arm: [MVE intrinsics] factorize vcreateq Christophe Lyon
2023-05-03 8:42 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 17/22] arm: [MVE intrinsics] rework vcreateq Christophe Lyon
2023-05-03 8:44 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 18/22] arm: [MVE intrinsics] factorize several binary_m operations Christophe Lyon
2023-05-03 8:46 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 19/22] arm: [MVE intrinsics] factorize several binary _n operations Christophe Lyon
2023-05-03 8:47 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 20/22] arm: [MVE intrinsics] factorize several binary _m_n operations Christophe Lyon
2023-05-03 8:48 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 21/22] arm: [MVE intrinsics] factorize several binary operations Christophe Lyon
2023-05-03 8:49 ` Kyrylo Tkachov
2023-04-18 13:46 ` [PATCH 22/22] arm: [MVE intrinsics] rework vhaddq vhsubq vmulhq vqaddq vqsubq vqdmulhq vrhaddq vrmulhq Christophe Lyon
2023-05-03 8:51 ` Kyrylo Tkachov
2023-05-02 9:18 ` [PATCH 00/22] arm: New framework for MVE intrinsics Kyrylo Tkachov
2023-05-02 15:04 ` Christophe Lyon
2023-05-03 15:01 ` Christophe Lyon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=PAXPR08MB6926AD61E4D1DC1E4CEA87E9936F9@PAXPR08MB6926.eurprd08.prod.outlook.com \
--to=kyrylo.tkachov@arm.com \
--cc=Christophe.Lyon@arm.com \
--cc=Richard.Earnshaw@arm.com \
--cc=Richard.Sandiford@arm.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).