Разница между «или eax, eax» и «test eax, eax» [дубликат]
На этот вопрос уже есть ответ:
Проверьте, равен ли регистр нулю с CMP reg, 0 против OR reg, reg? 2 ответаКакая разница междуor eax,eax
а такжеtest eax,eax
? Я видел, как разные компиляторы производят оба для одного и того же сравнения, и что касается документации, они делают одно и то же, поэтому мне интересно, почему они не все используютtest eax,eax
. Думая об этомand eax,eax
будет устанавливать флаги таким же образом, как и я, но я не видел их ни в freepascal, ни в delphi, ни в msVC ++.
Я скомпилировал некоторые блоки asm в delphi и проверил исходный код на ассемблере. Все 3 формы имеют одинаковую длину в кодах операций, а также проверили производительность Intel PDF и говорят, что они имеют одинаковую задержку и пропускную способность.
Редактировать
Вопрос конкретно о разнице между конкретными случаямиtest eax,eax
, or eax,eax
а такжеand eax,eax
. Все 3 дают абсолютно идентичные результаты для регистров, флагов, длины кода операции, задержки, пропускной способности. И все же для проверки, если 0, если не ноль, или если подписано, некоторые компиляторы будут использоватьtest eax,eax
а некоторые используютor eax,eax
и мне было интересно, почему они не все используютtest eax,eax
поскольку это делает код немного более понятным.
Edit2:
Для справки, я дома и имею только MSvc ++ и Delphi, но тестирую переменную, если ноль, msvc ++ делаетtest eax,eax
, а Делфиor eax,eax
.