c - 如何在 MS Visual Studio 中使用 SSE 内在函数?

标签 c visual-studio-2005 sse inline-assembly intrinsics

我正在尝试使用 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/

相关文章:

c - 如何从C中的网页下载所有图像?

将字符串复制到数组中?

python - 可以围绕现有的大型C库自动生成Cython绑定(bind)吗?

c++ - LNK2019/2001 : unresolved external symbol

c++ - HeapAlloc 间歇性失败

c# - 为 Word 插件创建对话框

无法将 float 组读入 __m128

c - 为什么线程局部堆内存在线程退出时没有被释放?

algorithm - SIMD 优化难题

c - SSE 代码运行速度提高 30%,但在使用时显示 CPU 增加超过 20%