srli

srli

Assembly RISC-V Referência

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

srli desloca bits para a direita por uma quantidade fixa e coloca 0s nas posições superiores vagas. É a forma de quantidade constante de srl, que cobre a mecânica e o preenchimento com zeros. O i significa imediato, uma constante codificada na instrução.

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

srli rd, rs1, amount

Um deslocamento à direita divide um número pela metade uma vez para cada posição deslocada, e o preenchimento com zeros trata o valor como nunca negativo, então srli divide um número sem sinal por uma potência de dois sem resto. A próxima linha divide t0 por quatro.

srli t0, t0, 2

Combinado com um AND de mascaramento, srli extrai um campo de um valor empacotado. Desloque o campo para baixo, depois aplique andi para manter apenas seus bits. Ler o segundo byte de uma palavra requer um deslocamento à direita de 8 e um AND com 0xff.

O manual RISC-V codifica deslocamentos constantes como uma especialização do formato tipo I, um dos layouts de instrução padrão. A quantidade de deslocamento ocupa os 5 bits inferiores do campo imediato, e o bit 30 da instrução distingue os dois deslocamentos à direita. srli realiza um deslocamento à direita lógico, e 0s entram nos bits superiores.

srli sempre preenche com 0s. Isso serve para padrões de bits brutos e números que nunca são negativos. Em um valor com sinal que pode ser negativo, os 0s sobrescrevem o marcador de sinal. A divisão com sinal por uma potência de dois usa srai. A escolha entre os dois reflete como você lê os bits do registrador.

Exemplo

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