_mm_set_epi8 的汇编等价物,除了最后一个参数之外的所有参数都为零

Assembly equivalent of _mm_set_epi8 with zeros for all but the last parameter

我正在写一个通过大学科目的程序,应该比较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在这种情况下没有用,因为我需要在特定位置从寄存器加载值到内存,那么如何实现呢?

使用 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