mul

mul

Asembler RISC-V Referencja

lyszt.net obejmuje mul 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

mul mnoży dwa rejestry. Odczytuje rs1 i rs2, mnoży te wartości i zapisuje iloczyn do rd. Poniższy format oznacza rd = rs1 * rs2.

mul rd, rs1, rs2

RISC-V jest zorganizowany w warstwy zwane rozszerzeniami. Mnożenie i dzielenie należą do rozszerzenia o nazwie M, które najmniejszy rdzeń RISC-V może pominąć. Ten symulator je zawiera, ponieważ jego pełna nazwa RV32IM kończy się na M, więc mul i div są dostępne. Procesor bez M musi wykonać tę pracę w oprogramowaniu.

Iloczyn dwóch liczb 32-bitowych może osiągnąć 64 bity, co przekracza pojemność jednego rejestru. mul zachowuje dolne 32 bity. Dla małych wartości to cała odpowiedź. Górne 32 bity pochodzą z osobnej instrukcji, mulh. Dane wejściowe ze znakiem i bez znaku dają te same dolne 32 bity, więc jedna instrukcja obsługuje oba przypadki.

Gdy potrzebne są obie połówki iloczynu, podręcznik RISC-V zaleca stałą parę instrukcji. Instrukcja mulh (lub jeden z jej wariantów bez znaku) dostarcza górną połowę, a mul z tymi samymi rejestrami źródłowymi w tej samej kolejności dostarcza dolną połowę. Miejsce docelowe górnej połowy nie może być rs1 ani rs2. Procesor może wtedy połączyć obie instrukcje w jedno mnożenie.

Mnożenie przez potęgę dwójki (2, 4, 8, 16 i tak dalej) może zamiast tego użyć przesunięcia w lewo. Przesunięcie w lewo o 3 miejsca mnoży przez 8, a przesunięcie kosztuje mniej niż mnożenie (zobacz slli). Kompilatory wykonują to zastąpienie automatycznie. Przykład mnoży 6 przez 7 i pozostawia 42 w t2.

Przykład

li t0, 6
li t1, 7
mul t2, t0, t1   # t2 = 42