Hlavní navigace

64bitové mikroprocesory s architekturou AArch64

6. 6. 2017
Doba čtení: 21 minut

Sdílet

V roce 2011 byla společností ARM představena specifikace nových procesorových jader ARMv8-A. Tato jádra, která dnes nalezneme mj. i v nových smartphonech, se v mnoha ohledech liší od starších ARMovských jader.

Obsah

1. 64bitové mikroprocesory s architekturou AArch64

2. Proč vlastně architektura AArch64 vznikla?

3. Od 32bitových RISCových ARMů k architektuře AArch64

4. Rodina jader ARMv8-A

5. Odlišnosti mezi původní 32bitovou architekturou ARM a AArch64

6. AArch64 a další RISCové i CISCové architektury

7. Prediktory skoků

8. Provádění instrukcí mimo pořadí (out of order)

9. Aritmeticko-logická jednotka a matematický koprocesor

10. Sada pracovních registrů

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

15. Instrukční sada AArch64

16. Odkazy na Internetu

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 R0R14, 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:

  1. Registr x30 se používá ve funkci LR (Link Register).
  2. 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:

  1. Byly odstraněny instrukce LDM, STM, PUSH a POP ve variantě s bitovým polem registrů
  2. 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)
  3. Byly odstraněny prefixy pro podmínku, nyní jsou podmínky použity jen u skoků a několika dalších vybraných instrukcí
  4. 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.

CS24_early

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

  1. Comparison of ARMv8-A cores
    https://en.wikipedia.org/wi­ki/Comparison_of_ARMv8-A_cores
  2. Cortex-A32 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a32-processor.php
  3. Cortex-A35 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a35-processor.php
  4. Cortex-A53 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a53-processor.php
  5. Cortex-A57 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a57-processor.php
  6. Cortex-A72 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a72-processor.php
  7. Cortex-A73 Processor
    https://www.arm.com/produc­ts/processors/cortex-a/cortex-a73-processor.php
  8. Apple A7 (SoC založen na CPU Cyclone)
    https://en.wikipedia.org/wi­ki/Apple_A7
  9. System cally pro AArch64 na Linuxu
    https://github.com/torval­ds/linux/blob/master/inclu­de/uapi/asm-generic/unistd.h
  10. Architectures/AArch64 (FedoraProject.org)
    https://fedoraproject.org/wi­ki/Architectures/AArch64
  11. SIG pro AArch64 (CentOS)
    https://wiki.centos.org/Spe­cialInterestGroup/AltArch/A­Arch64
  12. The ARMv8 instruction sets
    http://infocenter.arm.com/hel­p/index.jsp?topic=/com.ar­m.doc.den0024a/ch05s01.html
  13. A64 Instruction Set
    https://developer.arm.com/pro­ducts/architecture/instruc­tion-sets/a64-instruction-set
  14. Switching between the instruction sets
    http://infocenter.arm.com/hel­p/index.jsp?topic=/com.ar­m.doc.den0024a/ch05s01.html
  15. The A64 instruction set
    http://infocenter.arm.com/hel­p/index.jsp?topic=/com.ar­m.doc.den0024a/ch05s01.html
  16. Introduction to ARMv8 64-bit Architecture
    https://quequero.org/2014/04/in­troduction-to-arm-architecture/
  17. MCU market turns to 32-bits and ARM
    http://www.eetimes.com/do­cument.asp?doc_id=1280803
  18. Cortex-M0 Processor (ARM Holdings)
    http://www.arm.com/produc­ts/processors/cortex-m/cortex-m0.php
  19. Cortex-M0+ Processor (ARM Holdings)
    http://www.arm.com/produc­ts/processors/cortex-m/cortex-m0plus.php
  20. ARM Processors in a Mixed Signal World
    http://www.eeweb.com/blog/arm/arm-processors-in-a-mixed-signal-world
  21. ARM Architecture (Wikipedia)
    https://en.wikipedia.org/wi­ki/ARM_architecture
  22. DSP for Cortex-M
    https://developer.arm.com/techno­logies/dsp/dsp-for-cortex-m
  23. Cortex-M processors in DSP applications? Why not?!
    https://community.arm.com/pro­cessors/b/blog/posts/cortex-m-processors-in-dsp-applications-why-not
  24. White Paper – DSP capabilities of Cortex-M4 and Cortex-M7
    https://community.arm.com/pro­cessors/b/blog/posts/white-paper-dsp-capabilities-of-cortex-m4-and-cortex-m7
  25. Q (number format)
    https://en.wikipedia.org/wi­ki/Q_%28number_format%29
  26. TriCore Architecture & Core
    http://www.infineon.com/cms/en/pro­duct/microcontroller/32-bit-tricore-tm-microcontroller/tricore-tm-architecture-and-core/channel.html?channel=ff80808112ab681d0112­ab6b73d40837
  27. TriCoreTM V1.6 Instruction Set: 32-bit Unified Processor Core
    http://www.infineon.com/dgdl/tc_v131_in­structionset_v138.pdf?file­Id=db3a304412b407950112b409b6dd0352
  28. TriCore v2.2 C Compiler, Assembler, Linker Reference Manual
    http://tasking.com/suppor­t/tricore/tc_reference_gu­ide_v2.2.pdf
  29. Infineon TriCore (Wikipedia)
    https://en.wikipedia.org/wi­ki/Infineon_TriCore
  30. C166®S V2 Architecture & Core
    http://www.infineon.com/cms/en/pro­duct/microcontroller/16-bit-c166-microcontroller/c166-s-v2-architecture-and-core/channel.html?channel=db3a304312bef5660112­c3011c7d01ae
  31. Comparing four 32-bit soft processor cores
    http://www.eetimes.com/au­thor.asp?section_id=14&doc_id=1286116
  32. RISC-V Instruction Set
    http://riscv.org/download­.html#spec_compressed_isa
  33. RISC-V Spike (ISA Simulator)
    http://riscv.org/download.html#isa-sim
  34. RISC-V (Wikipedia)
    https://en.wikipedia.org/wiki/RISC-V
  35. David Patterson (Wikipedia)
    https://en.wikipedia.org/wi­ki/David_Patterson_(compu­ter_scientist)
  36. OpenRISC (oficiální stránky projektu)
    http://openrisc.io/
  37. OpenRISC architecture
    http://openrisc.io/architecture.html
  38. Emulátor OpenRISC CPU v JavaScriptu
    http://s-macke.github.io/jor1k/demos/main.html
  39. OpenRISC (Wikipedia)
    https://en.wikipedia.org/wi­ki/OpenRISC
  40. OpenRISC – instrukce
    http://sourceware.org/cgen/gen-doc/openrisc-insn.html
  41. OpenRISC – slajdy z přednášky o projektu
    https://iis.ee.ethz.ch/~gmichi/a­socd/lecturenotes/Lecture6­.pdf
  42. Berkeley RISC
    http://en.wikipedia.org/wi­ki/Berkeley_RISC
  43. Great moments in microprocessor history
    http://www.ibm.com/develo­perworks/library/pa-microhist.html
  44. Microprogram-Based Processors
    http://research.microsoft.com/en-us/um/people/gbell/Computer_Struc­tures_Principles_and_Exam­ples/csp0167.htm
  45. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  46. A Brief History of Microprogramming
    http://www.cs.clemson.edu/~mar­k/uprog.html
  47. What is RISC?
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/whatis/
  48. RISC vs. CISC
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/risccisc/
  49. RISC and CISC definitions:
    http://www.cpushack.com/CPU/cpu­AppendA.html
  50. FPGA
    https://cs.wikipedia.org/wi­ki/Programovateln%C3%A9_hra­dlov%C3%A9_pole
  51. The Evolution of RISC
    http://www.ibm.com/develo­perworks/library/pa-microhist.html#sidebar1

Byl pro vás článek přínosný?

Autor článku

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