是否有任何现有指令可以将 256 位 AVX/AVX2(YMM) 寄存器中的较低或较高值存储到内存地址,就像 SSE 指令 movlps/movhps 一样?
或者还有其他方法可以实现吗?
任何帮助将不胜感激,谢谢!
将 low128 存储为vmovdqu [rdi], xmm0
.
将 high128 存储为VEXTRACTI128 xmm1/m128, ymm2, 1
. 可能您可以通过将提取的结果分配给内存引用来让编译器生成对内存的存储。
vextracti128 / f128
即使在融合域(Haswell)中也需要 2 微指令,所以 IDK 使用立即操作数 0 对其进行编码的意义是什么。(直到 AVX512,当立即索引而不是 amovh
变得相关时,因为他们不知道他们将用 EVEX 替换 VEX 用于 AVX512)。将 AVX2 与 xmm regs 和 AVX2 与 ymm regs 混合没有任何惩罚,因此您只需使用 xmm 版本的 128b 存储来获得低 128,就像您可以通过引用eax
而不是rax
.
使用内在函数时转换东西可能很烦人,所以幸运的是编译器将编译_mm256_extracti128_si256 (vec, 0)
为vmovdqu
相应的 xmm reg。但是如果你的编译器没有,如果你让它生成,你的代码会更快vmovdqu
。(就像地址对齐movdqu
一样快vmovdqa
,就像非 mov AVX 内存访问一样。)