"Оптимизация для PENTIUM процессора" - читать интересную книгу автора

MOV EDX,EAX
SAR EDX,31
XOR EAX,EDX
SUB EAX,EDX

Флаг переноса очень полезен, для такого рода трюков.
Устанавливается если величина ноль: CMP [значение], 1
Устанавливается, если величина не ноль: XOR EAX, EAX / CMP EAX, [значение]
Увеличение счетчика, если перенос: ADC EAX, 0
Установка бита каждый раз, когда перенос: RCL EAX, 1
Создает битовую маску, если перенос: SBB, EAX, EAX

Этот пример находит минимум из двух без значных чисел: если (bSUB EBX,EAX
SBB ECX,ECX
AND ECX,EBX
ADD EAX,ECX

Этот пример выбирает между двумя числами: если (a не 0), то a=b иначе a = c;
CMP EAX,1
SBB EAX,EAX
AND ECX,EAX
XOR EAX,-1
AND EAX,EBX
OR EAX,ECX

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

На Pentium Pro вы можете использовать инструкции условного перемещения для
того, что бы избавиться от лишнего ветвления.


13. ПРЕФИКСЫ
============
Инструкция с одним или более префиксами не сможет выполниться в V-трубе
(смотри раздел 8.7), кроме того требуется один такт, для декодирования
каждого префикса, за исключением 0Fh на Pentium MMX и Pentium Pro.

Префиксы адреса, могут быть анулированны использованием 32 битного режима.
Сегментные префиксы могут быть анулированны в 32 битном режиме, использованием
модели памяти FLAT.
Префиксы размера операнда могут быть анулированны в 32 битном режиме, если вы
будете пользоваться только 8 или 32 битными числами.

Там, где без префиксов не обойтись, их декодирование может быть замаскированно
если предыдущая инструкция исполнялась более одного такта. Для Pentium без MMX
существует правило - любая инструкция, исполняющаяся N тактов (не