bltu

bltu

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

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

Описание

bltu выполняет то же ветвление, что и blt, но читает оба регистра как беззнаковые. Название означает branch if less than, unsigned (ветвление, если меньше, беззнаковое). Ветвление происходит, когда rs1 меньше rs2, при этом оба значения читаются как неотрицательные числа от 0 примерно до 4 миллиардов. Страница blt описывает само ветвление. Эта страница объясняет, почему беззнаковое чтение имеет собственную инструкцию.

Одни и те же 32 бита представляют разные числа в зависимости от того, читается ли старший бит как знак или как часть значения. blt читает биты как знаковые, а bltu — как беззнаковые, и эти два чтения расходятся. Регистр со всеми битами, установленными в 1, для blt равен -1, очень малому значению, а для bltu — наибольшему возможному значению. Выбор неправильной инструкции даёт неверный результат без какого-либо сообщения об ошибке.

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

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

Один bltu проверяет, что индекс находится в диапазоне: не меньше 0 и меньше размера n.

bltu i, n, ok

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

Пример

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