相当于 _mm_set_epi8 的汇编,除最后一个参数外的所有参数均为零

标签 assembly x86-64 sse simd

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

关于相当于 _mm_set_epi8 的汇编,除最后一个参数外的所有参数均为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59491901/

相关文章:

assembly - 不知道如何一次打印整个日历

algorithm - 最快的Cortex M0+ Thumb 32x32=64乘法函数?

c - 如何在 Linux 中击败核心 i3/i7 中的硬件预取器

linux - ARM汇编 "retne"指令

macos - Wine64 是如何应对 macOS 的?

assembly - Intel 64、rsi 和 rdi 寄存器

c++ - 反汇编 C++ 中全局变量的 .rodata 部分 (objdump -D)

c++ - 任何种子在同一字符串上的CRC32哈希冲突

c - 这种悲伤教导的奇怪行为的原因是什么?

c++ - 使用英特尔 AVX 通过掩码改组