Obsah
1. Načtení či uložení 32bitových slov s využitím adresy ve tvaru báze:offset
2. Současné načtení či uložení většího množství pracovních registrů
3. Práce s jednotlivými bajty + konverze
4. Načtení či uložení bajtu se znaménkovým rozšířením na 32bitové slovo
6. Relativní adresování využívající PC (Program Counter)
7. Relativní adresování využívající SP (Stack Pointer)
8. Instrukční sada Thumb: shrnutí
1. Načtení či uložení 32bitových slov s využitím adresy ve tvaru báze:offset
V předchozí části seriálu o architekturách počítačů jsme si popsali velké množství instrukcí patřících do instrukční sady Thumb. Připomeňme si, že se jedná o alternativní instrukční sadu mikroprocesorů ARM, která byla navržena s ohledem na dosažení co největší hustoty kódu a tím pádem i s ohledem na lepší využití vyrovnávacích pamětí (cache). Tato sada navíc vznikla na základě analýzy strojových kódů generovaných překladači, takže v ní můžeme najít množství instrukcí zvolených čistě pragmaticky (tím se instrukční sada Thumb odlišuje od původní RISCové sady ARM).
Mezi základní instrukce typu Load & Store patří na RISCových mikroprocesorech s architekturou ARM instrukce určené pro přenos 32bitových slov mezi vybraným pracovním registrem a operační pamětí. Vzhledem k tomu, že v 16bitových instrukčních slovech instrukční sady Thumb je prakticky nemožné vyhradit dostatečný počet bitů pro uložení adresy nebo její významné části, využili autoři instrukční sady Thumb pro adresování obsah některého z pracovních registrů. Při studiu reálných programů (či přesněji řečeno jejich strojového kódu) si navíc tvůrci ISA povšimli, že se v kódech velmi často vyskytují operace pracující s prvky pole a/nebo datovými položkami sdruženými do záznamů (struct, record). V těchto případech je vhodné, aby se adresa místa v paměti skládala ze dvou částí: báze a offsetu. V případě polí je jako báze zvolena adresa prvního prvku v poli, v případě datových struktur/záznamů se taktéž jedná o adresu první položky. Offset potom může odpovídat například indexu prvku v poli (po bitovém posunu). Pro adresování ve tvaru báze:offset se používá následující formát instrukčního slova:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | L | 0 | 0 | Ro | Rb | Rd | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Z výše uvedeného formátu instrukčního slova je patrné, že instrukce Load & Store používají tři pracovní registry, přesněji řečeno registry z „dolní“ skupiny R0 až R7. Význam všech tří registrů je popsán v tabulce:
| Registr | Význam |
|---|---|
| Rb | registr obsahující 32bitovou bázovou adresu |
| Ro | registr obsahující 32bitový offset |
| Rd | registr, který se má uložit či načíst z/do paměti |
Při podrobnějším pohledu na formát instrukčního slova objevíme kromě konstantních bitů a bitů rezervovaných pro uložení indexů použitých registrů ještě bit s indexem 11 (L), pomocí něhož je určeno, zda se má obsah pracovního registru Rd načíst (Load) z operační paměti, konkrétně z adresy báze+offset, či zda se naopak jeho obsah má uložit (Store) do operační paměti:
| Bit 11 (L) | Význam |
|---|---|
| 0 | Store – uložení registru do operační paměti |
| 1 | Load – načtení registru z paměti RAM či ROM |
2. Současné načtení či uložení většího množství pracovních registrů
Instrukční sada Thumb obsahuje i instrukce, pomocí nichž je možné uložit či naopak načíst celou řadu vybraných pracovních registrů, nikoli pouze registr jediný. Zatímco u 32bitové instrukční sady ARM byly pro tento účel vyhrazeny instrukce LDM a STM, které pracovaly se všemi šestnácti pracovními registry, je u instrukční sady Thumb ze zřejmých důvodů použito pouze prvních osm registrů (důvodem je to, že v 16bitovém instrukčním slovu prostě není místo na uložení 16bitového pole obsahujícího seznam registrů, s nimiž se má pracovat). Vraťme se však k instrukční sadě Thumb, v níž najdeme instrukce LDMIA a STMIA. Tyto instrukce obsahují ve svém instrukčním slovu index registru, v němž je uložena bázová adresa a taktéž je zde umístěno osmibitové pole obsahující jedničku u těch registrů, které se skutečně mají uložit do paměti či se naopak mají z paměti načíst. Formát instrukčního slova instrukcí LDMIA a STMIA vypadá následovně:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 0 | 0 | L | Rd | seznam registrů | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Do spodních osmi bitů instrukčního slova se ukládají příznaky odpovídající pracovním registrům R0 až R7. Pokud je bit s indexem n nastaven na jedničku, je instrukce Load/Store provedena i s registrem Rn. Pořadí registrů však není možné měnit, lze pouze určit, které registry se budou operace účastnit.
Podobně jako u instrukcí popsaných v předchozí kapitole, i zde je pomocí bitu 11 (L) určeno, zda se jedná o instrukci typu Load či naopak o instrukci typu Store:
| Bit 11 (L) | Význam |
|---|---|
| 0 | Store – uložení registrů (určených bitovým polem) do paměti |
| 1 | Load – načtení registrů (určených bitovým polem) z paměti |
Připomeňme si, že podobný formát instrukčního slova můžeme najít i u instrukcí typu push a pop, které jsme si již popsali v osmé kapitole předchozí části tohoto seriálu. Jednalo se o následující formát:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 0 | 1 | 1 | L | 1 | 0 | R | seznam registrů | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ L: 0 - push 1 - pop
3. Práce s jednotlivými bajty + konverze
Jak jsme si již řekli v úvodní kapitole, byla instrukční sada Thumb navržena dosti pragmaticky s ohledem na co nejlepší uplatnění v praxi. Proto možná není divu, že v ní najdeme i instrukce typu Load & Store, které je možné použít pro manipulaci s jednotlivými bajty. Puristé by sice možná prohlásili, že tyto instrukce k procesorům s architekturou RISC nepatří (a měli by částečně pravdu!), při tvorbě aplikací se však ukazuje, že mnoho dat je a bude stále organizováno po bajtech – jedná se například o ASCII řetězce, řetězce kódované v UTF-8, hodnoty pixelů (barvové složky Red/Green/Blue a průhlednost Alpha) atd. Aritmetické a logické instrukce sice stále zpracovávají pouze 32bitové operandy, ovšem data načítaná z operační paměti mohou mít jiný formát. Nejjednoduššími instrukcemi typu Load & Store, které dokážou pracovat s jednotlivými bajty, jsou instrukce LDRB (Load Byte) a STRB (Store Byte), v nichž se neprovádí znaménkové rozšíření hodnoty bajtu na celé 32bitové číslo. Tyto instrukce mají následující formát, který se vlastně prakticky vůbec neliší od formátu instrukcí uvedeného v předchozí kapitole (změnil se jen obsah jediného bitu, konkrétně bitu číslo 10):
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | L | 1 | 0 | Ro | Rb | Rd | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Význam všech bitových polí instrukčního slova zůstává zachován, tj.:
| Registr | Význam |
|---|---|
| Rb | registr obsahující 32bitovou bázovou adresu bajtu |
| Ro | registr obsahující 32bitový offset bajtu |
| Rd | registr, jehož spodních osm bitů se má uložit či načíst z/do paměti |
| Bit 11 (L) | Význam |
|---|---|
| 0 | Store – uložení spodních osmi bitů registru Rd do paměti |
| 1 | Load – načtení bajtu z paměti a uložení do spodních osmi bitů registru Rd |
4. Načtení či uložení bajtu se znaménkovým rozšířením na 32bitové slovo
Již v předchozí kapitole jsme se zmínili o tom, že aritmeticko-logická jednotka mikroprocesorů ARM dokáže pracovat pouze s 32bitovými operandy. Vzhledem k tomu, že s využitím instrukcí LDRB a STRB lze z každého 32bitového registru získat pouze jeho spodních osm bitů, mohlo by se zdát, že nám toto omezení v praxi nebude nijak vadit. To je sice, pravda, ale pouze v případě, že se pracuje s bajty obsahujícími celá čísla bez znaménka (0..255), ASCII kódy znaků atd. Problémy by ovšem mohly nastat například tehdy, pokud by bylo nutné pracovat s bajty, v nichž je uložena celočíselná hodnota se znaménkem (-128..127). V tomto případě je totiž nutné, aby se při načtení bajtu provedlo takzvané znaménkové rozšíření na šířku 32 bitů. Znaménkové rozšíření se provádí následovně: v načítaném bajtu je znaménko uloženo v nejvyšším bitu, tj. bitu s indexem 7. Hodnota tohoto bitu je následně zkopírována do bitů 8 až 31. To znamená, že pokud je načtena hodnota 0..127, jsou bity 8 až 31 nulové (a bit 7 samozřejmě taky), v opačném případě je bit 7 nastavený na jedničku, která je zkopírována i do bitů 8 až 31.
Příslušná instrukce, která provede načtení bajtu z operační paměti společně se znaménkovým rozšířením, má název LDSB (Load Sign-extended Byte), a formát jejího instrukčního slova vypadá následovně:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | 0 | 1 | 1 | Ro | Rb | Rd | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Význam registrů Ro, Rb a Rd zůstává zachován:
| Registr | Význam |
|---|---|
| Rb | registr obsahující 32bitovou bázovou adresu |
| Ro | registr obsahující 32bitový offset |
| Rd | registr, do něhož se uloží bajt přečtený z operační paměti, který je znaménkově rozšířen |
Poznámka: povšimněte si, že k instrukci LDSB neexistuje ekvivalentní instrukce STSB. To ve skutečnosti ani není nutné, protože pro uložení bajtu obsahujícího hodnotu se znaménkem lze využít instrukci STRB popsanou v předchozí kapitole (při ukládání totiž není nutné provádět žádné konverze, tj. ani manipulaci s ukládanými bity).
5. Práce se 16bitovými slovy
Vzhledem k tomu, že jsme si již popsali instrukce pro načtení či uložení 32bitových slov i instrukce pro načtení či uložení jednotlivých bajtů, asi každého čtenáře napadne, jak je tomu s 16bitovými daty. I tato data se v praxi velmi často používají (nasamplované zvuky, znaky v kódování USC-2 či UTF-16, číselné hodnoty typu short int atd. atd.), proto asi není žádným překvapením, že se v instrukční sadě Thumb setkáme i s instrukcemi, které umožňují pracovat se slovy majícími šířku šestnáct bitů. Jedná se o trojici instrukcí LDRH (Load Halfword), STRH (Store Halfword) a LDSH (Load Sign-extended Halfword). Instrukční slovo pro všechny tři instrukce má stejný tvar:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | H | S | 1 | Ro | Rb | Rd | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Význam registrů Ro, Rb a Rd se nemění, proto si ho zde již nebudeme uvádět.
Pomocí bitů 10 (S) a 11 (H) je určeno, o kterou instrukci se má jednat:
| Bit H | Bit S | Instrukce | Význam |
|---|---|---|---|
| 0 | 0 | STRH | Store Halfword |
| 0 | 1 | LDRH | Load Halfword |
| 1 | 1 | LDSH | Load Sign-extended Halfword |
Poslední kombinace bitů H a S, kterou jsme si v předchozí tabulce neuvedli, je ve skutečnosti využita pro instrukci LDSB, jež byla popsána v předchozí kapitole.
Poznámka: opět platí, že po načtení 16bitového slova do pracovního registru jsou již všechny aritmetické i logické operace prováděny s plnou šířkou 32 bitů, podobně jako tomu bylo u původně osmibitových hodnot.
6. Relativní adresování využívající PC (Program Counter)
Již v předchozích částech tohoto seriálu jsme se zmínili o určitém problému, který nastane v tom případě, kdy se má do nějakého pracovního registru uložit nová 32bitová konstanta. Tento problém spočívá v tom, že – na rozdíl od mnoha procesorů s architekturou typu CISC – není možné mít ihned za instrukcí (instrukčním slovem) uloženou příslušnou 32bitovou konstantu, která by se do zvoleného pracovního registru mohla načíst. V mnoha případech lze sice využít načtení krátké konstanty umístěné přímo v instrukčním slovu (viz též minule popsané tříbitové a osmibitové konstanty používané v některých ALU instrukcích), ovšem někdy to není možné, protože je nutné pracovat s větší konstantou. Zde programátorům a překladačům přichází na pomoc instrukce LDR Rd, [PC+#offset], která pro adresování druhého operandu (konstanty v paměti) využívá obsah registru PC/R15 a offset. Konstanta totiž může být uložena společně s programovým kódem, ale nikoli přímo za instrukčním slovem, ale například až ZA koncem subrutiny či v některých případech ihned za instrukcemi skoku. Instrukce LDR Rd, [PC+#offset] má následující formát:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 0 | 1 | Rd | offset | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
V bitech 8 až 10 je uložen index pracovního registru, do něhož se má konstanta načíst. Zajímavější je obsah bitů 0 až 7. Zde je uložena osmibitová konstanta, která je nejprve posunuta o dva bity doleva (tj. provede se vynásobení čtyřmi) a následně je výsledek sečten s obsahem registru PC, který se však mezitím stihl zvýšit o hodnotu 4 (vliv instrukční pipeline). Na rozdíl od instrukcí skoku je však offset vždy chápán jako celé kladné číslo (unsigned), což znamená, že se vždy načítá konstanta umístěná někde ZA pozicí instrukce, konkrétně na adresách vzdálených 0 až 1020 bajtů od aktuální adresy, na níž ukazuje registru PC.
Za zmínku možná stojí fakt, že konstantu lze z oblasti, v níž se nachází strojový kód programu, pouze načíst a nikoli uložit (pro uložení by bylo nutné použít jiné instrukce). To v naprosté většině případů nevadí, navíc je mnoho procesorů ARM využíváno ve funkci mikrořadiče, kde je program uložen v paměti typu (E)ROM (dnes typu FLASH).
7. Relativní adresování využívající SP (Stack Pointer)
V předchozí kapitole jsme si popsali instrukci typu LDR Rd, [PC+#offset], tj. instrukci, pomocí níž je možné načíst konstantu umístěnou v oblasti, kde se nachází i strojový kód programu. Jedná se vlastně o speciální adresovací režim, který byl do instrukční sady Thumb přidán z toho důvodu, aby se dosáhlo co nejvyšší možné hustoty kódu. V této kapitole se taktéž budeme zabývat instrukcemi používajícími speciální adresovací režim. Jedná se o režim používaný při přístupu k prvkům ukládaným na zásobník. Připomeňme si, že v instrukční sadě Thumb je jako ukazatel na vrchol zásobníku rezervován registr R13. V manuálech i assembleru se sice pro tento registru používá i alternativní označení SP (Stack Pointer), ve skutečnosti se však spíše jedná o bázový registr ukazující v dané proceduře/subrutině na začátek zásobníkového rámce (stack frame). V praxi se totiž většinou mění obsah registru R13/SP právě při vstupu do subrutiny, popř. při návratu ze subrutiny.
Aby bylo možné velmi efektivně přistupovat k parametrům předávaným přes zásobník (a taktéž k lokálním proměnným!), je nutné umět adresovat položky na zásobníku relativně k R13/SP. Právě k tomu slouží instrukce s následujícím formátem:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 0 | 0 | 0 | L | Rd | offset | +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Jak je z formátu instrukčního slova patrné, jedná se o formát velmi podobný slovu popsanému v předchozí kapitole. I zde totiž můžeme najít index jednoho pracovního registru Rd a osmibitový offset. Ten je ještě před přičtením k registru R13/PC posunut o dva bity doleva. Určitě stojí za zmínku fakt, že se opět jedná o offset chápaný jako celé číslo bez znaménka, tj. s využitím těchto instrukcí není možné měnit obsah zásobníkových rámců vytvořených pro nadřazené subrutiny (to částečně přispívá k větší bezpečnosti). V praxi je tak možné, aby daná subrutina využívala až 256 32bitových parametrů a lokálních proměnných. Obsah parametrů a lokálních proměnných je samozřejmě nutné taktéž měnit; z tohoto důvodu je v bitu 11 (L) určeno, zda se jedná o instrukci typu Load či Store:
| Bit 11 (L) | Význam |
|---|---|
| 0 | Store – uložení registru do paměti (na zásobník) |
| 1 | Load – načtení registru z paměti (ze zásobníku) |
8. Instrukční sada Thumb: shrnutí
Popis instrukční sady Thumb se blíží k závěru. Nepopsali jsme si sice zcela všechny instrukce, které lze v této instrukční sadě nalézt, ale přibližně 90% instrukcí ano. Pro přehlednost jsou v následující tabulce vypsány až doposud zmíněné formáty instrukčních slov. Z tabulky je patrné, že tvůrci instrukční sady Thumb skutečně dokázali využít prakticky každý bit instrukce:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 0 | 0 |operace| offset | Rs | Rd | bitový posun či rotace +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 1 | 1 | 0 | op| Rn | Rs | Rd | ALU operace Rd := Rs +- Rn +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 1 | 1 | 1 | op| const. | Rs | Rd | ALU operace Rd := Rs +- const (3bity) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 0 | 1 |operace| Rd | osmibitová konstanta | ALU operace s osmibitovou konstantou +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 0 | 0 | 0 | operace | Rs | Rd | ALU operace Rd := Rd op Rs (16 operací) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | L | 0 | 0 | Ro | Rb | Rd | LDR, STR Rd, [Rb+Rd] (32 bit) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | L | 1 | 0 | Ro | Rb | Rd | LDRB, STRB Rd, [Rb+Rd] (bajt) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | 0 | 1 | 1 | Ro | Rb | Rd | LDSB (bajt, rozšíření znaménka) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 1 | H | S | 1 | Ro | Rb | Rd | LDRH, STRH, LDSH (16bit slovo, rozšíření znaménka) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 0 | 1 | 0 | 0 | 1 | Rd | offset | LDR Rd, [PC+#offset] +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 0 | 0 | 0 | L | Rd | offset | LRD/STR Rd, [SP+#offset] +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | S | konstanta | změna hodnoty SP +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 0 | 1 | 1 | L | 1 | 0 | R | seznam registrů | operace PUSH a POP +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 0 | 0 | L | Rd | seznam registrů | LDMIA, STMIA (načtení/uložení více registrů) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 0 | 1 | podmínka | osmibitová konstanta | podmíněný skok +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 1 | 0 | 0 | jedenáctibitová konstanta | nepodmíněný skok (branch) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 1 | 1 | 1 | 1 | H | jedenáctibitová konstanta | skok + link (branch and link) +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
9. Odkazy na Internetu
- Introduction to ARM thumb
http://www.eetimes.com/discussion/other/4024632/Introduction-to-ARM-thumb - ARM, Thumb, and ThumbEE instruction sets
http://www.keil.com/support/man/docs/armasm/armasm_CEGBEIJB.htm - 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/ - 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 - 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 - 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/