X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-vect-generic.c;h=b1e567aa870de2409a44dbbdaa5330e2f14f2f6e;hb=beb68f4a20aebb56a249bd83f20d09c86e92723f;hp=463b161a434cdb4285a34c796873e2ecdedbdaa9;hpb=a0bfd1b9d36fc14ba7fbc53c7b4d31d4ca93e4ed;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 463b161a434..b1e567aa870 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -1,5 +1,5 @@ /* Lower vector operations to scalar operations. - Copyright (C) 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -348,7 +348,7 @@ type_for_widest_vector_mode (enum machine_mode inner_mode, optab op) enum machine_mode best_mode = VOIDmode, mode; int best_nunits = 0; - if (GET_MODE_CLASS (inner_mode) == MODE_FLOAT) + if (SCALAR_FLOAT_MODE_P (inner_mode)) mode = MIN_MODE_VECTOR_FLOAT; else mode = MIN_MODE_VECTOR_INT; @@ -411,6 +411,11 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) gcc_assert (code != CONVERT_EXPR); op = optab_for_tree_code (code, type); + /* For widening vector operations, the relevant type is of the arguments, + not the widened result. */ + if (code == WIDEN_SUM_EXPR) + type = TREE_TYPE (TREE_OPERAND (rhs, 0)); + /* Optabs will try converting a negation into a subtraction, so look for it as well. TODO: negation of floating-point vectors might be turned into an exclusive OR toggling the sign bit. */ @@ -464,7 +469,7 @@ gate_expand_vector_operations (void) return flag_tree_vectorize != 0; } -static void +static unsigned int expand_vector_operations (void) { block_stmt_iterator bsi; @@ -478,6 +483,7 @@ expand_vector_operations (void) update_stmt_if_modified (bsi_stmt (bsi)); } } + return 0; } struct tree_opt_pass pass_lower_vector =