mulh

mulh

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

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

Описание

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)