beq
lyszt.net cubre beq y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
beq permite que un programa tome una decisión. El procesador normalmente ejecuta las instrucciones en el orden en que aparecen en la lista. Ese orden por sí solo no puede elegir ni repetir nada. Una bifurcación cambia el orden. Evalúa una condición y, si la condición se cumple, el procesador continúa en un lugar diferente en vez de la siguiente línea. Todas las sentencias if y los bucles se construyen a partir de bifurcaciones.
El lugar diferente se nombra mediante una etiqueta, un nombre seguido de dos puntos que marca una posición en el código, como la etiqueta done en el ejemplo. beq (branch if equal, bifurcar si es igual) compara dos registros. Cuando contienen el mismo valor, salta a la posición etiquetada; cuando difieren, la ejecución continúa con la siguiente instrucción. La forma aparece a continuación.
beq rs1, rs2, label
beq solo cambia qué instrucción se ejecuta a continuación. Almacenar el resultado sí o no de una comparación como un número requiere una instrucción diferente, descrita en la página slt.
El procesador rastrea su posición con un registro llamado contador de programa, que contiene la dirección de la instrucción que se está ejecutando. Una bifurcación tomada cambia esa dirección, por lo que la siguiente instrucción proviene de la etiqueta.
El manual de RISC-V establece que una bifurcación condicional almacena su desplazamiento como un valor de 12 bits contado en múltiplos de 2 bytes. El desplazamiento se extiende con signo y se suma a la dirección de la instrucción de bifurcación, lo que da un rango de más o menos 4 KiB, donde un KiB son 1024 bytes. Las instrucciones de bifurcación comparan dos registros directamente y no usan códigos de condición. El manual da la razón de que una instrucción combinada de comparación y bifurcación cabe en una tubería regular y no necesita estado adicional ni registro temporal. También aconseja al software mantener la ruta más común como código recto y esperar que las bifurcaciones hacia atrás se predigan como tomadas y las bifurcaciones hacia adelante como no tomadas, al menos la primera vez que se encuentran.
Una bifurcación compara dos registros y no puede tomar una constante escrita en la instrucción, por lo que una forma como beq t0, 5, label no existe. Para comparar un registro con una constante, carga primero la constante en un registro con li, luego compara los dos registros.
li t1, 5 beq t0, t1, done
El valor 0 no necesita carga, porque el registro zero siempre lo contiene.
Un uso común compara un registro con zero, el registro que siempre contiene 0, para preguntar si un valor ha llegado a cero. Esto termina bucles de cuenta regresiva y verifica resultados. El ejemplo bifurca a done cuando a0 ha contado regresivamente hasta cero. beq y las etiquetas son suficientes para construir cada decisión y bucle en un programa.
Ejemplo
beq a0, zero, done # if a0 == 0, jump to 'done'
