Ich schreibe einen JIT-Compiler mit einem x86-Backend und lernen x86 Assembler und Maschinencode, wie ich gehe. Ich habe ARM Assembler vor etwa 20 Jahren benutzt und bin überrascht über den Unterschied in den Kostenmodellen zwischen diesen Architekturen.Moderne x86 Kostenmodell
Insbesondere Speicherzugriffe und Verzweigungen sind auf ARM teuer, aber die äquivalenten Stapeloperationen und Sprünge sind auf x86 billig. Ich glaube, dass moderne x86-CPUs viel mehr dynamische Optimierungen durchführen als ARM-Cores, und ich finde es schwierig, ihre Auswirkungen vorherzusehen.
Was ist ein gutes Kostenmodell beim Schreiben von x86-Assembler? Welche Kombinationen von Anweisungen sind billig und welche sind teuer?
Zum Beispiel wäre mein Compiler einfacher, wenn er immer die lange Form zum Laden von ganzen Zahlen oder zum Sprung zu Offsets erzeugt hätte, selbst wenn die ganzen Zahlen klein waren oder die Offsets schließen, aber würde dies die Performance beeinträchtigen?
Ich habe noch keinen Floating Point gemacht, aber ich würde gerne bald darauf kommen. Ist die Interaktion zwischen normalem und float-Code nicht offensichtlich?
Ich weiß, es gibt viele Referenzen (z. B. Michael Abrash) auf x86-Optimierung, aber ich habe eine Ahnung als alles andere als ein paar Jahre alt wird nicht für moderne x86-CPUs gelten, weil sie in letzter Zeit so viel geändert haben. Hab ich recht?
An welcher x86-Implementierung sind Sie interessiert? – harold
@harold Alles, was Sie heute in einem Laptop, Desktop oder Server finden würden. Also ich denke, SSE3 ist eine Selbstverständlichkeit. Ich hätte gerne generische Ratschläge zur Optimierung für alle von ihnen sowie Details über Überraschungen, die ich finden könnte, z. eine Anweisung, die auf dem Atom 10x langsamer ist. –
Conroe und es Derivate (Nehalem, Sandy Bridge) sind so verschieden von Atom wie sie sich von ARM unterscheiden. Die Optimierungsgrundsätze sind dieselben wie beim P6, daher sind einige ältere Texte gültig. –