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

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

17.3 XCHG
---------
Сочетание XCHG регистр,память - опасно, т.к. по умолчанию эта инструкция
имеет префикс LOCK, для предотвращения использования кеша. Следовательно эта
инструкция поглощает много времени и от нее надо избавляться.

17.4 сдвиги через перенос
-------------------------
RCL и RCR, с количеством сдвигаемых байт больше чем один очень медленные и
от них надо избавляться.

17.5 строковые инструкции
-------------------------
Строковые инструкции без префикса повторения тоже медленные и должны
заменяться более простыми инструкциями. То же относиться к LOOP и JECXZ.

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

REP MOVSD - является самым быстрым способом перемещать блоки данных, когда
приемник находится в кеше. Для альтернативы см. раздел 19.

REP STOSD - оптимален, когда приемник в кеше.

REP LOADS, REP SCAS и REP CMPS - не оптимальны и могут быть замещены циклами.
См. раздел 16, пример 10 как альтернативу REP SCASB.

17.6 битовое сканирование
-------------------------
BSF и BSR - самые плохо оптимизированные инструкции на Pentium, беря на
исполнение 11 + 2*n тактов, где n - число пропущенных нулей.
(на поздних процессорах берут только 1 или 2)

Следующий код эмулирует BSR ECX,EAX:
TEST EAX,EAX
JZ SHORT BS1
MOV DWORD PTR [TEMP],EAX
MOV DWORD PTR [TEMP+4],0
FILD QWORD PTR [TEMP]
FSTP QWORD PTR [TEMP]
WAIT ; для совместимости с ранними процессорами
MOV ECX, DWORD PTR [TEMP+4]
SHR ECX,20
SUB ECX,3FFH
TEST EAX,EAX ; сбрасываем флаг нуля