From patchwork Thu Mar 31 16:23:09 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 866 Return-Path: Delivered-To: unknown Received: from imap.gmail.com (74.125.159.109) by localhost6.localdomain6 with IMAP4-SSL; 08 Jun 2011 14:46:45 -0000 Delivered-To: patches@linaro.org Received: by 10.42.161.68 with SMTP id s4cs147764icx; Thu, 31 Mar 2011 09:23:17 -0700 (PDT) Received: by 10.227.178.5 with SMTP id bk5mr1267914wbb.173.1301588596933; Thu, 31 Mar 2011 09:23:16 -0700 (PDT) Received: from mail-wy0-f178.google.com (mail-wy0-f178.google.com [74.125.82.178]) by mx.google.com with ESMTPS id j7si2630369wbj.99.2011.03.31.09.23.16 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2011 09:23:16 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.178 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) client-ip=74.125.82.178; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.178 is neither permitted nor denied by best guess record for domain of richard.sandiford@linaro.org) smtp.mail=richard.sandiford@linaro.org Received: by wyb33 with SMTP id 33so2591121wyb.37 for ; Thu, 31 Mar 2011 09:23:16 -0700 (PDT) Received: by 10.216.145.152 with SMTP id p24mr2201082wej.97.1301588596260; Thu, 31 Mar 2011 09:23:16 -0700 (PDT) Received: from richards-thinkpad (gbibp9ph1--blueice2n1.emea.ibm.com [195.212.29.75]) by mx.google.com with ESMTPS id y12sm749157wby.25.2011.03.31.09.23.11 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 Mar 2011 09:23:13 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, patches@linaro.org, richard.sandiford@linaro.org Cc: patches@linaro.org Subject: [3/3] Record the number of generator arguments in insn_data Date: Thu, 31 Mar 2011 17:23:09 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 This patch makes use of the new n_generator_args field. Bboostrapped & regressions-tested on x86_64-linux-gnu. Also tested by building cc1 for arm-linux-gnueabi, mips-elf, spu-elf. Richard gcc/ * expr.c (emit_block_move_via_movmem): Use n_generator_args instead of n_operands. * 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. Index: gcc/expr.c =================================================================== --- gcc/expr.c 2011-03-31 16:40:14.000000000 +0100 +++ gcc/expr.c 2011-03-31 16:49:06.000000000 +0100 @@ -1293,11 +1293,7 @@ emit_block_move_via_movmem (rtx x, rtx y 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; create_fixed_operand (&ops[0], x); create_fixed_operand (&ops[1], y); Index: gcc/optabs.c =================================================================== --- gcc/optabs.c 2011-03-31 16:40:14.000000000 +0100 +++ gcc/optabs.c 2011-03-31 16:49:06.000000000 +0100 @@ -7149,9 +7149,7 @@ maybe_legitimize_operands (enum insn_cod 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; Index: gcc/config/arm/arm.c =================================================================== --- gcc/config/arm/arm.c 2011-03-31 16:40:14.000000000 +0100 +++ gcc/config/arm/arm.c 2011-03-31 16:49:06.000000000 +0100 @@ -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; Index: gcc/config/mips/mips.c =================================================================== --- gcc/config/mips/mips.c 2011-03-31 16:40:14.000000000 +0100 +++ gcc/config/mips/mips.c 2011-03-31 16:49:06.000000000 +0100 @@ -13252,7 +13252,7 @@ mips_expand_builtin_compare_1 (enum insn /* 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_co 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); Index: gcc/config/spu/spu.c =================================================================== --- gcc/config/spu/spu.c 2011-03-31 16:40:14.000000000 +0100 +++ gcc/config/spu/spu.c 2011-03-31 16:49:06.000000000 +0100 @@ -6545,9 +6545,7 @@ expand_builtin_args (struct spu_builtin_ 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; }