"Оптимизация для PENTIUM процессора" - читать интересную книгу авторапредыдущая инструкция или пара инструкций. Но если адрес зависит от
результата инструкции, выполняющейся в предыдущем такте, то потребуется еще один такт, дополнительно, для расчета адреса. Это было названо остановка AGI. Пример: ADD EBX,4 / MOV EAX,[EBX] ; остановка AGI В данном примере остановка AGI может быть легко удалена, путем добавления других инструкций между ADD EBX,4 и MOV EAX,[EBX] или путем обмена их местами: MOV EAX,[EBX+4] / ADD EBX,4 Также может получиться остановка AGI при применении инструкций использующих ESP для адресации, т.н. PUSH, POP, CALL и RET, если ESP была изменена в предыдущем такте инструкцией типа MOV, ADD или SUB. Однако у Pentium есть специальная схема, которая позволяет предсказать значение ESP после стековых операций, таким образом вы не получите остановку AGI после использования PUSH, POP и CALL. Однако вы можете получить остановку AGI после RET, если у него есть операнд для добавления к ESP. Примеры: ADD ESP,4 / POP ESI ; остановка AGI POP EAX / POP ESI ; нет остановки, спаривание MOV ESP,EBP / RET ; остановка AGI CALL L1 / L1: MOV EAX,[ESP+8] ; нет остановки RET / POP EAX ; нет остановки Инструкция LEA также приводит к остановке AGI, если она использует базовый или индексный регистр, который был изменен в предыдущем такте. INC ESI / LEA EAX,[EBX+4*ESI] ; остановка AGI 8. СПАРИВАНИЕ ИНСТРУКЦИЙ ======================== Pentuim снабжен двумя конвеерами для исполнения инструкций, называющиеся U-труба и V-труба. при определенных условиях можно выполнить две инструкции одновременно - одну в U-трубе, а другую в V-трубе. Это может практически удвоить скорость. Следовательно стоит потратить время на оптимизацию, что бы ваши инструкции спаривались. Следующие инструкции спариваются в обоих трубах: MOV регистр, память, или значение в регистре или памяти PUSH регистр или значение POP регистр LEA, NOP INC, DEC, ADD, SUB, CMP, AND, OR, XOR, и некоторые виды TEST (смотри раздел 17.2) Следующие инструкции спариваются только в U-трубе: ADC, SBB |
|
|