Att säga att x86 suger tycker jag är en kraftig överdrift. De flesta nackdelar kan också ses som fördelar. På rak arm kan jag komma att tänka på följande saker som kan ses som negativt:
1: Instruktionerna har varierande längd, en del är några enstaka byte långa medan andra är betydligt längre. Detta gör det jobbigare att koda av instruktionerna, speciellt om man försöker koda av fler instruktioner samtidigt då man inte kan veta var nästa instruktion börjar innan man kodat av och vet längden av den föregående.
2: Ett litet antal register. Innan x86-64 fanns det endast 8 st register för att lagra värden för beräkningar i processorn. Detta gör att om fler än 8 värden används relativt ofta i beräkningar måste man spara undan tidigare resultat i minnet och hämta ny data från minnet varje gång man behöver ett nytt värde. Dessutom har många programmeringsspråk så kallade "calling conventions" vilka kan beskrivas som regler för hur programkod lämnar över värden mellan varandra. Dessa regler innebär oftast att indata till funktioner måste lämnas i några förbestämda register innan funktionsanropet sker och då måste man spara undan det värde som finns där. Kort sagt så kan få register leda till onödig minnes trafik som bara finns där för att det inte gick att hålla kvar värdet i processorn.
3: Måste stödja gammal kod. x86 fyller 30 redan 2008 tror jag. Under årens lopp har instruktionsuppsättningen byggts ut med en rad tillägg. Samtidigt har utvecklingen gått framåt och tack vare detta är några av de gamla instruktionerna blivit utdaterade idag och kan ses som ganska värdelösa. Trots detta måste de ändå kunna köras på alla moderna processorer för att inte bryta bakåtkompatibiliteten. Detta gör att man måste släpa på lite onödigt bagage från förr vilket förhindrar mer optimerad design.
Motargument till dessa saker är t.ex.:
1: Instruktioner av varierande längd tillåter mer optimal kodning av instruktioner. Om instruktionerna inte är längre än absolut nödvändigt får man plats med fler instruktioner i processorns cache-minnen vilket ger ökad prestanda för varje given storlek på cache-minnet. Antingen kan man spara in på cachen men behålla samma prestanda eller får ökad prestanda med samma mängd cache som en motsvarande processor exekverande likvärdig kod som tar större plats.
2: Moderna tekniker som t.ex. out of order execution med register renaming, data prefetching, cacheminnen med mera bidrar alla på olika vis till att minska inverkan av få register. Däremot ger få register ger också mycket fördelar rent hårdvarumässigt då komplexiteten hos processorn ökar rätt mycket av att lägga till register (iaf hos moderna processorer som har en hel del ninja hyss för sig i bakgrunden). Om komplexiteten ökar är det i regel svårare att få den att gå snabbt. Dessutom utökades register uppsättningen till 16 register i och med x86-64 och förmodligen överväger nackdelarna fördelarna redan vid 32 register. Det är väldigt sällan så många värden behövs samtidigt.
3: Den största fördelen av dem alla med x86 är just alla gammal kod som skrivits till den. Ingen tänker kasta bort hela det existerande mjukvarubiblioteket för några futtiga procent ökad prestanda eller någon watt mindre energiförbrukning. Dessutom har man i regel flyttat ut alla mindre viktiga instruktioner till mikrokodsprogram vilket minimerar deras negativa inverkan på resten av kärnan.
Dock tycker jag att det i dagsläget är ganska bevisat att instruktionsuppsättningsarkitekturen i praktiken har ganska liten inverkan egentligen. Det är bara en tun, tun, fasad runt processorkärna som där bakom kan se väldigt olika ut beroende på vilken funktionalitet man försöker optimera. Visst man kanske förlorar nån procent i prestanda här och var men på det stora hela avgörs processorns slutgiltiga prestanda av hur duktig man är när man bygger mikroarkitekturen.
Tolka inte det här fel nu. Helt klart finns det brister hos x86, att säga något annat vore löjligt. Dock tror jag inte de spelar någon avgörande roll i huvudmarknaden för processorerna med den instruktionsuppsättningen. Det vill säga persondatormarknaden. Dock kan nog några av dem spela en större roll om man försöker bygga processorer för andra användningsområden. Jag tror till exempel att det skulle vara svårt att implementera en x86 processor som drar under 1 W med dagens halvledarteknik. Även om det går så blir det nog inte alls lika bra som om man arbetat med en modernare och simplare instruktionsuppsättning.
Är det någon annan som har andra tankar om det här? Jag har egentligen ingen koll på x86 så om nån annan vet bättre så kan ni gärna säga till. : )
edit: oj va långt det blev... så går det när man är onykter... gonatt...
edit2: stav- och slarvfelsrättning...