aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/bext.h
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/insns/bext.h')
-rw-r--r--riscv/insns/bext.h9
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));