Qual è il modo corretto per convertire un valore __int64
in un valore __m64
da utilizzare con SSE?Come convertire 'long long' (o __int64) in __m64
6
A
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.
Eh? https://www.google.com/search?q=_mm_set_pi64 – Mehrdad
Dai un'occhiata a 'mmintrin.h' –
http://pastebin.com/4bwAbbLZ? – Mehrdad