aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/bitrevi.h
blob: d5069ef7b9ed0c37c63046d92663b85dc5b69010 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
require_extension('P');
reg_t msb = insn.p_imm6();
require(msb < (unsigned long)xlen); // imm[5] == 1 is illegal on rv32
reg_t n = get_field(RS1, make_mask64(0, msb + 1));
reg_t rev = 0;

for (size_t i = 0; i <= msb; i++) {
  rev <<= 1;
  rev |= n & 1;
  n >>= 1;
}

WRITE_RD(sext_xlen(rev));