SSE2 intrinsics: gcc46 vs. clang contradiction

Dimitry Andric dim at FreeBSD.org
Fri Nov 1 17:07:47 PDT 2013


On 01 Nov 2013, at 22:45, C. Bergström <cbergstrom at pathscale.com> wrote:
> On 11/ 1/13 10:43 PM, Alexey Dokuchaev wrote:
>> On Fri, Nov 01, 2013 at 07:46:45PM +0700, Alexey Dokuchaev wrote:
>>> What adds to confusion, in their manual [1] Intel spells them differently
>>> themselves: first, in the table, it says:
>>> 
>>>   _mm_movpi64_epi64		Move		MOVDQ2Q
>>>               ^^^^^
>>> 
>>> Then later, when they describe what it does, it says:
>>> 
>>>   __m128i _mm_movpi64_pi64(__m64 a)
>>>                       ^^^^
>>>   Moves the 64 bits of a to the lower 64 bits of the result, zeroing the
>>>   upper bits.
>> Microsoft (http://msdn.microsoft.com/en-us/library/has3d153(v=vs.90).aspx)
>> defines these two:
>> 
>>   _mm_movepi64_pi64		MOVDQ2Q			Move
>>   _mm_movpi64_epi64		MOVQ2DQ			Move
>> 
>> That is:
>> 
>>   __m64 _mm_movepi64_pi64 (__m128i a);
>>   MOVDQ2Q
>>   r0 := a0 ;
>> 
>>   __m128i _mm_movpi64_epi64 (__m64 a);
>>   MOVDQ2Q
>>   r0 := a0 ; r1 := 0X0 ;
>> 
>> Cf. Intel's:
>> 
>>   _mm_movepi64_pi64		Move			MOVDQ2Q
>>   _mm_movpi64_epi64		Move			MOVDQ2Q
>> 
>>   __m64 _mm_movepi64_pi64(__m128i a)
>>   Returns the lower 64 bits of a as an __m64 type:	R0 := a0
>> 
>>   __m128i _mm_movpi64_pi64(__m64 a)
>>   Moves the 64 bits of a to the lower 64 bits
>>   of the result, zeroing the upper bits:		R0 := a0, R1 = 0X0
>> 
>> Assuming that both documents correctly assign instructions to function
>> names (bonus clue: it also makes them symmetrical), then _mm_movpi64_pi64
>> is indeed a typo and Clang's header is wrong, while GCC's is correct: it
>> should read _mm_movpi64_epi64(), not _mm_movpi64_pi64().
> Why isn't this being asked on the clang or llvm mailing list? Wouldn't this impact upstream as well?

Indeed, so redirecting to the cfe-commits list.  It looks like this incorrect function name has been in emmintrin.h since clang r61443 (by andersca).  Basically, we need the typo fixed as follows:

Index: tools/clang/lib/Headers/emmintrin.h
===================================================================
--- tools/clang/lib/Headers/emmintrin.h (revision 193039)
+++ tools/clang/lib/Headers/emmintrin.h (working copy)
@@ -1366,7 +1366,7 @@ _mm_movepi64_pi64(__m128i __a)
 }

 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
-_mm_movpi64_pi64(__m64 __a)
+_mm_movpi64_epi64(__m64 __a)
 {
   return (__m128i){ (long long)__a, 0 };
 }

Is this OK?

-Dimitry

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 203 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131102/c88d1abe/attachment.sig>


More information about the cfe-commits mailing list