Hello! > Attached is a patch which fixes bug target/51393: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51393 > > Also attached, avx_bug.c is a minimal example to reproduce the bug > (requires an AVX-capable CPU): > > $ gcc -O3 -mavx avx_bug.c > $ ./a.out 0x80000000 > in = 0x0000000080000000 > out = 0xffffffff80000000 > > The correct output should be: > > $ ./a.out 0x80000000 > in = 0x0000000080000000 > out = 0x0000000080000000 > > As explained in the bug report, it's just a matter of the second > parameter of _mm256_insert_epi64 being declared as int where it should > be long long (avxintrin.h:762). A simple typo, trivially fixed by the > attached patch.
OK. Attached patch (with a testcase) was committed to mainline SVN with following ChangeLog entry: 2011-12-04 Jérémie Detrey <jeremie.det...@loria.fr> PR target/51393 * config/i386/avxintrin.h (_mm256_insert_epi64): Declare second parameter as long long. testsuite/ChangeLog: 2011-12-04 Uros Bizjak <ubiz...@gmail.com> Jérémie Detrey <jeremie.det...@loria.fr> PR target/51393 * gcc.target/i386/pr51393.c: New test. Patch was tested on x86_64-pc-linux-gnu {,-m32}. Patch was committed to mainline, will be committed to release branches. Thanks, Uros.
Index: config/i386/avxintrin.h =================================================================== --- config/i386/avxintrin.h (revision 181984) +++ config/i386/avxintrin.h (working copy) @@ -759,7 +759,7 @@ #ifdef __x86_64__ extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -_mm256_insert_epi64 (__m256i __X, int __D, int const __N) +_mm256_insert_epi64 (__m256i __X, long long __D, int const __N) { __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 1); __Y = _mm_insert_epi64 (__Y, __D, __N % 2); Index: testsuite/gcc.target/i386/pr51393.c =================================================================== --- testsuite/gcc.target/i386/pr51393.c (revision 0) +++ testsuite/gcc.target/i386/pr51393.c (revision 0) @@ -0,0 +1,21 @@ +/* { dg-do run { target { ! { ia32 } } } } */ +/* { dg-require-effective-target avx } */ +/* { dg-options "-O -mavx" } */ + +#include "avx-check.h" +#include <immintrin.h> + +static void +__attribute__((noinline)) +avx_test (void) +{ + long long in = 0x800000000ll; + long long out; + + __m256i zero = _mm256_setzero_si256(); + __m256i tmp = _mm256_insert_epi64 (zero, in, 0); + out = _mm256_extract_epi64(tmp, 0); + + if (in != out) + abort (); +}