On Sat, Aug 21, 2004 at 02:27:17PM -0500, Matthew Dempsky wrote: > Daniel Jacobowitz <[EMAIL PROTECTED]> writes: > > > On Sat, Aug 21, 2004 at 12:44:03AM -0500, Matthew Dempsky wrote: > >> No warning, but the generated code seems incorrect (or at least a > >> regression from 3.3) unless ((int *)&val)[x] isn't the correct > >> portable way to access a vector element, but there doesn't seem to be > >> an alternative that I've been able to deduce (and the documentation > >> doesn't list any). > > > > It isn't correct. Use a union; you're violating the strict-aliasing > > rules. > > Alright, I tried changing print_v4si to this (rest of the code the > same): > > static void > print_v4si (const char * name, v4si val) > { > union foo > { > v4si vector; > int array[4]; > } l; > int x; > > l.vector = val; > > printf ("%s:\n", name); > for (x = 0; x < 4; ++x) > printf (" vals[%d] = %d\n", x, l.array[x]); > printf ("\n"); > } > > And it still generates bogus values for the third and fourth vector > elements. I also just noticed that compiling with -march=athlon-xp > causes all of the values to be zero. > > Or did I still not get the strict aliasing rules right? > (-Wstrict-aliasing doesn't seem to generate a warning with either old > or new code either.)
I'm not sure - I'd have to take a look at the generated code. -- Daniel Jacobowitz