Jest tu kilka różnych kompromisów.
Po pierwsze, chcemy, aby instrukcje miały stałą szerokość (32 bity). Gwarantuje to, że instrukcje są blokowane w pamięci podręcznej i wyrównane do strony, co upraszcza pamięć podręczną i obecność strony oraz kontrolę uprawnień.
Po drugie, chcemy, aby różne pola instrukcji ( opcode/ source regs/ immediates) miały stałą szerokość i stałą pozycję. To sprawia, że dekodują je szybciej / mniej logicznie i są potrzebne na wczesnych etapach procesu. ( destinationRejestr nie jest potrzebny do końca potoku, więc może znajdować się w różnych miejscach Ri Iinstrukcjach.) Pozycja i szerokość functionpola mają znaczenie mniej ważne, ponieważ to musi kontrolować funkcję ALU, ale to jest w trzecim etapie rurociągu, więc masz trochę czasu, aby z nim popracować w razie potrzeby.
IJJ2)282)28Iinstrukcje są również przydatne dla autorów kompilatorów / linkerów. (Na SPARC, gdzie bezpośrednie pole miało tylko 12 bitów, musieli dodać całą specjalną load-highklasę instrukcji z 20-bitowym natychmiastowym.)
2)6= 64JRI
Ale to pozostawia trochę poruszenia z Rinstrukcjami. Oprócz 6-bitowego kodu operacyjnego, potrzebują one tylko 15 dodatkowych bitów do specyfikacji rejestru, co pozostawia 11 bitów dla rozszerzonego kodu operacji i / lub kwoty przesunięcia.
Powinieneś pomyśleć o functionpolu jako o rozszerzonym kodzie operacji dla Rinstrukcji. Jest tylko jeden Rkod functionsoperacji Rinstrukcji , ale są 64 różne, które instrukcja może wykonać.
W porządku. Mamy 60 różnych Iinstrukcji i 64 różnych Rinstrukcji, więc gdzie powinniśmy umieścić instrukcje natychmiastowej zmiany?
Cóż, nie tylko jest mniej Iinstrukcji, ale jest o wiele więcej rzeczy, które chcemy zrobić z I instrukcjami. Przypomnij sobie, że wszystkie instrukcje gałęzi muszą być Iinstrukcjami, ponieważ mają względne (bezpośrednie) przesunięcie. Również wszystkie instrukcje ładowania i przechowywania są Iformatowane w MIPS. I wreszcie potrzebujemy instrukcji load-top-instant, która będzie Iinstrukcją. Nie tylko to, ale Rinstrukcje nadal mają 5 dodatkowych nieużywanych bitów (co jest nam potrzebne do natychmiastowego przejścia na natychmiastową zmianę w tej architekturze), więc daje to dodatkową zachętę do przekształcenia natychmiastowych zmian w specjalne (dziwne) Rinstrukcje .
Wiele z tych decyzji jest bardziej sztuką niż nauką, ale istnieje logika, którą można dostrzec. Kluczowym celem nie jest, aby liczba instrukcji była tak mała, jak to możliwe, lecz aby uzyskać wysoką wydajnośćdopasowanie potoku na jednym chipie (aby małe firmy, takie jak MIPS i Sun były w latach 80., mogły konkurować z IBM i DEC). (Nazwa RISC, wymyślona przez Davida Pattersona, jest nieco niefortunna. Przykuła uwagę, ponieważ była urocza, a nie dlatego, że „zredukowane instrukcje” są dokładnym opisem tego, co naprawdę próbowały zrobić architektury MIPS i SPARC.) Więc chcesz instrukcje o stałej szerokości (i stosunkowo małej, aby uzyskać lepsze zachowanie pamięci podręcznej I), aby pobieranie, stronicowanie i dekodowanie były prostsze i szybsze. Chcesz części instrukcji, które trzeba wcześniej zdekodować (opcode, dwa rejestry źródłowe i znak rozszerzony natychmiastowy) mają stałą szerokość i stałą pozycję. Chcesz, aby natychmiastowe elementy były tak długie, jak to możliwe, i chcesz mieć tyle różnych rodzajów instrukcji, ile będą pasować, biorąc pod uwagę wszystkie inne ograniczenia.