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. ( destination
Register tidak diperlukan sampai akhir pipa, sehingga bisa di tempat R
dan I
instruksi yang berbeda.) Posisi dan lebar function
bidang 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.
I
J
J
228228I
instruksi juga bagus untuk penulis kompiler / penghubung. (Pada SPARC, di mana bidang langsung hanya 12 bit mereka harus menambahkan seluruh load-high
kelas instruksi khusus dengan 20 bit langsung.)
26= 64J
R
I
Tapi itu meninggalkan beberapa ruang gerak dengan R
instruksi. 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 function
bidang tersebut sebagai opcode yang diperluas untuk R
instruksi. Hanya ada satu R
opcode instruksi, tetapi ada 64 berbeda functions
yang R
bisa dilakukan oleh instruksi.
Baik. Kami memiliki 60 I
instruksi berbeda dan 64 R
instruksi berbeda , jadi di mana kita harus meletakkan instruksi shift-langsung?
Ya, tidak hanya ada lebih sedikit I
instruksi, tetapi ada banyak hal yang ingin kita lakukan dengan I
instruksi. Ingatlah bahwa semua instruksi cabang perlu I
instruksi karena mereka memiliki offset relatif (langsung). Juga semua instruksi memuat dan menyimpan adalah I
format pada MIPS. Dan akhirnya kita membutuhkan instruksi load-upper-direct untuk menjadi sebuah I
instruksi. Tidak hanya itu, tetapi R
instruksinya 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 R
instruksi 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.
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:
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:
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:
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.
sumber