allasm.ru

    Меню

 

   Вы можете разбить инструкции чтения/модифицирования и инструкции чтения/модифицирования/записи, чтобы улучшить спаривание.

Пример:

ADD [mem1],EAX / ADD [mem2],EBX ; 5 тактов

   Этот код можно разбить на следующую последовательность, которая будет занимать только 3 такта:

    MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
    MOV [mem1],ECX / MOV [mem2],EDX

Таким же образом вы можете разбивать не спариваемые инструкции на спариваемые:

    PUSH [mem1]
    PUSH [mem2]  ; не спаривается

Разбивается на:

    MOV EAX,[mem1]
    MOV EBX,[mem2]
    PUSH EAX
    PUSH EBX     ; все спаривается

   Другие примеры неспариваемых инструкций, которые можно разбить на простые спариваемые:

CDQ разбивается на MOV EDX,EAX / SAR EDX,31
NOT EAX меняется на XOR EAX,-1
NEG EAX разбивается на XOR EAX,-1 / INC EAX
MOVZX EAX,BYTE PTR [mem] разбивается на XOR EAX,EAX / MOV AL,BYTE PTR [mem]
JECXZ разбивается на TEST ECX,ECX / JZ
LOOP разбивается на DEC ECX / JNZ
XLAT меняется на MOV AL,[EBX+EAX]

   Если разбиваение иснтрукций не повышает скорось, вы можете оставить сложные или неспариваемые конструкции, чтобы уменьшить размер кода.

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