sll

sll

Ensamblador RISC-V Referencia

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

sll mueve los bits de un número hacia la izquierda. Un registro contiene 32 bits en una fila, y un desplazamiento mueve toda la fila hacia la izquierda o hacia la derecha una cierta cantidad de posiciones. El nombre significa shift left logical (desplazamiento lógico a la izquierda). En la forma que se muestra a continuación, el valor en rs1 se desplaza a la izquierda la cantidad de posiciones indicada en rs2, y el resultado va a rd.

sll rd, rs1, rs2

A medida que los bits se mueven hacia la izquierda, los ceros llenan las posiciones vacías de la derecha, y los bits que se desplazan más allá del borde izquierdo se descartan.

Un desplazamiento a la izquierda de una posición duplica un número, del mismo modo que añadir un 0 a un número decimal lo multiplica por diez. Un desplazamiento de 1 multiplica por 2, un desplazamiento de 2 multiplica por 4 y un desplazamiento de 3 multiplica por 8. Un desplazamiento le cuesta menos al procesador que una multiplicación, lo que lo convierte en la vía rápida para multiplicar por potencias de dos. El acceso a arrays depende de esto, porque la dirección de cada elemento se encuentra una cantidad fija de bytes, potencia de dos, más allá de la anterior.

Según el manual de RISC-V, la cantidad de desplazamiento se guarda en los 5 bits bajos del registro rs2. Cinco bits cubren de 0 a 31 posiciones, por lo que los bits restantes de rs2 no tienen efecto. El manual llama a sll un desplazamiento lógico a la izquierda, lo que significa que entran ceros en los bits bajos.

En esta forma la cantidad de desplazamiento proviene de un registro, lo que se ajusta a una cantidad calculada mientras el programa se ejecuta. Use slli para una cantidad fija. El ejemplo desplaza 3 a la izquierda 2 posiciones, multiplicándolo por 4 para dar 12.

Ejemplo

li t0, 3
li t1, 2
sll t2, t0, t1   # t2 = 12