div
lyszt.net obejmuje div i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
Opis
div dzieli jeden rejestr przez drugi. Odczytuje rejestry źródłowe rs1 i rs2, dzieli pierwszy przez drugi i zapisuje wynik do rejestru docelowego rd. Poniższa postać oznacza rd = rs1 / rs2.
div rd, rs1, rs2
Podobnie jak mnożenie, należy do rozszerzenia M opcjonalnych instrukcji matematycznych, które ten symulator zawiera.
Jest to dzielenie całkowite, więc część ułamkowa jest odrzucana. 7 podzielone przez 2 daje 3. Pozostała 1 pochodzi z rem, który oblicza resztę z tych samych dwóch liczb. Wyniki ujemne są zaokrąglane w kierunku zera, więc -7 / 2 daje -3.
Dzielenie przez zero zwraca -1, rejestr z wszystkimi bitami ustawionymi na 1. Sprzęt nie daje żadnego ostrzeżenia, więc kod, który musi traktować zerowy dzielnik jako błąd, sprawdza dzielnik przed dzieleniem.
Podręcznik RISC-V określa przypadki szczególne. Dzielenie przez zero daje iloraz z wszystkimi bitami ustawionymi, który dla div odczytuje się jako -1, oraz resztę równą dzielnej. Przepełnienie ze znakiem występuje tylko wtedy, gdy najbardziej ujemna liczba jest dzielona przez -1. Iloraz jest wtedy równy dzielnej, a reszta wynosi zero. Podręcznik mówi, że rozważano pułapkę przy dzieleniu przez zero i ją odrzucono, ponieważ byłaby to jedyna pułapka arytmetyczna w zestawie instrukcji, a wszystkie bity ustawione utrzymują prostotę układu dzielącego.
Dla każdego dzielenia, które nie powoduje przepełnienia, dzielna równa się dzielnikowi razy iloraz plus reszta. Gdy potrzebne są zarówno iloraz, jak i reszta, podręcznik zaleca dwa poniższe wiersze, przy czym rdq różni się od rs1 i rs2. Procesor może wtedy połączyć je w jedno dzielenie.
div rdq, rs1, rs2 rem rdr, rs1, rs2
Dzielenie jest najwolniejszą arytmetyką, jaką wykonuje procesor, często wielokrotnie wolniejszą niż mnożenie. Dzielenie przez potęgę dwójki (2, 4, 8 i tak dalej) może zamiast tego użyć przesunięcia w prawo (zobacz srai). Przykład dzieli 17 przez 5. 5 mieści się w 17 trzy całe razy z resztą 2, więc iloraz 3 trafia do t2.
Przykład
li t0, 17 li t1, 5 div t2, t0, t1 # t2 = 3
