srl

srl

Ensamblador RISC-V Referencia

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

srl mueve bits a la derecha, lo inverso de lo que hace sll. Las letras significan shift right logical (desplazamiento lógico a la derecha). Esta forma toma los bits de rs1, los mueve a la derecha según el conteo en rs2 y almacena el resultado en rd.

srl rd, rs1, rs2

Cualquier bit desplazado más allá del extremo derecho se pierde, y los 0 rellenan los espacios vacantes a la izquierda.

Ese relleno con ceros explica la palabra logical. Un desplazamiento a la derecha divide a la mitad un valor, así que un desplazamiento de 1 divide entre 2 y un desplazamiento de 3 divide entre 8. El residuo se descarta, igual que en la división entera. srl divide rápidamente un número sin signo entre una potencia de dos.

Existen dos instrucciones de desplazamiento a la derecha, y la diferencia está en lo que se coloca en los bits altos vaciados. srl pone 0s allí. Su contraparte sra copia el bit de signo en esas posiciones, lo que preserva el signo de los números negativos. Elige srl para un patrón de bits sin procesar o un valor que no pueda ser negativo. En un valor con signo que pueda ser negativo, srl produce un número positivo grande, y sra es la instrucción correcta en ese caso.

Según el manual de RISC-V, el conteo de desplazamiento ocupa los 5 bits bajos del registro rs2. Esos 5 bits abarcan de 0 a 31 posiciones, por lo que los bits restantes de rs2 se ignoran. El manual llama a srl un desplazamiento lógico a la derecha, que inserta ceros en la parte superior.

Cuando el conteo de desplazamiento es una constante, usa la forma inmediata srli.

Ejemplo

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