Skrivet av Bengt-Arne:
X86 och därmed även x64 är den risigaste arkitektur som finns.
Den visar bara att ekonomer lyckas vinna över förnuftet!
Redan när intel kom med 8088/8086 så fanns det mycket mer kompetenta cpu'er som motorola 68000 eller national 16008/16016/16032,.
Att dom inte fick den framgång dom var värda var att det vid tillfället då IBM beslutade om att tillverka en PC, så fanns det inte många färdiga kringkrettsar som stödde deras arkitektur. Intel kunde visa på kretsar från deras 8080 och 8085, vilket även Ziolog med Z80 använde.
ISA är lång mindre viktigt än alla flamewars gör gällande.
Men om man nu ska ge sig in i diskussionen kring ISA...
De två risigaste arkitekturerna som idag används är IA32 samt Aarch32, båda är rejäla katastrofer fast av olika skäl.
IA32 (32-bitars x86) har en hopplös flyttalsdesign, endast 7 GPR (General Purpose Register) + stackpekare, kass ABI (Application Binary Interface) på både Windows och Linux, saknar direkt stöd PC-relativ adressering (finns fulhack för att komma runt)
Grejen är att alla dessa tillkortakommanden spelar mest roll för enkla CPUer, framförallt om de saknar out-of-order execution (OoO) + register renaming stöd. Core2 må ha 7 arkitektur-register, men microarkitekturen har runt 100 faktiska register (Haswell har 192 st!).
Vad detta betyder är att Atom vinner klart mer på att gå från IA32 till Intel64 (64-bitars register) då det är en enklare design. Men även Silvermont är OoO, så vinsten är inte alls lika stor som för Bonnell/Saltwell ("gamla" Atom).
D.v.s. i praktiken är 32-bitars x86 inte alls så illa som det kan tyckas på ytan.
I Aarch32 (32-bitars ARM) är i princip var enda instruktion villkorad, fördel på ARM11 och tidigare där klockfrekvenserna var under 500MHz samt pipeline längden var väldigt kort. Men detta är någon som skulle sätta rejäla käppar i hjulen om någon försökte nå 4GHz med en ARM CPU.
Den som är riktigt illa är att Aarch32 är otroligt ineffektiv på att säkerställa någon som kallas sekventiell konsistens, en minneskonsistensmodell som används av bl.a. C11, C+11 samt Java. Detta är ett riktigt problem som verkligen har påverkan på hur effektivt man kan skriva program som använder många CPU-kärnor. En 4 kärnors ARM CPU är en dålig idé, inte bara för att inga program i praktiken utnyttjar så många kärnor, utan för att ISA är rent olämpligt för multicore.
IA32/Intel64/AMD64/SPARC har den minneskonsistensmodell (kallas TSO) som än så länge visat vara den mest effektiva, i teorin ska Aarch64 kunna vara något mer effektiv men det bli i så fall en marginell förbättring över TSO. TSO är fortfarande enklare att resonera kring än den modell som används av Aarch64.
Intel64/AMD64 löser alla akuta problem: flyttal sköts nu via väldigt effektiva SSE2 instruktioner, antal GPR är nu utökat till 16 (forskning visar att det optimala antalet register är 20-24st, skillnaden mellan 16st och 32st är i praktiken ingen alls), ABI för både Windows och Linux skickar argument via register (Linux tillåter fler argument i register men väldigt liten praktiskt skillnad), funktioner som inte anropar andra funktioner behöver inte skapa en stackram (sparar 3 instruktioner, 2 i prologen, 1 i epilogen).
Aarch64 lägger till instruktioner för "load/acquire" "store/release" som fixar effektiv sekventiell konsistens, instruktioner är inte längre villkorade, stackpekaren är inte ett GPR (precis som på IA32/Intel64) något som tillåter mer optimeringar för push/pop av data på stacken (Intel CPUer har speciell logik just för detta sedan Pentium M).