mulh
Signed multiply high
This instruction is defined by:
Synopsis
Multiply the signed values in xs1 to xs2, and store the upper half of the result in xd. The lower half is thrown away.
If both the upper and lower halves are needed, it suggested to use the sequence:
mulh xdh, xs1, xs2 mul xdl, xs1, xs2 ---
Microarchitectures may look for that sequence and fuse the operations.
Decode Variables
Bits<5> xs2 = $encoding[24:20];
Bits<5> xs1 = $encoding[19:15];
Bits<5> xd = $encoding[11:7];
Execution
-
Pruned, XLEN == 64
-
Original
if (implemented?(ExtensionName::M) && (misa.M == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
Bits<1> xs1_sign_bit = X[xs1][63];
Bits<MXLEN `* 2> src1 = {{64{xs1_sign_bit}}, X[xs1]};
Bits<1> xs2_sign_bit = X[xs2][63];
Bits<MXLEN `* 2> src2 = {{64{xs2_sign_bit}}, X[xs2]};
X[xd] = (src1 * src2)[127:64];
if (implemented?(ExtensionName::M) && (misa.M == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
Bits<1> xs1_sign_bit = X[xs1][xlen() - 1];
Bits<MXLEN `* 2> src1 = {{xlen(){xs1_sign_bit}}, X[xs1]};
Bits<1> xs2_sign_bit = X[xs2][xlen() - 1];
Bits<MXLEN `* 2> src2 = {{xlen(){xs2_sign_bit}}, X[xs2]};
X[xd] = (src1 * src2)[(xlen() * 8'd2) - 1:xlen()];