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

X86 如何像SSE movlps/movhps那样将AVX/AVX2(YMM)寄存器中的较低或较高值存储到内存中?,x86,sse,simd,avx,avx2,X86,Sse,Simd,Avx,Avx2,是否有任何现有指令可以像SSE指令movlps/movhps一样,将256位AVX/AVX2(YMM)寄存器中的较低或较高值存储到内存地址 或者有没有其他方法来实现这一点 任何帮助都将不胜感激,谢谢 使用vmovdqu[rdi],xmm0存储low128 使用vextract128 xmm1/m128,ymm2,1存储high128。通过将提取内在结果分配给内存引用,可能可以让编译器生成内存存储 vextract128/f128即使在融合域(Haswell)中也需要2个UOP,因此请确定立即数为

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

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


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

使用
vmovdqu[rdi],xmm0存储low128

使用
vextract128 xmm1/m128,ymm2,1
存储high128。通过将提取内在结果分配给内存引用,可能可以让编译器生成内存存储

vextract128/f128
即使在融合域(Haswell)中也需要2个UOP,因此请确定立即数为0的操作数可对其进行编码的意义。(直到AVX512,当一个即时索引而不是一个
movh
变得相关时,因为他们不知道他们将用EVEX替换AVX512的VEX)。混合使用AVX2和xmm reg以及AVX2和ymm reg不会有任何惩罚,因此您可以使用xmm版本的128b存储来获得低128,就像您可以通过引用
eax
而不是
rax
来获得64b GP reg的低32一样


在使用内部函数时强制转换东西可能很烦人,因此如果运气好的话,编译器会将
\u mm256\u extracti128\u si256(vec,0)
编译成相应xmm reg的
vmovdqu
。但是如果编译器不这样做,那么如果让代码生成
vmovdqu
,代码就会更快。(
movdqu
vmovdqa
一样快,如果地址对齐,就像非mov-AVX内存访问一样。)

您可以使用。这些将把他们拉入另一个登记册。因此,您仍然需要一个单独的加载/存储指令。不过也就是说,这和使用128位置换来交换两半没有什么不同。谢谢@Mystical!我发现AVX2 vextractf128可能适用于此。另一种解决方案是
vmovaps XMMWORD PTR[rdi],xmm0
用于下部128。GCC/clang编译
\u mm\u store\u ps(ptr,\u mm256\u castps256\u ps128(v))
为Haswell及以上版本编译。@plasmacel:没有CPU对存储有旁路延迟惩罚,因此
movups
movaps
在传统SSE(非VEX)编码中保存一个字节的机器代码。不过,比起
vmovdqa
,更倾向于
vmovaps
是没有意义的,但也没有什么坏处,所以我想这会让gcc的代码更容易使用
…ps
存储。