Оптимизация для процессоров семейства Pentium: 11. Разбивка сложных инструкций на более простые (PPlain и PMMX)

Дата публикации 22 авг 2002

Оптимизация для процессоров семейства Pentium: 11. Разбивка сложных инструкций на более простые (PPlain и PMMX) — Архив WASM.RU

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

Пример:

Код (Text):
  1.  
  2. ADD [mem1],EAX / ADD [mem2],EBX ; 5 тактов

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

Код (Text):
  1.  
  2.     MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
  3.     MOV [mem1],ECX / MOV [mem2],EDX

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

Код (Text):
  1.  
  2.     PUSH [mem1]
  3.     PUSH [mem2]  ; не спаривается

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

Код (Text):
  1.  
  2.     MOV EAX,[mem1]
  3.     MOV EBX,[mem2]
  4.     PUSH EAX
  5.     PUSH EBX     ; все спаривается

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

Код (Text):
  1.  
  2. CDQ разбивается на MOV EDX,EAX / SAR EDX,31
  3. NOT EAX меняется на XOR EAX,-1
  4. NEG EAX разбивается на XOR EAX,-1 / INC EAX
  5. MOVZX EAX,BYTE PTR [mem] разбивается на XOR EAX,EAX / MOV AL,BYTE PTR [mem]
  6. JECXZ разбивается на TEST ECX,ECX / JZ
  7. LOOP разбивается на DEC ECX / JNZ
  8. XLAT меняется на MOV AL,[EBX+EAX]

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

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


0 711
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532