RISCové mikroprocesory s komprimovanými instrukčními sadami

15. 12. 2015
Doba čtení: 19 minut

Sdílet

 Autor: Derrick Coetzee, podle licence: Public Domain CC0
Při popisu mikroprocesorů s RISCovou architekturou jsme se již zmínili o použití těchto čipů v mikrořadičích či SoC, což je oblast, pro kterou původní RISCy nebyly navrženy. A právě v této oblasti se ukazuje, jak může být výhodné používat instrukční sady s kratšími „komprimovanými“ instrukcemi.

Obsah

1. RISCové mikroprocesory s komprimovanými instrukčními sadami

2. Stručná charakteristika „klasických“ RISCových architektur

3. Přednosti „klasických“ RISCových architektur

4. Přechod do světa embedded CPU a mikrořadičů

5. Umění kompromisu

6. Způsoby přepínání mezi klasickou a komprimovanou instrukční sadou

7. Instrukční sada MIPS16e

8. Pracovní a speciální registry používané v instrukční sadě MIPS16e

9. Speciální instrukce EXTEND

10. Podmíněné skoky v instrukční sadě MIPS16e

11. Seznam instrukcí v sadě MIPS16e

12. Odkazy na Internetu

1. RISCové mikroprocesory s komprimovanými instrukčními sadami

Již v několika článcích, v nichž jsme se věnovali problematice mikroprocesorových jader s architekturou RISC, jsme se zmínili o použití těchto mikroprocesorů v různých embedded zařízeních, mikrořadičích (MCU) či SoC (System on Chip). Tato aplikační oblast se hned v několika ohledech liší od oblasti, pro kterou byla původní „klasická“ RISCová architektura navržena, tj. pro výkonné pracovní stanice, servery a počítače specializované na provádění rychlých výpočtů. Právě z tohoto určitého rozporu v použití procesorů RISC v současnosti plyne i snaha použít v moderních RISC různé „komprimované“ instrukční sady, což je označení pro takové instrukční sady (či mnohem častěji doplnění původních instrukčních sad), v nichž se vyskytují instrukce s kratšími instrukčními slovy o šířce šestnáct bitů, zatímco klasické RISCové architektury používají 32bitová instrukční slova. V dnešním článku i navazujícím článku se zmíníme o některých vlastnostech komprimovaných instrukčních sad MIPS16e, ARM Thumb a RISC-V „C“.

pc107

Obrázek 1: Jedna z prvních verzí v minulosti velmi oblíbeného osmibitového mikroprocesoru Zilog Z80 s komplexní instrukční sadou (CISC).

2. Stručná charakteristika „klasických“ RISCových architektur

Při zpětném pohledu do historie mikroprocesorů a jejich instrukčních sad je zajímavé si položit otázku, co vlastně vedlo ke vzniku architektury RISC, když minimálně první tři generace mikroprocesorů byly většinou založeny na mikroprogramovém řadiči a CISC instrukcích s mnohdy velmi komplikovaným kódováním a chováním, které (alespoň teoreticky) mohly přiblížit assembler k vyšším programovacím jazykům.

Obrázek 2: I 32bitový mikroprocesor AMD 386DX je typickým zástupcem mikroprocesorů s komplexní instrukční sadou – CISC.

Na základě několika paralelně běžících výzkumů provedených jak v akademických institucích, tak i například vedených interně ve firmě IBM a CDC se zjistilo, že většina vývojářů programujících v assembleru a navíc i naprostá většina tehdejších překladačů nevyužívá ani zdaleka všechny dostupné instrukce a jejich adresní režimy – na mnoha platformách se využívalo přibližně jen 30% všech možných instrukčních kódů. Konstruktéři procesorů, resp. přesněji řečeno návrháři instrukčních sad si uvědomili, že investice do složitého procesoru typu CISC je vlastně v mnoha případech zbytečná, protože jeho velká část zůstane nevyužita. Navíc byly CISC procesory kvůli mikroprogramovému řadiči poměrně složité (i když mnohem méně složité, než v případě použití obvodového řadiče) a tak se některé firmy i akademické instituce začaly poohlížet po odlišné konstrukci procesorů – tyto procesory byly teprve o několik let později souhrnně označeny zkratkou RISC neboli Reduced Instruction Set Code (v některých případech se tato zkratka taktéž používala ve významu Reduced Instruction Set Computer).

Obrázek 3: Mikroprocesor PA RISC firmy Hewlett-Packard, který je zde zobrazen spolu s dalšími podpůrnými obvody a paměťmi cache.

Zatímco při návrhu procesorů typu CISC se jejich konstruktéři řídili filozofií „more is better“ (asi nejvíce se tato koncepce uplatnila v SYMBOL Machine), začala se v případě procesorů typu RISC uplatňovat přesně opačná filozofie „less is better“. Mělo se tedy jednat o procesory s jednoduchou interní architekturou a malým množstvím instrukcí. Mnohdy byla instrukční sada osekána pouze na 32 instrukcí, zatímco u procesorů CISC se v některých případech jednalo i o stovky více či méně složitých instrukcí s mnoha adresními režimy. Ovšem z toho, že procesory RISC mají jednoduchou architekturu a velmi malý instrukční soubor v žádném případě nevyplývá, že by byly méně výkonné, než procesory CISC vyráběné porovnatelnou technologií. Ve skutečnosti tomu bylo právě naopak, protože první komerčně dostupné mikroprocesory RISC měly vyšší výpočetní rychlost než jakékoli v té době dostupné mikroprocesory CISC. Důvodů pro tuto vysokou výkonnost je více; o některých z nich se zmíníme v následující kapitole.

Obrázek 4: Mikroprocesor s instrukční sadou MIPS. Čipy obsahující jádra těchto RISCových mikroprocesorů se dnes používají v mnoha vestavěných zařízeních, například přehrávačích videa, routerech atd.

3. Přednosti „klasických“ RISCových architektur

První vlastností, která nejvíce odlišuje původní procesory s architekturou CISC od procesorů RISC je velmi malý počet instrukcí tvořících instrukční sadu procesorů RISC a taktéž striktní oddělení instrukcí pro načítání/ukládání dat do operační paměti a na druhé straně instrukcí pro provádění aritmetických a logických operací – i z tohoto důvodu se někdy procesory RISC nazývají procesory s architekturou Load–Store.

Zatímco instrukce určené pro načítání a ukládání dat do operační paměti pracují s přímou adresou čteného či zapisovaného slova, pracují instrukce aritmetické a logické striktně pouze s pracovními registry. Díky tomu se významně zjednodušuje instrukční dekodér a taktéž má naprostá většina instrukcí shodnou délku, protože například není nutné počítat s tím, že některý z operandů instrukce ADD může být zadán s využitím složitého adresního režimu (to u RISC není možné). Z konstantní délky všech instrukcí taktéž nepřímo vyplývá to, že některé procesory RISC načítají z operační paměti celá 16bitová nebo 32bitová slova a vůbec neobsahují možnost adresování jednotlivých bajtů, což ještě více zjednodušuje interní architekturu procesoru.

Druhou typickou vlastností procesorů s architekturou RISC je použití velkého množství pracovních registrů. V závislosti na použité instrukční sadě se většinou jedná o 16, 32 nebo 64 v dané chvíli dostupných registrů, přičemž jejich celkový počet může být i vyšší díky použití registrových oken. Konstruktéři procesorů RISC přistoupili k použití většího množství pracovních registrů z více důvodů. Například měli díky neexistenci mikroprogramového řadiče k dispozici dostatečnou plochu čipu na realizaci pracovních registrů, protože při použití 32 registrů po 32 bitech to znamená nutnost realizovat pouze 1024 bitů pomocí klopných obvodů.

Obrázek 5: Vývoj osmibitových mikroprocesorů CISC, na němž je patrné, že i tyto v podstatě velmi jednoduché mikroprocesory byly implementovány s využitím poměrně velkého množství tranzistorů.

Navíc lze do jednodušší instrukční sady relativně snadno zakomponovat i bity nutné pro adresování pracovních registrů (5 bitů v případě 32 registrů, tj. 10 bitů u dvouadresového kódu). Třetí důvod je však mnohem důležitější: operace prováděné s pracovními registry jsou mnohem rychlejší při porovnání s operacemi prováděnými s daty načítanými z operační paměti, už jen z toho důvodu, že se neblokuje externí datová a adresová sběrnice. A navíc – v rozporu s očekáváními konstruktérů čipů CISC – se v případě velkého množství pracovních registrů zjednodušuje práce překladače, který si například může některé registry rezervovat pro předávání argumentů, jiné ponechat pro počitadla smyček atd. (to byl alespoň prvotní předpoklad, který však nemusí být vždy splněn, viz též následující kapitoly).

Obrázek 6: Ultra SPARC II – další v minulosti velmi často používaný mikroprocesor s architekturou RISC
Zdroj: Wikipedia.

4. Přechod do světa embedded CPU a mikrořadičů

Vzhledem k vysokému výpočetnímu výkonu mikroprocesorů RISC není divu, že prakticky všechny výkonné grafické a pracovní stanice procesory s touto architekturou používaly. Připomeňme si, že na začátku tohoto období ještě byla hodinová frekvence mikroprocesorů srovnatelná s dobou přístupu k DRAM, takže se první generace procesorů RISC obešla bez nutnosti použití instrukčních cache. Posléze se však hodinová frekvence mikroprocesorů zvyšovala a tak bylo nutné do počítače (či dokonce přímo na čip s CPU) přidat instrukční cache, což nebylo velkým problémem v pracovních stanicích (kde se do ceny započítával i drahý disk, velká DRAM, grafický subsystém atd.), ale pro mnohé další aplikační oblasti bylo toto řešení již méně akceptovatelné.

Obrázek 7: Čipy StrongARM založené na architektuře ARMv4 byly v minulosti velmi oblíbené. Zajímavé je, že původně tyto čipy vyvinula společnost Digital Equipment Corporation ve spolupráci s firmou ARM a později byla tato technologie prodána Intelu. Současně se jedná o dobrý příklad použití RISCových procesorů v jiné oblasti, než jsou výkonné pracovní a grafické stanice.

Touto novou aplikační oblastí jsou mikrořadiče, embedded procesory a SoC. V této oblasti, především u mikrořadičů, můžeme sledovat vývoj, který (s mnohaletým zpožděním) kopíruje vývoj, který se stal v oblasti pracovních stanic a později desktopů, tj. přechod od osmibitových a 16bitových CPU k CPU 32bitovým (to taktéž koresponduje se změnou kernelů a používaných programovacích jazyků). Oblast osmibitových a 16bitových MCU se zdá být saturovaná a poměrně stabilní, zatímco trh s 32bitovými čipy poměrně rychle roste. To představuje pro výrobce RISCových procesorů velmi důležitou oblast, v níž se mohou projevit výhody komprimovaných instrukčních sad, a to především z toho důvodu, že MCU mívají užší datovou sběrnici, menší kapacitu instrukční cache a především pak ROM s instrukcemi implementovanou relativně pomalou technologií Flash. Je zde tedy patrná snaha o dosažení větší hustoty strojového kódu.

Obrázek 8: Čipy XMC4000 založené na jádru Cortex-M0. Aplikační oblast: embedded zařízení.
Autor původní fotky: Davewave88.

5. Umění kompromisu

Cílem autorů „komprimovaných“ instrukčních sad bylo na jedné straně zachování většiny výhod původních RISCových čipů (jednoduchá pipeline, vyšší frekvence hodin, obecně vyšší výpočetní výkon, jednoduchá struktura čipu), na straně druhé pak umožnění zakódování vybraných instrukcí v 16bitových slovech a nikoli ve slovech 32bitových. Už jen z těchto dvou požadavků plyne, že bylo nutné udělat množství kompromisů, protože je pochopitelné, že v 216 možných kódech není možné reprezentovat všech teoretických 232 kombinací.

Obrázek 9: Jiné zapouzdření čipů XMC4000 založených na jádru Cortex-M0.
Autor původní fotky: Davewave88.

Podívejme se, jak tento problém vyřešili tvůrci komprimované instrukční sady MIPS16e. Ti navrhli instrukce takovým způsobem, že většinu z nich bylo možné jednoduchým dekodérem rozšířit na původní 32bitové instrukce, takže samotný dekodér znamenal jen velmi malé zvýšení složitosti CPU (povšimněte si, že se jedná o zcela odlišný přístup, než který byl z druhé strany řešen u architektury x86, kde se mnohdy velmi složité CISC instrukce rozkládají na jednoduší mikrooperace, ale nikoli pouhým dekódováním). Vraťme se však k MIPS16e. To, že většina komprimovaných instrukcí je obrazem původních 32bitových instrukcí současně znamená i možnost provedení relativně malých úprav v překladačích. Zbývá tak určit, jak vlastní komprimaci provést:

  1. Snížením počtu bitů operačního kódu (reprezentovat lze jen některé instrukce)
  2. Snížením počtu registrů v instrukčním slově
  3. Zmenšením šířky konstant v instrukčním slově

První bod byl vyřešen s využitím statické analýzy existujících binárních souborů, což je jediná rozumná možnost, která však na druhou stranu reflektuje jen současný stav překladačů. Druhý bod byl řešen taktéž na základě analýzy, kde se ukázalo, že překladače v rámci jedné funkci používají typicky osm či méně pracovních registrů (což je zvláštní, protože při návrhu RISC se počítalo s přesným opakem). Proto sice byla zachována možnost práce se všemi 32 registry, ale pouze osm z nich je dostupných ve všech operacích. Navíc se musel zmenšit původně tříadresový kód na dvouadresový. Třetí bod, tj. zmenšení šířky konstant, si vyžádal zavedení nové zvláštní instrukce EXTEND popsané dále.

Obrázek 10: Mezi další čipy založené na jádru Cortex-M0 patří integrované obvody STM32 F0.

6. Způsoby přepínání mezi klasickou a komprimovanou instrukční sadou

Tvůrci komprimovaných instrukčních sad museli nalézt vhodný způsob přepínání mezi novou instrukční sadou a původní RISCovou sadou. Na hardwarové úrovni je to (pravděpodobně) jednoduché – na základě stavového bitu se pouze vyřadí z činnosti výše zmíněný dekodér instrukcí. Na úrovni instrukční sady do značné míry záleží na tom, zda původní instrukční sada obsahuje možnost několika bity vyjádřit, že instrukce je jen 16bitová. U původních RISCových procesorů se s ničím takovým nepočítalo, což znamená, že instrukční sady MIPS16e a ARM Thumb je nutné povolit nějakou speciální instrukcí, kterou je typicky instrukce skoku. Mnohem větší možnosti nabízí instrukční sady v architektuře RISC-V, které jsou od začátku navrhnuty takovým způsobem, aby se na základě hodnoty dvou nejnižších bitů instrukce dalo rozhodnout, zda se jedná o 16bitovou instrukci či o instrukci delší. Díky tomu lze oba způsoby kódování instrukcí „mixovat“ i v rámci jedné funkce a to bez nutnosti pamatovat si stav procesoru (u ARMu: RISC Mode/Thumb Mode) a provádět speciální skoky. Nezávisle na způsobu přepínání však existence jak původní RISCové sady, tak i sady „komprimované“ dovoluje velkou flexibilitu.

# Architektura Způsob přepnutí ISA
1 MIPS spec. instrukce skoku, návrat ze subrutiny, zpracování přerušení
2 ARM spec. instrukce skoku, zpracování přerušení
3 RISC-V každá instrukce má dva bity pro rozlišení mezi ISA

7. Instrukční sada MIPS16e

První komprimovanou instrukční sadou, s níž se dnes seznámíme, je sada nazvaná MIPS16e. Některé informace o této instrukční sadě jsme si již řekli v předchozích kapitolách, ovšem další informace je nutné doplnit. Tato instrukční sada doplňuje instrukce MIPS I a MIPS II (32bitové operandy) i MIPS III (64bitové operandy). Připomeňme si, že původní RISCová MIPS pracuje s 32 registry, z nichž každý má šířku 32 bitů a operační kódy instrukcí jsou taktéž 32bitové. Tato velká šířka instrukcí umožnila, aby byla většina ALU instrukcí doplněna o bitový posun operandu; samozřejmě byl podporován tříadresový kód, tj. použití dvou zdrojových registrů a jednoho registru cílového. Kvůli snížení počtu instrukcí je jeden z pracovních registrů nulový (konstantní nula) a navíc se nepoužívají žádné příznakové bity, protože podmíněný skok je proveden pouze na základě toho, zda je vybraný pracovní registr roven jinému registru či nikoli. Speciální význam mají dva registry HI a LO používané v násobičce a děličce. Naprostá většina těchto vlastností musela být s přechodem na MIPS16e změněna.

Obrázek 11: Zjednodušené schéma překódování instrukcí MIPS16e a MIPS I,II,III.

8. Pracovní a speciální registry používané v instrukční sadě MIPS16e

V instrukční sadě MIPS16e se naproti tomu možnosti použití registrů snížily, protože většina ALU instrukcí používá dvouadresový kód (jeden ze zdrojových registrů je současně i registrem cílovým) a navíc mnoho operací dokáže pracovat jen s osmi registry r0..r7 mapovanými na původní registry $16, $17, $2..$7 (první dva registry jsou tedy mapovány jinak, než posledních šest registrů, a to kvůli používané volací konvenci). Navíc se používá původní registr $24 ve významu nového podmínkového registru T. Aby bylo možné pracovat se všemi původními pracovními registry, mají programátoři k dispozici instrukce MOV32R a MOVR32 pro přenosy dat. Přidány byly i možnosti relativního adresování s využitím registru SP či PC jakožto bázového registru, což například zjednodušilo návrh céčkových zásobníkových rámců a PIC (Position Independent Code). Poslední dva registry nazvané HI a LO jsou využívány násobičkou a děličkou pro uložení výsledků:

Režim MIPS16e MIPS I,II,III
r0 $16
r1 $17
r2 $2
r3 $3
r4 $4
r5 $5
r6 $6
r7 $7
T $24
HI HI
LO LO

9. Speciální instrukce EXTEND

V kontextu RISCových instrukčních sad je poměrně zajímavá existence instrukce pojmenované EXTEND. Tato šestnáctibitová instrukce (tj. instrukce, jejíž slovo má šířku šestnáct bitů) obsahuje konstantu o šířce 11 bitů, která se pouze zapamatuje (= pravděpodobně uloží do záchytného registru, který je součástí dekodéru); žádný další vliv tato instrukce na činnost mikroprocesoru nemá. Další instrukce, která následuje za EXTEND, může těchto 11 bitů použít k rozšíření velikosti konstanty, protože v MIPS16e je pro uložení konstanty možné použít pouze pět bitů v instrukčním slově, což je pro mnoho operací nedostatečné. Díky EXTEND se tedy možnosti použití konstant rozšiřují na 16 bitů, tj. na stejnou velikost, jakou již měla původní instrukční sada MIPS.

pc9903

Obrázek 12: Výkonná a na dobu svého vzniku revoluční grafická stanice Onyx 2 vybavená systémem Infinite Reality. Tato grafická stanice je postavena na bázi mikroprocesorů R10000 vycházejících z původní architektury MIPS.

10. Podmíněné skoky v instrukční sadě MIPS16e

Připomeňme si, že původní instrukční sada mikroprocesorů MIPS se vyznačuje dvěma zvláštnostmi. První z nich je absence registru příznaků (flags), protože konstruktéři tohoto mikroprocesoru usoudili, že by používání příznaků typu zero, carry, overflow atd. mohlo vést ke vzniku konfliktů, kdy by na výsledek jedné instrukce čekala instrukce další. Kvůli absenci příznaků jsou v původní RISCové instrukční sadě pouze dva podmíněné skoky beq (branch on equal) a bne (branch on not equal), při nichž se skok provede/neprovede na základě porovnání obsahu dvou pracovních registrů, jejichž indexy jsou přímo součástí instrukčního slova – jedná se tedy o instrukce I-type. Povšimněte si, že díky existenci registru $zero se vlastně zadarmo instrukční sada rozšiřuje o pseudoinstrukce bz (branch on zero) a bnz (branch on non zero). Dále se použití příznaků nahradilo logickými instrukcemi slt (set on less than) a slti (set on less than immediate).

U komprimované instrukční sady MIPS16e by toto schéma podmíněných skoků nemělo moc velký význam, a to zejména proto, že po zakódování dvou registrů pro porovnání (2×3 bity) by již v instrukčním slovu zbylo jen málo bitů na uložení relativní adresy skoku (offsetu). Z tohoto důvodu tvůrci sady MIPS16e zvolili zajímavé řešení, kterým se vlastně částečně vrátili zpět k některým CISCovým procesorům – přidali podporu pro registr nazvaný T, do něhož se ukládá výsledek porovnání. V závislosti na tom, zda je hodnota uložená do registru T nulová či nikoli, je možné provést podmíněný skok s využitím instrukcí nazvaných bteqz (Branch on T Equal to Zero) a btnez (Branch on T Not Equal to Zero). Navíc je možné provést podmíněný skok na základě porovnání jakéhokoli pracovního registru r0r7 s nulou, a to s využitím instrukcí beqz (Branch on Equal to Zero) a bnez (Branch on Not Equal to Zero).

Podmíněné skoky stále doplňují instrukce slti, sltiu a cmpi, v nichž se porovnává hodnota vybraného pracovního registru s konstantou. Dále se pro nastavení hodnoty registru T používají instrukce cmp, slt a sltu.

pc9906

Obrázek 13: Laboratoř specializovaná na simulace a vizualizace, jejíž nezbytnou součástí jsou stroje Onyx 2 Infinite Reality, což znamená, že se jedná o další způsob využití mikroprocesorů s architekturou RISC.

11. Seznam instrukcí v sadě MIPS16e

V této kapitole budou zmíněny všechny instrukce, které je možné reprezentovat v instrukční sadě MIPS16e. Instrukce jsou podle své funkce rozděleny do několika kategorií.

Instrukce typu Load a Store

# Zkratka Význam
1 LB load byte (8bit)
2 LBU load byte unsigned
3 LH load half word (16bit)
4 LHU load half word unsigned
5 LW load word (32bit)
6 SB store byte (8bit)
7 SH store half word (16bit)
8 SW store word (32bit)

Instrukce obsahující konstantu (immediate)

U těchto instrukcí je konstanta součástí instrukčního slova a její šířku je možné rozšířit s využitím prefixové instrukce EXTEND:

bitcoin školení listopad 24

# Zkratka Význam
1 ADDIU Add Immediate Unsigned
2 CMPI Compare Immediate
3 LI Load Immediate
4 SLTI Set on Less Than Immediate
5 SLTIU Set on Less Than Immediate Unsigned

ALU instrukce pracující s dvojicí registrů

# Zkratka Význam
1 ADD Add Unsigned
2 AND AND
3 CMP Compare
4 MOVE Move
5 NEG Negate
6 NOT Not
7 OR OR
8 SEB Sign-Extend Byte
9 SEH Sign-Extend Halfword
10 SLT Set on Less Than
11 SLTU Set on Less Than Unsigned
12 SUBU Subtract Unsigned
13 XOR Exclusive OR
14 ZEB Zero-extend Byte
15 ZEH Zero-Extend Halfword

Násobení a dělení, přesuny dat do registrů HI a LO

Při násobení a dělení se používají pro uložení výsledků speciální registry nazvané HI a LO, protože násobička a dělička může (ale nemusí!) pracovat nezávisle na ALU. Proto musí existovat instrukce umožňující přenos dat z těchto dvou speciálních registrů:

# Zkratka Význam
1 DIV Divide
2 DIVU Divide Unsigned
3 MFHI Move From HI
4 MFLO Move From LO
5 MULT Multiply
6 MULTU Multiply Unsigned

Aritmetické a logické posuny

# Zkratka Význam
1 SRA Shift Right Arithmetic
2 SRAV Shift Right Arithmetic Variable
3 SLL Shift Left Logical
4 SLLV Shift Left Logical Variable
5 SRL Shift Right Logical
6 SRLV Shift Right Logical Variable

Skoky a podmíněné větvení

# Zkratka Význam
1 B Branch Unconditional
2 BEQZ Branch on Equal to Zero
3 BNEZ Branch on Not Equal to Zero
4 BTEQZ Branch on T Equal to Zero
5 BTNEZ Branch on T Not Equal to Zero
6 JAL Jump and Link
7 JALR Jump and Link Register
8 JALRC Jump and Link Register Compact
9 JALX Jump and Link Exchange
10 JR Jump Register
11 JRC Jump Register Compact

Ostatní instrukce

# Zkratka Význam
1 RESTORE restore registers
2 SAVE save registers
3 BREAK break
4 EXTEND rozšíření šířky konstanty další instrukce
pc9910

Obrázek 14: Server s architekturou Onyx 3000.

12. Odkazy na Internetu

  1. An Introduction to Lock-Free Programming
    http://preshing.com/20120612/an-introduction-to-lock-free-programming/
  2. Sequential consistency
    https://en.wikipedia.org/wi­ki/Sequential_consistency
  3. Understanding Atomic Operations
    https://jfdube.wordpress.com/2011/11/30/un­derstanding-atomic-operations/
  4. Load-link/store-conditional
    https://en.wikipedia.org/wiki/Load-link/store-conditional
  5. The RISC-V Compressed Instruction Set Manual
    http://riscv.org/spec/riscv-compressed-spec-v1.7.pdf
  6. Carry bits, The Architect's Trap
    http://yarchive.net/comp/ca­rry_bit.html
  7. Microprocessor Design/ALU Flags
    https://en.wikibooks.org/wi­ki/Microprocessor_Design/A­LU_Flags
  8. Flags register in an out-of-order processor
    http://cs.stackexchange.com/qu­estions/42095/flags-register-in-an-out-of-order-processor
  9. AMD Am29000
    https://en.wikipedia.org/wi­ki/AMD_Am29000
  10. Status register
    https://en.wikipedia.org/wi­ki/Status_register
  11. AMD Am29000 microprocessor family
    http://www.cpu-world.com/CPUs/29000/
  12. AMD 29k (Streamlined Instruction Processor) ID Guide
    http://www.cpushack.com/Am29k.html
  13. AMD Am29000 (Wikipedia)
    http://en.wikipedia.org/wi­ki/AMD_Am29000
  14. AMD K5 („K5“ / „5k86“)
    http://www.pcguide.com/ref/cpu/fam/g5K5-c.html
  15. Comparing four 32-bit soft processor cores
    http://www.eetimes.com/au­thor.asp?section_id=14&doc_id=1286116
  16. RISC-V Instruction Set
    http://riscv.org/download­.html#spec_compressed_isa
  17. RISC-V Spike (ISA Simulator)
    http://riscv.org/download.html#isa-sim
  18. RISC-V (Wikipedia)
    https://en.wikipedia.org/wiki/RISC-V
  19. David Patterson (Wikipedia)
    https://en.wikipedia.org/wi­ki/David_Patterson_(compu­ter_scientist)
  20. OpenRISC (oficiĂĄlnĂ strĂĄnky projektu)
    http://openrisc.io/
  21. OpenRISC architecture
    http://openrisc.io/architecture.html
  22. EmulĂĄtor OpenRISC CPU v JavaScriptu
    http://s-macke.github.io/jor1k/demos/main.html
  23. OpenRISC (Wikipedia)
    https://en.wikipedia.org/wi­ki/OpenRISC
  24. OpenRISC – instrukce
    http://sourceware.org/cgen/gen-doc/openrisc-insn.html
  25. OpenRISC – slajdy z pĹednĂĄĹĄky o projektu
    https://iis.ee.ethz.ch/~gmichi/a­socd/lecturenotes/Lecture6­.pdf
  26. Maska mikroprocesoru RISC 1
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC1.jpg
  27. Maska mikroprocesoru RISC 2
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC2.jpg
  28. C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
    http://www.eecs.berkeley.e­du/Pubs/TechRpts/1982/CSD-82–106.pdf
  29. Berkeley RISC
    http://en.wikipedia.org/wi­ki/Berkeley_RISC
  30. Great moments in microprocessor history
    http://www.ibm.com/develo­perworks/library/pa-microhist.html
  31. Microprogram-Based Processors
    http://research.microsoft.com/en-us/um/people/gbell/Computer_Struc­tures_Principles_and_Exam­ples/csp0167.htm
  32. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  33. A Brief History of Microprogramming
    http://www.cs.clemson.edu/~mar­k/uprog.html
  34. What is RISC?
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/whatis/
  35. RISC vs. CISC
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/risccisc/
  36. RISC and CISC definitions:
    http://www.cpushack.com/CPU/cpu­AppendA.html
  37. FPGA
    https://cs.wikipedia.org/wi­ki/Programovateln%C3%A9_hra­dlov%C3%A9_pole
  38. The Evolution of RISC
    http://www.ibm.com/develo­perworks/library/pa-microhist.html#sidebar1
  39. SPARC Processor Family Photo
    http://thenetworkisthecom­puter.com/site/?p=243
  40. SPARC: Decades of Continuous Technical Innovation
    http://blogs.oracle.com/on­therecord/entry/sparc_deca­des_of_continuous_technical
  41. The SPARC processors
    http://www.top500.org/2007_o­verview_recent_supercompu­ters/sparc_processors
  42. Reduced instruction set computing (Wikipedia)
    http://en.wikipedia.org/wi­ki/Reduced_instruction_set_com­puter
  43. MIPS architecture (Wikipedia)
    http://en.wikipedia.org/wi­ki/MIPS_architecture
  44. Very long instruction word (Wikipedia)
    http://en.wikipedia.org/wi­ki/Very_long_instruction_word
  45. Classic RISC pipeline (Wikipedia)
    http://en.wikipedia.org/wi­ki/Classic_RISC_pipeline
  46. R2000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wi­ki/R2000_(microprocessor)
  47. R3000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R3000
  48. R4400 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R4400
  49. R8000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R8000
  50. R10000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R10000
  51. SPARC (Wikipedia)
    http://en.wikipedia.org/wiki/Sparc
  52. CPU design (Wikipedia)
    http://en.wikipedia.org/wi­ki/CPU_design
  53. Control unit (Wikipedia)
    http://en.wikipedia.org/wi­ki/Control_unit

Autor článku

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