aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-06-01 12:13:36 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2005-06-01 12:13:36 +0200
commitdcd25113c6c37534621934617f07776b9212ef33 (patch)
treed4483d63d139eff9738f540f3168a9f08952531c
parenta00cb0b926ac650709e3816bc967c8795869c116 (diff)
downloadgcc-dcd25113c6c37534621934617f07776b9212ef33.zip
gcc-dcd25113c6c37534621934617f07776b9212ef33.tar.gz
gcc-dcd25113c6c37534621934617f07776b9212ef33.tar.bz2
* fold-const.c (fold_ternary): Optimize BIT_FIELD_REF of VECTOR_CST.
From-SVN: r100442
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/fold-const.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6214421..01a685a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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,
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 18e92e2..13984d1 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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) */