divu

divu

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

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

Описание

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)