Penso che sto cercando una risposta a una domanda a quiz. Sto cercando di capire perché l'architettura MIPS utilizza un valore "zero" esplicito in un registro quando puoi ottenere la stessa cosa semplicemente XOR''un qualsiasi registro contro se stesso. Si potrebbe dire che l'operazione è già stata eseguita per te; tuttavia, non riesco davvero a immaginare una situazione in cui useresti molti valori "zero". Ho letto i documenti originali di Hennessey e assegna uno zero come dato di fatto senza alcuna vera giustificazione.
Esiste una ragione logica per avere un'assegnazione binaria hardcoded di zero?
aggiornamento: In 8k di un eseguibile da xc32-gcc per il core MIPS in PIC32MZ, ho una singola istanza di "zero".
add t3,t1,zero
la risposta effettiva: ho assegnato la generosità alla persona che aveva le informazioni su MIPS e codici di condizione. La risposta in realtà sta nell'architettura MIPS per le condizioni. Sebbene inizialmente non volessi assegnare tempo a questo, ho rivisto l'architettura per opensparc , MIPS-V e OpenPOWER (questo documento era interno) e qui ci sono i risultati riassuntivi. Il registro R0 necessario per il confronto sui rami a causa dell'architettura della conduttura.
- confronto intero con zero e branch (bgez, bgtz, blez, bltz)
- intero confronta due registri e ramo (beq, bne)
- intero confronta due registri e trap (teq, tge, tlt, tne)
- registro di confronto intero e immediato e trap (teqi, tgei, tlti, tnei)
Dipende semplicemente dall'aspetto dell'implementazione dell'hardware. Dal manuale MIPS-V, c'è una citazione senza riferimento a pagina 68:
I rami condizionali sono stati progettati per includere operazioni di confronto aritmetico tra due registri (come anche in PA-RISC e Xtensa ISA), anziché utilizzare codici di condizione (x86, ARM, SPARC, PowerPC) o per confrontare un solo registro con zero ( Alpha, MIPS) o due registri solo per uguaglianza (MIPS). Questo progetto è stato motivato dall'osservazione che un'istruzione combinata di comparazione e diramazione si trasforma in una pipeline regolare, evita lo stato del codice di condizione aggiuntivo o l'uso di un registro temporaneo e riduce le dimensioni del codice statico e il trac di recupero delle istruzioni dinamiche. Un altro punto è che i confronti contro lo zero richiedono un ritardo del circuito non banale (specialmente dopo il passaggio alla logica statica nei processi avanzati) e quindi sono quasi costosi rispetto alla magnitudine aritmetica. Un altro vantaggio di un'istruzione di comparazione e diramazione fusa è che i rami sono osservati prima nel flusso di istruzioni front-end e quindi possono essere previsti in precedenza. Vi è forse un vantaggio in un progetto con codici di condizione nel caso in cui più rami possano essere presi in base agli stessi codici di condizione, ma riteniamo che questo caso sia relativamente raro.
Il documento MIPS-V non colpisce l'autore della sezione citata. Ringrazio tutti per il loro tempo e considerazione.