首页 > 解决方案 > _mm_set_epi8 的汇编等效项,除最后一个参数外,所有参数均为零

问题描述

我正在编写一个通过大学科目的程序,它应该比较 C++ 和 SIMD 函数和汇编函数的效率。目前,我设法将第一个做得很好,但是在第二个过程中,我发现了一个问题:

在我的 C++ 函数中,我有一行这样的代码:

XXX_R0 = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RedForAll);

其中 RedForAll 在我的函数的参数中给出:

void CppSIMDFunction(unsigned char *src, short RedForAll, short GreenForAll, short BlueForAll)

我想过像这样分配内存:

.DATA
Red db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X

然后以某种方式将这个 RedForAll 保存在标有 X 的位置,但是该怎么做呢?

恐怕movdqa在这种情况下不会有用,因为我需要将值从寄存器加载到特定位置的内存中,那么如何实现呢?

标签: assemblyx86-64ssesimd

解决方案


使用movd(当使用 SSE 时)或vmovd在适当的零扩展之后:

; assuming RedForAll is in cl
movzx eax, cl     ; zero extend al into eax
movd xmm0, eax    ; copy eax into xmm0 and clear the upper 96 bits

推荐阅读