Оптимизация для процессоров семейства Pentium: 14. Раскодировка инструкций (PPro, PII и PIII) — Архив WASM.RU

Все статьи

Оптимизация для процессоров семейства Pentium: 14. Раскодировка инструкций (PPro, PII и PIII) — Архив WASM.RU

Я рассказываю о раскодировке инструкций до доставки инструкций, потому что вам необходимо знать, как работают раскодировщики, чтобы понимать возможные способы доставки.

Декодеры могут обрабатывать три инструкции за такт, но только, если соблюдены определенные условия. Декодер D0 может обработать за один такт любую инструкцию, которая генерирует до 4 мопов. Декодеры D1 и D2 могут обрабатывать только те инструкции, которые генерируют 1 моп и эти инструкции не могут занимать больше 8 байт.

Резюмируем правила для декодирования двух или трех инструкций за один такт:

  • Первая инструкци (D0) не должна генерировать больше 4-х мопов.
  • Вторая и третья инструкции не должны генерировать больше, чем по одному мопу.
  • Вторая и третья инструкции не могут быть занимать больше 8-ми байтов каждая.
  • Инструкции должны содержаться внутри одного 16-байтного БДИ (смотри следующую главу).

Нет ограничение на длину инструкции в D0 (несмотря на то, то руководства от Интел говорят об обратном) пока все три инструкции влезают в один 16-ти байтный блок.

Инструкция, которая генерирует больше 4-х мопов требует два или больше такта для раскодировки, и ни одна другая инструкция не может раскодировываться параллельно.

Из вышеприведенных правил следует, что декодеры могут генерировать максимум шесть мопов за такт, если первая инструкция в каждой раскодировываемой группе разбивается на 4 мопа, а другие две - на один каждая. Минимальное количество - это два мопа за такт, еси все инструкции генерируют по два мопа, так что D1 и D2 никогда не используются.

Для максимальной производительности рекомендуется перегруппировать ваши инструкции в блоки 4-1-1: инструкции, которые генерирует 2 или 4 мопа можно разбить на две простые одномопные инструкции, что не будет вам стоить ни такта.

Пример:

MOV     EBX, [MEM1]     ; 1 uop  (D0)
INC     EBX             ; 1 uop  (D1)
ADD     EAX, [MEM2]     ; 2 uops (D0)
ADD     [MEM3], EAX     ; 4 uops (D0)

Это занимает три такта для раскодировки. Вы можете сохранить один такт, перегруппировав инструкции в две декодируемые группы:

ADD     EAX, [MEM2]     ; 2 uops (D0)
MOV     EBX, [MEM1]     ; 1 uop  (D1)
INC     EBX             ; 1 uop  (D2)
ADD     [MEM3], EAX     ; 4 uops (D0)

Теперь декодеры генерируют 8 мопов за два такта, что удовлетворительно. На более поздних стадиях конвеер может обрабатывать только 3 мопа за такт, поэтому при скорости декодирования высшей, чем эта, вы можете считать, что декодирование не является узким местом. Тем не менее, сложности в механизме доставки могут задержать раскодирование так, как это рассказывается в следующей главе, поэтому чтобы быть спокойным, лучше стремиться к скорости раскодировки большей 3-х мопов за такт.

Вы можете узнать количество генерируемых инструкцией мопов в таблице в главе 29.

Префиксы инструкций также приводят к потере скорости раскодировки. У инструкций могут быть префиксы следующих видов:

  • Префикс размера операнда требуется, когда вы используете 16-ти битный операнд в 32-х битном окружении или наоборот. (Не считая инструкций, у которых операнды могут быть только одного размера, например FNSTSW AX). Префикс размера операнда вызывает потерю нескольких тактов, если у инструкции есть числовой 16-ти или 32-х битный операнд, потому что размер операнда меняется префиксом.

    Примеры:

            ADD BX, 9      ; no penalty because immediate operand is 8 bits
            MOV WORD PTR [MEM16], 9  ; penalty because operand is 16 bits
    
            ADD BX, 9      ; нет потерь, так как числовой операнд занимает 8 бит
            MOV WORD PTR [MEM16], 9  ; есть потери, так как операнд занимает 16 бит

    Последную инструкцию следует заменить на

            MOV EAX, 9
            MOV WORD PTR [MEM16], AX  ; no penalty because no immediate
    
            MOV EAX, 9
            MOV WORD PTR [MEM16], AX  ; нет потерь, так как нет числовых операндов
  • Префикс размера адреса используется при 32-х битной адресации в 16-ти битном режиме или наоборот. Это редко требуется и этого следует избегать. Префикс размера адреса вызывает потери каждый раз, когда операнды используются явно, потому что интерпретация изменяется с помощью префикса. Инструкции, использующие оеранды памяти неявно (например строковые операции), не приводят к потерям, связанных с префиксом размера операнда.
  • Префиксы сегментов используются, когда вы обращаетесь к данным, находящимся не в сегменте данных по умолчанию. На PPro, PII и PIII префиксы сегментов не приводят к потерям.
  • Префиксы повторения и префиксы закрытия (lock prefixes) не приводят к потерям при декодировании.
  • Всегда есть потери, когда у вас больше одного префикса. Обычно уходит по одному такту на префикс.

2002-2013 (c) wasm.ru