rem
Signed remainder
This instruction is defined by:
Synopsis
Calculate the remainder of signed division of rs1 by rs2, and store the result in rd.
If the value in register rs2 is zero, write the value in rs1 into rd;
If the result of the division overflows, write zero into rd;
Decode Variables
Bits<5> rs2 = $encoding[24:20];
Bits<5> rs1 = $encoding[19:15];
Bits<5> rd = $encoding[11:7];
Execution
-
Pruned, XLEN == 64
-
Original
XReg src1 = X[rs1];
XReg src2 = X[rs2];
if (src2 == 0) {
X[rd] = src1;
} else if ((src1 == {1'b1, {63{1'b0}}}) && (src2 == {XLEN{1'b1}})) {
X[rd] = 0;
} else {
X[rd] = $signed(src1) % $signed(src2);
}
if (implemented?(ExtensionName::M) && (CSR[misa].M == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
XReg src1 = X[rs1];
XReg src2 = X[rs2];
if (src2 == 0) {
X[rd] = src1;
} else if ((src1 == {1'b1, {XLEN - 1{1'b0}}}) && (src2 == {XLEN{1'b1}})) {
X[rd] = 0;
} else {
X[rd] = $signed(src1) % $signed(src2);
}