mul

mul

RISC-V Ассемблер Ссылка

lyszt.net охватывает mul и другие инструкции 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

Описание

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