0xDEADBEEF

[RSS]
««« »»»

Dekódování x86 instrukcí

23. 9. 2017

x86 je ba­rokní ar­chi­tek­tura, která na sebe za čtyři dekády exis­tence na­ba­lila spoustu bahna. Jde o je­di­nou z mála pře­ží­va­jí­cích CISC ISA a má všechno, co od se od takové sady oče­kává: Mraky in­strukcí pro­měnné délky, různé ad­re­so­vací módy a zpět­nou kom­pa­ti­bi­litu s re­likty mi­nu­losti.

Ale kolik in­strukcí mo­derní x86 se všemi roz­ší­ře­ními vlastně má? Tuto otázku pře­kva­pivě není jed­no­du­ché zod­po­vě­dět. Záleží jak člověk počítá. Počet po­lo­žek v In­te­lích ma­nu­á­lech, počet mne­mo­nic­kých zkra­tek, počet forem? Může jich být něco mezi 1503 a 6000 podle toho, co je po­va­žo­váno za uni­kátní in­strukci.

A teď jak tohle dokáže pro­ce­sor de­kó­do­vat? x86 kra­luje se­ve­rům, desk­to­pům a lap­to­pům a nejde jen o dů­sle­dek prehis­to­ric­kého na­sa­zení v IBM PC. Mo­derní x86 se umí hýbat a když všechno jede jak má, do­ká­žou každý takt vy­ko­nat 4-5 in­strukcí. To zna­mená načíst z paměti/cache, de­kó­do­vat, pro­vést a zapsat vý­sle­dek až pěti ope­rací pro­měnné délky z tisíců růz­ných forem.

Nej­jed­no­dušší je po­cho­pi­telně pod­vá­dět a nic ne­de­kó­do­vat. Proto pro­ce­sory nesou L0 cache ur­če­nou pro in­strukce již de­kó­do­vané na in­terní mikro-ope­race.

Mo­derní x86 jádra, ale i přesto do­ká­žou rychle de­kó­do­vat proud čer­s­tvých in­strukcí. Klíčem je pa­ra­lelní pre-decode, který nejdřív zjistí jen délky in­strukcí.

Pří­klad: Jádro v každém taktu na­táhne 16B kódu, pre-decode pro každý bajt z tohoto bloku zjistí, jak by byla in­strukce dlouhá, kdyby za­čí­nala na této pozici. To se dá udělat pa­ra­lelně, pro­tože není třeba brát zřetel na zá­vis­losti. x86 navíc není zas tak ba­rokní, vypadá na první pohled a má ur­či­tou re­gu­la­ritu, kdy velké sku­piny in­strukcí mají stej­nou délku. To značně zjed­no­du­šuje návrh pre-decode fáze.

Délky in­strukcí se spo­čí­tají za jeden takt a pošlou se do další fáze pi­pe­line.

Tam je už třeba brát v potaz sek­venci in­strukcí. Když má první in­strukce délku 3 bajty, de­ko­dér pře­skočí 3 bajty (a tedy všechny délky, který pre-de­ce­ode spe­ku­la­tivně spo­čí­tal). Teď je jasné, že na pozici +3B začíná va­lidní in­strukce, délka je už spo­čí­taná a de­ko­dér jen zjistí, do jaké funkční jed­notky onu ope­raci poslat.

V pro­ce­soru není velký switch s ra­me­nem pro každou podobu každé in­strukce, ale tato zna­lost je roz­lo­žena napříč čipem.

Re­le­vantní čtení:

píše k47 (@kaja47, k47)