bgeu

bgeu

Asembler RISC-V Referencja

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

bgeu to wersja bge bez znaku i przeciwieństwo bltu. Nazwa oznacza branch if greater than or equal, unsigned (skok, jeśli większe lub równe, bez znaku). Skacze do etykiety, gdy rs1 jest co najmniej równe rs2, przy czym oba są odczytywane jako liczby nieujemne. Zobacz bge dla samego porównania i bltu dla tego, co zmienia brak znaku.

Z bgeu rodzina liczy sześć rozgałęzień. Są trzy pytania: równość, mniejsze niż oraz większe lub równe, a dwa ostatnie występują w wersji ze znakiem i bez znaku. beq i bne sprawdzają równość, blt i bge porównują wartości ze znakiem, a bltu i bgeu porównują wartości bez znaku. Te sześć, wraz z zamianą operandów dla kierunków większe niż oraz mniejsze lub równe, pokrywa każde porównanie potrzebne programowi.

bgeu nadaje się do ograniczeń na wielkości, które nie mogą być ujemne. Przykłady to wyjście z pętli, gdy pozycja osiągnie koniec, odrzucenie indeksu, który osiągnął rozmiar tablicy, oraz skok do procedury obsługi, gdy długość osiągnie pojemność. Porównywanie adresów pamięci używa bltu i bgeu, ponieważ adresy są bez znaku, a wersje ze znakiem dają tam błędne wyniki.

Podręcznik RISC-V mówi, że granice tablicy ze znakiem można sprawdzić pojedynczym rozgałęzieniem bez znaku, ponieważ każdy ujemny indeks porównuje się jako większy od każdej nieujemnej granicy. bgeu i bltu to dwie formy tego sprawdzenia.

Poniższa linia wykonuje połączone sprawdzenie granic w jednej instrukcji.

bgeu i, n, error

Wychwytuje indeks, który jest zbyt duży lub ujemny, ponieważ ujemny indeks jest odczytywany jako ogromna wartość bez znaku i nie przechodzi testu.

Przykład

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