------- Comment #15 from yottui at yahoo dot co dot jp 2010-07-14 09:22 -------
I found the similar case with gcc 4.4.4 of MacPorts and gcc 4.4.0 of MinGW.
-- begin testcase --
// g++ -O -msse2 test.cpp
typedef long long __m128i __attribute__ ((__vector_size__ (16),
__may_alias__));
struct vec
{
__m128i v;
static vec load(const int * p)
{ return (__m128i) __builtin_ia32_loaddqu((char const *)p); }
const int & operator [](int i) const
{
union u {
__m128i v;
int e[4];
};
return ((const u &)v).e[i];
}
vec() {}
vec(const __m128i & a) : v(a) {}
};
extern "C" {
int printf (const char*, ...);
}
int main( int argc, char * argv[] )
{
__attribute__((aligned(16))) int data[] =
{ 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5 };
vec a = vec::load(data);
printf("v: %d, %d, %d, %d\n", a[0], a[1], a[2], a[3]);
return 0;
}
-- end testcase --
-- begin output --
v: 16, 16, 14, 14
-- end output --
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44900