divu
lyszt.net охватывает divu и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
divu выполняет беззнаковое деление. 32 бита регистра можно интерпретировать двумя способами. При знаковом чтении старший бит сигнализирует об отрицательном числе, поэтому биты представляют значения примерно от -2 миллиардов до +2 миллиардов. При беззнаковом чтении отрицательных значений не существует, и биты считают от 0 примерно до 4 миллиардов. Биты не меняются. Меняется только интерпретация.
div обрабатывает свои входные данные как знаковые, а divu — как беззнаковые. Вблизи верхней границы диапазона они дают разные результаты. Регистр со всеми битами, установленными в 1, равен -1 для div и 4 294 967 295 для divu.
divu подходит для значений, которые не могут быть отрицательными: позиций в массиве, размеров в байтах, счётчиков циклов, координат пикселей. Как только одно из этих значений превышает примерно 2 миллиарда, знаковый div возвращает неверные результаты. Старший бит включается, и знаковое чтение делает значение отрицательным.
Руководство RISC-V определяет частное от беззнакового деления на ноль как все биты, установленные в 1, а остаток — как равный делимому. Согласно руководству, переполнение при беззнаковом делении невозможно. Все биты, установленные в 1, — это наибольшее беззнаковое число, и простые схемы беззнакового делителя выдают его сами по себе. Именно поэтому руководство выбрало его.
Деление на ноль возвращает наибольшее беззнаковое значение со всеми битами, установленными в 1. Если делитель является степенью двойки, логический сдвиг вправо (srli) делит быстрее. Сдвиг вправо на 3 делит беззнаковое число на 8.
Пример
li t0, -2 li t1, 2 divu t2, t0, t1 # t2 = 2147483647 (t0 read as unsigned)
