mulh

mulh

RISC-V Assembler Referenz

lyszt.net behandelt mulh und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

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

Beschreibung

mulh gibt die oberen 32 Bits eines Produkts zurück. Zwei 32-Bit-Zahlen können zu einem Ergebnis multipliziert werden, das bis zu 64 Bits breit ist, während ein Register 32 Bits hält. Die Anweisung mul behält die unteren 32 Bits und verwirft den Rest. mulh (multiply high) behält die oberen 32 Bits.

Führe beide Anweisungen mit denselben Eingaben aus, und du erhältst das vollständige Produkt. mulh schreibt die obere Hälfte in ein Register, mul schreibt die untere Hälfte in ein anderes, und das Paar hält das vollständige 64-Bit-Ergebnis.

Die obere Hälfte zeigt einen Überlauf an, was bedeutet, dass ein Produkt zu groß für 32 Bits ist. Ein aussagekräftiger Wert in der oberen Hälfte bedeutet, dass das Produkt nicht in ein Register passt. Arithmetik mit sehr großen Zahlen und Kryptografie verlassen sich auf beide Hälften.

Das RISC-V-Handbuch definiert neben mulh zwei weitere Varianten. mulhu multipliziert zwei vorzeichenlose Zahlen, und mulhsu multipliziert eine vorzeichenbehaftete Zahl in rs1 mit einer vorzeichenlosen Zahl in rs2. Laut dem Handbuch erscheint mulhsu bei der mehrwortigen vorzeichenbehafteten Multiplikation, bei der das höchstwertige Wort einer Zahl, das das Vorzeichenbit trägt, mit den niederwertigeren Wörtern der anderen, die vorzeichenlos sind, multipliziert wird.

Das h steht für high. Diese Version behandelt ihre Operanden als vorzeichenbehaftet, sie können also negativ sein. Die RISC-V-Spezifikation definiert auch vorzeichenlose Varianten, und dieser Simulator bietet das vorzeichenbehaftete mulh. Wie bei allen Multiplikations- und Divisionsanweisungen existiert keine Konstantenform, sodass beide Eingaben aus Registern stammen.

Beispiel

li t0, 100000
li t1, 100000
mulh t2, t0, t1   # t2 = 2 (high bits of 100000 * 100000)