sltiu
lyszt.net охватывает sltiu и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
sltiu объединяет slti и sltu. Он сравнивает регистр с константой и рассматривает оба значения как беззнаковые. Название складывается из частей: set less than, immediate, unsigned. Приведённая ниже форма записывает 1 в rd, когда rs1 меньше константы imm, причём оба значения читаются как неотрицательные числа, и 0 в противном случае.
sltiu rd, rs1, imm
Беззнаковость, как и на странице sltu, означает, что старший бит считается обычной цифрой числа, поэтому диапазон простирается от 0 примерно до 4 миллиардов. sltiu выполняет проверки диапазона для значений, которые не могут быть отрицательными, например проверку того, что индекс меньше размера массива, за одну инструкцию.
Следующая строка спрашивает, меньше ли значение 1.
sltiu rd, rs, 1
Ноль — единственное беззнаковое значение, меньшее 1, поэтому результат равен 1, когда rs равен нулю, и 0 в противном случае. Это проверка на равенство нулю, и сокращение seqz построено на ней. Равенство двух значений следует из неё. Выполните XOR двух значений, что даёт ноль только при их совпадении, и проверьте результат на ноль.
Руководство RISC-V говорит, что константа сначала расширяется со знаком до 32 бит, а затем рассматривается как беззнаковое число. Поэтому отрицательная константа становится очень большим беззнаковым значением. Руководство приводит sltiu с константой 1 как способ проверки на ноль, то есть псевдоинструкцию seqz.
Как и в случае с slti, константы за пределами 12-битного диапазона загружаются в регистр с помощью li и сравниваются с помощью sltu.
Пример
li t0, -1 sltiu t1, t0, 5 # t1 = 0 (t0 read as unsigned is huge)
