在使用Visual C++构建时,如何使用SSE(和SSE2,SSE3等)扩展?

Gré*_*ire 3 c++ assembly sse inline-assembly visual-c++

我现在正在使用visual studio中的SSE指令进行基本点积函数的小优化.

这是我的代码:(函数调用约定是cdecl):

float SSEDP4(const vect & vec1, const vect & vec2)
{
    __asm
    {
        // get addresses
        mov ecx, dword ptr[vec1]
        mov edx, dword ptr[vec2]
        // get the first vector
        movups xmm1, xmmword ptr[ecx]
        // get the second vector (must use movups, because data is not assured to be aligned to 16 bytes => TODO align data)
        movups xmm1, xmmword ptr[edx]
        // OP by OP multiply with second vector (by address)
        mulps xmm1, xmm2
        // add everything with horizontal add func (SSE3)
        haddps xmm1, xmm1
        // is one addition enough ?
        // try to extract, we'll see
        pextrd eax, xmm1, 03h
    }
}
Run Code Online (Sandbox Code Playgroud)

vect是一个简单的结构,包含4个单精度浮点数,非对齐到16个字节(这就是我使用movups和不使用的原因movaps)

vec1与初始化(1.0, 1.2, 1.4, 1.0),并vec2(2.0, 1.8, 1.6, 1.0)

一切编译得很好,但在执行时,我在两个XMM寄存器中得到0,因此在调试时,visual studio显示2个寄存器(MMX1和MMX2,有时是MMX2和MMX3),它们是64位寄存器,但没有XMM和一切都到0.

有人知道发生了什么吗?

先感谢您 :)

Bil*_*eal 6

有两种方法可以获得MSVC++上的SSE指令:

  1. 编译器内在函数 - > http://msdn.microsoft.com/en-us/library/t467de55.aspx
  2. 外部MASM文件.

内联汇编(如示例代码中所示)不再是合理的选项,因为在构建非32位x86系统时它不会编译.(例如,构建64位二进制文​​件将失败)

此外,汇编块会抑制大多数优化.这对你不好,因为即使你的功能也不会发生像内联这样简单的事情.内在函数以不会击败优化器的方式工作.

  • 我会回应Billy上面的评论,并强烈建议您尽可能使用内在函数.请注意,Win8将在ARM芯片上提供,因此如果您希望代码能够通过简单的重新编译在ARM上运行,那么请尽可能避免组装. (2认同)