Obsah
1. 64bitové mikroprocesory s architekturou AArch64
2. Proč vlastně architektura AArch64 vznikla?
3. Od 32bitových RISCových ARMů k architektuře AArch64
5. Odlišnosti mezi původní 32bitovou architekturou ARM a AArch64
6. AArch64 a další RISCové i CISCové architektury
8. Provádění instrukcí mimo pořadí (out of order)
9. Aritmeticko-logická jednotka a matematický koprocesor
11. Speciální význam třicátého druhého registru
12. Operace s 32bitovými a 64bitovými operandy
13. Rozšířené možnosti adresování
14. Zjednodušení instrukční sady v porovnání s 32bitovými ARMy
1. 64bitové mikroprocesory s architekturou AArch64
V poměrně velkém množství moderních elektronických zařízení, ať již se jedná o tablety či o jednodeskové mikropočítače, se můžeme setkat s mikroprocesory založenými na 64bitové architektuře AArch64 vyvinuté ve společnosti ARM. Tato architektura je sice do jisté míry odvozena od původní „klasické“ 32bitové RISCové architektury ARM (dnes pro odlišení nazývané ARM32 či dokonce jen A32), ovšem při přechodu na 64bitový systém došlo k mnoha podstatným změnám, které se týkají jak počtu a funkce pracovních registrů, tak i instrukční sady, jež se v některých ohledech od původní RISCové sady dosti podstatným způsobem odlišuje. Čipy s jádry AArch64 dnes patří ve „světě ARM“ mezi nejvýkonnější a licenci pro jejich použití už získala řada společností, včetně Apple (nejznámější je pravděpodobně její SoC/system on chip nazvaný Apple A7, který je použitý v iPhone 5S), NVidie, Qualcommu či Samsungu. Zajímavé ovšem je, že například TI sice používá kombinaci DSP+ARM, ovšem prozatím se drží spíše 32bitových ARMovských jader, protože výpočetně náročné části jsou prováděny právě na DSP.
Obrázek 1: Osmibitový mikropočítač Acorn BBC Micro založený na slavném osmibitovém mikroprocesoru MOS 6502. Ve chvíli, kdy výkon tohoto mikroprocesoru přestal dostačovat pro další modely počítače, se firma ARM rozhodla, že vyvine vlastní mikroprocesor.
2. Proč vlastně architektura AArch64 vznikla?
Existuje hned několik dobrých důvodů, proč se společnost ARM Holdings odhodlala k poměrně rizikovému a velmi pravděpodobně i finančně náročnému kroku, tj. k vývoji zcela nové a zpětně nekompatibilní architektury. Mikroprocesory ARM se totiž začaly používat v nových oblastech, například pro některé servery, kde již možnosti 32bitových adres nemusely být dostačující. Navíc původní 32bitová architektura začala vykazovat určité známky zastaralosti, což pravděpodobně není až tak překvapivé, zvláště když si uvědomíme, že první RISCové ARMy začaly být testovány již v roce 1985, tj. prakticky před 32 roky. Bylo tedy jen logické, že se vylepšení původní architektury a současně přechod na 64bitovou aritmeticko-logickou jednotku a adresování, provede v jednom kroku a současně se zachová původní portfolia mikroprocesorů a mikrořadičů. Nová architektura i s ní spojená instrukční sada byly navrženy s ohledem na moderní překladače a virtuální stroje. Společnost ARM se v tomto ohledu mohla opřít o mnohaleté studium chování existujících aplikací (ostatně právě na základě tohoto studia byly v minulosti vytvořeny instrukční sady Thumb a Thumb-2).
Obrázek 2: Dobový plakát s počítačem Acorn BBC Micro.
3. Od 32bitových RISCových ARMů k architektuře AArch64
Mikroprocesory a mikrořadiče ARM za sebou mají dlouhou dobu vývoje, takže není divu, že postupně vznikaly různé generace těchto čipů, které se od sebe odlišovaly jak svým výpočetním výkonem, tak i různými změnami v instrukční sadě (obecně lze říci, že jednotlivá jádra mezi sebou nejsou binárně kompatibilní), uspořádáním cache, počtem řezů (pipeline), použitými submoduly (hardwarová násobička, dělička, jednotka pro SIMD operace, matematický koprocesor, DSP) atd. Čipy ARM je možné rozlišit podle architektury, přičemž základní dělení je naznačeno v následující tabulce:
# | Architektura | Adresová/datová sběrnice | Jádro | Poznámka/profil (u Cortex) |
---|---|---|---|---|
1 | ARMv1 | 26/32 bitů | ARM1 | první implementace, technologické demo |
2 | ARMv2 | 26/32 bitů | ARM2, ARM3 | přidána HW násobička a MMU |
3 | ARMv3 | 26/32 bitů | ARM6, ARM7 | |
4 | ARMv4 | 26/32 bitů | ARM8 | patří sem mj. i řada čipů StrongARM |
5 | ARMv5 | 32 bitů | ARM7EJ, ARM9E, ARM10E | lze najít ve starších zařízeních |
6 | ARMv6 | 32 bitů | ARM11 | dodnes používaná jádra |
7 | ARMv6-M | 32 bitů | Cortex-M0, Cortex-M0+, Cortex-M1 | mikrořadiče (M v názvu) |
8 | ARMv7-M | 32 bitů | Cortex-M3 | mikrořadiče (poznáme podle M v názvu) |
9 | ARMv7E-M | 32 bitů | Cortex-M4, Cortex-M7 | mikrořadiče (M v názvu) |
10 | ARMv7-R | 32 bitů | Cortex-R4, Cortex-R5, Cortex-R7 | realtime aplikace (R v názvu) |
11 | ARMv7-A | 32 bitů | Cortex-A5, Cortex-A7, Cortex-A8, Cortex-A9, Cortex-A12, Cortex-A15, Cortex-A17 | smartphony atd. |
12 | ARMv8-A | 32/64 bitů | Cortex-A35, Cortex-A53, A57, A72 a A73 | smartphony atd. |
Obrázek 3: Osobní počítač firmy Acorn, který byl vybavený mikroprocesorem ARM s architekturou RISC. Minimálně v Británii se jednalo o jeden z přelomových počítačů.
V dalším textu nás budou zajímat především čipy s architekturou ARMv8-A, která je vypsána na posledním řádku předchozí tabulky. Jader s architekturou ARMv8–8A existuje hned několik; liší se od sebe především tím, zda se u nich preferuje spíše vysoký výpočetní výkon či zda se naopak jedná o jádra s vyváženým poměrem spotřeba energie/výpočetní výkon. Mimochodem – povšimněte si koncovky A u jména mikroprocesorového jádra. Ta značí, že tato jádra jsou určena pro běžnou aplikační elektroniku, smartphony, počítače atd. Jádra s koncovkou M jsou určena pro mikrořadiče a jádra s koncovkou R pro realtime aplikace. Číslování jader ARMv8-A může vést ke zmatkům, proto jsou tato jádra v další tabulce rozdělena podle toho, jaká vlastnost u nich převažuje. Povšimněte si, že i přes relativní modernost ARMv8-A už existují jádra starší, která jsou postupně nahrazována vylepšenými variantami:
Priorita | Jádro ARMv7-A | Jádro ARMv8-A | Novější model |
---|---|---|---|
vysoký výkon | Cortex-A17 | Cortex-A72 | Cortex-A73, Cortex-A75 |
vysoký výkon | Cortex-A15 | Cortex-A57 | × |
el. efektivita | Cortex-A9 | Cortex-A53 | Cortex-A55 |
vysoká efektivita | Cortex-A7 | Cortex-A35 | × |
vysoká efektivita | Cortex-A5 | Cortex-A35 | × |
Obrázek 4: Hra Zarch od známého programátora Davida Brabena (který je spoluautorem slavné hry Elite) pro počítač Acorn Archimedes. Výkon čipů ARM byl (na svou dobu) tak velký (cca 4,5 MIPS pro 32bitové operace), že postačoval na SW rendering této hry – Acorn Archimedes totiž neměl žádné multimediální koprocesory, na rozdíl od Amigy či Atari ST, které ovšem měly slabší CPU (0,5 pro 32bitové operace až maximálně 2 MIPSy pro operace 32bitové).
4. Rodina jader ARMv8-A
V současnosti používané 64bitové čipy ARM patří do rodiny ARMv8-A. Nalezneme zde například jádra Cortex-A35, Cortex-A53, Cortex-A57, Cortex-A72 a Cortex-A73, které se od sebe odlišují především výpočetním výkonem a energetickými nároky. Čipy s těmito jádry lze nalézt ve výkonných tabletech, ale i serverech. Vzhledem k tomu, že u ARMv8-A je zaručena zpětná kompatibilita s existující 32bitovou architekturou ARMv7-A, znamená to, že mikroprocesory je možné přepnout mezi 32bitovým kompatibilním režimem a plnohodnotným 64bitovým režimem (ve skutečnosti se v 32bitovém režimu je možné provést přepnutí mezi A32 a T32, tj. mezi původními RISCovými instrukcemi a instrukcemi Thumb/Thumb2).
Zajímavé je, že i přesto, že všechny typy jader ARMv8-A patří do stejné rodiny a mají například shodnou instrukční sadu, neplatí to o interní realizaci čipu. Podle toho, jak výkonná jádra mají být se odlišuje i počet řezů pipeline. V další tabulce uvádím počet řezů pro jádra vyráběná přímo společností ARM zatímco například u čipů Cyclone od Apple má pipeline dokonce šestnáct řezů a Mongoose od Samsungu podle čipu 15 až 17 řezů:
Jádro | Revize | Pipeline |
---|---|---|
Cortex-A35 | ARMv8-A | 8 |
Cortex-A53 | ARMv8-A | 8 |
Cortex-A55 | ARMv8.2-A | 8 |
Cortex-A57 | ARMv8-A | 15 |
Cortex-A72 | ARMv8-A | 15 |
Cortex-A73 | ARMv8-A | 11–12 |
Cortex-A75 | ARMv8.2-A | 11–13 |
Jednotlivé čipy s 64bitovými ARMovskými jádry se od sebe odlišují i konfigurací pamětí cache. Základní stavba cache je sice prakticky shodná – L1 cache (cache první úrovně) je striktně rozdělena na cache pro data (D-cache) a cache pro strojové instrukce (I-cache), zatímco L2 cache (cache druhé úrovně) je společná pro obě skupiny informací – ovšem liší se kapacity cache, opět podle toho, jak výkonný má čip být. U novějších modelů Cortex-A55 a Cortex-A75 je dokonce podporována i cache třetí úrovně (L3 cache), která je pochopitelně opět společná pro data i pro instrukce:
Jádro | L1 I-cache | L1 D-cache | L2 cache | L3 cache |
---|---|---|---|---|
Cortex-A35 | 8–64 | 8–64 | 128 kB–1 MB | × |
Cortex-A53 | 8–64 | 8–64 | 128 kB–2 MB | × |
Cortex-A55 | 16–64 | 16–64 | 0 kB–256 kB / jádro | až 4MB |
Cortex-A57 | 48 | 32 | 0.5–2 MB | × |
Cortex-A72 | 48 | 32 | 0.5–4 MB | × |
Cortex-A73 | 64 | 32/64 | 1–8 MB | × |
Cortex-A75 | 64 | 64 | 256 kB nebo 512 kB / jádro | až 4MB |
5. Odlišnosti mezi původní 32bitovou architekturou ARM a AArch64
Z pohledu programátora pracujícího v assembleru je architektura AArch64 v několika ohledech odlišná od původní 32bitové architektury. Především se zvýšil počet pracovních registrů z patnácti na 31. Všechny registry se navíc rozšířily z třiceti dvou bitů na 64 bitů. Ovšem mnohé operace stále podporují i 32bitové operandy – v tomto případě se použije ta samá skupina registrů, z nichž se ovšem využije jen spodních 32 bitů (nedochází zde tedy k rozdvojení každého 64bitového registru na dva registry 32bitové, jak to známe z jiných typů procesorů). Podporován je i matematický koprocesor, jehož struktura se v mnoha ohledech blíží VPS. Nesmíme zapomenout ani na změny v instrukční sadě, které budou popsány níže. Poslední důležitým vylepšením je „zadrátování“ podpory pro AES, SHA-1 a SHA-256, což je využitelné jak na tabletech či smartphonech, tak i na serverech (o podrobnostech se zmíníme v dalších částech tohoto seriálu).
Došlo též k přidání dalších technologií, zejména pak TrustZone, jejíž licenci později získala i společnost AMD. O TrustZone, která je užitečná jak pro klasické aplikační oblasti (smartphony), tak i pro mikrořadiče, vyjde samostatný článek.
6. AArch64 a další RISCové i CISCové architektury
Zajímavé a poučné může být porovnání architektury AArch64 s dalšími populárními RISCovými i CISCovými architekturami, které je patrné při pohledu na další tabulku, v níž jsou stručně (bez podrobnějších vysvětlení různých specialit) vypsány počty a bitové šířky pracovních registrů u některých oblíbených (i neoblíbených) a používaných mikroprocesorů a mikroprocesorových jader. Z této tabulky je zřejmé, že klasické CISCové procesory měly k dispozici menší počet registrů; navíc tyto registry nebyly zcela univerzální, což platí jak pro procesory řady i386, tak i pro Motorolu 68000 (rozdělení na datové a adresové registry). Naproti tomu většina klasických RISCových procesorů, tj. MIPS a SPARC, se drží oblíbeného schématu 31×32bitů, protože jeden z registrů obsahuje konstantní nulu. Původní 32bitové čipy ARM (A32) stojí klasicky na pomezí mezi těmito dvěma extrémy, což se změnilo právě s příchodem A64 (AArch 64):
Řada | Architektura | Registry |
---|---|---|
Motorola 68000 | CISC | 8×32bit + 8×32bit |
IA-32 (i386) | CISC | 8×32bit |
x86_64 | CISC | 16×64bit |
IA-64 | EPIC | 128×64bit |
Atmel AVR | RISC | 32×8bit |
MIPS (32) | RISC | 31×32bit + zero |
SPARC | RISC | 31×32bit + zero |
RISC-V | RISC | 31×32bit + zero |
ARM (A32) | RISC | 15×32bit |
ARM (A64) | RISC | 31×64bit + zero |
7. Prediktory skoků
Užitečnou technologií, kterou je vybavena většina jader ARMv8 (kromě Cortex-A53 a Cortex-A55, u nichž se více dbá na menší plochu čipu a menší spotřebu) jsou takzvané prediktory skoků. Ty slouží, jak ostatně jejich název napovídá, k tomu, že dopředu odhadnou, zda se podmíněný skok provede či nikoli a na základě toho začnou do instrukční pipeline vkládat (a postupně zpracovávat) buď instrukce, které se nachází ihned za instrukcí podmíněného skoku či naopak v cíli skoku. U jednotlivých skoků nahrazujících konstrukci typu if je samozřejmě predikce spíše loterií, ovšem známé pravidlo 90/10 (nebo 80/20) nám říká, že 90 procent času běhu programu se stráví v pouhých deseti procentech kódu, tj. musí se typicky jednat o nějaké programové smyčky, u kterých by bylo dobré skoky predikovat. Existuje více způsobů implementace prediktorů skoků. My si vysvětlíme prediktory jednobitové a dvoubitové, protože právě ty nalezneme u jader ARMv8-A.
Jednoduchý jednobitový prediktor skoků pracuje tak, že si procesor u každého skoku v jednom bitu zapamatuje, zda byl skok proveden či nikoli. Když se v instrukční pipeline znovu skok objeví (souhlasí jeho adresa), tak se procesor na základě předešlého běhu programu rozhodne, které další instrukce se pravděpodobně budou zpracovávat. Při prvním volání skoku má prediktor pouze padesátiprocentní úspěšnost, ta se potom zvyšuje. Například u smyčky, která by měla proběhnout 100× (to ovšem procesor dopředu nemusí vědět) se sice při prvním průchodu prediktor splete (za což je penalizován „vysypáním“ pipeline), ovšem v dalších 98 průchodech už správně odhadne, že se skok provede. Poslední průchod je znovu odhadnut špatně, což je ovšem pochopitelné. Výsledkem je poměrně úspěšné a především rychlé provedení všech instrukcí ve smyčce, přičemž je úspěšnost predikce skvělých 98 procent (to je ovšem ideální případ).
Dvoubitový prediktor pracuje velmi podobným způsobem, ovšem pamatuje si nejenom předchozí výsledek skoku (proveden, neproveden), ale i minulý stav predikce. Pro mnoho typů podmínek je výhodnější, než jednobitový prediktor, protože i jeden špatný odhad ještě nezmění stav prediktoru.
Použití prediktorů na čipech AArch64:
Jádro | Revize | Prediktor skoků |
---|---|---|
Cortex-A35 | ARMv8-A | ✓ |
Cortex-A53 | ARMv8-A | ✓ |
Cortex-A55 | ARMv8.2-A | × |
Cortex-A57 | ARMv8-A | ✓ 2bit |
Cortex-A72 | ARMv8-A | ✓ 2bit |
Cortex-A73 | ARMv8-A | ✓ 2bit |
Cortex-A75 | ARMv8.2-A | ✓ 2bit |
8. Provádění instrukcí mimo pořadí (out of order)
Velmi účinnou technikou vedoucí ke snížení cyklů mikroprocesoru, ve kterých se žádná činnost neprovádí, spočívá v takzvaném provádění instrukcí mimo pořadí (out of order). U klasických in order mikroprocesorů, které mají instrukční pipeline, totiž nastává situace, ve které musí následující instrukce čekat na provedení instrukce předchozí, většinou z toho důvodu, že předchozí instrukce modifikuje nějaký pracovní registr či příznak, který následující instrukce potřebuje ke svému zdárnému provedení. To samozřejmě znamená nežádoucí zdržení, protože se nevyužijí všechny cykly mikroprocesoru. V případě architektury out of order však není nic ztraceno, protože je možné začít provádět nějakou jinou instrukci, u níž je zaručeno, že používá jiné pracovní registry a příznaky (popř. je možné použít stínové pracovní registry). Interně se řazení instrukcí provádí na základě jejich ukládání do instrukční fronty (nazývané také rezervační stanice), ze které jsou instrukce vybírány ve chvíli, kdy jsou známy hodnoty jejich operandů.
Použití out of order technologie na čipech AArch64:
Jádro | Revize | Out of order |
---|---|---|
Cortex-A35 | ARMv8-A | × |
Cortex-A53 | ARMv8-A | × |
Cortex-A55 | ARMv8.2-A | × |
Cortex-A57 | ARMv8-A | ✓ |
Cortex-A72 | ARMv8-A | ✓ |
Cortex-A73 | ARMv8-A | ✓ |
Cortex-A75 | ARMv8.2-A | ✓ |
9. Aritmeticko-logická jednotka a matematický koprocesor
Kromě toho, že aritmeticko-logická jednotka byla rozšířena pro zpracování 64bitových operandů u prakticky všech instrukcí, došlo k jejímu doplnění o násobičku a děličku. Násobička může provádět i operace typu MAC (Multiply Accumulate). K dispozici jsou následující kombinace operandů:
Operace | Vstupní operandy | Výsledek |
---|---|---|
MUL | 32×32 bitů | 32 bitů |
MUL | 64×64 bitů | 64 bitů |
MUL | 32×32 bitů | 64 bitů (rozšíření) |
MUL | 64×64 bitů | horních 64 bitů (rozšíření) |
MAC | 32±32×32 bitů | 32 bitů |
MAC | 64±64×64 bitů | 64 bitů |
MAC | 64±32×32 bitů | 64 bitů (rozšíření) |
Pokud je vyžadováno násobení 64×64 bitů se 128bitovým výsledkem, je nutné zkombinovat druhou a čtvrtou instrukci.
Matematický koprocesor je u architektury AArch64 volitelný, ale oproti 32bitovým ARMům došlo ke zjednodušení – už neexistuje rozdělení ABI na soft floating point a hard floating point, protože pro předávání hodnot typu float a double jsou vždy použity FP registry popsané v další kapitole. Z technologického hlediska sice není soft floating point špatné řešení, ale prakticky způsobovalo (a způsobuje) množství problémů při distribuci knihoven i aplikací.
10. Sada pracovních registrů
Původních patnáct pracovních registrů pojmenovaných R0 až R14, které známe z 32bitových procesorů ARM, bylo rozšířeno na 31 registrů, z nichž každý má šířku 64 bitů. Z tohoto důvodu muselo dojít k úpravě pojmenování registrů způsobem, který je naznačený v následující tabulce:
Jméno | Význam |
---|---|
r0..r30 | použito například v dokumentaci, popisu ABI atd. |
x0..x30 | celý 64bitový registr použitý jako zdroj či cíl |
w0..w30 | spodních 32 bitů registru (horních 32 bitů výsledku je buď vynulováno nebo znaménkově rozšířeno) |
Všechny tyto registry mají v instrukční sadě stejné postavení, na rozdíl od instrukční sady Thumb, v níž se pro některé instrukce může použít jen spodních osm registrů (ostatně v „pravých“ RISCových procesorech je zvykem používat všechny registry shodným způsobem).
Další sada registrů je používána při operacích s typy single/float a double (tedy s operandy reprezentovanými v systému plovoucí řádové čárky), u SIMD operací a taktéž kryptografickým modulem:
Jméno | Význam |
---|---|
v0..v31 | 128bitové registry |
d0..d31 | spodních 64 bitů registrů v0..v31, použito pro hodnoty typu double |
s0..s31 | spodních 32 bitů registrů v0..v31, použito pro hodnoty typu single/float |
Pro SIMD operace, tj. operace pracující s vektory, se registry vn rozdělují takto:
Tvar (shape) | Celkem | Pojmenování v assembleru |
---|---|---|
8b×8 | 64b | Vn.8B |
8b×16 | 128b | Vn.16B |
16b×4 | 64b | Vn.4H |
16b×8 | 128b | Vn.8H |
32b×2 | 64b | Vn.2S |
32b×4 | 128b | Vn.4S |
64b×1 | 64b | Vn.1D |
64b×2 | 128b | Vn.2D |
Povšimněte si, že – na rozdíl od mnoha jiných architektur – nedochází k tomu, že by se například dva single registry mapovaly do jednoho double registru atd.
Mezi speciální registry patří především:
Jméno | Význam zkratky |
---|---|
SCTLR_ELn | System Control Register |
ACTLR_ELn | Auxiliary Control Register |
SCR_EL3 | Secure Configuration Register |
HCR_EL2 | Hypervisor Configuration Register |
MIDR_EL1 | Main ID Register |
MPIDR_EL1 | Multiprocessor Affinity Register |
Význam těchto registrů bude popsán později.
11. Speciální význam třicátého druhého registru
V pořadí třicátý druhý registr, tj. registr se jménem x31 či w31, není ve skutečnosti běžným pracovním registrem, protože má dva speciální významy. V případě použití tohoto registru v aritmetických či logických instrukcích se při použití ve funkci vstupního operandu tento registr chová jako konstantní nula a při použití ve funkci operandu výstupního jako /dev/null (výsledek se zahodí a neovlivní skutečnou hodnotu uloženou do registru). Proto se v assembleru může pro pojmenování tohoto registru použít jméno xzr či wzr (extended zero register, working zero register). U instrukcí pracujících se zásobníkem se tento registr chová jako ukazatel na vrchol zásobníku a proto se pro něj v assembleru používá jméno rsp či jen SP (na velikosti písmen u jmen registrů samozřejmě nezáleží).
Poznámky:
- Registr x30 se používá ve funkci LR (Link Register).
- Registr PC není přímo dostupný. Toto je jeden z největších viditelných rozdílů mezi ARM 32 a AArch64.
12. Operace s 32bitovými a 64bitovými operandy
U většiny aritmetických instrukcí je možné zvolit, zda se mají operace provádět s 32bitovými či naopak se 64bitovými operandy. U 64bitových operandů je vlastní provedení instrukce jednoduché, ovšem u 32bitových operandů je nutné zajistit, aby měl výsledek operace smysl i ve chvíli, kdy se převede na 64 bitů. Z tohoto důvodu je při použití 32bitového zdrojového operandu horních 32 bitů původně 64bitového registru ignorováno a při použití 32bitového cílového operandu se horních 32 bitů buď vynuluje (většina instrukcí) či znaménkově rozšíří. U 32bitových operací se navíc základní příznaky (zero, carry, negative…) nastavují pouze na základě 32bitového výsledku (což je ostatně logické). Některé výjimky, které se týkají například bitových posunů a rotací, si popíšeme u konkrétních instrukcí, kterých se to týká.
13. Rozšířené možnosti adresování
Díky použití pracovních registrů se šířkou 64 bitů se samozřejmě dosti podstatným způsobem rozšířil adresní prostor, který by jinak byl omezen na „pouhých“ 32 bitů. Teoretický adresový rozsah 64 bitů je u architektury AArch64 ve skutečnosti snížen na 49 bitů virtuální adresy, což je však podle všeho dostačující, a to i pro relativně vzdálenou budoucnost. Navíc se horních osm bitů adresy ignoruje, což znamená, že do této oblasti registru použitého pro adresování je možné uložit takzvaný „tag“. Tato technika se v některých programovacích jazycích používá například pro rozlišení datového typu či pro rozlišení, zda jde o primitivní typ nebo ukazatel (příkladem mohou být jazyky odvozené od LISPu).
Některá další omezení jsou způsobena tím, že všechny instrukce mají konstantní šířku 32 bitů a tudíž v nich není prostor pro uvedení 64bitové konstanty či adresy:
- Pro podmíněné skoky může cíl skoku ležet v rozsahu ±1 MB (což prakticky ve všech případech postačuje)
- Pro relativní skoky může cíl opět ležet v rozsahu ±1 MB
- U nepodmíněných skoků je rozsah větší, celých ±128 MB (což by opět mělo dostačovat pro prakticky všechny účely)
- Generování adresy (ukládané do registru) lze implementovat dvojicí instrukcí pro rozsah 4GB
U většiny programového kódu, který ve své zdrojové podobě obsahuje relativně krátké funkce či metody, by se tato omezení neměla vůbec projevit. Ostatně vždy lze omezení obejít použitím podmíněného skoku s opačnou podmínkou následovaného nepodmíněným skokem, což je činnost prováděná překladači.
14. Zjednodušení instrukční sady v porovnání s 32bitovými ARMy
Instrukční sada AArch64 se oproti původní 32bitové RISCové sadě (a ještě více od sady Thumb a Thumb-2) v několika ohledech liší, především pak v následujících oblastech:
- Byly odstraněny instrukce LDM, STM, PUSH a POP ve variantě s bitovým polem registrů
- Naproti tomu lze použít instrukce LDP a STP pracující s libovolnými dvěma registry (zajímavá myšlenka na využití 32bitového slova)
- Byly odstraněny prefixy pro podmínku, nyní jsou podmínky použity jen u skoků a několika dalších vybraných instrukcí
- Byl odstraněn prefix IT známý z Thumb-2
Tyto změny jsou založeny na výsledcích benchmarků, protože současné prediktory skoků jsou již velmi kvalitní. Navíc odstranění podmínkových bitů umožnilo použití více bitů v instrukčním slově pro jiné účely.
Poznámka: u instrukcí LDM a STM je v operačním kódu instrukce použito jedno bitové pole o šířce 16 bitů, které je 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. Tyto instrukce navíc dovolují manipulovat s tím registrem, který je použit jako ukazatel do paměti, kam se registry ukládají či odkud se naopak čtou jejich nové hodnoty. Obsah tohoto adresového registru je možné zvýšit či naopak snížit, a to buď před provedením operace LOAD/STORE nebo až posléze. Z tohoto důvodu se instrukce LDM a STM na 32bitových architekturách ARM používají při implementaci zásobníkových rámců i když se striktně řečeno vlastně nejedná o čistě RISCové instrukce.
15. Instrukční sada AArch64
Nová instrukční sada AArch64 obsahuje instrukce, které je možné rozdělit do několika oblastí podle toho, jaká jednotka tyto instrukce skutečně spouští:
Skupina | Další dělení |
---|---|
Load-Store | Load-Store pro jeden registr |
Load-Store pro dvojici registrů | |
Prefetch | |
Skoky | Nepodmíněné skoky |
Nepodmíněný skok na adresu v registru | |
Podmíněné skoky | |
ALU operace | Základní aritmetické instrukce |
Násobení a dělení | |
Logické instrukce | |
Znaménkové rozšíření operandu či rozšíření o nuly | |
Bitové operace | |
Extrakce dat | |
Bitové posuny | |
Aritmetické posuny | |
Podmíněné zpracování dat | |
Podmíněné porovnání | |
FP operace | Přenos operandů mezi registry |
Konverze mezi různými formáty | |
Převod na celá čísla (zaokrouhlení) | |
Základní aritmetické operace | |
Výpočet minima a maxima | |
MAC (Multiply Accumulate) | |
Porovnání operandů | |
Podmíněný výběr operandu | |
SIMD operace | Aritmetické operace se skaláry |
Aritmetické operace s vektory | |
Permutace vektorů | |
Konverze dat | |
Instrukce z crypto extension (patří do SIMD) | |
Systémové instrukce | Zpracování výjimek |
Přístup k systémovým registrům | |
Implementace bariér | |
Instrukce pro jádro systému |
Jednotlivé instrukce (či spíše jejich skupiny) si podrobněji popíšeme v navazujícím textu.
16. Odkazy na Internetu
- Comparison of ARMv8-A cores
https://en.wikipedia.org/wiki/Comparison_of_ARMv8-A_cores - Cortex-A32 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a32-processor.php - Cortex-A35 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a35-processor.php - Cortex-A53 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a53-processor.php - Cortex-A57 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a57-processor.php - Cortex-A72 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a72-processor.php - Cortex-A73 Processor
https://www.arm.com/products/processors/cortex-a/cortex-a73-processor.php - Apple A7 (SoC založen na CPU Cyclone)
https://en.wikipedia.org/wiki/Apple_A7 - System cally pro AArch64 na Linuxu
https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/unistd.h - Architectures/AArch64 (FedoraProject.org)
https://fedoraproject.org/wiki/Architectures/AArch64 - SIG pro AArch64 (CentOS)
https://wiki.centos.org/SpecialInterestGroup/AltArch/AArch64 - The ARMv8 instruction sets
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch05s01.html - A64 Instruction Set
https://developer.arm.com/products/architecture/instruction-sets/a64-instruction-set - Switching between the instruction sets
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch05s01.html - The A64 instruction set
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch05s01.html - Introduction to ARMv8 64-bit Architecture
https://quequero.org/2014/04/introduction-to-arm-architecture/ - MCU market turns to 32-bits and ARM
http://www.eetimes.com/document.asp?doc_id=1280803 - Cortex-M0 Processor (ARM Holdings)
http://www.arm.com/products/processors/cortex-m/cortex-m0.php - Cortex-M0+ Processor (ARM Holdings)
http://www.arm.com/products/processors/cortex-m/cortex-m0plus.php - ARM Processors in a Mixed Signal World
http://www.eeweb.com/blog/arm/arm-processors-in-a-mixed-signal-world - ARM Architecture (Wikipedia)
https://en.wikipedia.org/wiki/ARM_architecture - DSP for Cortex-M
https://developer.arm.com/technologies/dsp/dsp-for-cortex-m - Cortex-M processors in DSP applications? Why not?!
https://community.arm.com/processors/b/blog/posts/cortex-m-processors-in-dsp-applications-why-not - White Paper – DSP capabilities of Cortex-M4 and Cortex-M7
https://community.arm.com/processors/b/blog/posts/white-paper-dsp-capabilities-of-cortex-m4-and-cortex-m7 - Q (number format)
https://en.wikipedia.org/wiki/Q_%28number_format%29 - TriCore Architecture & Core
http://www.infineon.com/cms/en/product/microcontroller/32-bit-tricore-tm-microcontroller/tricore-tm-architecture-and-core/channel.html?channel=ff80808112ab681d0112ab6b73d40837 - TriCoreTM V1.6 Instruction Set: 32-bit Unified Processor Core
http://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?fileId=db3a304412b407950112b409b6dd0352 - TriCore v2.2 C Compiler, Assembler, Linker Reference Manual
http://tasking.com/support/tricore/tc_reference_guide_v2.2.pdf - Infineon TriCore (Wikipedia)
https://en.wikipedia.org/wiki/Infineon_TriCore - C166®S V2 Architecture & Core
http://www.infineon.com/cms/en/product/microcontroller/16-bit-c166-microcontroller/c166-s-v2-architecture-and-core/channel.html?channel=db3a304312bef5660112c3011c7d01ae - 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 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 projektu
https://iis.ee.ethz.ch/~gmichi/asocd/lecturenotes/Lecture6.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