我想让VC++发出这样的代码:
vpxor ymm0, ymm0, ymm0
vmovdqa xmm0, xmm7在人类语言中,我想要一个32字节的__m256i值,其中最低的16个字节来自另一个变量,最高的16个字节是零。等同于_mm256_castsi128_si256内部,只是我需要高128位为零,而不是未定义。
这是我尝试过的:
_mm256_setr_m128i( low, _mm_setzero_si128() )
_mm256_insertf128_si256( _mm256_setzero_si256(), low, 0 )上面这两行代码都编译成vinsertf128,相对较慢,3-4个周期的延迟,比vmovdqa慢得多。VC++ 2017有什么解决方法吗?
发布于 2020-02-05 19:17:51
首先,您不需要vpxor ymm0, ymm0, ymm0,因为vmovdqa xmm0, xmm7已经将目标ymm/zmm寄存器的高位置零。这与传统的movdqa指令不同,你不应该在AVX代码中使用它。
其次,特定指令的选择是编译器的责任。如果您的编译器生成低效代码,请考虑向编译器供应商报告错误。例如,gcc识别了这种内部模式,并生成optimal code。
至于MSVC,由于在x86-64模式下不支持内联汇编程序,因此除了使用单独编译的汇编程序源代码之外,没有可靠的方法来确保特定的指令。您可能会发现一些生成所需代码的内部函数组合,但这将是不可靠的(并且可能会调用未定义的行为),并且可能会因编译器版本的不同而不同。
https://stackoverflow.com/questions/60074111
复制相似问题