MIPS I talimat formatlarını anlamak için, MIPS boru hattını anlamanız ve 1985 dolaylarında CPU uygulama teknolojisini de düşünmeniz gerekir. Şemaya bakarsanız (birini tanıyorsunuz), kayıt dosyası okumasının Kimlik aşaması, IF'den hemen sonra.
R tipi bir yönerge amacıyla, kimlik aşamasının aşağıdaki görevleri gerçekleştirmesi gerekir:
- Aslında o belirleyin olan bir R-tipi talimat.
- Öyleyse, kayıt dosyasına kayıtlardan değer yüklemesini söyleyin.
Bu tartışmanın amacı için düşünmeniz gereken ilk iş budur. Eğer kayıtlardan herhangi bir değere ihtiyacınız varsa bile çözmek için yapmanız gereken bir çok kod çözme işi varsa, bu kayıt okumalarına başlamadan önce gecikmeyi artırır. Ayrıca kimlik aşamasının karmaşıklığını da artırır. Tüm R tipi talimatlar için tek bir opcode ayırarak karmaşıklığı minimumda tutarsınız.
Beş biti sadece vites değiştirmeye ayırmanız biraz garip görünüyor. Birkaç olası açıklama düşünebilirim. Birincisi, yönlendirmeyi basitleştirmesidir (bu beş bit DAİMA doğrudan kayıt dosyasına beslenir, bu beş bit DAİMA kovan değiştiriciye beslenir, bu altı bit DAİMA hangi işlevi gerçekleştireceğini belirlemek için ALU'ya yönlendirilir).
Gelecekte birleştirilmiş sağa sola kaydırma ve ekleme talimatları eklemeyi düşünüyor olabilirler. Bu muhtemelen şu şekildedir:
$d = $s + ($t << shamt)
2s+ 1s
Bugün, muhtemelen daha karmaşık bir kod çözme aşamasına sahip olmak hakkında iki kez düşünmeyiz, çünkü özellikle kayıt dosyası erişimleri daha sonra tipik bir süperskalar CPU'nun boru hattında gerçekleşme eğilimindedir. Birçok modern CPU , L1 önbelleğine bir talimat eklendiğinde bazı kaba komut kod çözme de yapar . I-cache satırlarını ekstra bilgileri saklamak için birkaç bit daha geniş yaparsınız (Moore Yasası sayesinde, harcanacak çok sayıda transistör vardır), "uygun" komut kod çözme işlemini daha basit ve daha hızlı hale getirmek için.
Muhtemelen opcode alanını olabildiğince küçük tutmak istemelerinin bir nedeni, J-tipi talimatları haksız yere cezalandırmamasıdır. Muhtemelen bildiğiniz gibi, J tipi talimatlar sözde doğrudan adresleme kullanır. Evde oynayan herkesin yararına, kısaca açıklayacağım.
J tipi komutun adres alanı 26 bittir. Talimatlar her zaman 4 bayt hizalı olduğundan, en az önemli iki biti saklamanız gerekmez, bu da 28 bit adrese etkili bir şekilde sahip olduğunuz anlamına gelir. Ancak, MIPS I'deki adres alanı 32 bittir. Böylece atlama yerinin ilk dört biti program sayacından alınır.
Bu, PC konumunun en önemli dört bitinin farklı olduğu bir yere doğrudan atlayamayacağınız anlamına gelir. Bunun yerine bir çizik yazmacından daha pahalı bir üç komutlu atlama yapmanız gerekir:
lui $r,target >> 16
ori $r,$r,target & 0xFFFF
jr $r
Bugün çok kötü değil, ama 1985'te çok fazla saat döngüsü.
Adres alanından biraz çalmak, doğrudan atlamanın etkili aralığını daha da azaltacaktır. Bunun ödemek için çok yüksek bir fiyat olabileceğini görebilirsiniz.