【发布时间】:2017-03-30 03:47:30
【问题描述】:
在 SIMD 寄存器中加载和存储生成目的寄存器的最佳方法是什么?到目前为止,我一直在使用堆栈作为临时工具。例如,
mov [rsp + 0x00], r8
mov [rsp + 0x08], r9
mov [rsp + 0x10], r10
mov [rsp + 0x18], r11
vmovdqa ymm0, [rsp] ; stack is properly aligned first.
我认为没有任何指令可以直接(或其他方向)执行此操作,因为这意味着一条指令有五个操作数。但是,上面的代码对我来说似乎很愚蠢。有更好的方法吗?我只能想到一种选择,使用pinsrd 和相关说明。但这似乎并没有好转。
动机是,有时在 AVX2 中执行某些操作会更快,而在其他通用寄存器中执行某些操作会更快。例如,假设在一小段代码中,有四个 64 位无符号整数,我需要来自 BMI2 的四个xor,两个mulx。使用vpxor 执行xor 会更快,但是mulx 没有AVX2 等效项。 vpxor vs 4 xor 的任何增益性能都会因打包和解包过程而丢失。
【问题讨论】:
标签: assembly x86 simd sse2 avx2