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
