16 Register mit nicht-destruktiven 3-Operanden-Anweisungen ist wahrscheinlich besser.
Sie sollten jedoch auch in Betracht ziehen, etwas anderes interessantes mit diesen Befehlsbits zu tun. Für Homebrew, ist es wahrscheinlich nicht wichtig, für zukünftige Erweiterungen zu reservieren, und wollen nicht eine Tonne von zusätzlichen Opcodes (like PPC does) hinzufügen.
ARM nimmt den interessanten Ansatz, einen Operanden für jede Anweisung the barrel shifter durchlaufen zu lassen, so dass jede Anweisung eine "shift-and-whatever" -Anweisung kostenlos ist. Dies wird sogar im "Daumen" -Modus unterstützt, wo die gebräuchlichsten Befehle nur 16 Bits sind.(ARM Modus hat die traditionelle RISC 32-Bit-Festbefehlsgröße. Es widmet 4 diese Bits zu sagte Ausführung für jede Anweisung.)
Ich erinnere mich, eine Studie über die perf Gewinne aus zu sehen, die Anzahl der Register in einer Verdoppelung theoretische Architektur, für SPECint oder so. 8-> 16 war vielleicht 5 oder 10%, 16-> 32 war nur ein paar%, und 32-> 64 war noch kleiner.
Also 16 Integer-Register ist "genug" die meiste Zeit, es sei denn, Sie arbeiten mit int32_t
viel, da jeder solche Wert zwei 16-Bit-Register nehmen wird. x86-64 hat nur 16 GP-Register, und die meisten Funktionen können einen Großteil ihres Zustands in Registern recht komfortabel speichern. Selbst in Schleifen, die Funktionsaufrufe ausführen, gibt es genug Register, in denen die Aufrufe erhalten bleiben, in dem ABI, dass das Überlaufen/Neuladen häufig nicht in der Schleife stattfinden muss.
Die Erhöhung der Codegröße und der Befehlsanzahl aus Anweisungen mit 3 Operanden ist größer als die Speicherung gelegentlicher Überläufe/Neuladungen. gcc output muss die ganze Zeit mov
haben und lea
als nicht-destruktive add/shift verwenden.
Wenn Sie Ihre CPU für Software-Pipelining optimieren möchten Speicherauslastung Latenz (which is simpler than full out-of-order execution) zu verstecken, sind mehrere Register groß, esp. wenn Sie keine Registerumbenennung haben. Ich bin mir jedoch nicht sicher, wie gut Compiler bei static instruction scheduling sind. Es ist kein heißes Thema mehr, da alle Hochleistungs-CPUs außer Betrieb sind. (OTOH, eine Menge Software, die tatsächlich benutzt wird, läuft auf ARM-CPUs in Smartphones.) Ich habe keine Erfahrung damit, Compiler zu finden, um CPUs in der richtigen Reihenfolge zu optimieren. IDK also, wie lebensfähig es ist Das.
Wenn Ihre CPU so einfach ist, dass sie während einer laufenden Ladung nichts anderes tun kann, spielt dies wahrscheinlich keine Rolle. (Dies ist immer wellig Hand wirklich, weil ich weiß nicht genug darüber, was für ein einfaches Design praktisch ist. Auch „einfache“ in Ordnung moderne CPUs pipelined werden.)
64 Register ist in „zu bekommen viele Gebiete, in denen das Speichern/Wiederherstellen viel Code erfordert. Die Speichermenge ist wahrscheinlich immer noch vernachlässigbar, aber da Sie keine Register durchlaufen können, benötigen Sie 64 Anweisungen.
Wenn Sie eine ISA von Grund auf neu sind der Gestaltung haben einen Blick auf Agner Fog's CRISC proposal und die daraus resultierende Diskussion. Ihre Ziele sind sehr unterschiedlich (hohe Leistung/Leistungsbudget 64-Bit-CPU gegenüber einfachen 16-Bit), so dass Ihre ISAs natürlich sehr unterschiedlich sein werden. Die Diskussion kann jedoch dazu führen, dass Sie an Dinge denken, die Sie nicht berücksichtigt haben, oder an Ideen, die Sie ausprobieren möchten.
Auf nur eine erste zwar (in x86 sorry nur Assembly Ich weiß). Die meisten Programme, die ich durch Dinge wie IDA durchgebe, benutzen normalerweise Register Eax bis Edx, also ist das 4. Dann hast du Ebp und Esp so 6. Eip sollte die ALU nicht brauchen. Eflags (wieder keine Notwendigkeit für ALU) ESI und EDI macht 8. So nur von einem ersten Gedanken glaube ich nicht, dass die meisten Programme mehr als 16 Register verwenden. Ich vermisse vielleicht ein paar, aber ich denke, ein guter erster Vernunfttest, um dies zu bestimmen, würde aussehen, was gcc kompiliert und herauszufinden, ob es sogar mehr als 16 Register auf der ALU verwendet. – arduic
Wo werden Sie den Adressierungsmodus programmieren? –
@ WeatherVane Es ist RISC - Laden und Speichern sind explizite Operationen mit ihrem eigenen Opcode. Es ist eine Homebrew-CPU - die einzigen Adressierungsmodi für Lasten und Speicher sind 8 Bit sofortige Offsets von Null, vom PC oder von einem anderen Register. – fadedbee