16 registri con istruzioni 3-operando non distruttive è probabilmente migliore.
Tuttavia, si dovrebbe anche considerare di fare qualcos'altro di interessante con quei bit di istruzioni. Per l'homebrew, probabilmente non ti interessa prenotare alcuno per future estensioni, e non vuoi aggiungere una tonnellata di opcode extra (like PPC does).
ARM prende l'approccio interessante di avere un operando per ogni istruzione passare attraverso the barrel shifter, quindi ogni istruzione è un'istruzione "shift-and-any" gratuitamente. Questo è supportato anche in modalità "thumb", dove le istruzioni più comuni sono solo 16 bit.(Modo ARM ha RISC 32bit tradizionale formato istruzione fisso. Si dedica 4 su quei bit di esecuzione predicato per ogni istruzione.)
Mi ricordo di vedere uno studio sui guadagni Potenza dal raddoppiare il numero di registri in un architettura teorica, per SPECint o qualcosa del genere. 8-> 16 era forse 5 o 10%, 16-> 32 era solo un paio% e 32-> 64 era ancora più piccolo.
Quindi 16 registri integer sono "sufficienti" la maggior parte del tempo, a meno che non si stia lavorando con int32_t
molto, poiché ogni valore avrà due registri a 16 bit. x86-64 ha solo 16 registri GP, e la maggior parte delle funzioni può mantenere molto del loro stato live in registri in modo abbastanza confortevole. Anche nei loop che effettuano chiamate di funzione, nell'ABI ci sono abbastanza registri preservati dalle chiamate che spesso non si verificano nel circuito.
I guadagni in termini di dimensioni del codice e conteggio delle istruzioni da 3 operandi saranno maggiori rispetto a quelli che si verificano con lo spargimento/ricarica occasionale. l'output gcc deve sempre essere mov
e utilizzare lea
come add-shift non distruttivo.
Se si desidera ottimizzare la CPU per il software-pipelining per nascondere la latenza carico di memoria (which is simpler than full out-of-order execution), più registri sono grandi, esp. se non si ha il cambio del nome. Tuttavia, non sono sicuro di quanto siano buoni i compilatori allo static instruction scheduling. Non è più un argomento caldo, dal momento che tutte le CPU ad alte prestazioni sono fuori uso. (OTOH, un sacco di software che le persone effettivamente utilizzano è in esecuzione su CPU ARM in ordine negli smartphone.) Non ho esperienza nel cercare di ottenere i compilatori per ottimizzare le CPU in ordine, quindi IDK quanto sia fattibile dipendere da quella.
Se la tua CPU è così semplice da non poter fare altro mentre un carico è in volo, questo probabilmente non ha importanza. (Questo sta diventando davvero mano mossi perché io non ne so abbastanza su ciò che è pratico per un design semplice. Anche "semplice" in-order sono pipeline moderne CPU.)
64 registri è entrare in "troppo molti "territori, dove salvarli/ripristinarli richiede molto codice. La quantità di memoria è probabilmente ancora trascurabile, ma dal momento che non è possibile eseguire il loop dei registri, sono necessarie 64 istruzioni.
Se stai progettando un ISA da zero, uno sguardo ai Agner Fog's CRISC proposal e la discussione risultante. I tuoi obiettivi sono molto diversi (CPU a 64 bit con prestazioni elevate e risparmio energetico rispetto a 16 bit semplici), quindi i tuoi ISA saranno ovviamente molto diversi. Tuttavia la discussione può farti pensare a cose che non hai considerato, o idee che vuoi provare.
Solo in un primo momento (in x86 mi dispiace solo l'assemblea che conosco). La maggior parte dei programmi che ho messo in atto come IDA di solito usano registri Eax attraverso Edx, quindi è 4. Quindi hai Ebp ed Esp così 6. Eip non dovrebbe aver bisogno dell'ALU. Eflags (di nuovo senza bisogno di ALU) ESI ed EDI fanno 8. Quindi, da un primo pensiero, non credo che la maggior parte dei programmi utilizzi più di 16 registri. Potrei mancarne alcuni, ma penso che un buon primo test di sanità mentale per determinare ciò riguarderebbe cosa gcc compila e trova se utilizza anche più di 16 registri sull'ALU. – arduic
Dove stai andando a codificare la modalità di indirizzamento? –
@WeatherVane È RISC: carichi e negozi sono operazioni esplicite con il proprio codice operativo. È una CPU homebrew - le uniche modalità di indirizzamento per carichi e negozi sono offset immediati a 8 bit da zero, da PC o da un altro registro. – fadedbee