Zásobníkové procesory jako alternativa k architekturám CISC a RISC?

12. 7. 2011
Doba čtení: 21 minut

Sdílet

V předcházejících sedmi částech seriálu o architekturách počítačů jsme se zabývali popisem mikroprocesorů s architekturou RISC, které byly postaveny na principech umožňujících v každém taktu dokončit (v ideálním případě) jednu instrukci, což představovalo značný rozdíl oproti procesorům s architekturou CISC. Ovšem kromě těchto dvou architektur se objevila ještě architektura třetí – zásobníkové procesory.

Obsah

1. Zásobníkové procesory jako alternativa k architekturám CISC a RISC?

2. Limity klasické architektury RISC

3. Velikost programového kódu a využití vyrovnávacích pa­mětí

4. Volání subrutin, podmíněné skoky, reakce na přerušení a přepínání kontextu

5. Zásobníkové procesory

6. Instrukční sada zásobníkových procesorů

7. Příklad „horizontální“ instrukční sady zásobníkového procesoru HARRIS RTX 2000

8. Instrukce ALU aneb až čtyři operace zapsané do 16bitového instrukčního slova

9. Odkazy na Internetu

1. Zásobníkové procesory jako alternativa k architekturám CISC a RISC?

Mikroprocesory s redukovanou instrukční sadou (RISC), jejichž popisem jsme se zabývali v předcházejících sedmi částech seriálu o architekturách počítačů, jsou založeny na myšlence zpracování instrukcí s využitím většinou čtyřfázové popř. pětifázové instrukční pipeline, v níž se instrukce rozkládají na několik jednodušších podoperací, přičemž každá tato podoperace může být vykonána v jiném funkčním bloku procesoru (některé RISCové procesory ovšem používají i instrukční pipeline s více fázemi, například třinácti u mikroprocesorů ARM Cortex-A8). Díky existenci instrukční pipeline je možné za ideálních podmínek v každém strojovém taktu začít zpracovávat novou instrukci a navíc mohou být strojové cykly u většiny RISCových procesorů zkráceny, tj. může být zvýšena frekvence hodinových pulsů, protože komunikace mezi prostorově vzdálenými funkčními bloky je omezena. Konstruktéři procesorů RISC byli přesvědčeni, že se jim podařilo vytvořit takovou architekturu procesorů, která dokáže při dané úrovni technologie přinést nejvyšší výpočetní výkon, což je ostatně pravda, protože například čip SPARC64 VIIIfx „Venus“ patří mezi nejvýkonnější procesory současnosti.

Obrázek 1: Jeden z nejvýkonnějších procesorů současnosti – SPARC64 VIIIfx (kódové jméno „Venus“) s osmi jádry a špičkovým výkonem dosahujícím 128 GFLOPS.

I přes některé technologické rozdíly můžeme u všech tří nejvýznamnějších rodin RISCových mikroprocesorů (MIPS, SPARC, PA-RISC a částečně i u procesorů ARM) najít některé společné vlastnosti. Patří mezi ně například relativně velký počet pracovních registrů (většinou se jedná o registrová okna s 32 v dané chvíli viditelnými pracovními registry), „tříadresová“ instrukční sada s aritmetickými a logickými instrukcemi, jejichž operandy tvoří trojice pracovních registrů, popř. dvojice registrů a konstanta, pevná délka instrukcí zarovnaných na 32 bitů, existence registru obsahujícího konstantní hodnotu nula (nikoli u všech procesorů ARM) a společné mají tyto procesory taktéž způsob volání subrutin, kdy se pro uložení návratové adresy využívá jeden z pracovních registrů nazývaný z tohoto důvodu link register. Přednosti architektury RISC se tedy projeví především při použití překladačů, které dokážou možnosti těchto procesorů co nejlépe využít, aby například nedocházelo k nucenému čekání na dokončení předchozí instrukce (typickým příkladem může být operace porovnání/rozdílu dvou operandů následovaná podmíněným skokem, popř. dvojice instrukcí pracujících s registrem, jehož hodnota je první instrukcí modifikována).

Obrázek 2: Maska použitá při výrobě mikroprocesoru RISC I.
Zdroj: C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I

2. Limity klasické architektury RISC

První funkční vzorky mikroprocesorů s architekturou RISC vznikly již na počátku osmdesátých let minulého století a prakticky ihned vzbudily mezi odbornou veřejností velký zájem, protože se jednalo o mikroprocesory s relativně malým množstvím tranzistorů (takže i poměrně levné), ale zato s velkým výpočetním výkonem – ostatně sám David Andrew Patterson, který stál u vzniku architektury RISC vzpomíná, jak vzrušující bylo zkonstruovat spolu s několika studenty skutečně pracující procesor, který dokázal svou rychlostí překonat v té době kralující procesory CISC vyvinuté bohatými společnostmi, jakými byly Intel, Motorola či HP. Zhruba v polovině osmdesátých let pak nastala pravá „revoluce RISC“, protože se mikroprocesory s touto architekturou staly součástí pracovních unixových stanic, výkonných serverů, grafických akcelerátorů firmy SGI a později též součástí různých vestavných zařízení – odhaduje se, že v současnosti mají v této oblasti přibližně devadesátiprocentní zastoupení čipy ARM následované čipy MIPS.

Obrázek 3: Mikroprocesor HP PA-RISC 7300LC (PA=Precision Architecture). Jedná se moderní variantu procesorů RISC se zabudovaným matematickým koprocesorem a sadou 32bitových celočíselných registrů a taktéž 64bitových registrů pro FPU operace.
Zdroj: Wikipedia

Ovšem v oboru IT (a nejenom zde) platí, že neexistuje žádná stříbrná kulka, přesněji řečeno technologie, která by elegantně vyřešila všechny problémy. I když se okolo roku 1985 zdálo, že procesory RISC předčí všechny další typy mikroprocesorů, ukázalo se později, že klasická architektura RISC má i své limity a proto není její použití v některých oblastech ideální. První limit vychází z pevné délky instrukcí. Aritmetické a logické instrukce musí mít ve svém instrukčním slovu uloženy adresy obou operandů i adresu cíle operace (viz již zmíněný tříadresový kód), nebo i konstantu používanou jako jeden z operandů, popř. jako relativní adresu skoku. Kvůli těmto požadavkům se u klasické architektury RISC používají instrukce s pevnou délkou 32 bitů. Ovšem právě zde leží zmíněný problém limitující výpočetní výkon – pokud se každá instrukce provede v ideálním případě v jednom taktu, musí se také v každém taktu načíst instrukce nová, tj. celých 32 bitů; a to navíc nepočítáme s tím, že se může jednat o instrukci typu Load či Store, která přistupuje k operační paměti za účelem čtení či zápisu obsahu jednoho pracovního registru.

Obrázek 4: Osobní počítač firmy Acorn, který byl vybavený mikroprocesorem s architekturou­ RISC.

3. Velikost programového kódu a využití vyrovnávacích pa­mětí

Tento limit klasické architektury RISC obešli konstruktéři mikroprocesorů zdánlivě jednoduše – použitím vyrovnávacích pamětí (cache). V některých případech tvořily (a doposud tvoří) vyrovnávací paměti hierarchii, protože přímo na čipu byla umístěna rychlá vyrovnávací paměť první úrovně (cache level 1 – L1) a většinou mimo procesorový čip pak vyrovnávací paměť druhé úrovně (cache level 2 – L2). Ovšem spolu s rostoucím výpočetním výkonem mikroprocesorů a nepřímo úměrně klesající délkou strojového cyklu se každý výpadek vyrovnávací paměti (cache miss) citelně projevil na reálném výpočetním výkonu. Situace se samozřejmě ještě zhoršuje při použití multitaskingu, protože se kvůli přepínání úloh zhoršuje lokalita instrukcí i lokalita dat. Z tohoto důvodu používají (nejenom) procesory s architekturou RISC mnohdy velmi sofistikované způsoby, jak zajistit co největší poměr mezi cache hit a cache miss a kapacity vyrovnávacích pamětí taktéž postupně rostou, i když ne stejným tempem, jako kapacity operačních pamětí.

pc9911

Obrázek 5: Server s architekturou Onyx 350.

Taktéž celková délka programů je u klasické architektury RISC většinou delší, než je tomu u architektury CISC, což sice většinou nepůsobí větší problémy při použití těchto mikroprocesorů v pracovních stanicích a serverech (kde je většinou limitujícím faktorem spíše množství dat), ovšem v segmentu vestavných zařízení (například s jádry RISC použitými v mikrořadičích) je již situace poněkud odlišná, protože se jedná o segment velmi citlivý na cenový rozdíl mezi mikrořadiči s rozdílnou kapacitou paměti programu. Výrobci procesorů RISC jsou si tohoto problému samozřejmě vědomi, proto je například u rodiny ARM s instrukčními sadami Thumb a Thumb-2 klasická architektura RISC poněkud upravena takovým způsobem, že se namísto 32bitových instrukcí používají instrukce 16bitové, v nichž jsou některé operandy určeny implicitně a některé kombinace operandů dokonce vůbec není možné použít. Za kratší velikost programového kódu tedy programátoři platí poněkud omezenějším repertoárem instrukcí a nepatrně složitějším/dražším procesorem (ovšem naprostá většina vývojářů je od assembleru a strojového kódu stejně izolována díky překladačům vyšších programovacích jazyků).

Obrázek 6: Mikroskopický pohled na část čipu R2000.

4. Volání subrutin, podmíněné skoky, reakce na přerušení a přepínání kontextu

Další oblastí, v níž se projevuje určitý nedostatek architektury RISC, je volání subrutin, provádění podmíněných skoků, reakce na přerušení a přepínání kontextů, například přepnutí do jiného vlákna nebo dokonce do jiného procesu. Ve všech těchto případech totiž procesor musí vyprázdnit instrukční pipeline a tím pádem přerušit nebo dokončit již rozpracované operace, což může být problematické u těch procesorů, které mají v pipeline vytvořeny „zkratky“ pro zpětné kopírování výsledků aritmetických a logických operací (ostatně zkuste se sami zamyslet nad tím, jak se tento problém řeší v případě, že došlo k programové změně registru PC). U podmíněných skoků znamená vyprázdnění pipeline zpomalení o několik strojových cyklů, což se moderní procesory s architekturou RISC snaží eliminovat využitím již popsaných branch delay slotů (instrukce či více instrukcí uložených ihned po instrukci podmíněného skoku jsou vždy provedeny nezávisle na výsledku vyhodnocení podmínky), prediktorů skoků i dalšími triky. Uvádí se, že při použití branch delay slotů je možné ihned za instrukci skoku v až 70% případů umístit smysluplnou instrukci, jen ve zbývajících 30% se musela použít pseudoinstrukce NOP, například „prázdný“ součet typu ADD Rd, R0, R0.

Obrázek 7: Postupný růst velikosti vyrovnávacích pamětí druhé úrovně u architektury x86.

V některých případech je však mnohem horší zpoždění vznikající při reakci procesoru na přerušení, tj. časový interval mezi přijetím přerušovacího signálu a zavoláním přerušovací rutiny. I zde se musí vyprázdnit instrukční pipeline, navíc je ovšem nutné pro přerušovací rutinu připravit novou sadu pracovních registrů takovým způsobem, aby se při ukončení přerušovací rutiny mohlo řízení vrátit původnímu procesu. Výrobci mikroprocesorů RISC tuto problematiku řeší především využitím registrových oken, použitím záložní sady pracovních registrů, popř.  – například u procesorů ARM Cortex-M3 – i tím, že pracovní registry jsou ve skutečnosti uloženy na zásobníku, což je ovšem technologie v podstatě velmi podobná technologii registrových oken. Ovšem využití těchto technik vede k větší složitosti procesorů, což může být kritické například u mikrořadičů založených na architektuře RISC (na tomto místě je však vhodné poznamenat, že u procesorů CISC bývá reakce na příchod přerušení ještě pomalejší, a to zejména tehdy, pokud je prováděna nějaká složitá instrukce trvající delší počet strojových cyklů).

comp_hist_19_5

Obrázek 8: Chuck Moore jenž je tvůrcem jazyka Forth, který je založen na využití dvojice zásobníků (zásobníku operandů a zásobníku návratových adres).

5. Zásobníkové procesory

Zajímavou i když dnes již málo využívanou alternativou k procesorům s architekturou CISC a současně i k procesorům s architekturou RISC jsou takzvané zásobníkové procesory (stack processors). Tyto typy procesorů, jejichž princip byl mimochodem použit i u některých mainframů a minipočítačů, jsou většinou založeny na dvojici zásobníků (stack, LIFO – Last In First Out), přičemž prvním z těchto zásobníků je zásobník operandů (použitý však taktéž pro předávání parametrů volaným subrutinám), druhým zásobníkem je zásobník návratových adres. Procesory s touto architekturou jsou v naprosté většině případů jednodušší, než typičtí představitelé procesorů CISC a mnohdy jsou taktéž jednodušší, než procesory s architekturou RISC, což je způsobeno několika skutečnostmi. Jedním z důvodů je odlišný formát instrukcí u některých zásobníkových procesorů, které mohou díky absenci adres operandů (viz další kapitolu) využívat takzvané horizontální kódování, které se v mnoha ohledech podobá kódům použitým u mikroinstrukcí (viz též části tohoto seriálu věnované mikroprocesorům vybaveným mikrořadičem).

Obrázek 9: Blokové schéma procesoru WISC CPU/16.
Zdroj: Philip Koopman – Architecture of the WISC CPU/16

Další zjednodušení zásobníkových procesorů vyplývá z toho, že veškeré operace jsou prováděny s dvojicí či trojicí operandů uložených na vrcholu zásobníku, přičemž samotný procesor má několik prvních prvků zásobníku umístěnou v lokálních registrech (může se jednat například o šestnáct prvků, v některých případech však o pouze dva či tři nejvyšší prvky). Ovšem i šestnáct prvků – lokálních registrů – zabírá mnohem menší plochu čipu než například dvanáct překrývajících se registrových oken po 32 pracovních registrech. Zásobníkové procesory se vyznačují i další zajímavou vlastností, například tím, že se u nich počet fází pipeline většinou zmenšuje pouze na dvě fáze (operace). U mnohých zásobníkových procesorů se tedy „klasická RISCová“ pipeline vůbec nepoužívá, což sice znamená, že procesor nedokáže v každém taktu dokončit jednu instrukci, na druhou stranu však instrukce u mnoha zásobníkových procesorů bývají poměrně komplikované, protože se současně provádí větší množství operací.

Obrázek 10: Moduly procesoru WISC CPU/16, v nichž je implementován mikroprogramo­vý řadič.

Poznámka: pokud vás zajímá, jak je možné u zásobníkových procesorů zkrátit jejich instrukční pipeline na pouhé dvě fáze, vyčkejte na následující část tohoto seriálu.

6. Instrukční sada zásobníkových procesorů

Již v předchozí kapitole jsme si naznačili, že se zásobníkové procesory liší od architektury CISCRISC mj. i v použitém formátu instrukcí. Skutečně je tomu tak, protože většina procesorů CISC a všechny procesory RISC mají instrukční sadu, v níž se nachází instrukce pracující s obsahem pracovních registrů, popř. přímo s obsahem nějakým způsobem adresovaných paměťových buněk. Jedná se především o aritmetické a logické instrukce, u nichž je nutné přímo v instrukčním slově rezervovat dostatečný počet bitů na uložení adres operandů – u pracovních registrů se jedná o jejich indexy, v případě použití adresových buněk o absolutní či relativní adresy těchto buněk. Zatímco u procesorů typu RISC se většinou pro aritmetické a logické operace používají pouze pracovní registry, mohou být u procesorů typu CISC použity mnohdy velmi složité (ale i výkonné) adresovací režimy, například ve stylu LEA ECX, [EBX + 4*EAX + offset]. U obou architektur, tj. jak RISC, tak i CISC, se tedy nikoli nezanedbatelná část instrukčního slova musí „obětovat“ pro specifikaci operandů. Pod tímto odstavcem je pro ilustraci ukázán formát instrukcí RISCových procesorů MIPS:

  I-Type (immediate)
  ------------------------------------------------------------
  | 31  26     | 25  21 | 20  16 | 15                      0 |
  ------------------------------------------------------------
  | opcode (6) | rs (5) | rt (5) | offset/konstanta (16)     |
  ------------------------------------------------------------

  J-Type (jump)
  ------------------------------------------------------------
  | 31  26     | 25                                        0 |
  ------------------------------------------------------------
  | opcode (6) | adresa (26)                                 |
  ------------------------------------------------------------

  R-Type (register)
  ------------------------------------------------------------
  | 31  26     | 25  21 | 20  16 | 15  11 | 10  6 | 5      0 |
  ------------------------------------------------------------
  | opcode (6) | rs (5) | rt (5) | rd (5) | shift | operace  |
  ------------------------------------------------------------

Obrázek 11: Subsystém zásobníku operandů (zvýrazněno modrou barvou) a zásobníku návratových adres (zvýrazněno barvou červenou).

Ovšem zcela opačná situace panuje u některých mikroprocesorů majících pouze jeden či dva pracovní registry – akumulátory (například se jedná o slavné osmibitové mikroprocesory Motorola 6800 a MOS 6502) a taktéž u zásobníkových procesorů. U zásobníkových procesorů se pro adresaci operandů aritmetických a logických instrukcí ve skutečnosti mnohdy nemusí „obětovat“ ani jeden bit, protože již z kódu prováděné operace je zřejmé, kolik operandů bude přečteno ze zásobníku (a implicitně se vždy předpokládá, že se bude jednat o operandy umístěné na jeho vrcholu, popř. těsně pod vrcholem). To znamená, že instrukční kódy bývají u zásobníkových procesorů buď velmi krátké (což je případ procesoru F21, kde je každá instrukce uložena pouze v pěti bitech!, vždy čtveřice instrukcí se sdružuje do 20bitového slova), nebo se naopak používá relativně dlouhý instrukční kód (16 bitů či 32 bitů), ovšem prakticky všechny bity jsou v těchto instrukcích použity pro uložení příkazů pro aritmeticko-logickou jednotku, popř. pro adresovací jednotku a jednotky určené pro zvýšení/snížení ukazatelů na vrchol zásobníků.

Obrázek 12: Formát mikroinstrukčního slova procesoru WISC CPU/16, na němž je patrné rozdělení mikroinstrukce na několik samostatných bloků. Adresa další mikroinstrukce je získána na základě obsahu bitů 23, 24 a 25.
Zdroj: Philip Koopman – Architecture of the WISC CPU/16

7. Příklad „horizontální“ instrukční sady zásobníkového procesoru HARRIS RTX 2000

V této kapitole je pro ilustraci ukázána základní struktura instrukční sady zásobníkového mikroprocesoru RTX 2000 navrženého a vyráběného firmou Harris Semiconductor. Instrukce mají pevnou délku šestnáct bitů a mohou být rozděleny do pěti skupin na základě struktury bitových polí, z nichž se každé 16bitové slovo skládá. Nejjednodušší a současně i velmi často používanou instrukcí je instrukce pro volání podprogramu (subrutiny). Tato instrukce obsahuje 15bitovou adresu subrutiny (nejvyšší bit je vždy nulový pro odlišení od ostatních typů instrukcí), ovšem díky zarovnání všech instrukcí na 16 bitů je rozsah paměti programu (nikoli paměti dat!) omezen na 64kB. Procesor však taktéž obsahuje stránkovací jednotku a i zásobník návratových adres má šířku 21 bitů, což znamená, že skutečná kapacita paměti programu je větší, než zmíněných 64kB (konkrétní velikost paměti programu záleží na způsobu zapojení mikroprocesoru). Instrukce pro volání podprogramu má následující tvar (parametry se samozřejmě předávají přes zásobník operandů):

---------------------------------------------------------------------------------
| 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---------------------------------------------------------------------------------
| 0  |              adresa podprogramu ležící v rozsahu 0..32767                |
---------------------------------------------------------------------------------

Obrázek 13: Blokové schéma mikroprocesoru HARRIS RTX 2000. Povšimněte si, že jedním operandem vstupujícím do aritmeticko-logické jednotky je vždy interní registr TOP nesoucí hodnotu prvku uloženou na vrcholu zásobníku. Díky tomu částečně odpadá dekódování instrukce a příprava operandů na vstup do ALU, už jen z toho důvodu, že interní sběrnice YBUS (pravá část schématu) nikdy není blokována nutností přenosu dvou operandů), protože se případný přenos do interního registru TOP provádí přes samostatnou sběrnici TBUS. Podobná struktura se používá i u některých dalších zásobníkových procesorů, naproti tomu první generace mikroprocesorů s architekturou CISC byla vybavena jedinou datovou interní sběrnicí, která se částečně stala úzkým hrdlem procesoru.
Autor: Philip Koopman

Dalším typem instrukcí jsou instrukce pro provedení podmíněného skoku. K dispozici jsou čtyři typy skoků – skok provedený v případě, že je prvek uložený na vrcholu zásobníku roven nule s odstraněním tohoto prvku, stejný skok, ovšem s jeho odstraněním vždy (bez ohledu na podmínku), nepodmíněný relativní skok a skok v případě, že je hodnota speciálního registru INDEX rovna nule (před vyhodnocením podmínky se navíc hodnota tohoto registru automaticky sníží o jedničku, proto se tento typ skoku používá pro implementaci počítaných smyček). Adresa skoku je specifikována devítibitovou adresou přičítanou buď k aktuální paměťové stránce, předchozí stránce, následující stránce nebo stránce číslo 0, v níž jsou většinou umístěny často používané nízkoúrovňové rutiny operačního systému:

---------------------------------------------------------------------------------
| 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---------------------------------------------------------------------------------
| 1  | 0  | 0  |podmínka | stránka |        adresa cíle podmíněného skoku       |
---------------------------------------------------------------------------------

podmínka: 00 - skok při T==0, DROP T
          01 - DROP T, skok při T==0
          10 - nepodmíněný skok
          11 - INDEX--, skok při INDEX==0

Obrázek 14: Slavný kalkulátor HP-35 s RPN (převrácenou Polskou notací) založenou na zásobníku operandů
(35 v názvu tohoto přístroje značí počet tlačítek).

8. Instrukce ALU aneb až čtyři operace zapsané do 16bitového instrukčního slova

Instrukční sada mikroprocesoru RTX 2000 je odvozena od instrukčních sad používaných na starších procesorech Novix NC4016 a MISC M17 a má s těmito předchůdci mnoho společných vlastností, například to, že instrukce mohou v instrukčním kódu obsahovat větší množství operací. Z tohoto důvodu se v technické dokumentaci k zásobníkovým mikroprocesorům většinou nevypisují všechny možné kombinace operací uložených v jedné instrukci, ale pouze instrukční formát. Slučování více operací do jedné instrukce je úkol překladače, podobně jako je tomu u architektury RISC při alokaci pracovních registrů, eliminaci neužitečných branch delay slotů atd. Tento přístup je názorně demonstrován na instrukcích pracujících s aritmeticko-logickou jednotkou, jejichž formát je následující:

---------------------------------------------------------------------------------
| 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
---------------------------------------------------------------------------------
| 1  | 0  | 1  | 0  | výběr operace ALU | inv| -- |ret | 0  | výběr op.shifteru |
---------------------------------------------------------------------------------

Obrázek 15: Zásobníkový mikroprocesor SEAforth-24 optimalizovaný, jak již jeho název napovídá, pro běh programů naprogramovaných ve Forthu.

Právě na instrukčním formátu vypsaném výše je názorně vidět, jak je možné do relativně krátkého šestnáctibitového instrukčního slova vložit příkazy pro provedení hned několika operací. Ve čtyřech bitech instrukčního slova je ve čtyřech bitech specifikována operace prováděná pomocí aritmeticko-logické jednotky:

0000 T (kopie T)
0001 -
0010 T and Y
0011 T nor Y
0100 Y - T
0101 Y - T - borrow
0110 T or Y
0111 T nand Y
1000 T + Y
1001 T + Y + carry
1010 T xor Y
1011 T xnor Y
1100 T - Y
1101 T - Y - borrow
1110 -
1111 Y (kopie Y)

V sedmém bitu je specifikováno, že se výsledek ALU operace má navíc invertovat, což je vlastně operace prováděná „zadarmo“ přímo v aritmeticko-logické jednotce. Zajímavý je pátý bit, který lze použít pro návrat ze subrutiny současně s prováděním ALU operace; opět se tedy jedná o funkci prováděnou bez jakéhokoli zdržování běhu programu (proto se také někdy s nadsázkou říká, že zásobníkové procesory dokážou provést návrat ze subrutiny v nula strojových cyklech). První čtyři bity určují, jaká operace je prováděna ve shifteru s výsledkem vypočteným v aritmeticko-logické jednotce:

bitcoin_skoleni

0000 žádná operace (kopie výsledku)
0001 0 (vynulování)
0010 posun doleva
0011 posun doleva s přenosem
0100 logický posun doprava s přenosem
0101 aritmetický posun doprava s přenosem
0110 logický posun doprava
0111 aritmetický posun doprava
1000-1111 32bitové posuny

Překladač tedy v ideálním případě dokáže do jediného šestnáctibitového slova zapsat čtveřici operací, například součet následovaný inverzí výsledku následovaný aritmetickým posunem doprava a navíc se v průběhu těchto operací (tj. paralelně s výpočtem) provede návrat ze subrutiny. Pokud by se stejná sekvence operací prováděla na některém již popsaném RISCovém procesoru, bylo by ji nutné zakódovat do čtveřice 32bitových slov, což znamená, že zásobníkový procesor je v tomto (nutno opět podotknout, že značně ideálním) případě 8× efektivnější, pokud bereme v úvahu kapacitu obsazené paměti programu.

Obrázek 16: Jeden z prvních kalkulátorů s RPN (převrácenou Polskou notací) od firmy HP (HP 9810).

9. Odkazy na Internetu

  1. Great Microprocessors of the Past and Present
    http://www.cpushac­k.com/CPU/cpu­1.html
  2. Philip Koopman: Stack Computers: the new wave
    http://www.ece­.cmu.edu/~koop­man/stack_com­puters/conten­ts.html
  3. Hewlett Packard PA-8800 RISC (LOSTCIRCUITS)
    http://www.los­tcircuits.com/mam­bo//index.php?op­tion=com_conten­t&task=view&id=42&I­temid=42
  4. PA-RISC 1.1 Architecture and Instruction Set Reference Manual
    http://h21007­.www2.hp.com/por­tal/download/fi­les/unprot/pa­risc/pa1–1/acd.pdf
  5. Fotografie mikroprocesorů HP PA (stránka 1)
    http://www.chip­db.org/cat-pa-risc-592.htm
  6. Fotografie mikroprocesorů HP PA (stránka 2)
    http://www.chip­db.org/cat-pa-risc-592.htm?page=2
  7. Fotografie mikroprocesorů HP PA (stránka 2)
    http://www.chip­db.org/cat-pa-risc-592.htm?page=3
  8. PA-RISC (Wikipedia)
    http://en.wiki­pedia.org/wiki/PA-RISC
  9. The Great CPU List: Part VI: Hewlett-Packard PA-RISC, a conservative RISC (Oct 1986)
    http://jbayko­.sasktelwebsi­te.net/cpu4.html
  10. HP 9000/500 FOCUS
    http://www.open­pa.net/system­s/hp-9000_520.html
  11. HP FOCUS Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/HP_FO­CUS
  12. HP 3000 (Wikipedia)
    http://en.wiki­pedia.org/wiki/HP_3000
  13. The SPARC Architecture Manual Version 8 (manuál v PDF formátu)
    http://www.spar­c.org/standar­ds/V8.pdf
  14. The SPARC Architecture Manual Version 9 (manuál v PDF formátu)
    http://develo­pers.sun.com/so­laris/articles/spar­cv9.pdf
  15. SPARC Pipelining
    http://www.aca­demic.marist.e­du/~jzbv/archi­tecture/Projec­ts/S2002/SPAR­C/pipelining.html
  16. SPARC Instruction
    http://www.aca­demic.marist.e­du/~jzbv/archi­tecture/Projec­ts/S2002/SPAR­C/inst_set.html
  17. OpenSPARC
    http://www.open­sparc.net/
  18. History of SPARC systems 1987 to 2010
    http://www.spar­cproductdirec­tory.com/histo­ry.html
  19. Sun-1 (Wikipedia)
    http://en.wiki­pedia.org/wiki/Sun-1
  20. Sun-2 (Wikipedia)
    http://en.wiki­pedia.org/wiki/Sun-2
  21. Sun-3 (Wikipedia)
    http://en.wiki­pedia.org/wiki/Sun-3
  22. Sun386i (Wikipedia)
    http://en.wiki­pedia.org/wiki/Sun386i
  23. Sun 386i/250
    http://sites.in­ka.de/pcde/si­te/sun386i.html
  24. SPARC Instruction Set
    http://www.aca­demic.marist.e­du/~jzbv/archi­tecture/Projec­ts/S2002/SPAR­C/inst_set.html
  25. MIPS Architecture Overview
    http://tams-www.informatik.uni-hamburg.de/ap­plets/hades/web­demos/mips.html
  26. MIPS Technologies R3000
    http://www.cpu-world.com/CPUs/R3­000/
  27. CPU-collection: IDT R3010 FPU
    http://www.cpu-collection.de/?tn=0&l0­=co&l1=IDT&l2=R3010+F­PU
  28. The MIPS R2000 Instruction Set
    http://suraj.lum­s.edu.pk/~cs423a0­5/Reference/MIP­SCodeTable.pdf
  29. Maska mikroprocesoru RISC 1
    http://www.cs­.berkeley.edu/~pat­trsn/Arch/RIS­C1.jpg
  30. Maska mikroprocesoru RISC 2
    http://www.cs­.berkeley.edu/~pat­trsn/Arch/RIS­C2.jpg
  31. The MIPS Register Usage Conventions
    http://pages.cs­.wisc.edu/~cs354–2/beyond354/con­ventions.html
  32. C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
    http://www.eec­s.berkeley.edu/Pub­s/TechRpts/1982/CSD-82–106.pdf
  33. Berkeley RISC
    http://en.wiki­pedia.org/wiki/Ber­keley_RISC
  34. Great moments in microprocessor history
    http://www.ib­m.com/developer­works/library/pa-microhist.html
  35. Microprogram-Based Processors
    http://resear­ch.microsoft.com/en-us/um/people/gbe­ll/Computer_Struc­tures_Principles_an­d_Examples/csp0167­.htm
  36. A Brief History of Microprogramming
    http://www.cs­.clemson.edu/~mar­k/uprog.html
  37. Architecture of the WISC CPU/16
    http://www.ece­.cmu.edu/~koop­man/stack_com­puters/sec4_2­.html
  38. Zásobníkový procesor WISC CPU/16 (Root.CZ)
    http://www.ro­ot.cz/clanky/pro­gramovaci-jazyk-forth-a-zasobnikove-procesory-16/#k03
  39. Writable instruction set, stack oriented computers: The WISC Concept
    http://www.ece­.cmu.edu/~koop­man/forth/roches­ter87.pdf
  40. The Great CPU List: Part X: Hitachi 6301 – Small and microcoded (1983)
    http://jbayko­.sasktelwebsi­te.net/cpu2.html#Sec2Par­t10
  41. What is RISC?
    http://www-cs-faculty.stanfor­d.edu/~erober­ts/courses/so­co/projects/2000–01/risc/whatis/
  42. RISC vs. CISC
    http://www-cs-faculty.stanfor­d.edu/~erober­ts/courses/so­co/projects/2000–01/risc/risccisc/
  43. RISC and CISC definitions:
    http://www.cpushac­k.com/CPU/cpu­AppendA.html
  44. The Evolution of RISC
    http://www.ib­m.com/developer­works/library/pa-microhist.html#si­debar1
  45. SPARC Processor Family Photo
    http://thenet­workisthecompu­ter.com/site/?p=243
  46. SPARC: Decades of Continuous Technical Innovation
    http://blogs.o­racle.com/onthe­record/entry/spar­c_decades_of_con­tinuous_techni­cal
  47. The SPARC processors
    http://www.top500­.org/2007_over­view_recent_su­percomputers/spar­c_processors
  48. Maurice V. Wilkes Home Page
    http://www.cl­.cam.ac.uk/ar­chive/mvw1/
  49. Papers by M. V. Wilkes (důležitá je především jeho práce číslo 35)
    http://www.cl­.cam.ac.uk/ar­chive/mvw1/list-of-papers.txt
  50. Microprogram Memory
    http://free-books-online.org/com­puters/advanced-computer-architecture/mi­croprogram-memory/
  51. First Draft of a report on the EDVAC
    http://qss.stan­ford.edu/~god­frey/vonNeuman­n/vnedvac.pdf
  52. Introduction to Microcontrollers
    http://www.pic24mi­cro.com/cisc_vs_ris­c.html
  53. Reduced instruction set computing (Wikipedia)
    http://en.wiki­pedia.org/wiki/Re­duced_instruc­tion_set_compu­ter
  54. MIPS architecture (Wikipedia)
    http://en.wiki­pedia.org/wiki/MIP­S_architecture
  55. Very long instruction word (Wikipedia)
    http://en.wiki­pedia.org/wiki/Ve­ry_long_instruc­tion_word
  56. Classic RISC pipeline (Wikipedia)
    http://en.wiki­pedia.org/wiki/Clas­sic_RISC_pipe­line
  57. R2000 Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/R2000_(mi­croprocessor)
  58. R3000 Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/R3000
  59. R4400 Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/R4400
  60. R8000 Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/R8000
  61. R10000 Microprocessor (Wikipedia)
    http://en.wiki­pedia.org/wiki/R10000
  62. SPARC (Wikipedia)
    http://en.wiki­pedia.org/wiki/Sparc
  63. SPARC Tagged Data – otázka
    http://compiler­s.iecc.com/com­parch/article/91–04–079
  64. SPARC Tagged Data – odpověď #1
    http://compiler­s.iecc.com/com­parch/article/91–04–082
  65. SPARC Tagged Data – odpověď #2
    http://compiler­s.iecc.com/com­parch/article/91–04–088
  66. CPU design (Wikipedia)
    http://en.wiki­pedia.org/wiki/CPU_de­sign
  67. Control unit (Wikipedia)
    http://en.wiki­pedia.org/wiki/Con­trol_unit
  68. Microcode (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mi­crocode
  69. Microsequencer (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mi­crosequencer
  70. Maurice Wilkes (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mau­rice_Wilkes
  71. Micro-operation (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mi­cro-operation

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.