srai

srai

Assembleur RISC-V Référence

lyszt.net couvre srai et d'autres instructions RISC-V plus en détail.

Format d'encodage

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

Description

srai décale les bits vers la droite d'une quantité fixe et copie le bit de signe dans les positions supérieures libérées, ce qui maintient les nombres négatifs négatifs. C'est la forme à quantité constante de sra, c'est pourquoi le remplissage préserve le signe. Le i signifie immédiat, une constante encodée dans l'instruction.

La syntaxe de srai apparaît ci-dessous, avec amount comme constante entre 0 et 31.

srai rd, rs1, amount

Un décalage à droite d'une position divise un nombre par deux et laisse le signe inchangé, donc srai divise un nombre signé par une puissance de deux. La ligne suivante divise une valeur signée par 8, pour des entrées positives comme négatives.

srai t0, t0, 3

srai arrondit vers le bas, vers la valeur la plus négative. Décaler -7 vers la droite de 1 donne -4, tandis que div avec un diviseur de 2 donne -3 car il arrondit vers zéro. Les deux sont d'accord sur les nombres non négatifs et sur les divisions sans reste. Ils diffèrent de un uniquement lorsqu'un nombre négatif laisse un reste. Le code graphique, audio et de traitement du signal a généralement besoin de l'arrondi vers le bas.

Le manuel RISC-V encode les décalages constants comme une spécialisation du format de type I, l'une des dispositions d'instruction standard. La quantité de décalage occupe les 5 bits inférieurs du champ immédiat, et le bit 30 de l'instruction distingue les deux décalages à droite. srai effectue un décalage arithmétique à droite, et le bit de signe d'origine remplit les bits supérieurs libérés.

Parmi les quatre décalages, srai traite les nombres signés en cours de division et srli traite les bits bruts ou les nombres qui ne deviennent jamais négatifs. Les formes sans i, sra et srl, prennent une distance de décalage calculée pendant l'exécution du programme.

Exemple

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