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
SHR, SAR, SHL, SAL со значением счетчиком
ROR, ROL, RCR, RCL со значением счетчиком 1
Следующие инструкции могут исполняться в обоих трубах, но спариваются только в
V-трубе: ближние вызовы, короткие и ближние переходы, короткие и ближние
условные переходы.
Все остальные инструкции могут исполняться только в U-трубе и не спариваются.
Две последовательные инструкции спарятся если будут выполнены следующие
условия:
8.1 Первая инструкция спаривается в U-трубе, а вторая в V-трубе.
8.2 Вторая инструкция не должна читать или писать в регистр, в который пишет
первая. Например:
MOV EAX, EBX / MOV ECX, EAX ; чтение после записи, не спариваются
MOV EAX, 1 / MOV EAX, 2 ; запись после записи, не спариваются
MOV EBX, EAX / MOV EAX, 2 ; запись после чтения, спариваются
MOV EBX, EAX / MOV ECX, EAX ; чтение после чтения, спариваются
MOV EBX, EAX / INC EAX ; чтение и запись после чтения, спариваются
8.3 В правилах 8.2 мы рассматривали части регистров, как полные регистры,
например:
MOV AL, BL / MOV AH, 0 ; запись в разные части одного регистра,
; не спариваются
8.4 Две инструкции, пишущие в разные части регистра флагов могут спариваться,
не смотря на правила 8.2 и 8.3 Например:
SHR EAX,4 / INC EBX ; спариваются
8.5 Инструкция, пишущая в флаги может спариваться с условным переходом, не
смотря на правило 8.2 Например:
CMP EAX, 2 / JA LabelBigger ; спаривается
8.6 Следующие инструкции могут спариваться, не смотря на то, что они
модифицируют указатель стека. Например:
PUSH + PUSH, PUSH + CALL, POP + POP
8.7 Есть различия в спаривании инструкций с префиксом.
Вот различные типы префиксов:
- инструкции, адресующие не типичный сегмент имеют префикс.
- инструкции, использующие 16 битные данные в 32 битном режиме, равно как
инструкции, использующие 32 битные данные в 16 битном режиме имеют
префикс размера операнда.
- инструкции, использующие 32 битные базовые или индексные регистры в
16 битном режиме имеют префикс размера операнда.
- повторяющиеся строковые инструкции имеют префикс повторения.
- заблокированные инструкции имеют префикс блокировки.
- многие двухбайтные инструкции, не присутствующие в процессоре 80086
имеют двухбайтный опкод, где первый байт - 0Fh. Байт 0Fh ведет себя
как префикс на процессоре Pentium без MMX, но не на процессоре Pentium
MMX. Наиболее общие инструкции с префиксом 0Fh: MOVZX, MOVSX, PUSH FS,
POP FS, PUSH GS, POP GS, LFS, LGS, LSS, SETcc, BT, BTC, BTR, BTS, BSF,
BSR, SHLD, SHRD и IMUL с двумя не численными операндами.
На Pentium без MMX, инструкции с префиксами могут исполняться только в
U-трубе, за исключением ближних условных переходов.
На Pentium MMX инструкции с размером операнда, размером адреса, или
префиксом 0Fh могут выполниться в каждой трубе, а инструкции с префиксом
сегмента, повторения и блокировки по-прежнему могут выполняться только в
U-трубе.
8.8 Инструкция, которая имеет как смещение, так и непосредственные данные не
спариваются на Pentium без MMX, а на Pentium MMX спариваются только в
U-трубе:
MOV DWORD PTR DS:[1000], 0 ; не спаривается, или только в U-трубе
CMP BYTE PTR [EBX+8], 1 ; не спаривается, или только в U-трубе
CMP BYTE PTR [EBX], 1 ; спаривается
CMP BYTE PTR [EBX+8], AL ; спаривается
8.9 Инструкции должны предзагружаться и декодироваться. Это объяснятеся в
разделе 9.
Дальше
|