bgez
псевдо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'
