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)