assembly - 如何将 128 位立即数移至 XMM 寄存器

标签 assembly x86 sse simd

已经有 a question对此,但它被关闭为“模棱两可”,所以我正在打开一个新的 - 我找到了答案,也许它也会对其他人有所帮助。

问题是:如何编写一系列汇编代码来用 128 位立即数(常量)值初始化 XMM 寄存器?

最佳答案

您可以这样做,只需一条 movaps 指令:

.section .rodata    # put your constants in the read-only data section
.p2align 4          # align to 16 = 1<<4
LC0:
        .long   1082130432
        .long   1077936128
        .long   1073741824
        .long   1065353216

.text
foo:
        movaps  LC0(%rip), %xmm0

通过数据加载来加载它通常比将其嵌入指令流更好,特别是因为它需要多少条指令。对于无法通过几次移位从全 1 生成的任意常量,CPU 需要执行几个额外的微指令。

如果更容易,您可以将常量放在即时编译的函数之前或之后,而不是放在单独的部分中。但由于 CPU 已拆分 L1d/L1i 缓存和 TLB,因此通常最好将常量与指令分开分组。

如果常数的两半相同,则可以使用 SSE3 广播加载它
movddup (m64),%xmm0

关于assembly - 如何将 128 位立即数移至 XMM 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654099/

相关文章:

c++ - 如何以编程方式模拟在 64 位窗口中调用的 DllMain?

gcc - 在 GCC 风格的扩展内联汇编中,是否可以输出 "virtualized" boolean 值,例如携带标志?

x86 - 为非核心频率和缓存分配技术设置封装范围的 MSR

multithreading - pthreads v。SSE弱内存排序

performance - 我如何从预取内在函数中获得可衡量的好处?

c - ARM 程序集 - 是否保证寄存器足够大以容纳指针?

gcc - 为什么 ELF 目标文件包含字符串文字和 stdlib 函数的虚拟地址?

c - 多核时钟计数器一致性

assembly - 程序员 "Invisible"寄存器怎么样?

c - 哪个更快?