sltu

sltu

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

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

Описание

sltu устанавливает регистр назначения в 1 или 0, как slt, и сравнивает два числа как беззнаковые значения. Название означает set less than, unsigned. Страница slt описывает сохранение результата сравнения в виде 1 или 0.

Одни и те же 32 бита можно прочитать как число со знаком, где старший бит означает отрицательное значение, а диапазон составляет примерно от -2 миллиардов до +2 миллиардов, или как беззнаковое число, без отрицательных значений и с диапазоном от 0 до примерно 4 миллиардов. slt читает значение со знаком, а sltu — беззнаковое. Регистр, все биты которого установлены в 1, для slt равен -1, а для sltu — наибольшему возможному значению, поэтому две инструкции могут расходиться на одинаковых входных данных.

Используйте sltu для величин, которые не могут быть отрицательными, таких как адреса памяти, размеры, счётчики и позиции. Сравнение двух адресов памяти с помощью знакового slt даёт неверный результат, как только адрес становится достаточно большим, чтобы установить свой старший бит, поскольку знаковое чтение трактует его как отрицательное.

Руководство RISC-V описывает slt и sltu вместе как знаковое и беззнаковое сравнения, которые записывают 1 в rd, если rs1 меньше rs2, и 0 в противном случае. В нём приводится строка ниже как способ проверки на ненулевое значение, что представляет собой псевдоинструкцию snez.

sltu rd, x0, rs2

Форма sltu показана ниже.

sltu rd, rs1, rs2

В особом случае ниже rd становится равным 1 всякий раз, когда rs отлично от нуля, поскольку 0 меньше любого другого беззнакового значения. Это сводит любое число к 1 или 0.

sltu rd, zero, rs

Пример

li t0, -1
li t1, 1
sltu t2, t0, t1   # t2 = 0 (t0 read as unsigned is huge)