С gcc вы можете просто использовать _mm_set_pi64x
:
#include <mmintrin.h>
__int64 i = 0x123456LL;
__m64 v = _mm_set_pi64x(i);
Обратите внимание, что не во всех компиляторах _mm_set_pi64x
определено в mmintrin.h
.Для gcc это определено так:
extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_set_pi64x (long long __i)
{
return (__m64) __i;
}
, что предполагает, что вы, возможно, можете просто использовать приведение, если хотите, например:
__int64 i = 0x123456LL;
__m64 v = (__m64)i;
Если вы не справитесь, если вы застряли счрезмерно разборчивый компилятор, такой как Visual C / C ++, в качестве последнего средства вы можете просто использовать объединение и реализовать свою собственную внутреннюю сущность:
#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
Обратите внимание, что строго говоря, это UB, так как мы пишемк одному варианту объединения и чтения из другого, но в этом случае это должно сработать.