sltu

sltu

Asembler RISC-V Referencja

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

sltu ustawia rejestr docelowy na 1 lub 0 tak jak slt i porównuje dwie liczby jako wartości bez znaku. Nazwa oznacza set less than, unsigned. Strona slt opisuje zapisywanie wyniku porównania jako 1 lub 0.

Te same 32 bity można odczytać jako liczbę ze znakiem, gdzie najstarszy bit oznacza wartość ujemną, a zakres wynosi w przybliżeniu od -2 miliardów do +2 miliardów, albo jako liczbę bez znaku, bez wartości ujemnych i w zakresie od 0 do około 4 miliardów. slt odczytuje wartość ze znakiem, a sltu wartość bez znaku. Rejestr z wszystkimi bitami ustawionymi na 1 to -1 dla slt i największa możliwa wartość dla sltu, więc obie instrukcje mogą się różnić dla identycznych danych wejściowych.

Używaj sltu dla wielkości, które nie mogą być ujemne, takich jak adresy pamięci, rozmiary, liczby i pozycje. Porównanie dwóch adresów pamięci za pomocą slt ze znakiem daje błędny wynik, gdy adres jest wystarczająco duży, aby ustawić jego najstarszy bit, ponieważ odczyt ze znakiem traktuje go jako wartość ujemną.

Podręcznik RISC-V opisuje slt i sltu razem jako porównania ze znakiem i bez znaku, które zapisują 1 do rd, jeśli rs1 jest mniejsze niż rs2, a 0 w przeciwnym razie. Podaje poniższą linię jako sposób sprawdzenia, czy wartość jest różna od zera, co jest pseudoinstrukcją snez.

sltu rd, x0, rs2

Postać sltu pokazano poniżej.

sltu rd, rs1, rs2

W poniższym szczególnym przypadku rd przyjmuje wartość 1, gdy rs jest czymkolwiek innym niż zero, ponieważ 0 jest mniejsze od każdej innej wartości bez znaku. To redukuje dowolną liczbę do 1 lub 0.

sltu rd, zero, rs

Przykład

li t0, -1
li t1, 1
sltu t2, t0, t1   # t2 = 0 (t0 read as unsigned is huge)