diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32ad1daad55..c38662ab245 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-04-01 Richard Sandiford + + * expr.c (emit_block_move_via_movmem): Use n_generator_args + instead of n_operands. + (set_storage_via_setmem): Likewise. + * optabs.c (maybe_gen_insn): Likewise. + * config/arm/arm.c (arm_init_neon_builtins): Likewise. + * config/mips/mips.c (mips_expand_builtin_compare_1): Likewise. + (mips_expand_builtin_direct): Likewise. + * config/spu/spu.c (expand_builtin_args): Likewise. + 2011-04-01 Richard Sandiford * recog.h (insn_data_d): Add n_generator_args. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 56dc85ea4b8..4fee4dafa02 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -18944,7 +18944,7 @@ arm_init_neon_builtins (void) /* Build a function type directly from the insn_data for this builtin. The build_function_type() function takes care of removing duplicates for us. */ - for (k = insn_data[icode].n_operands - 1; k >= 0; k--) + for (k = insn_data[icode].n_generator_args - 1; k >= 0; k--) { tree eltype; diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 643e507fddf..74c7ba56d05 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -13252,7 +13252,7 @@ mips_expand_builtin_compare_1 (enum insn_code icode, /* The instruction should have a target operand, an operand for each argument, and an operand for COND. */ - gcc_assert (nargs + 2 == insn_data[(int) icode].n_operands); + gcc_assert (nargs + 2 == insn_data[(int) icode].n_generator_args); opno = 0; create_output_operand (&ops[opno++], NULL_RTX, @@ -13280,11 +13280,9 @@ mips_expand_builtin_direct (enum insn_code icode, rtx target, tree exp, if (has_target_p) create_output_operand (&ops[opno++], target, TYPE_MODE (TREE_TYPE (exp))); - /* Map the arguments to the other operands. The n_operands value - for an expander includes match_dups and match_scratches as well as - match_operands, so n_operands is only an upper bound on the number - of arguments to the expander function. */ - gcc_assert (opno + call_expr_nargs (exp) <= insn_data[icode].n_operands); + /* Map the arguments to the other operands. */ + gcc_assert (opno + call_expr_nargs (exp) + == insn_data[icode].n_generator_args); for (argno = 0; argno < call_expr_nargs (exp); argno++) mips_prepare_builtin_arg (&ops[opno++], exp, argno); diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 46bc586c2c7..8a5928b6638 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -6545,9 +6545,7 @@ expand_builtin_args (struct spu_builtin_description *d, tree exp, ops[i] = expand_expr (arg, NULL_RTX, VOIDmode, EXPAND_NORMAL); } - /* The insn pattern may have additional operands (SCRATCH). - Return the number of actual non-SCRATCH operands. */ - gcc_assert (i <= insn_data[icode].n_operands); + gcc_assert (i == insn_data[icode].n_generator_args); return i; } diff --git a/gcc/expr.c b/gcc/expr.c index ca618040680..4cbb09b0a45 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1293,11 +1293,8 @@ emit_block_move_via_movmem (rtx x, rtx y, rtx size, unsigned int align, nice if there were some way to inform the backend, so that it doesn't fail the expansion because it thinks emitting the libcall would be more efficient. */ - nops = insn_data[(int) code].n_operands; - /* ??? n_operands includes match_scratches; find some other - way to select the 6 operand variant, or force all targets - to have exactly 6 operands. */ - gcc_assert (nops >= 4 && nops <= 6); + nops = insn_data[(int) code].n_generator_args; + gcc_assert (nops == 4 || nops == 6); create_fixed_operand (&ops[0], x); create_fixed_operand (&ops[1], y); @@ -2719,11 +2716,8 @@ set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align, struct expand_operand ops[6]; unsigned int nops; - nops = insn_data[(int) code].n_operands; - /* ??? n_operands includes match_scratches; find some other - way to select the 6 operand variant, or force all targets - to have exactly 6 operands. */ - gcc_assert (nops >= 4 && nops <= 6); + nops = insn_data[(int) code].n_generator_args; + gcc_assert (nops == 4 || nops == 6); create_fixed_operand (&ops[0], object); /* The check above guarantees that this size conversion is valid. */ diff --git a/gcc/optabs.c b/gcc/optabs.c index e60abf83255..682b8e40f7c 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -7118,9 +7118,7 @@ rtx maybe_gen_insn (enum insn_code icode, unsigned int nops, struct expand_operand *ops) { - /* n_operands includes any automatically-generated match_scratches, - so we can't check for equality here. */ - gcc_assert (nops <= (unsigned int) insn_data[(int) icode].n_operands); + gcc_assert (nops == (unsigned int) insn_data[(int) icode].n_generator_args); if (!maybe_legitimize_operands (icode, 0, nops, ops)) return NULL_RTX;