2012-01-30 12 views

Odpowiedz

6

z gcc można po prostu użyć _mm_set_pi64x:

#include <mmintrin.h> 

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

pamiętać, że nie wszystkie kompilatory mają _mm_set_pi64x zdefiniowane w mmintrin.h. Dla gcc jest zdefiniowana następująco:

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

co sugeruje, że prawdopodobnie można po prostu użyć obsady jeśli wolisz, na przykład

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

W przeciwnym razie, jeśli utkniesz ze zbyt wybredna kompilator takich jak Visual C/C++, w ostateczności można po prostu wykorzystać do unii i zaimplementować własną wewnętrzną:

#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 

Należy zauważyć, że ściśle mówiąc jest to UB, ponieważ piszemy do jednego wariantu związku i czytając od innego, ale powinno działać w tym przypadku.

+0

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

+0

Zobacz "mmintrin.h" –

+0

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