From: Alan Lawrence Date: Mon, 27 Jul 2015 15:44:26 +0000 (+0000) Subject: [ARM] PR/63870 Add qualifier to check lane bounds in expand X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=eaa80f646433fccf28ef3258a55ccaf8396cacc2;p=gcc.git [ARM] PR/63870 Add qualifier to check lane bounds in expand * config/arm/arm-builtins.c (enum arm_type_qualifiers): Add qualifier_lane_index. (arm_binop_imm_qualifiers, BINOP_IMM_QUALIFIERS): New. (arm_getlane_qualifiers): Use qualifier_lane_index. (arm_lanemac_qualifiers): Rename to... (arm_mac_n_qualifiers): ...this. (LANEMAC_QUALIFIERS): Rename to... (MAC_N_QUALIFIERS): ...this. (arm_mac_lane_qualifiers, MAC_LANE_QUALIFIERS): New. (arm_setlane_qualifiers): Use qualifier_lane_index. (arm_ternop_imm_qualifiers, TERNOP_IMM_QUALIFIERS): New. (enum builtin_arg): Add NEON_ARG_LANE_INDEX. (arm_expand_neon_args): Handle NEON_ARG_LANE_INDEX. (arm_expand_neon_builtin): Handle qualifier_lane_index. * config/arm/arm-protos.h (neon_lane_bounds): Add const_tree parameter. * config/arm/arm.c (bounds_check): Likewise, improve error message. (neon_lane_bounds, neon_const_bounds): Add arguments to bounds_check. * config/arm/arm_neon_builtins.def (vshrs_n, vshru_n, vrshrs_n, vrshru_n, vshrn_n, vrshrn_n, vqshrns_n, vqshrnu_n, vqrshrns_n, vqrshrnu_n, vqshrun_n, vqrshrun_n, vshl_n, vqshl_s_n, vqshl_u_n, vqshlu_n, vshlls_n, vshllu_n): Change qualifiers to BINOP_IMM. (vsras_n, vsrau_n, vrsras_n, vrsrau_n, vsri_n, vsli_n): Change qualifiers to TERNOP_IMM. (vdup_lane): Change qualifiers to GETLANE. (vmla_lane, vmlals_lane, vmlalu_lane, vqdmlal_lane, vmls_lane, vmlsls_lane, vmlslu_lane, vqdmlsl_lane): Change qualifiers to MAC_LANE. (vmla_n, vmlals_n, vmlalu_n, vqdmlal_n, vmls_n, vmlsls_n, vmlslu_n, vqdmlsl_n): Change qualifiers to MAC_N. * config/arm/neon.md (neon_vget_lane, neon_vget_laneu, neon_vget_lanedi, neon_vget_lanev2di, neon_vset_lane, neon_vset_lanedi, neon_vdup_lane, neon_vdup_lanedi, neon_vdup_lanev2di, neon_vmul_lane, neon_vmul_lane, neon_vmull_lane, neon_vqdmull_lane, neon_vqdmulh_lane, neon_vqdmulh_lane, neon_vmla_lane, neon_vmla_lane, neon_vmlal_lane, neon_vqdmlal_lane, neon_vmls_lane, neon_vmls_lane, neon_vmlsl_lane, neon_vqdmlsl_lane): Remove call to neon_lane_bounds. From-SVN: r226251 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00b9b99fa9d..82e139de0c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,47 @@ +2015-07-27 Alan Lawrence + + PR/63870 + * config/arm/arm-builtins.c (enum arm_type_qualifiers): + Add qualifier_lane_index. + (arm_binop_imm_qualifiers, BINOP_IMM_QUALIFIERS): New. + (arm_getlane_qualifiers): Use qualifier_lane_index. + (arm_lanemac_qualifiers): Rename to... + (arm_mac_n_qualifiers): ...this. + (LANEMAC_QUALIFIERS): Rename to... + (MAC_N_QUALIFIERS): ...this. + (arm_mac_lane_qualifiers, MAC_LANE_QUALIFIERS): New. + (arm_setlane_qualifiers): Use qualifier_lane_index. + (arm_ternop_imm_qualifiers, TERNOP_IMM_QUALIFIERS): New. + (enum builtin_arg): Add NEON_ARG_LANE_INDEX. + (arm_expand_neon_args): Handle NEON_ARG_LANE_INDEX. + (arm_expand_neon_builtin): Handle qualifier_lane_index. + + * config/arm/arm-protos.h (neon_lane_bounds): Add const_tree parameter. + * config/arm/arm.c (bounds_check): Likewise, improve error message. + (neon_lane_bounds, neon_const_bounds): Add arguments to bounds_check. + * config/arm/arm_neon_builtins.def (vshrs_n, vshru_n, vrshrs_n, + vrshru_n, vshrn_n, vrshrn_n, vqshrns_n, vqshrnu_n, vqrshrns_n, + vqrshrnu_n, vqshrun_n, vqrshrun_n, vshl_n, vqshl_s_n, vqshl_u_n, + vqshlu_n, vshlls_n, vshllu_n): Change qualifiers to BINOP_IMM. + (vsras_n, vsrau_n, vrsras_n, vrsrau_n, vsri_n, vsli_n): Change + qualifiers to TERNOP_IMM. + (vdup_lane): Change qualifiers to GETLANE. + (vmla_lane, vmlals_lane, vmlalu_lane, vqdmlal_lane, vmls_lane, + vmlsls_lane, vmlslu_lane, vqdmlsl_lane): Change qualifiers to MAC_LANE. + (vmla_n, vmlals_n, vmlalu_n, vqdmlal_n, vmls_n, vmlsls_n, vmlslu_n, + vqdmlsl_n): Change qualifiers to MAC_N. + + * config/arm/neon.md (neon_vget_lane, neon_vget_laneu, + neon_vget_lanedi, neon_vget_lanev2di, neon_vset_lane, + neon_vset_lanedi, neon_vdup_lane, neon_vdup_lanedi, + neon_vdup_lanev2di, neon_vmul_lane, neon_vmul_lane, + neon_vmull_lane, neon_vqdmull_lane, + neon_vqdmulh_lane, neon_vqdmulh_lane, + neon_vmla_lane, neon_vmla_lane, neon_vmlal_lane, + neon_vqdmlal_lane, neon_vmls_lane, neon_vmls_lane, + neon_vmlsl_lane, neon_vqdmlsl_lane): + Remove call to neon_lane_bounds. + 2015-07-27 Wilco Dijkstra * config/aarch64/aarch64.md (aarch64_ashl_sisd_or_int_3): diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index 65e72a4233a..7f711a84c75 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -75,7 +75,9 @@ enum arm_type_qualifiers /* qualifier_const_pointer | qualifier_map_mode */ qualifier_const_pointer_map_mode = 0x86, /* Polynomial types. */ - qualifier_poly = 0x100 + qualifier_poly = 0x100, + /* Lane indices - must be within range of previous argument = a vector. */ + qualifier_lane_index = 0x200 }; /* The qualifier_internal allows generation of a unary builtin from @@ -106,21 +108,40 @@ arm_ternop_qualifiers[SIMD_MAX_BUILTIN_ARGS] /* T (T, immediate). */ static enum arm_type_qualifiers -arm_getlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] +arm_binop_imm_qualifiers[SIMD_MAX_BUILTIN_ARGS] = { qualifier_none, qualifier_none, qualifier_immediate }; +#define BINOP_IMM_QUALIFIERS (arm_binop_imm_qualifiers) + +/* T (T, lane index). */ +static enum arm_type_qualifiers +arm_getlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_none, qualifier_none, qualifier_lane_index }; #define GETLANE_QUALIFIERS (arm_getlane_qualifiers) /* T (T, T, T, immediate). */ static enum arm_type_qualifiers -arm_lanemac_qualifiers[SIMD_MAX_BUILTIN_ARGS] +arm_mac_n_qualifiers[SIMD_MAX_BUILTIN_ARGS] = { qualifier_none, qualifier_none, qualifier_none, qualifier_none, qualifier_immediate }; -#define LANEMAC_QUALIFIERS (arm_lanemac_qualifiers) +#define MAC_N_QUALIFIERS (arm_mac_n_qualifiers) + +/* T (T, T, T, lane index). */ +static enum arm_type_qualifiers +arm_mac_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_none, qualifier_none, qualifier_none, + qualifier_none, qualifier_lane_index }; +#define MAC_LANE_QUALIFIERS (arm_mac_lane_qualifiers) /* T (T, T, immediate). */ static enum arm_type_qualifiers -arm_setlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] +arm_ternop_imm_qualifiers[SIMD_MAX_BUILTIN_ARGS] = { qualifier_none, qualifier_none, qualifier_none, qualifier_immediate }; +#define TERNOP_IMM_QUALIFIERS (arm_ternop_imm_qualifiers) + +/* T (T, T, lane index). */ +static enum arm_type_qualifiers +arm_setlane_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_none, qualifier_none, qualifier_none, qualifier_lane_index }; #define SETLANE_QUALIFIERS (arm_setlane_qualifiers) /* T (T, T). */ @@ -1925,6 +1946,7 @@ arm_expand_unop_builtin (enum insn_code icode, typedef enum { NEON_ARG_COPY_TO_REG, NEON_ARG_CONSTANT, + NEON_ARG_LANE_INDEX, NEON_ARG_MEMORY, NEON_ARG_STOP } builtin_arg; @@ -2041,6 +2063,16 @@ arm_expand_neon_args (rtx target, machine_mode map_mode, int fcode, op[argc] = copy_to_mode_reg (mode[argc], op[argc]); break; + case NEON_ARG_LANE_INDEX: + /* Previous argument must be a vector, which this indexes. */ + gcc_assert (argc > 0); + if (CONST_INT_P (op[argc])) + { + enum machine_mode vmode = mode[argc - 1]; + neon_lane_bounds (op[argc], 0, GET_MODE_NUNITS (vmode), exp); + } + /* Fall through - if the lane index isn't a constant then + the next case will error. */ case NEON_ARG_CONSTANT: if (!(*insn_data[icode].operand[opno].predicate) (op[argc], mode[argc])) @@ -2168,7 +2200,9 @@ arm_expand_neon_builtin (int fcode, tree exp, rtx target) int operands_k = k - is_void; int expr_args_k = k - 1; - if (d->qualifiers[qualifiers_k] & qualifier_immediate) + if (d->qualifiers[qualifiers_k] & qualifier_lane_index) + args[k] = NEON_ARG_LANE_INDEX; + else if (d->qualifiers[qualifiers_k] & qualifier_immediate) args[k] = NEON_ARG_CONSTANT; else if (d->qualifiers[qualifiers_k] & qualifier_maybe_immediate) { diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 7aae9343e02..cef9eec277d 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -86,7 +86,7 @@ extern void neon_pairwise_reduce (rtx, rtx, machine_mode, extern rtx neon_make_constant (rtx); extern tree arm_builtin_vectorized_function (tree, tree, tree); extern void neon_expand_vector_init (rtx, rtx); -extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT); +extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT, const_tree); extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT); extern HOST_WIDE_INT neon_element_bits (machine_mode); extern void neon_reinterpret (rtx, rtx); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c737484313a..6da6f6882ba 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -12789,12 +12789,12 @@ neon_expand_vector_init (rtx target, rtx vals) } /* Ensure OPERAND lies between LOW (inclusive) and HIGH (exclusive). Raise - ERR if it doesn't. FIXME: NEON bounds checks occur late in compilation, so - reported source locations are bogus. */ + ERR if it doesn't. EXP indicates the source location, which includes the + inlining history for intrinsics. */ static void bounds_check (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high, - const char *err) + const_tree exp, const char *desc) { HOST_WIDE_INT lane; @@ -12803,15 +12803,22 @@ bounds_check (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high, lane = INTVAL (operand); if (lane < low || lane >= high) - error (err); + { + if (exp) + error ("%K%s %lld out of range %lld - %lld", + exp, desc, lane, low, high - 1); + else + error ("%s %lld out of range %lld - %lld", desc, lane, low, high - 1); + } } /* Bounds-check lanes. */ void -neon_lane_bounds (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high) +neon_lane_bounds (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high, + const_tree exp) { - bounds_check (operand, low, high, "lane out of range"); + bounds_check (operand, low, high, exp, "lane"); } /* Bounds-check constants. */ @@ -12819,7 +12826,7 @@ neon_lane_bounds (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high) void neon_const_bounds (rtx operand, HOST_WIDE_INT low, HOST_WIDE_INT high) { - bounds_check (operand, low, high, "constant out of range"); + bounds_check (operand, low, high, NULL_TREE, "constant"); } HOST_WIDE_INT diff --git a/gcc/config/arm/arm_neon_builtins.def b/gcc/config/arm/arm_neon_builtins.def index f55591da845..f150b98b809 100644 --- a/gcc/config/arm/arm_neon_builtins.def +++ b/gcc/config/arm/arm_neon_builtins.def @@ -67,28 +67,28 @@ VAR8 (BINOP, vqshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) VAR8 (BINOP, vqshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) VAR8 (BINOP, vqrshls, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) VAR8 (BINOP, vqrshlu, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vrshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vrshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR3 (GETLANE, vshrn_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vrshrn_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqshrns_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqshrnu_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqrshrns_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqrshrnu_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqshrun_n, v8hi, v4si, v2di) -VAR3 (GETLANE, vqrshrun_n, v8hi, v4si, v2di) -VAR8 (GETLANE, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vqshl_s_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vqshl_u_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (GETLANE, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR3 (GETLANE, vshlls_n, v8qi, v4hi, v2si) -VAR3 (GETLANE, vshllu_n, v8qi, v4hi, v2si) -VAR8 (SETLANE, vsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (SETLANE, vsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (SETLANE, vrsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (SETLANE, vrsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vrshrs_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vrshru_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vshrn_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vrshrn_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqshrns_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqshrnu_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqrshrns_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqrshrnu_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqshrun_n, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vqrshrun_n, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vshl_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vqshl_s_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vqshl_u_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (BINOP_IMM, vqshlu_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR3 (BINOP_IMM, vshlls_n, v8qi, v4hi, v2si) +VAR3 (BINOP_IMM, vshllu_n, v8qi, v4hi, v2si) +VAR8 (TERNOP_IMM, vsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (TERNOP_IMM, vsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (TERNOP_IMM, vrsras_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (TERNOP_IMM, vrsrau_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) VAR2 (BINOP, vsub, v2sf, v4sf) VAR3 (BINOP, vsubls, v8qi, v4hi, v2si) VAR3 (BINOP, vsublu, v8qi, v4hi, v2si) @@ -140,8 +140,8 @@ VAR6 (BINOP, vpadals, v8qi, v4hi, v2si, v16qi, v8hi, v4si) VAR6 (BINOP, vpadalu, v8qi, v4hi, v2si, v16qi, v8hi, v4si) VAR2 (BINOP, vrecps, v2sf, v4sf) VAR2 (BINOP, vrsqrts, v2sf, v4sf) -VAR8 (SETLANE, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) -VAR8 (SETLANE, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (TERNOP_IMM, vsri_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) +VAR8 (TERNOP_IMM, vsli_n, v8qi, v4hi, v2si, di, v16qi, v8hi, v4si, v2di) VAR8 (UNOP, vabs, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) VAR6 (UNOP, vqabs, v8qi, v4hi, v2si, v16qi, v8hi, v4si) VAR8 (UNOP, vneg, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) @@ -162,7 +162,7 @@ VAR10 (SETLANE, vset_lane, VAR5 (UNOP, vcreate, v8qi, v4hi, v2si, v2sf, di) VAR10 (UNOP, vdup_n, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) -VAR10 (BINOP, vdup_lane, +VAR10 (GETLANE, vdup_lane, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) VAR5 (COMBINE, vcombine, v8qi, v4hi, v2si, v2sf, di) VAR5 (UNOP, vget_high, v16qi, v8hi, v4si, v4sf, v2di) @@ -174,23 +174,23 @@ VAR3 (UNOP, vqmovun, v8hi, v4si, v2di) VAR3 (UNOP, vmovls, v8qi, v4hi, v2si) VAR3 (UNOP, vmovlu, v8qi, v4hi, v2si) VAR6 (SETLANE, vmul_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR6 (LANEMAC, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR2 (LANEMAC, vmlals_lane, v4hi, v2si) -VAR2 (LANEMAC, vmlalu_lane, v4hi, v2si) -VAR2 (LANEMAC, vqdmlal_lane, v4hi, v2si) -VAR6 (LANEMAC, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR2 (LANEMAC, vmlsls_lane, v4hi, v2si) -VAR2 (LANEMAC, vmlslu_lane, v4hi, v2si) -VAR2 (LANEMAC, vqdmlsl_lane, v4hi, v2si) +VAR6 (MAC_LANE, vmla_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) +VAR2 (MAC_LANE, vmlals_lane, v4hi, v2si) +VAR2 (MAC_LANE, vmlalu_lane, v4hi, v2si) +VAR2 (MAC_LANE, vqdmlal_lane, v4hi, v2si) +VAR6 (MAC_LANE, vmls_lane, v4hi, v2si, v2sf, v8hi, v4si, v4sf) +VAR2 (MAC_LANE, vmlsls_lane, v4hi, v2si) +VAR2 (MAC_LANE, vmlslu_lane, v4hi, v2si) +VAR2 (MAC_LANE, vqdmlsl_lane, v4hi, v2si) VAR6 (BINOP, vmul_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR6 (LANEMAC, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR2 (LANEMAC, vmlals_n, v4hi, v2si) -VAR2 (LANEMAC, vmlalu_n, v4hi, v2si) -VAR2 (LANEMAC, vqdmlal_n, v4hi, v2si) -VAR6 (LANEMAC, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) -VAR2 (LANEMAC, vmlsls_n, v4hi, v2si) -VAR2 (LANEMAC, vmlslu_n, v4hi, v2si) -VAR2 (LANEMAC, vqdmlsl_n, v4hi, v2si) +VAR6 (MAC_N, vmla_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) +VAR2 (MAC_N, vmlals_n, v4hi, v2si) +VAR2 (MAC_N, vmlalu_n, v4hi, v2si) +VAR2 (MAC_N, vqdmlal_n, v4hi, v2si) +VAR6 (MAC_N, vmls_n, v4hi, v2si, v2sf, v8hi, v4si, v4sf) +VAR2 (MAC_N, vmlsls_n, v4hi, v2si) +VAR2 (MAC_N, vmlslu_n, v4hi, v2si) +VAR2 (MAC_N, vqdmlsl_n, v4hi, v2si) VAR10 (SETLANE, vext, v8qi, v4hi, v2si, v2sf, di, v16qi, v8hi, v4si, v4sf, v2di) VAR8 (UNOP, vrev64, v8qi, v4hi, v2si, v2sf, v16qi, v8hi, v4si, v4sf) diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 654d9d5c1aa..4af74ce96ed 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -2663,8 +2663,6 @@ (match_operand:SI 2 "immediate_operand" "")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, GET_MODE_NUNITS (mode)); - if (BYTES_BIG_ENDIAN) { /* The intrinsics are defined in terms of a model where the @@ -2694,8 +2692,6 @@ (match_operand:SI 2 "immediate_operand" "")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, GET_MODE_NUNITS (mode)); - if (BYTES_BIG_ENDIAN) { /* The intrinsics are defined in terms of a model where the @@ -2725,7 +2721,6 @@ (match_operand:SI 2 "immediate_operand" "")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, 1); emit_move_insn (operands[0], operands[1]); DONE; }) @@ -2736,18 +2731,11 @@ (match_operand:SI 2 "immediate_operand" "")] "TARGET_NEON" { - switch (INTVAL (operands[2])) - { - case 0: - emit_move_insn (operands[0], gen_lowpart (DImode, operands[1])); - break; - case 1: - emit_move_insn (operands[0], gen_highpart (DImode, operands[1])); - break; - default: - neon_lane_bounds (operands[2], 0, 1); - FAIL; - } + int lane = INTVAL (operands[2]); + gcc_assert ((lane ==0) || (lane == 1)); + emit_move_insn (operands[0], lane == 0 + ? gen_lowpart (DImode, operands[1]) + : gen_highpart (DImode, operands[1])); DONE; }) @@ -2759,7 +2747,6 @@ "TARGET_NEON" { unsigned int elt = INTVAL (operands[3]); - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); if (BYTES_BIG_ENDIAN) { @@ -2782,7 +2769,6 @@ (match_operand:SI 3 "immediate_operand" "i")] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, 1); emit_move_insn (operands[0], operands[1]); DONE; }) @@ -2864,7 +2850,6 @@ (match_operand:SI 2 "immediate_operand" "i")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, GET_MODE_NUNITS (mode)); if (BYTES_BIG_ENDIAN) { unsigned int elt = INTVAL (operands[2]); @@ -2885,7 +2870,6 @@ (match_operand:SI 2 "immediate_operand" "i")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, 1); emit_move_insn (operands[0], operands[1]); DONE; }) @@ -2897,7 +2881,6 @@ (match_operand:SI 2 "immediate_operand" "i")] "TARGET_NEON" { - neon_lane_bounds (operands[2], 0, 1); emit_insn (gen_neon_vdup_nv2di (operands[0], operands[1])); DONE; }) @@ -3097,7 +3080,6 @@ UNSPEC_VMUL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vmul.\t%P0, %P1, %P2[%c3]"; } [(set (attr "type") @@ -3115,7 +3097,6 @@ UNSPEC_VMUL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vmul.\t%q0, %q1, %P2[%c3]"; } [(set (attr "type") @@ -3133,7 +3114,6 @@ VMULL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vmull.%#\t%q0, %P1, %P2[%c3]"; } [(set_attr "type" "neon_mul__scalar_long")] @@ -3148,7 +3128,6 @@ UNSPEC_VQDMULL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vqdmull.\t%q0, %P1, %P2[%c3]"; } [(set_attr "type" "neon_sat_mul__scalar_long")] @@ -3163,7 +3142,6 @@ VQDMULH_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vqdmulh.\t%q0, %q1, %P2[%c3]"; } [(set_attr "type" "neon_sat_mul__scalar_q")] @@ -3178,7 +3156,6 @@ VQDMULH_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (mode)); return "vqdmulh.\t%P0, %P1, %P2[%c3]"; } [(set_attr "type" "neon_sat_mul__scalar_q")] @@ -3194,7 +3171,6 @@ UNSPEC_VMLA_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmla.\t%P0, %P2, %P3[%c4]"; } [(set (attr "type") @@ -3213,7 +3189,6 @@ UNSPEC_VMLA_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmla.\t%q0, %q2, %P3[%c4]"; } [(set (attr "type") @@ -3232,7 +3207,6 @@ VMLAL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmlal.%#\t%q0, %P2, %P3[%c4]"; } [(set_attr "type" "neon_mla__scalar_long")] @@ -3248,7 +3222,6 @@ UNSPEC_VQDMLAL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vqdmlal.\t%q0, %P2, %P3[%c4]"; } [(set_attr "type" "neon_sat_mla__scalar_long")] @@ -3264,7 +3237,6 @@ UNSPEC_VMLS_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmls.\t%P0, %P2, %P3[%c4]"; } [(set (attr "type") @@ -3283,7 +3255,6 @@ UNSPEC_VMLS_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmls.\t%q0, %q2, %P3[%c4]"; } [(set (attr "type") @@ -3302,7 +3273,6 @@ VMLSL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vmlsl.%#\t%q0, %P2, %P3[%c4]"; } [(set_attr "type" "neon_mla__scalar_long")] @@ -3318,7 +3288,6 @@ UNSPEC_VQDMLSL_LANE))] "TARGET_NEON" { - neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (mode)); return "vqdmlsl.\t%q0, %P2, %P3[%c4]"; } [(set_attr "type" "neon_sat_mla__scalar_long")]