bgeu

bgeu

Ensamblador RISC-V Referencia

lyszt.net cubre bgeu 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

bgeu es la versión sin signo de bge y lo opuesto de bltu. El nombre significa branch if greater than or equal, unsigned (bifurcar si es mayor o igual, sin signo). Salta a la etiqueta cuando rs1 es al menos rs2, con ambos leídos como números no negativos. Consulta bge para la comparación y bltu para lo que cambia el modo sin signo.

Con bgeu la familia tiene seis bifurcaciones. Hay tres preguntas: igual, menor que y mayor o igual, y las dos últimas vienen en forma con signo y sin signo. beq y bne comprueban la igualdad, blt y bge comparan valores con signo, y bltu y bgeu comparan valores sin signo. Estas seis, junto con intercambiar los operandos para las direcciones mayor que y menor o igual, cubren todas las comparaciones que un programa necesita.

bgeu es adecuada para límites de cantidades que no pueden ser negativas. Algunos ejemplos son salir de un bucle cuando una posición alcanza el final, rechazar un índice que ha alcanzado el tamaño del arreglo y bifurcar a un manejador cuando una longitud alcanza la capacidad. La comparación de direcciones de memoria usa bltu y bgeu, ya que las direcciones no tienen signo, y las versiones con signo dan resultados incorrectos ahí.

El manual de RISC-V dice que los límites de un arreglo con signo se pueden comprobar con una sola bifurcación sin signo, ya que cualquier índice negativo se compara como mayor que cualquier límite no negativo. bgeu y bltu son las dos formas de esa comprobación.

La línea siguiente realiza la comprobación combinada de límites en una sola instrucción.

bgeu i, n, error

Detecta un índice que es demasiado grande o negativo, porque un índice negativo se lee como un valor sin signo enorme y falla la prueba.

Ejemplo

li t0, -1
li t1, 1
bgeu t0, t1, done   # t0 read as unsigned is huge, so jump to 'done'