slt

slt

Asembler RISC-V Referencja

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

slt porównuje dwie liczby i zapisuje wynik jako 1 lub 0. Nazwa oznacza set less than (ustaw, jeśli mniejsze niż). Poniższa forma sprawdza, czy rs1 jest mniejsze niż rs2. Jeśli test się powiedzie, instrukcja zapisuje 1 do rejestru docelowego rd. Jeśli się nie powiedzie, zapisuje 0.

slt rd, rs1, rs2

Porównania można użyć na dwa sposoby. Instrukcja skoku warunkowego skacze na jego podstawie. Alternatywnie odpowiedź tak lub nie można zapisać jako liczbę, 1 dla prawdy i 0 dla fałszu, i użyć później. slt wykonuje zapis. Asembler reprezentuje prawdę i fałsz za pomocą zapisanego 1 lub 0, a tę wartość można dodawać, maskować lub łączyć jak każdą inną liczbę.

Porównanie traktuje wartości jako ze znakiem, więc mogą być ujemne, a -1 liczy się jako mniejsze niż 0. Powiązana instrukcja sltu traktuje je jako bez znaku, co zmienia wynik dla dużych wartości i dla wartości, które wyglądają na ujemne.

Podręcznik RISC-V opisuje slt i sltu 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. Używa także slt w sprawdzaniu przepełnienia dla ogólnego dodawania ze znakiem. Po dodaniu druga linia poniżej rejestruje, czy drugi operand jest ujemny, trzecia linia rejestruje, czy suma jest mniejsza niż pierwszy operand, a ostatnia linia skacze, gdy obie odpowiedzi się różnią.

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

Rozumowanie jest takie, że suma powinna być mniejsza niż jeden operand tylko wtedy, gdy drugi operand jest ujemny.

Nie istnieje instrukcja set greater than. Aby sprawdzić, czy a jest większe niż b, zamień operandy i zapytaj, czy b jest mniejsze niż a. Przykład porównuje 3 i 9. Ponieważ 3 jest mniejsze niż 9, t2 jest ustawione na 1.

Przykład

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1