【发布时间】:2011-10-27 12:43:03
【问题描述】:
我现在正在使用 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
}
}
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。
有人知道发生了什么吗?
提前谢谢你:)
【问题讨论】:
-
请注意,Visual Studio 不是编译器; Visual C++ 是实际的编译器; Visual Studio 是 IDE。 (因此我编辑了这个问题)
-
调试 + Windows + 寄存器。右键单击窗口并勾选 SSE2
标签: c++ visual-c++ assembly sse inline-assembly