bge

bge

Ensamblador RISC-V Referencia

lyszt.net cubre bge y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

bge se empareja con blt e invierte su condición. Las letras significan branch if greater than or equal (salta si es mayor o igual que). Cuando rs1 es al menos rs2, la instrucción siguiente salta a la posición etiquetada. En caso contrario, la ejecución continúa con la instrucción siguiente.

bge rs1, rs2, label

Para dos valores cualesquiera, exactamente uno de blt y bge toma el salto, por lo que ambos cubren todos los casos. La comparación se describe en blt, y los saltos en general en beq.

bge aparece comúnmente al inicio de un bucle como prueba de salida. La línea siguiente abandona el bucle una vez que el contador t1 alcanza su límite t2.

bge t1, t2, done

El cuerpo del bucle sigue a continuación, y un salto incondicional al final vuelve al inicio. Probar antes del cuerpo maneja cero repeticiones, ya que un cuerpo cuya condición ya se cumple nunca se ejecuta.

La parte "or equal" (o igual) decide el comportamiento en el límite. bge salta cuando los dos valores son iguales, y los errores por desfase de uno en los bucles suelen remontarse a este límite. Un bucle que cuenta desde 0 hasta n sale cuando el contador alcanza n.

Según el manual de RISC-V, bge y bgeu toman el salto cuando rs1 es mayor o igual que rs2, comparando valores con signo y sin signo respectivamente. Un desplazamiento de salto es un valor de 12 bits medido en múltiplos de 2 bytes.

Al igual que con blt, la comparación es con signo, por lo que se permiten valores negativos. bgeu es la forma sin signo, usada para direcciones y tamaños. Un uso común es comprobar que un valor no es negativo, como en la línea siguiente.

bge t0, zero, ok

Ejemplo

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