Каждый такт процессора до трех команд может быть прочитан и декодирован на микрооперации из очереди предвыборки. В этот момент работают три декодера, первый из которых может декодировать команды, содержащие до четырех микроопераций, а другие два— только команды из одной микрооперации. Если в ассемблерной программе команды упорядочены в соответствии с этим правилом (4–1–1), то все время на каждый такт будет происходить декодирование трех команд, например, если в последовательности команд
add eax,[ebx] ; 2m - в декодер 0 на первом такте mov есх,[еах] ; 2m - пауза 1 такт, пока декодер 0 ; не освободится add edx,8 ; 1m - декодер 1 на втором такте
переставить вторую и третью команды, команда add edx,8 будет декодирована в тот же такт, что и первая команда.
Число микроопераций для каждой команды приведено в приложении 2, но можно сказать, что команды, работающие только с регистрами, как правило, выполняются за одну микрооперацию, команды чтения из памяти — тоже за одну, команды записи в память — за две, а команды, выполняющие чтение-изменение-запись, — за четыре. Сложные команды содержат больше четырех микроопераций и требуют несколько тактов для декодирования. Кроме того, команды длиннее семи байт не могут быть декодированы за один такт. В среднем время ожидания в этом буфере составляет около трех тактов.
Затем микрооперации поступают в буфер накопления, где они ждут, пока все необходимые им данные не будут доступны. Затем они посылаются в ядро системы неупорядоченного исполнения, состоящей из пяти конвейеров, каждый из которых обслуживает несколько блоков исполнения. Если все данные для микрооперации готовы и в ядре есть свободный элемент, исполняющий данную микрооперацию, в буфере накопления не будет потрачено ни одного лишнего такта. После выполнения микрооперации скапливаются в буфере завершения, где результаты их записываются, операции записи в память упорядочиваются и микрооперации завершаются (три за один такт).
Время выполнения | Скорость | |
Конвейер 0 | ||
Блок целочисленной арифметики | 1 | 1 |
Блок команд LEA | 1 | 1 |
Блок команд сдвига | 1 | 1 |
Блок целочисленного умножения | 4 | 1 |
Блок команд FADD | 3 | 1 |
Блок команд FMUL | 5 | 2 |
Блок команд FDIV | 17 для 32-битных 36 для 64-битных 56 для 80-битных |
17 36 56 |
Блок MMX-арифметики | 1 | 1 |
Блок MMX-умножений | 3 | 1 |
Конвейер 1 | ||
Блок целочисленной арифметики | 1 | 1 |
Блок MMX-арифметики | 1 | 1 |
Блок MMX-сдвигов | 1 | 1 |
Конвейер 2 | ||
Блок чтения | 3 при кэш-попадании | 1 |
Конвейер 3 | ||
Блок записи адреса | не меньше 3 | 1 |
Конвейер 4 | ||
Блок записи данных | не меньше 1 | 1 |