aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/fsri.h
blob: f7186f1b6a493bdb0c0d63134024d3f849e22d94 (plain)
1
2
3
4
5
6
7
8
9
require_either_extension(xlen == 32 ? EXT_ZBPBO : EXT_XZBT, EXT_XZBT);
int shamt = SHAMT & (2*xlen-1);
reg_t a = RS1, b = RS3;
if (shamt >= xlen) {
	a = RS3, b = RS1;
	shamt -= xlen;
}
int rshamt = -shamt & (xlen-1);
WRITE_RD(sext_xlen(shamt ? (b << rshamt) | (zext_xlen(a) >> shamt) : a));