diff --git a/riscv/insns/mqrwacc.h b/riscv/insns/mqrwacc.h index 0aa2e73d..96d35661 100644 --- a/riscv/insns/mqrwacc.h +++ b/riscv/insns/mqrwacc.h @@ -1,3 +1,4 @@ require_extension('P'); require_rv32; -WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2 + 0x40000000) >> 31)); \ No newline at end of file +int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2) + (1 << 30)) >> 31; +WRITE_P_RD_PAIR(P_RD_PAIR + tmp); diff --git a/riscv/insns/mqwacc.h b/riscv/insns/mqwacc.h index 6f7cacdc..67510fdb 100644 --- a/riscv/insns/mqwacc.h +++ b/riscv/insns/mqwacc.h @@ -1,3 +1,4 @@ require_extension('P'); require_rv32; -WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2) >> 31)); \ No newline at end of file +int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2)) >> 31; +WRITE_P_RD_PAIR((P_RD_PAIR + tmp)); diff --git a/riscv/insns/pmqrwacc_h.h b/riscv/insns/pmqrwacc_h.h index 41ab71ea..3a741ba5 100644 --- a/riscv/insns/pmqrwacc_h.h +++ b/riscv/insns/pmqrwacc_h.h @@ -1,4 +1,5 @@ require_rv32; P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { - p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; -}) \ No newline at end of file + int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2 + 0x4000) >> 15; + p_rd += val; +}) diff --git a/riscv/insns/pmqwacc_h.h b/riscv/insns/pmqwacc_h.h index e6629270..4dbcc546 100644 --- a/riscv/insns/pmqwacc_h.h +++ b/riscv/insns/pmqwacc_h.h @@ -1,4 +1,5 @@ require_rv32; P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { - p_rd += (p_rs1 * p_rs2) >> 15; -}) \ No newline at end of file + int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2) >> 15; + p_rd += val; +})