Visual studio 如何转换';长-长';(或_int64)至_m64

Visual studio 如何转换';长-长';(或_int64)至_m64,visual-studio,visual-c++,sse,simd,mmx,Visual Studio,Visual C++,Sse,Simd,Mmx,将\uuuu int64值转换为\uuuu m64值以用于SSE的正确方法是什么?对于gcc,您只需使用\u mm\u set\u pi64x: #include <mmintrin.h> __int64 i = 0x123456LL; __m64 v = _mm_set_pi64x(i); 这表明,如果你愿意,你可能只需要使用演员阵容 __int64 i = 0x123456LL; __m64 v = (__m64)i; 如果不能做到这一点,那么如果您一直使用过于挑剔的编

\uuuu int64
值转换为
\uuuu m64
值以用于SSE的正确方法是什么?

对于gcc,您只需使用
\u mm\u set\u pi64x

#include <mmintrin.h>

__int64 i = 0x123456LL; 
__m64 v = _mm_set_pi64x(i);
这表明,如果你愿意,你可能只需要使用演员阵容

__int64 i = 0x123456LL; 
__m64 v = (__m64)i;
如果不能做到这一点,那么如果您一直使用过于挑剔的编译器(如Visual C/C++),作为最后的手段,您可以使用union并实现自己的固有功能:

#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,因为我们正在向联合的一个变体写入数据,并从另一个变体读取数据,但在本例中它应该可以工作。

您从何处获得此版本的mmintrin.h?你在用什么编译器?对于当前版本的gcc(4.x)
\uum-mm\u-set\u-pi64x
是在mmintrin.h中定义的。我正在使用Visual Studio 2010。。。我是从
C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h
获得的。有点困惑……如果您使用的是非标准编译器,您可能应该适当地标记您的问题。请参阅上面更新的答案,以获得其他建议。我在国际商会的经验好坏参半。尽管它“通常”编译的代码速度更快,但我已经看到过无数这样的案例:它会脑死亡,并被MSVC打败(以很大的优势)。@PaulR根据我的经验:在VS2010之前,ICC在我编写的几乎所有SSE代码上都会击败MSVC。从VS2010开始,我不得不承认,MSVC在我所做过的案件中,超过一半的案件超过了ICC。ICC优化失败的一个臭名昭著的例子在我的网站上。MSVC(以及具有正确选项的GCC)获得了最佳性能。ICC连70%都没拿到。对于谷歌,有人能解释一下
\uuuu int64
\uuuu m64
?:-)
#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