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


10.4 Если инструкции чтения/модифицирования спаривается с инструкцией
чтения/модифицирования или чтения/модифицирования/записи, то спаривание
не полное.

Количество используемых тактов приведено в этой таблице:

| Первая инструкция
| MOV или чтение/ чтение/модификация/
Вторая инструкция | межрегистровая модификация запись
----------------------|----------------------------------------------
MOV или межрегистровая| 1 2 3
чтение/модификация | 2 2 4
чтение/мод./запись | 3 3 5
----------------------|-----------------------------------------------

Примеры:
ADD [mem1], EAX / ADD EBX, [mem2] ; 4 такта
ADD EBX, [mem2] / ADD [mem1], EAX ; 3 такта

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

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

От неполного спаривание можно избавиться просто поменяв инструкции местами.
Например:

L1: MOV EAX,[ESI]
MOV EBX,[ESI]
INC ECX

Здесь инструкции MOV образуют не полную пару, поскольку получают доступ к
одной и той же позиции памяти, последовательность исполнится за 3 такта. Мы
может улучшить код простым переставлением инструкции INC ECX, что бы она
составила пару с одной из инструкций MOV.

L2: MOV EAX,OFFSET [A]
XOR EBX,EBX
INC EBX
MOV ECX,[EAX]
JMP L1