sra

sra

Assembly RISC-V Riferimento

lyszt.net tratta sra e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

sra è il secondo shift a destra, accanto a srl. Il nome sta per shift right arithmetic (scorrimento aritmetico a destra). La forma seguente sposta rs1 a destra della quantità contenuta in rs2.

sra rd, rs1, rs2

Come qualsiasi shift a destra, sposta i bit verso l'estremità bassa e scarta quelli che cadono. Il suo trattamento delle posizioni superiori vuote differisce da srl.

RISC-V usa uno schema con segno in cui il bit più alto indica il segno, e un 1 lì significa che il numero è negativo. srl riempie la parte alta con 0, il che cancella il marcatore di segno e trasforma un numero negativo in un grande numero positivo. sra riempie la parte alta con copie del bit di segno esistente, quindi il riempimento è di 1 per un numero negativo e di 0 per uno positivo. Il numero mantiene il suo segno.

sra divide un numero con segno per una potenza di due. Uno shift di 1 lo dimezza, uno shift di 3 lo divide per 8, e i numeri negativi rimangono negativi. Il risultato arrotonda verso il basso, verso il valore più negativo, quindi -7 spostato a destra di 1 dà -4 mentre l'istruzione div dà -3. Il codice grafico e audio di solito accetta l'arrotondamento verso il basso.

Il manuale RISC-V tiene la quantità di shift nei 5 bit inferiori del registro rs2. Cinque bit coprono da 0 a 31 posizioni, quindi gli altri bit di rs2 non hanno effetto. Il manuale descrive sra come uno scorrimento aritmetico a destra, che copia il bit di segno originale nei bit superiori liberati.

Usa sra per i numeri con segno e srl per pattern di bit grezzi o numeri che non sono mai negativi. Per una quantità fissa, usa la forma costante srai.

Esempio

li t0, -8
li t1, 1
sra t2, t0, t1   # t2 = -4 (sign-filled)