Jaki jest właściwy sposób przekonwertowania wartości __int64
na wartość __m64
do użycia z SSE?Jak przekonwertować 'long long' (lub __int64) na __m64
6
A
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.
Huh? https://www.google.com/search?q=_mm_set_pi64 – Mehrdad
Zobacz "mmintrin.h" –
http://pastebin.com/4bwAbbLZ? – Mehrdad