AVX支持是否意味着支持BMI1?

时间:2017-06-29 14:07:49

标签: assembly x86 64-bit avx bmi

我有一些依赖AVX的代码 在相同的代码库中,我也使用TZCNT 后者是BMI1的一部分。我知道我可以使用CPUID测试这个指令,但我很懒,所以我实际上没有实现它。

要测试支持,我只需执行AVX指令。如果我得到#UD未定义的指令异常,我知道CPU不支持AVX 但是tzcnt向后兼容(种类)与bsf(或bsr - 我总是忘记哪个是哪个),因此不会触发异常。

如果我有AVX支持,这是否意味着BMI1支持?
为了记录,我现在正在测试的CPU上没有AVX2。

1 个答案:

答案 0 :(得分:3)

不,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早了两年 除此之外,tzcntbsf在标志方面具有不同的语义 如果您想强制#UD例外,则可以使用andn

来源:维基百科:BMIAVX

如果您想使用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,它通常也会支持。