bgtпсевдо

bgt

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

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

Описание

bgt — это ветвь, которая срабатывает, когда одно значение больше другого. Её название означает branch if greater than (ветвление, если больше чем). Приведённая ниже инструкция выполняет переход к метке, когда rs1 строго больше rs2, сравнивая их как знаковые значения.

bgt rs1, rs2, label

Ни одна из шести основных ветвей RISC-V не проверяет условие «больше чем». Вопрос «a больше b» — это тот же вопрос, что и «b меньше a» при переставленных операндах. bgt — это псевдоинструкция, и ассемблер переписывает её как blt с обратным порядком операндов. Аппаратная часть остаётся проще, а сравнение по-прежнему можно записать в направлении, которое читается естественно. Лежащая в основе ветвь «меньше чем» описана в blt.

Прибегайте к bgt, когда условие естественно читается в этом направлении, например чтобы уйти по ветви, когда значение превышает максимум, когда длина больше отведённого для неё пространства, или при выборе большего из двух путей.

В руководстве по RISC-V указано, что bgt, bgtu, ble и bleu можно синтезировать, поменяв операнды местами и заменив на blt, bltu, bge и bgeu.

Строго — это ключевое слово. bgt не выполняет ветвление, когда два значения равны. Чтобы учитывать и равные значения, используйте bge, которое ветвится при «больше или равно». Ошибки на единицу в циклах и проверках обычно возникают из-за этого различия. Сравнение знаковое. Для беззнаковых данных та же замена применяется к bltu.

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

blt rs2, rs1, label

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

Пример

li t0, 5
li t1, 2
bgt t0, t1, done   # 5 > 2, so jump to 'done'