Описание: Производится вычисление нового значения на основе заданного регистра rs1 со знакорасширенным значением константы (12 бит), результат записывается в rd. Если в старшем бите константы будет 1, то он расширяется на все 20 старших битов.
Как можно заметить, нет SUBI – поскольку в качестве операнда принимается значение от -2048 до 2027, то инструкция SUBI автоматически получается при ADDI с отрицательным числом.
Особенность: Интересны две инструкции SLTI (Set Less Than Immediate) и SLTIU – беззнаковый вариант. Они лишь сравнивают два числа и устанавливается либо значение 1, либо 0 в регистр-назначение rd.
Описание: Инструкции сдвига регистра rs1 на 0..31 битов: SLLI – влево (умножение), SRLI – вправо (деление), SRAI – вправо со знаком. Особенность данной функции в том что для определения SRLI или SRAI задействован параметр funct7. Занимает тот же самый опкод, что и все остальные инструкции, работающие с константами, но используется 5 бит сдвига вместо указателя на регистр rs2.
101: regs[rd] = funct7 ? v1 >> sh : v1 >>> sh // SRL, SRA
110: regs[rd] = v1 | v2 // OR
111: regs[rd] = v1 & v2 // AND
Описание: Это полноценное АЛУ, которое работает с регистрами rs1, rs2 и с записью результата в rd. Поскольку результатов флагов нет, то непосредственно выполняются сами действия. Некоторые вариации меняются при помощи funct7, такие как ADD, SUB и SRL, SRA.
§ Инструкции умножения и деления
Эти инструкции входят в набор RV32IM, являясь опциональным дополнением RV32I.
Внимание: При делении на ноль DIV получается -1, исключение не генерируется. Результатом REM при делении на ноль будет значение из регистра номер rs1. При делении отрицательного на -1 будет тоже и остаток 0.
Описание: Данное расширение добавляет только три новых операции – умножение, деление и взятие остатка.
MUL – умножение rs1 x rs2 и получение младшей части [31:0] от результата и запись в rd
MULH – сначала rs1 и rs2 дополняются знаком до 64-х битного числа, умножаются, а результат старшего машинного слова [63:32] записывается в регистр rd
MULHSU – аналогично MULH, но знакорасширение происходит только для rs1, но rs2 является беззнаковым
MULHU – тоже самое, но оба операнда являются беззнаковыми
DIV – деление с учетом знака
DIVU – деление, но без знака
REM – остаток знакового деления, и по правилам математики знак копируется в результат от делимого (а не делителя), то есть (-4) % (-3) = -1, в то время как 4 % (-3) = 1