При сравнении чего-то я измерил гораздо более низкую пропускную способность, чем я вычислил, и я сузился до инструкции LZCNT (это также происходит с TZCNT), как показано в следующих тестах:
xor ecx, ecx
_benchloop:
lzcnt eax, edx
add ecx, 1
jnz _benchloop
и
xor ecx, ecx
_benchloop:
xor eax, eax ; this shouldn't help, but it does
lzcnt eax, edx
add ecx, 1
jnz _benchloop
Вторая версия намного быстрее. Этого не должно быть. Нет причин, по которым LZCNT должен иметь входную зависимость от ее выхода. В отличие от BSR/BSF, инструкции xZCNT всегда перезаписывают свой вывод.
Я запускаю это на 4770K, поэтому LZCNT и TZCNT не выполняются как BSR/BSF.
Что здесь происходит?