sll

sll

Assembly RISC-V Referência

lyszt.net aborda sll e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

sll desloca os bits de um número para a esquerda. Um registrador contém 32 bits em sequência, e um deslocamento move toda a sequência para a esquerda ou para a direita por um certo número de posições. O nome significa shift left logical (deslocamento lógico para a esquerda). Na forma abaixo, o valor em rs1 é deslocado para a esquerda pelo número de posições indicado em rs2, e o resultado vai para rd.

sll rd, rs1, rs2

À medida que os bits se movem para a esquerda, zeros preenchem as posições vazias à direita, e os bits empurrados além da borda esquerda são descartados.

Um deslocamento para a esquerda de uma posição dobra um número, da mesma forma que acrescentar um 0 a um número decimal o multiplica por dez. Um deslocamento de 1 multiplica por 2, um deslocamento de 2 multiplica por 4, e um deslocamento de 3 multiplica por 8. Um deslocamento custa menos ao processador do que uma multiplicação, o que o torna o caminho rápido para multiplicar por potências de dois. O acesso a arrays depende disso, porque o endereço de cada elemento fica um número fixo de bytes, potência de dois, após o anterior.

De acordo com o manual do RISC-V, a quantidade de deslocamento é mantida nos 5 bits baixos do registrador rs2. Cinco bits cobrem de 0 a 31 posições, então os bits restantes de rs2 não têm efeito. O manual chama sll de deslocamento lógico para a esquerda, significando que zeros entram nos bits baixos.

Nesta forma, a quantidade de deslocamento vem de um registrador, o que se adequa a uma quantidade calculada enquanto o programa é executado. Use slli para uma quantidade fixa. O exemplo desloca 3 para a esquerda em 2 posições, multiplicando-o por 4 para dar 12.

Exemplo

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