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)
