remu
lyszt.net охватывает remu и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
remu вычисляет беззнаковый остаток — значение, оставшееся после беззнакового деления. Он относится к divu так же, как rem относится к div. Буква u означает, что биты рассматриваются как неотрицательные числа, от 0 примерно до 4 миллиардов. Страница divu описывает, чем отличаются знаковая и беззнаковая интерпретации одних и тех же битов.
Результат remu всегда находится между 0 и делителем минус 1, поэтому он никогда не бывает отрицательным и не имеет правила знака. Это делает его полезным для зацикливания позиции в кольцевом буфере, распределения хеш-значений по фиксированному числу слотов и циклического перебора повторяющейся последовательности.
Остаток от деления на ноль возвращает исходное число.
Согласно руководству RISC-V, переполнение беззнакового деления невозможно, поэтому у remu нет случая переполнения. Остаток от деления на ноль равен делимому. Руководство рекомендует выполнять divu и remu на одних и тех же операндах, когда нужны и частное, и остаток, чтобы процессор мог объединить их в одно деление.
Для делителя, являющегося степенью двойки, побитовое AND (andi) даёт тот же результат дешевле. Следующая строка вычисляет остаток после деления на 8, поскольку остаток от деления на степень двойки — это младшие биты значения.
andi t0, t0, 7
Это сокращение применимо только к степеням двойки.
Пример
li t0, -1 li t1, 10 remu t2, t0, t1 # t2 = 5 (t0 read as unsigned)
