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