aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/bcompress.h
blob: 579346f463a6fc1542c63cac430309e643348202 (plain)
1
2
3
4
5
6
7
8
9
require_extension(EXT_XZBE);
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) >> (ctz(b) - i);
	i += popcount(b);
	mask -= b;
}
WRITE_RD(sext_xlen(c));