Myslim ze v souvislosti se spekulativnim a OOO provadenim je naprosto bezpodminecne zminit techniku prejmenovavani registru, coz je mnohem lepsi reseni problemu zavislosti instrukci nez navysovani poctu architekturnich registru (vysoky pocet architekturnich registru casto zpusobuje problemy s HW implementaci procesoru, viz Itanium).
Prejmenovani registru resi jen malou cast problemu - situaci, kdy nasleduje instrukce, ktera do registru neco napise a jeho obsah tak nahradi, jindy nikoliv. Napr
LD A, adresa
XOR A,A - tato instrukce z registru A cte a ac je jasne, ze jej vynuluje, prejmenovani neni mozne.
LD A, adresa2 - tato instrukce by mohla vyuzit preklad na LD B
Pentium 4 dokáže přejmenovávat i XOR reg,reg a SUB reg,reg (je to v něm zadrátované, že tento speciální případ rozbije závislosti). Na Pentiu Pro/2/3 XOR závislost nerozbíjelo.
Kvůli přejmenování se třeba při 16-bitovém čtení paměti negeneruje instrukce MOV AX, WORD [paměť] (protože nerozbije závislosti, obsah EAX závisí na předchozích horních 16 bitech EAX), ale místo ní se generuje MOVZX EAX, WORD [paměť] (ta přepíše celé EAX, tak závislost rozbije).
Myslim ze prejmenovani naopak resi dost podstatnou cast problemu.
Bez prejmenovani neni mozne paralelizovat jednotlive iterace smycky mezi sebou. Treba:
loop:
ld a, [ix]
ld b, [iy]
add a, b
ld [ix], b
inc ix
inc iy
cmp a, c
jl loop
bez prejmenovani musi kazda dalsi iterace cekat na dokonceni te predchozi, protoze jsou tam zavislosti. S prejmenovanim lze provadet iterace zaroven. Nebo aspon nekdy :)
(Omouvam se za syntaxi assembleru, kterou jsem si prave vymyslel, snad je to srozumitelne :)