mulh

Signed multiply high

This instruction is defined by:

Encoding

svg

Synopsis

Multiply the signed values in rs1 to rs2, and store the upper half of the result in rd. The lower half is thrown away.

If both the upper and lower halves are needed, it suggested to use the sequence:


  mulh rdh, rs1, rs2
  mul  rdl, rs1, rs2
---

Microarchitectures may look for that sequence and fuse the operations.

Access

M

HS

U

VS

VU

Always

Always

Always

Always

Always

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

Bits<1> rs1_sign_bit = X[rs1][63];
Bits<XLEN * 2> src1 = {{64{rs1_sign_bit}}, X[rs1]};
Bits<1> rs2_sign_bit = X[rs2][63];
Bits<XLEN * 2> src2 = {{64{rs2_sign_bit}}, X[rs2]};
X[rd] = (src1 * src2)[127:64];
if (implemented?(ExtensionName::M) && (CSR[misa].M == 1'b0)) {
  raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
Bits<1> rs1_sign_bit = X[rs1][xlen() - 1];
Bits<XLEN * 2> src1 = {{xlen(){rs1_sign_bit}}, X[rs1]};
Bits<1> rs2_sign_bit = X[rs2][xlen() - 1];
Bits<XLEN * 2> src2 = {{xlen(){rs2_sign_bit}}, X[rs2]};
X[rd] = (src1 * src2)[(xlen() * 8'd2) - 1:xlen()];