Je to tak, proste se nasobilo tak, jak bylo potreba (a ne vzdy se muselo implementovat plnohodnotne nasobeni 32x32 bitu). Na druhou stranu kdyz mely instrukce dobu trvani jen jeden takt, bylo to ve sve dobe povazovano za prevazujici vyhodu, ostatne ani dnes se zase tolik v programech nenasobi ;-))
Mimochodem MIPS ma v kazde aritmeticke instrukci zabudovan i posun, takze to nasobeni se implementovalo velmi jednoduse - posun a soucet (jedna bitova cifra) v kazdem taktu.
Myslim ze si to pletete s ARMem. Ja tedy znam pouze R3000 kde je shift samostatna instrukce, ale necekam ze by R2000 byla nejak zasadne jina. V ARMu je shift soucasti adresniho modu. Na jednu stranu to dela spolu s instrukcemi ldm a stm hustsi kod (srovnatelny s x86, naproti tomu MIPS vychazi tak 3* delsi oproti x86), na druhou stranu ma ALU delsi kritickou cestu nez u MIPS, coz komplikuje vnitrni fungovani tech novych ARMu (>500MHz takt) -- je potreba delsi pipeline. V jednom kroku se dela shift, v dalsim ALU.
AFAIK je v instrukcich pracujicich se tremi registry u MIPS rozdeleni instrukcniho slova nasledujici:
6 bitu pro opcode 5 bitu pro index prvniho registru 5 bitu pro index druheho registru 5 bitu pro index tretiho registru 5 bitu pro shift-amount 6 bitu pro specifikaci aritmeticke operace ------ 32 bitu celkem
Pravda je, ze assembler asi rozlisuje mezi aritmetickymi instrukcemi a posuny, ale podle me (nezkousel jsem) je mozne to zkombinovat.
Nikdy jsem pro MIPS primo neprogramoval, takze nevim. V seznamu instrukci jsem ale nevidel cokoliv jako ADD r0, r1, r2 shl 4, a tez v blokovem schematu procesoru neni barrel shifter predrazen ALU, jako to ma ARM, z cehoz vyvozuji ze to neni mozne napsat, a ze bity v instrukcnim kodu jsou takto alokovany jen proto, aby se zjednodusilo dekodovani instrukce.