X86 on roskaa, mikä joutaisi historian romukoppaan. Olkoonkin nopeimmat prosessorit, mutta itse arkkitehtuuri on kuraa.
Näinhän sitä usein väitetään, todellisuus vaan on aivan toinen.
x86-64 on parempi arkkitehtuuri kuin useimmat 80-luvun "hienoista" RISCeistä.
Koodin tiheys on huomattavasti parempi, minkä takia muistia tarvitaan vähemmän ja välimuistien osumatarkkuus on parempi.
ja x86sta puuttuu monet 80-luvun RISCien idioottimaisuuksista:
x86ssa ei ole esimerkiksi mitään delay slotteja(kuten MIPSissä tai SPARCissa) monimutkaistamassa asioita eikä "pyöriviä rekistereitä" , jotka tekevät rekisterien uudelleennimeämisestä ja sen kautta OoOE:stä paljon vaikeampaa, kuten Sparcissa ja Itaniumissa
Muistin konsestenssiussäännöt on paljon järkevämmät, nämä mokattiin pahasti useimmissa RISCeissä. Tämä tekee käytännössä moniprosessorijutuista/synkronoinnista helpompaa x86lla kuin noilla 80-luvun RISCiellä.
ja x86ssa on käskyjä, jotka lukee operandinsa suoraan muistista. Tällä säästetään usein rekistereitä ja käskyjä.
Powerissa/PPC:ssä on käänteiset/hashätyt sivutaulut, jotka on melko ongelmallisia. x86ssa on vaan monitasoiset sivutaulut, jotka toimii käytännössä paremmin.
x86ssa ei myöskään ole rajoituksia muistioperaatioiden alignmentin suhteen (paitsi joillain SIMD-käskyillä). Tämä nopeuttaa/helpottaa selvästi esim. koodia jossa pitää purkaa jotain viestipakettien headereita.
Alkuperäisessä 8086ssa toki oli paljon typeryyksiä, mutta näistä käytännössä kaikki on korjattu:
* Vain 64 kilotavun muistin suora osoittaminen ilman kikkailua segmenttirekistereillä (korjattu 386ssa 4 gigaan, x64-64ssa 256 teraan, optiolla että voidaan helposti tulevaisuudessa laajentaa ainakin 64 petaan)
* Ei muistinhallintayksikköä/suojattua tilaa (korjattiin kunnolla 386ssa) (*)
* x87-FPU joka toimi rikkinäisellä pinoperiaatteella eikä sallinut vapaata rekisteriaccessia (korjattu SSE/SSE2n myötä)
* Vain 8 GPRää (korjattu x86-64n myötä, määrä nostettu 16aan)
Oikeastaan ainoa selkeä huono puoli x86-64ssa on, että käskyjen enkoodaus on melko monimutkainen, mikä monimutkaistaa prosessorin käskydekooderia, se lisää siihen 1-2 liukuhihnavaihetta ja tekee hyvin hankalaksi tehdä x86-dekooderia joka dekoodaa yli neljää käskyä rinnakkain.
Intelin prossut on jo kauan aikaa olleet sisäisesti emulaattoreita. Ne ajavat mikrokoodia, jolla on hyvin vähän tekemistä x86 kannan kanssa. X86 käskyt käännetään ensin mikrokoodiksi ja sitten ajetaan.
Jospa nyt ottaisit edes selvää mitä "mikrokoodi" tarkoittaa.
Nykyaikaisissa x86-prosessoreissa käytetään paljon VÄHEMMÄN mikrokoodia kuin vanhemmissa.
Nykyaikainen x86-prosessori dekoodaa aika suuren osan käskyistä tasan yhdeksi mikro-operaatioksi. Ja näiden käskyjen osalta tämä ei oikeastaan mitenkään eroa siitä, miten RISC-prosessi käskynsä suorittaa.
Saman voi tehdä softalla ja ajaa ARM:lla. Tästä on kyse. Emulaatio on varsin nopeaa ja voi ajaa esim. Photoshoppia.
höpöhöpö.
Emulointi kuulostaa teoriassa helpolta, mutta se on käytännössä ongelmallista, kun käskyillä on hassuja sivuvaikutuksia. Carry bit, flags, eri pyöristysmoodit jne. Näiden hanskaaminen vaatii usein paljon ylimääräistä härväystä, joka on softalla tehtynä hyvin hidasta.
Esim. Transmetan prosessoriin, vaikka se ajoi aivan eri käskykantaa kuin x86, piti rakentaa x87-yhteensopivat pyöristysmoodit yms. koska niiden emulointi olisi ollut aivan järjettömän hidasta.
Samoin DECn Alphassa (joka oli aikoinaan maailman nopein prosessori) oli erikseen lisätty VAX-yhteensopivan pyöristysmoodin FPU-käskyt ihan vaan että sillä on helpompi emuloida VAXia.
Juutubista löytyy videota.
Se, että joku
toimii, ja se, että joku
toimii nopeasti on täysin eri asioita.
(*) 286ssa oli jo jonkinlainen muistinhallintayksikkö, mutta se oli melko huono, 386ssa muistinhallintayksikkö oli kunnollinen.