_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
我正在写一个通过大学科目的程序,应该比较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