* fold-const.c (fold_ternary): Optimize BIT_FIELD_REF of VECTOR_CST.

From-SVN: r100442
This commit is contained in:
Jakub Jelinek 2005-06-01 12:13:36 +02:00 committed by Jakub Jelinek
parent a00cb0b926
commit dcd25113c6
2 changed files with 25 additions and 0 deletions

View File

@ -1,5 +1,7 @@
2005-06-01 Jakub Jelinek <jakub@redhat.com>
* fold-const.c (fold_ternary): Optimize BIT_FIELD_REF of VECTOR_CST.
* config/i386/xmmintrin.h (_mm_setzero_ps, _mm_set_ss, _mm_set1_ps,
_mm_set_ps, _mm_setr_ps): Add __extension__.
* config/i386/emmintrin.h (_mm_set_sd, _mm_set1_pd, _mm_set_pd,

View File

@ -10284,6 +10284,29 @@ fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
}
return NULL_TREE;
case BIT_FIELD_REF:
if (TREE_CODE (arg0) == VECTOR_CST
&& type == TREE_TYPE (TREE_TYPE (arg0))
&& host_integerp (arg1, 1)
&& host_integerp (op2, 1))
{
unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
if (width != 0
&& simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
&& (idx % width) == 0
&& (idx = idx / width)
< TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
{
tree elements = TREE_VECTOR_CST_ELTS (arg0);
while (idx-- > 0)
elements = TREE_CHAIN (elements);
return TREE_VALUE (elements);
}
}
return NULL_TREE;
default:
return NULL_TREE;
} /* switch (code) */