aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.co.uk>2000-09-08 09:39:23 +0000
committerBernd Schmidt <crux@gcc.gnu.org>2000-09-08 09:39:23 +0000
commit82be40f7eb85596f2d654e7eeee000972022d344 (patch)
tree4f6d42c06e9dfee4a87179059fbbc9be5d35507b
parentd5e5ec886e4928470e299aaee34ede9402a3325e (diff)
downloadgcc-82be40f7eb85596f2d654e7eeee000972022d344.zip
gcc-82be40f7eb85596f2d654e7eeee000972022d344.tar.gz
gcc-82be40f7eb85596f2d654e7eeee000972022d344.tar.bz2
Some vector operation simplifications.
From-SVN: r36263
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/combine.c39
2 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a21536..6e2837b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-09-08 Bernd Schmidt <bernds@redhat.co.uk>
+
+ * combine.c (combine_simplify_rtx): Try to simplify VEC_SELECT of a
+ VEC_CONCAT.
+
2000-09-07 Richard Henderson <rth@cygnus.com>
* config/ia64/lib1funcs.asm (__divsi3): Use .s1 for frcpa.
diff --git a/gcc/combine.c b/gcc/combine.c
index 56bedce3..053b420 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -4539,6 +4539,45 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
break;
+ case VEC_SELECT:
+ {
+ rtx op0 = XEXP (x, 0);
+ rtx op1 = XEXP (x, 1);
+ int len;
+
+ if (GET_CODE (op1) != PARALLEL)
+ abort ();
+ len = XVECLEN (op1, 0);
+ if (len == 1
+ && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
+ && GET_CODE (op0) == VEC_CONCAT)
+ {
+ int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
+
+ /* Try to find the element in the VEC_CONCAT. */
+ for (;;)
+ {
+ if (GET_MODE (op0) == GET_MODE (x))
+ return op0;
+ if (GET_CODE (op0) == VEC_CONCAT)
+ {
+ HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
+ if (op0_size < offset)
+ op0 = XEXP (op0, 0);
+ else
+ {
+ offset -= op0_size;
+ op0 = XEXP (op0, 1);
+ }
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ break;
+
default:
break;
}