srli

srli

Ensamblador RISC-V Referencia

lyszt.net cubre srli 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

srli desplaza los bits a la derecha una cantidad fija y coloca 0s en las posiciones superiores vacantes. Es la forma de cantidad constante de srl, que cubre la mecánica y el relleno de ceros. La i significa inmediato, una constante codificada en la instrucción.

La forma de srli aparece a continuación, donde amount es un número fijo de 0 a 31.

srli rd, rs1, amount

Un desplazamiento a la derecha divide un número a la mitad una vez por cada posición desplazada, y el relleno de ceros trata el valor como nunca negativo, por lo que srli divide un número sin signo entre una potencia de dos sin resto. La siguiente línea divide t0 entre cuatro.

srli t0, t0, 2

Combinado con un AND de enmascaramiento, srli extrae un campo de un valor empaquetado. Desplaza el campo hacia abajo hasta la parte inferior y luego aplica andi para conservar solo sus bits. Leer el segundo byte de una palabra requiere un desplazamiento a la derecha de 8 y un AND con 0xff.

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. srli realiza un desplazamiento lógico a la derecha, y entran 0s en los bits superiores.

srli siempre rellena con 0s. Eso conviene a patrones de bits sin procesar y a números que nunca son negativos. En un valor con signo que puede ser negativo, los 0s sobrescriben el marcador de signo. La división con signo entre una potencia de dos usa srai. La elección entre ambos refleja cómo lees los bits del registro.

Ejemplo

li t0, -8
srli t1, t0, 1   # t1 = 2147483644 (zero-filled)