bgezпсевдо

bgez

псевдо
RISC-V Ассемблер Ссылка

lyszt.net охватывает bgez и другие инструкции RISC-V более подробно.

Описание

bgez выполняет переход, когда значение в регистре равно нулю или положительно. Название означает branch if greater than or equal to zero (переход, если больше или равно нулю). Приведённая ниже форма выполняет переход к помеченной позиции, когда rs не меньше нуля, и в противном случае переходит к следующей инструкции.

bgez rs, label

Ассемблер рассматривает её как псевдоинструкцию и переписывает в приведённую ниже инструкцию, которая сравнивает регистр с zero — регистром, который всегда содержит 0.

bge rs, zero, label

Сравнение знаковое, поэтому 32 бита в регистре читаются как число, которое может быть отрицательным. Ноль считается совпадением, что отличает bgez от bgtz. Это противоположность bltz, поэтому для любого значения ровно одна из двух выполняет переход. Сравнение двух регистров см. в bge.

bgez — естественная проверка для значения, которое не должно быть отрицательным, например длины, счётчика или индекса. Программа, которая вычитает единицу из счётчика и продолжает цикл, пока счётчик не стал меньше нуля, использует её в конце цикла.

addi t0, t0, -1
bgez t0, loop

Приведённый выше цикл повторяется, пока t0 после вычитания равен 0 или больше, поэтому он выполняется ещё раз с t0, равным 0, и останавливается, когда t0 достигает -1.

Разворачивается в

bge rs, zero, label

Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.

Пример

li t0, 4
bgez t0, done   # t0 >= 0, so jump to 'done'