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)