aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2005-05-18 16:54:36 -0700
committerDevang Patel <dpatel@gcc.gnu.org>2005-05-18 16:54:36 -0700
commit46e5b15ed471cc516a8c22ebe95f5dea5a85da4a (patch)
treed73bd2da11bd61d6dfe37ab86318145eefbe5438
parent5bcd8644167353674cc9f44f321df15154311735 (diff)
downloadgcc-46e5b15ed471cc516a8c22ebe95f5dea5a85da4a.zip
gcc-46e5b15ed471cc516a8c22ebe95f5dea5a85da4a.tar.gz
gcc-46e5b15ed471cc516a8c22ebe95f5dea5a85da4a.tar.bz2
rs6000.md (insvsi_internal1): Subtract shift from the mask end.
* config/rs6000/rs6000.md (insvsi_internal1): Subtract shift from the mask end. * g++.dg/opt/20050511-1.C: New test. From-SVN: r99936
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.md2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/opt/20050511-1.C64
4 files changed, 74 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6d083c0..c81681c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-18 Devang Patel <dpatel@apple.com>
+
+ * config/rs6000/rs6000.md (insvsi_internal1): Subtract shift from
+ the mask end.
+
2005-05-18 Richard Henderson <rth@redhat.com>
* tree-ssa-forwprop.c (cfg_changed): New.
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index b53792c..2c0b049 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -3014,7 +3014,7 @@
int size = INTVAL (operands[1]) & 31;
operands[4] = GEN_INT (shift - start - size);
- operands[1] = GEN_INT (start + size - 1);
+ operands[1] = GEN_INT (start + size - 1 - shift);
return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
}"
[(set_attr "type" "insert_word")])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 74b3701..78580bc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-05-18 Devang Patel <dpatel@apple.com>
+
+ * g++.dg/opt/20050511-1.C: New test.
+
2005-05-18 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/21127
diff --git a/gcc/testsuite/g++.dg/opt/20050511-1.C b/gcc/testsuite/g++.dg/opt/20050511-1.C
new file mode 100644
index 0000000..e04b2b8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/20050511-1.C
@@ -0,0 +1,64 @@
+/* { dg-do run } */
+/* { dg-options "-O3" { target powerpc*-*-* } } */
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef signed short SINT16 ;
+typedef unsigned long UINT32 ;
+typedef unsigned int UINT ;
+
+class A
+{
+public:
+ union
+ {
+ SINT16 xy[2];
+ UINT32 abXY;
+ };
+ bool operator==(const A& other) const {return abXY == other.abXY;}
+ bool operator!=(const A& other) const {return abXY != other.abXY;}
+};
+
+template <int size> struct pArray { unsigned char u08[16*(((size*1)+15)/16)] __attribute__ ((aligned(16))); };
+
+struct B
+{
+ union {
+ A mvL[2];
+ pArray<1> xyz;
+ };
+} ;
+
+typedef struct
+{
+ UINT w;
+ B b;
+
+}C;
+
+
+UINT32 bar (const C * sPtr)
+{
+ UINT w = sPtr->w;
+ A a;
+
+ a.xy[0] = sPtr->b.mvL[w].xy[0]<<2;
+ a.xy[1] = sPtr->b.mvL[w].xy[1]<<2;
+
+ if (a.xy[0] != ((SINT16) 0xffff << 2))
+ abort ();
+}
+
+int main()
+{
+ A a;
+ C c;
+ a.xy[0] = 0xffff;
+ a.xy[1] = 0xffff;
+ c.w=0;
+ c.b.mvL[0].xy[0] = a.xy[0];
+ c.b.mvL[0].xy[1] = a.xy[1];
+
+ bar (&c);
+}
+