div

div

Асемблер RISC-V Посилання

lyszt.net охоплює div та інші інструкції 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

Опис

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