bge

bge

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

lyszt.net охватывает bge и другие инструкции 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

Описание

bge работает в паре с blt и инвертирует его условие. Буквы означают branch if greater than or equal (переход, если больше или равно). Когда rs1 не меньше rs2, следующая инструкция переходит к помеченной позиции. В противном случае выполнение продолжается со следующей инструкции.

bge rs1, rs2, label

Для любых двух значений ровно одна из инструкций blt и bge выполняет переход, поэтому вместе они покрывают все случаи. Сравнение описано в разделе о blt, а переходы в целом — в разделе о beq.

bge часто встречается в начале цикла как проверка выхода. Следующая строка покидает цикл, как только счётчик t1 достигает своего предела t2.

bge t1, t2, done

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

Часть "or equal" (или равно) определяет поведение на границе. bge выполняет переход, когда два значения равны, и ошибки на единицу в циклах обычно восходят именно к этой границе. Цикл, считающий от 0 до n, завершается, когда счётчик достигает n.

Согласно руководству RISC-V, bge и bgeu выполняют переход, когда rs1 больше или равно rs2, сравнивая соответственно знаковые и беззнаковые значения. Смещение перехода — это 12-битное значение, измеряемое в кратных 2 байтах.

Как и в случае с blt, сравнение знаковое, поэтому отрицательные значения допустимы. bgeu — это беззнаковая форма, используемая для адресов и размеров. Обычное применение — проверка того, что значение неотрицательно, как в следующей строке.

bge t0, zero, ok

Пример

bge t1, t2, done   # leave the loop once i >= n