divu

divu

Asembler RISC-V Referencja

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

divu wykonuje dzielenie bez znaku. 32 bity rejestru można interpretować na dwa sposoby. W odczycie ze znakiem najstarszy bit sygnalizuje liczbę ujemną, więc bity reprezentują wartości od około -2 miliardów do +2 miliardów. W odczycie bez znaku nie ma wartości ujemnych, a bity liczą od 0 do około 4 miliardów. Bity się nie zmieniają. Zmienia się tylko interpretacja.

div traktuje swoje dane wejściowe jako ze znakiem, natomiast divu traktuje je jako bez znaku. W pobliżu górnej granicy zakresu oba dają różne wyniki. Rejestr z wszystkimi bitami ustawionymi na 1 to -1 dla div i 4 294 967 295 dla divu.

divu nadaje się do wartości, które nie mogą być ujemne: pozycji w tablicy, rozmiarów w bajtach, liczników pętli, współrzędnych pikseli. Gdy jedna z tych wartości przekroczy około 2 miliardy, div ze znakiem zwraca błędne wyniki. Najstarszy bit się włącza, a odczyt ze znakiem czyni wartość ujemną.

Podręcznik RISC-V definiuje iloraz dzielenia bez znaku przez zero jako wszystkie bity ustawione, a resztę jako równą dzielnej. Według podręcznika przepełnienie dzielenia bez znaku nie może wystąpić. Wszystkie bity ustawione to największa liczba bez znaku, a proste układy dzielenia bez znaku same ją wytwarzają. Dlatego podręcznik ją wybrał.

Dzielenie przez zero zwraca największą wartość bez znaku, z wszystkimi bitami ustawionymi. Jeśli dzielnik jest potęgą dwójki, logiczne przesunięcie w prawo (srli) dzieli szybciej. Przesunięcie w prawo o 3 dzieli liczbę bez znaku przez 8.

Przykład

li t0, -2
li t1, 2
divu t2, t0, t1   # t2 = 2147483647 (t0 read as unsigned)