div
lyszt.net охоплює div та інші інструкції RISC-V більш детально.
Формат кодування
Опис
div ділить один регістр на інший. Вона читає вихідні регістри rs1 і rs2, ділить перший на другий і записує результат у регістр призначення rd. Наведена нижче форма означає rd = rs1 / rs2.
div rd, rs1, rs2
Як і множення, вона належить до розширення M необов'язкових математичних інструкцій, яке включає цей симулятор.
Це цілочисельне ділення, тому дробова частина відкидається. 7, поділене на 2, дає 3. Залишок 1 походить із rem, яка обчислює остачу від тих самих двох чисел. Від'ємні результати округлюються в бік нуля, тому -7 / 2 дає -3.
Ділення на нуль повертає -1, регістр з усіма бітами, встановленими в 1. Апаратне забезпечення не дає жодного попередження, тому код, який має трактувати нульовий дільник як помилку, перевіряє дільник перед діленням.
Посібник RISC-V визначає особливі випадки. Ділення на нуль дає частку з усіма встановленими бітами, яка для div читається як -1, та остачу, що дорівнює діленому. Знакове переповнення трапляється лише тоді, коли найбільш від'ємне число ділиться на -1. Частка тоді дорівнює діленому, а остача дорівнює нулю. Посібник каже, що пастку при діленні на нуль розглядали й відхилили, бо вона була б єдиною арифметичною пасткою в наборі інструкцій, і що всі встановлені біти зберігають простоту схеми дільника.
Для будь-якого ділення, яке не спричиняє переповнення, ділене дорівнює дільнику, помноженому на частку, плюс остача. Коли потрібні і частка, і остача, посібник рекомендує два рядки нижче, причому rdq відрізняється від rs1 і rs2. Процесор тоді може об'єднати їх в одне ділення.
div rdq, rs1, rs2 rem rdr, rs1, rs2
Ділення — це найповільніша арифметична операція, яку виконує процесор, часто в багато разів повільніша за множення. Ділення на степінь двійки (2, 4, 8 тощо) може натомість використовувати зсув праворуч (див. srai). Приклад ділить 17 на 5. 5 міститься в 17 три цілих рази із залишком 2, тому частка 3 записується в t2.
Приклад
li t0, 17 li t1, 5 div t2, t0, t1 # t2 = 3
