Ich denke, ich suche nach einer Antwort auf eine wichtige Frage. Ich versuche zu verstehen, warum die MIPS-Architektur einen expliziten "Null" -Wert in einem Register verwendet, wenn Sie dasselbe erreichen können, indem Sie einfach ein Register gegen sich selbst XOR'en. Man könnte sagen, dass die Operation bereits für Sie durchgeführt wurde; Ich kann mir jedoch keine Situation vorstellen, in der Sie viele "Null" -Werte verwenden würden. Ich habe Hennesseys Originalarbeiten gelesen, und es wird tatsächlich nur eine Null zugewiesen, ohne dass dies wirklich gerechtfertigt ist.
Gibt es einen logischen Grund für eine fest codierte binäre Zuweisung von Null?
Update: In 8k einer ausführbaren Datei von xc32-gcc für den MIPS-Kern im PIC32MZ habe ich eine einzelne Instanz von "Null".
add t3,t1,zero
Die eigentliche Antwort: Ich habe das Kopfgeld an die Person vergeben, die die Informationen über MIPS und Zustandscodes hatte. Die Antwort liegt tatsächlich in der MIPS-Architektur für Bedingungen. Obwohl ich diesem ursprünglich keine Zeit zuweisen wollte, überprüfte ich die Architektur für opensparc , MIPS-V und OpenPOWER (dieses Dokument war intern). Hier sind die zusammenfassenden Ergebnisse. Das R0-Register, das aufgrund der Architektur der Pipeline für den Vergleich in Zweigen erforderlich ist.
- Ganzzahlvergleich gegen Null und Verzweigung (bgez, bgtz, blez, bltz)
- Ganzzahl vergleiche zwei Register und einen Zweig (beq, bne)
- Ganzzahl vergleiche zwei Register und Trap (teq, tge, tlt, tne)
- Ganzzahl-Vergleichsregister und Sofort- und Falle (teqi, tgei, tlti, tnei)
Es kommt einfach darauf an, wie die Hardware in der Implementierung aussieht. Im MIPS-V-Handbuch finden Sie ein nicht referenziertes Zitat auf Seite 68:
Die bedingten Verzweigungen wurden so konzipiert, dass sie arithmetische Vergleichsoperationen zwischen zwei Registern (wie auch in PA-RISC und Xtensa ISA) enthalten, anstatt Bedingungscodes (x86, ARM, SPARC, PowerPC) zu verwenden oder nur ein Register mit Null zu vergleichen ( Alpha, MIPS) oder zwei Register nur für Gleichheit (MIPS). Dieses Design wurde durch die Beobachtung motiviert, dass ein kombinierter Vergleichs- und Verzweigungsbefehl ts in eine reguläre Pipeline ts einen zusätzlichen Zustand des Bedingungscodes oder die Verwendung eines temporären Registers vermeidet und die statische Codegröße und den dynamischen Befehlsabruf-Trac reduziert. Ein weiterer Punkt ist, dass Vergleiche gegen Null eine nicht triviale Schaltungsverzögerung erfordern (insbesondere nach der Umstellung auf statische Logik in fortgeschrittenen Prozessen) und daher fast so teuer sind wie arithmetische Größenvergleiche. Ein weiterer Vorteil eines fusionierten Vergleichs- und Verzweigungsbefehls besteht darin, dass Verzweigungen früher im Front-End-Befehlsstrom beobachtet werden und daher früher vorhergesagt werden können. Ein Entwurf mit Bedingungscodes hat vielleicht einen Vorteil, wenn mehrere Zweige basierend auf denselben Bedingungscodes verwendet werden können, aber wir glauben, dass dieser Fall relativ selten ist.
Das MIPS-V-Dokument trifft den Autor des zitierten Abschnitts nicht. Ich danke allen für ihre Zeit und Rücksichtnahme.