mul
lyszt.net obejmuje mul i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
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
