Почему INC и ADD 1 имеют разные характеристики?

Я много раз читал много раз, что вы должны делать XOR ax, ax, потому что это быстрее... или при программировании на C используйте counter ++ или counter + = 1, потому что они будут INC или ADD... Или что в Netburst Pentium 4 INC был медленнее ADD 1, поэтому компилятор должен был быть предупрежден о том, что ваша цель была Netburst, поэтому она переведет все var ++ в ADD 1...

Мой вопрос: почему INC и ADD имеют разные характеристики? Почему, например, INC утверждали, что на Netburst медленнее, чем ADD в других процессорах?

Ответ 1

Для архитектуры x86 INC обновляет подмножество кодов условий, тогда как ADD обновляет весь набор кодов условий. (Другие архитектуры имеют разные правила, поэтому это обсуждение может или не может применяться).

Таким образом, команда INC должна ждать других предыдущих инструкций, которые обновляют биты кода состояния, чтобы закончить, прежде чем он сможет изменить это предыдущее значение, чтобы получить окончательный результат кода условия.

ADD может генерировать коды кода конечного состояния без учета предыдущих значений кодов условий, поэтому нет необходимости ждать, пока предыдущие инструкции не закончат вычислять их значение кодов условий.

Следствие: вы можете выполнить ADD параллельно с множеством других инструкций, а INC - с меньшим количеством других инструкций. Таким образом, ADD работает быстрее на практике.

(Я считаю, что аналогичная проблема связана с работой с 8-битными регистрами (например, AL) в контексте полных регистров (например, EAX), поскольку обновление AL требует, чтобы первые обновления EAX завершались в первую очередь).

Я больше не использую INC или DEC в своем высокопроизводительном сборочном коде. Если вы не обладаете сверхчувствительностью к временам выполнения, то INC или DEC просто прекрасны и могут уменьшить размер вашего потока команд.

Ответ 2

Бит XOR ax, ax, я нахожу несколько лет устаревшим, и присвоение нуля теперь бьет его (так мне сказали).

бит C около counter++, а не counter+=1 - это несколько десятилетий устаревших. Определенно.

Простая причина для первого с сборкой заключается в том, что все инструкции будут переведены на какую-то операцию со стороны ЦП, и хотя дизайнеры всегда будут стараться сделать все как можно быстрее, они будут лучше работать с кем-то, чем с другими. Нетрудно представить, как INC может быть быстрее, поскольку он должен иметь дело только с одним регистром, хотя это сильно упрощает (но я мало знаю об этих вещах, поэтому чрезмерное упрощение - это все, что я могу сделать на этом часть).

C один, хотя, давно вздор. Если у нас есть определенный процессор, где INC превосходит ADD, почему разработчик компилятора не использовал INC вместо ADD, для counter++ и counter+=1? Составители делают много оптимизаций, и подобные изменения далеки от самых сложных.