bltu

bltu

Asembler RISC-V Referencja

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

bltu wykonuje to samo rozgałęzienie co blt, ale odczytuje oba rejestry jako liczby bez znaku. Nazwa oznacza branch if less than, unsigned (rozgałęzienie, jeśli mniejsze, bez znaku). Rozgałęzienie następuje, gdy rs1 jest mniejsze niż rs2, przy czym obie wartości są odczytywane jako liczby nieujemne od 0 do około 4 miliardów. Strona blt opisuje samo rozgałęzienie. Ta strona wyjaśnia, dlaczego odczyt bez znaku ma własną instrukcję.

Te same 32 bity reprezentują różne liczby w zależności od tego, czy najstarszy bit jest odczytywany jako znak, czy jako część wartości. blt odczytuje bity jako liczby ze znakiem, a bltu jako liczby bez znaku, i te dwa odczyty się nie zgadzają. Rejestr z wszystkimi bitami ustawionymi na 1 to -1 dla blt, bardzo mała wartość, a dla bltu największa możliwa wartość. Wybór niewłaściwej instrukcji daje błędny wynik bez żadnego komunikatu o błędzie.

bltu pasuje do wszystkiego, co nie może być ujemne, na przykład adresów pamięci, rozmiarów, liczników i pozycji. Porównywanie adresów ze znakowym blt zawodzi, gdy adres jest wystarczająco duży, aby mieć ustawiony najstarszy bit, ponieważ odczyt ze znakiem czyni go ujemnym.

Podręcznik RISC-V odnotowuje tę samą kontrolę zakresu. Ze znakiem granicę tablicy można sprawdzić pojedynczym bltu, ponieważ każdy ujemny indeks porównuje się jako większy niż każda nieujemna granica.

Pojedynczy bltu sprawdza, że indeks mieści się w zakresie, co najmniej 0 i poniżej rozmiaru n.

bltu i, n, ok

Jeśli i jest ujemne, jego odczyt bez znaku to bardzo duża liczba i nie przechodzi testu, więc jedno porównanie bez znaku wychwytuje zarówno przypadek zbyt dużej wartości, jak i ujemny.

Przykład

li t0, 1
li t1, -1
bltu t0, t1, done   # t1 read as unsigned is huge, so jump to 'done'