0xDEADBEEF

[RSS]
««« »»»

Dekódování x86 instrukcí

23. 9. 2017

x86 je barokní architektura, která na sebe za čtyři dekády existence nabalila spoustu bahna. Jde o jedinou z mála přežívajících CISC ISA a má všechno, co od se od takové sady očekává: Mraky instrukcí proměnné délky, různé adresovací módy a zpětnou kompatibilitu s relikty minulosti.

Ale kolik instrukcí moderní x86 se všemi rozšířeními vlastně má? Tuto otázku překvapivě není jednoduché zodpovědět. Záleží jak člověk počítá. Počet položek v Intelích manuálech, počet mnemonických zkratek, počet forem? Může jich být něco mezi 1503 a 6000 podle toho, co je považováno za unikátní instrukci.

A teď jak tohle dokáže procesor dekódovat? x86 kraluje severům, desktopům a laptopům a nejde jen o důsledek prehistorického nasazení v IBM PC. Moderní x86 se umí hýbat a když všechno jede jak má, dokážou každý takt vykonat 4-5 instrukcí. To znamená načíst z paměti/cache, dekódovat, provést a zapsat výsledek až pěti operací proměnné délky z tisíců různých forem.

Nejjednodušší je pochopitelně podvádět a nic nedekódovat. Proto procesory nesou L0 cache určenou pro instrukce již dekódované na interní mikro-operace.

Moderní x86 jádra, ale i přesto dokážou rychle dekódovat proud čerstvých instrukcí. Klíčem je paralelní pre-decode, který nejdřív zjistí jen délky instrukcí.

Příklad: Jádro v každém taktu natáhne 16B kódu, pre-decode pro každý bajt z tohoto bloku zjistí, jak by byla instrukce dlouhá, kdyby začínala na této pozici. To se dá udělat paralelně, protože není třeba brát zřetel na závislosti. x86 navíc není zas tak barokní, vypadá na první pohled a má určitou regularitu, kdy velké skupiny instrukcí mají stejnou délku. To značně zjednodušuje návrh pre-decode fáze.

Délky instrukcí se spočítají za jeden takt a pošlou se do další fáze pipeline.

Tam je už třeba brát v potaz sekvenci instrukcí. Když má první instrukce délku 3 bajty, dekodér přeskočí 3 bajty (a tedy všechny délky, který pre-deceode spekulativně spočítal). Teď je jasné, že na pozici +3B začíná validní instrukce, délka je už spočítaná a dekodér jen zjistí, do jaké funkční jednotky onu operaci poslat.

V procesoru není velký switch s ramenem pro každou podobu každé instrukce, ale tato znalost je rozložena napříč čipem.

Relevantní čtení:

píše k47 (@kaja47, k47)