srai

srai

Ensamblador RISC-V Referencia

lyszt.net cubre srai y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

srai desplaza los bits a la derecha una cantidad fija y copia el bit de signo en las posiciones superiores que quedan vacías, lo que mantiene negativos a los números negativos. Es la forma de cantidad constante de sra, por lo que el relleno conserva el signo. La i significa inmediato, una constante codificada en la instrucción.

La sintaxis de srai aparece a continuación, con amount como una constante entre 0 y 31.

srai rd, rs1, amount

Un desplazamiento a la derecha de un lugar divide un número por la mitad y deja el signo sin cambios, así que srai divide un número con signo entre una potencia de dos. La siguiente línea divide un valor con signo entre 8, tanto para entradas positivas como negativas.

srai t0, t0, 3

srai redondea hacia abajo, hacia el valor más negativo. Desplazar -7 a la derecha 1 da -4, mientras que div con un divisor de 2 da -3 porque redondea hacia cero. Ambos coinciden en números no negativos y en divisiones sin resto. Difieren en uno solo cuando un número negativo deja un resto. El código de gráficos, audio y señales generalmente necesita el redondeo hacia abajo.

El manual de RISC-V codifica los desplazamientos constantes como una especialización del formato de tipo I, uno de los diseños de instrucción estándar. La cantidad de desplazamiento ocupa los 5 bits inferiores del campo inmediato, y el bit 30 de la instrucción distingue los dos desplazamientos a la derecha. srai realiza un desplazamiento aritmético a la derecha, y el bit de signo original rellena los bits superiores que quedan vacíos.

De los cuatro desplazamientos, srai maneja números con signo que se dividen y srli maneja bits sin procesar o números que nunca se vuelven negativos. Las formas sin i, sra y srl, toman una distancia de desplazamiento calculada mientras el programa se ejecuta.

Ejemplo

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