From patchwork Fri Jun 29 05:54:33 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Add MULT_HIGHPART_EXPR Date: Thu, 28 Jun 2012 19:54:33 -0000 From: Jakub Jelinek X-Patchwork-Id: 167985 Message-Id: <20120629055433.GW20264@tucnak.redhat.com> To: Bernhard Reutner-Fischer Cc: Richard Henderson , gcc-patches@gcc.gnu.org On Fri, Jun 29, 2012 at 12:00:10AM +0200, Bernhard Reutner-Fischer wrote: > Really both HI? If so optab2 could be removed from that fn altogether.. Of course, thanks for pointing that out. I've additionally added a result mode check (similar to what supportable_widening_operation does). The reason for not using supportable_widening_operation is that it only tests even/odd calls for reductions, while we can use them everywhere. Committed as obvious. 2012-06-29 Jakub Jelinek * tree-vect-stmts.c (vectorizable_operation): Check both VEC_WIDEN_MULT_LO_EXPR and VEC_WIDEN_MULT_HI_EXPR optabs. Verify that operand[0]'s mode is TYPE_MODE (wide_vectype). Jakub --- gcc/tree-vect-stmts.c (revision 189053) +++ gcc/tree-vect-stmts.c (working copy) @@ -3504,14 +3504,19 @@ vectorizable_operation (gimple stmt, gim { decl1 = NULL_TREE; decl2 = NULL_TREE; - optab = optab_for_tree_code (VEC_WIDEN_MULT_HI_EXPR, + optab = optab_for_tree_code (VEC_WIDEN_MULT_LO_EXPR, vectype, optab_default); optab2 = optab_for_tree_code (VEC_WIDEN_MULT_HI_EXPR, vectype, optab_default); if (optab != NULL && optab2 != NULL && optab_handler (optab, vec_mode) != CODE_FOR_nothing - && optab_handler (optab2, vec_mode) != CODE_FOR_nothing) + && optab_handler (optab2, vec_mode) != CODE_FOR_nothing + && insn_data[optab_handler (optab, vec_mode)].operand[0].mode + == TYPE_MODE (wide_vectype) + && insn_data[optab_handler (optab2, + vec_mode)].operand[0].mode + == TYPE_MODE (wide_vectype)) { for (i = 0; i < nunits_in; i++) sel[i] = !BYTES_BIG_ENDIAN + 2 * i;