_ mm_set_epi8的等效于汇编,除最后一个参数外,所有参数都为零

问题描述 投票:2回答:1

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

assembly x86-64 sse simd
1个回答
3
投票

[适当使用零扩展后使用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
© www.soinside.com 2019 - 2024. All rights reserved.