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
