Force the creation of a CONST_VECTOR for expand_vec_perm.
* expr.c (expand_expr_real_2) [VEC_PERM_EXPR]: Avoid passing a CONST_INT to expand_vec_perm as the selector. * optabs.c (expand_vec_perm): Assert the selector is of a proper mode. From-SVN: r182192
This commit is contained in:
parent
a7de2c2a71
commit
ccdfb0e2c6
@ -1,3 +1,9 @@
|
||||
2011-12-10 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* expr.c (expand_expr_real_2) [VEC_PERM_EXPR]: Avoid passing a
|
||||
CONST_INT to expand_vec_perm as the selector.
|
||||
* optabs.c (expand_vec_perm): Assert the selector is of a proper mode.
|
||||
|
||||
2011-12-10 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* genmodes.c (struct mode_data): Remove wider_2x member.
|
||||
|
17
gcc/expr.c
17
gcc/expr.c
@ -8716,6 +8716,23 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
|
||||
case VEC_PERM_EXPR:
|
||||
expand_operands (treeop0, treeop1, target, &op0, &op1, EXPAND_NORMAL);
|
||||
op2 = expand_normal (treeop2);
|
||||
|
||||
/* Careful here: if the target doesn't support integral vector modes,
|
||||
a constant selection vector could wind up smooshed into a normal
|
||||
integral constant. */
|
||||
if (CONSTANT_P (op2) && GET_CODE (op2) != CONST_VECTOR)
|
||||
{
|
||||
tree sel_type = TREE_TYPE (treeop2);
|
||||
enum machine_mode vmode
|
||||
= mode_for_vector (TYPE_MODE (TREE_TYPE (sel_type)),
|
||||
TYPE_VECTOR_SUBPARTS (sel_type));
|
||||
gcc_assert (GET_MODE_CLASS (vmode) == MODE_VECTOR_INT);
|
||||
op2 = simplify_subreg (vmode, op2, TYPE_MODE (sel_type), 0);
|
||||
gcc_assert (op2 && GET_CODE (op2) == CONST_VECTOR);
|
||||
}
|
||||
else
|
||||
gcc_assert (GET_MODE_CLASS (GET_MODE (op2)) == MODE_VECTOR_INT);
|
||||
|
||||
temp = expand_vec_perm (mode, op0, op1, op2, target);
|
||||
gcc_assert (temp);
|
||||
return temp;
|
||||
|
@ -7038,7 +7038,8 @@ expand_vec_perm (enum machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target)
|
||||
}
|
||||
|
||||
/* If the input is a constant, expand it specially. */
|
||||
if (CONSTANT_P (sel))
|
||||
gcc_assert (GET_MODE_CLASS (GET_MODE (sel)) == MODE_VECTOR_INT);
|
||||
if (GET_CODE (sel) == CONST_VECTOR)
|
||||
{
|
||||
icode = direct_optab_handler (vec_perm_const_optab, mode);
|
||||
if (icode != CODE_FOR_nothing)
|
||||
@ -7056,7 +7057,7 @@ expand_vec_perm (enum machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target)
|
||||
{
|
||||
unsigned int j, this_e;
|
||||
|
||||
this_e = INTVAL (XVECEXP (sel, 0, i));
|
||||
this_e = INTVAL (CONST_VECTOR_ELT (sel, i));
|
||||
this_e &= 2 * e - 1;
|
||||
this_e *= u;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user