beqz
pseudolyszt.net cubre beqz y otras instrucciones RISC-V con más detalle.
Descripción
beqz salta cuando un registro contiene cero. El nombre significa branch if equal to zero (saltar si es igual a cero). Con la forma que se muestra a continuación, el procesador salta a la posición etiquetada cuando rs es cero y, en caso contrario, continúa con la siguiente instrucción.
beqz rs, label
beqz es una pseudoinstrucción, un nombre legible que el ensamblador reescribe como una instrucción real. Se convierte en la instrucción que se muestra a continuación, que compara el registro con zero, el registro especial que siempre contiene 0.
beq rs, zero, label
beqz ofrece una forma más corta de escribir la comparación más común. Consulta beq para saber cómo funcionan las bifurcaciones y las etiquetas.
El cero aparece a menudo en el código de bajo nivel, y por eso existe la forma abreviada. Un byte cero marca el final de un texto. El cero es la señal habitual de que una operación tuvo éxito. El cero también representa un valor vacío o ausente, y los bucles de cuenta atrás terminan en cero. La comprobación de cero se usa tras cargar un carácter para detectar el final de una cadena, en un estado devuelto para tomar la ruta de éxito y en un contador para terminar un bucle.
El manual de RISC-V da una razón por la que sus bifurcaciones comparan dos registros en lugar de comparar un registro con cero. Las comparaciones con cero necesitan un retardo de circuito no trivial, por lo que son casi tan costosas como las comparaciones de magnitud aritmética. Por lo tanto, beqz es una pseudoinstrucción que usa beq con zero.
La primera línea de abajo se lee con más claridad que la segunda, que explicita la comparación con cero.
beqz t0, done beq t0, zero, done
Las pseudoinstrucciones existen por legibilidad, y el código máquina que producen es idéntico. Su opuesta es bnez, que salta cuando un valor no es cero.
Se expande a
beq rs, zero, label
El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.
Ejemplo
li t0, 0 beqz t0, done # t0 == 0, so jump to 'done'
