"Оптимизация для PENTIUM процессора" - читать интересную книгу автораИнструкции INC EBX / MOV ECX,[EAX] спариваются не полно, потому что у
последней - остановка AGI. Последовательность исполниться за 4 такта. Но если мы вставим инструкцию NOP, или любую подобную, то MOV ECX,[EAX] спариться с JMP L1, и последовательность выполниться за 3 такта. Следующий пример - 16 битный, допускается, что SP делиться на 4: L3: PUSH AX PUSH BX PUSH CX PUSH DX CALL FUNC Здесь инструкции PUSH образуют две не полные пары, т.к. оба операнда находятся по одну границу DWORD. PUSH BX мог бы спариться с PUSH CX, потому что они по разные границы DWORD, но не делает этого, потому что уже спарился с PUSH AX. Последовательность исполняется 5 тактов. Но если мы вставим NOP, или аналогичную инструкцию, то PUSH BX спариться с PUSH CX, а PUSH DX с CALL FUNC. И тогда последовательность будет выполняться за 3 такта. Другим решением этой проблемы является - не допуск SP быть делимым на 4. Однако эту проблему трудно решить в 16 битном режиме, по этому этот способ больше подходит для 32 битного режима. 11. ЗАМЕНА СЛОЖНЫХ ИНСТРУКЦИЙ НА БОЛЕЕ ПРОСТЫЕ Вы можете заменять инструкции чтения/модифицирования и чтения/модифицирования/записи, что бы достигнуть спаривания. Пример: 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] Если при разбивании инструкций не увеличивается скорость, то вы можете сохранить сложные, не спаривающиеся инструкции, для сокращения длины кода. |
|
|