2012-01-30 14 views

risposta

6

con GCC si può semplicemente utilizzare _mm_set_pi64x:

#include <mmintrin.h> 

__int64 i = 0x123456LL; 
__m64 v = _mm_set_pi64x(i); 

Nota che non tutti i compilatori hanno _mm_set_pi64x definiti in mmintrin.h. Per gcc è definito in questo modo:

extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) 
_mm_set_pi64x (long long __i) 
{ 
    return (__m64) __i; 
} 

che suggerisce che si potrebbe forse basta usare un cast, se si preferisce, per esempio

__int64 i = 0x123456LL; 
__m64 v = (__m64)i; 

In mancanza di questo, se sei bloccato con un compilatore eccessivamente esigenti come ad esempio Visual C/C++, come ultima risorsa si può semplicemente utilizzare un sindacato e implementare una propria intrinseca:

#ifdef _MSC_VER // if Visual C/C++ 
__inline __m64 _mm_set_pi64x (const __int64 i) { 
    union { 
     __int64 i; 
     __m64 v; 
    } u; 

    u.i = i; 
    return u.v; 
} 
#endif 

Nota che in senso stretto si tratta di UB, dal momento che stiamo scrivendo una variante di un sindacato e la lettura da un altro, ma dovrebbe funzionare in questo caso.

+0

Eh? https://www.google.com/search?q=_mm_set_pi64 – Mehrdad

+0

Dai un'occhiata a 'mmintrin.h' –

+0

http://pastebin.com/4bwAbbLZ? – Mehrdad