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