From: Uros Bizjak Date: Wed, 10 Nov 2010 23:28:03 +0000 (+0100) Subject: re PR target/46419 (_mm_cvtpu16_ps (and hence _mm_cvtpu8_ps) returns false result) X-Git-Tag: releases/gcc-4.4.6~274 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ab6ed14212c76219ef9716bb6342ba1356c10b9;p=thirdparty%2Fgcc.git re PR target/46419 (_mm_cvtpu16_ps (and hence _mm_cvtpu8_ps) returns false result) PR middle-end/46419 * config/i386/xmmintrin.h (_mm_cvtpi16_ps): Swap __hisi and __losi. (_mm_cvtpu16_ps): Ditto. testsuite/ChangeLog: PR target/46419 * gcc-target/i386/pr46419.c: New test. From-SVN: r166572 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73ce585d92b2..8c766dea7bb5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-10 Uros Bizjak + + PR middle-end/46419 + * config/i386/xmmintrin.h (_mm_cvtpi16_ps): Swap __hisi and __losi. + (_mm_cvtpu16_ps): Ditto. + 2010-11-04 Uros Bizjak Revert: diff --git a/gcc/config/i386/xmmintrin.h b/gcc/config/i386/xmmintrin.h index 544577ecaf08..8bec37440357 100644 --- a/gcc/config/i386/xmmintrin.h +++ b/gcc/config/i386/xmmintrin.h @@ -626,13 +626,13 @@ _mm_cvtpi16_ps (__m64 __A) __sign = __builtin_ia32_pcmpgtw ((__v4hi)0LL, (__v4hi)__A); /* Convert the four words to doublewords. */ - __hisi = (__v2si) __builtin_ia32_punpckhwd ((__v4hi)__A, __sign); __losi = (__v2si) __builtin_ia32_punpcklwd ((__v4hi)__A, __sign); + __hisi = (__v2si) __builtin_ia32_punpckhwd ((__v4hi)__A, __sign); /* Convert the doublewords to floating point two at a time. */ __zero = (__v4sf) _mm_setzero_ps (); - __ra = __builtin_ia32_cvtpi2ps (__zero, __hisi); - __rb = __builtin_ia32_cvtpi2ps (__ra, __losi); + __ra = __builtin_ia32_cvtpi2ps (__zero, __losi); + __rb = __builtin_ia32_cvtpi2ps (__ra, __hisi); return (__m128) __builtin_ia32_movlhps (__ra, __rb); } @@ -645,13 +645,13 @@ _mm_cvtpu16_ps (__m64 __A) __v4sf __zero, __ra, __rb; /* Convert the four words to doublewords. */ - __hisi = (__v2si) __builtin_ia32_punpckhwd ((__v4hi)__A, (__v4hi)0LL); __losi = (__v2si) __builtin_ia32_punpcklwd ((__v4hi)__A, (__v4hi)0LL); + __hisi = (__v2si) __builtin_ia32_punpckhwd ((__v4hi)__A, (__v4hi)0LL); /* Convert the doublewords to floating point two at a time. */ __zero = (__v4sf) _mm_setzero_ps (); - __ra = __builtin_ia32_cvtpi2ps (__zero, __hisi); - __rb = __builtin_ia32_cvtpi2ps (__ra, __losi); + __ra = __builtin_ia32_cvtpi2ps (__zero, __losi); + __rb = __builtin_ia32_cvtpi2ps (__ra, __hisi); return (__m128) __builtin_ia32_movlhps (__ra, __rb); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9aa5983c5562..12da78f95b13 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-10 Uros Bizjak + + PR target/46419 + * gcc-target/i386/pr46419.c: New test. + 2010-11-08 Rainer Orth Backport from mainline: diff --git a/gcc/testsuite/gcc.target/i386/pr46419.c b/gcc/testsuite/gcc.target/i386/pr46419.c new file mode 100644 index 000000000000..3b722283ef32 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr46419.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -msse" } */ +/* { dg-require-effective-target sse } */ + +#include "sse-check.h" + +#include + +void __attribute__((noinline)) +sse_test (void) +{ + char image[4]; + __m128 image4; + float out[4] __attribute__ ((aligned (16))); + int i; + + for (i = 0; i < 4; i++) + image[i] = i + 1; + + image4 = + _mm_cvtpi8_ps (_mm_setr_pi8 + (image[0], image[1], image[2], image[3], 0, 0, 0, 0)); + _mm_store_ps (out, image4); + _mm_empty (); + + for (i = 0; i < 4; i++) + if (out[i] != (float) (i + 1)) + abort (); + + image4 = + _mm_cvtpu8_ps (_mm_setr_pi8 + (image[0], image[1], image[2], image[3], 0, 0, 0, 0)); + _mm_store_ps (out, image4); + _mm_empty (); + + for (i = 0; i < 4; i++) + if (out[i] != (float) (i + 1)) + abort (); +}