slli

slli

Assembly RISC-V Referência

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

slli desloca os bits para a esquerda por uma quantidade fixa. A operação corresponde a sll: os bits deslizam para a esquerda, zeros preenchem o lado direito, os bits que ultrapassam a borda esquerda são perdidos, e cada posição movida dobra o valor (a página sll cobre a mecânica). A instrução mantém a distância de deslocamento como uma constante, então nenhum registrador a fornece. O i significa imediato, que é o termo para uma constante escrita na instrução.

A forma de slli aparece abaixo, onde amount é um número fixo de 0 a 31.

slli rd, rs1, amount

A próxima linha desloca t0 para a esquerda em 3 posições, o que o multiplica por 8.

slli t1, t0, 3

Arrays tornam esta instrução comum. Um valor de 32 bits em um array ocupa 4 bytes, então o item número i fica a i vezes 4 bytes do início, e um deslocamento à esquerda por 2 multiplica por 4. O padrão usual desloca o índice para produzir um deslocamento em bytes, adiciona o endereço inicial do array, e então carrega o valor. Identificar essa sequência de deslocamento, adição e carregamento ajuda ao ler assembly escrito por outros.

O manual do RISC-V codifica deslocamentos por uma constante como uma especialização do formato tipo I, um dos layouts de instrução padrão. rs1 contém o operando a ser deslocado, e os 5 bits inferiores do campo imediato contêm a quantidade de deslocamento. slli realiza um deslocamento lógico à esquerda, e zeros entram nos bits inferiores.

Use slli quando a distância de deslocamento é conhecida enquanto você escreve o código. Use sll quando a quantidade é calculada enquanto o programa executa. O exemplo desloca 5 para a esquerda em 3, o que dá 5 vezes 8, ou 40.

Exemplo

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