Yes, master.
Olen tietoinen tuosta kyllä että rekisterien määrä nostettiin, mutta olen ihmetellyt että miksi niitä ei nostettu kerralla sitten siihen kolmeenkymmeneen kahteen saakka ? Olisiko siitä ollut x86_64:n tapauksessa merkittävää haittaa ?
Olisi ollut merkittävää haittaa siinä, että
1) käskyt olisivat olleet selvästi pidempiä, huonompi käskyvälimuistin osumatarkkuus ja ohjelmakoodi olisi vienyt enemmän muistia
2) Käskydekooderi joka on muutenkin monimutkainen ja ainoita jäljellä olevia paikkoja missä se painolasti oikeasti pikkusen tuntuu, olisi ollut vielä monimutkaisempi.
Ja: miten olisit ne lisännyt?
Ei käskykannassa näkyvien rekisterien määrässä tällä vuosituhannella ole kyse siitä, kuinka suuri rekisterifile raudalla mahtuu/halutaan laittaa, vaan ainoastaan siitä
kuinka ne rekisterit enkoodataan käskyihin
Ja käskyenkoodauksessa ei suoraan ollut tilaa
yhdenkään rekisterin lisäämiseen. Käytännössä juuri missään arkkitehtuurissa ei ole.
Se, miten nuo rekisterit tuplattiin 8->16 oli, että yksitavuiset INC- ja DEC-käskyt poistettiin (koska ne voi kuitenkin laskea ADD- ja SUB-käskyillä kahdella tavulla) ja näistä vapautuneet opkoodit määriteltiin REX-prefiksiksi (jolla pystyi olemaan 4 bittiä hyötydataa, koska näillä INC- ja DEC-käskyillä oli yhteensä 16 eri enkoodausta sen mukaan mitä rekisteriä inkrementoidaa/dekrementoidaan).
Näitä neljää bittiä käytettiin sitten siihen, että (seuraava) käsky tulkitaan eri tavalla:
1. bitti määrittelee, että operoidaan 64-bittisellä datalla. Jos se on 0, käytetään default-leveyttä (useimmilla käskyllä 32)
2. bitti määritelee, että modrm.reg-kenttä (yleensä kohderekisterin indeksi) sisältää ylimääräisen ykkösen ylimpänä bittinä (eli voidaan osoittaa rekistereihin numero 8-15)
3. bitti määrittelee, että sib.index (skaalattavan indeksirekisterin kenttä) sisältää ylimääräisen ykkösen ylimpänä bittinä (eli voidaan osoittaa rekistereihin numero 8-15)
4. bitti määrittelee, että joko sib.BASE-kenttä(skaalattavaan indeksirekisteriin lisättävä base) tai MODRM.rm -kenttä (useimpien normaalien käskyjen toinen operandi) sisältää ylimääräisen ykkösen ylimpänä bittinä (eli voidaan osoittaa rekistereihin numero 8-15).
Jos olisi haluttu lisätä rekisterien määrä 32een (mikä ei olisi antanut käytännössä juuri mitään käytännön hyötyjä) olisi pitänyt jostain taikoa vielä 3 bittiä lisää siihen käskyenkoodaukseen.
Tilaa tähän ei käytännössä olisi ollut mitenkään muuten kuin vähintään KAKSITAVUISELLA prefixillä. Ja tämä jos mikä olisi tehnyt siitä käskyenkoodauksesta vielä monimutkaisemman ja koodista paljon enemmän tilaa vievää.
Ja itseasiassa kolmetavuinen VEX/XOP-prefix sitten tuotiin paljon myöhemmin (, ja jopa nelitavuinen EVEX vielä myöhemmin, AVX-512ssa), mutta näitä käytetään vain SIMD-käskyille jotka muutenkin tekee paljon ja jossa käskyn overhead/sen tekemä laskentamäärä on pieni, ja suuri sen takia ne käskyt voi olla sen 15 tavua pitkiä. Oleellinen syy näiden tuomiseen on mm. se, että haluttiin tukea FMA-käskyä jossa on kolme inputtia ja kohderekisteri voi olla eri kuin joku lähderekistereistä, eli rekisterikenttiä tarvitaan 4, ja haluttiin myös erotella eri leveyksiset SIMD-käskyt. Ja AVX-512ssa taitaa monet käskyt vaatia vielä predikaattirekisterinkin indeksin (eli jopa 5 kenttää kaikkiaan)
wiki.osdev.org
Ainoa oikeasti "ahdas" asia mitä Mooren laki ei "korjaa" on käskyjen enkoodaus. Enempää käskyjä tai niiden parametreja tai suurempia parametreja ei vaan voi millään voi enkoodata pienempään tilaan. RISCit ottivat asenteen että "Kaikki on 32 bittiä" mikä myöhemin todettiin aivan liian harvaksi käskyenkoodaukseksi, joten ARMiin tuli Thumb, MIPSiin MIPS16 ja RISC-V:hen C-extensio.
Ja ainakin Thumbissa ja RISC-V:n C-extensiossa tuettujen rekisterien määrää on monilla käskyillä pudotettu kahdeksaan, vielä vähäisempään kuin x86-64ssa.
Tosin ARMv8sta jätetiin sitten kuitenkin Thumb pois.
Lisäksi onko järkevää raahata enää esimerkiksi VME:tä mukana uudemmissa prosessoreissa? Tuskinpa se hirveästi pii pinta-alaa / mikrokoodi tilaa vie, mutta onko sille tänä päivänä hirveästi käyttöä ? Semminkin kun tiedossa että sen implementaatiossa on ongelmia joillain prosessoreilla ? Edelleen, pitääkö ymmärtää niin että kaikki kama mitä joskus on joskus laitettu arkkitehtuuriin mukaan pitää säilyttää hamaan loppuun saakka ?
VMEstä en osaa sanoa mitään.
Eikä aivan kaikkea tarvi tukea hamaan loppuun saakka, 3dnow! pudotettiin kokonaan pois jo bulldozerissa ja bobcatissä.
Ja 64-bittisestä moodista pudotettiin pois ainakin:
1) Nuo yhden tavun inc/dec-opcodet pudotettiin pois 64-bittisessä moodissa.
2) Segmenttirekisterit CS-ES pudotettiin täysin pois user modesta. FS ja GS jätettiin silti jotta niitä voi käyttää esim. pointtereina thread-local-storageen (koska tällainen pointteri on kätevä olla olemassa)