beq
lyszt.net tratta beq e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
Descrizione
beq consente a un programma di prendere una decisione. Il processore normalmente esegue le istruzioni nell'ordine in cui appaiono nella lista. Quell'ordine da solo non può scegliere o ripetere nulla. Un salto cambia l'ordine. Verifica una condizione e, se la condizione è vera, il processore continua in un punto diverso invece che alla riga successiva. Tutte le istruzioni if e i cicli sono costruiti a partire dai salti.
Il punto diverso è nominato da un'etichetta, un nome seguito da due punti che marca una posizione nel codice, come l'etichetta done nell'esempio. beq (branch if equal, salta se uguale) confronta due registri. Quando contengono lo stesso valore, salta alla posizione etichettata; quando differiscono, l'esecuzione continua con l'istruzione successiva. La forma appare di seguito.
beq rs1, rs2, label
beq cambia solo quale istruzione viene eseguita successivamente. Memorizzare il risultato sì o no di un confronto come numero richiede un'istruzione diversa, descritta nella pagina slt.
Il processore tiene traccia della sua posizione con un registro chiamato program counter, che contiene l'indirizzo dell'istruzione in esecuzione. Un salto preso cambia quell'indirizzo, quindi l'istruzione successiva proviene dall'etichetta.
Il manuale RISC-V afferma che un salto condizionale memorizza il suo offset come un valore a 12 bit contato in multipli di 2 byte. L'offset viene esteso in segno e aggiunto all'indirizzo dell'istruzione di salto, dando un intervallo di più o meno 4 KiB, dove un KiB è 1024 byte. Le istruzioni di salto confrontano due registri direttamente e non usano codici di condizione. Il manuale fornisce la motivazione che un'istruzione combinata di confronto e salto si adatta a una pipeline regolare e non necessita di stato aggiuntivo o registro temporaneo. Consiglia inoltre al software di mantenere il percorso più comune come codice rettilineo e di aspettarsi che i salti all'indietro siano previsti come presi e i salti in avanti come non presi, almeno la prima volta che vengono incontrati.
Un salto confronta due registri e non può usare una costante scritta nell'istruzione, quindi una forma come beq t0, 5, label non esiste. Per confrontare un registro con una costante, caricare prima la costante in un registro con li, poi confrontare i due registri.
li t1, 5 beq t0, t1, done
Il valore 0 non necessita di caricamento, perché il registro zero lo contiene sempre.
Un uso comune confronta un registro con zero, il registro che contiene sempre 0, per chiedere se un valore ha raggiunto zero. Questo termina i cicli di conto alla rovescia e verifica i risultati. L'esempio salta a done quando a0 è stato decrementato fino a zero. beq e le etichette sono sufficienti per costruire ogni decisione e ogni ciclo in un programma.
Esempio
beq a0, zero, done # if a0 == 0, jump to 'done'
