如何将'long long'(或__int64)转换为__m64

时间:2012-01-30 08:46:11

标签: visual-studio visual-c++ sse simd mmx

__int64值转换为__m64值以与SSE一起使用的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

使用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,因为我们正在写一个union的一个变体并从另一个变量中读取,但它应该在这个实例中起作用。