Commit eaa80f64 by Alan Lawrence Committed by Alan Lawrence

[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<mode>, neon_vget_laneu<mode>,
	neon_vget_lanedi, neon_vget_lanev2di, neon_vset_lane<mode>,
	neon_vset_lanedi, neon_vdup_lane<mode>, neon_vdup_lanedi,
	neon_vdup_lanev2di, neon_vmul_lane<mode>, neon_vmul_lane<mode>,
	neon_vmull<sup>_lane<mode>, neon_vqdmull_lane<mode>,
	neon_vq<r>dmulh_lane<mode>, neon_vq<r>dmulh_lane<mode>,
	neon_vmla_lane<mode>, neon_vmla_lane<mode>, neon_vmlal<sup>_lane<mode>,
	neon_vqdmlal_lane<mode>, neon_vmls_lane<mode>, neon_vmls_lane<mode>,
	neon_vmlsl<sup>_lane<mode>, neon_vqdmlsl_lane<mode>):
	Remove call to neon_lane_bounds.

From-SVN: r226251
parent d99dacc9
2015-07-27 Alan Lawrence <alan.lawrence@arm.com>
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<mode>, neon_vget_laneu<mode>,
neon_vget_lanedi, neon_vget_lanev2di, neon_vset_lane<mode>,
neon_vset_lanedi, neon_vdup_lane<mode>, neon_vdup_lanedi,
neon_vdup_lanev2di, neon_vmul_lane<mode>, neon_vmul_lane<mode>,
neon_vmull<sup>_lane<mode>, neon_vqdmull_lane<mode>,
neon_vq<r>dmulh_lane<mode>, neon_vq<r>dmulh_lane<mode>,
neon_vmla_lane<mode>, neon_vmla_lane<mode>, neon_vmlal<sup>_lane<mode>,
neon_vqdmlal_lane<mode>, neon_vmls_lane<mode>, neon_vmls_lane<mode>,
neon_vmlsl<sup>_lane<mode>, neon_vqdmlsl_lane<mode>):
Remove call to neon_lane_bounds.
2015-07-27 Wilco Dijkstra <wdijkstr@arm.com>
* config/aarch64/aarch64.md (aarch64_ashl_sisd_or_int_<mode>3):
......
......@@ -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)
{
......
......@@ -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);
......
......@@ -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
......
......@@ -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)
......
......@@ -2663,8 +2663,6 @@
(match_operand:SI 2 "immediate_operand" "")]
"TARGET_NEON"
{
neon_lane_bounds (operands[2], 0, GET_MODE_NUNITS (<MODE>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>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>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 (<V_double_vector_mode>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>mode));
return "vmul.<V_if_elem>\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 (<V_HALF>mode));
return "vmul.<V_if_elem>\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>mode));
return "vmull.<sup>%#<V_sz_elem>\t%q0, %P1, %P2[%c3]";
}
[(set_attr "type" "neon_mul_<V_elem_ch>_scalar_long")]
......@@ -3148,7 +3128,6 @@
UNSPEC_VQDMULL_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmull.<V_s_elem>\t%q0, %P1, %P2[%c3]";
}
[(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_long")]
......@@ -3163,7 +3142,6 @@
VQDMULH_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vq<r>dmulh.<V_s_elem>\t%q0, %q1, %P2[%c3]";
}
[(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_q")]
......@@ -3178,7 +3156,6 @@
VQDMULH_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
return "vq<r>dmulh.<V_s_elem>\t%P0, %P1, %P2[%c3]";
}
[(set_attr "type" "neon_sat_mul_<V_elem_ch>_scalar_q")]
......@@ -3194,7 +3171,6 @@
UNSPEC_VMLA_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vmla.<V_if_elem>\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>mode));
return "vmla.<V_if_elem>\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>mode));
return "vmlal.<sup>%#<V_sz_elem>\t%q0, %P2, %P3[%c4]";
}
[(set_attr "type" "neon_mla_<V_elem_ch>_scalar_long")]
......@@ -3248,7 +3222,6 @@
UNSPEC_VQDMLAL_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmlal.<V_s_elem>\t%q0, %P2, %P3[%c4]";
}
[(set_attr "type" "neon_sat_mla_<V_elem_ch>_scalar_long")]
......@@ -3264,7 +3237,6 @@
UNSPEC_VMLS_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vmls.<V_if_elem>\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>mode));
return "vmls.<V_if_elem>\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>mode));
return "vmlsl.<sup>%#<V_sz_elem>\t%q0, %P2, %P3[%c4]";
}
[(set_attr "type" "neon_mla_<V_elem_ch>_scalar_long")]
......@@ -3318,7 +3288,6 @@
UNSPEC_VQDMLSL_LANE))]
"TARGET_NEON"
{
neon_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
return "vqdmlsl.<V_s_elem>\t%q0, %P2, %P3[%c4]";
}
[(set_attr "type" "neon_sat_mla_<V_elem_ch>_scalar_long")]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment