mul
lyszt.net behandelt mul und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
mul multipliziert zwei Register. Es liest rs1 und rs2, multipliziert diese Werte und schreibt das Produkt nach rd. Das folgende Format bedeutet rd = rs1 * rs2.
mul rd, rs1, rs2
RISC-V ist in Schichten organisiert, die Erweiterungen genannt werden. Multiplikation und Division gehören zur Erweiterung namens M, die der kleinste RISC-V-Kern weglassen kann. Dieser Simulator enthält sie, weil sein vollständiger Name RV32IM auf M endet, sodass mul und div verfügbar sind. Ein Prozessor ohne M muss die Arbeit in Software erledigen.
Das Produkt zweier 32-Bit-Zahlen kann 64 Bit erreichen, was das übersteigt, was ein Register aufnehmen kann. mul behält die unteren 32 Bit. Bei kleinen Werten ist das die vollständige Antwort. Die oberen 32 Bit stammen aus einer separaten Anweisung, mulh. Vorzeichenbehaftete und vorzeichenlose Eingaben erzeugen dieselben unteren 32 Bit, sodass eine Anweisung beide abdeckt.
Wenn beide Hälften eines Produkts benötigt werden, empfiehlt das RISC-V-Handbuch ein festes Anweisungspaar. Eine mulh-Anweisung (oder eine ihrer vorzeichenlosen Varianten) liefert die obere Hälfte, und mul mit denselben Quellregistern in derselben Reihenfolge liefert die untere Hälfte. Das Ziel der oberen Hälfte darf nicht rs1 oder rs2 sein. Ein Prozessor kann dann die beiden Anweisungen zu einer einzigen Multiplikation verschmelzen.
Die Multiplikation mit einer Zweierpotenz (2, 4, 8, 16 und so weiter) kann stattdessen eine Linksverschiebung verwenden. Eine Verschiebung um 3 Stellen nach links multipliziert mit 8, und eine Verschiebung kostet weniger als eine Multiplikation (siehe slli). Compiler nehmen diese Ersetzung automatisch vor. Das Beispiel multipliziert 6 mit 7 und hinterlässt 42 in t2.
Beispiel
li t0, 6 li t1, 7 mul t2, t0, t1 # t2 = 42
