div

div

Asembler RISC-V Referencja

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

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