gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:02:18 25 4
gpt4 key购买 nike

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

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

如有任何帮助,我们将不胜感激,谢谢!

最佳答案

使用vmovdqu [rdi], xmm0存储low128。

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

vextracti128/f128 即使在融合域 (Haswell) 中也需要 2 uop,所以我不知道用立即操作数 0 对其进行编码的意义是什么。 (直到 AVX512,当立即索引而不是 movh 变得相关时,因为他们不知道他们将用 EVEX 替换 AVX512 的 VEX)。将 AVX2 与 xmm regs 以及 AVX2 与 ymm regs 混合不会造成任何损失,因此您可以使用 xmm 版本的 128b 存储来获取 low 128,就像您可以通过引用 来获取 64b GP ​​regs 的 low32 一样eax 而不是 rax

使用内部函数时进行强制转换可能很烦人,因此幸运的话,编译器会将 _mm256_extracti128_si256 (vec, 0) 编译为相应 xmm reg 的 vmovdqu。但如果您的编译器不这样做,那么如果您让它生成 vmovdqu,您的代码将会更快。 (如果地址对齐,movdquvmovdqa 一样快,就像非 mov AVX 内存访问一样。)

关于x86 - 如何像 SSE movlps/movhps 一样将 AVX/AVX2(YMM) 寄存器中的较低或较高值存储到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com