Assembly _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); .DATA Red db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X

Assembly _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); .DATA Red db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X,assembly,x86-64,sse,simd,Assembly,X86 64,Sse,Simd,其中RedForAll在my函数的参数中给出: void CppSIMDFunction(unsigned char *src, short RedForAll, short GreenForAll, short BlueForAll) 我考虑过这样分配内存: XXX_R0 = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RedForAll); .DATA Red db 0, 0, 0, 0, 0, 0, 0, 0, 0

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

void CppSIMDFunction(unsigned char *src, short RedForAll, short GreenForAll, short BlueForAll)
我考虑过这样分配内存:

XXX_R0 = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RedForAll);
.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

您正在为x86编程吗?请注意,x86没有
ldr
指令,因此我不太确定您需要什么。谢谢您的回复,它是x64。同时,我发现了一些关于VPB的东西,但我不知道如何正确使用它。不幸的是,我被迫做这个项目,之前没有任何实践练习,所以我完全是汇编方面的新手。
vpbroadcastb
broadcasts,它不会加载一个字节,并用零填充其余的字节,因此它与您的原始代码不等价。无论如何,组装解决方案取决于
RedForAll
的来源。它在登记簿里吗?记忆?(如果它是一个函数参数,则取决于调用约定,本问题未指定该约定)请注意,
\u mm\u set\u xxx()
内部函数以最高的第一顺序获取其参数。但是
db
以最低的地址顺序排列。此外,如果您希望将高位元素归零,请使用
movd
movq
加载,而不是
movdqa
。您刚才是否查看了编译器为该内部元素生成的内容?例如:(根据上下文或目标体系结构,其他结构可能更好)