不,AVX支持並不意味着支持BMI1。
請參閱下表爲詳細信息:
Intel AMD Year
---------------------------------------------------
AVX Sandy Bridge Bulldozer 2011
---------------------------------------------------
BMI1 Haswell Piledriver/Jaguar 2013
---------------------------------------------------
ABM Barcelona 2007
Haswell 2013
---------------------------------------------------
AVX2 Haswell 2013
Carrizo 2015
Ryzen 2017
---------------------------------------------------
BMI2 Haswell 2013
Excavator 2015
Ryzen 2017
大多數處理器支持,但AVX兩年早BMI1。
除此之外,tzcnt
和bsf
關於標誌具有不同的語義。
如果您想強制執行#UD
例外,則可以使用andn
。
來源:維基百科:BMI,AVX
如果你想使用CPUID:
BMI1 -> CPUID.(EAX=07H, ECX=0H):EBX.BMI1[bit 3]
(ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT)
BMI2 -> CPUID.(EAX=07H, ECX=0H):EBX.BMI2[bit 8]
(BZHI, MULX, PDEP, PEXT, RORX, SARX, SHLX, SHRX)
LZCNT -> CPUID.(EAX=80000001H) ECX.LZCNT[bit 5]
POPCNT -> CPUID.(EAX=01H) :ECX.POPCNT [Bit 23]
請注意,即使CPUID指示(英特爾)處理器不支持popcnt
經常做。
即使您不想測試BMI支持,當您不關心input = 0的行爲時,通常應該使用'tzcnt'('rep bsf')。 'tzcnt'比AMD CPU上的'bsf'快很多。在Intel Skylake(以及後續版本)上,它避免了對'bsf'具有的只寫目標寄存器的錯誤依賴。 ('popcnt'在SKL上仍然存在虛假dep,就像早期Intel CPU上的lz/tzcnt一樣。) –