mul
lyszt.net охватывает mul и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
mul умножает два регистра. Она читает rs1 и rs2, умножает эти значения и записывает произведение в rd. Приведённый ниже формат означает rd = rs1 * rs2.
mul rd, rs1, rs2
RISC-V организован в слои, называемые расширениями. Умножение и деление относятся к расширению под названием M, которое самый маленький ядро RISC-V может опустить. Этот симулятор включает его, потому что его полное название RV32IM заканчивается на M, поэтому mul и div доступны. Процессор без M должен выполнять эту работу программно.
Произведение двух 32-битных чисел может достигать 64 бит, что превышает вместимость одного регистра. mul сохраняет младшие 32 бита. Для небольших значений это и есть весь ответ. Старшие 32 бита берутся из отдельной инструкции mulh. Знаковые и беззнаковые входные данные дают одинаковые младшие 32 бита, поэтому одна инструкция покрывает оба случая.
Когда нужны обе половины произведения, руководство RISC-V рекомендует фиксированную пару инструкций. Инструкция mulh (или один из её беззнаковых вариантов) даёт старшую половину, а mul с теми же исходными регистрами в том же порядке даёт младшую половину. Место назначения старшей половины не может быть rs1 или rs2. Процессор затем может объединить две инструкции в одно умножение.
Умножение на степень двойки (2, 4, 8, 16 и так далее) может вместо этого использовать сдвиг влево. Сдвиг влево на 3 позиции умножает на 8, а сдвиг стоит меньше, чем умножение (см. slli). Компиляторы выполняют эту замену автоматически. В примере 6 умножается на 7, и в t2 остаётся 42.
Пример
li t0, 6 li t1, 7 mul t2, t0, t1 # t2 = 42
