首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在将高位设置为零的情况下将__m128i转换为__m256i?

如何在将高位设置为零的情况下将__m128i转换为__m256i?
EN

Stack Overflow用户
提问于 2020-02-05 18:48:36
回答 1查看 381关注 0票数 1

我想让VC++发出这样的代码:

代码语言:javascript
复制
vpxor     ymm0, ymm0, ymm0
vmovdqa   xmm0, xmm7

在人类语言中,我想要一个32字节的__m256i值,其中最低的16个字节来自另一个变量,最高的16个字节是零。等同于_mm256_castsi128_si256内部,只是我需要高128位为零,而不是未定义。

这是我尝试过的:

代码语言:javascript
复制
_mm256_setr_m128i( low, _mm_setzero_si128() )
_mm256_insertf128_si256( _mm256_setzero_si256(), low, 0 )

上面这两行代码都编译成vinsertf128,相对较慢,3-4个周期的延迟,比vmovdqa慢得多。VC++ 2017有什么解决方法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-05 19:17:51

首先,您不需要vpxor ymm0, ymm0, ymm0,因为vmovdqa xmm0, xmm7已经将目标ymm/zmm寄存器的高位置零。这与传统的movdqa指令不同,你不应该在AVX代码中使用它。

其次,特定指令的选择是编译器的责任。如果您的编译器生成低效代码,请考虑向编译器供应商报告错误。例如,gcc识别了这种内部模式,并生成optimal code

至于MSVC,由于在x86-64模式下不支持内联汇编程序,因此除了使用单独编译的汇编程序源代码之外,没有可靠的方法来确保特定的指令。您可能会发现一些生成所需代码的内部函数组合,但这将是不可靠的(并且可能会调用未定义的行为),并且可能会因编译器版本的不同而不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60074111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档