bgeu

bgeu

RISC-V Ассемблер Ссылка

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

Формат кодирования

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Описание

bgeu — это беззнаковая версия bge и противоположность bltu. Название означает branch if greater than or equal, unsigned (переход, если больше или равно, беззнаковое). Он выполняет переход к метке, когда rs1 не меньше rs2, причём оба читаются как неотрицательные числа. См. bge для самого сравнения и bltu для того, что меняет беззнаковость.

С bgeu в семействе шесть переходов. Есть три вопроса: равенство, меньше и больше или равно, причём последние два бывают в знаковой и беззнаковой форме. beq и bne проверяют равенство, blt и bge сравнивают знаковые значения, а bltu и bgeu сравнивают беззнаковые значения. Эти шесть вместе с перестановкой операндов для направлений «больше» и «меньше или равно» покрывают все сравнения, нужные программе.

bgeu подходит для ограничений на величины, которые не могут быть отрицательными. Примеры: выход из цикла, когда позиция достигает конца, отклонение индекса, достигшего размера массива, и переход к обработчику, когда длина достигает ёмкости. Для сравнения адресов памяти используются bltu и bgeu, поскольку адреса беззнаковые, а знаковые версии дают там неверные результаты.

В руководстве RISC-V сказано, что знаковые границы массива можно проверять одним беззнаковым переходом, так как любой отрицательный индекс сравнивается как больший любого неотрицательного предела. bgeu и bltu — две формы такой проверки.

Строка ниже выполняет совмещённую проверку границ одной инструкцией.

bgeu i, n, error

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

Пример

li t0, -1
li t1, 1
bgeu t0, t1, done   # t0 read as unsigned is huge, so jump to 'done'