Obsah
1. Mikroprocesory s architekturou ARM a jejich „RISCová“ instrukční sada
2. Registry přístupné programátorům
3. Pracovní registry a režimy mikroprocesorů ARM
4. Příznakové registry CPSR a SPSR
5. Typy instrukcí zpracovávaných mikroprocesory ARM
6. Formát instrukcí zpracovávaných mikroprocesory ARM
7. Jeden ze způsobů řešení problematiky podmíněných skoků: podmíněné spouštění instrukcí
8. Demonstrační příklad: použití podmíněného spouštění instrukcí
1. Mikroprocesory s architekturou ARM a jejich „RISCová“ instrukční sada
V předchozí části seriálu o architekturách počítačů jsme se seznámili s historií vzniku mikroprocesorů s architekturou ARM a řekli jsme si základní informace o vlastnostech těchto procesorů, které je předurčují mj. i k použití v mobilních zařízeních. Dnes se zaměříme především na popis těchto mikroprocesorů z hlediska či spíše pohledu programátora, protože procesory ARM nabízí vývojářům hned několik unikátních vlastností, které u jiných architektur nenajdeme. Již minule jsme si řekli, že moderní varianty mikroprocesorů ARM mohou pracovat s několika instrukčními sadami, mezi kterými je možné se programově – a to i v rámci jedné aplikace – přepínat. Jedná se o původní „RISCovou“ instrukční sadu, v níž mají všechny instrukce shodnou šířku 32 bitů, dále pak o instrukční sadu nazvanou Thumb s instrukcemi o šířce 16 bitů, instrukční sadu Thumb 2, v níž mohou mít instrukce proměnnou délku a u některých čipů ARM se můžeme setkat i s podporou technologie Jazelle dovolující zpracovávat bajtkód JVM, tj. instrukce určené původně pro zpracování virtuálním strojem Javy (ve skutečnosti je však přímo zpracovávána pouze část těchto instrukcí, ostatní jsou implementovány podprogramem).
Nejdříve začneme s popisem původní „RISCové“ instrukční sady, která je současně i instrukční sadou v mnoha ohledech nejzajímavější. Jak jsme si již řekli v předchozím odstavci, mají všechny instrukce patřící do této instrukční sady šířku 32 bitů, a to včetně instrukcí určených pro načtení 32 bitové konstanty (zde muselo logicky dojít k určitému kompromisu). Těchto 32 bitů je podle typu instrukce rozděleno do několika bitových polí různé šířky, v nichž se nachází bitové příznaky, na nichž vykonání instrukce závisí (viz další kapitoly s podrobnějším popisem), operační kód instrukce, indexy registrů (operandů), s nimiž instrukce pracuje, konstanta použitá pro bitový posun či rotaci jednoho z operandů atd. U instrukcí LDM a STM je jedno bitové pole o šířce 16 bitů určeno pro označení těch pracovních registrů, které se mají načíst z operační paměti, popř. které se naopak mají do operační paměti uložit (i touto dvojicí instrukcí se ještě budeme v dalším textu podrobněji zabývat).
2. Registry přístupné programátorům
Vzhledem k tomu, že u všech mikroprocesorů s architekturou RISC je díky existenci instrukční pipeline pro každou instrukci v ideálním případě vyhrazena pouze jedna operace přístupu k operační paměti (konkrétně se jedná o čtení operačního kódu instrukce), je nutné, aby tyto mikroprocesory obsahovaly na svém čipu velký počet pracovních registrů. Na druhou stranu však pevná šířka instrukčních slov (typicky 32 bitů) vede k tomu, že v jedné instrukci lze indexovat pouze omezený počet pracovních registrů, protože RISCové instrukce většinou neobsahují implicitní operandy (opačným extrémem je instrukční sada šestnáctibitových mikroprocesorů Intel 8086 obsahující mnoho instrukcí s implicitním operandem či operandy).
Jak jsme se již dozvěděli v předchozích částech tohoto seriálu, vedly tyto dva protichůdné požadavky – velký počet pracovních registrů/omezená šířka instrukcí – k tomu, že někteří konstruktéři mikroprocesorů RISC (počínaje projektem Berkeley RISC) zaváděli takzvaná „registrová okna“, která programátorům v daný okamžik zpřístupňovala pouze určitý výsek z celé sady registrů. Velikost registrových oken je různá, počínaje osmi registry (projekt Berkeley RISC) až po proměnný počet registrů v registrovém okně (příkladem mohou být mikroprocesory řady AMD 29000).
Konstruktéři mikroprocesorů ARM se však vydali poněkud odlišnou cestou a namísto registrových oken (posouvaných většinou při volání podprogramu a návratu z podprogramu) použili v uživatelském (neprivilegovaném) režimu pouze jednu sadu registrů, podobně, jako je tomu například u RISCových mikroprocesorů MIPS. Existence jedné sady registrů znamená, že se o alokaci registrů pro různé operandy musí starat překladač, a to samozřejmě i v případě volání podprogramů (subrutin). Ovšem vzhledem k tomu, že je vhodné, aby mikroprocesor dokázal velmi rychle zpracovávat přerušení či vykonávat funkce jádra operačního systému, existuje u architektury ARM ve skutečnosti několik registrů dostupných pouze v přerušovací rutině, v supervisorském režimu atd. Instrukční sada samozřejmě zůstává ve všech režimech stále stejná, proto programátor v jakémkoli režimu může pracovat se stejným počtem pracovních registrů. Na tomto místě je taktéž vhodné upozornit na to, že se počet režimů mikroprocesorů ARM postupně zvyšoval, stejně jako počet speciálních registrů dostupných pouze v jednom režimu – viz též následující kapitolu.
3. Pracovní registry a režimy mikroprocesorů ARM
V předchozí kapitole jsme si řekli, že počet režimů mikroprocesoru a současně i počet „speciálních“ pracovních registrů (přístupných pouze z jednoho režimu) se postupně zvyšoval. Následující tabulka se šesti režimy procesoru je z tohoto důvodu platná pro mikroprocesory ARM patřící do rodiny ARM 7, nikoli například pro první dvě generace procesorů ARM1 a ARM2. Povšimněte si, že prvních osm pracovních registrů je dostupných v jakémkoli režimu procesoru, stejně jako registr r15 sloužící jako programový čítač PC (ostatně přidání programového čítače mezi „běžné“ pracovní registry je jednou z typických vlastností mikroprocesorů ARM):
Index/Režim | User | FIQ | Supervisor | Abort | IRQ | Undefined |
---|---|---|---|---|---|---|
0 | r0 | r0 | r0 | r0 | r0 | r0 |
1 | r1 | r1 | r1 | r1 | r1 | r1 |
2 | r2 | r2 | r2 | r2 | r2 | r2 |
3 | r3 | r3 | r3 | r3 | r3 | r3 |
4 | r4 | r4 | r4 | r4 | r4 | r4 |
5 | r5 | r5 | r5 | r5 | r5 | r5 |
6 | r6 | r6 | r6 | r6 | r6 | r6 |
7 | r7 | r7 | r7 | r7 | r7 | r7 |
8 | r8 | r8_fiq | r8 | r8 | r8 | r8 |
9 | r9 | r9_fiq | r9 | r9 | r9 | r9 |
10 | r10 | r10_fiq | r10 | r10 | r10 | r10 |
11 | r11 | r11_fiq | r11 | r11 | r11 | r11 |
12 | r12 | r12_fiq | r12 | r12 | r12 | r12 |
13 | r13 | r13_fiq | r13_svc | r13_abt | r13_irq | r13_undef |
14 | r14 | r14_fiq | r14_svc | r14_abt | r14_irq | r14_undef |
15 | r15/PC | r15/PC | r15/PC | r15/PC | r15/PC | r15/PC |
Z tabulky je patrné, že mikroprocesory ARM 7 sice obsahují 31 pracovních registrů, ovšem v každém režimu mikroprocesoru má programátor přístup pouze k šestnácti registrům, přičemž registr r15 je vždy považován za programový čítač (to ovšem neznamená, že se do něj nemůže provádět zápis – ve skutečnosti je tomu právě naopak).
4. Příznakové registry CPSR a SPSR
Kromě pracovních registrů a programového čítače obsahují mikroprocesory s architekturou ARM i registry, v nichž se uchovávají různé příznaky. V uživatelském režimu se pracuje s příznaky uloženými v registru nazvaném CPSR (Current Program Status Register) a pro každý další režim existuje navíc zvláštní registr nazvaný SPSR (Saved Program Status Register), v němž jsou uchovány původní příznaky ze CPSR (zatím jsme se tedy úspěšně vyhnuli nutnosti použití zásobníku :-). Podobně jako všechny pracovní registry, mají i registry CPSR a SPSR_? shodnou šířku 32 bitů, což má svoje výhody. Mimo jiné i to, že šířka 32 bitů ponechala konstruktérům procesorů ARM mnoho prostoru pro uložení různých důležitých informací do registrů CPSR/SPSR, takže se nemuseli uchylovat k nepříliš promyšleným technikám známým například z platformy x86, kde se původně šestnáctibitový registr FLAGS (8086) postupně změnil na 32bitový registr EFLAGS (80386), vedle něho vznikl registr MSW (80286) rozšířený na CR0 atd. atd.
Ve stavových registrech CPSR/SPSR mikroprocesorů ARM jsou uloženy především bitové příznaky nastavované aritmeticko-logickou jednotkou, dále pak bity určující, jakou instrukční sadu mikroprocesor právě zpracovává (ARM, Thumb, Jazelle), příznak pořadí zpracovávání bajtů (little/big endian) a taktéž příznaky používané u SIMD operací. Zdaleka ne všechny mikroprocesory ARM však skutečně pracují se všemi bity, což je logické, protože například příznak Q je používán jen u mikroprocesorů podporujících aritmetiku se saturací, příznak J u čipů s podporou technologie Jazelle atd.:
Příznak | Význam zkratky | Poznámka |
---|---|---|
N | negative | výsledek ALU operace je záporný |
V | overflow | přetečení (znaménková aritmetika) |
Z | zero | výsledek je nulový |
C | carry | přenos (bezznaménková aritmetika) |
I | interrupt | zákaz IRQ (přerušení) |
F | fast interrupt | zákaz FIRQ (rychlého přerušení) |
Q | sticky overflow | aritmetika se saturací, od ARMv5e výše |
T | thumb | příznak zpracování instrukční sady Thumb (jen u procesorů se znakem „T“ v názvu) |
J | jazelle | příznak zpracování instrukční sady Jazelle (jen u procesorů se znakem „J“ v názvu) |
E | endianness | pořadí bajtů při práci s RAM (big/little endian) |
GE | 4 bity | použito u SIMD operací (pouze některé čipy) |
IF | 5 bitů | použito u instrukcí Thumb2 (pouze některé čipy) |
M | 5 bitů | režim práce mikroprocesoru (user, IRQ, FIRQ, …) |
Poznámka: v tabulce zobrazené výše nejsou jednotlivé bity uvedeny v takovém pořadí, v jakém se nachází ve stavovém registru.
5. Typy instrukcí zpracovávaných mikroprocesory ARM
Instrukční sada mikroprocesorů ARM obsahuje několik typů instrukcí. V první řadě se samozřejmě jedná o instrukce typu Load a Store určené pro načtení či naopak uložení obsahu pracovních registrů do operační paměti (mezi operace typu Load se zde počítá i načtení konstanty). Dále jsou v instrukční sadě přítomny aritmetické operace, logické a bitové operace, skoky (jeden typ skoku současně může změnit i instrukční sadu mikroprocesoru), instrukce pro práci se stavovými registry CPSR popř. SPSR a několik instrukčních kódů je taktéž vyhrazeno pro komunikaci a řízení koprocesorů, například matematického koprocesoru, GPU atd. Povšimněte si, že jsme se prozatím nezmínili o instrukcích pro provádění bitových posunů a rotací, což je správně, protože tyto instrukce ve skutečnosti na procesorech ARM samostatně neexistují (stále se bavíme o původní RISCové instrukční sadě). Velká část ALU instrukcí totiž umožňuje, aby se bitový posun či rotace vykonal v barrel shifteru se druhým operandem vstupujícím do ALU, takže se bitový posun/rotace musí zakódovat do některé ALU instrukce, popř. do instrukce přenosu dat (to je většinou záležitostí překladače):
- Instrukce typu load/store prováděné s jedním pracovním registrem.
- Instrukce typu load/store prováděné s 0 až 16 pracovními registry.
- Aritmetické operace.
- Logické a bitové operace.
- Skoky a změna instrukční sady mikroprocesoru.
- Práce se stavovými registry CPSR a SPSR.
- Instrukce koprocesoru
6. Formát instrukcí zpracovávaných mikroprocesory ARM
V této kapitole si stručně popíšeme formát instrukcí mikroprocesorů ARM. Instrukční slovo o konstantní šířce 32 bitů je rozděleno do několika částí. V prvních čtyřech bitech se u všech instrukcí nachází kód podmínky, jehož význam bude vysvětlen v následující kapitole. Za kódem podmínky je uložen vlastní operační kód instrukce o šířce 4 až 8 bitů, který bývá u některých typů instrukcí navíc doplněn dalšími bity (například se to týká instrukcí násobení, kde lze pomocí těchto bitů zvolit režim násobení a typ výsledku). Další obsah instrukčního slova se liší podle toho, o jaký typ instrukce se jedná. Například u skoků je operační kód instrukce široký pouze čtyři bity, což ponechává celých 24 bitů pro uložení offsetu skoku. Většina aritmetických instrukcí obsahuje v instrukčním slově indexy dvou pracovních registrů (každý po 4 bitech) a navíc dvanáctibitový operand s různým významem. Výjimku tvoří instrukce pro násobení, které v instrukčním kódu obsahují indexy hned čtyř registrů: Rd, Rn, Rs a Rm. Další výjimkou jsou již zmíněné instrukce LDM a STM, kde se ve spodní polovině instrukce, tj. v šestnácti bitech, nachází bitové pole určující, které registry mají být přečteny či zapsány do operační paměti.
Pod tímto odstavcem je naznačen formát některých typů instrukcí mikroprocesorů ARM. Kromě posledního formátu má operační kód šířku osm bitů, v případě skoků (poslední formát) pak pouze čtyři bity, protože zbývajících 24 bitů je použito pro uložení offsetu skoku:
31 27 15 0 +------+--------------------------------+ | cond | opkód | Rn | Rd | operand 2 | +------+--------------------------------+ | cond | opkód | Rn | Rd | Rs | op.| Rm | +------+--------------------------------+ | cond | opkód | Rn | Rd | offset | +------+--------------------------------+ Instrukce LDM a STM: 31 27 15 0 +------+--------------------------------+ | cond | opkód | Rn | bitové pole reg. | +------+--------------------------------+ Instrukce skoku: 31 27 23 0 +------+--------------------------------+ | cond |opkód| offset skoku | +------+--------------------------------+
7. Jeden ze způsobů řešení problematiky podmíněných skoků: podmíněné spouštění instrukcí
Pokud se podíváme na formát instrukcí zobrazený v předchozí kapitole, můžeme vidět, že se v nejvyšších čtyřech bitech každé instrukce nachází takzvaný kód podmínky. Konstruktéři mikroprocesorů ARM totiž (částečně) vyřešili problematiku podmíněných skoků tím, že umožnili vykonat každou instrukci pouze v případě, že je splněna podmínka, jejích kód je zapsán právě v oněch čtyřech nejvyšších bitech instrukce. A o jakou problematiku podmíněných skoků se vlastně jedná? Podmíněné skoky představují pro klasickou RISCovou pipeline obtížný úkol: důvodem existence instrukční pipeline je to, aby se v každém taktu v ideálním případě dokončila jedna instrukce. U skoků, zvláště těch podmíněných, se však již před rozhodnutím, zda se skok provede či nikoli, začnou zpracovávat další instrukce umístěné za skokem, což však znamená, že se v případě provedení skoku tyto instrukce ve skutečnosti nemají vykonat. Konstruktéři RISCových a posléze i CISCových mikroprocesorů tedy hledali různé způsoby řešení této problematiky, ať se již jedná o spekulativní provádění instrukcí (příliš mnoho tranzistorů) či o prediktory skoků (ne vždy jsou úspěšné).
Díky tomu, že u mikroprocesorů ARM lze podmínku vykonání zadat u každé instrukce, je možné, aby se celkový počet podmíněných skoků v programu minimalizoval. Zejména se to týká skoků používaných pro implementaci programové konstrukce if-then-else, kde se v jednotlivých větvích nachází jen malé množství instrukcí. Aby však mělo použití podmínkových kódů smysl, musela se změnit ještě jedna vlastnost procesorů ARM: jejich aritmeticko-logická jednotka totiž změní stavové bity carry, zero, overflow a negative pouze v tom případě, že je to explicitně v instrukčním kódu zapsáno (výjimku tvoří porovnávací instrukce). Touto vlastností se budeme zabývat až v následující části seriálu.
První sada podmínkových kódů se používá pro provedení či naopak neprovedení instrukce na základě hodnoty jednoho z příznakových bitů zero, overflow či negative. Poslední podmínkový kód z této skupiny má název AL (Any/Always) a značí, že se instrukce provede v každém případě. Tento podmínkový kód se tudíž většinou v assembleru nezapisuje, protože je považován za implicitní:
Kód | Přípona | Význam | Testovaná podmínka |
---|---|---|---|
0000 | EQ | Z set | rovnost (či nulový výsledek) |
0001 | NE | Z clear | nerovnost (či nenulový výsledek) |
0100 | MI | N set | výsledek je záporný |
0101 | PL | N clear | výsledek je kladný či 0 |
0110 | VS | V set | nastalo přetečení |
0111 | VC | V clear | nenastalo přetečení |
1110 | AL | Any/Always | většinou se nezapisuje, implicitní podmínka |
Další čtyři podmínkové kódy se většinou používají při porovnávání dvou hodnot bez znaménka (unsigned). V těchto případech se testují stavy příznakových bitů carry a zero, přesněji řečeno kombinací těchto bitů:
Kód | Přípona | Význam | Testovaná podmínka |
---|---|---|---|
0010 | CS/HS | C set | >= |
0011 | CC/LO | C clear | < |
1000 | HI | C set and Z clear | > |
1001 | LS | C clear or Z set | <= |
Poslední čtyři podmínkové kódy se používají pro porovnávání hodnot se znaménkem (signed). V těchto případech se namísto příznakových bitů carry a zero testují kombinace bitů negative, overflow a zero:
Kód | Přípona | Význam | Testovaná podmínka |
---|---|---|---|
1010 | GE | N and V the same | >= |
1011 | LT | N and V differ | < |
1100 | GT | Z clear, N == V | > |
1101 | LE | Z set, N != V | <= |
8. Demonstrační příklad: použití podmíněného spouštění instrukcí
Pojďme si nyní ukázat, jak je možné použít podmínkové kódy v praxi. Následující demonstrační příklad byl získán přímo z materiálů dodávaných k mikroprocesorům ARM, takže je jisté, že byl vybrán s ohledem na to, aby dobře ilustroval použití podmínkových kódů a markantní rozdíl v délce programu i délce jeho trvání (v praxi jsou tyto rozdíly poněkud menší). Příklad představuje céčkovskou funkci určenou pro výpočet největšího společného dělitele dvou 32bitových hodnot. Algoritmus pro výpočet největšího společného dělitele lze v céčku zapsat následovně:
int gcd(int a, int b) { while (a != b) do { if (a > b) { a = a - b; } else { b = b - a; } } return a; }
Pokud by tento algoritmus byl přeložen do assembleru s využitím klasicky pojatých podmíněných skoků, mohl by výsledek vypadat následovně. Instrukce CMP porovná dva pracovní registry obsahující obě hodnoty, pro něž se počítá největší společný dělitel. Na základě tohoto porovnání se vykoná buď „větev if“ nebo „větev else“, což ovšem znamená, že se v každé iteraci musí vykonat dvě instrukce podmíněných skoků (BEQ, BLT) a jedna instrukce skoku nepodmíněného (B):
gcd CMP r0, r1 ; porovnání registrů r0 a r1 BEQ end ; pokud r0 == r1, konec smyčky BLT less ; skok když r0 je menší než r1 SUB r0, r0, r1 ; tělo "if" B gcd ; další iterace less SUB r1, r1, r0 ; tělo "else" B gcd ; další iterace end
Naproti tomu optimalizující překladač může výše uvedený program přeložit pouze do čtyř instrukcí, přičemž obě prostřední instrukce jsou vykonány pouze při splnění zadané podmínky (viz suffix uvedený u jména instrukce):
gcd CMP r0, r1 ; porovnání registrů r0 a r1 SUBGT r0, r0, r1 ; rozdíl jen v případě, že r0 byl větší než r1 SUBLT r1, r1, r0 ; rozdíl jen v případě, že r1 byl větší než r0 BNE gcd ; pokud r0 != r1, skok na začátek smyčky
Vzhledem k tomu, že všechny instrukce mají konstantní šířku 32 bitů, odpovídá zkrácení programu v assembleru (počet ušetřených řádků) přímo úměrně i zkrácení výsledného strojového programu a současně i jeho rychlejšímu běhu, protože provedení podmíněného skoku vede k pozastavení instrukční pipeline na tři takty:
Program | Instrukcí | Bajtů |
---|---|---|
A | 7 | 28 |
B | 4 | 16 |
Poznamenejme, že v případě použití instrukční sady Thumb lze původní program se sedmi instrukcemi zkrátit na 14 bajtů, a to díky tomu, že se pro každou instrukci použije pouze 16 bitů.
9. Odkazy na Internetu
- An Introduction to ARM Assembly Language
http://dev.emcelettronica.com/introduction-to-arm-assembly-language - Processors – ARM
http://www.arm.com/products/processors/index.php - The ARM Instruction Set
http://simplemachines.it/doc/arm_inst.pdf - ARM Architecture (Wikipedia)
http://en.wikipedia.org/wiki/ARM_architecture - BBC BASIC
http://www.bbcbasic.co.uk/bbcbasic.html - BBC BASIC
http://mdfs.net/Software/BBCBasic/ - BBC BASIC (Z80) for the ZX Spectrum
http://mdfs.net/Software/BBCBasic/Spectrum/ - BBC BASIC (Wikipedia CZ)
http://en.wikipedia.org/wiki/BBC_BASIC - MIPS-3D® ASE
http://www.mips.com/products/architectures/mips-3d-ase/ - An introduction to SPARC's SIMD offerings
http://mikeburrell.wordpress.com/2007/12/14/an-introduction-to-sparcs-simd-offerings/ - MIPS64TM Architecture for Programmers Volume IV-c: The MIPS-3DTM Application-Specific Extension to the MIPS64TM
http://www.weblearn.hs-bremen.de/risse/RST/docs/MIPS/MD00099–2B-MIPS3D64-AFP-01.11.pdf - Visual Instruction Set
http://www.enotes.com/topic/Visual_Instruction_Set - NEON
http://www.arm.com/products/processors/technologies/neon.php - Architecture and Implementation of the ARM Cortex-A8 Microprocessor
http://www.design-reuse.com/articles/11580/architecture-and-implementation-of-the-arm-cortex-a8-microprocessor.html - Multimedia Acceleration eXtensions (Wikipedia)
http://en.wikipedia.org/wiki/Multimedia_Acceleration_eXtensions - AltiVec (Wikipedia)
http://en.wikipedia.org/wiki/AltiVec - Visual Instruction Set (Wikipedia)
http://en.wikipedia.org/wiki/Visual_Instruction_Set - MAJC (Wikipedia)
http://en.wikipedia.org/wiki/MAJC - MDMX (Wikipedia)
http://en.wikipedia.org/wiki/MDMX - MIPS Multiply Unit
http://programmedlessons.org/AssemblyTutorial/Chapter-14/ass14_3.html - Silicon Graphics Introduces Enhanced MIPS Architecture
http://bwrc.eecs.berkeley.edu/CIC/otherpr/enhanced_mips.html - MIPS-3D (Wikipedia)
http://en.wikipedia.org/wiki/MIPS-3D - MIPS Technologies, Inc. announces new MIPS-3D technology to provide silicon-efficient 3D graphics acceleration
http://www.design-reuse.com/news/2057/mips-mips-3d-technology-silicon-efficient-3d-graphics-acceleration.html - MIPS-3D Built-in Function (gcc.gnu.org)
http://gcc.gnu.org/onlinedocs/gcc/MIPS_002d3D-Built_002din-Functions.html - Baha Guclu Dundar:
Intel MMX, SSE, SSE2, SSE3/SSSE3/SSE4 Architectures - SSE (Streaming SIMD Extentions)
http://www.songho.ca/misc/sse/sse.html - Timothy A. Chagnon: SSE and SSE2
http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf - Intel corporation: Extending the Worldr's Most Popular Processor Architecture
http://download.intel.com/technology/architecture/new-instructions-paper.pdf - SIMD architectures:
http://arstechnica.com/old/content/2000/03/simd.ars/ - Tour of the Black Holes of Computing!: Floating Point
http://www.cs.hmc.edu/~geoff/classes/hmc.cs105…/slides/class02_floats.ppt - 3Dnow! Technology Manual
AMD Inc., 2000 - Intel MMXTM Technology Overview
Intel corporation, 1996 - MultiMedia eXtensions
http://softpixel.com/~cwright/programming/simd/mmx.phpi - AMD K5 („K5“ / „5k86“)
http://www.pcguide.com/ref/cpu/fam/g5K5-c.html - Sixth Generation Processors
http://www.pcguide.com/ref/cpu/fam/g6.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Control unit (Wikipedia)
http://en.wikipedia.org/wiki/Control_unit - Cray History
http://www.cray.com/About/History.aspx?404;http://www.cray.com:80/about_cray/history.html - Cray Historical Timeline
http://www.cray.com/Assets/PDF/about/CrayTimeline.pdf - Computer Speed Claims 1980 to 1996
http://homepage.virgin.net/roy.longbottom/mips.htm - Superpočítače Cray
http://www.root.cz/clanky/superpocitace-cray/ - Superpočítače Cray (druhá část)
http://www.root.cz/clanky/superpocitace-cray-druha-cast/ - Superpočítače Cray (třetí část)
http://www.root.cz/clanky/superpocitace-cray-treti-cast/ - Superpočítače Cray (čtvrtá část)
http://www.root.cz/clanky/superpocitace-cray-ctvrta-cast/ - Superpočítače Cray (pátá část): architektura Cray X-MP
http://www.root.cz/clanky/superpocitace-cray-pata-cast-architektura-pocitace-cray-x-mp-a-jeho-pouziti-ve-filmovem-prumyslu/