slli

slli

Ensamblador RISC-V Referencia

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

slli desplaza los bits hacia la izquierda una cantidad fija. La operación coincide con sll: los bits se deslizan hacia la izquierda, los ceros rellenan el lado derecho, los bits que sobrepasan el borde izquierdo se pierden, y cada posición desplazada duplica el valor (la página de sll cubre la mecánica). La instrucción mantiene la distancia de desplazamiento como una constante, por lo que ningún registro la proporciona. La i significa inmediato, que es el término para una constante escrita en la instrucción.

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

slli rd, rs1, amount

La siguiente línea desplaza t0 tres posiciones a la izquierda, lo que lo multiplica por 8.

slli t1, t0, 3

Los arreglos hacen que esta instrucción sea común. Un valor de 32 bits en un arreglo ocupa 4 bytes, por lo que el elemento número i se encuentra a i veces 4 bytes desde el inicio, y un desplazamiento a la izquierda por 2 multiplica por 4. El patrón habitual desplaza el índice para producir un desplazamiento en bytes, suma la dirección inicial del arreglo y luego carga el valor. Detectar esta secuencia de desplazamiento, suma y carga ayuda al leer ensamblador escrito por otros.

El manual de RISC-V codifica los desplazamientos por una constante como una especialización del formato de tipo I, uno de los diseños de instrucción estándar. rs1 contiene el operando que se va a desplazar, y los 5 bits inferiores del campo inmediato contienen la cantidad de desplazamiento. slli realiza un desplazamiento lógico a la izquierda, y los ceros entran en los bits inferiores.

Usa slli cuando la distancia de desplazamiento se conoce mientras escribes el código. Usa sll cuando la cantidad se calcula mientras el programa se ejecuta. El ejemplo desplaza 5 a la izquierda por 3, lo que da 5 por 8, o 40.

Ejemplo

li t0, 5
slli t1, t0, 3   # t1 = 5 << 3 = 40  (5 * 8)