[英]Initialize __m256i from 64 high or low bits of four __m128i variables
[英]How to cast __m128i to __m256i while setting upper bits to zero?
我希望 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 的任何解決方法?
首先,您不需要vpxor ymm0, ymm0, ymm0
因為vmovdqa xmm0, xmm7
已經將目標ymm
/ zmm
寄存器的ymm
zmm
。 這與傳統的movdqa
指令不同,您無論如何都不應該在 AVX 代碼中使用它。
其次,特定指令的選擇是編譯器的責任。 如果您的編譯器生成低效代碼,請考慮向編譯器供應商報告錯誤。 例如,gcc 識別這種內在函數模式並生成最佳代碼。
對於 MSVC,鑒於 x86-64 模式下不支持內聯匯編程序,因此除了使用單獨編譯的匯編程序源之外,沒有可靠的方法來確保特定指令。 您可能會發現一些生成所需代碼的內在函數組合,但這將是不可靠的(並且可能會調用未定義的行為),並且可能會從一個編譯器版本更改為另一個版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.