Compiling the following function on x86 with options -O -fomit-frame-pointer
-msse -S seems to result in erroneous code.

#include <xmmintrin.h>

__m128 bug(__m128 a, __m128 b) {
        __m128 c = _mm_sub_ps(a, b);
        return _mm_move_ss(c, a);
}

This is what the function in the resulting .s file looke like:

        .file   "gccbug.c"
        .text
        .align 2
.globl __Z3bugU8__vectorfS_
        .def    __Z3bugU8__vectorfS_;   .scl    2;      .type   32;     .endef
__Z3bugU8__vectorfS_:
        subss   %xmm1, %xmm0
        ret

According to
http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/comm1030.htm
_mm_move_ss passes the upper three values through, but the code generated
doesn't even calculate those values. I had expected the code to look more like 
this:

        movaps  %xmm0, %xmm2
        subps   %xmm1, %xmm0
        movss   %xmm2, %xmm0

Hope that turned out right, I'm not experienced with AT&T syntax. Is this a bug,
or have I misunderstood something? I get similar results with 3.3.4.

Torgeir

-- 
           Summary: _mm_move_ss SSE intrinsic causes erroneous code
           Product: gcc
           Version: 3.4.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: torgeihe at stud dot ntnu dot no
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18504

Reply via email to