mulh
lyszt.net охватывает mulh и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
mulh возвращает старшие 32 бита произведения. Два 32-битных числа могут при перемножении дать результат шириной до 64 бит, тогда как регистр вмещает 32. Инструкция mul сохраняет младшие 32 бита и отбрасывает остальное. mulh (multiply high) сохраняет старшие 32 бита.
Выполните обе инструкции на одних и тех же входных данных, и вы получите всё произведение. mulh записывает старшую половину в один регистр, mul записывает младшую половину в другой, и эта пара содержит полный 64-битный результат.
Старшая половина указывает на переполнение, то есть на произведение, слишком большое для 32 бит. Значимое значение в старшей половине означает, что произведение не помещается в один регистр. Арифметика с очень большими числами и криптография полагаются на обе половины.
Руководство RISC-V определяет ещё два варианта помимо mulh. mulhu умножает два беззнаковых числа, а mulhsu умножает знаковое число в rs1 на беззнаковое число в rs2. Согласно руководству, mulhsu встречается в многословном знаковом умножении, где наиболее значимое слово одного числа, несущее знаковый бит, умножается на менее значимые слова другого, которые являются беззнаковыми.
h означает high (старший). Эта версия рассматривает свои операнды как знаковые, поэтому они могут быть отрицательными. Спецификация RISC-V также определяет беззнаковые варианты, а этот симулятор предоставляет знаковую mulh. Как и у всех инструкций умножения и деления, формы с константой не существует, поэтому оба входных значения берутся из регистров.
Пример
li t0, 100000 li t1, 100000 mulh t2, t0, t1 # t2 = 2 (high bits of 100000 * 100000)
