slti

slti

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

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

Описание

slti сравнивает регистр с константой и записывает 1 или 0 в приёмник. Это slt, который сравнивает два регистра и сохраняет результат в виде числа (см. эту страницу), но со вторым значением, заданным как непосредственное значение. Непосредственное значение — это константа, закодированная в инструкции, и буква i в названии это обозначает.

Форма slti показана ниже. Когда значение в rs1 меньше константы imm, rd получает 1, иначе 0.

slti rd, rs1, imm

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

Используйте её для сравнения переменной с фиксированным порогом, известным заранее. Проверка того, меньше ли индекс 10 или не опустилось ли значение ниже предела, требует одной slti. Следующая строка спрашивает, меньше ли t0 нуля, что проверяет отрицательное значение и устанавливает t1 в 1 для отрицательных значений и в 0 в противном случае.

slti t1, t0, 0

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

Константа находится в диапазоне от -2048 до 2047. Чтобы сравнить с большим значением, загрузите константу в регистр с помощью li и используйте slt. Ассемблер отклоняет константу вне диапазона с сообщением об ошибке.

Пример

li t0, 3
slti t1, t0, 5   # t1 = 1 (3 < 5)