如何将较低或较高的值从AVX/AVX2(YMM)寄存器存储到内存中,就像SSE movlps/movhps一样


是否有

任何现有的指令可以将较低或较高的值从256位AVX/AVX2(YMM)寄存器存储到存储器地址,就像SSE指令movlps/movhps一样?

或者有没有其他方法来实现这一点?

任何帮助将不胜感激,谢谢!

将 low128 与 vmovdqu [rdi], xmm0 一起存储。

VEXTRACTI128 xmm1/m128, ymm2, 1存储高128。 也许你可以让编译器通过将内部提取的结果分配给内存引用来生成内存存储。

vextracti128 / f128需要 2 uops,即使在融合域 (Haswell) 中也是如此,因此 IDK 使其可编码为即时操作数 0 的意义是什么。 (直到 AVX512,当即时索引而不是movh变得相关时,因为他们不知道他们将用 AVX512 的 EVEX 替换 VEX)。 将 AVX2 与 xmm 注册混合以及将 AVX2 与 ymm 注册混合不会受到任何惩罚,因此您只需使用 xmm 版本的 128b 存储即可获得低 128,就像您可以通过引用 eax 而不是 rax 来获得 64b GP 注册的 low32 一样。

使用内部函数时转换东西可能会很烦人,所以幸运的是,编译器会将_mm256_extracti128_si256 (vec, 0)编译为相应 xmm reg 的vmovdqu。 但是如果你的编译器不这样做,如果你让它生成vmovdqu,你的代码会更快。 (如果地址对齐,movdqu的速度与vmovdqa一样快,就像非 mov AVX 内存访问一样。

最新更新