bge

bge

Assembly RISC-V Riferimento

lyszt.net tratta bge e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descrizione

bge si abbina a blt e ne inverte la condizione. Le lettere stanno per branch if greater than or equal (salto se maggiore o uguale). Quando rs1 è almeno pari a rs2, l'istruzione sottostante salta alla posizione etichettata. Altrimenti l'esecuzione prosegue con l'istruzione successiva.

bge rs1, rs2, label

Per due valori qualsiasi, esattamente uno tra blt e bge esegue il salto, quindi i due coprono tutti i casi. Il confronto è descritto sotto blt, e i salti in generale sotto beq.

bge compare comunemente all'inizio di un ciclo come test di uscita. La riga sottostante esce dal ciclo una volta che il contatore t1 raggiunge il suo limite t2.

bge t1, t2, done

Segue il corpo del ciclo, e un salto incondizionato alla sua fine ritorna all'inizio. Testare prima del corpo gestisce zero ripetizioni, poiché un corpo la cui condizione è già soddisfatta non viene mai eseguito.

La parte or equal (o uguale) decide il comportamento al confine. bge salta quando i due valori sono uguali, e gli errori off-by-one nei cicli di solito risalgono a questo confine. Un ciclo che conta da 0 fino a n esce quando il contatore raggiunge n.

Secondo il manuale RISC-V, bge e bgeu eseguono il salto quando rs1 è maggiore o uguale a rs2, confrontando rispettivamente valori con segno e senza segno. Un offset di salto è un valore a 12 bit misurato in multipli di 2 byte.

Come per blt, il confronto è con segno, quindi i valori negativi sono ammessi. bgeu è la forma senza segno, usata per indirizzi e dimensioni. Un uso comune è verificare che un valore non sia negativo, come nella riga sottostante.

bge t0, zero, ok

Esempio

bge t1, t2, done   # leave the loop once i >= n