Untuk memahami format instruksi MIPS I, Anda perlu memahami pipa MIPS dan juga berpikir kembali ke teknologi implementasi CPU sekitar tahun 1985. Jika Anda melihat diagram (Anda tahu satu), Anda akan melihat bahwa membaca register file ada di Tahap ID, tepat setelah IF.
Untuk tujuan instruksi tipe-R, tahap ID perlu melakukan tugas-tugas berikut:
- Tentukan bahwa itu sebenarnya adalah instruksi tipe-R.
- Jika demikian, beri tahu file register untuk memuat nilai dari register.
Untuk tujuan diskusi ini, ini adalah tugas pertama yang harus Anda pikirkan. Jika ada banyak pekerjaan decoding instruksi yang harus Anda lakukan untuk mengetahui apakah Anda memerlukan nilai dari register, ini meningkatkan penundaan sebelum Anda dapat mulai membaca register. Ini juga meningkatkan kompleksitas tahap ID. Dengan memesan satu opcode untuk semua instruksi tipe-R, Anda menjaga kompleksitas menjadi minimum.
Tampaknya sedikit aneh bahwa Anda mendedikasikan lima bit hanya untuk bergeser. Saya bisa memikirkan beberapa penjelasan yang mungkin. Pertama adalah bahwa hal itu menyederhanakan perutean (lima bit itu SELALU diumpankan langsung ke file register, kelima bit itu SELALU diumpankan ke dalam barrel shifter, keenam bit itu SELALU dialihkan ke ALU untuk menentukan fungsi mana yang harus dilakukan).
Mereka mungkin berpikir untuk memperkenalkan kombinasi shift-kiri-dan-tambahkan di masa depan. Ini mungkin akan berbentuk:
$d = $s + ($t << shamt)
2s+ 1s
Hari ini, kita mungkin tidak akan berpikir dua kali untuk memiliki tahap decoding yang lebih kompleks, terutama karena akses file register cenderung terjadi kemudian dalam pipeline CPU superscalar yang khas. Banyak CPU modern bahkan melakukan beberapa decoding instruksi kasar pada saat instruksi dimasukkan dalam cache L1 . Anda membuat garis I-cache sedikit lebih lebar untuk menyimpan informasi tambahan (terima kasih kepada Hukum Moore, Anda memiliki banyak transistor yang perlu disia-siakan) untuk membuat instruksi "decoding" yang lebih sederhana menjadi lebih mudah dan cepat.
Salah satu alasan mengapa mereka mungkin ingin menjaga bidang opcode sekecil mungkin adalah karena itu tidak menghukum instruksi tipe-J terlalu berlebihan. Seperti yang mungkin Anda ketahui, instruksi tipe-J menggunakan pengalamatan langsung pseudo. Demi siapa pun yang bermain di rumah, saya akan menjelaskannya secara singkat.
Bidang alamat dari instruksi tipe-J adalah 26 bit. Karena instruksi selalu selaras 4-byte, Anda tidak perlu menyimpan dua bit yang paling signifikan, yang berarti Anda secara efektif memiliki 28 bit alamat. Namun, ruang alamat di MIPS I adalah 32-bit. Jadi empat bit teratas dari lokasi lompat diambil dari penghitung program.
Ini berarti bahwa Anda tidak dapat langsung melompat ke lokasi di mana empat bit paling signifikan dari lokasi PC berbeda. Anda harus melakukan lompatan tiga instruksi yang lebih mahal melalui register awal sebagai gantinya:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Itu tidak terlalu buruk hari ini, tetapi pada tahun 1985, banyak siklus clock.
Mencuri sedikit dari bidang alamat akan mengurangi jarak efektif lompatan langsung lebih jauh. Anda dapat melihat bagaimana ini mungkin harga yang terlalu tinggi untuk dibayar.