Jen rekapituluju, co jsem psal minule a předminule - instrukční sada procesoru zásadně ovlivňuje konstrukci a výkon kompilátoru což zásadně ovliňuje vlastnosti celého počítače - viz SmartPhony a Tablety s ARMem které při několikanásobně menší spotřebě proudu se téměř vyrovnají netbookům s Intel Atomem.
Jak vypadají instrukce procesoru ovlivňuje tzv. Instrukční dekodér, který předkládá "opkódy" instrukcí do vniřních signálů řídícich fukční jednotky procesoru.
A teď už jsme zase u RISC procesorů.V éře CISC procesorů byla idea že co příkaz programovacího jazyka - to jedna instrukce - což vedlo k tomu že strojový kód procesorů byl složitý - Intelovské procesory typu 8086 (až po dneční mnohajádrové a nadupané) mají instrukce dlouhé 1, 2 , 3, 4 bajty - takže dekódovaní probíhá tak, že trpajzlici přečtou první bajt následující instrukce a pak přemýšlejí "dává nám to smysl" nebo musíme načíst ještě další bajt a další a další ..... Stejně tak vykonávání takových instrukcí - trvalo kdysi minimálně 4 ale i 8, 16 a více taktů podle složitosti.
Není divu že Intelovské procesory už takto nefungují, protože "takhle by to nešlo" a místo toho fungují tak, že jsou udělány jako procesor v procesrou kdy instrukčn ídekodér je vlastně celý samostatný procesor, který překládá archaický 8086 kód do RISC kódu každého procesoru. A teprve ten pak "nadupané CORE" vykonává.
Instrukce v RISC světě zásadně vypadají tak, že mají jednotný formát - moje milované AVR má 16 bitové instrukce PICky mají v rámci Harvardské architektury instrukce exotických délek 10, 12, 14, 16 bitů a dokonce mají i slova v programové paměti v těcho "divných délkách". No a ARM měl v první verzi instrukce 32 bitové.
Už to samo je zrychení, protože v každém taktu prostě načtete 32 bitů z paměti a co to znamená řeší už jiní trpajzlíci.
Takže formát instrukcí ARMu vidíte na obrázku. Bity 31-28 jsou přítznakové bity, - každá ARM instrukce tedy může být vykonána podmíněně, existuje dokonce i kombinace přiznaků "DO NOT EXECUTE" a tedy ARM má asi nejvíce typů NOP instrukce ze všech procesorů na světě.
Pak je pár bitů, které u ostatních procesorů znamenjí něco jako "operační kód", který rozhoduje o tom co instrukce bude dělat - u ARMU těcho pár bitů rozdhoduje o tom do které skupiny instrukčních kódů patří zbytek instrukce a podle toho je pak nastaven i ten zbytek - viz obrázek.
Nebudeme probírat celou insrukční sadu. Jenom pro ilustraci ARMovského konceptu "Instrukce v instrukci" jsem vybral podkapitolu "aritmetických instrukcí". Vidíte tam pole pro zdrojový a cílový registr a pak pole kam se dává buď druhý zdrojový registr - vrámci tříregistrové ARMovské aritemtiky, nebo "imediate value" - konstanta která se použije do výpočtu.
Hodnotu registru je ještě možné rotovat, takže pole pro třetí operand má ještě svůj vlastní subformát, který vidíte na obrázku.
Koncept "Instrukce v instrukci v instrukci" je opravdu účinný - takže měkteré vybrané ARMovské instrukce odpovídají celým kratičkým fragmetům kódu jiných procesorů o délce 3-4 instrukce. Tudíž u ARMu nevadí ani to, co se někdy RISCovýcm procesorům vyšítá a to jsou příliš dlouhé 32 bitové instrukce.
Jenom pro demonstraci opakuju příklad překladu jediné instrukce ARM "BICEQ R2, R3, ASL #3" do kódu 8086, který má 4 Instrukce :
JZ je_nula - přeskoč celou sekvenci pokud je nastaven nulový příznak
SHR EBX, 3 - posuň EBX o 3 bity ( to je to #3 u ARMu )
NOT EBX - neguj Bity v EBX
AND EAX, EBX - udělej logický součin s EAX
:je_nula - toto není instrukce - jen adresa kam se skočí když není nastaven nulový příznak
32 bitů široké instrukce nedělají problémy ve stolních PC a v klasických procesorech s 32 bitovými sběrnicemi, ale ARM prorazil i na pole mikrokontrolérů - a tahat po plošném spoji nějakého soustruhu, robota, váhy, nebo stojanu na benzín 32 drátů je problém, takže se objevily ARMy jen se 16 bitovou datovou sběrnicí. Tím bylo nutno instrukce načítat ve dvou taktech - což srazilo výkon "jednotaktových" ARMů na polovinu. Dnes už klasický příklad je Gameboy Advance - který byl ve své době velmi populární, protože Hackeři našli cestu jak do něj nahrát vlastní firmware a udělat z něj výkonný malinkatý a laciný počítač v době kdy ještě "nebyly smartphony" ani Raspberry PI - taková věc byla vzácností.
Firma ARM (Arm znamená Acorn Risc Macines ale taky to znamená "paže") proto vymyslela řešení. Nakonec přece jenom doplnili "druhou vrstvu" instrukčního dekodéru a přidali do ARMu druhou instrukční sadu "Thumb" což zas pro změnu znamená "palec".
Thumb Instrukce jsou 16 bitové a toho je dosaženo tím, že
- nemají pole podmínek (ušetříme 4 bity)
- jsou dvouregistrové (ušetříme jedno 4 bitové registrové pole)
- Mohou pracovat jen s 8 registry (ušetříte dva bity z čísel instrukcí)
- atd ....
Jinými slovy THUMB připomíná daleko více "normální instrukční sadu normálního procesoru"
Když jsme se zbavili výhod ARMovského instrukčního souboru - patrně byste očekávali, že dopad na výkon procesoru bude katastrofální, ale kupodivu ne - i "Bezstarosťák" kdysi popisoval své osobní zkušenosti, že C přeložené do THUMB kódu je jen o pár procent pomalejší než C v ARM kóud a při komunikaci po 16 bitové sběrnci je dokonce rychlejší (pochopitelně).
To že následky na výkon nejsou tak tragické - mě podporuje v názoru, že ARM instrukční sada je příliš komplexní pro nedostatečnou inteligenci kompilátorů a teprve jednodušší THUMB umožní při konstrukci kompilátoru využít letité zkušenosti z ostatních architektur.
Aby pohádce pořád nebyl ještě konec - dneska je zcela jiná situace než v době vzniku ARMu v roce 1985, protože dnes už se v architerturách čipů nebojuje o ušetření každého tranzistoru. Takže s nástupem ARM jader typu CORTEX se patrně zdála vývojářům od ARMu THUMB instrukční sada příliš omezujcí - tak zavedli instrukční sadu THUMB 2. Ta mezi striktně 16 bitové Thumb Instrukce přidává další 32 bitové THUMB 2 instrukce - které se dají volně "místit" mezi 16 bitové THUMB instrukce (bez přepínání režimu ARM/THUMB jako u puvodnho ARMu) Je zvláštní že 32 bitové THUMB instrukce jsou jiného formátu než 32 bitové ARM instrukce (nemají například pole podmínek).
Je zajímavé jak se může procesorová architektura postupně vyvíjet - až se nakonec všechhy architektury začnou poněkud podobat - asi jako se delfíni podobají žralokům, když už oba žijí v moři. V každém případě ARM je momentálně nejrozšířenější procesorová architektura na zeměkouli, a vzhledem k množství typu a cenám procesorů ji doporučuju vaší důtklivé pozornosti.
Tím bych pojednání o procesorech považoval prozatím za vyčerpané - zbývá už jenom tradiční rada pro blondýny : Barevná shoda boty - kabelka je pro důchodkyně - jestli jste náležitě odvážné zkuste barevnou shodu - kabelka - kalhotky, které občas "ukážete" pod větrem povlávající minisukní.