]> gcc.gnu.org Git - gcc.git/commitdiff
* simplify-rtx.c (simplify_binary_operation): Handle VEC_CONCAT.
authorRichard Henderson <rth@redhat.com>
Mon, 3 Jan 2005 19:41:06 +0000 (11:41 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 3 Jan 2005 19:41:06 +0000 (11:41 -0800)
From-SVN: r92861

gcc/ChangeLog
gcc/simplify-rtx.c

index e3e4db47c0a4f1cd9c3cf6645da18e56bc605871..ec06ccbdf5a526ce307a2d3695d96fbc6922d6c1 100644 (file)
@@ -1,3 +1,7 @@
+2005-01-03  Richard Henderson  <rth@redhat.com>
+
+       * simplify-rtx.c (simplify_binary_operation): Handle VEC_CONCAT.
+
 2005-01-03  Uros Bizjak  <uros@kss-loka.si>
 
        PR target/19236
@@ -5,7 +9,6 @@
        to SFmode.
        (log1pdf2): Change mode of operands[0,1] to DFmode.
 
-
 2005-01-03  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * config/sparc/sparc.h (SPARC_RELAXED_ORDERING): Define to false.
index 34b0ab8fe2000ca9dc3ce60b0de8aacbfd53aae0..6525e1604aafbc4f8442ec3850efd6b10bb79df5 100644 (file)
@@ -1190,14 +1190,11 @@ simplify_binary_operation (enum rtx_code code, enum machine_mode mode,
       && GET_CODE (trueop0) == CONST_VECTOR
       && GET_CODE (trueop1) == CONST_VECTOR)
     {
-      int elt_size = GET_MODE_SIZE (GET_MODE_INNER (mode));
-      unsigned n_elts = (GET_MODE_SIZE (mode) / elt_size);
+      unsigned n_elts = GET_MODE_NUNITS (mode);
       enum machine_mode op0mode = GET_MODE (trueop0);
-      int op0_elt_size = GET_MODE_SIZE (GET_MODE_INNER (op0mode));
-      unsigned op0_n_elts = (GET_MODE_SIZE (op0mode) / op0_elt_size);
+      unsigned op0_n_elts = GET_MODE_NUNITS (op0mode);
       enum machine_mode op1mode = GET_MODE (trueop1);
-      int op1_elt_size = GET_MODE_SIZE (GET_MODE_INNER (op1mode));
-      unsigned op1_n_elts = (GET_MODE_SIZE (op1mode) / op1_elt_size);
+      unsigned op1_n_elts = GET_MODE_NUNITS (op1mode);
       rtvec v = rtvec_alloc (n_elts);
       unsigned int i;
 
@@ -1216,6 +1213,41 @@ simplify_binary_operation (enum rtx_code code, enum machine_mode mode,
       return gen_rtx_CONST_VECTOR (mode, v);
     }
 
+  if (VECTOR_MODE_P (mode)
+      && code == VEC_CONCAT
+      && CONSTANT_P (trueop0) && CONSTANT_P (trueop1))
+    {
+      unsigned n_elts = GET_MODE_NUNITS (mode);
+      rtvec v = rtvec_alloc (n_elts);
+
+      gcc_assert (n_elts >= 2);
+      if (n_elts == 2)
+       {
+         gcc_assert (GET_CODE (trueop0) != CONST_VECTOR);
+         gcc_assert (GET_CODE (trueop1) != CONST_VECTOR);
+
+         RTVEC_ELT (v, 0) = trueop0;
+         RTVEC_ELT (v, 1) = trueop1;
+       }
+      else
+       {
+         unsigned op0_n_elts = GET_MODE_NUNITS (GET_MODE (trueop0));
+         unsigned op1_n_elts = GET_MODE_NUNITS (GET_MODE (trueop1));
+         unsigned i;
+
+         gcc_assert (GET_CODE (trueop0) == CONST_VECTOR);
+         gcc_assert (GET_CODE (trueop1) == CONST_VECTOR);
+         gcc_assert (op0_n_elts + op1_n_elts == n_elts);
+
+         for (i = 0; i < op0_n_elts; ++i)
+           RTVEC_ELT (v, i) = XVECEXP (trueop0, 0, i);
+         for (i = 0; i < op1_n_elts; ++i)
+           RTVEC_ELT (v, op0_n_elts+i) = XVECEXP (trueop1, 0, i);
+       }
+
+      return gen_rtx_CONST_VECTOR (mode, v);
+    }
+
   if (GET_MODE_CLASS (mode) == MODE_FLOAT
       && GET_CODE (trueop0) == CONST_DOUBLE
       && GET_CODE (trueop1) == CONST_DOUBLE
This page took 0.067778 seconds and 5 git commands to generate.