我正在尝试使用 SSE2 指令制作一些优化的代码。目前,我用内联汇编编写它,如下所示:
...
__m128 zero = {0};
__asm {
...
LINE_LOOP_1:
MOVQ xmm0, QWORD PTR [eax] ; no problem
PUNPCKLBW xmm0, zero ; PROBLEM IS HERE
...
LOOP LINE_LOOP_1
}
它工作得很好,但我想使用内在函数重写它,这样会更容易更改(我的计算版本略有不同,我想对其进行优化)。
但是,我无法弄清楚要使用哪些内在函数。我找到的任何文档都列出了大约一半的 SSE2 指令,看起来另一半不能作为内在函数使用! MS 似乎不太可能中途放弃 SSE 的实现。
那么,我可以使用哪个内在函数来生成例如 PUNPCKLBW
指令?
我使用 MS Visual Studio 2005。
附注一些 MSDN documentation建议使用 _mm_unpacklo_pi8
,但它不起作用:
#include "xmmintrin.h"
int main()
{
__m128 x = {0}, y = {0};
x = _mm_unpacklo_pi8(x, y);
}
这会产生编译错误:
error C2664: '_m_punpcklbw' : cannot convert parameter 1 from '_m128' to '_m64'
最佳答案
您必须使用_mm_unpacklo_epi8
see here .
epi
postifix 内在函数用于 SSE 寄存器,pi
用于 MMX 寄存器。
关于c - 如何在 MS Visual Studio 中使用 SSE 内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10828915/