[Bug tree-optimization/18503] New: _mm_move_ss SSE intrinsic causes erroneous

torgeihe at stud dot ntnu dot no gcc-bugzilla@gcc.gnu.org
Mon Nov 15 15:39:00 GMT 2004


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
           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=18503



More information about the Gcc-bugs mailing list