------- Comment #17 from sezeroz at gmail dot com 2010-07-14 14:02 ------- (In reply to comment #16) > This is also the wrong result with MinGW gcc 3.4.5. > I'm expecting that all component of v will be 2500. > > 4.4.4 of MacPorts, 4.5.0 of MacPorts, 4.4.0 of MinGW and 4.5.0-1 of MinGW were > worked fine. > > This time, I did not check 3.4.6 of MacPorts. > I tried to install gcc34 of MacPorts, but failed. > > -- begin testcase -- > // g++ -O -msse2 test.cpp > #include <xmmintrin.h> > #include <emmintrin.h> > > extern "C" int printf (const char*, ...); > > // There is no _mm_castps_si128() in gcc 3.4 > inline __m128i my_castps_si128(const __m128 & a) > { > //return *(const __m128i *)&a; // same result > > union u { > __m128 s; > __m128i i; > }; > const u & v = (const u &)a; > > return v.i; > } > > inline __m128 my_castsi128_ps(const __m128i & a) > { > //return *(const __m128 *)&a; // same result > > union u { > __m128 s; > __m128i i; > }; > const u & v = (const u &)a; > > return v.s; > } > > int main( int argc, char * argv[] ) > { > > union u { > __m128i v; > int e[4]; > }; > __m128i a = _mm_set1_epi32(1250); > __m128i b = _mm_set1_epi32(2); > __m128i v0 = _mm_setzero_si128(); > __m128i al = _mm_unpacklo_epi32(a, v0); > __m128i ah = _mm_unpackhi_epi32(a, v0); > __m128i bl = _mm_unpacklo_epi32(b, v0); > __m128i bh = _mm_unpackhi_epi32(b, v0); > __m128i lo = _mm_mul_epu32(al, bl); > __m128i hi = _mm_mul_epu32(ah, bh); > __m128 sl = my_castsi128_ps(lo); > __m128 sh = my_castsi128_ps(hi); > __m128 s = _mm_shuffle_ps(sl, sh, 0x88); // 2, 0, 2, 0 > __m128i r = my_castps_si128(s); > > u & v = (u &)r; > printf("v: %d, %d, %d, %d\n", v.e[0], v.e[1], v.e[2], v.e[3]); > > return 0; > } > -- end testcase -- > > -- begin output -- > v: 0, 0, 2500, 2500 > -- end output -- >
-- sezeroz at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |sezeroz at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44900