Mengapa MIPS menyertakan shamt dan membedakan funct / opcode?

15

Saya bingung mengapa desainer MIPS akan menyertakan 5 bit yang didedikasikan untuk pengalihan dan memiliki bit opcode dan fungsi yang terpisah.

Karena MIPS sangat RISC, saya berasumsi bahwa hanya pengalihan yang akan dilakukan dalam beberapa instruksi, sehingga 5 bit tersebut tampak seperti mereka membuang-buang ruang ketika mereka dapat langsung dimasukkan. Saya berasumsi bahwa opcodes dan funct terpisah untuk membedakan instruksi tipe R dan tipe I, tetapi ini dapat dilakukan dengan memperluas opcode sebanyak 1 bit. Dengan kedua instruksi tipe-R ini dapat menjadi 22 bit panjangnya. Ini tidak akan berfungsi jika instruksi tipe-I dan tipe-J ingin menyimpan alamat dan segera mereka, tetapi keduanya tampaknya tidak perlu.

qwr
sumber

Jawaban:

10

Ada beberapa pertukaran yang terjadi di sini.

Pertama, kami ingin instruksinya tetap lebar (32-bit). Ini menjamin bahwa instruksi adalah pemblokiran cache dan penyelarasan halaman yang menyederhanakan cache dan kehadiran halaman serta pemeriksaan izin.

Kedua kami ingin berbagai bidang instruksi ( opcode/ source regs/ immediates) menjadi lebar tetap dan posisi tetap. Ini membuat mereka lebih cepat / kurang logika untuk memecahkan kode dan mereka diperlukan pada tahap awal pipa. ( destinationRegister tidak diperlukan sampai akhir pipa, sehingga bisa di tempat Rdan Iinstruksi yang berbeda.) Posisi dan lebar functionbidang menjadi sedikit kurang penting karena itu perlu mengontrol fungsi ALU, tapi itu pada tahap pipa ketiga, jadi Anda punya sedikit waktu untuk bekerja dengannya jika diperlukan.

IJJ228228Iinstruksi juga bagus untuk penulis kompiler / penghubung. (Pada SPARC, di mana bidang langsung hanya 12 bit mereka harus menambahkan seluruh load-highkelas instruksi khusus dengan 20 bit langsung.)

26=64JRI

Tapi itu meninggalkan beberapa ruang gerak dengan Rinstruksi. Selain dari 6-bit opcode, ini hanya membutuhkan 15 bit tambahan untuk spesifikasi register, yang menyisakan 11 bit untuk opcode yang diperluas dan / atau jumlah shift.

Anda harus menganggap functionbidang tersebut sebagai opcode yang diperluas untuk Rinstruksi. Hanya ada satu Ropcode instruksi, tetapi ada 64 berbeda functionsyang Rbisa dilakukan oleh instruksi.

Baik. Kami memiliki 60 Iinstruksi berbeda dan 64 Rinstruksi berbeda , jadi di mana kita harus meletakkan instruksi shift-langsung?

Ya, tidak hanya ada lebih sedikit Iinstruksi, tetapi ada banyak hal yang ingin kita lakukan dengan I instruksi. Ingatlah bahwa semua instruksi cabang perlu Iinstruksi karena mereka memiliki offset relatif (langsung). Juga semua instruksi memuat dan menyimpan adalah Iformat pada MIPS. Dan akhirnya kita membutuhkan instruksi load-upper-direct untuk menjadi sebuah Iinstruksi. Tidak hanya itu, tetapi Rinstruksinya masih memiliki 5 bit tambahan yang tidak terpakai, (yang kami butuhkan untuk segera shift-langsung pada arsitektur ini), jadi ini memberikan insentif lebih lanjut untuk membuat shift-segera menjadi Rinstruksi khusus (aneh) .

Banyak dari keputusan ini lebih dari seni daripada sains, tetapi ada logika yang mendasarinya yang dapat dilihat. Tujuan utamanya bukan untuk membuat jumlah instruksi sekecil mungkin, tetapi untuk membuat kinerja tinggipipa cocok pada satu chip (sehingga perusahaan kecil, seperti MIPS dan Sun pada 1980-an, dapat bersaing dengan IBM dan DEC). (Nama RISC, diciptakan oleh David Patterson, agak disayangkan. Itu menarik karena itu lucu, bukan karena "instruksi berkurang" adalah deskripsi akurat tentang apa yang coba dilakukan oleh arsitektur MIPS dan SPARC.) Jadi Anda ingin instruksi tetap lebar (dan relatif kecil sehingga Anda mendapatkan perilaku I-cache yang lebih baik) untuk membuat pengambilan, paging, dan decode lebih mudah dan lebih cepat. Anda ingin bagian dari instruksi yang perlu diterjemahkan lebih awal (theopcode, dua sumber mendaftar, dan tanda diperpanjang segera) menjadi lebar tetap dan dalam posisi tetap. Anda ingin segera menjadi selama mungkin, dan Anda ingin banyak jenis instruksi yang sesuai, mengingat semua kendala lainnya.

Logika Pengembaraan
sumber
Terima kasih atas tanggapan informatif Anda, terutama bagian tentang tujuan perancang arsitektur. Saya merasa menarik untuk membandingkan MIPS dengan MOS 6502, karena jika saya memahaminya dengan benar, 6502 tidak pernah shamt (saya masih mencoba memahami format instruksi).
qwr
1
6502 adalah desain mikroprosesor generasi pertama (pra-CISC), meskipun ia mengantisipasi pipelining, di mana ia bisa melakukan registereback pada saat yang sama saat memuat instruksi berikutnya. 6502 memiliki opcode byte, seperti kebanyakan 8-bit micros. Arsitektur lain yang perlu dipertimbangkan adalah ARM, yang dirancang oleh sekelompok insinyur elektronik tingkat tinggi yang membaca makalah Berkeley RISC dan mengunjungi pabrik MOS dan memutuskan "hei, kita bisa melakukan itu".
Nama samaran
Saya bertanya-tanya apa implikasinya seandainya ada pola bit shamt yang berarti "jangan jalankan instruksi berikut, tetapi gunakan 32 bit yang telah diambil untuk itu sebagai sumber operan untuk instruksi ini"? Sebagai alternatif atau tambahan, saya bertanya-tanya apakah akan praktis untuk memiliki ruang opcode yang adil yang didedikasikan untuk pasangan instruksi sederhana yang tidak terputus - sebuah konsep seperti Thumb, tetapi bebas diselingi dengan instruksi 32-bit, dan tanpa kemampuan untuk lompat langsung ke instruksi kedua kata?
supercat
5

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:

  1. Tentukan bahwa itu sebenarnya adalah instruksi tipe-R.
  2. 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.

Nama samaran
sumber
"gabungan instruksi shift-kiri-dan-tambah" dari jenis yang nanti terlihat dalam ARM?
Damian Yerrick