mulh

mulh

Asembler RISC-V Referencja

lyszt.net obejmuje mulh i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

mulh zwraca górne 32 bity iloczynu. Dwie 32-bitowe liczby mogą dać w wyniku iloczyn o szerokości do 64 bitów, podczas gdy rejestr przechowuje 32. Instrukcja mul zachowuje dolne 32 bity i odrzuca resztę. mulh (multiply high) zachowuje górne 32 bity.

Uruchom obie instrukcje na tych samych danych wejściowych, a otrzymasz cały iloczyn. mulh zapisuje górną połowę do jednego rejestru, mul zapisuje dolną połowę do innego, a para przechowuje pełny 64-bitowy wynik.

Górna połowa wskazuje przepełnienie, czyli iloczyn zbyt duży dla 32 bitów. Znacząca wartość w górnej połowie oznacza, że iloczyn nie mieści się w jednym rejestrze. Arytmetyka na bardzo dużych liczbach i kryptografia opierają się na obu połowach.

Podręcznik RISC-V definiuje jeszcze dwa warianty obok mulh. mulhu mnoży dwie liczby bez znaku, a mulhsu mnoży liczbę ze znakiem w rs1 przez liczbę bez znaku w rs2. Według podręcznika mulhsu występuje w wielosłownym mnożeniu ze znakiem, gdzie najbardziej znaczące słowo jednej liczby, które przenosi bit znaku, jest mnożone przez mniej znaczące słowa drugiej, które są bez znaku.

h oznacza high (górne). Ta wersja traktuje swoje operandy jako liczby ze znakiem, więc mogą być ujemne. Specyfikacja RISC-V definiuje również warianty bez znaku, a ten symulator udostępnia wersję mulh ze znakiem. Podobnie jak w przypadku wszystkich instrukcji mnożenia i dzielenia, nie istnieje forma ze stałą, więc oba dane wejściowe pochodzą z rejestrów.

Przykład

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