已经有 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/