diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d083c07874..c81681cc796 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-05-18 Devang Patel + + * config/rs6000/rs6000.md (insvsi_internal1): Subtract shift from + the mask end. + 2005-05-18 Richard Henderson * tree-ssa-forwprop.c (cfg_changed): New. diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index b53792c32ae..2c0b0491abe 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 74b37015dc0..78580bc0933 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-05-18 Devang Patel + + * g++.dg/opt/20050511-1.C: New test. + 2005-05-18 Thomas Koenig 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 00000000000..e04b2b863e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/20050511-1.C @@ -0,0 +1,64 @@ +/* { dg-do run } */ +/* { dg-options "-O3" { target powerpc*-*-* } } */ +#include +#include + +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 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); +} +