diff options
Diffstat (limited to 'riscv/insns/bext.h')
-rw-r--r-- | riscv/insns/bext.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/riscv/insns/bext.h b/riscv/insns/bext.h new file mode 100644 index 0000000..50d9bb2 --- /dev/null +++ b/riscv/insns/bext.h @@ -0,0 +1,9 @@ +require_extension('B'); +uint64_t c = 0, i = 0, data = zext_xlen(RS1), mask = zext_xlen(RS2); +while (mask) { + uint64_t b = mask & ~((mask | (mask-1)) + 1); + c |= (data & b) >> (__builtin_ctzl(b) - i); + i += __builtin_popcountl(b); + mask -= b; +} +WRITE_RD(sext_xlen(c)); |