Я рассказываю о раскодировке инструкций до доставки инструкций, потому что вам необходимо знать, как работают раскодировщики, чтобы понимать возможные способы доставки.
Декодеры могут обрабатывать три инструкции за такт, но только, если соблюдены определенные условия. Декодер D0 может обработать за один такт любую инструкцию, которая генерирует до 4 мопов. Декодеры D1 и D2 могут обрабатывать только те инструкции, которые генерируют 1 моп и эти инструкции не могут занимать больше 8 байт.
Резюмируем правила для декодирования двух или трех инструкций за один такт:
Нет ограничение на длину инструкции в 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.
Префиксы инструкций также приводят к потере скорости раскодировки. У инструкций могут быть префиксы следующих видов:
Примеры:
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 ; нет потерь, так как нет числовых операндов
[C] Агнер Фог, пер. Aquila