如何将AVX/AVX2(YMM)寄存器中较低或较高的值存储到SSE movlps/movhps等内存中?

Sea*_*ang 6 x86 sse simd avx avx2

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

或者还有其他方法可以实现吗?

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

Pet*_*des 5

存放low128 vmovdqu [rdi], xmm0.

存放high128 VEXTRACTI128 xmm1/m128, ymm2, 1.也许你可以通过将内在提取的内部结果赋给内存引用来获得编译器来生成内存存储.

vextracti128 / f128即使在融合域(Haswell)中也需要2个uop,所以IDK使用0的立即操作数来编码它的意义是什么.(直到AVX512,当一个直接索引而不是一个movh变得相关时,因为他们不知道他们将用EVEX取代VX for AVX512).将AVX2与xmm regs和AVX2与ymm regs混合没有任何代价,因此您可以使用xmm版本的128b存储来获得低128,就像您可以通过引用eax而不是获得64b GP ​​reg的低32 rax.

使用内在函数时,使用内置函数可能很烦人,所以运气好的话,编译器会编译_mm256_extracti128_si256 (vec, 0)vmovdqu相应的xmm reg.但是如果您的编译器没有,那么如果您生成代码,代码将会更快vmovdqu.(movdqu就像vmovdqa地址对齐一样快,就像非mov AVX内存访问一样.)