Щоб зрозуміти формати інструкцій MIPS I, вам потрібно зрозуміти конвеєр MIPS, а також подумати про технологію впровадження процесора близько 1985. Якщо ви подивитеся на діаграму (ви знаєте одну), ви побачите, що зчитування файлів реєстру знаходиться в Етап ІД, відразу після ІФ.
Для вказівки типу R на етапі ID потрібно виконати такі завдання:
- Визначити , що це на самому справі є інструкцією R-типу.
- Якщо це так, скажіть файл реєстру, щоб завантажити значення з регістрів.
Для цього обговорення це перше завдання, про яке ви повинні подумати. Якщо є багато роботи з декодування інструкцій, яку вам потрібно зробити, щоб навіть відпрацювати, якщо вам потрібні будь-які значення з регістрів, це збільшує затримку, перш ніж ви можете запустити зчитування реєстру. Це також збільшує складність стадії ID. Зарезервувавши єдиний опкод для всіх інструкцій типу R, ви зведете складність до мінімуму.
Здається, трохи дивно, що ви присвячуєте п'ять біт саме на зміну. Я можу придумати кілька можливих пояснень. Одне полягає в тому, що це спрощує маршрутизацію (ці п’ять біт ЗАВЖДИ подаються прямо у файл реєстру; ці п’ять біт ЗАВЖДИ подаються у барабанний перемикач; ці шість бітів ЗАВЖДИ направляються до АЛУ, щоб визначити, яку функцію виконувати).
Вони, можливо, думали запровадити комбіновані інструкції зсуву ліворуч і додати в майбутньому. Це, мабуть, має форму:
$d = $s + ($t << shamt)
2с+ 1с
Сьогодні ми, мабуть, не думали б двічі про складнішу стадію декодування, тим більше, що доступ до файлів регістрів, як правило, трапляється пізніше в конвеєрі типового суперскалярного процесора. Багато сучасних процесорів навіть роблять грубе декодування інструкцій під час введення інструкції в кеш-пам'ять L1 . Ви робите лінії кеш-пам'яті на кілька біт ширше, щоб зберігати додаткову інформацію (завдяки Закону Мура ви маєте багато транзисторів витрачати), щоб зробити "правильну" розшифровку інструкцій простішою та швидшою.
Однією з причин, чому вони, ймовірно, хотіли зберегти поле коду як можна меншим, щоб воно не штрафувало інструкції типу J. Як ви, напевно, знаєте, в інструкціях типу J використовується псевдо-пряма адресація. На користь тому, хто грає вдома, я коротко поясню це.
Поле адреси інструкції типу J становить 26 біт. Оскільки вказівки завжди вирівнюються в 4 байтах, вам не потрібно зберігати щонайменше два значущі біти, а це означає, що ви фактично маєте 28 біт адреси. Однак адресний простір у MIPS I становить 32 біти. Тож чотири чотири біта місця стрибка взяті з лічильника програми.
Це означає, що ви не можете безпосередньо перейти до місця, де найбільш значущі чотири біти місця на ПК відрізняються. Вам доведеться замість цього зробити більш дорогий стрибок з трьох інструкцій через регістр нуля:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Сьогодні це не так вже й погано, але в 1985 році це багато циклів годин.
Викрасти трохи адреси поля, ще більше зменшить ефективний діапазон прямого стрибка. Ви можете бачити, як це може бути занадто високою ціною, яку потрібно платити.