Obsah
1. RISCová architektura PowerPC: matematický koprocesor
2. Podporované formáty numerických hodnot s plovoucí řádovou čárkou
3. Pracovní registry používané matematickým koprocesorem
4. Zaokrouhlovací režimy vybírané při práci s plovoucí řádovou čárkou
5. Výjimky, které mohou při výpočtech nastat
6. Instrukce typu LOAD a STORE s FP registry
7. Základní aritmetické instrukce s FP registry
8. Přesuny dat mezi pracovními registry s provedením vybrané operace
9. Instrukce typu Multiply-Add a Multiply-Subtract
10. Porovnání operandů a nastavení příznakových bitů
1. RISCová architektura PowerPC: matematický koprocesor
V dnešní části článku o mikroprocesorech s architekturou PowerPC si popíšeme základní vlastnosti třetího (a současně i posledního) modulu CPU, který je určen pro provádění operací s numerickými hodnotami s plovoucí řádovou čárkou (první modul se staral o provádění skoků a modul druhý o operace s celočíselnými hodnotami). Mikroprocesory s architekturou PowerPC podporují práci s formáty single i double definované ve známé normě IEEE 754, která je mimochodem v platnosti již od roku 1985 a teprve relativně nedávno se dočkala svého doplnění a upřesnění. V normě IEEE 754 jsou specifikovány nejenom vlastní formáty uložení numerických hodnot v systému pohyblivé/plovoucí řádové čárky (FP formátu), ale i pravidla pro implementaci aritmetických operací s těmito hodnotami, včetně některých konverzí a zaokrouhlování. Konkrétně je v této normě popsáno:
- Základní (basic) a rozšířený (extended) formát uložení numerických hodnot.
- Způsob provádění základních matematických operací:
- součet
- rozdíl
- součin
- podíl
- zbytek po dělení
- druhá odmocnina
- porovnání
- Pravidla pro konverze prováděné mezi celočíselnými formáty (integer) a formáty s plovoucí řádovou čárkou.
- Způsob konverze mezi různými formáty s plovoucí řádovou čárkou (single → double atd.).
- Způsob konverze základního formátu s plovoucí řádovou čárkou na řetězec číslic (včetně nekonečen a nečíselných hodnot).
- Práce s hodnotami NaN (Not a Number) a výjimkami. Viz též další kapitoly, kde se těmito vlastnostmi budeme zabývat z pohledu procesorů PowerPC.
2. Podporované formáty numerických hodnot s plovoucí řádovou čárkou
Vybraná podmnožina racionálních čísel může být vyjádřena vztahem:
XFP=(-1)s × 2exp-bias × m
kde:
- XFP značí reprezentovanou numerickou hodnotu z podmnožiny racionálních čísel (ta je zase podmnožinou čísel reálných). Díky vyhrazeným (speciálním) hodnotám je možné rozlišit kladnou a zápornou nulu a dokonce i kladné a záporné nekonečno. Také se může reprezentovat nečíselná hodnota: NaN – (Not a Number), která je výsledkem některých matematicky nedefinovaných operací, například 0/0 nebo 00 (opět viz navazující kapitoly).
- 2 je báze, někdy také nazývaná radix, u IEEE 754 je to vždy dvojka, protože výpočty s bází dvě jsou pro číslicové obvody nejjednodušší. V minulosti se používaly i jiné báze, například 8, 16 nebo i 10.
- exp je vždy kladná hodnota exponentu posunutého o hodnotu bias
- bias je hodnota, díky které je uložený exponent vždy kladný. Tato hodnota se většinou volí dle vztahu: bias=2eb-1-1, kde eb je počet bitů vyhrazených pro exponent. Pro specifické účely je však možné zvolit i jinou hodnotu.
- m je mantisa, která je u formátů IEEE 754 vždy kladná
- s je znaménkový bit nabývající hodnoty 0 nebo 1. Pokud je tento bit nulový, je reprezentovaná hodnota XFP kladná, v opačném případě se jedná o zápornou hodnotu. Vzhledem k tomu, že je jeden bit vyhrazen na uložení znaménka, je možné rozlišit kladnou a zápornou nulu.
Podle bitové šířky čísel exp, bias a m se rozlišují základní a rozšířené formáty FP čísel; norma IEEE 754 přitom explicitně zmiňuje dva základní formáty: jednoduchá přesnost (single, též jen float) a dvojitá přesnost (double).
Formát single používá pro uložení numerických hodnot 32 bitová slova, přičemž oněch 32 bitů je rozděleno do třech částí. V první části (představované nejvyšším bitem) je uloženo znaménko, následuje osm bitů pro uložení posunutého exponentu a za nimi je zbývajících 23 bitů, které slouží pro uložení mantisy. Celé třiceti dvou bitové slovo s FP hodnotou tedy vypadá následovně:
bit | 31 | 30 29 … 24 23 | 22 21 … 3 2 1 0 |
---|---|---|---|
význam | s | exponent (8 bitů) | mantisa (23 bitů) |
FP formát dvojité přesnosti (double), jež je definovaný taktéž normou IEEE 754, se v mnohém podobá formátu s jednoduchou přesností (single), pouze se zdvojnásobil celkový počet bitů, ve kterých je hodnota uložena, tj. místo 32 bitů se používá 64 bitů. Právě to je příčinou, proč se tento formát nazývá double, ve skutečnosti je přesnost více než dvojnásobná. 64 bitů alokovaných pro FP hodnotu je v tomto případě rozděleno následujícím způsobem:
- 1 bit pro znaménko
- 11 bitů pro exponent
- 52 bitů pro mantisu
Bitově vypadá rozdělení následovně:
bit | 63 | 62 … 52 | 51 … 0 |
---|---|---|---|
význam | s | exponent (11 bitů) | mantisa 52( bitů) |
Povšimněte si, že díky tomu, že nejvyšší bit přímo udává znaménko uložené hodnoty, je provedení operace typu -x, abs(x) či -abs(x) velmi snadné. Právě tyto operace jsou na architektuře PowerPC dostupné „zadarmo“ při přenosech dat. Podrobnosti si řekneme v osmé kapitole.
3. Pracovní registry používané matematickým koprocesorem
Podobně, jako je tomu u mnoha (přesněji řečeno u převážné většiny) dalších RISCových architektur, například u architektury SPARC, PA-RISC, RISC-V a samozřejmě i ARM, se i v PowerPC všechny aritmetické operace s numerickými hodnotami s plovoucí řádovou čárkou provádí nad obsahem pracovních registrů a nikoli (například) nad položkami uloženými v zásobníku operandů, jak se to provádělo například u originálního matematického koprocesoru Intel 8087. Pokud se tedy má aplikovat jakákoli FP operace, je nejdříve nutné načíst příslušné operandy do vybraných pracovních registrů, aplikovat požadované operace a popř. provést zpětný zápis do operační paměti.
Pro FP operace se používá sada třiceti dvou pracovních registrů nazvaných FPR0 až FPR31, přičemž každý z těchto registrů má šířku 64 bitů a umožňuje tedy nativně provádět veškeré operace s dvojnásobnou přesností (double). Interně se většina operací (až na vybrané operace aritmetické) provádí právě s hodnotami typu double, přičemž některé instrukce typu LOAD a STORE dokážou při načítání či naopak ukládání numerických dat automaticky provést konverzi single→double či double→single. Vzhledem k počtu pracovních registrů je v instrukčních slovech pro uložení indexu registru popř. registrů, s nimiž se má provést nějaká operace, rezervováno pět bitů.
4. Zaokrouhlovací režimy vybírané při práci s plovoucí řádovou čárkou
U mnoha aritmetických operací je nutné provést zaokrouhlení výsledku před jeho uložením zpět do vybraného pracovního registru. Vzhledem k tomu, že zaokrouhlování může poměrně zásadním způsobem ovlivnit výsledky některých výpočtů (iterativní součet mnoha členů nějaké řady atd.), lze na architektuře PowerPC zvolit, jakým způsobem se má zaokrouhlování provádět. Samozřejmě se nejedná o zaokrouhlování na celá čísla, ale – poněkud zjednodušeně řečeno – o volbu hodnoty posledního bitu mantisy. Ve stavovém a řídicím registru FPSCR je zaokrouhlovací režim určen dvěma bity, jejichž kombinací lze vybrat tyto režimy:
# | Bitová kombinace | Význam |
---|---|---|
1 | 00 | zaokrouhlení k nejbližší reprezentovatelné hodnotě |
2 | 01 | zaokrouhlení směrem k nule |
3 | 10 | zaokrouhlení směrem k +∞ |
4 | 11 | zaokrouhlení směrem k -∞ |
V případě prvního režimu může nastat situace, kdy jsou obě „nejbližší“ reprezentovatelné hodnoty od výsledku vzdáleny stejně. Potom se vybere ta hodnota, jejíž nejnižší bit je nulový.
5. Výjimky, které mohou při výpočtech nastat
Při výpočtech s FP hodnotami může nastat hned několik výjimek, které se na procesorech s architekturou PowerPC budou korektně detekovat a nastaví se příslušné bity v řídicím a příznakovém registru FPSCR. Jedná se o následující typy výjimek:
# | Operace, která vyvolá výjimku |
---|---|
1 | Operace s hodnotou SNaN (Signalling Nan), která vznikla v důsledku nějaké předchozí nepovolené operace |
2 | Operace ∞-∞ (rozdíl dvou nekonečen) |
3 | Operace ∞/∞ (podíl dvou nekonečen) |
4 | Operace 0/0 (podíl dvou nul) |
5 | Operace ∞×0 |
6 | Porovnání libovolné hodnoty s NaN |
7 | Druhá odmocnina ze záporné hodnoty |
8 | Konverze příliš velké hodnoty (vznikne NaN nebo nekonečno) |
Poznámka: kladné i záporné nekonečno je výsledkem mnoha přesně definovaných operací (například dělení libovolné nenulové hodnoty nulou) a kromě zmíněných speciálních případů se nekonečno může v aritmetických operacích bez větších problémů použít. To znamená, že následující operace lze aplikovat bez vzniku výjimky:
# | Operace, která nevyvolá výjimku |
---|---|
1 | Operace ∞+∞ (součet dvou nekonečen) |
2 | Operace ∞*∞ (součin dvou nekonečen) |
3 | Operace x/0 (x!=0) |
4 | Operace ∞×x (x!=0) |
Poznámka: pokud x>0, pak je výsledkem operace x/0 hodnota ∞, pokud x<0, pak je výsledkem podle očekávání hodnota -∞. Totéž platí i pro operaci ∞×x.
6. Instrukce typu LOAD a STORE s FP registry
Instrukce, které slouží pro přenos numerických hodnot reprezentovaných v systému plovoucí řádové čárky mezi registry a operační pamětí, lze rozdělit podle směru přenosu (LOAD a STORE), typu operandů uložených v operační paměti (single, double), adresového režimu (Rx+offset, Rx+Ry) a taktéž podle toho, zda se registr určený pro adresování naplní novou hodnotou či nikoli (autoinkrementace, autodekrementace). Nejprve si uveďme tabulku s instrukcemi určenými pro načtení hodnot z operační paměti:
# | Instrukce | Význam |
---|---|---|
1 | lfs | načtení a konverze hodnoty typu single z adresy Rx+offset |
2 | lfsx | načtení a konverze hodnoty typu single z adresy Rx+Ry |
3 | lfsu | jako instrukce lfs, ovšem dojde k úpravě registru Rx (Rx=Rx+D) |
4 | lfsux | jako instrukce lfsx, ovšem dojde k úpravě registru Rx (Rx=Rx+Ry) |
5 | lfd | načtení hodnoty typu double z adresy Rx+offset |
6 | lfdx | načtení hodnoty typu double z adresy Rx+Ry |
7 | lfdu | jako instrukce lfd, ovšem dojde k úpravě registru Rx (Rx=Rx+D) |
8 | lfdux | jako instrukce lfdx, ovšem dojde k úpravě registru Rx (Rx=Rx+Ry) |
Offset je šestnáctibitová konstanta uložená přímo v instrukčním slovu a lze ji použít pro autoinkrementaci či autodekrementaci registru Rx, například při průchodu polem (D=4 nebo 8).
Následují instrukce určené pro uložení operandů do operační paměti:
# | Instrukce | Význam |
---|---|---|
1 | stfs | konverze na single a uložení hodnoty na adresu Rx+offset |
2 | stfsx | konverze na single a uložení hodnoty na adresu Rx+Ry |
3 | stfsu | jako instrukce stfs, ovšem dojde k úpravě registru Rx (Rx=Rx+D) |
4 | stfsux | jako instrukce stfsx, ovšem dojde k úpravě registru Rx (Rx=Rx+Ry) |
5 | stfd | odpovídá stfs, ovšem pro typ double |
6 | stfdx | odpovídá stfsx, ovšem pro typ double |
7 | stfdu | odpovídá stfsu, ovšem pro typ double |
8 | stfdux | odpovídá stfsux, ovšem pro typ double |
I u těchto instrukcí můžeme vidět použití offsetu společně s operací „update“ (instrukce, které obsahují znak u ve svém názvu.
7. Základní aritmetické instrukce s FP registry
Nabídka základních aritmetických operací pravděpodobně nebude příliš překvapivá, protože na architektuře PowerPC nalezneme všechny čtyři základní operace: součet, rozdíl, součet i podíl. Povšimněte si, že je možné si vybrat, zda bude výsledek reprezentován typem single či double (a to i když pracovní registry mají konstantní šířku 64 bitů). Všechny základní aritmetické operace používají tři pracovní registry – dva registry zdrojové a jeden registr cílový:
# | Instrukce | Význam |
---|---|---|
1 | fadd | provedení operace FPRt=FPRa+FPRb |
2 | fadds | provedení operace FPRt=FPRa+FPRb (single) |
3 | fsub | provedení operace FPRt=FPRa-FPRb |
4 | fsubs | provedení operace FPRt=FPRa-FPRb (single) |
5 | fmul | provedení operace FPRt=FPRa*FPRb |
6 | fmuls | provedení operace FPRt=FPRa*FPRb (single) |
7 | fdiv | provedení operace FPRt=FPRa/FPRb |
8 | fdivs | provedení operace FPRt=FPRa/FPRb (single) |
Následuje seznam volitelných instrukcí, které můžeme (ale taktéž nemusíme) na procesorech PowerPC nalézt. Zajímavé jsou instrukce, které rychle odhadnou výsledek operace se zaručenou minimální přesností:
# | Instrukce | Význam |
---|---|---|
1 | fsqrt | výpočet druhé odmocniny (double) |
2 | fsqrts | výpočet druhé odmocniny (single) |
3 | fre | odhad operace FPRt=1/FPRa se známou přesností |
4 | fres | odhad operace FPRt=1/FPRa (single) |
5 | frsqrte | odhad operace výpočtu druhé odmocniny se známou přesností |
6 | frsqrtes | odhad operace výpočtu druhé odmocniny se známou přesnosti (single) |
8. Přesuny dat mezi pracovními registry s provedením vybrané operace
Zajímavé jsou instrukce, které jsou určené pro přesuny dat mezi pracovními registry FPRx. V instrukčních slovech těchto instrukcí je uložen index zdrojového registru a index registru cílového. Ovšem kromě toho je v případě potřeby možné při přesunu dat na hodnotu aplikovat jednu ze tří jednoduchých a tudíž i rychlých operací:
# | Instrukce | Význam |
---|---|---|
1 | fmr | provedení operace FPRt=FPRx |
2 | fneg | provedení operace FPRt=-FPRx |
3 | fabs | provedení operace FPRt=abs(FPRx) |
4 | fnabs | provedení operace FPRt=-abs(FPRx) |
Povšimněte si, že všechny prováděné operace pouze manipulují se znaménkem (nejvyšším bitem):
# | Instrukce | Bit s |
---|---|---|
1 | fmr | kopie |
2 | fneg | negace |
3 | fabs | vynulování |
4 | fnabs | nastavení (na 1) |
9. Instrukce typu Multiply-Add a Multiply-Subtract
Na mikroprocesorech s architekturou PowerPC nalezneme i v mnoha případech velmi užitečné instrukce, v nichž se provádí operace násobení společně s operací součtu či rozdílu. Tyto instrukce je možné využít v několika aplikačních oblastech, například při implementaci různých číslicových filtrů atd. Zajímavé je, že všechny instrukce tohoto typu mají v instrukčním slově zakódovány indexy hned čtyř pracovních registrů – tří registrů zdrojových a jednoho registru cílového. Bližší informace jsou uvedeny v následující tabulce:
# | Instrukce | Prováděný výpočet |
---|---|---|
1 | fmadd | FPRt = FPRa×FPRc + FPRb |
2 | fmadds | dtto pro single |
3 | fmsub | FPRt = FPRa×FPRc – FPRb |
4 | fmsubs | dtto pro single |
1 | fnmadd | FPRt = -(FPRa×FPRc + FPRb) |
2 | fnmadds | dtto pro single |
3 | fnmsub | FPRt = -(FPRa×FPRc – FPRb) |
4 | fnmsubs | dtto pro single |
Číslicový filtr lze tedy realizovat například kombinací instrukcí lfdu, fmadd a stfdu.
10. Porovnání operandů a nastavení příznakových bitů
V instrukční sadě nalezneme i dvojici instrukcí určených pro porovnání obsahu dvou pracovních registrů a nastavení příslušných příznaků v příznakovém registru FPCC. Jedná se o následující dvě instrukce:
# | Instrukce | Význam |
---|---|---|
1 | fcmpu | porovnání obsahu dvou pracovních registrů |
2 | fcmpo | porovnání obsahu dvou pracovních registrů, odlišné zpracování NaN |
Nastavované příznaky (porovnání dvou hodnot odlišných od NaN):
Bit v FPCC.CR | Jméno | Význam |
---|---|---|
0 | FL | FPRa < FPRb |
1 | FG | FPRa > FPRb |
2 | FE | FPRa == FPRb |
3 | FU | nelze porovnat (unordered) |
Poznámka 1: za všech okolností je vždy nastaven pouze jeden z těchto příznaků, ostatní tři příznaky jsou vynulovány.
Poznámka 2: bit FU se nastaví ve chvíli, kdy je alespoň jedna z porovnávaných hodnot NaN. To platí i ve chvíli, kdy se porovnávají dvě hodnoty NaN (jinými slovy platí NaN != NaN).
11. Konverze dat
Poslední skupinou instrukcí jsou instrukce sloužící pro konverzi dat. Těchto instrukcí existuje celá řada a jsou vypsány v následující tabulce. Každá instrukce obsahuje specifikaci zdrojového a cílového registru (konverzi tedy není nutné provádět „in situ“):
# | Instrukce | Význam |
---|---|---|
1 | frsp | konverze double→single |
2 | fctid | konverze double→integer (64bit integer) |
3 | fctidz | dtto, ale vždy se provede zaokrouhlení směrem k nule |
4 | fctiw | konverze double→integer (32bit integer) |
5 | fctidz | dtto, ale vždy se provede zaokrouhlení směrem k nule |
6 | fcfid | konverze integer→double (64bit integer) |
U instrukcí fctid a fctiw je použit zaokrouhlovací režim nastavený globálně.
12. Odkazy na Internetu
- Procesory RISC v pracovních stanicích a serverech – architektura SPARC V8 a
http://www.root.cz/clanky/procesory-risc-v-pracovnich-stanicich-a-serverech-architektura-sparc-v8-a-v9/ - Procesory RISC v pracovních stanicích a serverech – architektura PA-RISC
http://www.root.cz/clanky/procesory-risc-v-pracovnich-stanicich-a-serverech-architektura-pa-risc/ - Rozšíření instrukční sady procesorových jader s otevřenou architekturou RISC-V
http://www.root.cz/clanky/rozsireni-instrukcni-sady-procesorovych-jader-s-otevrenou-architekturou-risc-v/ - Práce s hodnotami s plovoucí řádovou čárkou na mikroprocesorech ARM
http://www.root.cz/clanky/prace-s-hodnotami-s-plovouci-radovou-carkou-na-mikroprocesorech-arm/ - Simplified PowerPC Instruction Set
http://www.ds.ewi.tudelft.nl/vakken/in101/labcourse/instruction-set/ - Assembly language for Power Architecture, Part 1: Programming concepts and beginning PowerPC instructions
http://www.ibm.com/developerworks/linux/library/l-powasm1/index.html - Assembly language for Power Architecture, Part 2: The art of loading and storing on PowerPC
http://www.ibm.com/developerworks/linux/library/l-powasm2/index.html - Assembly language for Power Architecture, Part 3: Programming with the PowerPC branch processor
http://www.ibm.com/developerworks/library/l-powasm3/index.html - Assembly language for Power Architecture, Part 4: Function calls and the PowerPC 64-bit ABI
http://www.ibm.com/developerworks/linux/library/l-powasm4/index.html - PowerPC overview (poněkud starší materiály z roku 2006)
http://titancity.com/articles/ppc.html - PowerPC (Wikipedia)
https://en.wikipedia.org/wiki/PowerPC - Status Register
https://en.wikipedia.org/wiki/Status_register - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - RISC-V Draft Sompressed ISA Version 1.9 Released
https://blog.riscv.org/2015/11/risc-v-draft-compressed-isa-version-1–9-released/ - RISC vs. CISC: the Post-RISC Era
http://archive.arstechnica.com/cpu/4q99/risc-cisc/rvc-1.html - Introduction to ARM Thumb
http://www.embedded.com/electronics-blogs/beginner-s-corner/4024632/Introduction-to-ARM-thumb - Code Size – a comprehensive comparison of microMIPS32 and Thumb code size using many Megabytes of customer code
https://community.arm.com/groups/processors/blog/2014/04/28/code-size-a-comprehensive-comparison-of-micromips32-and-thumb-code-size-using-many-megabytes-of-customer-code - MIPS MCUs Outrun ARM
http://www.linleygroup.com/newsletters/newsletter_detail.php?num=5117 - Improving Energy Efficiency and Reducing Code Size with RISC-V Compressed
http://www.eecs.berkeley.edu/~waterman/papers/ms-thesis.pdf - An Introduction to Lock-Free Programming
http://preshing.com/20120612/an-introduction-to-lock-free-programming/ - Sequential consistency
https://en.wikipedia.org/wiki/Sequential_consistency - Understanding Atomic Operations
https://jfdube.wordpress.com/2011/11/30/understanding-atomic-operations/ - Load-link/store-conditional
https://en.wikipedia.org/wiki/Load-link/store-conditional - The RISC-V Compressed Instruction Set Manual (Pozor: verze 1.7)
http://riscv.org/spec/riscv-compressed-spec-v1.7.pdf - Carry bits, The Architect's Trap
http://yarchive.net/comp/carry_bit.html - Microprocessor Design/ALU Flags
https://en.wikibooks.org/wiki/Microprocessor_Design/ALU_Flags - Flags register in an out-of-order processor
http://cs.stackexchange.com/questions/42095/flags-register-in-an-out-of-order-processor - AMD Am29000
https://en.wikipedia.org/wiki/AMD_Am29000 - Status register
https://en.wikipedia.org/wiki/Status_register - AMD Am29000 microprocessor family
http://www.cpu-world.com/CPUs/29000/ - AMD 29k (Streamlined Instruction Processor) ID Guide
http://www.cpushack.com/Am29k.html - AMD Am29000 (Wikipedia)
http://en.wikipedia.org/wiki/AMD_Am29000 - AMD K5 („K5“ / „5k86“)
http://www.pcguide.com/ref/cpu/fam/g5K5-c.html - Comparing four 32-bit soft processor cores
http://www.eetimes.com/author.asp?section_id=14&doc_id=1286116 - RISC-V Instruction Set
http://riscv.org/download.html#spec_compressed_isa - RISC-V Spike (ISA Simulator)
http://riscv.org/download.html#isa-sim - RISC-V (Wikipedia)
https://en.wikipedia.org/wiki/RISC-V - David Patterson (Wikipedia)
https://en.wikipedia.org/wiki/David_Patterson_(computer_scientist) - OpenRISC (oficiální stránky tohoto projektu)
http://openrisc.io/ - OpenRISC architecture
http://openrisc.io/architecture.html - Emulátor OpenRISC CPU v JavaScriptu
http://s-macke.github.io/jor1k/demos/main.html - OpenRISC (Wikipedia)
https://en.wikipedia.org/wiki/OpenRISC - OpenRISC – instrukce
http://sourceware.org/cgen/gen-doc/openrisc-insn.html - OpenRISC – slajdy z přednášky o tomto projektu
https://iis.ee.ethz.ch/~gmichi/asocd/lecturenotes/Lecture6.pdf - Maska mikroprocesoru RISC 1
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC1.jpg - Maska mikroprocesoru RISC 2
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC2.jpg - C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
http://www.eecs.berkeley.edu/Pubs/TechRpts/1982/CSD-82–106.pdf - Berkeley RISC
http://en.wikipedia.org/wiki/Berkeley_RISC - Great moments in microprocessor history
http://www.ibm.com/developerworks/library/pa-microhist.html - Microprogram-Based Processors
http://research.microsoft.com/en-us/um/people/gbell/Computer_Structures_Principles_and_Examples/csp0167.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - A Brief History of Microprogramming
http://www.cs.clemson.edu/~mark/uprog.html - What is RISC?
http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000–01/risc/whatis/ - RISC vs. CISC
http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000–01/risc/risccisc/ - RISC and CISC definitions:
http://www.cpushack.com/CPU/cpuAppendA.html - FPGA
https://cs.wikipedia.org/wiki/Programovateln%C3%A9_hradlov%C3%A9_pole - The Evolution of RISC
http://www.ibm.com/developerworks/library/pa-microhist.html#sidebar1 - SPARC Processor Family Photo
http://thenetworkisthecomputer.com/site/?p=243 - SPARC: Decades of Continuous Technical Innovation
http://blogs.oracle.com/ontherecord/entry/sparc_decades_of_continuous_technical - The SPARC processors
http://www.top500.org/2007_overview_recent_supercomputers/sparc_processors - Reduced instruction set computing (Wikipedia)
http://en.wikipedia.org/wiki/Reduced_instruction_set_computer - MIPS architecture (Wikipedia)
http://en.wikipedia.org/wiki/MIPS_architecture - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - Classic RISC pipeline (Wikipedia)
http://en.wikipedia.org/wiki/Classic_RISC_pipeline - R2000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R2000_(microprocessor) - R3000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R3000 - R4400 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R4400 - R8000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R8000 - R10000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R10000 - SPARC (Wikipedia)
http://en.wikipedia.org/wiki/Sparc - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Control unit (Wikipedia)
http://en.wikipedia.org/wiki/Control_unit