THIS SECTION IS UNDER CONSTRUCTION
Обычные RISC процессоры все хорошо - инструкции фиксированной длинны и выполняются как правило за 1 такт - все хорошо. Кэш инструкций
В случае же CISC процессоров у нас сложная система комманд переменной длинны. Поэтому с целью минимизации времени работы code cache стал опускаться по конвееру ближе к выполняемым устройствам.
Первая стадия была - сохранение в cache информации о границах инструкций Это позволило пробросить одну стадию конвеера. Кэш полудекодированных инструкций
Затем пришел out-of-order execution. Процессоры стали преобразовывать команды во инструкции для внутренного ядра (mOPS). Как правило декодоры были нескольких типов: для простых операций однозначно преобразуемых в микрооперации (типа ADD) и для сложных инструкций генерирующих последовательность микроопраций. Понятно что блок для сложных инструкций гораздо сложнее, поэтому их меньше. Пример блока декодирования для Intel Core: Кэш микроопераций
Соответственно cache инструкций сместился еще дальше по конвееру и стал хранить уже mOPS.
Дальнейшее развитие привело от mOPS-cache к Trace-cache, который уже содержал не микрооперации, а последовательности микроопераций которые не прерывались входящими/исходящими переходами (traces), и будучи запущенными выполнялись полностью, что повышало производительность. Trace кэш
Организация T-cache в сравнении с I-cache. Старшие биты адресса инструкции это Tag, младшие Set. (т.е. N-way associative)
Кроме того trace-cache может использоватся для развертки коротких циклов:
Другой подход был использован в процессорах Transmeta Crusoe. Там использовался встроеенный в процессор Firmware компилятор, который преобразовывал входящие x86 комманды в native VLIW комманды процессора. Естественно code cache хранил именно эти комманды. VLIW mOPS
Форматы VLIW комманд Crusoe: