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. ( destination
Rejestr nie jest potrzebny do końca potoku, więc może znajdować się w różnych miejscach R
i I
instrukcjach.) Pozycja i szerokość function
pola 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.
I
J
J
2)282)28I
instrukcje 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-high
klasę instrukcji z 20-bitowym natychmiastowym.)
2)6= 64J
R
I
Ale to pozostawia trochę poruszenia z R
instrukcjami. 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 function
polu jako o rozszerzonym kodzie operacji dla R
instrukcji. Jest tylko jeden R
kod functions
operacji R
instrukcji , ale są 64 różne, które instrukcja może wykonać.
W porządku. Mamy 60 różnych I
instrukcji i 64 różnych R
instrukcji, więc gdzie powinniśmy umieścić instrukcje natychmiastowej zmiany?
Cóż, nie tylko jest mniej I
instrukcji, ale jest o wiele więcej rzeczy, które chcemy zrobić z I
instrukcjami. Przypomnij sobie, że wszystkie instrukcje gałęzi muszą być I
instrukcjami, ponieważ mają względne (bezpośrednie) przesunięcie. Również wszystkie instrukcje ładowania i przechowywania są I
formatowane w MIPS. I wreszcie potrzebujemy instrukcji load-top-instant, która będzie I
instrukcją. Nie tylko to, ale R
instrukcje 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) R
instrukcje .
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.